use-workflow-node-loop-finished.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { useCallback } from 'react'
  2. import { useStoreApi } from 'reactflow'
  3. import produce from 'immer'
  4. import type { LoopFinishedResponse } from '@/types/workflow'
  5. import { useWorkflowStore } from '@/app/components/workflow/store'
  6. export const useWorkflowNodeLoopFinished = () => {
  7. const store = useStoreApi()
  8. const workflowStore = useWorkflowStore()
  9. const handleWorkflowNodeLoopFinished = useCallback((params: LoopFinishedResponse) => {
  10. const { data } = params
  11. const {
  12. workflowRunningData,
  13. setWorkflowRunningData,
  14. } = workflowStore.getState()
  15. const {
  16. getNodes,
  17. setNodes,
  18. edges,
  19. setEdges,
  20. } = store.getState()
  21. const nodes = getNodes()
  22. setWorkflowRunningData(produce(workflowRunningData!, (draft) => {
  23. const currentIndex = draft.tracing!.findIndex(item => item.id === data.id)
  24. if (currentIndex > -1) {
  25. draft.tracing![currentIndex] = {
  26. ...draft.tracing![currentIndex],
  27. ...data,
  28. }
  29. }
  30. }))
  31. const newNodes = produce(nodes, (draft) => {
  32. const currentNode = draft.find(node => node.id === data.node_id)!
  33. currentNode.data._runningStatus = data.status
  34. })
  35. setNodes(newNodes)
  36. const newEdges = produce(edges, (draft) => {
  37. const incomeEdges = draft.filter((edge) => {
  38. return edge.target === data.node_id
  39. })
  40. incomeEdges.forEach((edge) => {
  41. edge.data = {
  42. ...edge.data,
  43. _targetRunningStatus: data.status,
  44. }
  45. })
  46. })
  47. setEdges(newEdges)
  48. }, [workflowStore, store])
  49. return {
  50. handleWorkflowNodeLoopFinished,
  51. }
  52. }