選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

store.ts 5.2KB

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