From d43c873dc92538993f8a1f89a5b8ea597fc62b08 Mon Sep 17 00:00:00 2001 From: Ilia Mashkov Date: Mon, 2 Feb 2026 11:57:00 +0300 Subject: [PATCH] feat(createPersistentStore): add a solution to keep user info between sections using browser storage --- .../createPersistentStore.svelte.ts | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/shared/lib/helpers/createPersistentStore/createPersistentStore.svelte.ts diff --git a/src/shared/lib/helpers/createPersistentStore/createPersistentStore.svelte.ts b/src/shared/lib/helpers/createPersistentStore/createPersistentStore.svelte.ts new file mode 100644 index 0000000..cfb37ad --- /dev/null +++ b/src/shared/lib/helpers/createPersistentStore/createPersistentStore.svelte.ts @@ -0,0 +1,51 @@ +/** + * Reusable persistent storage utility using Svelte 5 runes + * + * Automatically syncs state with localStorage. + */ +export function createPersistentStore(key: string, defaultValue: T) { + // Initialize from storage or default + const loadFromStorage = (): T => { + if (typeof window === 'undefined') { + return defaultValue; + } + try { + const item = localStorage.getItem(key); + return item ? JSON.parse(item) : defaultValue; + } catch (error) { + console.warn(`[createPersistentStore] Error loading ${key}:`, error); + return defaultValue; + } + }; + + let value = $state(loadFromStorage()); + + // Sync to storage whenever value changes + $effect.root(() => { + $effect(() => { + if (typeof window === 'undefined') { + return; + } + try { + localStorage.setItem(key, JSON.stringify(value)); + } catch (error) { + console.warn(`[createPersistentStore] Error saving ${key}:`, error); + } + }); + }); + + return { + get value() { + return value; + }, + set value(v: T) { + value = v; + }, + clear() { + if (typeof window !== 'undefined') { + localStorage.removeItem(key); + } + value = defaultValue; + }, + }; +}