balibabu
feat: The order of the category operator form is messed up after refreshing the page #3088 (#3089)
2ace2a9
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 }; | |
}; | |