Files
webshop/shop/components/inactivity-tracker.tsx
DanielS 47664c0aae
All checks were successful
Staging Build / build (push) Successful in 2m18s
fix: resolve mixed content errors by synchronizing client supabase URL protocol with window location protocol
2026-06-24 00:57:22 +02:00

84 lines
2.7 KiB
TypeScript

"use client";
import { useEffect } from "react";
import { createBrowserClient } from "@supabase/ssr";
import { useRouter } from "next/navigation";
import { signOut } from "@/lib/actions/auth";
import { resolveSupabaseUrl } from "@/lib/utils";
export function InactivityTracker() {
const router = useRouter();
// Supabase URL & Anon Key auslesen (für Browser-Client)
const supabaseUrl = process.env.SUPABASE_URL || process.env.NEXT_PUBLIC_SUPABASE_URL;
const supabaseAnonKey = process.env.SUPABASE_ANON_KEY || process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY || process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY;
// Browser Client inline erstellen
const supabase = createBrowserClient(
resolveSupabaseUrl(supabaseUrl)!,
supabaseAnonKey!,
{
cookieOptions: {
name: "webshop-auth-token",
},
}
);
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
const interval = setInterval(async () => {
const { data: { session } } = await supabase.auth.getSession();
if (!session) return; // Nicht eingeloggt, keine Prüfung nötig
// Prüfen, ob die Session auf dem Server noch gültig ist (z.B. wegen Login auf anderem Browser)
const { data: { user }, error } = await supabase.auth.getUser();
if (error || !user) {
try {
await signOut();
} catch (e) {
console.error("Fehler beim Inactivity-Server-Signout:", 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.refresh();
}
}, 5000); // Prüfung alle 5 Sekunden
return () => {
events.forEach((event) => window.removeEventListener(event, updateActivity));
clearInterval(interval);
};
}, [supabase, router]);
return null;
}