MCPcopy Create free account
hub / github.com/AmazingAng/PolyWorld / usePanelSpans

Function usePanelSpans

src/hooks/usePanelSpans.ts:9–58  ·  view source on GitHub ↗
(storageKey: string, defaultSpan: number)

Source from the content-addressed store, hash-verified

7 * persisted to localStorage.
8 */
9export function usePanelSpans(storageKey: string, defaultSpan: number) {
10 const [spans, setSpans] = useState<Record<string, number>>({});
11 const hydrated = useRef(false);
12
13 useEffect(() => {
14 try {
15 const raw = localStorage.getItem(storageKey);
16 if (!raw) {
17 hydrated.current = true;
18 return;
19 }
20 const parsed = JSON.parse(raw);
21 if (parsed && typeof parsed === "object") {
22 setSpans(parsed as Record<string, number>);
23 }
24 } catch {
25 // Ignore malformed persisted layout data.
26 } finally {
27 hydrated.current = true;
28 }
29 }, [storageKey]);
30
31 useEffect(() => {
32 if (!hydrated.current) {
33 return;
34 }
35 try {
36 localStorage.setItem(storageKey, JSON.stringify(spans));
37 } catch {}
38 }, [spans, storageKey]);
39
40 const getSpan = useCallback(
41 (panelId: string, fallback?: number) => spans[panelId] ?? (fallback ?? defaultSpan),
42 [spans, defaultSpan]
43 );
44
45 const setSpan = useCallback((panelId: string, span: number) => {
46 setSpans((prev) => ({ ...prev, [panelId]: span }));
47 }, []);
48
49 const resetSpan = useCallback((panelId: string) => {
50 setSpans((prev) => {
51 const next = { ...prev };
52 delete next[panelId];
53 return next;
54 });
55 }, []);
56
57 return { getSpan, setSpan, resetSpan };
58}

Callers 2

usePanelRowSpansFunction · 0.90
usePanelColSpansFunction · 0.90

Calls

no outgoing calls

Tested by

no test coverage detected