27 lines
1.3 KiB
TypeScript
27 lines
1.3 KiB
TypeScript
import { derived, writable } from 'svelte/store';
|
|
import { createTimeFormatter, DEFAULT_TIME_ZONE, validTimeZone } from '$lib/time-zone.js';
|
|
|
|
export const TIME_ZONE_STORAGE_KEY = 'electric-cherry:time-zone';
|
|
export const timeZone = writable(DEFAULT_TIME_ZONE);
|
|
export const timeFormat = derived(timeZone, createTimeFormatter);
|
|
export const timeZonePersistenceError = writable(false);
|
|
|
|
/** Called only on mount so server rendering never shares a user's preference. */
|
|
export function startTimeZonePreference(): () => void {
|
|
let saved: string | null = null;
|
|
try { saved = localStorage.getItem(TIME_ZONE_STORAGE_KEY); } catch { /* Use the default. */ }
|
|
timeZone.set(validTimeZone(saved) ? saved : DEFAULT_TIME_ZONE);
|
|
const unsubscribe = timeZone.subscribe(value => {
|
|
try {
|
|
localStorage.setItem(TIME_ZONE_STORAGE_KEY, value);
|
|
timeZonePersistenceError.set(false);
|
|
} catch { timeZonePersistenceError.set(true); }
|
|
});
|
|
function onStorage(event: StorageEvent) {
|
|
if (event.storageArea !== localStorage || (event.key !== TIME_ZONE_STORAGE_KEY && event.key !== null)) return;
|
|
timeZone.set(validTimeZone(event.newValue) ? event.newValue : DEFAULT_TIME_ZONE);
|
|
}
|
|
window.addEventListener('storage', onStorage);
|
|
return () => { unsubscribe(); window.removeEventListener('storage', onStorage); };
|
|
}
|