mirror of
				https://github.com/langgenius/dify.git
				synced 2025-10-31 02:42:59 +00:00 
			
		
		
		
	
		
			
	
	
		
			124 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			124 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|   | import { | ||
|  |   useCallback, | ||
|  |   useEffect, | ||
|  |   useState, | ||
|  | } from 'react' | ||
|  | import { | ||
|  |   useStore, | ||
|  |   useWorkflowStore, | ||
|  | } from '@/app/components/workflow/store' | ||
|  | import { useWorkflowTemplate } from './use-workflow-template' | ||
|  | import { useStore as useAppStore } from '@/app/components/app/store' | ||
|  | import { | ||
|  |   fetchNodesDefaultConfigs, | ||
|  |   fetchPublishedWorkflow, | ||
|  |   fetchWorkflowDraft, | ||
|  |   syncWorkflowDraft, | ||
|  | } from '@/service/workflow' | ||
|  | import type { FetchWorkflowDraftResponse } from '@/types/workflow' | ||
|  | import { useWorkflowConfig } from '@/service/use-workflow' | ||
|  | 
 | ||
|  | export const useWorkflowInit = () => { | ||
|  |   const workflowStore = useWorkflowStore() | ||
|  |   const { | ||
|  |     nodes: nodesTemplate, | ||
|  |     edges: edgesTemplate, | ||
|  |   } = useWorkflowTemplate() | ||
|  |   const appDetail = useAppStore(state => state.appDetail)! | ||
|  |   const setSyncWorkflowDraftHash = useStore(s => s.setSyncWorkflowDraftHash) | ||
|  |   const [data, setData] = useState<FetchWorkflowDraftResponse>() | ||
|  |   const [isLoading, setIsLoading] = useState(true) | ||
|  |   useEffect(() => { | ||
|  |     workflowStore.setState({ appId: appDetail.id }) | ||
|  |   }, [appDetail.id, workflowStore]) | ||
|  | 
 | ||
|  |   const handleUpdateWorkflowConfig = useCallback((config: Record<string, any>) => { | ||
|  |     const { setWorkflowConfig } = workflowStore.getState() | ||
|  | 
 | ||
|  |     setWorkflowConfig(config) | ||
|  |   }, [workflowStore]) | ||
|  |   useWorkflowConfig(appDetail.id, handleUpdateWorkflowConfig) | ||
|  | 
 | ||
|  |   const handleGetInitialWorkflowData = useCallback(async () => { | ||
|  |     try { | ||
|  |       const res = await fetchWorkflowDraft(`/apps/${appDetail.id}/workflows/draft`) | ||
|  |       setData(res) | ||
|  |       workflowStore.setState({ | ||
|  |         envSecrets: (res.environment_variables || []).filter(env => env.value_type === 'secret').reduce((acc, env) => { | ||
|  |           acc[env.id] = env.value | ||
|  |           return acc | ||
|  |         }, {} as Record<string, string>), | ||
|  |         environmentVariables: res.environment_variables?.map(env => env.value_type === 'secret' ? { ...env, value: '[__HIDDEN__]' } : env) || [], | ||
|  |         conversationVariables: res.conversation_variables || [], | ||
|  |       }) | ||
|  |       setSyncWorkflowDraftHash(res.hash) | ||
|  |       setIsLoading(false) | ||
|  |     } | ||
|  |     catch (error: any) { | ||
|  |       if (error && error.json && !error.bodyUsed && appDetail) { | ||
|  |         error.json().then((err: any) => { | ||
|  |           if (err.code === 'draft_workflow_not_exist') { | ||
|  |             workflowStore.setState({ notInitialWorkflow: true }) | ||
|  |             syncWorkflowDraft({ | ||
|  |               url: `/apps/${appDetail.id}/workflows/draft`, | ||
|  |               params: { | ||
|  |                 graph: { | ||
|  |                   nodes: nodesTemplate, | ||
|  |                   edges: edgesTemplate, | ||
|  |                 }, | ||
|  |                 features: { | ||
|  |                   retriever_resource: { enabled: true }, | ||
|  |                 }, | ||
|  |                 environment_variables: [], | ||
|  |                 conversation_variables: [], | ||
|  |               }, | ||
|  |             }).then((res) => { | ||
|  |               workflowStore.getState().setDraftUpdatedAt(res.updated_at) | ||
|  |               handleGetInitialWorkflowData() | ||
|  |             }) | ||
|  |           } | ||
|  |         }) | ||
|  |       } | ||
|  |     } | ||
|  |   }, [appDetail, nodesTemplate, edgesTemplate, workflowStore, setSyncWorkflowDraftHash]) | ||
|  | 
 | ||
|  |   useEffect(() => { | ||
|  |     handleGetInitialWorkflowData() | ||
|  |     // eslint-disable-next-line react-hooks/exhaustive-deps
 | ||
|  |   }, []) | ||
|  | 
 | ||
|  |   const handleFetchPreloadData = useCallback(async () => { | ||
|  |     try { | ||
|  |       const nodesDefaultConfigsData = await fetchNodesDefaultConfigs(`/apps/${appDetail?.id}/workflows/default-workflow-block-configs`) | ||
|  |       const publishedWorkflow = await fetchPublishedWorkflow(`/apps/${appDetail?.id}/workflows/publish`) | ||
|  |       workflowStore.setState({ | ||
|  |         nodesDefaultConfigs: nodesDefaultConfigsData.reduce((acc, block) => { | ||
|  |           if (!acc[block.type]) | ||
|  |             acc[block.type] = { ...block.config } | ||
|  |           return acc | ||
|  |         }, {} as Record<string, any>), | ||
|  |       }) | ||
|  |       workflowStore.getState().setPublishedAt(publishedWorkflow?.created_at) | ||
|  |     } | ||
|  |     catch (e) { | ||
|  |       console.error(e) | ||
|  |     } | ||
|  |   }, [workflowStore, appDetail]) | ||
|  | 
 | ||
|  |   useEffect(() => { | ||
|  |     handleFetchPreloadData() | ||
|  |   }, [handleFetchPreloadData]) | ||
|  | 
 | ||
|  |   useEffect(() => { | ||
|  |     if (data) { | ||
|  |       workflowStore.getState().setDraftUpdatedAt(data.updated_at) | ||
|  |       workflowStore.getState().setToolPublished(data.tool_published) | ||
|  |     } | ||
|  |   }, [data, workflowStore]) | ||
|  | 
 | ||
|  |   return { | ||
|  |     data, | ||
|  |     isLoading, | ||
|  |   } | ||
|  | } |