| import { useCallback, useState } from 'react' |
| import produce from 'immer' |
| import { useBoolean } from 'ahooks' |
| import { v4 as uuid4 } from 'uuid' |
| import type { ValueSelector, Var } from '../../types' |
| import { VarType } from '../../types' |
| import type { VarGroupItem, VariableAssignerNodeType } from './types' |
| import { useGetAvailableVars } from './hooks' |
| import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' |
|
|
| import { |
| useNodesReadOnly, |
| useWorkflow, |
| } from '@/app/components/workflow/hooks' |
|
|
| const useConfig = (id: string, payload: VariableAssignerNodeType) => { |
| const { nodesReadOnly: readOnly } = useNodesReadOnly() |
| const { handleOutVarRenameChange, isVarUsedInNodes, removeUsedVarInNodes } = useWorkflow() |
|
|
| const { inputs, setInputs } = useNodeCrud<VariableAssignerNodeType>(id, payload) |
| const isEnableGroup = !!inputs.advanced_settings?.group_enabled |
|
|
| |
| const handleListOrTypeChange = useCallback((payload: VarGroupItem) => { |
| setInputs({ |
| ...inputs, |
| ...payload, |
| }) |
| }, [inputs, setInputs]) |
|
|
| const handleListOrTypeChangeInGroup = useCallback((groupId: string) => { |
| return (payload: VarGroupItem) => { |
| const index = inputs.advanced_settings.groups.findIndex(item => item.groupId === groupId) |
| const newInputs = produce(inputs, (draft) => { |
| draft.advanced_settings.groups[index] = { |
| ...draft.advanced_settings.groups[index], |
| ...payload, |
| } |
| }) |
| setInputs(newInputs) |
| } |
| }, [inputs, setInputs]) |
|
|
| const getAvailableVars = useGetAvailableVars() |
| const filterVar = (varType: VarType) => { |
| return (v: Var) => { |
| if (varType === VarType.any) |
| return true |
| if (v.type === VarType.any) |
| return true |
| return v.type === varType |
| } |
| } |
|
|
| const [isShowRemoveVarConfirm, { |
| setTrue: showRemoveVarConfirm, |
| setFalse: hideRemoveVarConfirm, |
| }] = useBoolean(false) |
|
|
| const [removedVars, setRemovedVars] = useState<ValueSelector[]>([]) |
| const [removeType, setRemoveType] = useState<'group' | 'enableChanged'>('group') |
| const [removedGroupIndex, setRemovedGroupIndex] = useState<number>(-1) |
| const handleGroupRemoved = useCallback((groupId: string) => { |
| return () => { |
| const index = inputs.advanced_settings.groups.findIndex(item => item.groupId === groupId) |
| if (isVarUsedInNodes([id, inputs.advanced_settings.groups[index].group_name, 'output'])) { |
| showRemoveVarConfirm() |
| setRemovedVars([[id, inputs.advanced_settings.groups[index].group_name, 'output']]) |
| setRemoveType('group') |
| setRemovedGroupIndex(index) |
| return |
| } |
| const newInputs = produce(inputs, (draft) => { |
| draft.advanced_settings.groups.splice(index, 1) |
| }) |
| setInputs(newInputs) |
| } |
| }, [id, inputs, isVarUsedInNodes, setInputs, showRemoveVarConfirm]) |
|
|
| const handleGroupEnabledChange = useCallback((enabled: boolean) => { |
| const newInputs = produce(inputs, (draft) => { |
| if (!draft.advanced_settings) |
| draft.advanced_settings = { group_enabled: false, groups: [] } |
| if (enabled) { |
| if (draft.advanced_settings.groups.length === 0) { |
| const DEFAULT_GROUP_NAME = 'Group1' |
| draft.advanced_settings.groups = [{ |
| output_type: draft.output_type, |
| variables: draft.variables, |
| group_name: DEFAULT_GROUP_NAME, |
| groupId: uuid4(), |
| }] |
|
|
| handleOutVarRenameChange(id, [id, 'output'], [id, DEFAULT_GROUP_NAME, 'output']) |
| } |
| } |
| else { |
| if (draft.advanced_settings.groups.length > 0) { |
| if (draft.advanced_settings.groups.length > 1) { |
| const useVars = draft.advanced_settings.groups.filter((item, index) => index > 0 && isVarUsedInNodes([id, item.group_name, 'output'])) |
| if (useVars.length > 0) { |
| showRemoveVarConfirm() |
| setRemovedVars(useVars.map(item => [id, item.group_name, 'output'])) |
| setRemoveType('enableChanged') |
| return |
| } |
| } |
| draft.output_type = draft.advanced_settings.groups[0].output_type |
| draft.variables = draft.advanced_settings.groups[0].variables |
| handleOutVarRenameChange(id, [id, draft.advanced_settings.groups[0].group_name, 'output'], [id, 'output']) |
| } |
| } |
| draft.advanced_settings.group_enabled = enabled |
| }) |
| setInputs(newInputs) |
| }, [handleOutVarRenameChange, id, inputs, isVarUsedInNodes, setInputs, showRemoveVarConfirm]) |
|
|
| const handleAddGroup = useCallback(() => { |
| let maxInGroupName = 1 |
| inputs.advanced_settings.groups.forEach((item) => { |
| const match = item.group_name.match(/(\d+)$/) |
| if (match) { |
| const num = parseInt(match[1], 10) |
| if (num > maxInGroupName) |
| maxInGroupName = num |
| } |
| }) |
| const newInputs = produce(inputs, (draft) => { |
| draft.advanced_settings.groups.push({ |
| output_type: VarType.any, |
| variables: [], |
| group_name: `Group${maxInGroupName + 1}`, |
| groupId: uuid4(), |
| }) |
| }) |
| setInputs(newInputs) |
| }, [inputs, setInputs]) |
|
|
| const handleVarGroupNameChange = useCallback((groupId: string) => { |
| return (name: string) => { |
| const index = inputs.advanced_settings.groups.findIndex(item => item.groupId === groupId) |
| const newInputs = produce(inputs, (draft) => { |
| draft.advanced_settings.groups[index].group_name = name |
| }) |
| handleOutVarRenameChange(id, [id, inputs.advanced_settings.groups[index].group_name, 'output'], [id, name, 'output']) |
| setInputs(newInputs) |
| } |
| }, [handleOutVarRenameChange, id, inputs, setInputs]) |
|
|
| const onRemoveVarConfirm = useCallback(() => { |
| removedVars.forEach((v) => { |
| removeUsedVarInNodes(v) |
| }) |
| hideRemoveVarConfirm() |
| if (removeType === 'group') { |
| const newInputs = produce(inputs, (draft) => { |
| draft.advanced_settings.groups.splice(removedGroupIndex, 1) |
| }) |
| setInputs(newInputs) |
| } |
| else { |
| |
| const newInputs = produce(inputs, (draft) => { |
| draft.advanced_settings.group_enabled = false |
| draft.output_type = draft.advanced_settings.groups[0].output_type |
| draft.variables = draft.advanced_settings.groups[0].variables |
| }) |
| setInputs(newInputs) |
| } |
| }, [removedVars, hideRemoveVarConfirm, removeType, removeUsedVarInNodes, inputs, setInputs, removedGroupIndex]) |
|
|
| return { |
| readOnly, |
| inputs, |
| handleListOrTypeChange, |
| isEnableGroup, |
| handleGroupEnabledChange, |
| handleAddGroup, |
| handleListOrTypeChangeInGroup, |
| handleGroupRemoved, |
| handleVarGroupNameChange, |
| isShowRemoveVarConfirm, |
| hideRemoveVarConfirm, |
| onRemoveVarConfirm, |
| getAvailableVars, |
| filterVar, |
| } |
| } |
|
|
| export default useConfig |
|
|