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

use-config.ts 8.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. import {
  2. useCallback,
  3. useRef,
  4. } from 'react'
  5. import produce from 'immer'
  6. import { v4 as uuid4 } from 'uuid'
  7. import {
  8. useIsChatMode,
  9. useNodesReadOnly,
  10. useWorkflow,
  11. } from '../../hooks'
  12. import { ValueType, VarType } from '../../types'
  13. import type { ErrorHandleMode, Var } from '../../types'
  14. import useNodeCrud from '../_base/hooks/use-node-crud'
  15. import { toNodeOutputVars } from '../_base/components/variable/utils'
  16. import { getOperators } from './utils'
  17. import { LogicalOperator } from './types'
  18. import type { HandleAddCondition, HandleAddSubVariableCondition, HandleRemoveCondition, HandleToggleConditionLogicalOperator, HandleToggleSubVariableConditionLogicalOperator, HandleUpdateCondition, HandleUpdateSubVariableCondition, LoopNodeType } from './types'
  19. import useIsVarFileAttribute from './use-is-var-file-attribute'
  20. import { useStore } from '@/app/components/workflow/store'
  21. const useConfig = (id: string, payload: LoopNodeType) => {
  22. const { nodesReadOnly: readOnly } = useNodesReadOnly()
  23. const isChatMode = useIsChatMode()
  24. const conversationVariables = useStore(s => s.conversationVariables)
  25. const { inputs, setInputs } = useNodeCrud<LoopNodeType>(id, payload)
  26. const inputsRef = useRef(inputs)
  27. const handleInputsChange = useCallback((newInputs: LoopNodeType) => {
  28. inputsRef.current = newInputs
  29. setInputs(newInputs)
  30. }, [setInputs])
  31. const filterInputVar = useCallback((varPayload: Var) => {
  32. return [VarType.array, VarType.arrayString, VarType.arrayNumber, VarType.arrayObject, VarType.arrayFile].includes(varPayload.type)
  33. }, [])
  34. // output
  35. const { getLoopNodeChildren } = useWorkflow()
  36. const loopChildrenNodes = [{ id, data: payload } as any, ...getLoopNodeChildren(id)]
  37. const childrenNodeVars = toNodeOutputVars(loopChildrenNodes, isChatMode, undefined, [], conversationVariables)
  38. const {
  39. getIsVarFileAttribute,
  40. } = useIsVarFileAttribute({
  41. nodeId: id,
  42. })
  43. const changeErrorResponseMode = useCallback((item: { value: unknown }) => {
  44. const newInputs = produce(inputs, (draft) => {
  45. draft.error_handle_mode = item.value as ErrorHandleMode
  46. })
  47. setInputs(newInputs)
  48. }, [inputs, setInputs])
  49. const handleAddCondition = useCallback<HandleAddCondition>((valueSelector, varItem) => {
  50. const newInputs = produce(inputs, (draft) => {
  51. if (!draft.break_conditions)
  52. draft.break_conditions = []
  53. draft.break_conditions?.push({
  54. id: uuid4(),
  55. varType: varItem.type,
  56. variable_selector: valueSelector,
  57. comparison_operator: getOperators(varItem.type, getIsVarFileAttribute(valueSelector) ? { key: valueSelector.slice(-1)[0] } : undefined)[0],
  58. value: '',
  59. })
  60. })
  61. setInputs(newInputs)
  62. }, [getIsVarFileAttribute, inputs, setInputs])
  63. const handleRemoveCondition = useCallback<HandleRemoveCondition>((conditionId) => {
  64. const newInputs = produce(inputs, (draft) => {
  65. draft.break_conditions = draft.break_conditions?.filter(item => item.id !== conditionId)
  66. })
  67. setInputs(newInputs)
  68. }, [inputs, setInputs])
  69. const handleUpdateCondition = useCallback<HandleUpdateCondition>((conditionId, newCondition) => {
  70. const newInputs = produce(inputs, (draft) => {
  71. const targetCondition = draft.break_conditions?.find(item => item.id === conditionId)
  72. if (targetCondition)
  73. Object.assign(targetCondition, newCondition)
  74. })
  75. setInputs(newInputs)
  76. }, [inputs, setInputs])
  77. const handleToggleConditionLogicalOperator = useCallback<HandleToggleConditionLogicalOperator>(() => {
  78. const newInputs = produce(inputs, (draft) => {
  79. draft.logical_operator = draft.logical_operator === LogicalOperator.and ? LogicalOperator.or : LogicalOperator.and
  80. })
  81. setInputs(newInputs)
  82. }, [inputs, setInputs])
  83. const handleAddSubVariableCondition = useCallback<HandleAddSubVariableCondition>((conditionId: string, key?: string) => {
  84. const newInputs = produce(inputs, (draft) => {
  85. const condition = draft.break_conditions?.find(item => item.id === conditionId)
  86. if (!condition)
  87. return
  88. if (!condition?.sub_variable_condition) {
  89. condition.sub_variable_condition = {
  90. logical_operator: LogicalOperator.and,
  91. conditions: [],
  92. }
  93. }
  94. const subVarCondition = condition.sub_variable_condition
  95. if (subVarCondition) {
  96. if (!subVarCondition.conditions)
  97. subVarCondition.conditions = []
  98. const svcComparisonOperators = getOperators(VarType.string, { key: key || '' })
  99. subVarCondition.conditions.push({
  100. id: uuid4(),
  101. key: key || '',
  102. varType: VarType.string,
  103. comparison_operator: (svcComparisonOperators && svcComparisonOperators.length) ? svcComparisonOperators[0] : undefined,
  104. value: '',
  105. })
  106. }
  107. })
  108. setInputs(newInputs)
  109. }, [inputs, setInputs])
  110. const handleRemoveSubVariableCondition = useCallback((conditionId: string, subConditionId: string) => {
  111. const newInputs = produce(inputs, (draft) => {
  112. const condition = draft.break_conditions?.find(item => item.id === conditionId)
  113. if (!condition)
  114. return
  115. if (!condition?.sub_variable_condition)
  116. return
  117. const subVarCondition = condition.sub_variable_condition
  118. if (subVarCondition)
  119. subVarCondition.conditions = subVarCondition.conditions.filter(item => item.id !== subConditionId)
  120. })
  121. setInputs(newInputs)
  122. }, [inputs, setInputs])
  123. const handleUpdateSubVariableCondition = useCallback<HandleUpdateSubVariableCondition>((conditionId, subConditionId, newSubCondition) => {
  124. const newInputs = produce(inputs, (draft) => {
  125. const targetCondition = draft.break_conditions?.find(item => item.id === conditionId)
  126. if (targetCondition && targetCondition.sub_variable_condition) {
  127. const targetSubCondition = targetCondition.sub_variable_condition.conditions.find(item => item.id === subConditionId)
  128. if (targetSubCondition)
  129. Object.assign(targetSubCondition, newSubCondition)
  130. }
  131. })
  132. setInputs(newInputs)
  133. }, [inputs, setInputs])
  134. const handleToggleSubVariableConditionLogicalOperator = useCallback<HandleToggleSubVariableConditionLogicalOperator>((conditionId) => {
  135. const newInputs = produce(inputs, (draft) => {
  136. const targetCondition = draft.break_conditions?.find(item => item.id === conditionId)
  137. if (targetCondition && targetCondition.sub_variable_condition)
  138. targetCondition.sub_variable_condition.logical_operator = targetCondition.sub_variable_condition.logical_operator === LogicalOperator.and ? LogicalOperator.or : LogicalOperator.and
  139. })
  140. setInputs(newInputs)
  141. }, [inputs, setInputs])
  142. const handleUpdateLoopCount = useCallback((value: number) => {
  143. const newInputs = produce(inputs, (draft) => {
  144. draft.loop_count = value
  145. })
  146. setInputs(newInputs)
  147. }, [inputs, setInputs])
  148. const handleAddLoopVariable = useCallback(() => {
  149. const newInputs = produce(inputsRef.current, (draft) => {
  150. if (!draft.loop_variables)
  151. draft.loop_variables = []
  152. draft.loop_variables.push({
  153. id: uuid4(),
  154. label: '',
  155. var_type: VarType.string,
  156. value_type: ValueType.constant,
  157. value: '',
  158. })
  159. })
  160. handleInputsChange(newInputs)
  161. }, [handleInputsChange])
  162. const handleRemoveLoopVariable = useCallback((id: string) => {
  163. const newInputs = produce(inputsRef.current, (draft) => {
  164. draft.loop_variables = draft.loop_variables?.filter(item => item.id !== id)
  165. })
  166. handleInputsChange(newInputs)
  167. }, [handleInputsChange])
  168. const handleUpdateLoopVariable = useCallback((id: string, updateData: any) => {
  169. const loopVariables = inputsRef.current.loop_variables || []
  170. const index = loopVariables.findIndex(item => item.id === id)
  171. const newInputs = produce(inputsRef.current, (draft) => {
  172. if (index > -1) {
  173. draft.loop_variables![index] = {
  174. ...draft.loop_variables![index],
  175. ...updateData,
  176. }
  177. }
  178. })
  179. handleInputsChange(newInputs)
  180. }, [handleInputsChange])
  181. return {
  182. readOnly,
  183. inputs,
  184. filterInputVar,
  185. childrenNodeVars,
  186. loopChildrenNodes,
  187. handleAddCondition,
  188. handleRemoveCondition,
  189. handleUpdateCondition,
  190. handleToggleConditionLogicalOperator,
  191. handleAddSubVariableCondition,
  192. handleUpdateSubVariableCondition,
  193. handleRemoveSubVariableCondition,
  194. handleToggleSubVariableConditionLogicalOperator,
  195. handleUpdateLoopCount,
  196. changeErrorResponseMode,
  197. handleAddLoopVariable,
  198. handleRemoveLoopVariable,
  199. handleUpdateLoopVariable,
  200. }
  201. }
  202. export default useConfig