| 'use client' |
|
|
| import type { Dispatch, SetStateAction } from 'react' |
| import { useCallback, useState } from 'react' |
| import { createContext, useContext, useContextSelector } from 'use-context-selector' |
| import { useRouter, useSearchParams } from 'next/navigation' |
| 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/base/features/new-feature-panel/moderation/moderation-setting-modal' |
| import ExternalDataToolModal from '@/app/components/app/configuration/tools/external-data-tool-modal' |
| import AnnotationFullModal from '@/app/components/billing/annotation-full/modal' |
| import ModelModal from '@/app/components/header/account-setting/model-provider-page/model-modal' |
| import ExternalAPIModal from '@/app/components/datasets/external-api/external-api-modal' |
| import type { |
| ConfigurationMethodEnum, |
| CustomConfigurationModelFixedFields, |
| ModelLoadBalancingConfigEntry, |
| ModelProvider, |
| } from '@/app/components/header/account-setting/model-provider-page/declarations' |
|
|
| import Pricing from '@/app/components/billing/pricing' |
| import type { ModerationConfig, PromptVariable } from '@/models/debug' |
| import type { |
| ApiBasedExtension, |
| ExternalDataTool, |
| } from '@/models/common' |
| import type { CreateExternalAPIReq } from '@/app/components/datasets/external-api/declarations' |
| import ModelLoadBalancingEntryModal from '@/app/components/header/account-setting/model-provider-page/model-modal/model-load-balancing-entry-modal' |
| import type { ModelLoadBalancingModalProps } from '@/app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-modal' |
| import ModelLoadBalancingModal from '@/app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-modal' |
| import OpeningSettingModal from '@/app/components/base/features/new-feature-panel/conversation-opener/modal' |
| import type { OpeningStatement } from '@/app/components/base/features/types' |
| import type { InputVar } from '@/app/components/workflow/types' |
|
|
| export type ModalState<T> = { |
| payload: T |
| onCancelCallback?: () => void |
| onSaveCallback?: (newPayload: T) => void |
| onRemoveCallback?: (newPayload: T) => void |
| onEditCallback?: (newPayload: T) => void |
| onValidateBeforeSaveCallback?: (newPayload: T) => boolean |
| isEditMode?: boolean |
| datasetBindings?: { id: string; name: string }[] |
| } |
|
|
| export type ModelModalType = { |
| currentProvider: ModelProvider |
| currentConfigurationMethod: ConfigurationMethodEnum |
| currentCustomConfigurationModelFixedFields?: CustomConfigurationModelFixedFields |
| } |
| export type LoadBalancingEntryModalType = ModelModalType & { |
| entry?: ModelLoadBalancingConfigEntry |
| index?: number |
| } |
| export type ModalContextState = { |
| setShowAccountSettingModal: Dispatch<SetStateAction<ModalState<string> | null>> |
| setShowApiBasedExtensionModal: Dispatch<SetStateAction<ModalState<ApiBasedExtension> | null>> |
| setShowModerationSettingModal: Dispatch<SetStateAction<ModalState<ModerationConfig> | null>> |
| setShowExternalDataToolModal: Dispatch<SetStateAction<ModalState<ExternalDataTool> | null>> |
| setShowPricingModal: () => void |
| setShowAnnotationFullModal: () => void |
| setShowModelModal: Dispatch<SetStateAction<ModalState<ModelModalType> | null>> |
| setShowExternalKnowledgeAPIModal: Dispatch<SetStateAction<ModalState<CreateExternalAPIReq> | null>> |
| setShowModelLoadBalancingModal: Dispatch<SetStateAction<ModelLoadBalancingModalProps | null>> |
| setShowModelLoadBalancingEntryModal: Dispatch<SetStateAction<ModalState<LoadBalancingEntryModalType> | null>> |
| setShowOpeningModal: Dispatch<SetStateAction<ModalState<OpeningStatement & { |
| promptVariables?: PromptVariable[] |
| workflowVariables?: InputVar[] |
| onAutoAddPromptVariable?: (variable: PromptVariable[]) => void |
| }> | null>> |
| } |
| const ModalContext = createContext<ModalContextState>({ |
| setShowAccountSettingModal: () => { }, |
| setShowApiBasedExtensionModal: () => { }, |
| setShowModerationSettingModal: () => { }, |
| setShowExternalDataToolModal: () => { }, |
| setShowPricingModal: () => { }, |
| setShowAnnotationFullModal: () => { }, |
| setShowModelModal: () => { }, |
| setShowExternalKnowledgeAPIModal: () => { }, |
| setShowModelLoadBalancingModal: () => { }, |
| setShowModelLoadBalancingEntryModal: () => { }, |
| setShowOpeningModal: () => { }, |
| }) |
|
|
| export const useModalContext = () => useContext(ModalContext) |
|
|
| |
| |
| |
| export const useModalContextSelector = <T,>(selector: (state: ModalContextState) => T): T => |
| useContextSelector(ModalContext, selector) |
|
|
| type ModalContextProviderProps = { |
| children: React.ReactNode |
| } |
| export const ModalContextProvider = ({ |
| children, |
| }: ModalContextProviderProps) => { |
| const [showAccountSettingModal, setShowAccountSettingModal] = useState<ModalState<string> | null>(null) |
| const [showApiBasedExtensionModal, setShowApiBasedExtensionModal] = useState<ModalState<ApiBasedExtension> | null>(null) |
| const [showModerationSettingModal, setShowModerationSettingModal] = useState<ModalState<ModerationConfig> | null>(null) |
| const [showExternalDataToolModal, setShowExternalDataToolModal] = useState<ModalState<ExternalDataTool> | null>(null) |
| const [showModelModal, setShowModelModal] = useState<ModalState<ModelModalType> | null>(null) |
| const [showExternalKnowledgeAPIModal, setShowExternalKnowledgeAPIModal] = useState<ModalState<CreateExternalAPIReq> | null>(null) |
| const [showModelLoadBalancingModal, setShowModelLoadBalancingModal] = useState<ModelLoadBalancingModalProps | null>(null) |
| const [showModelLoadBalancingEntryModal, setShowModelLoadBalancingEntryModal] = useState<ModalState<LoadBalancingEntryModalType> | null>(null) |
| const [showOpeningModal, setShowOpeningModal] = useState<ModalState<OpeningStatement & { |
| promptVariables?: PromptVariable[] |
| workflowVariables?: InputVar[] |
| onAutoAddPromptVariable?: (variable: PromptVariable[]) => void |
| }> | null>(null) |
| const searchParams = useSearchParams() |
| const router = useRouter() |
| const [showPricingModal, setShowPricingModal] = useState(searchParams.get('show-pricing') === '1') |
| const [showAnnotationFullModal, setShowAnnotationFullModal] = useState(false) |
| const handleCancelAccountSettingModal = () => { |
| setShowAccountSettingModal(null) |
| if (showAccountSettingModal?.onCancelCallback) |
| showAccountSettingModal?.onCancelCallback() |
| } |
|
|
| const handleCancelModerationSettingModal = () => { |
| setShowModerationSettingModal(null) |
| if (showModerationSettingModal?.onCancelCallback) |
| showModerationSettingModal.onCancelCallback() |
| } |
|
|
| const handleCancelExternalDataToolModal = () => { |
| setShowExternalDataToolModal(null) |
| if (showExternalDataToolModal?.onCancelCallback) |
| showExternalDataToolModal.onCancelCallback() |
| } |
|
|
| const handleCancelModelModal = useCallback(() => { |
| setShowModelModal(null) |
| if (showModelModal?.onCancelCallback) |
| showModelModal.onCancelCallback() |
| }, [showModelModal]) |
|
|
| const handleSaveModelModal = useCallback(() => { |
| if (showModelModal?.onSaveCallback) |
| showModelModal.onSaveCallback(showModelModal.payload) |
| setShowModelModal(null) |
| }, [showModelModal]) |
|
|
| const handleCancelExternalApiModal = useCallback(() => { |
| setShowExternalKnowledgeAPIModal(null) |
| if (showExternalKnowledgeAPIModal?.onCancelCallback) |
| showExternalKnowledgeAPIModal.onCancelCallback() |
| }, [showExternalKnowledgeAPIModal]) |
|
|
| const handleSaveExternalApiModal = useCallback(async (updatedFormValue: CreateExternalAPIReq) => { |
| if (showExternalKnowledgeAPIModal?.onSaveCallback) |
| showExternalKnowledgeAPIModal.onSaveCallback(updatedFormValue) |
| setShowExternalKnowledgeAPIModal(null) |
| }, [showExternalKnowledgeAPIModal]) |
|
|
| const handleEditExternalApiModal = useCallback(async (updatedFormValue: CreateExternalAPIReq) => { |
| if (showExternalKnowledgeAPIModal?.onEditCallback) |
| showExternalKnowledgeAPIModal.onEditCallback(updatedFormValue) |
| setShowExternalKnowledgeAPIModal(null) |
| }, [showExternalKnowledgeAPIModal]) |
|
|
| const handleCancelModelLoadBalancingEntryModal = useCallback(() => { |
| showModelLoadBalancingEntryModal?.onCancelCallback?.() |
| setShowModelLoadBalancingEntryModal(null) |
| }, [showModelLoadBalancingEntryModal]) |
|
|
| const handleCancelOpeningModal = useCallback(() => { |
| setShowOpeningModal(null) |
| if (showOpeningModal?.onCancelCallback) |
| showOpeningModal.onCancelCallback() |
| }, [showOpeningModal]) |
|
|
| const handleSaveModelLoadBalancingEntryModal = useCallback((entry: ModelLoadBalancingConfigEntry) => { |
| showModelLoadBalancingEntryModal?.onSaveCallback?.({ |
| ...showModelLoadBalancingEntryModal.payload, |
| entry, |
| }) |
| setShowModelLoadBalancingEntryModal(null) |
| }, [showModelLoadBalancingEntryModal]) |
|
|
| const handleRemoveModelLoadBalancingEntry = useCallback(() => { |
| showModelLoadBalancingEntryModal?.onRemoveCallback?.(showModelLoadBalancingEntryModal.payload) |
| setShowModelLoadBalancingEntryModal(null) |
| }, [showModelLoadBalancingEntryModal]) |
|
|
| 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 |
| } |
|
|
| const handleSaveOpeningModal = (newOpening: OpeningStatement) => { |
| if (showOpeningModal?.onSaveCallback) |
| showOpeningModal.onSaveCallback(newOpening) |
| setShowOpeningModal(null) |
| } |
|
|
| return ( |
| <ModalContext.Provider value={{ |
| setShowAccountSettingModal, |
| setShowApiBasedExtensionModal, |
| setShowModerationSettingModal, |
| setShowExternalDataToolModal, |
| setShowPricingModal: () => setShowPricingModal(true), |
| setShowAnnotationFullModal: () => setShowAnnotationFullModal(true), |
| setShowModelModal, |
| setShowExternalKnowledgeAPIModal, |
| setShowModelLoadBalancingModal, |
| setShowModelLoadBalancingEntryModal, |
| setShowOpeningModal, |
| }}> |
| <> |
| {children} |
| { |
| !!showAccountSettingModal && ( |
| <AccountSetting |
| activeTab={showAccountSettingModal.payload} |
| onCancel={handleCancelAccountSettingModal} |
| /> |
| ) |
| } |
| |
| { |
| !!showApiBasedExtensionModal && ( |
| <ApiBasedExtensionModal |
| data={showApiBasedExtensionModal.payload} |
| onCancel={() => setShowApiBasedExtensionModal(null)} |
| onSave={handleSaveApiBasedExtension} |
| /> |
| ) |
| } |
| { |
| !!showModerationSettingModal && ( |
| <ModerationSettingModal |
| data={showModerationSettingModal.payload} |
| onCancel={handleCancelModerationSettingModal} |
| onSave={handleSaveModeration} |
| /> |
| ) |
| } |
| { |
| !!showExternalDataToolModal && ( |
| <ExternalDataToolModal |
| data={showExternalDataToolModal.payload} |
| onCancel={handleCancelExternalDataToolModal} |
| onSave={handleSaveExternalDataTool} |
| onValidateBeforeSave={handleValidateBeforeSaveExternalDataTool} |
| /> |
| ) |
| } |
| |
| { |
| !!showPricingModal && ( |
| <Pricing onCancel={() => { |
| if (searchParams.get('show-pricing') === '1') |
| router.push(location.pathname, { forceOptimisticNavigation: true } as any) |
| |
| setShowPricingModal(false) |
| }} /> |
| ) |
| } |
| |
| { |
| showAnnotationFullModal && ( |
| <AnnotationFullModal |
| show={showAnnotationFullModal} |
| onHide={() => setShowAnnotationFullModal(false)} /> |
| ) |
| } |
| { |
| !!showModelModal && ( |
| <ModelModal |
| provider={showModelModal.payload.currentProvider} |
| configurateMethod={showModelModal.payload.currentConfigurationMethod} |
| currentCustomConfigurationModelFixedFields={showModelModal.payload.currentCustomConfigurationModelFixedFields} |
| onCancel={handleCancelModelModal} |
| onSave={handleSaveModelModal} |
| /> |
| ) |
| } |
| { |
| !!showExternalKnowledgeAPIModal && ( |
| <ExternalAPIModal |
| data={showExternalKnowledgeAPIModal.payload} |
| datasetBindings={showExternalKnowledgeAPIModal.datasetBindings ?? []} |
| onSave={handleSaveExternalApiModal} |
| onCancel={handleCancelExternalApiModal} |
| onEdit={handleEditExternalApiModal} |
| isEditMode={showExternalKnowledgeAPIModal.isEditMode ?? false} |
| /> |
| ) |
| } |
| { |
| Boolean(showModelLoadBalancingModal) && ( |
| <ModelLoadBalancingModal {...showModelLoadBalancingModal!} /> |
| ) |
| } |
| { |
| !!showModelLoadBalancingEntryModal && ( |
| <ModelLoadBalancingEntryModal |
| provider={showModelLoadBalancingEntryModal.payload.currentProvider} |
| configurationMethod={showModelLoadBalancingEntryModal.payload.currentConfigurationMethod} |
| currentCustomConfigurationModelFixedFields={showModelLoadBalancingEntryModal.payload.currentCustomConfigurationModelFixedFields} |
| entry={showModelLoadBalancingEntryModal.payload.entry} |
| onCancel={handleCancelModelLoadBalancingEntryModal} |
| onSave={handleSaveModelLoadBalancingEntryModal} |
| onRemove={handleRemoveModelLoadBalancingEntry} |
| /> |
| ) |
| } |
| {showOpeningModal && ( |
| <OpeningSettingModal |
| data={showOpeningModal.payload} |
| onSave={handleSaveOpeningModal} |
| onCancel={handleCancelOpeningModal} |
| promptVariables={showOpeningModal.payload.promptVariables} |
| workflowVariables={showOpeningModal.payload.workflowVariables} |
| onAutoAddPromptVariable={showOpeningModal.payload.onAutoAddPromptVariable} |
| /> |
| )} |
| </> |
| </ModalContext.Provider> |
| ) |
| } |
|
|
| export default ModalContext |
|
|