From ea1b145aaf51d4688fc22aab3f85d1b59e22f230 Mon Sep 17 00:00:00 2001 From: Alexander Bocken Date: Sun, 22 Feb 2026 21:30:42 +0100 Subject: [PATCH] rosary: reset expired streak on client to prevent SSR microflash When the client hydrates and finds the merged streak is still expired (localStorage couldn't rescue it), reset to zero and push to the server. This ensures subsequent SSR loads render the correct value from the start. --- src/lib/stores/rosaryStreak.svelte.ts | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/lib/stores/rosaryStreak.svelte.ts b/src/lib/stores/rosaryStreak.svelte.ts index 05ef3b8..5c31017 100644 --- a/src/lib/stores/rosaryStreak.svelte.ts +++ b/src/lib/stores/rosaryStreak.svelte.ts @@ -174,13 +174,21 @@ class RosaryStreakStore { const localData = loadFromStorage(); const merged = mergeStreakData(localData, serverData); - // Update local state - this.#length = merged.length; - this.#lastPrayed = merged.lastPrayed; - saveToStorage(merged); + // If the best data we have is still expired, reset to zero so the next + // SSR load won't flash a stale streak count. + const isExpired = + merged.lastPrayed !== null && + merged.lastPrayed !== getToday() && + !isYesterday(merged.lastPrayed); + const effective: StreakData = isExpired ? { length: 0, lastPrayed: null } : merged; - // If local had newer data, push to server - if (merged.length !== serverData.length || merged.lastPrayed !== serverData.lastPrayed) { + // Update local state + this.#length = effective.length; + this.#lastPrayed = effective.lastPrayed; + saveToStorage(effective); + + // Push to server if anything changed (newer local data, or expired streak reset) + if (effective.length !== serverData.length || effective.lastPrayed !== serverData.lastPrayed) { this.#pushToServer(); } }