|
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 |
|
|