From b34ed79d2b03fc0b6451abfcdbe5785fad20d750 Mon Sep 17 00:00:00 2001 From: DanielS Date: Wed, 24 Jun 2026 01:09:17 +0200 Subject: [PATCH] feat: implement next redirect flow, remove inactivity auto-logout, and add concurrent session termination notification --- shop/components/NavbarClient.tsx | 4 +-- shop/components/inactivity-tracker.tsx | 36 +++----------------------- shop/components/login-form.tsx | 11 ++++++++ 3 files changed, 16 insertions(+), 35 deletions(-) diff --git a/shop/components/NavbarClient.tsx b/shop/components/NavbarClient.tsx index e7ecce6..72cc387 100644 --- a/shop/components/NavbarClient.tsx +++ b/shop/components/NavbarClient.tsx @@ -195,7 +195,7 @@ export function NavbarClient({ user, role = "partner" }: NavbarClientProps) { ) : ( )} @@ -285,7 +285,7 @@ export function NavbarClient({ user, role = "partner" }: NavbarClientProps) { ) : ( )} diff --git a/shop/components/inactivity-tracker.tsx b/shop/components/inactivity-tracker.tsx index 832fba4..8ba36b9 100644 --- a/shop/components/inactivity-tracker.tsx +++ b/shop/components/inactivity-tracker.tsx @@ -25,20 +25,7 @@ export function InactivityTracker() { ); useEffect(() => { - const INACTIVITY_LIMIT = 5 * 60 * 1000; // 5 Minuten in ms - - const updateActivity = () => { - localStorage.setItem("last_activity", Date.now().toString()); - }; - - // Events zum Tracken der Benutzerinteraktion - const events = ["mousemove", "keydown", "mousedown", "touchstart", "scroll", "click"]; - events.forEach((event) => window.addEventListener(event, updateActivity)); - - // Aktivitätszeitstempel beim Mounten initialisieren - updateActivity(); - - // Regelmäßige Überprüfung der Inaktivität + // Regelmäßige Überprüfung der Session-Gültigkeit (z.B. wegen Login auf anderem Browser/Gerät) const interval = setInterval(async () => { const { data: { session } } = await supabase.auth.getSession(); if (!session) return; // Nicht eingeloggt, keine Prüfung nötig @@ -49,32 +36,15 @@ export function InactivityTracker() { try { await signOut(); } catch (e) { - console.error("Fehler beim Inactivity-Server-Signout:", e); + console.error("Fehler beim Server-Signout nach Session-Verlust:", e); } await supabase.auth.signOut(); - localStorage.removeItem("last_activity"); - router.push("/"); - router.refresh(); - return; - } - - const lastActivity = Number(localStorage.getItem("last_activity") || Date.now()); - if (Date.now() - lastActivity > INACTIVITY_LIMIT) { - // Bei Überschreitung abmelden - try { - await signOut(); - } catch (e) { - console.error("Fehler beim Inactivity-Server-Signout:", e); - } - await supabase.auth.signOut(); - localStorage.removeItem("last_activity"); - router.push("/"); + router.push("/auth/login?message=concurrent"); router.refresh(); } }, 5000); // Prüfung alle 5 Sekunden return () => { - events.forEach((event) => window.removeEventListener(event, updateActivity)); clearInterval(interval); }; }, [supabase, router]); diff --git a/shop/components/login-form.tsx b/shop/components/login-form.tsx index 5bbfa1d..468b189 100644 --- a/shop/components/login-form.tsx +++ b/shop/components/login-form.tsx @@ -90,6 +90,17 @@ export function LoginForm({ onChange={(e) => setPassword(e.target.value)} /> + {(() => { + const messageParam = typeof window !== 'undefined' ? new URLSearchParams(window.location.search).get('message') : null; + if (messageParam === "concurrent") { + return ( +

+ Sie wurden abgemeldet, da Sie sich an einem anderen Gerät angemeldet haben. +

+ ); + } + return null; + })()} {error &&

{error}

}