"use client"; // components/Header.jsx import React, { useState, useEffect, useRef, useCallback } from "react"; import { Icon } from "@iconify/react"; import Image from "next/image"; import { useRouter } from "next/router"; import "bootstrap-icons/font/bootstrap-icons.css"; import SettingsModal from "@/components/header/settingsModal/SettingsModal"; import { RootState } from "@/redux/store"; import { useSelector, useDispatch } from "react-redux"; import { AppDispatch } from "@/redux/store"; import { getSystemSettingsThunk } from "@/redux/thunks/getSystemSettingsThunk"; function Header() { const router = useRouter(); const [showSettingsModal, setShowSettingsModal] = useState(false); const [isAdminLoggedIn, setIsAdminLoggedIn] = useState(false); const autoLogoutTimerRef = useRef | null>(null); // Removed duplicate declaration of deviceName const handleCloseSettingsModal = () => setShowSettingsModal(false); const handleLogout = useCallback(() => { sessionStorage.removeItem("token"); // Token entfernen localStorage.setItem("isAdminLoggedIn", "false"); // Admin-Status entfernen localStorage.removeItem("adminLoginTime"); // Login-Zeitpunkt entfernen setIsAdminLoggedIn(false); // Zustand sofort aktualisieren router.push("/offline.html"); // Weiterleitung }, [router]); useEffect(() => { // Initialer Check beim Laden der Komponente const isAdmin = localStorage.getItem("isAdminLoggedIn") === "true"; setIsAdminLoggedIn(isAdmin); // Beobachten von Änderungen in localStorage const interval = setInterval(() => { const updatedIsAdmin = localStorage.getItem("isAdminLoggedIn") === "true"; if (updatedIsAdmin !== isAdminLoggedIn) { setIsAdminLoggedIn(updatedIsAdmin); } }, 500); // Überprüfung alle 500ms return () => { clearInterval(interval); // Intervall stoppen, wenn die Komponente entladen wird }; }, [isAdminLoggedIn]); // Auto-Logout nach 1 Minute (Test): nutzt adminLoginTime aus localStorage useEffect(() => { // Timer bereinigen, wenn sich der Status ändert if (autoLogoutTimerRef.current) { clearTimeout(autoLogoutTimerRef.current); autoLogoutTimerRef.current = null; } if (!isAdminLoggedIn) return; const iso = localStorage.getItem("adminLoginTime"); const loginTime = iso ? new Date(iso).getTime() : Date.now(); if (!iso) { // Falls älterer Login ohne Zeitstempel, setze jetzt try { localStorage.setItem( "adminLoginTime", new Date(loginTime).toISOString() ); } catch { void 0; // ignore write errors (e.g., storage disabled) } } // 1 Minute ab Login (60_000 ms), eine Stunde (3_600_000 ms) im Produktivbetrieb const target = loginTime + 3_600_000; const delay = Math.max(0, target - Date.now()); // Fallback: wenn Datum in Vergangenheit (z.B. Uhrzeit geändert), sofort abmelden autoLogoutTimerRef.current = setTimeout(() => { // Versuche den Button zu klicken, falls vorhanden const btn = document.querySelector( 'button[aria-label="Abmelden"]' ); if (btn) { btn.click(); } else { // Fallback direkt handleLogout(); } }, delay); return () => { if (autoLogoutTimerRef.current) { clearTimeout(autoLogoutTimerRef.current); autoLogoutTimerRef.current = null; } }; }, [isAdminLoggedIn, handleLogout]); //---------------------------------------------------------------- const dispatch = useDispatch(); const deviceName = useSelector( (state: RootState) => state.systemSettingsSlice.deviceName ); useEffect(() => { if (!deviceName) { dispatch(getSystemSettingsThunk()); } }, [deviceName, dispatch]); //---------------------------------------------------------------- // Dark/Light Mode Toggle (persisted) const [isDark, setIsDark] = useState(false); // Initial state from html class / localStorage (set by _document script before hydration) useEffect(() => { if (typeof window === "undefined") return; const html = document.documentElement; const stored = localStorage.getItem("theme"); const active = stored ? stored === "dark" : html.classList.contains("dark"); setIsDark(active); }, []); useEffect(() => { if (typeof window === "undefined") return; const html = document.documentElement; if (isDark) { html.classList.add("dark"); localStorage.setItem("theme", "dark"); } else { html.classList.remove("dark"); localStorage.setItem("theme", "light"); } }, [isDark]); // Keyboard shortcut Alt + D to toggle theme useEffect(() => { const handler = (e: KeyboardEvent) => { if (e.altKey && (e.key === "d" || e.key === "D")) { e.preventDefault(); setIsDark((d) => !d); } }; window.addEventListener("keydown", handler); return () => window.removeEventListener("keydown", handler); }, []); return (
Logo
{/* TALAS-Logo + Text nebeneinander (flexibel oben links) */}
TALAS Logo

Meldestation

{deviceName}

{/* Dark/Light Mode Toggle */}
{/* Logout-Button - nur anzeigen wenn Admin eingeloggt ist */} {isAdminLoggedIn && (
)}
{/* Warnhinweis, wenn der Admin angemeldet ist */} {isAdminLoggedIn && (
Admin-Modus aktiv
)} {showSettingsModal && ( )}
); } export default Header;