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-workflow-init.ts 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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. // eslint-disable-next-line react-hooks/exhaustive-deps
  83. }, [])
  84. const handleFetchPreloadData = useCallback(async () => {
  85. try {
  86. const nodesDefaultConfigsData = await fetchNodesDefaultConfigs(`/apps/${appDetail?.id}/workflows/default-workflow-block-configs`)
  87. const publishedWorkflow = await fetchPublishedWorkflow(`/apps/${appDetail?.id}/workflows/publish`)
  88. workflowStore.setState({
  89. nodesDefaultConfigs: nodesDefaultConfigsData.reduce((acc, block) => {
  90. if (!acc[block.type])
  91. acc[block.type] = { ...block.config }
  92. return acc
  93. }, {} as Record<string, any>),
  94. })
  95. workflowStore.getState().setPublishedAt(publishedWorkflow?.created_at)
  96. }
  97. catch (e) {
  98. console.error(e)
  99. }
  100. }, [workflowStore, appDetail])
  101. useEffect(() => {
  102. handleFetchPreloadData()
  103. }, [handleFetchPreloadData])
  104. useEffect(() => {
  105. if (data) {
  106. workflowStore.getState().setDraftUpdatedAt(data.updated_at)
  107. workflowStore.getState().setToolPublished(data.tool_published)
  108. }
  109. }, [data, workflowStore])
  110. return {
  111. data,
  112. isLoading,
  113. }
  114. }