1import { browser } from '$app/environment';
2
3type PersistedValue<T> = {
4 get value(): T;
5 set value(newValue: T);
6};
7
8export function persisted<T>(key: string, initialValue: T): PersistedValue<T> {
9 let value = initialValue;
10
11 if (browser) {
12 try {
13 const stored = localStorage.getItem(key);
14
15 if (stored !== null) {
16 value = JSON.parse(stored) as T;
17 }
18 } catch (error) {
19 console.warn(`Failed to load ${key}:`, error);
20 }
21 }
22
23 const persist = (next: T) => {
24 if (!browser) {
25 return;
26 }
27
28 try {
29 if (next === null || next === undefined) {
30 localStorage.removeItem(key);
31 return;
32 }
33
34 localStorage.setItem(key, JSON.stringify(next));
35 } catch (error) {
36 console.warn(`Failed to persist ${key}:`, error);
37 }
38 };
39
40 return {
41 get value() {
42 return value;
43 },
44
45 set value(newValue: T) {
46 value = newValue;
47 persist(newValue);
48 }
49 };
50}