chore(repo): initialize planarchy workspace

This commit is contained in:
2026-03-14 14:31:09 +01:00
commit dd55d0e78b
769 changed files with 166461 additions and 0 deletions
+63
View File
@@ -0,0 +1,63 @@
import { useState, useCallback } from "react";
export interface UseSelectionReturn {
selectedIds: Set<string>;
toggle: (id: string) => void;
toggleAll: (ids: string[]) => void;
clear: () => void;
isAllSelected: (ids: string[]) => boolean;
isIndeterminate: (ids: string[]) => boolean;
count: number;
selectedArray: string[];
}
export function useSelection(): UseSelectionReturn {
const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());
const toggle = useCallback((id: string) => {
setSelectedIds((prev) => {
const next = new Set(prev);
if (next.has(id)) next.delete(id);
else next.add(id);
return next;
});
}, []);
const toggleAll = useCallback((ids: string[]) => {
setSelectedIds((prev) => {
const allSelected = ids.every((id) => prev.has(id));
if (allSelected) {
const next = new Set(prev);
ids.forEach((id) => next.delete(id));
return next;
} else {
const next = new Set(prev);
ids.forEach((id) => next.add(id));
return next;
}
});
}, []);
const clear = useCallback(() => setSelectedIds(new Set()), []);
const isAllSelected = useCallback(
(ids: string[]) => ids.length > 0 && ids.every((id) => selectedIds.has(id)),
[selectedIds],
);
const isIndeterminate = useCallback(
(ids: string[]) => ids.some((id) => selectedIds.has(id)) && !ids.every((id) => selectedIds.has(id)),
[selectedIds],
);
return {
selectedIds,
toggle,
toggleAll,
clear,
isAllSelected,
isIndeterminate,
count: selectedIds.size,
selectedArray: [...selectedIds],
};
}