import type { ValueSelector, Var } from '../../types' import type { AssignerNodeOperation, AssignerNodeType } from './types' import { useCallback, useMemo } from 'react' import { useStoreApi } from 'reactflow' import { useIsChatMode, useNodesReadOnly, useWorkflow, useWorkflowVariables, } from '@/app/components/workflow/hooks' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import { useGetAvailableVars } from './hooks' import { WriteMode, writeModeTypesNum } from './types' import { canAssignToVar, canAssignVar, ensureAssignerVersion, filterVarByType, normalizeAssignedVarType, updateOperationItems, } from './use-config.helpers' import { convertV1ToV2 } from './utils' const useConfig = (id: string, rawPayload: AssignerNodeType) => { const payload = useMemo(() => convertV1ToV2(rawPayload), [rawPayload]) const { nodesReadOnly: readOnly } = useNodesReadOnly() const isChatMode = useIsChatMode() const getAvailableVars = useGetAvailableVars() const store = useStoreApi() const { getBeforeNodesInSameBranchIncludeParent } = 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 getBeforeNodesInSameBranchIncludeParent(id) }, [getBeforeNodesInSameBranchIncludeParent, id]) const { inputs, setInputs } = useNodeCrud(id, payload) const newSetInputs = useCallback( (newInputs: AssignerNodeType) => { setInputs(ensureAssignerVersion(newInputs)) }, [setInputs], ) const { getCurrentVariableType } = useWorkflowVariables() const getAssignedVarType = useCallback( (valueSelector: ValueSelector) => { return getCurrentVariableType({ parentNode: isInIteration ? iterationNode : null, valueSelector: valueSelector || [], availableNodes, isChatMode, isConstant: false, }) }, [getCurrentVariableType, isInIteration, iterationNode, availableNodes, isChatMode], ) const handleOperationListChanges = useCallback( (items: AssignerNodeOperation[]) => { newSetInputs(updateOperationItems(inputs, items)) }, [inputs, newSetInputs], ) const writeModeTypesArr = [ WriteMode.overwrite, WriteMode.clear, WriteMode.append, WriteMode.extend, WriteMode.removeFirst, WriteMode.removeLast, ] const writeModeTypes = [WriteMode.overwrite, WriteMode.clear, WriteMode.set] const getToAssignedVarType = useCallback(normalizeAssignedVarType, []) const filterAssignedVar = useCallback((varPayload: Var, selector: ValueSelector) => { if (varPayload.isLoopVariable) return true return canAssignVar(varPayload, selector) }, []) const filterToAssignedVar = useCallback(canAssignToVar, []) return { readOnly, inputs, handleOperationListChanges, getAssignedVarType, getToAssignedVarType, writeModeTypes, writeModeTypesArr, writeModeTypesNum, filterAssignedVar, filterToAssignedVar, getAvailableVars, filterVar: filterVarByType, } } export default useConfig