class AutoLogoutManager { constructor() { this.timer = null; this.warningTimer = null; this.timeout = 60; // Standard: 60 Minuten this.warningTime = 5; // Warnung 5 Minuten vor Logout this.isWarningShown = false; this.init(); } async init() { await this.loadSettings(); this.setupActivityListeners(); this.startTimer(); } async loadSettings() { try { const response = await fetch('/api/user/settings'); if (response.ok) { const data = await response.json(); if (data.success && data.settings.privacy?.auto_logout) { const timeout = parseInt(data.settings.privacy.auto_logout); if (timeout > 0 && timeout !== 'never') { this.timeout = timeout; } else { this.timeout = 0; // Deaktiviert } } } } catch (error) { console.warn('Auto-Logout-Einstellungen konnten nicht geladen werden:', error); } } setupActivityListeners() { const events = ['mousedown', 'mousemove', 'keypress', 'scroll', 'touchstart', 'click']; events.forEach(event => { document.addEventListener(event, () => this.resetTimer(), { passive: true }); }); } startTimer() { if (this.timeout <= 0) return; this.clearTimers(); const timeoutMs = this.timeout * 60 * 1000; const warningMs = this.warningTime * 60 * 1000; this.warningTimer = setTimeout(() => this.showWarning(), timeoutMs - warningMs); this.timer = setTimeout(() => this.performLogout(), timeoutMs); } resetTimer() { if (this.isWarningShown) { this.closeWarning(); } this.startTimer(); } clearTimers() { if (this.timer) clearTimeout(this.timer); if (this.warningTimer) clearTimeout(this.warningTimer); } showWarning() { if (this.isWarningShown) return; this.isWarningShown = true; const modal = document.createElement('div'); modal.id = 'auto-logout-warning'; modal.className = 'fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50'; modal.innerHTML = `

Automatische Abmeldung

Sie werden in ${this.warningTime} Minuten aufgrund von Inaktivität abgemeldet.

`; document.body.appendChild(modal); document.getElementById('stay-logged-in').onclick = () => { this.closeWarning(); this.sendKeepAlive(); this.resetTimer(); }; document.getElementById('logout-now').onclick = () => { this.performLogout(); }; } closeWarning() { const modal = document.getElementById('auto-logout-warning'); if (modal) modal.remove(); this.isWarningShown = false; } async sendKeepAlive() { try { await fetch('/api/auth/keep-alive', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRFToken': this.getCSRFToken() } }); } catch (error) { console.warn('Keep-Alive fehlgeschlagen:', error); } } getCSRFToken() { const metaTag = document.querySelector('meta[name="csrf-token"]'); return metaTag ? metaTag.getAttribute('content') : ''; } async performLogout() { this.closeWarning(); this.clearTimers(); window.location.href = '/auth/logout'; } } // Initialisierung document.addEventListener('DOMContentLoaded', function() { if (!window.location.pathname.includes('/login')) { window.autoLogoutManager = new AutoLogoutManager(); } });