|
import { useCallback, useMemo } from 'react' |
|
import produce from 'immer' |
|
import { useStoreApi } from 'reactflow' |
|
import { isEqual } from 'lodash-es' |
|
import { VarType } from '../../types' |
|
import type { ValueSelector, Var } from '../../types' |
|
import { type AssignerNodeType, WriteMode } from './types' |
|
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' |
|
import { |
|
useIsChatMode, |
|
useNodesReadOnly, |
|
useWorkflow, |
|
useWorkflowVariables, |
|
} from '@/app/components/workflow/hooks' |
|
|
|
const useConfig = (id: string, payload: AssignerNodeType) => { |
|
const { nodesReadOnly: readOnly } = useNodesReadOnly() |
|
const isChatMode = useIsChatMode() |
|
|
|
const store = useStoreApi() |
|
const { getBeforeNodesInSameBranch } = useWorkflow() |
|
|
|
const { |
|
getNodes, |
|
} = store.getState() |
|
const currentNode = getNodes().find(n => n.id === id) |
|
const isInIteration = payload.isInIteration |
|
const iterationNode = isInIteration ? getNodes().find(n => n.id === currentNode!.parentId) : null |
|
const availableNodes = useMemo(() => { |
|
return getBeforeNodesInSameBranch(id) |
|
}, [getBeforeNodesInSameBranch, id]) |
|
const { inputs, setInputs } = useNodeCrud<AssignerNodeType>(id, payload) |
|
|
|
const { getCurrentVariableType } = useWorkflowVariables() |
|
const assignedVarType = getCurrentVariableType({ |
|
parentNode: iterationNode, |
|
valueSelector: inputs.assigned_variable_selector || [], |
|
availableNodes, |
|
isChatMode, |
|
isConstant: false, |
|
}) |
|
|
|
const isSupportAppend = useCallback((varType: VarType) => { |
|
return [VarType.arrayString, VarType.arrayNumber, VarType.arrayObject].includes(varType) |
|
}, []) |
|
|
|
const isCurrSupportAppend = useMemo(() => isSupportAppend(assignedVarType), [assignedVarType, isSupportAppend]) |
|
|
|
const handleAssignedVarChanges = useCallback((variable: ValueSelector | string) => { |
|
const newInputs = produce(inputs, (draft) => { |
|
draft.assigned_variable_selector = variable as ValueSelector |
|
draft.input_variable_selector = [] |
|
|
|
const newVarType = getCurrentVariableType({ |
|
parentNode: iterationNode, |
|
valueSelector: draft.assigned_variable_selector || [], |
|
availableNodes, |
|
isChatMode, |
|
isConstant: false, |
|
}) |
|
|
|
if (inputs.write_mode === WriteMode.Append && !isSupportAppend(newVarType)) |
|
draft.write_mode = WriteMode.Overwrite |
|
}) |
|
setInputs(newInputs) |
|
}, [inputs, setInputs, getCurrentVariableType, iterationNode, availableNodes, isChatMode, isSupportAppend]) |
|
|
|
const writeModeTypes = [WriteMode.Overwrite, WriteMode.Append, WriteMode.Clear] |
|
|
|
const handleWriteModeChange = useCallback((writeMode: WriteMode) => { |
|
return () => { |
|
const newInputs = produce(inputs, (draft) => { |
|
draft.write_mode = writeMode |
|
if (inputs.write_mode === WriteMode.Clear) |
|
draft.input_variable_selector = [] |
|
}) |
|
setInputs(newInputs) |
|
} |
|
}, [inputs, setInputs]) |
|
|
|
const toAssignedVarType = useMemo(() => { |
|
const { write_mode } = inputs |
|
if (write_mode === WriteMode.Overwrite) |
|
return assignedVarType |
|
if (write_mode === WriteMode.Append) { |
|
if (assignedVarType === VarType.arrayString) |
|
return VarType.string |
|
if (assignedVarType === VarType.arrayNumber) |
|
return VarType.number |
|
if (assignedVarType === VarType.arrayObject) |
|
return VarType.object |
|
} |
|
return VarType.string |
|
}, [assignedVarType, inputs]) |
|
|
|
const filterAssignedVar = useCallback((varPayload: Var, selector: ValueSelector) => { |
|
return selector.join('.').startsWith('conversation') |
|
}, []) |
|
|
|
const filterToAssignedVar = useCallback((varPayload: Var, selector: ValueSelector) => { |
|
if (isEqual(selector, inputs.assigned_variable_selector)) |
|
return false |
|
|
|
if (inputs.write_mode === WriteMode.Overwrite) { |
|
return varPayload.type === assignedVarType |
|
} |
|
else if (inputs.write_mode === WriteMode.Append) { |
|
switch (assignedVarType) { |
|
case VarType.arrayString: |
|
return varPayload.type === VarType.string |
|
case VarType.arrayNumber: |
|
return varPayload.type === VarType.number |
|
case VarType.arrayObject: |
|
return varPayload.type === VarType.object |
|
default: |
|
return false |
|
} |
|
} |
|
return true |
|
}, [inputs.assigned_variable_selector, inputs.write_mode, assignedVarType]) |
|
|
|
const handleToAssignedVarChange = useCallback((value: ValueSelector | string) => { |
|
const newInputs = produce(inputs, (draft) => { |
|
draft.input_variable_selector = value as ValueSelector |
|
}) |
|
setInputs(newInputs) |
|
}, [inputs, setInputs]) |
|
|
|
return { |
|
readOnly, |
|
inputs, |
|
handleAssignedVarChanges, |
|
assignedVarType, |
|
isSupportAppend: isCurrSupportAppend, |
|
writeModeTypes, |
|
handleWriteModeChange, |
|
filterAssignedVar, |
|
filterToAssignedVar, |
|
handleToAssignedVarChange, |
|
toAssignedVarType, |
|
} |
|
} |
|
|
|
export default useConfig |
|
|