import { type ReactNode, useEffect, useRef, useState } from "react"; import { Bell, ChevronDown, Languages, LogOut, MessageSquare, Moon, Sun, User, } from "lucide-react"; import { Group, Stack, Text, Menu, Tooltip, Box } from "@mantine/core"; import type { PageMeta } from "./types"; import "./FreightDashboardHeader.css"; export interface FreightDashboardHeaderProps { pageMeta: PageMeta; headerRight?: ReactNode; enableThemeToggle?: boolean; userName?: string; userEmail?: string; userInitials?: string; onLogout?: () => void; theme: "light" | "dark"; onToggleTheme: () => void; } const FreightDashboardHeader = ({ pageMeta, headerRight, enableThemeToggle = false, userName = "User", userEmail, userInitials, onLogout, theme, onToggleTheme, }: FreightDashboardHeaderProps) => { const initials = userInitials ?? (userName .split(" ") .filter(Boolean) .slice(0, 2) .map((n) => n[0].toUpperCase()) .join("") || "U"); 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]); return (
{/* Freight Backoffice */} {pageMeta.title} {/* {pageMeta.subtitle} */} {enableThemeToggle && ( )}
setIsUserMenuOpen(true)} onClose={() => setIsUserMenuOpen(false)} >
{initials}
{userName} {userEmail ?? "Administrator"}
{initials}
{userName} {userEmail && ( {userEmail} )}
} onClick={() => setIsUserMenuOpen(false)} > Profile } color="red" onClick={() => { setIsUserMenuOpen(false); onLogout?.(); }} > Logout
{headerRight}
); }; export default FreightDashboardHeader;