diff --git a/CHANGELOG.md b/CHANGELOG.md index b8a6c82..476a64d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.22.1] - 2026-04-21 + +### Fixed +- App no longer gets stuck on the "Oikos" splash screen when opened in a new tab. Two root causes addressed: (1) `sw.js` was not updated in v0.22.0, so the browser kept the old Service Worker and served stale cached files (old `router.js`, `meals.js`) via Stale-While-Revalidate — cache versions are now bumped (shell v35, pages v30) to force reinstallation and fresh file delivery. (2) A fatal error in `initI18n()` (e.g. locale fetch failure offline) left the splash screen visible forever — the router IIFE now catches such errors, hides the splash screen, and renders a recoverable error state. +- Service Worker now pre-caches `/pages/recipes.js` and `/styles/recipes.css` introduced in v0.22.0, enabling offline access to the Recipes page. + ## [0.22.0] - 2026-04-21 ### Added diff --git a/package-lock.json b/package-lock.json index f64d934..8654442 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "oikos", - "version": "0.22.0", + "version": "0.22.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "oikos", - "version": "0.22.0", + "version": "0.22.1", "license": "MIT", "dependencies": { "bcrypt": "^6.0.0", diff --git a/package.json b/package.json index 4a47d5c..ee1f824 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "oikos", - "version": "0.22.0", + "version": "0.22.1", "description": "Self-hosted family planner - calendar, tasks, shopping, meal planning, budget and more. Private, open-source, no subscription.", "main": "server/index.js", "type": "module", diff --git a/public/router.js b/public/router.js index 9cf46f1..6a677ad 100644 --- a/public/router.js +++ b/public/router.js @@ -858,8 +858,15 @@ if (/iPhone|iPad|iPod/.test(navigator.userAgent)) { // Initialisierung // -------------------------------------------------------- (async () => { - await initI18n(); - navigate(location.pathname, false); + try { + await initI18n(); + navigate(location.pathname, false); + } catch (err) { + console.error('[Router] Initialisierung fehlgeschlagen:', err); + const loading = document.getElementById('app-loading'); + if (loading) loading.hidden = true; + renderError(document.getElementById('app'), err); + } })(); // Globale Exporte diff --git a/public/sw.js b/public/sw.js index 3c4d3f1..73ffaed 100644 --- a/public/sw.js +++ b/public/sw.js @@ -12,8 +12,8 @@ * API: Immer Netzwerk (kein Caching von Nutzerdaten) */ -const SHELL_CACHE = 'oikos-shell-v34'; -const PAGES_CACHE = 'oikos-pages-v29'; +const SHELL_CACHE = 'oikos-shell-v35'; +const PAGES_CACHE = 'oikos-pages-v30'; const ASSETS_CACHE = 'oikos-assets-v27'; const ALL_CACHES = [SHELL_CACHE, PAGES_CACHE, ASSETS_CACHE]; @@ -50,6 +50,7 @@ const APP_SHELL = [ '/styles/contacts.css', '/styles/budget.css', '/styles/settings.css', + '/styles/recipes.css', '/components/oikos-install-prompt.js', '/offline.html', '/manifest.json', @@ -74,6 +75,7 @@ const PAGE_MODULES = [ '/pages/budget.js', '/pages/settings.js', '/pages/login.js', + '/pages/recipes.js', ]; // --------------------------------------------------------