You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

use-nodes-sync-draft.ts 3.6KB

6 miesięcy temu
5 miesięcy temu
6 miesięcy temu
5 miesięcy temu
6 miesięcy temu
3 miesięcy temu
6 miesięcy temu
6 miesięcy temu
4 miesięcy temu
6 miesięcy temu
5 miesięcy temu
6 miesięcy temu
6 miesięcy temu
5 miesięcy temu
6 miesięcy temu
5 miesięcy temu
5 miesięcy temu
5 miesięcy temu
6 miesięcy temu
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import { useCallback } from 'react'
  2. import produce from 'immer'
  3. import { useStoreApi } from 'reactflow'
  4. import {
  5. useWorkflowStore,
  6. } from '@/app/components/workflow/store'
  7. import {
  8. useNodesReadOnly,
  9. } from '@/app/components/workflow/hooks/use-workflow'
  10. import { API_PREFIX } from '@/config'
  11. import { syncWorkflowDraft } from '@/service/workflow'
  12. import { usePipelineRefreshDraft } from '.'
  13. export const useNodesSyncDraft = () => {
  14. const store = useStoreApi()
  15. const workflowStore = useWorkflowStore()
  16. const { getNodesReadOnly } = useNodesReadOnly()
  17. const { handleRefreshWorkflowDraft } = usePipelineRefreshDraft()
  18. const getPostParams = useCallback(() => {
  19. const {
  20. getNodes,
  21. edges,
  22. transform,
  23. } = store.getState()
  24. const nodesOriginal = getNodes()
  25. const nodes = nodesOriginal.filter(node => !node.data._isTempNode)
  26. const [x, y, zoom] = transform
  27. const {
  28. pipelineId,
  29. environmentVariables,
  30. syncWorkflowDraftHash,
  31. ragPipelineVariables,
  32. } = workflowStore.getState()
  33. if (pipelineId && !!nodes.length) {
  34. const producedNodes = produce(nodes, (draft) => {
  35. draft.forEach((node) => {
  36. Object.keys(node.data).forEach((key) => {
  37. if (key.startsWith('_'))
  38. delete node.data[key]
  39. })
  40. })
  41. })
  42. const producedEdges = produce(edges, (draft) => {
  43. draft.forEach((edge) => {
  44. Object.keys(edge.data).forEach((key) => {
  45. if (key.startsWith('_'))
  46. delete edge.data[key]
  47. })
  48. })
  49. })
  50. return {
  51. url: `/rag/pipelines/${pipelineId}/workflows/draft`,
  52. params: {
  53. graph: {
  54. nodes: producedNodes,
  55. edges: producedEdges,
  56. viewport: {
  57. x,
  58. y,
  59. zoom,
  60. },
  61. },
  62. environment_variables: environmentVariables,
  63. rag_pipeline_variables: ragPipelineVariables,
  64. hash: syncWorkflowDraftHash,
  65. },
  66. }
  67. }
  68. }, [store, workflowStore])
  69. const syncWorkflowDraftWhenPageClose = useCallback(() => {
  70. if (getNodesReadOnly())
  71. return
  72. const postParams = getPostParams()
  73. if (postParams) {
  74. navigator.sendBeacon(
  75. `${API_PREFIX}${postParams.url}?_token=${localStorage.getItem('console_token')}`,
  76. JSON.stringify(postParams.params),
  77. )
  78. }
  79. }, [getPostParams, getNodesReadOnly])
  80. const doSyncWorkflowDraft = useCallback(async (
  81. notRefreshWhenSyncError?: boolean,
  82. callback?: {
  83. onSuccess?: () => void
  84. onError?: () => void
  85. onSettled?: () => void
  86. },
  87. ) => {
  88. if (getNodesReadOnly())
  89. return
  90. const postParams = getPostParams()
  91. if (postParams) {
  92. const {
  93. setSyncWorkflowDraftHash,
  94. setDraftUpdatedAt,
  95. } = workflowStore.getState()
  96. try {
  97. const res = await syncWorkflowDraft(postParams)
  98. setSyncWorkflowDraftHash(res.hash)
  99. setDraftUpdatedAt(res.updated_at)
  100. callback?.onSuccess && callback.onSuccess()
  101. }
  102. catch (error: any) {
  103. if (error && error.json && !error.bodyUsed) {
  104. error.json().then((err: any) => {
  105. if (err.code === 'draft_workflow_not_sync' && !notRefreshWhenSyncError)
  106. handleRefreshWorkflowDraft()
  107. })
  108. }
  109. callback?.onError && callback.onError()
  110. }
  111. finally {
  112. callback?.onSettled && callback.onSettled()
  113. }
  114. }
  115. }, [getPostParams, getNodesReadOnly, workflowStore, handleRefreshWorkflowDraft])
  116. return {
  117. doSyncWorkflowDraft,
  118. syncWorkflowDraftWhenPageClose,
  119. }
  120. }