use-workflow-interactions.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { useCallback } from 'react'
  2. import { useReactFlow } from 'reactflow'
  3. import { useWorkflowStore } from '../store'
  4. import { WORKFLOW_DATA_UPDATE } from '../constants'
  5. import type { WorkflowDataUpdator } from '../types'
  6. import {
  7. initialEdges,
  8. initialNodes,
  9. } from '../utils'
  10. import { useEdgesInteractions } from './use-edges-interactions'
  11. import { useNodesInteractions } from './use-nodes-interactions'
  12. import { useEventEmitterContextContext } from '@/context/event-emitter'
  13. import { fetchWorkflowDraft } from '@/service/workflow'
  14. export const useWorkflowInteractions = () => {
  15. const workflowStore = useWorkflowStore()
  16. const { handleNodeCancelRunningStatus } = useNodesInteractions()
  17. const { handleEdgeCancelRunningStatus } = useEdgesInteractions()
  18. const handleCancelDebugAndPreviewPanel = useCallback(() => {
  19. workflowStore.setState({
  20. showDebugAndPreviewPanel: false,
  21. workflowRunningData: undefined,
  22. })
  23. handleNodeCancelRunningStatus()
  24. handleEdgeCancelRunningStatus()
  25. }, [workflowStore, handleNodeCancelRunningStatus, handleEdgeCancelRunningStatus])
  26. return {
  27. handleCancelDebugAndPreviewPanel,
  28. }
  29. }
  30. export const useWorkflowUpdate = () => {
  31. const reactflow = useReactFlow()
  32. const workflowStore = useWorkflowStore()
  33. const { eventEmitter } = useEventEmitterContextContext()
  34. const handleUpdateWorkflowCanvas = useCallback((payload: WorkflowDataUpdator) => {
  35. const {
  36. nodes,
  37. edges,
  38. viewport,
  39. } = payload
  40. const { setViewport } = reactflow
  41. eventEmitter?.emit({
  42. type: WORKFLOW_DATA_UPDATE,
  43. payload: {
  44. nodes: initialNodes(nodes, edges),
  45. edges: initialEdges(edges, nodes),
  46. },
  47. } as any)
  48. setViewport(viewport)
  49. }, [eventEmitter, reactflow])
  50. const handleRefreshWorkflowDraft = useCallback(() => {
  51. const {
  52. appId,
  53. setSyncWorkflowDraftHash,
  54. } = workflowStore.getState()
  55. fetchWorkflowDraft(`/apps/${appId}/workflows/draft`).then((response) => {
  56. handleUpdateWorkflowCanvas(response.graph as WorkflowDataUpdator)
  57. setSyncWorkflowDraftHash(response.hash)
  58. })
  59. }, [handleUpdateWorkflowCanvas, workflowStore])
  60. return {
  61. handleUpdateWorkflowCanvas,
  62. handleRefreshWorkflowDraft,
  63. }
  64. }