import { useCallback, useMemo, useState } from 'react' type Side = 'left' | 'right' type Groups = Record> export type GroupSetter = (id: string, items: readonly T[], side?: Side) => void interface GroupRegistry { flat: { left: T[]; right: T[] } set: GroupSetter } export function useGroupRegistry(): GroupRegistry { const [groups, setGroups] = useState>({ left: {}, right: {} }) const set = useCallback>((id, items, side = 'right') => { setGroups(current => { const next = { ...current, [side]: { ...current[side] } } if (items.length === 0) { delete next[side][id] } else { next[side][id] = items } return next }) }, []) const flat = useMemo( () => ({ left: Object.values(groups.left).flat(), right: Object.values(groups.right).flat() }), [groups] ) return { flat, set } }