// 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ü nur 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 ( // Relativer Container, um z-index-Steuerung zu ermöglichen
{/* Navigation – oberste Ebene */} {/* Mobile Menu */} {isMenuOpen && ( <> {/* Backdrop: Sichtbar, aber mit pointer-events-none blockiert er keine Interaktionen */} {/* Sidebar – oberhalb des Hauptinhalts */} {/* Header-Spacer für die Navigation */}
{/* Scrollbarer Sidebar-Inhalt */}
{navigationLinks.map(({ path, label, icon }) => ( setIsMenuOpen(false)} className="flex items-center w-full mb-1" /> ))}
Sprache ändern
)} {/* Hauptinhalt – hier kann normal gescrollt werden */}
{children}
{/* Footer */}
); }; export default Layout;