| import { useCallback, useState } from 'react' |
| import produce from 'immer' |
| import { useBoolean } from 'ahooks' |
| import type { StartNodeType } from './types' |
| import { ChangeType } from '@/app/components/workflow/types' |
| import type { InputVar, MoreInfo, ValueSelector } from '@/app/components/workflow/types' |
| import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' |
| import { |
| useIsChatMode, |
| useNodesReadOnly, |
| useWorkflow, |
| } from '@/app/components/workflow/hooks' |
|
|
| const useConfig = (id: string, payload: StartNodeType) => { |
| const { nodesReadOnly: readOnly } = useNodesReadOnly() |
| const { handleOutVarRenameChange, isVarUsedInNodes, removeUsedVarInNodes } = useWorkflow() |
| const isChatMode = useIsChatMode() |
|
|
| const { inputs, setInputs } = useNodeCrud<StartNodeType>(id, payload) |
|
|
| const [isShowAddVarModal, { |
| setTrue: showAddVarModal, |
| setFalse: hideAddVarModal, |
| }] = useBoolean(false) |
|
|
| const [isShowRemoveVarConfirm, { |
| setTrue: showRemoveVarConfirm, |
| setFalse: hideRemoveVarConfirm, |
| }] = useBoolean(false) |
| const [removedVar, setRemovedVar] = useState<ValueSelector>([]) |
| const [removedIndex, setRemoveIndex] = useState(0) |
| const handleVarListChange = useCallback((newList: InputVar[], moreInfo?: { index: number; payload: MoreInfo }) => { |
| if (moreInfo?.payload?.type === ChangeType.remove) { |
| if (isVarUsedInNodes([id, moreInfo?.payload?.payload?.beforeKey || ''])) { |
| showRemoveVarConfirm() |
| setRemovedVar([id, moreInfo?.payload?.payload?.beforeKey || '']) |
| setRemoveIndex(moreInfo?.index as number) |
| return |
| } |
| } |
|
|
| const newInputs = produce(inputs, (draft: any) => { |
| draft.variables = newList |
| }) |
| setInputs(newInputs) |
| if (moreInfo?.payload?.type === ChangeType.changeVarName) { |
| const changedVar = newList[moreInfo.index] |
| handleOutVarRenameChange(id, [id, inputs.variables[moreInfo.index].variable], [id, changedVar.variable]) |
| } |
| }, [handleOutVarRenameChange, id, inputs, isVarUsedInNodes, setInputs, showRemoveVarConfirm]) |
|
|
| const removeVarInNode = useCallback(() => { |
| const newInputs = produce(inputs, (draft) => { |
| draft.variables.splice(removedIndex, 1) |
| }) |
| setInputs(newInputs) |
| removeUsedVarInNodes(removedVar) |
| hideRemoveVarConfirm() |
| }, [hideRemoveVarConfirm, inputs, removeUsedVarInNodes, removedIndex, removedVar, setInputs]) |
|
|
| const handleAddVariable = useCallback((payload: InputVar) => { |
| const newInputs = produce(inputs, (draft: StartNodeType) => { |
| draft.variables.push(payload) |
| }) |
| setInputs(newInputs) |
| }, [inputs, setInputs]) |
| return { |
| readOnly, |
| isChatMode, |
| inputs, |
| isShowAddVarModal, |
| showAddVarModal, |
| hideAddVarModal, |
| handleVarListChange, |
| handleAddVariable, |
| isShowRemoveVarConfirm, |
| hideRemoveVarConfirm, |
| onRemoveVarConfirm: removeVarInNode, |
| } |
| } |
|
|
| export default useConfig |
|
|