import type { Var, } from '../../types' import type { CaseItem, HandleAddCondition, HandleAddSubVariableCondition, HandleRemoveCondition, HandleToggleConditionLogicalOperator, HandleToggleSubVariableConditionLogicalOperator, HandleUpdateCondition, HandleUpdateSubVariableCondition, IfElseNodeType, } from './types' import { useCallback, useMemo, useRef, } from 'react' import { useUpdateNodeInternals } from 'reactflow' import { useEdgesInteractions, useNodesReadOnly, } from '@/app/components/workflow/hooks' import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import { addCase, addCondition, addSubVariableCondition, filterAllVars, filterNumberVars, getVarsIsVarFileAttribute, removeCase, removeCondition, removeSubVariableCondition, sortCases, toggleConditionLogicalOperator, toggleSubVariableConditionLogicalOperator, updateCondition, updateSubVariableCondition, } from './use-config.helpers' import useIsVarFileAttribute from './use-is-var-file-attribute' const useConfig = (id: string, payload: IfElseNodeType) => { const updateNodeInternals = useUpdateNodeInternals() const { nodesReadOnly: readOnly } = useNodesReadOnly() const { handleEdgeDeleteByDeleteBranch } = useEdgesInteractions() const { inputs, setInputs } = useNodeCrud(id, payload) const inputsRef = useRef(inputs) const handleInputsChange = useCallback((newInputs: IfElseNodeType) => { inputsRef.current = newInputs setInputs(newInputs) }, [setInputs]) const filterVar = useCallback(() => filterAllVars(), []) const { availableVars, availableNodesWithParent, } = useAvailableVarList(id, { onlyLeafNodeVar: false, filterVar, }) const filterNumberVar = useCallback((varPayload: Var) => filterNumberVars(varPayload), []) const { getIsVarFileAttribute, } = useIsVarFileAttribute({ nodeId: id, isInIteration: payload.isInIteration, isInLoop: payload.isInLoop, }) const varsIsVarFileAttribute = useMemo(() => { return getVarsIsVarFileAttribute(inputs.cases, getIsVarFileAttribute) }, [inputs.cases, getIsVarFileAttribute]) const { availableVars: availableNumberVars, availableNodesWithParent: availableNumberNodesWithParent, } = useAvailableVarList(id, { onlyLeafNodeVar: false, filterVar: filterNumberVar, }) const handleAddCase = useCallback(() => { handleInputsChange(addCase(inputsRef.current)) }, [handleInputsChange]) const handleRemoveCase = useCallback((caseId: string) => { handleEdgeDeleteByDeleteBranch(id, caseId) handleInputsChange(removeCase(inputsRef.current, caseId)) }, [handleEdgeDeleteByDeleteBranch, handleInputsChange, id]) const handleSortCase = useCallback((newCases: (CaseItem & { id: string })[]) => { handleInputsChange(sortCases(inputsRef.current, newCases)) updateNodeInternals(id) }, [handleInputsChange, id, updateNodeInternals]) const handleAddCondition = useCallback((caseId, valueSelector, varItem) => { handleInputsChange(addCondition({ inputs: inputsRef.current, caseId, valueSelector, variable: varItem, isVarFileAttribute: !!getIsVarFileAttribute(valueSelector), })) }, [getIsVarFileAttribute, handleInputsChange]) const handleRemoveCondition = useCallback((caseId, conditionId) => { handleInputsChange(removeCondition(inputsRef.current, caseId, conditionId)) }, [handleInputsChange]) const handleUpdateCondition = useCallback((caseId, conditionId, newCondition) => { handleInputsChange(updateCondition(inputsRef.current, caseId, conditionId, newCondition)) }, [handleInputsChange]) const handleToggleConditionLogicalOperator = useCallback((caseId) => { handleInputsChange(toggleConditionLogicalOperator(inputsRef.current, caseId)) }, [handleInputsChange]) const handleAddSubVariableCondition = useCallback((caseId: string, conditionId: string, key?: string) => { handleInputsChange(addSubVariableCondition(inputsRef.current, caseId, conditionId, key)) }, [handleInputsChange]) const handleRemoveSubVariableCondition = useCallback((caseId: string, conditionId: string, subConditionId: string) => { handleInputsChange(removeSubVariableCondition(inputsRef.current, caseId, conditionId, subConditionId)) }, [handleInputsChange]) const handleUpdateSubVariableCondition = useCallback((caseId, conditionId, subConditionId, newSubCondition) => { handleInputsChange(updateSubVariableCondition(inputsRef.current, caseId, conditionId, subConditionId, newSubCondition)) }, [handleInputsChange]) const handleToggleSubVariableConditionLogicalOperator = useCallback((caseId, conditionId) => { handleInputsChange(toggleSubVariableConditionLogicalOperator(inputsRef.current, caseId, conditionId)) }, [handleInputsChange]) return { readOnly, inputs, filterVar, filterNumberVar, handleAddCase, handleRemoveCase, handleSortCase, handleAddCondition, handleRemoveCondition, handleUpdateCondition, handleToggleConditionLogicalOperator, handleAddSubVariableCondition, handleUpdateSubVariableCondition, handleRemoveSubVariableCondition, handleToggleSubVariableConditionLogicalOperator, nodesOutputVars: availableVars, availableNodes: availableNodesWithParent, nodesOutputNumberVars: availableNumberVars, availableNumberNodes: availableNumberNodesWithParent, varsIsVarFileAttribute, } } export default useConfig