// Layout.tsx import { useEffect, useState, ReactNode } from "react"; import { useTranslation } from "react-i18next"; import { motion, AnimatePresence } from "framer-motion"; import { Menu, X, Home, User, Briefcase, BookOpen, Phone, LayoutDashboard, } from "lucide-react"; import { supabase } from "../utils/supabaseClient"; import { ContactInfo } from "./ContactInfo"; import { NavLink } from "./NavLink"; import LanguageSwitcher from "./LanguageSwitcher"; import { Link, useLocation } from "react-router-dom"; import Footer from "./Footer"; import { useScrollContext } from "./ScrollContext"; interface LayoutProps { children: ReactNode; } const Layout = ({ children }: LayoutProps) => { const { t } = useTranslation(); const [isAdmin, setIsAdmin] = useState(false); const [scrolled, setScrolled] = useState(false); const [isMounted, setIsMounted] = useState(false); const location = useLocation(); const { isMenuOpen, setIsMenuOpen } = useScrollContext(); // Initial mount useEffect(() => { setIsMounted(true); }, []); // Schließe das Menü beim Routenwechsel useEffect(() => { setIsMenuOpen(false); }, [location.pathname, setIsMenuOpen]); // Toggle Menu const toggleMenu = () => { setIsMenuOpen(!isMenuOpen); }; // Prüfe Admin-Status und registriere den Scroll-Handler useEffect(() => { const checkAdmin = async () => { const { data, error } = await supabase.auth.getSession(); if (error) { console.error("Error checking admin status:", error); return; } if (data.session) { const { user } = data.session; const { data: adminData, error: adminError } = await supabase .from("profiles") .select("isAdmin") .eq("id", user.id) .single(); if (adminError) { console.error("Error checking admin role:", adminError); return; } setIsAdmin(adminData.isAdmin); } }; checkAdmin(); const handleScroll = () => { setScrolled(window.scrollY > 0); }; window.addEventListener("scroll", handleScroll); return () => window.removeEventListener("scroll", handleScroll); }, []); const navigationLinks = [ { path: "/", label: t("navigation.main.home"), icon: , }, { path: "/about", label: t("navigation.main.about"), icon: , }, { path: "/portfolio", label: t("navigation.main.portfolio"), icon: , }, { path: "/blog", label: t("navigation.main.blog"), icon: , }, { path: "/contact", label: t("navigation.main.contact"), icon: , }, ...(isAdmin ? [ { path: "/dashboard", label: t("navigation.admin.dashboard"), icon: , }, ] : []), ]; if (!isMounted) { return null; } return (
{/* Navigation – oberste Ebene */} {/* Mobile Menu */} {isMenuOpen && ( <> {/* Backdrop */} {/* Sidebar */} {/* Sidebar Header mit Close-Button */}
Menu setIsMenuOpen(false)} aria-label="Close sidebar" className="p-2 rounded-lg text-zinc-400 hover:text-white hover:bg-zinc-800/50 transition-colors" whileTap={{ scale: 0.95 }} >
{/* Scrollbarer Sidebar-Inhalt */}
{/* Contact Info */} {/* Navigation Links */}
{navigationLinks.map(({ path, label, icon }) => ( setIsMenuOpen(false)} className="flex items-center w-full mb-1" /> ))}
{/* Language Switcher */}
Sprache ändern
)}
{/* Hauptinhalt */}
{children}
{/* Footer */}
); }; export default Layout;