use-config.ts 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. import { useCallback, useState } from 'react'
  2. import produce from 'immer'
  3. import { useBoolean } from 'ahooks'
  4. import { v4 as uuid4 } from 'uuid'
  5. import type { ValueSelector, Var } from '../../types'
  6. import { VarType } from '../../types'
  7. import type { VarGroupItem, VariableAssignerNodeType } from './types'
  8. import { useGetAvailableVars, useVariableAssigner } from './hooks'
  9. import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
  10. import {
  11. useNodesReadOnly,
  12. useWorkflow,
  13. } from '@/app/components/workflow/hooks'
  14. const useConfig = (id: string, payload: VariableAssignerNodeType) => {
  15. const { nodesReadOnly: readOnly } = useNodesReadOnly()
  16. const { handleOutVarRenameChange, isVarUsedInNodes, removeUsedVarInNodes } = useWorkflow()
  17. const { inputs, setInputs } = useNodeCrud<VariableAssignerNodeType>(id, payload)
  18. const isEnableGroup = !!inputs.advanced_settings?.group_enabled
  19. const { handleRemoveEdges } = useVariableAssigner()
  20. // Not Enable Group
  21. const handleListOrTypeChange = useCallback((payload: VarGroupItem) => {
  22. setInputs({
  23. ...inputs,
  24. ...payload,
  25. })
  26. }, [inputs, setInputs])
  27. const handleListOrTypeChangeInGroup = useCallback((groupId: string) => {
  28. return (payload: VarGroupItem) => {
  29. const index = inputs.advanced_settings.groups.findIndex(item => item.groupId === groupId)
  30. const newInputs = produce(inputs, (draft) => {
  31. draft.advanced_settings.groups[index] = {
  32. ...draft.advanced_settings.groups[index],
  33. ...payload,
  34. }
  35. })
  36. setInputs(newInputs)
  37. }
  38. }, [inputs, setInputs])
  39. const getAvailableVars = useGetAvailableVars()
  40. const filterVar = (varType: VarType) => {
  41. return (v: Var) => {
  42. if (varType === VarType.any)
  43. return true
  44. if (v.type === VarType.any)
  45. return true
  46. return v.type === varType
  47. }
  48. }
  49. const [isShowRemoveVarConfirm, {
  50. setTrue: showRemoveVarConfirm,
  51. setFalse: hideRemoveVarConfirm,
  52. }] = useBoolean(false)
  53. const [removedVars, setRemovedVars] = useState<ValueSelector[]>([])
  54. const [removeType, setRemoveType] = useState<'group' | 'enableChanged'>('group')
  55. const [removedGroupIndex, setRemovedGroupIndex] = useState<number>(-1)
  56. const handleGroupRemoved = useCallback((groupId: string) => {
  57. return () => {
  58. const index = inputs.advanced_settings.groups.findIndex(item => item.groupId === groupId)
  59. if (isVarUsedInNodes([id, inputs.advanced_settings.groups[index].group_name, 'output'])) {
  60. showRemoveVarConfirm()
  61. setRemovedVars([[id, inputs.advanced_settings.groups[index].group_name, 'output']])
  62. setRemoveType('group')
  63. setRemovedGroupIndex(index)
  64. return
  65. }
  66. const newInputs = produce(inputs, (draft) => {
  67. draft.advanced_settings.groups.splice(index, 1)
  68. })
  69. setInputs(newInputs)
  70. }
  71. }, [id, inputs, isVarUsedInNodes, setInputs, showRemoveVarConfirm])
  72. const handleGroupEnabledChange = useCallback((enabled: boolean) => {
  73. const newInputs = produce(inputs, (draft) => {
  74. if (!draft.advanced_settings)
  75. draft.advanced_settings = { group_enabled: false, groups: [] }
  76. if (enabled) {
  77. if (draft.advanced_settings.groups.length === 0) {
  78. const DEFAULT_GROUP_NAME = 'Group1'
  79. draft.advanced_settings.groups = [{
  80. output_type: draft.output_type,
  81. variables: draft.variables,
  82. group_name: DEFAULT_GROUP_NAME,
  83. groupId: uuid4(),
  84. }]
  85. handleOutVarRenameChange(id, [id, 'output'], [id, DEFAULT_GROUP_NAME, 'output'])
  86. }
  87. }
  88. else {
  89. if (draft.advanced_settings.groups.length > 0) {
  90. if (draft.advanced_settings.groups.length > 1) {
  91. const useVars = draft.advanced_settings.groups.filter((item, index) => index > 0 && isVarUsedInNodes([id, item.group_name, 'output']))
  92. if (useVars.length > 0) {
  93. showRemoveVarConfirm()
  94. setRemovedVars(useVars.map(item => [id, item.group_name, 'output']))
  95. setRemoveType('enableChanged')
  96. return
  97. }
  98. }
  99. draft.output_type = draft.advanced_settings.groups[0].output_type
  100. draft.variables = draft.advanced_settings.groups[0].variables
  101. handleOutVarRenameChange(id, [id, draft.advanced_settings.groups[0].group_name, 'output'], [id, 'output'])
  102. }
  103. }
  104. draft.advanced_settings.group_enabled = enabled
  105. })
  106. setInputs(newInputs)
  107. handleRemoveEdges(id, enabled)
  108. }, [handleOutVarRenameChange, id, inputs, isVarUsedInNodes, setInputs, showRemoveVarConfirm, handleRemoveEdges])
  109. const handleAddGroup = useCallback(() => {
  110. let maxInGroupName = 1
  111. inputs.advanced_settings.groups.forEach((item) => {
  112. const match = item.group_name.match(/(\d+)$/)
  113. if (match) {
  114. const num = parseInt(match[1], 10)
  115. if (num > maxInGroupName)
  116. maxInGroupName = num
  117. }
  118. })
  119. const newInputs = produce(inputs, (draft) => {
  120. draft.advanced_settings.groups.push({
  121. output_type: VarType.any,
  122. variables: [],
  123. group_name: `Group${maxInGroupName + 1}`,
  124. groupId: uuid4(),
  125. })
  126. })
  127. setInputs(newInputs)
  128. }, [inputs, setInputs])
  129. const handleVarGroupNameChange = useCallback((groupId: string) => {
  130. return (name: string) => {
  131. const index = inputs.advanced_settings.groups.findIndex(item => item.groupId === groupId)
  132. const newInputs = produce(inputs, (draft) => {
  133. draft.advanced_settings.groups[index].group_name = name
  134. })
  135. handleOutVarRenameChange(id, [id, inputs.advanced_settings.groups[index].group_name, 'output'], [id, name, 'output'])
  136. setInputs(newInputs)
  137. }
  138. }, [handleOutVarRenameChange, id, inputs, setInputs])
  139. const onRemoveVarConfirm = useCallback(() => {
  140. removedVars.forEach((v) => {
  141. removeUsedVarInNodes(v)
  142. })
  143. hideRemoveVarConfirm()
  144. if (removeType === 'group') {
  145. const newInputs = produce(inputs, (draft) => {
  146. draft.advanced_settings.groups.splice(removedGroupIndex, 1)
  147. })
  148. setInputs(newInputs)
  149. }
  150. else {
  151. // removeType === 'enableChanged' to enabled
  152. const newInputs = produce(inputs, (draft) => {
  153. draft.advanced_settings.group_enabled = false
  154. draft.output_type = draft.advanced_settings.groups[0].output_type
  155. draft.variables = draft.advanced_settings.groups[0].variables
  156. })
  157. setInputs(newInputs)
  158. }
  159. }, [removedVars, hideRemoveVarConfirm, removeType, removeUsedVarInNodes, inputs, setInputs, removedGroupIndex])
  160. return {
  161. readOnly,
  162. inputs,
  163. handleListOrTypeChange,
  164. isEnableGroup,
  165. handleGroupEnabledChange,
  166. handleAddGroup,
  167. handleListOrTypeChangeInGroup,
  168. handleGroupRemoved,
  169. handleVarGroupNameChange,
  170. isShowRemoveVarConfirm,
  171. hideRemoveVarConfirm,
  172. onRemoveVarConfirm,
  173. getAvailableVars,
  174. filterVar,
  175. }
  176. }
  177. export default useConfig