From b48a27fe04d893c92b28c97d3f78357ce67bb419 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Sat, 28 Mar 2026 06:09:40 +0000 Subject: fix(cache): preserve hydrated client state --- src/stores/identity.ts | 19 ++++++++++++------- src/stores/stateBin.ts | 10 +++++++++- 2 files changed, 21 insertions(+), 8 deletions(-) (limited to 'src/stores') diff --git a/src/stores/identity.ts b/src/stores/identity.ts index b78dd519..52e0cba7 100644 --- a/src/stores/identity.ts +++ b/src/stores/identity.ts @@ -12,18 +12,23 @@ export const defaultIdentity: UserIdentity = { const createStore = () => { const store = writable(defaultIdentity); let state: UserIdentity = defaultIdentity; - - if (browser) - localforage.getItem("identity").then((value) => { - if (value && typeof value === "object") store.set(value); - }); + let hydrated = !browser; store.subscribe((value) => { state = value; - if (browser) localforage.setItem("identity", value); + if (browser && hydrated) localforage.setItem("identity", value); }); + if (browser) + localforage.getItem("identity").then(async (value) => { + if (value && typeof value === "object") store.set(value); + + hydrated = true; + + await localforage.setItem("identity", state); + }); + return { subscribe: store.subscribe, set: store.set, @@ -41,7 +46,7 @@ const createStore = () => { defaultIdentity as unknown as Record )[key]; - if (browser) localforage.setItem("identity", updatedIdentity); + if (browser && hydrated) localforage.setItem("identity", updatedIdentity); return updatedIdentity; }, diff --git a/src/stores/stateBin.ts b/src/stores/stateBin.ts index 06d34bef..1d3f5dee 100644 --- a/src/stores/stateBin.ts +++ b/src/stores/stateBin.ts @@ -13,14 +13,22 @@ interface StateBin { const STORAGE_KEY = "stateBin"; const baseStore = writable({}); +let hydrated = !browser; +let state: StateBin = {}; if (browser) { localforage.getItem(STORAGE_KEY).then((value) => { if (value && typeof value === "object") baseStore.set(value); + + hydrated = true; + + localforage.setItem(STORAGE_KEY, state); }); baseStore.subscribe((value) => { - localforage.setItem(STORAGE_KEY, value); + state = value; + + if (hydrated) localforage.setItem(STORAGE_KEY, value); }); } -- cgit v1.2.3