dify/web/app/components/workflow-app/hooks/use-workflow-start-run.tsx
Stephen Zhou a84c2d36a3
style: format with vp fmt (#38803)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-07-12 15:57:46 +00:00

300 lines
9.4 KiB
TypeScript

import type { useNodesSyncDraft, useWorkflowRun } from '.'
import { useCallback } from 'react'
import { useStoreApi } from 'reactflow'
import { useFeaturesStore } from '@/app/components/base/features/hooks'
import { TriggerType } from '@/app/components/workflow/header/test-run-menu'
import { useWorkflowInteractions } from '@/app/components/workflow/hooks'
import { useWorkflowStore } from '@/app/components/workflow/store'
import { BlockEnum, WorkflowRunningStatus } from '@/app/components/workflow/types'
import { useIsChatMode, useNodesSyncDraftByCanEdit, useWorkflowRunByCanEdit } from '.'
type HandleRun = ReturnType<typeof useWorkflowRun>['handleRun']
type DoSyncWorkflowDraft = ReturnType<typeof useNodesSyncDraft>['doSyncWorkflowDraft']
const useWorkflowStartRunBase = (
handleRun: HandleRun,
doSyncWorkflowDraft: DoSyncWorkflowDraft,
) => {
const store = useStoreApi()
const workflowStore = useWorkflowStore()
const featuresStore = useFeaturesStore()
const isChatMode = useIsChatMode()
const { handleCancelDebugAndPreviewPanel } = useWorkflowInteractions()
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)
if (!startNode) return
const startVariables = startNode?.data.variables || []
const fileSettings = featuresStore!.getState().features.file
const {
showDebugAndPreviewPanel,
setShowDebugAndPreviewPanel,
setShowInputsPanel,
setShowEnvPanel,
setShowGlobalVariablePanel,
} = workflowStore.getState()
setShowEnvPanel(false)
setShowGlobalVariablePanel(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 handleWorkflowTriggerScheduleRunInWorkflow = useCallback(
async (nodeId?: string) => {
if (!nodeId) return
const {
workflowRunningData,
showDebugAndPreviewPanel,
setShowDebugAndPreviewPanel,
setShowInputsPanel,
setShowEnvPanel,
setShowGlobalVariablePanel,
setListeningTriggerType,
setListeningTriggerNodeId,
setListeningTriggerNodeIds,
setListeningTriggerIsAll,
} = workflowStore.getState()
if (workflowRunningData?.result.status === WorkflowRunningStatus.Running) return
const { getNodes } = store.getState()
const nodes = getNodes()
const scheduleNode = nodes.find(
(node) => node.id === nodeId && node.data.type === BlockEnum.TriggerSchedule,
)
if (!scheduleNode) {
console.warn('handleWorkflowTriggerScheduleRunInWorkflow: schedule node not found', nodeId)
return
}
setShowEnvPanel(false)
setShowGlobalVariablePanel(false)
if (showDebugAndPreviewPanel) {
handleCancelDebugAndPreviewPanel()
return
}
setListeningTriggerType(BlockEnum.TriggerSchedule)
setListeningTriggerNodeId(nodeId)
setListeningTriggerNodeIds([nodeId])
setListeningTriggerIsAll(false)
await doSyncWorkflowDraft()
handleRun({}, undefined, {
mode: TriggerType.Schedule,
scheduleNodeId: nodeId,
})
setShowDebugAndPreviewPanel(true)
setShowInputsPanel(false)
},
[store, workflowStore, handleCancelDebugAndPreviewPanel, handleRun, doSyncWorkflowDraft],
)
const handleWorkflowTriggerWebhookRunInWorkflow = useCallback(
async ({ nodeId }: { nodeId: string }) => {
if (!nodeId) return
const {
workflowRunningData,
showDebugAndPreviewPanel,
setShowDebugAndPreviewPanel,
setShowInputsPanel,
setShowEnvPanel,
setShowGlobalVariablePanel,
setListeningTriggerType,
setListeningTriggerNodeId,
setListeningTriggerNodeIds,
setListeningTriggerIsAll,
} = workflowStore.getState()
if (workflowRunningData?.result.status === WorkflowRunningStatus.Running) return
const { getNodes } = store.getState()
const nodes = getNodes()
const webhookNode = nodes.find(
(node) => node.id === nodeId && node.data.type === BlockEnum.TriggerWebhook,
)
if (!webhookNode) {
console.warn('handleWorkflowTriggerWebhookRunInWorkflow: webhook node not found', nodeId)
return
}
setShowEnvPanel(false)
setShowGlobalVariablePanel(false)
if (!showDebugAndPreviewPanel) setShowDebugAndPreviewPanel(true)
setShowInputsPanel(false)
setListeningTriggerType(BlockEnum.TriggerWebhook)
setListeningTriggerNodeId(nodeId)
setListeningTriggerNodeIds([nodeId])
setListeningTriggerIsAll(false)
await doSyncWorkflowDraft()
handleRun({ node_id: nodeId }, undefined, {
mode: TriggerType.Webhook,
webhookNodeId: nodeId,
})
},
[store, workflowStore, handleRun, doSyncWorkflowDraft],
)
const handleWorkflowTriggerPluginRunInWorkflow = useCallback(
async (nodeId?: string) => {
if (!nodeId) return
const {
workflowRunningData,
showDebugAndPreviewPanel,
setShowDebugAndPreviewPanel,
setShowInputsPanel,
setShowEnvPanel,
setShowGlobalVariablePanel,
setListeningTriggerType,
setListeningTriggerNodeId,
setListeningTriggerNodeIds,
setListeningTriggerIsAll,
} = workflowStore.getState()
if (workflowRunningData?.result.status === WorkflowRunningStatus.Running) return
const { getNodes } = store.getState()
const nodes = getNodes()
const pluginNode = nodes.find(
(node) => node.id === nodeId && node.data.type === BlockEnum.TriggerPlugin,
)
if (!pluginNode) {
console.warn('handleWorkflowTriggerPluginRunInWorkflow: plugin node not found', nodeId)
return
}
setShowEnvPanel(false)
setShowGlobalVariablePanel(false)
if (!showDebugAndPreviewPanel) setShowDebugAndPreviewPanel(true)
setShowInputsPanel(false)
setListeningTriggerType(BlockEnum.TriggerPlugin)
setListeningTriggerNodeId(nodeId)
setListeningTriggerNodeIds([nodeId])
setListeningTriggerIsAll(false)
await doSyncWorkflowDraft()
handleRun({ node_id: nodeId }, undefined, {
mode: TriggerType.Plugin,
pluginNodeId: nodeId,
})
},
[store, workflowStore, handleRun, doSyncWorkflowDraft],
)
const handleWorkflowRunAllTriggersInWorkflow = useCallback(
async (nodeIds: string[]) => {
if (!nodeIds.length) return
const {
workflowRunningData,
showDebugAndPreviewPanel,
setShowDebugAndPreviewPanel,
setShowInputsPanel,
setShowEnvPanel,
setShowGlobalVariablePanel,
setListeningTriggerIsAll,
setListeningTriggerNodeIds,
setListeningTriggerNodeId,
} = workflowStore.getState()
if (workflowRunningData?.result.status === WorkflowRunningStatus.Running) return
setShowEnvPanel(false)
setShowGlobalVariablePanel(false)
setShowInputsPanel(false)
setListeningTriggerIsAll(true)
setListeningTriggerNodeIds(nodeIds)
setListeningTriggerNodeId(null)
if (!showDebugAndPreviewPanel) setShowDebugAndPreviewPanel(true)
await doSyncWorkflowDraft()
handleRun({ node_ids: nodeIds }, undefined, {
mode: TriggerType.All,
allNodeIds: nodeIds,
})
},
[store, workflowStore, handleRun, doSyncWorkflowDraft],
)
const handleWorkflowStartRunInChatflow = useCallback(async () => {
const {
showDebugAndPreviewPanel,
setShowDebugAndPreviewPanel,
setHistoryWorkflowData,
setShowEnvPanel,
setShowChatVariablePanel,
setShowGlobalVariablePanel,
} = workflowStore.getState()
setShowEnvPanel(false)
setShowChatVariablePanel(false)
setShowGlobalVariablePanel(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,
handleWorkflowTriggerScheduleRunInWorkflow,
handleWorkflowTriggerWebhookRunInWorkflow,
handleWorkflowTriggerPluginRunInWorkflow,
handleWorkflowRunAllTriggersInWorkflow,
}
}
export const useWorkflowStartRunByCanEdit = (canEdit: boolean) => {
const { handleRun } = useWorkflowRunByCanEdit(canEdit)
const { doSyncWorkflowDraft } = useNodesSyncDraftByCanEdit(canEdit)
return useWorkflowStartRunBase(handleRun, doSyncWorkflowDraft)
}