use-workflow-interactions.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. setIsSyncingWorkflowDraft,
  55. } = workflowStore.getState()
  56. setIsSyncingWorkflowDraft(true)
  57. fetchWorkflowDraft(`/apps/${appId}/workflows/draft`).then((response) => {
  58. handleUpdateWorkflowCanvas(response.graph as WorkflowDataUpdator)
  59. setSyncWorkflowDraftHash(response.hash)
  60. }).finally(() => setIsSyncingWorkflowDraft(false))
  61. }, [handleUpdateWorkflowCanvas, workflowStore])
  62. return {
  63. handleUpdateWorkflowCanvas,
  64. handleRefreshWorkflowDraft,
  65. }
  66. }