From a435a1142f87099470f86446ccec10077c788670 Mon Sep 17 00:00:00 2001 From: Alexander Bocken Date: Sun, 15 Feb 2026 22:06:21 +0100 Subject: [PATCH] fix: streak counter showing zero on second device due to stale localStorage The RosaryStreakStore singleton survives client-side navigation but the first mount. Also reorder onMount to merge server data before assigning to streak, preventing a frame of stale localStorage values. --- src/lib/components/faith/StreakCounter.svelte | 7 +++++-- src/lib/stores/rosaryStreak.svelte.ts | 8 +------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/lib/components/faith/StreakCounter.svelte b/src/lib/components/faith/StreakCounter.svelte index 34f01e1..f6244d4 100644 --- a/src/lib/components/faith/StreakCounter.svelte +++ b/src/lib/components/faith/StreakCounter.svelte @@ -30,9 +30,12 @@ const labels = $derived({ }); // Initialize store on mount (client-side only) +// Init with server data BEFORE assigning to streak, so displayLength +// never sees stale localStorage data from the singleton onMount(() => { - streak = getRosaryStreak(); - streak.initWithServerData(streakData, streakData !== null); + const s = getRosaryStreak(); + s.initWithServerData(streakData, isLoggedIn); + streak = s; }); async function pray() { diff --git a/src/lib/stores/rosaryStreak.svelte.ts b/src/lib/stores/rosaryStreak.svelte.ts index 24b59ad..05ef3b8 100644 --- a/src/lib/stores/rosaryStreak.svelte.ts +++ b/src/lib/stores/rosaryStreak.svelte.ts @@ -79,7 +79,6 @@ class RosaryStreakStore { #initialized = false; #syncing = $state(false); #pendingSync = false; // Track if we have unsynced changes - #hasSyncedOnce = false; // Track if initial sync has completed #isOffline = $state(false); #reconnectInterval: ReturnType | null = null; @@ -164,14 +163,11 @@ class RosaryStreakStore { return this.#syncing; } - // Initialize with server data (called once on page load) + // Initialize with server data (called on each component mount) initWithServerData(serverData: StreakData | null, isLoggedIn: boolean): void { - if (this.#hasSyncedOnce) return; // Only sync once - this.#isLoggedIn = isLoggedIn; if (!isLoggedIn || !serverData) { - this.#hasSyncedOnce = true; return; } @@ -187,8 +183,6 @@ class RosaryStreakStore { if (merged.length !== serverData.length || merged.lastPrayed !== serverData.lastPrayed) { this.#pushToServer(); } - - this.#hasSyncedOnce = true; } async #pushToServer(): Promise {