|
import { useContext } from 'react' |
|
import { |
|
useStore as useZustandStore, |
|
} from 'zustand' |
|
import { createStore } from 'zustand/vanilla' |
|
import { debounce } from 'lodash-es' |
|
import type { Viewport } from 'reactflow' |
|
import type { |
|
HelpLineHorizontalPosition, |
|
HelpLineVerticalPosition, |
|
} from './help-line/types' |
|
import type { VariableAssignerNodeType } from './nodes/variable-assigner/types' |
|
import type { |
|
ConversationVariable, |
|
Edge, |
|
EnvironmentVariable, |
|
HistoryWorkflowData, |
|
Node, |
|
RunFile, |
|
ToolWithProvider, |
|
WorkflowRunningData, |
|
} from './types' |
|
import { WorkflowContext } from './context' |
|
import type { NodeTracing } from '@/types/workflow' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
type PreviewRunningData = WorkflowRunningData & { |
|
resultTabActive?: boolean |
|
resultText?: string |
|
} |
|
|
|
type Shape = { |
|
appId: string |
|
panelWidth: number |
|
showSingleRunPanel: boolean |
|
setShowSingleRunPanel: (showSingleRunPanel: boolean) => void |
|
workflowRunningData?: PreviewRunningData |
|
setWorkflowRunningData: (workflowData: PreviewRunningData) => void |
|
historyWorkflowData?: HistoryWorkflowData |
|
setHistoryWorkflowData: (historyWorkflowData?: HistoryWorkflowData) => void |
|
showRunHistory: boolean |
|
setShowRunHistory: (showRunHistory: boolean) => void |
|
showFeaturesPanel: boolean |
|
setShowFeaturesPanel: (showFeaturesPanel: boolean) => void |
|
helpLineHorizontal?: HelpLineHorizontalPosition |
|
setHelpLineHorizontal: (helpLineHorizontal?: HelpLineHorizontalPosition) => void |
|
helpLineVertical?: HelpLineVerticalPosition |
|
setHelpLineVertical: (helpLineVertical?: HelpLineVerticalPosition) => void |
|
draftUpdatedAt: number |
|
setDraftUpdatedAt: (draftUpdatedAt: number) => void |
|
publishedAt: number |
|
setPublishedAt: (publishedAt: number) => void |
|
showInputsPanel: boolean |
|
setShowInputsPanel: (showInputsPanel: boolean) => void |
|
inputs: Record<string, string> |
|
setInputs: (inputs: Record<string, string>) => void |
|
toolPublished: boolean |
|
setToolPublished: (toolPublished: boolean) => void |
|
files: RunFile[] |
|
setFiles: (files: RunFile[]) => void |
|
backupDraft?: { |
|
nodes: Node[] |
|
edges: Edge[] |
|
viewport: Viewport |
|
features: Record<string, any> |
|
environmentVariables: EnvironmentVariable[] |
|
} |
|
setBackupDraft: (backupDraft?: Shape['backupDraft']) => void |
|
notInitialWorkflow: boolean |
|
setNotInitialWorkflow: (notInitialWorkflow: boolean) => void |
|
nodesDefaultConfigs: Record<string, any> |
|
setNodesDefaultConfigs: (nodesDefaultConfigs: Record<string, any>) => void |
|
nodeAnimation: boolean |
|
setNodeAnimation: (nodeAnimation: boolean) => void |
|
isRestoring: boolean |
|
setIsRestoring: (isRestoring: boolean) => void |
|
debouncedSyncWorkflowDraft: (fn: () => void) => void |
|
buildInTools: ToolWithProvider[] |
|
setBuildInTools: (tools: ToolWithProvider[]) => void |
|
customTools: ToolWithProvider[] |
|
setCustomTools: (tools: ToolWithProvider[]) => void |
|
workflowTools: ToolWithProvider[] |
|
setWorkflowTools: (tools: ToolWithProvider[]) => void |
|
clipboardElements: Node[] |
|
setClipboardElements: (clipboardElements: Node[]) => void |
|
showDebugAndPreviewPanel: boolean |
|
setShowDebugAndPreviewPanel: (showDebugAndPreviewPanel: boolean) => void |
|
showEnvPanel: boolean |
|
setShowEnvPanel: (showEnvPanel: boolean) => void |
|
environmentVariables: EnvironmentVariable[] |
|
setEnvironmentVariables: (environmentVariables: EnvironmentVariable[]) => void |
|
envSecrets: Record<string, string> |
|
setEnvSecrets: (envSecrets: Record<string, string>) => void |
|
showChatVariablePanel: boolean |
|
setShowChatVariablePanel: (showChatVariablePanel: boolean) => void |
|
showGlobalVariablePanel: boolean |
|
setShowGlobalVariablePanel: (showGlobalVariablePanel: boolean) => void |
|
conversationVariables: ConversationVariable[] |
|
setConversationVariables: (conversationVariables: ConversationVariable[]) => void |
|
selection: null | { x1: number; y1: number; x2: number; y2: number } |
|
setSelection: (selection: Shape['selection']) => void |
|
bundleNodeSize: { width: number; height: number } | null |
|
setBundleNodeSize: (bundleNodeSize: Shape['bundleNodeSize']) => void |
|
controlMode: 'pointer' | 'hand' |
|
setControlMode: (controlMode: Shape['controlMode']) => void |
|
candidateNode?: Node |
|
setCandidateNode: (candidateNode?: Node) => void |
|
panelMenu?: { |
|
top: number |
|
left: number |
|
} |
|
setPanelMenu: (panelMenu: Shape['panelMenu']) => void |
|
nodeMenu?: { |
|
top: number |
|
left: number |
|
nodeId: string |
|
} |
|
setNodeMenu: (nodeMenu: Shape['nodeMenu']) => void |
|
mousePosition: { pageX: number; pageY: number; elementX: number; elementY: number } |
|
setMousePosition: (mousePosition: Shape['mousePosition']) => void |
|
syncWorkflowDraftHash: string |
|
setSyncWorkflowDraftHash: (hash: string) => void |
|
showConfirm?: { title: string; desc?: string; onConfirm: () => void } |
|
setShowConfirm: (showConfirm: Shape['showConfirm']) => void |
|
showAssignVariablePopup?: { |
|
nodeId: string |
|
nodeData: Node['data'] |
|
variableAssignerNodeId: string |
|
variableAssignerNodeData: VariableAssignerNodeType |
|
variableAssignerNodeHandleId: string |
|
parentNode?: Node |
|
x: number |
|
y: number |
|
} |
|
setShowAssignVariablePopup: (showAssignVariablePopup: Shape['showAssignVariablePopup']) => void |
|
hoveringAssignVariableGroupId?: string |
|
setHoveringAssignVariableGroupId: (hoveringAssignVariableGroupId?: string) => void |
|
connectingNodePayload?: { nodeId: string; nodeType: string; handleType: string; handleId: string | null } |
|
setConnectingNodePayload: (startConnectingPayload?: Shape['connectingNodePayload']) => void |
|
enteringNodePayload?: { |
|
nodeId: string |
|
nodeData: VariableAssignerNodeType |
|
} |
|
setEnteringNodePayload: (enteringNodePayload?: Shape['enteringNodePayload']) => void |
|
isSyncingWorkflowDraft: boolean |
|
setIsSyncingWorkflowDraft: (isSyncingWorkflowDraft: boolean) => void |
|
controlPromptEditorRerenderKey: number |
|
setControlPromptEditorRerenderKey: (controlPromptEditorRerenderKey: number) => void |
|
showImportDSLModal: boolean |
|
setShowImportDSLModal: (showImportDSLModal: boolean) => void |
|
showTips: string |
|
setShowTips: (showTips: string) => void |
|
iterTimes: number |
|
setIterTimes: (iterTimes: number) => void |
|
iterParallelLogMap: Map<string, NodeTracing[]> |
|
setIterParallelLogMap: (iterParallelLogMap: Map<string, NodeTracing[]>) => void |
|
} |
|
|
|
export const createWorkflowStore = () => { |
|
const hideAllPanel = { |
|
showDebugAndPreviewPanel: false, |
|
showEnvPanel: false, |
|
showChatVariablePanel: false, |
|
showGlobalVariablePanel: false, |
|
} |
|
return createStore<Shape>(set => ({ |
|
appId: '', |
|
panelWidth: localStorage.getItem('workflow-node-panel-width') ? parseFloat(localStorage.getItem('workflow-node-panel-width')!) : 420, |
|
showSingleRunPanel: false, |
|
setShowSingleRunPanel: showSingleRunPanel => set(() => ({ showSingleRunPanel })), |
|
workflowRunningData: undefined, |
|
setWorkflowRunningData: workflowRunningData => set(() => ({ workflowRunningData })), |
|
historyWorkflowData: undefined, |
|
setHistoryWorkflowData: historyWorkflowData => set(() => ({ historyWorkflowData })), |
|
showRunHistory: false, |
|
setShowRunHistory: showRunHistory => set(() => ({ showRunHistory })), |
|
showFeaturesPanel: false, |
|
setShowFeaturesPanel: showFeaturesPanel => set(() => ({ showFeaturesPanel })), |
|
helpLineHorizontal: undefined, |
|
setHelpLineHorizontal: helpLineHorizontal => set(() => ({ helpLineHorizontal })), |
|
helpLineVertical: undefined, |
|
setHelpLineVertical: helpLineVertical => set(() => ({ helpLineVertical })), |
|
draftUpdatedAt: 0, |
|
setDraftUpdatedAt: draftUpdatedAt => set(() => ({ draftUpdatedAt: draftUpdatedAt ? draftUpdatedAt * 1000 : 0 })), |
|
publishedAt: 0, |
|
setPublishedAt: publishedAt => set(() => ({ publishedAt: publishedAt ? publishedAt * 1000 : 0 })), |
|
showInputsPanel: false, |
|
setShowInputsPanel: showInputsPanel => set(() => ({ showInputsPanel })), |
|
inputs: {}, |
|
setInputs: inputs => set(() => ({ inputs })), |
|
toolPublished: false, |
|
setToolPublished: toolPublished => set(() => ({ toolPublished })), |
|
files: [], |
|
setFiles: files => set(() => ({ files })), |
|
backupDraft: undefined, |
|
setBackupDraft: backupDraft => set(() => ({ backupDraft })), |
|
notInitialWorkflow: false, |
|
setNotInitialWorkflow: notInitialWorkflow => set(() => ({ notInitialWorkflow })), |
|
nodesDefaultConfigs: {}, |
|
setNodesDefaultConfigs: nodesDefaultConfigs => set(() => ({ nodesDefaultConfigs })), |
|
nodeAnimation: false, |
|
setNodeAnimation: nodeAnimation => set(() => ({ nodeAnimation })), |
|
isRestoring: false, |
|
setIsRestoring: isRestoring => set(() => ({ isRestoring })), |
|
debouncedSyncWorkflowDraft: debounce((syncWorkflowDraft) => { |
|
syncWorkflowDraft() |
|
}, 5000), |
|
buildInTools: [], |
|
setBuildInTools: buildInTools => set(() => ({ buildInTools })), |
|
customTools: [], |
|
setCustomTools: customTools => set(() => ({ customTools })), |
|
workflowTools: [], |
|
setWorkflowTools: workflowTools => set(() => ({ workflowTools })), |
|
clipboardElements: [], |
|
setClipboardElements: clipboardElements => set(() => ({ clipboardElements })), |
|
showDebugAndPreviewPanel: false, |
|
setShowDebugAndPreviewPanel: showDebugAndPreviewPanel => set(() => ({ showDebugAndPreviewPanel })), |
|
showEnvPanel: false, |
|
setShowEnvPanel: showEnvPanel => set(() => ({ showEnvPanel })), |
|
environmentVariables: [], |
|
setEnvironmentVariables: environmentVariables => set(() => ({ environmentVariables })), |
|
envSecrets: {}, |
|
setEnvSecrets: envSecrets => set(() => ({ envSecrets })), |
|
showChatVariablePanel: false, |
|
setShowChatVariablePanel: showChatVariablePanel => set(() => ({ showChatVariablePanel })), |
|
showGlobalVariablePanel: false, |
|
setShowGlobalVariablePanel: showGlobalVariablePanel => set(() => { |
|
if (showGlobalVariablePanel) |
|
return { ...hideAllPanel, showGlobalVariablePanel: true } |
|
else |
|
return { showGlobalVariablePanel: false } |
|
}), |
|
conversationVariables: [], |
|
setConversationVariables: conversationVariables => set(() => ({ conversationVariables })), |
|
selection: null, |
|
setSelection: selection => set(() => ({ selection })), |
|
bundleNodeSize: null, |
|
setBundleNodeSize: bundleNodeSize => set(() => ({ bundleNodeSize })), |
|
controlMode: localStorage.getItem('workflow-operation-mode') === 'pointer' ? 'pointer' : 'hand', |
|
setControlMode: (controlMode) => { |
|
set(() => ({ controlMode })) |
|
localStorage.setItem('workflow-operation-mode', controlMode) |
|
}, |
|
candidateNode: undefined, |
|
setCandidateNode: candidateNode => set(() => ({ candidateNode })), |
|
panelMenu: undefined, |
|
setPanelMenu: panelMenu => set(() => ({ panelMenu })), |
|
nodeMenu: undefined, |
|
setNodeMenu: nodeMenu => set(() => ({ nodeMenu })), |
|
mousePosition: { pageX: 0, pageY: 0, elementX: 0, elementY: 0 }, |
|
setMousePosition: mousePosition => set(() => ({ mousePosition })), |
|
syncWorkflowDraftHash: '', |
|
setSyncWorkflowDraftHash: syncWorkflowDraftHash => set(() => ({ syncWorkflowDraftHash })), |
|
showConfirm: undefined, |
|
setShowConfirm: showConfirm => set(() => ({ showConfirm })), |
|
showAssignVariablePopup: undefined, |
|
setShowAssignVariablePopup: showAssignVariablePopup => set(() => ({ showAssignVariablePopup })), |
|
hoveringAssignVariableGroupId: undefined, |
|
setHoveringAssignVariableGroupId: hoveringAssignVariableGroupId => set(() => ({ hoveringAssignVariableGroupId })), |
|
connectingNodePayload: undefined, |
|
setConnectingNodePayload: connectingNodePayload => set(() => ({ connectingNodePayload })), |
|
enteringNodePayload: undefined, |
|
setEnteringNodePayload: enteringNodePayload => set(() => ({ enteringNodePayload })), |
|
isSyncingWorkflowDraft: false, |
|
setIsSyncingWorkflowDraft: isSyncingWorkflowDraft => set(() => ({ isSyncingWorkflowDraft })), |
|
controlPromptEditorRerenderKey: 0, |
|
setControlPromptEditorRerenderKey: controlPromptEditorRerenderKey => set(() => ({ controlPromptEditorRerenderKey })), |
|
showImportDSLModal: false, |
|
setShowImportDSLModal: showImportDSLModal => set(() => ({ showImportDSLModal })), |
|
showTips: '', |
|
setShowTips: showTips => set(() => ({ showTips })), |
|
iterTimes: 1, |
|
setIterTimes: iterTimes => set(() => ({ iterTimes })), |
|
iterParallelLogMap: new Map<string, NodeTracing[]>(), |
|
setIterParallelLogMap: iterParallelLogMap => set(() => ({ iterParallelLogMap })), |
|
|
|
})) |
|
} |
|
|
|
export function useStore<T>(selector: (state: Shape) => T): T { |
|
const store = useContext(WorkflowContext) |
|
if (!store) |
|
throw new Error('Missing WorkflowContext.Provider in the tree') |
|
|
|
return useZustandStore(store, selector) |
|
} |
|
|
|
export const useWorkflowStore = () => { |
|
return useContext(WorkflowContext)! |
|
} |
|
|