import { useCallback } from 'react' import { useStoreApi } from 'reactflow' import { useWorkflowStore } from '../store' import { BlockEnum, WorkflowRunningStatus, } from '../types' import { useIsChatMode, useNodesSyncDraft, useWorkflowInteractions, useWorkflowRun, } from './index' import { useFeaturesStore } from '@/app/components/base/features/hooks' export const useWorkflowStartRun = () => { const store = useStoreApi() const workflowStore = useWorkflowStore() const featuresStore = useFeaturesStore() const isChatMode = useIsChatMode() const { handleCancelDebugAndPreviewPanel } = useWorkflowInteractions() const { handleRun } = useWorkflowRun() const { doSyncWorkflowDraft } = useNodesSyncDraft() const handleWorkflowStartRunInWorkflow = useCallback(async () => { const { workflowRunningData, } = workflowStore.getState() if (workflowRunningData?.result.status === WorkflowRunningStatus.Running) return const { getNodes } = store.getState() const nodes = getNodes() const startNode = nodes.find(node => node.data.type === BlockEnum.Start) const startVariables = startNode?.data.variables || [] const fileSettings = featuresStore!.getState().features.file const { showDebugAndPreviewPanel, setShowDebugAndPreviewPanel, setShowInputsPanel, setShowEnvPanel, } = workflowStore.getState() setShowEnvPanel(false) if (showDebugAndPreviewPanel) { handleCancelDebugAndPreviewPanel() return } if (!startVariables.length && !fileSettings?.image?.enabled) { await doSyncWorkflowDraft() handleRun({ inputs: {}, files: [] }) setShowDebugAndPreviewPanel(true) setShowInputsPanel(false) } else { setShowDebugAndPreviewPanel(true) setShowInputsPanel(true) } }, [store, workflowStore, featuresStore, handleCancelDebugAndPreviewPanel, handleRun, doSyncWorkflowDraft]) const handleWorkflowStartRunInChatflow = useCallback(async () => { const { showDebugAndPreviewPanel, setShowDebugAndPreviewPanel, setHistoryWorkflowData, setShowEnvPanel, setShowChatVariablePanel, } = workflowStore.getState() setShowEnvPanel(false) setShowChatVariablePanel(false) if (showDebugAndPreviewPanel) handleCancelDebugAndPreviewPanel() else setShowDebugAndPreviewPanel(true) setHistoryWorkflowData(undefined) }, [workflowStore, handleCancelDebugAndPreviewPanel]) const handleStartWorkflowRun = useCallback(() => { if (!isChatMode) handleWorkflowStartRunInWorkflow() else handleWorkflowStartRunInChatflow() }, [isChatMode, handleWorkflowStartRunInWorkflow, handleWorkflowStartRunInChatflow]) return { handleStartWorkflowRun, handleWorkflowStartRunInWorkflow, handleWorkflowStartRunInChatflow, } }