32 lines
1.1 KiB
TypeScript
32 lines
1.1 KiB
TypeScript
import { defaultLocale, isLocale, localeStorageKey, type Locale } from "./locales";
|
|
|
|
export function createLocaleStore(storage: () => Pick<Storage, "getItem" | "setItem"> | undefined) {
|
|
let locale: Locale = defaultLocale;
|
|
let restored = false;
|
|
const listeners = new Set<() => void>();
|
|
const emit = () => listeners.forEach((listener) => listener());
|
|
|
|
return {
|
|
getSnapshot: () => locale,
|
|
getServerSnapshot: () => defaultLocale,
|
|
subscribe(listener: () => void) {
|
|
listeners.add(listener);
|
|
if (!restored) {
|
|
restored = true;
|
|
try {
|
|
const saved = storage()?.getItem(localeStorageKey);
|
|
if (isLocale(saved)) locale = saved;
|
|
} catch { /* Storage may be disabled by the browser. */ }
|
|
emit();
|
|
}
|
|
return () => { listeners.delete(listener); };
|
|
},
|
|
setLocale(value: Locale) {
|
|
if (!isLocale(value)) return;
|
|
locale = value;
|
|
try { storage()?.setItem(localeStorageKey, value); } catch { /* Keep the session choice when storage is unavailable. */ }
|
|
emit();
|
|
},
|
|
};
|
|
}
|