From ba75544f684b4266231b385fddee6878ee88e753 Mon Sep 17 00:00:00 2001 From: Kantine Wrapper Date: Thu, 26 Feb 2026 10:18:50 +0100 Subject: [PATCH] fix: session loss and order alarm rendering across unauthenticated sessions (v1.4.30) --- changelog.md | 4 ++++ kantine.js | 45 +++++++++++++++++++++++++-------------------- version.txt | 2 +- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/changelog.md b/changelog.md index 0f8f3cd..d953c4f 100755 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,7 @@ +## v1.4.30 +- 🐛 **Bugfix**: Login-Sitzung (`authToken` etc.) wird nun in der `localStorage` statt `sessionStorage` gespeichert, wodurch die Anmeldung beim Öffnen von Bookmarklets in neuen Tabs/Fenstern erhalten bleibt. +- 🐛 **Bugfix**: Bestell-Erinnerungscountdown und Alarm-Notifications erscheinen nun nur noch fĂŒr angemeldete Nutzer. + ## v1.4.29 - 🐛 **Bugfix**: Favicon-Injection in `install.html` mit `setTimeout(0)` verzögert, sodass sie nach dem `document.write()` von htmlpreview.github.io lĂ€uft. Chrome erkennt Favicon-Änderungen erst im nĂ€chsten Event-Loop-Tick. diff --git a/kantine.js b/kantine.js index 44d888e..2fe4544 100755 --- a/kantine.js +++ b/kantine.js @@ -29,8 +29,8 @@ let currentWeekNumber = getISOWeek(new Date()); let currentYear = new Date().getFullYear(); let displayMode = 'this-week'; - let authToken = sessionStorage.getItem('kantine_authToken'); - let currentUser = sessionStorage.getItem('kantine_currentUser'); + let authToken = localStorage.getItem('kantine_authToken'); + let currentUser = localStorage.getItem('kantine_currentUser'); let orderMap = new Map(); let userFlags = new Set(JSON.parse(localStorage.getItem('kantine_flags') || '[]')); let pollIntervalId = null; @@ -345,7 +345,6 @@ btnClearCache.addEventListener('click', () => { if (confirm('Möchtest du wirklich alle lokalen Daten (inkl. Login-Session, Cache und Einstellungen) löschen? Die Seite wird danach neu geladen.')) { localStorage.clear(); - sessionStorage.clear(); window.location.reload(); } }); @@ -459,8 +458,8 @@ if (response.ok) { authToken = data.key; currentUser = employeeId; - sessionStorage.setItem('kantine_authToken', data.key); - sessionStorage.setItem('kantine_currentUser', employeeId); + localStorage.setItem('kantine_authToken', data.key); + localStorage.setItem('kantine_currentUser', employeeId); // Fetch user name try { @@ -469,8 +468,8 @@ }); if (userResp.ok) { const userData = await userResp.json(); - if (userData.first_name) sessionStorage.setItem('kantine_firstName', userData.first_name); - if (userData.last_name) sessionStorage.setItem('kantine_lastName', userData.last_name); + if (userData.first_name) localStorage.setItem('kantine_firstName', userData.first_name); + if (userData.last_name) localStorage.setItem('kantine_lastName', userData.last_name); } } catch (err) { console.error('Failed to fetch user info:', err); @@ -500,10 +499,10 @@ // Logout btnLogout.addEventListener('click', () => { - sessionStorage.removeItem('kantine_authToken'); - sessionStorage.removeItem('kantine_currentUser'); - sessionStorage.removeItem('kantine_firstName'); - sessionStorage.removeItem('kantine_lastName'); + localStorage.removeItem('kantine_authToken'); + localStorage.removeItem('kantine_currentUser'); + localStorage.removeItem('kantine_firstName'); + localStorage.removeItem('kantine_lastName'); authToken = null; currentUser = null; orderMap = new Map(); @@ -524,13 +523,13 @@ if (parsed.auth && parsed.auth.token) { console.log('Found existing Bessa session!'); authToken = parsed.auth.token; - sessionStorage.setItem('kantine_authToken', authToken); + localStorage.setItem('kantine_authToken', authToken); if (parsed.auth.user) { currentUser = parsed.auth.user.id || 'unknown'; - sessionStorage.setItem('kantine_currentUser', currentUser); - if (parsed.auth.user.firstName) sessionStorage.setItem('kantine_firstName', parsed.auth.user.firstName); - if (parsed.auth.user.lastName) sessionStorage.setItem('kantine_lastName', parsed.auth.user.lastName); + localStorage.setItem('kantine_currentUser', currentUser); + if (parsed.auth.user.firstName) localStorage.setItem('kantine_firstName', parsed.auth.user.firstName); + if (parsed.auth.user.lastName) localStorage.setItem('kantine_lastName', parsed.auth.user.lastName); } } } @@ -539,9 +538,9 @@ } } - authToken = sessionStorage.getItem('kantine_authToken'); - currentUser = sessionStorage.getItem('kantine_currentUser'); - const firstName = sessionStorage.getItem('kantine_firstName'); + authToken = localStorage.getItem('kantine_authToken'); + currentUser = localStorage.getItem('kantine_currentUser'); + const firstName = localStorage.getItem('kantine_firstName'); const btnLoginOpen = document.getElementById('btn-login-open'); const userInfo = document.getElementById('user-info'); const userIdDisplay = document.getElementById('user-id-display'); @@ -2214,6 +2213,12 @@ // === Order Countdown === function updateCountdown() { + // Only show order alarms for logged-in users + if (!authToken || !currentUser) { + removeCountdown(); + return; + } + const now = new Date(); const currentDay = now.getDay(); // Skip weekends (0=Sun, 6=Sat) @@ -2278,7 +2283,7 @@ // Notification logic (One time) const notifiedKey = `kantine_notified_${todayStr}`; - if (!sessionStorage.getItem(notifiedKey)) { + if (!localStorage.getItem(notifiedKey)) { if (Notification.permission === 'granted') { new Notification('Kantine: Bestellschluss naht!', { body: 'Du hast heute noch nichts bestellt. Nur noch 1 Stunde!', @@ -2287,7 +2292,7 @@ } else if (Notification.permission === 'default') { Notification.requestPermission(); } - sessionStorage.setItem(notifiedKey, 'true'); + localStorage.setItem(notifiedKey, 'true'); } } else { countdownEl.classList.remove('urgent'); diff --git a/version.txt b/version.txt index 554a63d..695d5ae 100755 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -v1.4.29 +v1.4.30