use-workflow-interactions.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import {
  2. useCallback,
  3. useState,
  4. } from 'react'
  5. import { useTranslation } from 'react-i18next'
  6. import { useReactFlow } from 'reactflow'
  7. import { useWorkflowStore } from '../store'
  8. import { WORKFLOW_DATA_UPDATE } from '../constants'
  9. import type { WorkflowDataUpdator } from '../types'
  10. import {
  11. initialEdges,
  12. initialNodes,
  13. } from '../utils'
  14. import { useEdgesInteractions } from './use-edges-interactions'
  15. import { useNodesInteractions } from './use-nodes-interactions'
  16. import { useNodesSyncDraft } from './use-nodes-sync-draft'
  17. import { useEventEmitterContextContext } from '@/context/event-emitter'
  18. import { fetchWorkflowDraft } from '@/service/workflow'
  19. import { exportAppConfig } from '@/service/apps'
  20. import { useToastContext } from '@/app/components/base/toast'
  21. import { useStore as useAppStore } from '@/app/components/app/store'
  22. export const useWorkflowInteractions = () => {
  23. const workflowStore = useWorkflowStore()
  24. const { handleNodeCancelRunningStatus } = useNodesInteractions()
  25. const { handleEdgeCancelRunningStatus } = useEdgesInteractions()
  26. const handleCancelDebugAndPreviewPanel = useCallback(() => {
  27. workflowStore.setState({
  28. showDebugAndPreviewPanel: false,
  29. workflowRunningData: undefined,
  30. })
  31. handleNodeCancelRunningStatus()
  32. handleEdgeCancelRunningStatus()
  33. }, [workflowStore, handleNodeCancelRunningStatus, handleEdgeCancelRunningStatus])
  34. return {
  35. handleCancelDebugAndPreviewPanel,
  36. }
  37. }
  38. export const useWorkflowUpdate = () => {
  39. const reactflow = useReactFlow()
  40. const workflowStore = useWorkflowStore()
  41. const { eventEmitter } = useEventEmitterContextContext()
  42. const handleUpdateWorkflowCanvas = useCallback((payload: WorkflowDataUpdator) => {
  43. const {
  44. nodes,
  45. edges,
  46. viewport,
  47. } = payload
  48. const { setViewport } = reactflow
  49. eventEmitter?.emit({
  50. type: WORKFLOW_DATA_UPDATE,
  51. payload: {
  52. nodes: initialNodes(nodes, edges),
  53. edges: initialEdges(edges, nodes),
  54. },
  55. } as any)
  56. setViewport(viewport)
  57. }, [eventEmitter, reactflow])
  58. const handleRefreshWorkflowDraft = useCallback(() => {
  59. const {
  60. appId,
  61. setSyncWorkflowDraftHash,
  62. setIsSyncingWorkflowDraft,
  63. } = workflowStore.getState()
  64. setIsSyncingWorkflowDraft(true)
  65. fetchWorkflowDraft(`/apps/${appId}/workflows/draft`).then((response) => {
  66. handleUpdateWorkflowCanvas(response.graph as WorkflowDataUpdator)
  67. setSyncWorkflowDraftHash(response.hash)
  68. }).finally(() => setIsSyncingWorkflowDraft(false))
  69. }, [handleUpdateWorkflowCanvas, workflowStore])
  70. return {
  71. handleUpdateWorkflowCanvas,
  72. handleRefreshWorkflowDraft,
  73. }
  74. }
  75. export const useDSL = () => {
  76. const { t } = useTranslation()
  77. const { notify } = useToastContext()
  78. const [exporting, setExporting] = useState(false)
  79. const { doSyncWorkflowDraft } = useNodesSyncDraft()
  80. const appDetail = useAppStore(s => s.appDetail)
  81. const handleExportDSL = useCallback(async () => {
  82. if (!appDetail)
  83. return
  84. if (exporting)
  85. return
  86. try {
  87. setExporting(true)
  88. await doSyncWorkflowDraft()
  89. const { data } = await exportAppConfig(appDetail.id)
  90. const a = document.createElement('a')
  91. const file = new Blob([data], { type: 'application/yaml' })
  92. a.href = URL.createObjectURL(file)
  93. a.download = `${appDetail.name}.yml`
  94. a.click()
  95. }
  96. catch (e) {
  97. notify({ type: 'error', message: t('app.exportFailed') })
  98. }
  99. finally {
  100. setExporting(false)
  101. }
  102. }, [appDetail, notify, t, doSyncWorkflowDraft, exporting])
  103. return {
  104. handleExportDSL,
  105. }
  106. }