// components/main/settingsPageComponents/hooks/useAdminAuth.ts import { useState, useEffect } from "react"; import CryptoJS from "crypto-js"; /** * Entschlüsselt den gespeicherten Token (AES) aus sessionStorage. */ function decryptToken(encryptedToken: string) { const encryptionKey = process.env.NEXT_PUBLIC_ENCRYPTION_KEY; const encryptionIV = process.env.NEXT_PUBLIC_ENCRYPTION_IV; if (!encryptionKey || !encryptionIV) { throw new Error("Encryption key or IV is not defined."); } const key = CryptoJS.enc.Utf8.parse(encryptionKey); const iv = CryptoJS.enc.Utf8.parse(encryptionIV); const decrypted = CryptoJS.AES.decrypt(encryptedToken, key, { iv }); return JSON.parse(decrypted.toString(CryptoJS.enc.Utf8)); } export function useAdminAuth(showModal: boolean) { const [isAdminLoggedIn, setAdminLoggedIn] = useState(false); /** * Loggt den Admin aus und löscht token + localStorage */ function logoutAdmin() { sessionStorage.removeItem("token"); localStorage.setItem("isAdminLoggedIn", "false"); // KVz localStorage-Werte löschen für alle Slots const keysToRemove = []; for (let i = 0; i < localStorage.length; i++) { const key = localStorage.key(i); if (key && key.startsWith("kvz_slot_")) { keysToRemove.push(key); } } keysToRemove.forEach((key) => localStorage.removeItem(key)); setAdminLoggedIn(false); } useEffect(() => { if (showModal) { const token = sessionStorage.getItem("token"); if (token) { try { const { exp } = decryptToken(token); // ✅ Token gültig if (Date.now() < exp) { localStorage.setItem("isAdminLoggedIn", "true"); setAdminLoggedIn(true); return; } } catch (error) { console.error("❌ Token-Entschlüsselung fehlgeschlagen:", error); } } // 🔁 Fallback: prüfe ob localStorage Adminstatus hält const fromLocalStorage = localStorage.getItem("isAdminLoggedIn"); if (fromLocalStorage === "true") { setAdminLoggedIn(true); } else { logoutAdmin(); } } }, [showModal]); return { isAdminLoggedIn, logoutAdmin }; }