From c432d4e95d06f8665cf0ff156293ae6b1240f772 Mon Sep 17 00:00:00 2001 From: openhands Date: Fri, 24 Jul 2026 13:50:45 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20service=20worker=20cache=20busting=20?= =?UTF-8?q?=E2=80=94=20unregister=20old=20sw=20on=20load,=20bump=20cache?= =?UTF-8?q?=20version,=20stop=20caching=20HTML?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Bump sw.js cache from v2 to v3 - Unregister all old service workers on page load - Stop caching HTML/navigation (caused stale CSS refs after rebuild) --- public/sw.js | 14 +++----------- src/app/(site)/login/page.tsx | 8 ++++---- src/app/(site)/page.tsx | 20 ++++++++++---------- src/app/(site)/register/page.tsx | 8 ++++---- src/app/(site)/settings/page.tsx | 8 ++++---- src/components/pwa-register.tsx | 15 +++++++++++---- src/components/site-header.tsx | 2 +- 7 files changed, 37 insertions(+), 38 deletions(-) diff --git a/public/sw.js b/public/sw.js index 53928091..7ec6eaa6 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1,5 +1,5 @@ -const CACHE = "atom-v2"; -const API_CACHE = "atom-api-v2"; +const CACHE = "atom-v3"; +const API_CACHE = "atom-api-v3"; self.addEventListener("install", () => self.skipWaiting()); @@ -60,14 +60,6 @@ self.addEventListener("fetch", (event) => { } if (req.mode === "navigate") { - event.respondWith( - fetch(req) - .then((res) => { - const copy = res.clone(); - caches.open(CACHE).then((c) => c.put(req, copy)).catch(() => {}); - return res; - }) - .catch(() => caches.match(req).then((hit) => hit || caches.match("/"))), - ); + event.respondWith(fetch(req)); } }); diff --git a/src/app/(site)/login/page.tsx b/src/app/(site)/login/page.tsx index d6edadaa..97db0168 100644 --- a/src/app/(site)/login/page.tsx +++ b/src/app/(site)/login/page.tsx @@ -125,7 +125,7 @@ export default async function LoginPage() {

{t("welcomeBack")}

@@ -150,7 +150,7 @@ export default async function LoginPage() { }} > -

+

{th("online", { count: online, hotel: "" }).trim()}

@@ -197,7 +197,7 @@ export default async function LoginPage() { }} > -

+

Newest citizens

@@ -254,7 +254,7 @@ export default async function LoginPage() { }} > -

+

{t("title")}

diff --git a/src/app/(site)/page.tsx b/src/app/(site)/page.tsx index f3458ac5..a644390b 100644 --- a/src/app/(site)/page.tsx +++ b/src/app/(site)/page.tsx @@ -147,7 +147,7 @@ export default async function Home() {

@@ -261,7 +261,7 @@ export default async function Home() { }} > -

+

Login

@@ -274,7 +274,7 @@ export default async function Home() {
Register
- + {tp("register")} @@ -288,7 +288,7 @@ export default async function Home() { }} > -

+

{tp("latestUsers", { count: users.toLocaleString() })}

@@ -326,7 +326,7 @@ export default async function Home() { >
-

+

{tp("latestNews")}

@@ -399,7 +399,7 @@ export default async function Home() { }} > -

+

{hotelName} Features

@@ -446,7 +446,7 @@ export default async function Home() {
-

+

{th("nitroClient")}

@@ -481,7 +481,7 @@ export default async function Home() { >

-

+

{tp("recentUsers")}

@@ -525,7 +525,7 @@ export default async function Home() { borderColor: "color-mix(in srgb, var(--color-primary) 15%, transparent)", }} > -

+

{tp("joinNow", { hotelName })}

@@ -557,7 +557,7 @@ export default async function Home() { }} > -

+

{tp("recentPhotos")}

diff --git a/src/app/(site)/register/page.tsx b/src/app/(site)/register/page.tsx index aae99b9e..ee9059ef 100644 --- a/src/app/(site)/register/page.tsx +++ b/src/app/(site)/register/page.tsx @@ -124,7 +124,7 @@ export default async function RegisterPage() {

{tpr("title")} — {hotelName}

@@ -149,7 +149,7 @@ export default async function RegisterPage() { }} > -

+

{tpr("whoIsOnline")}

@@ -201,7 +201,7 @@ export default async function RegisterPage() { }} > -

+

Newest citizens

@@ -263,7 +263,7 @@ export default async function RegisterPage() { }} > -

+

{tpr("title")}

diff --git a/src/app/(site)/settings/page.tsx b/src/app/(site)/settings/page.tsx index 3c86ae16..85293237 100644 --- a/src/app/(site)/settings/page.tsx +++ b/src/app/(site)/settings/page.tsx @@ -67,7 +67,7 @@ export default async function SettingsPage() {

{t("accountSettings")}

@@ -94,7 +94,7 @@ export default async function SettingsPage() { }} > -

+

{t("publicProfile")}

@@ -144,7 +144,7 @@ export default async function SettingsPage() { }} > -

+

{t("changeMotto")}

@@ -206,7 +206,7 @@ export default async function SettingsPage() { }} > -

+

{t("securityTitle")}

diff --git a/src/components/pwa-register.tsx b/src/components/pwa-register.tsx index 2c583e38..ceae31aa 100644 --- a/src/components/pwa-register.tsx +++ b/src/components/pwa-register.tsx @@ -2,12 +2,19 @@ import { useEffect } from "react"; -/** Registers the service worker (PWA) once, after hydration. No-op on failure. */ +const SW_VERSION = "3"; + export function PwaRegister() { useEffect(() => { - if (typeof navigator !== "undefined" && "serviceWorker" in navigator) { - navigator.serviceWorker.register("/sw.js").catch(() => {}); - } + if (typeof navigator === "undefined" || !("serviceWorker" in navigator)) return; + + navigator.serviceWorker.getRegistrations().then((regs) => { + for (const reg of regs) { + reg.unregister(); + } + }); + + navigator.serviceWorker.register("/sw.js?" + SW_VERSION).catch(() => {}); }, []); return null; } diff --git a/src/components/site-header.tsx b/src/components/site-header.tsx index 8a07e8b0..3bc2c9e1 100644 --- a/src/components/site-header.tsx +++ b/src/components/site-header.tsx @@ -89,7 +89,7 @@ export async function SiteHeader() {