fix: session loss and order alarm rendering across unauthenticated sessions (v1.4.30)

This commit is contained in:
Kantine Wrapper
2026-02-26 10:18:50 +01:00
parent 7fdf7f6f3e
commit ba75544f68
3 changed files with 30 additions and 21 deletions

View File

@@ -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 ## 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. - 🐛 **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.

View File

@@ -29,8 +29,8 @@
let currentWeekNumber = getISOWeek(new Date()); let currentWeekNumber = getISOWeek(new Date());
let currentYear = new Date().getFullYear(); let currentYear = new Date().getFullYear();
let displayMode = 'this-week'; let displayMode = 'this-week';
let authToken = sessionStorage.getItem('kantine_authToken'); let authToken = localStorage.getItem('kantine_authToken');
let currentUser = sessionStorage.getItem('kantine_currentUser'); let currentUser = localStorage.getItem('kantine_currentUser');
let orderMap = new Map(); let orderMap = new Map();
let userFlags = new Set(JSON.parse(localStorage.getItem('kantine_flags') || '[]')); let userFlags = new Set(JSON.parse(localStorage.getItem('kantine_flags') || '[]'));
let pollIntervalId = null; let pollIntervalId = null;
@@ -345,7 +345,6 @@
btnClearCache.addEventListener('click', () => { 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.')) { 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(); localStorage.clear();
sessionStorage.clear();
window.location.reload(); window.location.reload();
} }
}); });
@@ -459,8 +458,8 @@
if (response.ok) { if (response.ok) {
authToken = data.key; authToken = data.key;
currentUser = employeeId; currentUser = employeeId;
sessionStorage.setItem('kantine_authToken', data.key); localStorage.setItem('kantine_authToken', data.key);
sessionStorage.setItem('kantine_currentUser', employeeId); localStorage.setItem('kantine_currentUser', employeeId);
// Fetch user name // Fetch user name
try { try {
@@ -469,8 +468,8 @@
}); });
if (userResp.ok) { if (userResp.ok) {
const userData = await userResp.json(); const userData = await userResp.json();
if (userData.first_name) sessionStorage.setItem('kantine_firstName', userData.first_name); if (userData.first_name) localStorage.setItem('kantine_firstName', userData.first_name);
if (userData.last_name) sessionStorage.setItem('kantine_lastName', userData.last_name); if (userData.last_name) localStorage.setItem('kantine_lastName', userData.last_name);
} }
} catch (err) { } catch (err) {
console.error('Failed to fetch user info:', err); console.error('Failed to fetch user info:', err);
@@ -500,10 +499,10 @@
// Logout // Logout
btnLogout.addEventListener('click', () => { btnLogout.addEventListener('click', () => {
sessionStorage.removeItem('kantine_authToken'); localStorage.removeItem('kantine_authToken');
sessionStorage.removeItem('kantine_currentUser'); localStorage.removeItem('kantine_currentUser');
sessionStorage.removeItem('kantine_firstName'); localStorage.removeItem('kantine_firstName');
sessionStorage.removeItem('kantine_lastName'); localStorage.removeItem('kantine_lastName');
authToken = null; authToken = null;
currentUser = null; currentUser = null;
orderMap = new Map(); orderMap = new Map();
@@ -524,13 +523,13 @@
if (parsed.auth && parsed.auth.token) { if (parsed.auth && parsed.auth.token) {
console.log('Found existing Bessa session!'); console.log('Found existing Bessa session!');
authToken = parsed.auth.token; authToken = parsed.auth.token;
sessionStorage.setItem('kantine_authToken', authToken); localStorage.setItem('kantine_authToken', authToken);
if (parsed.auth.user) { if (parsed.auth.user) {
currentUser = parsed.auth.user.id || 'unknown'; currentUser = parsed.auth.user.id || 'unknown';
sessionStorage.setItem('kantine_currentUser', currentUser); localStorage.setItem('kantine_currentUser', currentUser);
if (parsed.auth.user.firstName) sessionStorage.setItem('kantine_firstName', parsed.auth.user.firstName); if (parsed.auth.user.firstName) localStorage.setItem('kantine_firstName', parsed.auth.user.firstName);
if (parsed.auth.user.lastName) sessionStorage.setItem('kantine_lastName', parsed.auth.user.lastName); if (parsed.auth.user.lastName) localStorage.setItem('kantine_lastName', parsed.auth.user.lastName);
} }
} }
} }
@@ -539,9 +538,9 @@
} }
} }
authToken = sessionStorage.getItem('kantine_authToken'); authToken = localStorage.getItem('kantine_authToken');
currentUser = sessionStorage.getItem('kantine_currentUser'); currentUser = localStorage.getItem('kantine_currentUser');
const firstName = sessionStorage.getItem('kantine_firstName'); const firstName = localStorage.getItem('kantine_firstName');
const btnLoginOpen = document.getElementById('btn-login-open'); const btnLoginOpen = document.getElementById('btn-login-open');
const userInfo = document.getElementById('user-info'); const userInfo = document.getElementById('user-info');
const userIdDisplay = document.getElementById('user-id-display'); const userIdDisplay = document.getElementById('user-id-display');
@@ -2214,6 +2213,12 @@
// === Order Countdown === // === Order Countdown ===
function updateCountdown() { function updateCountdown() {
// Only show order alarms for logged-in users
if (!authToken || !currentUser) {
removeCountdown();
return;
}
const now = new Date(); const now = new Date();
const currentDay = now.getDay(); const currentDay = now.getDay();
// Skip weekends (0=Sun, 6=Sat) // Skip weekends (0=Sun, 6=Sat)
@@ -2278,7 +2283,7 @@
// Notification logic (One time) // Notification logic (One time)
const notifiedKey = `kantine_notified_${todayStr}`; const notifiedKey = `kantine_notified_${todayStr}`;
if (!sessionStorage.getItem(notifiedKey)) { if (!localStorage.getItem(notifiedKey)) {
if (Notification.permission === 'granted') { if (Notification.permission === 'granted') {
new Notification('Kantine: Bestellschluss naht!', { new Notification('Kantine: Bestellschluss naht!', {
body: 'Du hast heute noch nichts bestellt. Nur noch 1 Stunde!', body: 'Du hast heute noch nichts bestellt. Nur noch 1 Stunde!',
@@ -2287,7 +2292,7 @@
} else if (Notification.permission === 'default') { } else if (Notification.permission === 'default') {
Notification.requestPermission(); Notification.requestPermission();
} }
sessionStorage.setItem(notifiedKey, 'true'); localStorage.setItem(notifiedKey, 'true');
} }
} else { } else {
countdownEl.classList.remove('urgent'); countdownEl.classList.remove('urgent');

View File

@@ -1 +1 @@
v1.4.29 v1.4.30