| 
									
										
										
										
											2025-05-07 16:30:24 +08:00
										 |  |  | import { useCallback } from 'react' | 
					
						
							|  |  |  | import produce from 'immer' | 
					
						
							|  |  |  | import { useStoreApi } from 'reactflow' | 
					
						
							|  |  |  | import { | 
					
						
							|  |  |  |   useWorkflowStore, | 
					
						
							|  |  |  | } from '@/app/components/workflow/store' | 
					
						
							|  |  |  | import { | 
					
						
							|  |  |  |   useNodesReadOnly, | 
					
						
							|  |  |  | } from '@/app/components/workflow/hooks/use-workflow' | 
					
						
							| 
									
										
										
										
											2025-05-16 17:47:08 +08:00
										 |  |  | import { API_PREFIX } from '@/config' | 
					
						
							|  |  |  | import { syncWorkflowDraft } from '@/service/workflow' | 
					
						
							|  |  |  | import { usePipelineRefreshDraft } from '.' | 
					
						
							| 
									
										
										
										
											2025-05-07 16:30:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | export const useNodesSyncDraft = () => { | 
					
						
							|  |  |  |   const store = useStoreApi() | 
					
						
							|  |  |  |   const workflowStore = useWorkflowStore() | 
					
						
							|  |  |  |   const { getNodesReadOnly } = useNodesReadOnly() | 
					
						
							| 
									
										
										
										
											2025-05-16 17:47:08 +08:00
										 |  |  |   const { handleRefreshWorkflowDraft } = usePipelineRefreshDraft() | 
					
						
							| 
									
										
										
										
											2025-05-07 16:30:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   const getPostParams = useCallback(() => { | 
					
						
							|  |  |  |     const { | 
					
						
							|  |  |  |       getNodes, | 
					
						
							|  |  |  |       edges, | 
					
						
							|  |  |  |       transform, | 
					
						
							|  |  |  |     } = store.getState() | 
					
						
							|  |  |  |     const [x, y, zoom] = transform | 
					
						
							|  |  |  |     const { | 
					
						
							|  |  |  |       pipelineId, | 
					
						
							|  |  |  |       environmentVariables, | 
					
						
							|  |  |  |       syncWorkflowDraftHash, | 
					
						
							| 
									
										
										
										
											2025-05-13 16:33:38 +08:00
										 |  |  |       ragPipelineVariables, | 
					
						
							| 
									
										
										
										
											2025-05-07 16:30:24 +08:00
										 |  |  |     } = workflowStore.getState() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (pipelineId) { | 
					
						
							|  |  |  |       const nodes = getNodes() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const producedNodes = produce(nodes, (draft) => { | 
					
						
							|  |  |  |         draft.forEach((node) => { | 
					
						
							|  |  |  |           Object.keys(node.data).forEach((key) => { | 
					
						
							|  |  |  |             if (key.startsWith('_')) | 
					
						
							|  |  |  |               delete node.data[key] | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |       const producedEdges = produce(edges, (draft) => { | 
					
						
							|  |  |  |         draft.forEach((edge) => { | 
					
						
							|  |  |  |           Object.keys(edge.data).forEach((key) => { | 
					
						
							|  |  |  |             if (key.startsWith('_')) | 
					
						
							|  |  |  |               delete edge.data[key] | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |       return { | 
					
						
							| 
									
										
										
										
											2025-05-16 17:47:08 +08:00
										 |  |  |         url: `/rag/pipelines/${pipelineId}/workflows/draft`, | 
					
						
							| 
									
										
										
										
											2025-05-07 16:30:24 +08:00
										 |  |  |         params: { | 
					
						
							|  |  |  |           graph: { | 
					
						
							|  |  |  |             nodes: producedNodes, | 
					
						
							|  |  |  |             edges: producedEdges, | 
					
						
							|  |  |  |             viewport: { | 
					
						
							|  |  |  |               x, | 
					
						
							|  |  |  |               y, | 
					
						
							|  |  |  |               zoom, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           environment_variables: environmentVariables, | 
					
						
							| 
									
										
										
										
											2025-05-13 16:33:38 +08:00
										 |  |  |           rag_pipeline_variables: ragPipelineVariables, | 
					
						
							| 
									
										
										
										
											2025-05-07 16:30:24 +08:00
										 |  |  |           hash: syncWorkflowDraftHash, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }, [store, workflowStore]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const syncWorkflowDraftWhenPageClose = useCallback(() => { | 
					
						
							|  |  |  |     if (getNodesReadOnly()) | 
					
						
							|  |  |  |       return | 
					
						
							|  |  |  |     const postParams = getPostParams() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-16 17:47:08 +08:00
										 |  |  |     if (postParams) { | 
					
						
							|  |  |  |       navigator.sendBeacon( | 
					
						
							|  |  |  |         `${API_PREFIX}${postParams.url}?_token=${localStorage.getItem('console_token')}`, | 
					
						
							|  |  |  |         JSON.stringify(postParams.params), | 
					
						
							|  |  |  |       ) | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-05-07 16:30:24 +08:00
										 |  |  |   }, [getPostParams, getNodesReadOnly]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-16 17:47:08 +08:00
										 |  |  |   const doSyncWorkflowDraft = useCallback(async ( | 
					
						
							|  |  |  |     notRefreshWhenSyncError?: boolean, | 
					
						
							|  |  |  |     callback?: { | 
					
						
							|  |  |  |       onSuccess?: () => void | 
					
						
							|  |  |  |       onError?: () => void | 
					
						
							|  |  |  |       onSettled?: () => void | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   ) => { | 
					
						
							|  |  |  |     if (getNodesReadOnly()) | 
					
						
							|  |  |  |       return | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-19 14:23:40 +08:00
										 |  |  |     const postParams = getPostParams() | 
					
						
							| 
									
										
										
										
											2025-05-16 17:47:08 +08:00
										 |  |  |     if (postParams) { | 
					
						
							|  |  |  |       const { | 
					
						
							|  |  |  |         setSyncWorkflowDraftHash, | 
					
						
							|  |  |  |         setDraftUpdatedAt, | 
					
						
							|  |  |  |       } = workflowStore.getState() | 
					
						
							|  |  |  |       try { | 
					
						
							|  |  |  |         const res = await syncWorkflowDraft(postParams) | 
					
						
							|  |  |  |         setSyncWorkflowDraftHash(res.hash) | 
					
						
							|  |  |  |         setDraftUpdatedAt(res.updated_at) | 
					
						
							|  |  |  |         callback?.onSuccess && callback.onSuccess() | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       catch (error: any) { | 
					
						
							|  |  |  |         if (error && error.json && !error.bodyUsed) { | 
					
						
							|  |  |  |           error.json().then((err: any) => { | 
					
						
							|  |  |  |             if (err.code === 'draft_workflow_not_sync' && !notRefreshWhenSyncError) | 
					
						
							|  |  |  |               handleRefreshWorkflowDraft() | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         callback?.onError && callback.onError() | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       finally { | 
					
						
							|  |  |  |         callback?.onSettled && callback.onSettled() | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }, [getPostParams, getNodesReadOnly, workflowStore, handleRefreshWorkflowDraft]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-07 16:30:24 +08:00
										 |  |  |   return { | 
					
						
							|  |  |  |     doSyncWorkflowDraft, | 
					
						
							|  |  |  |     syncWorkflowDraftWhenPageClose, | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |