import get from 'lodash/get'; import { useEffect, useMemo } from 'react'; import { useUpdateNodeInternals } from 'reactflow'; import { SwitchElseTo } from '../../constant'; import { ICategorizeItemResult, ISwitchCondition, NodeData, } from '../../interface'; import { generateSwitchHandleText } from '../../utils'; export const useBuildCategorizeHandlePositions = ({ data, id, }: { id: string; data: NodeData; }) => { const updateNodeInternals = useUpdateNodeInternals(); const categoryData: ICategorizeItemResult = useMemo(() => { return get(data, `form.category_description`, {}); }, [data]); const positions = useMemo(() => { const list: Array<{ text: string; top: number; idx: number; }> = []; Object.keys(categoryData) .sort((a, b) => categoryData[a].index - categoryData[b].index) .forEach((x, idx) => { list.push({ text: x, idx, top: idx === 0 ? 98 : list[idx - 1].top + 8 + 26, }); }); return list; }, [categoryData]); useEffect(() => { updateNodeInternals(id); }, [id, updateNodeInternals, categoryData]); return { positions }; }; export const useBuildSwitchHandlePositions = ({ data, id, }: { id: string; data: NodeData; }) => { const updateNodeInternals = useUpdateNodeInternals(); const conditions: ISwitchCondition[] = useMemo(() => { return get(data, 'form.conditions', []); }, [data]); const positions = useMemo(() => { const list: Array<{ text: string; top: number; idx: number; condition?: ISwitchCondition; }> = []; [...conditions, ''].forEach((x, idx) => { let top = idx === 0 ? 58 : list[idx - 1].top + 32; // case number (Case 1) height + flex gap if (idx - 1 >= 0) { const previousItems = conditions[idx - 1]?.items ?? []; if (previousItems.length > 0) { top += 12; // ConditionBlock padding top += previousItems.length * 22; // condition variable height top += (previousItems.length - 1) * 25; // operator height } } list.push({ text: idx < conditions.length ? generateSwitchHandleText(idx) : SwitchElseTo, idx, top, condition: typeof x === 'string' ? undefined : x, }); }); return list; }, [conditions]); useEffect(() => { updateNodeInternals(id); }, [id, updateNodeInternals, conditions]); return { positions }; };