import React, { useState, useEffect, useRef } from "react"; import { Link, useNavigate } from "react-router-dom"; import { Bars3Icon, XMarkIcon } from "@heroicons/react/24/solid"; import { logout } from "../../auth"; export const Header: React.FC = () => { const navigate = useNavigate(); const [username, setUsername] = useState(localStorage.getItem("user_name")); const [menuOpen, setMenuOpen] = useState(false); const [dropdownOpen, setDropdownOpen] = useState(false); const dropdownRef = useRef(null); // Listen for localStorage changes to update username dynamically useEffect(() => { const handleStorage = () => setUsername(localStorage.getItem("user_name")); // This catches changes from OTHER tabs window.addEventListener("storage", handleStorage); // This catches changes in the CURRENT tab if you use dispatchEvent window.addEventListener("local-storage-update", handleStorage); return () => { window.removeEventListener("storage", handleStorage); window.removeEventListener("local-storage-update", handleStorage); }; }, []); const handleLogout = async () => { try { await logout(); localStorage.removeItem("user_id"); localStorage.removeItem("user_name"); setUsername(null); navigate("/login"); } catch (err) { console.error(err); } }; // Close dropdown on click outside useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setDropdownOpen(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); return (
{/* Logo */}
NyanimeDB
{/* Navigation (desktop) */} {/* Profile / login */}
{username ? (
{dropdownOpen && (
setDropdownOpen(false)}>Profile
)}
) : ( Login )}
{/* Mobile burger */}
{/* Mobile menu */} {menuOpen && (
)}
); };