// components/Header.jsx /** * Application Header Component * * Displays the site logo/title, desktop navigation, mobile menu toggle, * and user authentication status (Sign In button or User Profile dropdown). */ // React, Hooks, and PropTypes are globally available const Header = ({ isMobileMenuOpen, onToggleMobileMenu, user, onSignout }) => { // --- State --- const [isProfileMenuOpen, setIsProfileMenuOpen] = useState(false); // --- Event Handlers --- // Close profile dropdown when clicking outside useEffect(() => { const handleClickOutside = (event) => { if ( isProfileMenuOpen && !event.target.closest(".profile-menu-container") ) { setIsProfileMenuOpen(false); } }; if (isProfileMenuOpen) { document.addEventListener("mousedown", handleClickOutside); } return () => document.removeEventListener("mousedown", handleClickOutside); }, [isProfileMenuOpen]); // Toggle the profile dropdown menu const toggleProfileMenu = () => { setIsProfileMenuOpen((prev) => !prev); }; // Close profile menu and call the main signout handler from App.jsx const handleSignoutClick = () => { setIsProfileMenuOpen(false); onSignout(); }; // Close profile menu when navigating to profile page const handleProfileLinkClick = () => { setIsProfileMenuOpen(false); }; // Close mobile menu when a link inside it is clicked const handleMobileLinkClick = () => { if (isMobileMenuOpen) { onToggleMobileMenu(); } }; // --- Render --- return (
{/* Logo - Renamed */}
Naalam
{/* Desktop Navigation */} {/* Authentication Status / User Menu */}
{user ? ( // --- User is Logged In: Profile Menu ---
{/* Profile Dropdown Menu */} {isProfileMenuOpen && ( )}
) : ( // --- User is Logged Out: Sign In Button --- Sign In )}
{/* Mobile Menu Toggle Button */}
{/* Mobile Navigation Menu */}
); }; // --- Prop Type Validation --- Header.propTypes = { isMobileMenuOpen: PropTypes.bool.isRequired, onToggleMobileMenu: PropTypes.func.isRequired, user: PropTypes.shape({ id: PropTypes.number, username: PropTypes.string, email: PropTypes.string, full_name: PropTypes.string, profile_picture: PropTypes.string, }), onSignout: PropTypes.func.isRequired, }; // Make Header component globally available window.Header = Header;