Spaces:
Build error
Build error
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 | |