您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

use-workflow-init.ts 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import {
  2. useCallback,
  3. useEffect,
  4. useState,
  5. } from 'react'
  6. import {
  7. useStore,
  8. useWorkflowStore,
  9. } from '@/app/components/workflow/store'
  10. import { useWorkflowTemplate } from './use-workflow-template'
  11. import { useStore as useAppStore } from '@/app/components/app/store'
  12. import {
  13. fetchNodesDefaultConfigs,
  14. fetchPublishedWorkflow,
  15. fetchWorkflowDraft,
  16. syncWorkflowDraft,
  17. } from '@/service/workflow'
  18. import type { FetchWorkflowDraftResponse } from '@/types/workflow'
  19. import { useWorkflowConfig } from '@/service/use-workflow'
  20. export const useWorkflowInit = () => {
  21. const workflowStore = useWorkflowStore()
  22. const {
  23. nodes: nodesTemplate,
  24. edges: edgesTemplate,
  25. } = useWorkflowTemplate()
  26. const appDetail = useAppStore(state => state.appDetail)!
  27. const setSyncWorkflowDraftHash = useStore(s => s.setSyncWorkflowDraftHash)
  28. const [data, setData] = useState<FetchWorkflowDraftResponse>()
  29. const [isLoading, setIsLoading] = useState(true)
  30. useEffect(() => {
  31. workflowStore.setState({ appId: appDetail.id })
  32. }, [appDetail.id, workflowStore])
  33. const handleUpdateWorkflowConfig = useCallback((config: Record<string, any>) => {
  34. const { setWorkflowConfig } = workflowStore.getState()
  35. setWorkflowConfig(config)
  36. }, [workflowStore])
  37. useWorkflowConfig(appDetail.id, handleUpdateWorkflowConfig)
  38. const handleGetInitialWorkflowData = useCallback(async () => {
  39. try {
  40. const res = await fetchWorkflowDraft(`/apps/${appDetail.id}/workflows/draft`)
  41. setData(res)
  42. workflowStore.setState({
  43. envSecrets: (res.environment_variables || []).filter(env => env.value_type === 'secret').reduce((acc, env) => {
  44. acc[env.id] = env.value
  45. return acc
  46. }, {} as Record<string, string>),
  47. environmentVariables: res.environment_variables?.map(env => env.value_type === 'secret' ? { ...env, value: '[__HIDDEN__]' } : env) || [],
  48. conversationVariables: res.conversation_variables || [],
  49. })
  50. setSyncWorkflowDraftHash(res.hash)
  51. setIsLoading(false)
  52. }
  53. catch (error: any) {
  54. if (error && error.json && !error.bodyUsed && appDetail) {
  55. error.json().then((err: any) => {
  56. if (err.code === 'draft_workflow_not_exist') {
  57. workflowStore.setState({ notInitialWorkflow: true })
  58. syncWorkflowDraft({
  59. url: `/apps/${appDetail.id}/workflows/draft`,
  60. params: {
  61. graph: {
  62. nodes: nodesTemplate,
  63. edges: edgesTemplate,
  64. },
  65. features: {
  66. retriever_resource: { enabled: true },
  67. },
  68. environment_variables: [],
  69. conversation_variables: [],
  70. },
  71. }).then((res) => {
  72. workflowStore.getState().setDraftUpdatedAt(res.updated_at)
  73. handleGetInitialWorkflowData()
  74. })
  75. }
  76. })
  77. }
  78. }
  79. }, [appDetail, nodesTemplate, edgesTemplate, workflowStore, setSyncWorkflowDraftHash])
  80. useEffect(() => {
  81. handleGetInitialWorkflowData()
  82. }, [])
  83. const handleFetchPreloadData = useCallback(async () => {
  84. try {
  85. const nodesDefaultConfigsData = await fetchNodesDefaultConfigs(`/apps/${appDetail?.id}/workflows/default-workflow-block-configs`)
  86. const publishedWorkflow = await fetchPublishedWorkflow(`/apps/${appDetail?.id}/workflows/publish`)
  87. workflowStore.setState({
  88. nodesDefaultConfigs: nodesDefaultConfigsData.reduce((acc, block) => {
  89. if (!acc[block.type])
  90. acc[block.type] = { ...block.config }
  91. return acc
  92. }, {} as Record<string, any>),
  93. })
  94. workflowStore.getState().setPublishedAt(publishedWorkflow?.created_at)
  95. }
  96. catch (e) {
  97. console.error(e)
  98. }
  99. }, [workflowStore, appDetail])
  100. useEffect(() => {
  101. handleFetchPreloadData()
  102. }, [handleFetchPreloadData])
  103. useEffect(() => {
  104. if (data) {
  105. workflowStore.getState().setDraftUpdatedAt(data.updated_at)
  106. workflowStore.getState().setToolPublished(data.tool_published)
  107. }
  108. }, [data, workflowStore])
  109. return {
  110. data,
  111. isLoading,
  112. }
  113. }