From f0c1ee338632ada961bbf2d707f805a3457522d5 Mon Sep 17 00:00:00 2001 From: rene Date: Fri, 15 May 2026 17:25:24 +0200 Subject: [PATCH] =?UTF-8?q?Fix:=20Offline-UX=20=E2=80=94=20=F0=9F=93=A1=20?= =?UTF-8?q?statt=20=F0=9F=9A=A7=20bei=20offline-Seiten,=20schnellerer=20Wa?= =?UTF-8?q?rm-up,=20mehr=20Endpoints=20gecacht=20(SW=20by-v989)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/main.py | 2 +- backend/static/js/app.js | 25 +++++++++++++++---------- backend/static/js/pages/routes.js | 3 ++- backend/static/sw.js | 12 ++++++++---- 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/backend/main.py b/backend/main.py index 16a03e5..212bcbf 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 = "988" # muss mit APP_VER in app.js übereinstimmen +APP_VER = "989" # muss mit APP_VER in app.js übereinstimmen @app.get("/.well-known/assetlinks.json") async def assetlinks(): diff --git a/backend/static/js/app.js b/backend/static/js/app.js index 70a91b3..4e8b66a 100644 --- a/backend/static/js/app.js +++ b/backend/static/js/app.js @@ -3,7 +3,7 @@ Router, State-Management, Navigation, Initialisierung. ============================================================ */ -const APP_VER = '988'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '989'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.6.0'; // ← semantische Version, wird bei make release gesetzt const IS_STAGING = location.hostname === 'staging.banyaro.app'; // Cache-Bust-Parameter nach Update-Reload sofort entfernen @@ -266,10 +266,13 @@ const App = (() => { page.module = {}; // verhindert erneutes Laden } } catch { + const _offline = !navigator.onLine; container.innerHTML = UI.emptyState({ - icon: '🚧', + icon: _offline ? '📡' : '🚧', title: pages[pageId].title, - text: 'Diese Seite ist noch in Entwicklung.', + text: _offline + ? 'Diese Seite ist offline nicht verfügbar. Bitte öffne sie einmal mit Internetverbindung, damit sie gecacht wird.' + : 'Diese Seite ist noch in Entwicklung.', }); page.module = {}; } finally { @@ -1141,17 +1144,19 @@ const App = (() => { window.App = App; // Worlds kann App.navigate() aufrufen // App starten -// Prioritäts-Seiten im Hintergrund vorladen (3s nach Start, damit Hauptinhalt nicht blockiert) +// Prioritäts-Seiten im Hintergrund vorladen (1s nach Start) window.addEventListener('load', () => { setTimeout(() => { - if (!('caches' in window)) return; - ['admin','erste-hilfe','diary','map','walks','routes','poison','lost'].forEach(page => { + if (!navigator.onLine) return; + // Page-Scripts cachen + [ + 'admin','erste-hilfe','diary','map','walks','routes','poison','lost', + 'expenses','wetter','forum','health','uebungen','trainingsplaene','notes', + ].forEach(page => { const key = `Page_${page.replace(/-/g,'_')}`; - if (!window[key]) { - fetch(`/js/pages/${page}.js?v=${APP_VER}`).catch(() => {}); - } + if (!window[key]) fetch(`/js/pages/${page}.js?v=${APP_VER}`).catch(() => {}); }); - }, 3000); + }, 1000); }); document.addEventListener('DOMContentLoaded', () => { diff --git a/backend/static/js/pages/routes.js b/backend/static/js/pages/routes.js index de6fbe2..4689ded 100644 --- a/backend/static/js/pages/routes.js +++ b/backend/static/js/pages/routes.js @@ -668,7 +668,8 @@ window.Page_routes = (() => { if (!_appState.user) { UI.toast.warning('Bitte anmelden.'); return; } if (_recOvl) return; - await UI.loadLeaflet?.() ?? Promise.resolve(); + try { await (UI.loadLeaflet?.() ?? Promise.resolve()); } + catch { UI.toast.warning('Karte offline nicht verfügbar — GPS-Aufzeichnung läuft trotzdem.'); } const ovl = document.createElement('div'); ovl.id = 'rk-rec-ovl'; diff --git a/backend/static/sw.js b/backend/static/sw.js index d01b2bd..e654eab 100644 --- a/backend/static/sw.js +++ b/backend/static/sw.js @@ -3,7 +3,7 @@ Offline-Cache + Push Notifications + Tile-Cache ============================================================ */ -const CACHE_VERSION = 'by-v988'; +const CACHE_VERSION = 'by-v989'; const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache @@ -140,10 +140,14 @@ const _CACHEABLE_GET = [ /^\/api\/training\/plan-progress/, /^\/api\/wiki\/rassen/, /^\/api\/dogs\/\d+\/diary\/stats/, - /^\/api\/routes$/, - /^\/api\/places$/, - /^\/api\/breeder\/map-markers$/, + /^\/api\/routes/, + /^\/api\/places/, + /^\/api\/breeder\/map-markers/, /^\/api\/gassi-zeiten/, + /^\/api\/poison/, + /^\/api\/walks/, + /^\/api\/lost/, + /^\/api\/expenses/, // Drei Welten — offline-fähig /^\/api\/streak\/\d+/, /^\/api\/forum\/threads/,