From 95dccd03befa6fba4fab2a09865cc81f24fa6045 Mon Sep 17 00:00:00 2001 From: rene Date: Tue, 26 May 2026 15:06:43 +0200 Subject: [PATCH] Fix: Offline-Score Cache-Detection robust, SW by-v1084 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: APP_VER war in app.js nur lokale const, nicht window.APP_VER → offline-indicator.js öffnete Cache 'by-v0-static' statt 'by-v1083-static' → fast alle Stufen blieben grau. Fixes: - app.js: window.APP_VER + window.APP_VERSION explizit setzen - offline-indicator.js: _staticCache() Helper findet den aktuellen Static-Cache per Regex /^by-v\d+-static$/ — versions-unabhängig - Step 1 (App-Shell) prüft jetzt korrekt auf design-system.css UND app.js im Static-Cache, nicht mehr caches.match() mit URL --- backend/main.py | 2 +- backend/static/index.html | 16 ++++++++-------- backend/static/js/app.js | 4 +++- backend/static/js/offline-indicator.js | 25 +++++++++++++++++-------- backend/static/sw.js | 2 +- 5 files changed, 30 insertions(+), 19 deletions(-) diff --git a/backend/main.py b/backend/main.py index 814445c..69fbf78 100644 --- a/backend/main.py +++ b/backend/main.py @@ -410,7 +410,7 @@ async def serve_media(path: str, request: _Request): raise _HE(404, "Nicht gefunden.") return _media_response(filepath) -APP_VER = "1083" # muss mit APP_VER in app.js übereinstimmen +APP_VER = "1084" # muss mit APP_VER in app.js übereinstimmen @app.get("/.well-known/assetlinks.json") async def assetlinks(): diff --git a/backend/static/index.html b/backend/static/index.html index 236ea78..8d4f29d 100644 --- a/backend/static/index.html +++ b/backend/static/index.html @@ -101,9 +101,9 @@ - - - + + + @@ -625,11 +625,11 @@ - - - - - + + + + + diff --git a/backend/static/js/app.js b/backend/static/js/app.js index 940be82..720ee0f 100644 --- a/backend/static/js/app.js +++ b/backend/static/js/app.js @@ -3,8 +3,10 @@ Router, State-Management, Navigation, Initialisierung. ============================================================ */ -const APP_VER = '1083'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '1084'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.6.0'; // ← semantische Version, wird bei make release gesetzt +window.APP_VER = APP_VER; // global verfügbar für andere Module (z.B. offline-indicator) +window.APP_VERSION = APP_VERSION; const IS_STAGING = location.hostname === 'staging.banyaro.app'; // Cache-Bust-Parameter nach Update-Reload sofort entfernen. // Flag MUSS vor replaceState gesetzt werden — index.html liest es danach. diff --git a/backend/static/js/offline-indicator.js b/backend/static/js/offline-indicator.js index 5f8336b..ea81ebb 100644 --- a/backend/static/js/offline-indicator.js +++ b/backend/static/js/offline-indicator.js @@ -8,27 +8,36 @@ window.OfflineIndicator = (() => { 'use strict'; - // Cache-Namen — müssen mit sw.js übereinstimmen - const CACHE_STATIC = `by-v${(window.APP_VER || '0')}-static`; + // Cache-Namen dynamisch finden — robust gegen Versions-Updates const CACHE_TILES = 'ban-yaro-tiles-v1'; const CACHE_API = 'ban-yaro-api-v1'; const TILE_MIN = 50; + async function _staticCache() { + const names = await caches.keys(); + const found = names.find(n => /^by-v\d+-static$/.test(n)); + return found ? await caches.open(found) : null; + } + const CHECKS = [ { step: 1, title: 'App-Grundgerüst', detail: 'CSS, Layout und Hauptmodule — die Basis', - probe: async () => (await caches.match('/css/design-system.css?v=' + window.APP_VER)) != null - || (await caches.match('/css/design-system.css')) != null }, + probe: async () => { + const c = await _staticCache(); + if (!c) return false; + const urls = (await c.keys()).map(r => r.url); + return urls.some(u => u.includes('/css/design-system.css')) + && urls.some(u => u.includes('/js/app.js')); + } }, { step: 2, title: 'Wichtige Seiten', detail: 'Tagebuch, Karte, Gassi, Erste Hilfe', probe: async () => { - const c = await caches.open(CACHE_STATIC).catch(() => null); + const c = await _staticCache(); if (!c) return false; const must = ['diary.js','map.js','walks.js','erste-hilfe.js']; - const keys = await c.keys(); - const have = keys.map(r => r.url); - return must.every(name => have.some(u => u.includes('/js/pages/' + name))); + const urls = (await c.keys()).map(r => r.url); + return must.every(name => urls.some(u => u.includes('/js/pages/' + name))); } }, { step: 3, title: 'Hund- und Tagebuchdaten', diff --git a/backend/static/sw.js b/backend/static/sw.js index 8d364e3..5dd52bb 100644 --- a/backend/static/sw.js +++ b/backend/static/sw.js @@ -4,7 +4,7 @@ ============================================================ */ // ← EINZIGE Stelle für die Version — STATIC_ASSETS und CACHE_VERSION leiten sich ab -const VER = '1083'; +const VER = '1084'; const CACHE_VERSION = `by-v${VER}`; const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten