| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- 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,
- }
- }
|