use-workflow-started.ts 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import { useCallback } from 'react'
  2. import { useStoreApi } from 'reactflow'
  3. import produce from 'immer'
  4. import type { WorkflowStartedResponse } from '@/types/workflow'
  5. import { WorkflowRunningStatus } from '@/app/components/workflow/types'
  6. import { useWorkflowStore } from '@/app/components/workflow/store'
  7. export const useWorkflowStarted = () => {
  8. const store = useStoreApi()
  9. const workflowStore = useWorkflowStore()
  10. const handleWorkflowStarted = useCallback((params: WorkflowStartedResponse) => {
  11. const { task_id, data } = params
  12. const {
  13. workflowRunningData,
  14. setWorkflowRunningData,
  15. setIterParallelLogMap,
  16. } = workflowStore.getState()
  17. const {
  18. getNodes,
  19. setNodes,
  20. edges,
  21. setEdges,
  22. } = store.getState()
  23. setIterParallelLogMap(new Map())
  24. setWorkflowRunningData(produce(workflowRunningData!, (draft) => {
  25. draft.task_id = task_id
  26. draft.result = {
  27. ...draft?.result,
  28. ...data,
  29. status: WorkflowRunningStatus.Running,
  30. }
  31. }))
  32. const nodes = getNodes()
  33. const newNodes = produce(nodes, (draft) => {
  34. draft.forEach((node) => {
  35. node.data._waitingRun = true
  36. node.data._runningBranchId = undefined
  37. })
  38. })
  39. setNodes(newNodes)
  40. const newEdges = produce(edges, (draft) => {
  41. draft.forEach((edge) => {
  42. edge.data = {
  43. ...edge.data,
  44. _sourceRunningStatus: undefined,
  45. _targetRunningStatus: undefined,
  46. _waitingRun: true,
  47. }
  48. })
  49. })
  50. setEdges(newEdges)
  51. }, [workflowStore, store])
  52. return {
  53. handleWorkflowStarted,
  54. }
  55. }