import type { RulesEdition } from "@initiative/domain"; import { useCallback, useSyncExternalStore } from "react"; const STORAGE_KEY = "initiative:rules-edition"; const listeners = new Set<() => void>(); let currentEdition: RulesEdition = loadEdition(); function loadEdition(): RulesEdition { try { const raw = localStorage.getItem(STORAGE_KEY); if (raw === "5e" || raw === "5.5e") return raw; } catch { // storage unavailable } return "5.5e"; } function saveEdition(edition: RulesEdition): void { try { localStorage.setItem(STORAGE_KEY, edition); } catch { // quota exceeded or storage unavailable } } function notifyAll(): void { for (const listener of listeners) { listener(); } } function subscribe(callback: () => void): () => void { listeners.add(callback); return () => listeners.delete(callback); } function getSnapshot(): RulesEdition { return currentEdition; } export function useRulesEdition() { const edition = useSyncExternalStore(subscribe, getSnapshot); const setEdition = useCallback((next: RulesEdition) => { currentEdition = next; saveEdition(next); notifyAll(); }, []); return { edition, setEdition } as const; }