| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 | import { useCallback } from 'react'import { useStoreApi } from 'reactflow'import produce from 'immer'import type { NodeFinishedResponse } from '@/types/workflow'import {  BlockEnum,  NodeRunningStatus,} from '@/app/components/workflow/types'import { ErrorHandleTypeEnum } from '@/app/components/workflow/nodes/_base/components/error-handle/types'import { useWorkflowStore } from '@/app/components/workflow/store'export const useWorkflowNodeFinished = () => {  const store = useStoreApi()  const workflowStore = useWorkflowStore()  const handleWorkflowNodeFinished = useCallback((params: NodeFinishedResponse) => {    const { data } = params    const {      workflowRunningData,      setWorkflowRunningData,    } = workflowStore.getState()    const {      getNodes,      setNodes,      edges,      setEdges,    } = store.getState()    const nodes = getNodes()    setWorkflowRunningData(produce(workflowRunningData!, (draft) => {      const currentIndex = draft.tracing!.findIndex(item => item.id === data.id)      if (currentIndex > -1) {        draft.tracing![currentIndex] = {          ...draft.tracing![currentIndex],          ...data,        }      }    }))    const newNodes = produce(nodes, (draft) => {      const currentNode = draft.find(node => node.id === data.node_id)!      currentNode.data._runningStatus = data.status      if (data.status === NodeRunningStatus.Exception) {        if (data.execution_metadata?.error_strategy === ErrorHandleTypeEnum.failBranch)          currentNode.data._runningBranchId = ErrorHandleTypeEnum.failBranch      }      else {        if (data.node_type === BlockEnum.IfElse)          currentNode.data._runningBranchId = data?.outputs?.selected_case_id        if (data.node_type === BlockEnum.QuestionClassifier)          currentNode.data._runningBranchId = data?.outputs?.class_id      }    })    setNodes(newNodes)    const newEdges = produce(edges, (draft) => {      const incomeEdges = draft.filter((edge) => {        return edge.target === data.node_id      })      incomeEdges.forEach((edge) => {        edge.data = {          ...edge.data,          _targetRunningStatus: data.status as any,        }      })    })    setEdges(newEdges)  }, [store, workflowStore])  return {    handleWorkflowNodeFinished,  }}
 |