'use client' import type { Dispatch, SetStateAction } from 'react' import { useState } from 'react' import { createContext, useContext } from 'use-context-selector' import AccountSetting from '@/app/components/header/account-setting' import ApiBasedExtensionModal from '@/app/components/header/account-setting/api-based-extension-page/modal' import ModerationSettingModal from '@/app/components/app/configuration/toolbox/moderation/moderation-setting-modal' import ExternalDataToolModal from '@/app/components/app/configuration/tools/external-data-tool-modal' import type { ModerationConfig } from '@/models/debug' import type { ApiBasedExtension, ExternalDataTool, } from '@/models/common' export type ModalState = { payload: T onCancelCallback?: () => void onSaveCallback?: (newPayload: T) => void onValidateBeforeSaveCallback?: (newPayload: T) => boolean } const ModalContext = createContext<{ setShowAccountSettingModal: Dispatch | null>> setShowApiBasedExtensionModal: Dispatch | null>> setShowModerationSettingModal: Dispatch | null>> setShowExternalDataToolModal: Dispatch | null>> }>({ setShowAccountSettingModal: () => {}, setShowApiBasedExtensionModal: () => {}, setShowModerationSettingModal: () => {}, setShowExternalDataToolModal: () => {}, }) export const useModalContext = () => useContext(ModalContext) type ModalContextProviderProps = { children: React.ReactNode } export const ModalContextProvider = ({ children, }: ModalContextProviderProps) => { const [showAccountSettingModal, setShowAccountSettingModal] = useState | null>(null) const [showApiBasedExtensionModal, setShowApiBasedExtensionModal] = useState | null>(null) const [showModerationSettingModal, setShowModerationSettingModal] = useState | null>(null) const [showExternalDataToolModal, setShowExternalDataToolModal] = useState | null>(null) const handleCancelAccountSettingModal = () => { setShowAccountSettingModal(null) if (showAccountSettingModal?.onCancelCallback) showAccountSettingModal?.onCancelCallback() } const handleCancelModerationSettingModal = () => { setShowModerationSettingModal(null) if (showModerationSettingModal?.onCancelCallback) showModerationSettingModal.onCancelCallback() } const handleSaveApiBasedExtension = (newApiBasedExtension: ApiBasedExtension) => { if (showApiBasedExtensionModal?.onSaveCallback) showApiBasedExtensionModal.onSaveCallback(newApiBasedExtension) setShowApiBasedExtensionModal(null) } const handleSaveModeration = (newModerationConfig: ModerationConfig) => { if (showModerationSettingModal?.onSaveCallback) showModerationSettingModal.onSaveCallback(newModerationConfig) setShowModerationSettingModal(null) } const handleSaveExternalDataTool = (newExternalDataTool: ExternalDataTool) => { if (showExternalDataToolModal?.onSaveCallback) showExternalDataToolModal.onSaveCallback(newExternalDataTool) setShowExternalDataToolModal(null) } const handleValidateBeforeSaveExternalDataTool = (newExternalDataTool: ExternalDataTool) => { if (showExternalDataToolModal?.onValidateBeforeSaveCallback) return showExternalDataToolModal?.onValidateBeforeSaveCallback(newExternalDataTool) return true } return ( <> {children} { !!showAccountSettingModal && ( ) } { !!showApiBasedExtensionModal && ( setShowApiBasedExtensionModal(null)} onSave={handleSaveApiBasedExtension} /> ) } { !!showModerationSettingModal && ( ) } { !!showExternalDataToolModal && ( setShowExternalDataToolModal(null)} onSave={handleSaveExternalDataTool} onValidateBeforeSave={handleValidateBeforeSaveExternalDataTool} /> ) } ) } export default ModalContext