Spaces:
Paused
Paused
| 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 | |
| // Not Enable Group | |
| 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 { | |
| // removeType === 'enableChanged' to enabled | |
| 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 | |