import { ReactNode, useEffect, useRef, useState } from "react"; import { Bell, ChevronDown, Languages, LogOut, Moon, Sun, User, } from "lucide-react"; import Sidebar, { SidebarItem } from "./Sidebar"; export interface DashboardLayoutProps { title?: string; sidebarItems: SidebarItem[]; activeHref?: string; onNavigate?: (href: string) => void; headerRight?: ReactNode; enableThemeToggle?: boolean; userName?: string; userEmail?: string; userInitials?: string; onLogout?: () => void; children: ReactNode; } type Theme = "light" | "dark"; const THEME_STORAGE_KEY = "edr-theme"; function getInitialTheme(): Theme { if (typeof window === "undefined") return "light"; const stored = window.localStorage.getItem(THEME_STORAGE_KEY); if (stored === "dark" || stored === "light") return stored; return window.matchMedia?.("(prefers-color-scheme: dark)").matches ? "dark" : "light"; } const iconButtonClass = "inline-flex h-10 w-10 items-center justify-center rounded-xl border border-slate-200 text-slate-600 transition hover:border-[#10B981]/30 hover:bg-[#10B981]/10 hover:text-[#10B981] dark:border-slate-700 dark:text-slate-300 dark:hover:border-[#10B981]/40 dark:hover:bg-[#10B981]/20 dark:hover:text-white"; const DashboardLayout = ({ title, sidebarItems, activeHref, onNavigate, headerRight, enableThemeToggle = false, userName = "User", userEmail, userInitials, onLogout, children, }: DashboardLayoutProps) => { const initials = userInitials ?? userName .split(" ") .filter(Boolean) .slice(0, 2) .map((n) => n[0].toUpperCase()) .join(""); const [theme, setTheme] = useState(() => enableThemeToggle ? getInitialTheme() : "light", ); useEffect(() => { if (!enableThemeToggle) return; const root = document.documentElement; if (theme === "dark") { root.classList.add("dark"); } else { root.classList.remove("dark"); } window.localStorage.setItem(THEME_STORAGE_KEY, theme); }, [theme, enableThemeToggle]); const toggleTheme = () => setTheme((current) => (current === "dark" ? "light" : "dark")); const [isUserMenuOpen, setIsUserMenuOpen] = useState(false); const userMenuRef = useRef(null); useEffect(() => { if (!isUserMenuOpen) return; const handlePointerDown = (event: MouseEvent) => { if ( userMenuRef.current && !userMenuRef.current.contains(event.target as Node) ) { setIsUserMenuOpen(false); } }; const handleKeyDown = (event: KeyboardEvent) => { if (event.key === "Escape") setIsUserMenuOpen(false); }; document.addEventListener("mousedown", handlePointerDown); document.addEventListener("keydown", handleKeyDown); return () => { document.removeEventListener("mousedown", handlePointerDown); document.removeEventListener("keydown", handleKeyDown); }; }, [isUserMenuOpen]); const themeToggleButton = enableThemeToggle ? ( ) : null; return (
{title}
{isUserMenuOpen ? (

{userName}

{userEmail ? (

{userEmail}

) : null}
setIsUserMenuOpen(false)} className="flex items-center gap-2 px-4 py-2 text-sm text-slate-700 transition hover:bg-[#10B981]/10 hover:text-[#10B981] dark:text-slate-300 dark:hover:bg-[#10B981]/20 dark:hover:text-white" > Profile
) : null}
{headerRight}
{children}
); }; export default DashboardLayout;