mirror of
https://github.com/langgenius/dify.git
synced 2026-07-24 04:58:32 +08:00
300 lines
9.4 KiB
TypeScript
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)
|
|
}
|