Spaces:
Build error
Build error
'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) | |
// Adding a dangling comma to avoid the generic parsing issue in tsx, see: | |
// https://github.com/microsoft/TypeScript/issues/15713 | |
// eslint-disable-next-line @typescript-eslint/comma-dangle | |
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 | |