Fix: Offline-Indicator Cache-Namen + Step-5-Check, SW by-v1078

- CACHE_API hieß bei mir 'by-api', tatsächlich aber 'ban-yaro-api-v1'
  → korrigiert, sonst hätte step 3+5 nie grün werden können
- Step 5 prüfte auf gecachte Diary-Foto-Previews — die werden vom SW
  aber gar nicht gecacht (nur API-Routen sind in _CACHEABLE_GET).
  Stattdessen jetzt 'Training & Wissen' (training/exercises +
  wiki/rassen) — ist im SW-Cache abgedeckt und passt zur WELT-Welt
- _fetchMissing für Step 5 entsprechend angepasst
This commit is contained in:
rene 2026-05-26 14:18:47 +02:00
parent 8097d21605
commit 776641fa65
5 changed files with 20 additions and 28 deletions

View file

@ -410,7 +410,7 @@ async def serve_media(path: str, request: _Request):
raise _HE(404, "Nicht gefunden.") raise _HE(404, "Nicht gefunden.")
return _media_response(filepath) 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") @app.get("/.well-known/assetlinks.json")
async def assetlinks(): async def assetlinks():

View file

@ -101,9 +101,9 @@
</script> </script>
<!-- CSS: Reihenfolge ist wichtig — ?v= zwingt Browser zur Neuladung --> <!-- CSS: Reihenfolge ist wichtig — ?v= zwingt Browser zur Neuladung -->
<link rel="stylesheet" href="/css/design-system.css?v=1077"> <link rel="stylesheet" href="/css/design-system.css?v=1078">
<link rel="stylesheet" href="/css/layout.css?v=1077"> <link rel="stylesheet" href="/css/layout.css?v=1078">
<link rel="stylesheet" href="/css/components.css?v=1077"> <link rel="stylesheet" href="/css/components.css?v=1078">
</head> </head>
<body> <body>
@ -635,11 +635,11 @@
<div id="modal-container"></div> <div id="modal-container"></div>
<!-- JS: Reihenfolge ist wichtig — erst Basis, dann Features --> <!-- JS: Reihenfolge ist wichtig — erst Basis, dann Features -->
<script src="/js/api.js?v=1077"></script> <script src="/js/api.js?v=1078"></script>
<script src="/js/ui.js?v=1077"></script> <script src="/js/ui.js?v=1078"></script>
<script src="/js/app.js?v=1077"></script> <script src="/js/app.js?v=1078"></script>
<script src="/js/worlds.js?v=1077"></script> <script src="/js/worlds.js?v=1078"></script>
<script src="/js/offline-indicator.js?v=1077"></script> <script src="/js/offline-indicator.js?v=1078"></script>
<!-- Feature-Seiten werden lazy geladen --> <!-- Feature-Seiten werden lazy geladen -->

View file

@ -3,7 +3,7 @@
Router, State-Management, Navigation, Initialisierung. 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 APP_VERSION = '1.6.0'; // ← semantische Version, wird bei make release gesetzt
const IS_STAGING = location.hostname === 'staging.banyaro.app'; const IS_STAGING = location.hostname === 'staging.banyaro.app';
// Cache-Bust-Parameter nach Update-Reload sofort entfernen. // Cache-Bust-Parameter nach Update-Reload sofort entfernen.

View file

@ -10,7 +10,7 @@ window.OfflineIndicator = (() => {
// Cache-Namen — müssen mit sw.js übereinstimmen // Cache-Namen — müssen mit sw.js übereinstimmen
const CACHE_STATIC = `by-v${(window.APP_VER || '0')}-static`; const CACHE_STATIC = `by-v${(window.APP_VER || '0')}-static`;
const CACHE_TILES = 'ban-yaro-tiles-v1'; 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 const TILE_MIN = 50; // Mindest-Tiles für Stufe 4
// 5 Offline-Bereitschafts-Checks, in Reihenfolge der Pfoten-Stufen // 5 Offline-Bereitschafts-Checks, in Reihenfolge der Pfoten-Stufen
@ -51,13 +51,14 @@ window.OfflineIndicator = (() => {
return keys.length >= TILE_MIN; return keys.length >= TILE_MIN;
} }, } },
{ step: 5, title: 'Tagebuch-Fotos', { step: 5, title: 'Training & Wissen',
detail: 'Vorschau-Bilder der letzten Einträge', detail: 'Übungen, Wiki-Rassen, Wetter — Welt-Inhalte',
probe: async () => { probe: async () => {
const c = await caches.open(CACHE_API).catch(() => null); const c = await caches.open(CACHE_API).catch(() => null);
if (!c) return false; if (!c) return false;
const keys = await c.keys(); const urls = (await c.keys()).map(r => r.url);
return keys.some(r => r.url.includes('/data/diary/') && r.url.includes('_preview')); 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) { } else if (m.step === 5) {
const dogId = window._appState?.activeDog?.id; tasks.push(fetch('/api/training/exercises').catch(() => {}));
if (dogId) { tasks.push(fetch('/api/wiki/rassen?limit=50').catch(() => {}));
try { tasks.push(fetch('/api/weather').catch(() => {}));
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 {}
}
} }
} }
await Promise.all(tasks); await Promise.all(tasks);

View file

@ -4,7 +4,7 @@
============================================================ */ ============================================================ */
// ← EINZIGE Stelle für die Version — STATIC_ASSETS und CACHE_VERSION leiten sich ab // ← 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_VERSION = `by-v${VER}`;
const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_STATIC = `${CACHE_VERSION}-static`;
const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten