Add timezone preference across time displays

This commit is contained in:
2026-09-20 22:12:27 -04:00
parent 1e6ff3abbf
commit 5c5e75526d
28 changed files with 297 additions and 52 deletions
+26
View File
@@ -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); };
}