diff --git a/backend/main.py b/backend/main.py index d4f52c9..00b602e 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 = "1077" # muss mit APP_VER in app.js übereinstimmen +APP_VER = "1078" # 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 a85acae..d26e715 100644 --- a/backend/static/index.html +++ b/backend/static/index.html @@ -101,9 +101,9 @@ - - - + + +
@@ -635,11 +635,11 @@ - - - - - + + + + + diff --git a/backend/static/js/app.js b/backend/static/js/app.js index cd1b1c3..45215d2 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 = '1077'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '1078'; // ← 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. diff --git a/backend/static/js/offline-indicator.js b/backend/static/js/offline-indicator.js index 0d5b9a7..881a9f6 100644 --- a/backend/static/js/offline-indicator.js +++ b/backend/static/js/offline-indicator.js @@ -10,7 +10,7 @@ window.OfflineIndicator = (() => { // Cache-Namen — müssen mit sw.js übereinstimmen const CACHE_STATIC = `by-v${(window.APP_VER || '0')}-static`; const CACHE_TILES = 'ban-yaro-tiles-v1'; - const CACHE_API = 'by-api'; + const CACHE_API = 'ban-yaro-api-v1'; const TILE_MIN = 50; // Mindest-Tiles für Stufe 4 // 5 Offline-Bereitschafts-Checks, in Reihenfolge der Pfoten-Stufen @@ -51,13 +51,14 @@ window.OfflineIndicator = (() => { return keys.length >= TILE_MIN; } }, - { step: 5, title: 'Tagebuch-Fotos', - detail: 'Vorschau-Bilder der letzten Einträge', + { step: 5, title: 'Training & Wissen', + detail: 'Übungen, Wiki-Rassen, Wetter — Welt-Inhalte', probe: async () => { const c = await caches.open(CACHE_API).catch(() => null); if (!c) return false; - const keys = await c.keys(); - return keys.some(r => r.url.includes('/data/diary/') && r.url.includes('_preview')); + const urls = (await c.keys()).map(r => r.url); + return urls.some(u => u.includes('/api/training/exercises')) + && urls.some(u => u.includes('/api/wiki/rassen')); } }, ]; @@ -180,18 +181,9 @@ window.OfflineIndicator = (() => { } } } else if (m.step === 5) { - const dogId = window._appState?.activeDog?.id; - if (dogId) { - try { - const entries = await fetch(`/api/dogs/${dogId}/diary?limit=10`).then(r => r.json()); - (entries || []).slice(0, 10).forEach(e => { - if (e.cover_url) tasks.push(fetch(e.cover_url).catch(() => {})); - (e.media_items || []).slice(0, 3).forEach(m => { - if (m.url) tasks.push(fetch(m.url).catch(() => {})); - }); - }); - } catch {} - } + tasks.push(fetch('/api/training/exercises').catch(() => {})); + tasks.push(fetch('/api/wiki/rassen?limit=50').catch(() => {})); + tasks.push(fetch('/api/weather').catch(() => {})); } } await Promise.all(tasks); diff --git a/backend/static/sw.js b/backend/static/sw.js index 9e0ba5a..54ba328 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 = '1077'; +const VER = '1078'; const CACHE_VERSION = `by-v${VER}`; const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten