123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347 |
- '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
|