/** * AppHeader - Main application header with navigation and user menu */ import { useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { useLocation, useNavigate } from "react-router-dom"; import { useUnsavedChanges } from "../context"; import { useTheme } from "../hooks"; import { useAuth } from "./Auth"; interface AppHeaderProps { onOpenProfile: () => void; onOpenAbout: () => void; } export function AppHeader({ onOpenProfile, onOpenAbout }: AppHeaderProps) { const { t } = useTranslation(); const navigate = useNavigate(); const location = useLocation(); const currentPath = location.pathname; const { user, authState, logout } = useAuth(); const { theme, themePreference, setThemePreference } = useTheme(); const { confirmNavigation } = useUnsavedChanges(); // Theme dropdown state const [themeMenuOpen, setThemeMenuOpen] = useState(false); const themeMenuRef = useRef(null); // Close theme dropdown when clicking outside useEffect(() => { if (!themeMenuOpen) return; const handleClickOutside = (e: MouseEvent) => { if (themeMenuRef.current && !themeMenuRef.current.contains(e.target as Node)) { setThemeMenuOpen(false); } }; document.addEventListener("click", handleClickOutside); return () => document.removeEventListener("click", handleClickOutside); }, [themeMenuOpen]); // Safe navigation that checks for unsaved changes first const safeNavigate = async (path: string) => { if (await confirmNavigation()) { navigate(path); } }; // User dropdown state (for mobile click-based behavior) const [userDropdownOpen, setUserDropdownOpen] = useState(false); // Close user dropdown when clicking outside useEffect(() => { if (!userDropdownOpen) return; const handleClickOutside = (e: MouseEvent) => { const target = e.target as HTMLElement; if (!target.closest(".user-menu")) { setUserDropdownOpen(false); } }; document.addEventListener("click", handleClickOutside); return () => document.removeEventListener("click", handleClickOutside); }, [userDropdownOpen]); // Page titles based on current route const pageInfo = { "/dashboard": { eyebrow: t("header.eyebrow.overview"), title: t("nav.dashboard") }, "/medications": { eyebrow: t("header.eyebrow.inventory"), title: t("nav.medications") }, "/planner": { eyebrow: t("header.eyebrow.planner"), title: t("nav.planner") }, "/settings": { eyebrow: t("header.eyebrow.settings"), title: t("nav.settings") }, "/schedule": { eyebrow: t("header.eyebrow.schedule"), title: t("dashboard.schedules.title") }, }[currentPath] || { eyebrow: t("header.eyebrow.overview"), title: t("nav.dashboard") }; return (
MedAssist-ng

{pageInfo.eyebrow}

{pageInfo.title}

{/* Settings button only shown when auth is disabled (no user dropdown available) */} {!authState?.authEnabled && ( )}
{authState?.authEnabled && user && (
{user.avatarUrl ? ( {user.username} ) : (
{user.username.charAt(0).toUpperCase()}
)} {user.username}
)}
); }