Add timezone preference across time displays
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
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); };
|
||||
}
|
||||
Reference in New Issue
Block a user