Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

use-inspect-vars-crud-common.ts 8.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. import { fetchNodeInspectVars } from '@/service/workflow'
  2. import { useWorkflowStore } from '@/app/components/workflow/store'
  3. import type { ValueSelector } from '@/app/components/workflow/types'
  4. import type { VarInInspect } from '@/types/workflow'
  5. import { VarInInspectType } from '@/types/workflow'
  6. import {
  7. useDeleteAllInspectorVars,
  8. useDeleteInspectVar,
  9. useDeleteNodeInspectorVars,
  10. useEditInspectorVar,
  11. useInvalidateConversationVarValues,
  12. useInvalidateSysVarValues,
  13. useResetConversationVar,
  14. useResetToLastRunValue,
  15. } from '@/service/use-workflow'
  16. import { useCallback } from 'react'
  17. import { isConversationVar, isENV, isSystemVar } from '@/app/components/workflow/nodes/_base/components/variable/utils'
  18. import produce from 'immer'
  19. import type { Node } from '@/app/components/workflow/types'
  20. import { useNodesInteractionsWithoutSync } from '@/app/components/workflow/hooks/use-nodes-interactions-without-sync'
  21. import { useEdgesInteractionsWithoutSync } from '@/app/components/workflow/hooks/use-edges-interactions-without-sync'
  22. type Params = {
  23. flowId: string
  24. conversationVarsUrl: string
  25. systemVarsUrl: string
  26. }
  27. export const useInspectVarsCrudCommon = ({
  28. flowId,
  29. conversationVarsUrl,
  30. systemVarsUrl,
  31. }: Params) => {
  32. const workflowStore = useWorkflowStore()
  33. const invalidateConversationVarValues = useInvalidateConversationVarValues(conversationVarsUrl!)
  34. const { mutateAsync: doResetConversationVar } = useResetConversationVar(flowId)
  35. const { mutateAsync: doResetToLastRunValue } = useResetToLastRunValue(flowId)
  36. const invalidateSysVarValues = useInvalidateSysVarValues(systemVarsUrl!)
  37. const { mutateAsync: doDeleteAllInspectorVars } = useDeleteAllInspectorVars(flowId)
  38. const { mutate: doDeleteNodeInspectorVars } = useDeleteNodeInspectorVars(flowId)
  39. const { mutate: doDeleteInspectVar } = useDeleteInspectVar(flowId)
  40. const { mutateAsync: doEditInspectorVar } = useEditInspectorVar(flowId)
  41. const { handleCancelNodeSuccessStatus } = useNodesInteractionsWithoutSync()
  42. const { handleEdgeCancelRunningStatus } = useEdgesInteractionsWithoutSync()
  43. const getNodeInspectVars = useCallback((nodeId: string) => {
  44. const { nodesWithInspectVars } = workflowStore.getState()
  45. const node = nodesWithInspectVars.find(node => node.nodeId === nodeId)
  46. return node
  47. }, [workflowStore])
  48. const getVarId = useCallback((nodeId: string, varName: string) => {
  49. const node = getNodeInspectVars(nodeId)
  50. if (!node)
  51. return undefined
  52. const varId = node.vars.find((varItem) => {
  53. return varItem.selector[1] === varName
  54. })?.id
  55. return varId
  56. }, [getNodeInspectVars])
  57. const getInspectVar = useCallback((nodeId: string, name: string): VarInInspect | undefined => {
  58. const node = getNodeInspectVars(nodeId)
  59. if (!node)
  60. return undefined
  61. const variable = node.vars.find((varItem) => {
  62. return varItem.name === name
  63. })
  64. return variable
  65. }, [getNodeInspectVars])
  66. const hasSetInspectVar = useCallback((nodeId: string, name: string, sysVars: VarInInspect[], conversationVars: VarInInspect[]) => {
  67. const isEnv = isENV([nodeId])
  68. if (isEnv) // always have value
  69. return true
  70. const isSys = isSystemVar([nodeId])
  71. if (isSys)
  72. return sysVars.some(varItem => varItem.selector?.[1]?.replace('sys.', '') === name)
  73. const isChatVar = isConversationVar([nodeId])
  74. if (isChatVar)
  75. return conversationVars.some(varItem => varItem.selector?.[1] === name)
  76. return getInspectVar(nodeId, name) !== undefined
  77. }, [getInspectVar])
  78. const hasNodeInspectVars = useCallback((nodeId: string) => {
  79. return !!getNodeInspectVars(nodeId)
  80. }, [getNodeInspectVars])
  81. const fetchInspectVarValue = useCallback(async (selector: ValueSelector) => {
  82. const {
  83. appId,
  84. setNodeInspectVars,
  85. } = workflowStore.getState()
  86. const nodeId = selector[0]
  87. const isSystemVar = nodeId === 'sys'
  88. const isConversationVar = nodeId === 'conversation'
  89. if (isSystemVar) {
  90. invalidateSysVarValues()
  91. return
  92. }
  93. if (isConversationVar) {
  94. invalidateConversationVarValues()
  95. return
  96. }
  97. const vars = await fetchNodeInspectVars(appId, nodeId)
  98. setNodeInspectVars(nodeId, vars)
  99. }, [workflowStore, invalidateSysVarValues, invalidateConversationVarValues])
  100. // after last run would call this
  101. const appendNodeInspectVars = useCallback((nodeId: string, payload: VarInInspect[], allNodes: Node[]) => {
  102. const {
  103. nodesWithInspectVars,
  104. setNodesWithInspectVars,
  105. } = workflowStore.getState()
  106. const nodes = produce(nodesWithInspectVars, (draft) => {
  107. const nodeInfo = allNodes.find(node => node.id === nodeId)
  108. if (nodeInfo) {
  109. const index = draft.findIndex(node => node.nodeId === nodeId)
  110. if (index === -1) {
  111. draft.unshift({
  112. nodeId,
  113. nodeType: nodeInfo.data.type,
  114. title: nodeInfo.data.title,
  115. vars: payload,
  116. nodePayload: nodeInfo.data,
  117. })
  118. }
  119. else {
  120. draft[index].vars = payload
  121. // put the node to the topAdd commentMore actions
  122. draft.unshift(draft.splice(index, 1)[0])
  123. }
  124. }
  125. })
  126. setNodesWithInspectVars(nodes)
  127. handleCancelNodeSuccessStatus(nodeId)
  128. }, [workflowStore, handleCancelNodeSuccessStatus])
  129. const hasNodeInspectVar = useCallback((nodeId: string, varId: string) => {
  130. const { nodesWithInspectVars } = workflowStore.getState()
  131. const targetNode = nodesWithInspectVars.find(item => item.nodeId === nodeId)
  132. if(!targetNode || !targetNode.vars)
  133. return false
  134. return targetNode.vars.some(item => item.id === varId)
  135. }, [workflowStore])
  136. const deleteInspectVar = useCallback(async (nodeId: string, varId: string) => {
  137. const { deleteInspectVar } = workflowStore.getState()
  138. if(hasNodeInspectVar(nodeId, varId)) {
  139. await doDeleteInspectVar(varId)
  140. deleteInspectVar(nodeId, varId)
  141. }
  142. }, [doDeleteInspectVar, workflowStore, hasNodeInspectVar])
  143. const resetConversationVar = useCallback(async (varId: string) => {
  144. await doResetConversationVar(varId)
  145. invalidateConversationVarValues()
  146. }, [doResetConversationVar, invalidateConversationVarValues])
  147. const deleteNodeInspectorVars = useCallback(async (nodeId: string) => {
  148. const { deleteNodeInspectVars } = workflowStore.getState()
  149. if (hasNodeInspectVars(nodeId)) {
  150. await doDeleteNodeInspectorVars(nodeId)
  151. deleteNodeInspectVars(nodeId)
  152. }
  153. }, [doDeleteNodeInspectorVars, workflowStore, hasNodeInspectVars])
  154. const deleteAllInspectorVars = useCallback(async () => {
  155. const { deleteAllInspectVars } = workflowStore.getState()
  156. await doDeleteAllInspectorVars()
  157. await invalidateConversationVarValues()
  158. await invalidateSysVarValues()
  159. deleteAllInspectVars()
  160. handleEdgeCancelRunningStatus()
  161. }, [doDeleteAllInspectorVars, invalidateConversationVarValues, invalidateSysVarValues, workflowStore, handleEdgeCancelRunningStatus])
  162. const editInspectVarValue = useCallback(async (nodeId: string, varId: string, value: any) => {
  163. const { setInspectVarValue } = workflowStore.getState()
  164. await doEditInspectorVar({
  165. varId,
  166. value,
  167. })
  168. setInspectVarValue(nodeId, varId, value)
  169. if (nodeId === VarInInspectType.conversation)
  170. invalidateConversationVarValues()
  171. if (nodeId === VarInInspectType.system)
  172. invalidateSysVarValues()
  173. }, [doEditInspectorVar, invalidateConversationVarValues, invalidateSysVarValues, workflowStore])
  174. const renameInspectVarName = useCallback(async (nodeId: string, oldName: string, newName: string) => {
  175. const { renameInspectVarName } = workflowStore.getState()
  176. const varId = getVarId(nodeId, oldName)
  177. if (!varId)
  178. return
  179. const newSelector = [nodeId, newName]
  180. await doEditInspectorVar({
  181. varId,
  182. name: newName,
  183. })
  184. renameInspectVarName(nodeId, varId, newSelector)
  185. }, [doEditInspectorVar, getVarId, workflowStore])
  186. const isInspectVarEdited = useCallback((nodeId: string, name: string) => {
  187. const inspectVar = getInspectVar(nodeId, name)
  188. if (!inspectVar)
  189. return false
  190. return inspectVar.edited
  191. }, [getInspectVar])
  192. const resetToLastRunVar = useCallback(async (nodeId: string, varId: string) => {
  193. const { resetToLastRunVar } = workflowStore.getState()
  194. const isSysVar = nodeId === 'sys'
  195. const data = await doResetToLastRunValue(varId)
  196. if(isSysVar)
  197. invalidateSysVarValues()
  198. else
  199. resetToLastRunVar(nodeId, varId, data.value)
  200. }, [doResetToLastRunValue, invalidateSysVarValues, workflowStore])
  201. return {
  202. hasNodeInspectVars,
  203. hasSetInspectVar,
  204. fetchInspectVarValue,
  205. editInspectVarValue,
  206. renameInspectVarName,
  207. appendNodeInspectVars,
  208. deleteInspectVar,
  209. deleteNodeInspectorVars,
  210. deleteAllInspectorVars,
  211. isInspectVarEdited,
  212. resetToLastRunVar,
  213. invalidateSysVarValues,
  214. resetConversationVar,
  215. invalidateConversationVarValues,
  216. }
  217. }