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