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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import { useContext } from 'react'
  2. import {
  3. noop,
  4. } from 'lodash-es'
  5. import {
  6. useStore as useZustandStore,
  7. } from 'zustand'
  8. import { createStore } from 'zustand/vanilla'
  9. import { HooksStoreContext } from './provider'
  10. import type {
  11. BlockEnum,
  12. NodeDefault,
  13. ToolWithProvider,
  14. } from '@/app/components/workflow/types'
  15. import type { IOtherOptions } from '@/service/base'
  16. import type { VarInInspect } from '@/types/workflow'
  17. import type {
  18. Node,
  19. ValueSelector,
  20. } from '@/app/components/workflow/types'
  21. import type { FlowType } from '@/types/common'
  22. import type { FileUpload } from '../../base/features/types'
  23. import type { SchemaTypeDefinition } from '@/service/use-common'
  24. export type AvailableNodesMetaData = {
  25. nodes: NodeDefault[]
  26. nodesMap?: Record<BlockEnum, NodeDefault<any>>
  27. }
  28. export type CommonHooksFnMap = {
  29. doSyncWorkflowDraft: (
  30. notRefreshWhenSyncError?: boolean,
  31. callback?: {
  32. onSuccess?: () => void
  33. onError?: () => void
  34. onSettled?: () => void
  35. }
  36. ) => Promise<void>
  37. syncWorkflowDraftWhenPageClose: () => void
  38. handleRefreshWorkflowDraft: () => void
  39. handleBackupDraft: () => void
  40. handleLoadBackupDraft: () => void
  41. handleRestoreFromPublishedWorkflow: (...args: any[]) => void
  42. handleRun: (params: any, callback?: IOtherOptions,) => void
  43. handleStopRun: (...args: any[]) => void
  44. handleStartWorkflowRun: () => void
  45. handleWorkflowStartRunInWorkflow: () => void
  46. handleWorkflowStartRunInChatflow: () => void
  47. availableNodesMetaData?: AvailableNodesMetaData
  48. getWorkflowRunAndTraceUrl: (runId?: string) => { runUrl: string; traceUrl: string }
  49. exportCheck?: () => Promise<void>
  50. handleExportDSL?: (include?: boolean, flowId?: string) => Promise<void>
  51. fetchInspectVars: (params: { passInVars?: boolean, vars?: VarInInspect[], passedInAllPluginInfoList?: Record<string, ToolWithProvider[]>, passedInSchemaTypeDefinitions?: SchemaTypeDefinition[] }) => Promise<void>
  52. hasNodeInspectVars: (nodeId: string) => boolean
  53. hasSetInspectVar: (nodeId: string, name: string, sysVars: VarInInspect[], conversationVars: VarInInspect[]) => boolean
  54. fetchInspectVarValue: (selector: ValueSelector, schemaTypeDefinitions: SchemaTypeDefinition[]) => Promise<void>
  55. editInspectVarValue: (nodeId: string, varId: string, value: any) => Promise<void>
  56. renameInspectVarName: (nodeId: string, oldName: string, newName: string) => Promise<void>
  57. appendNodeInspectVars: (nodeId: string, payload: VarInInspect[], allNodes: Node[]) => void
  58. deleteInspectVar: (nodeId: string, varId: string) => Promise<void>
  59. deleteNodeInspectorVars: (nodeId: string) => Promise<void>
  60. deleteAllInspectorVars: () => Promise<void>
  61. isInspectVarEdited: (nodeId: string, name: string) => boolean
  62. resetToLastRunVar: (nodeId: string, varId: string) => Promise<void>
  63. invalidateSysVarValues: () => void
  64. resetConversationVar: (varId: string) => Promise<void>
  65. invalidateConversationVarValues: () => void
  66. configsMap?: {
  67. flowId: string
  68. flowType: FlowType
  69. fileSettings: FileUpload
  70. }
  71. }
  72. export type Shape = {
  73. refreshAll: (props: Partial<CommonHooksFnMap>) => void
  74. } & CommonHooksFnMap
  75. export const createHooksStore = ({
  76. doSyncWorkflowDraft = async () => noop(),
  77. syncWorkflowDraftWhenPageClose = noop,
  78. handleRefreshWorkflowDraft = noop,
  79. handleBackupDraft = noop,
  80. handleLoadBackupDraft = noop,
  81. handleRestoreFromPublishedWorkflow = noop,
  82. handleRun = noop,
  83. handleStopRun = noop,
  84. handleStartWorkflowRun = noop,
  85. handleWorkflowStartRunInWorkflow = noop,
  86. handleWorkflowStartRunInChatflow = noop,
  87. availableNodesMetaData = {
  88. nodes: [],
  89. },
  90. getWorkflowRunAndTraceUrl = () => ({
  91. runUrl: '',
  92. traceUrl: '',
  93. }),
  94. exportCheck = async () => noop(),
  95. handleExportDSL = async () => noop(),
  96. fetchInspectVars = async () => noop(),
  97. hasNodeInspectVars = () => false,
  98. hasSetInspectVar = () => false,
  99. fetchInspectVarValue = async () => noop(),
  100. editInspectVarValue = async () => noop(),
  101. renameInspectVarName = async () => noop(),
  102. appendNodeInspectVars = () => noop(),
  103. deleteInspectVar = async () => noop(),
  104. deleteNodeInspectorVars = async () => noop(),
  105. deleteAllInspectorVars = async () => noop(),
  106. isInspectVarEdited = () => false,
  107. resetToLastRunVar = async () => noop(),
  108. invalidateSysVarValues = noop,
  109. resetConversationVar = async () => noop(),
  110. invalidateConversationVarValues = noop,
  111. }: Partial<Shape>) => {
  112. return createStore<Shape>(set => ({
  113. refreshAll: props => set(state => ({ ...state, ...props })),
  114. doSyncWorkflowDraft,
  115. syncWorkflowDraftWhenPageClose,
  116. handleRefreshWorkflowDraft,
  117. handleBackupDraft,
  118. handleLoadBackupDraft,
  119. handleRestoreFromPublishedWorkflow,
  120. handleRun,
  121. handleStopRun,
  122. handleStartWorkflowRun,
  123. handleWorkflowStartRunInWorkflow,
  124. handleWorkflowStartRunInChatflow,
  125. availableNodesMetaData,
  126. getWorkflowRunAndTraceUrl,
  127. exportCheck,
  128. handleExportDSL,
  129. fetchInspectVars,
  130. hasNodeInspectVars,
  131. hasSetInspectVar,
  132. fetchInspectVarValue,
  133. editInspectVarValue,
  134. renameInspectVarName,
  135. appendNodeInspectVars,
  136. deleteInspectVar,
  137. deleteNodeInspectorVars,
  138. deleteAllInspectorVars,
  139. isInspectVarEdited,
  140. resetToLastRunVar,
  141. invalidateSysVarValues,
  142. resetConversationVar,
  143. invalidateConversationVarValues,
  144. }))
  145. }
  146. export function useHooksStore<T>(selector: (state: Shape) => T): T {
  147. const store = useContext(HooksStoreContext)
  148. if (!store)
  149. throw new Error('Missing HooksStoreContext.Provider in the tree')
  150. return useZustandStore(store, selector)
  151. }
  152. export const useHooksStoreApi = () => {
  153. return useContext(HooksStoreContext)!
  154. }