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