123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- 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 {
- Edge,
- HistoryWorkflowData,
- Node,
- RunFile,
- ToolWithProvider,
- WorkflowRunningData,
- } from './types'
- import { WorkflowContext } from './context'
- type PreviewRunningData = WorkflowRunningData & {
- resultTabActive?: boolean
- resultText?: string
- }
- type Shape = {
- appId: string
- panelWidth: number
- 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
- files: RunFile[]
- setFiles: (files: RunFile[]) => void
- backupDraft?: {
- nodes: Node[]
- edges: Edge[]
- viewport: Viewport
- features: Record<string, any>
- }
- 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
- clipboardElements: Node[]
- setClipboardElements: (clipboardElements: Node[]) => void
- shortcutsDisabled: boolean
- setShortcutsDisabled: (shortcutsDisabled: boolean) => void
- showDebugAndPreviewPanel: boolean
- setShowDebugAndPreviewPanel: (showDebugAndPreviewPanel: boolean) => void
- }
- export const createWorkflowStore = () => {
- return createStore<Shape>(set => ({
- appId: '',
- panelWidth: localStorage.getItem('workflow-node-panel-width') ? parseFloat(localStorage.getItem('workflow-node-panel-width')!) : 420,
- 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 })),
- 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 })),
- clipboardElements: [],
- setClipboardElements: clipboardElements => set(() => ({ clipboardElements })),
- shortcutsDisabled: false,
- setShortcutsDisabled: shortcutsDisabled => set(() => ({ shortcutsDisabled })),
- showDebugAndPreviewPanel: false,
- setShowDebugAndPreviewPanel: showDebugAndPreviewPanel => set(() => ({ showDebugAndPreviewPanel })),
- }))
- }
- 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)!
- }
|