'use client' import React, { useState, useEffect, useRef } from 'react' import './navbar.scss' import Link from 'next/link' import { User } from '@/app/types' import { useCart } from '@/app/context/CartContext' import { dispatchUserLogout } from '@/app/utils/auth-events' const Navbar = () => { const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const [isCategoriesOpen, setIsCategoriesOpen] = useState(false); const [user, setUser] = useState(null); const [isProfileMenuOpen, setIsProfileMenuOpen] = useState(false); const [isMobileProfileMenuOpen, setIsMobileProfileMenuOpen] = useState(false); const { toggleCart, totalItems } = useCart(); const mobileMenuRef = useRef(null); const profileDropdownRef = useRef(null); const mobileProfileDropdownRef = useRef(null); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (isProfileMenuOpen && profileDropdownRef.current && !profileDropdownRef.current.contains(event.target as Node)) { setIsProfileMenuOpen(false); } if (isMobileProfileMenuOpen && mobileProfileDropdownRef.current && !mobileProfileDropdownRef.current.contains(event.target as Node)) { setIsMobileProfileMenuOpen(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, [isProfileMenuOpen, isMobileProfileMenuOpen]); useEffect(() => { const handleScroll = () => { if (isMobileMenuOpen) { setIsMobileMenuOpen(false); } }; window.addEventListener('scroll', handleScroll); return () => { window.removeEventListener('scroll', handleScroll); }; }, [isMobileMenuOpen]); useEffect(() => { const checkUserAuth = () => { const storedUser = localStorage.getItem('user') || sessionStorage.getItem('user'); if (storedUser) { try { setUser(JSON.parse(storedUser)); } catch (error) { console.error('Error parsing user data:', error); } } }; checkUserAuth(); const handleLogin = (event: Event) => { const customEvent = event as CustomEvent; if (customEvent.detail) { setUser(customEvent.detail); } }; const handleLogout = () => { setUser(null); }; window.addEventListener('user-login', handleLogin as EventListener); window.addEventListener('user-logout', handleLogout); return () => { window.removeEventListener('user-login', handleLogin as EventListener); window.removeEventListener('user-logout', handleLogout); }; }, []); const handleLogout = async () => { try { const response = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/auth/logout`, { method: 'POST', credentials: 'include', }); if (response.ok) { localStorage.removeItem('user'); localStorage.removeItem('accessToken'); sessionStorage.removeItem('user'); sessionStorage.removeItem('accessToken'); setUser(null); dispatchUserLogout(); window.location.href = '/'; } else { console.error('Logout failed'); } } catch (error) { console.error('Logout error:', error); } }; const toggleMobileMenu = () => { setIsMobileMenuOpen(!isMobileMenuOpen); if (isCategoriesOpen) setIsCategoriesOpen(false); document.body.style.overflow = !isMobileMenuOpen ? 'hidden' : ''; }; const toggleCategories = () => { setIsCategoriesOpen(!isCategoriesOpen); }; const renderAuthButtons = () => { if (user) { return (
setIsProfileMenuOpen(!isProfileMenuOpen)}> {user.profilePic ? ( Profile ) : (
{user.name.charAt(0).toUpperCase()}
)} {user.name}
{isProfileMenuOpen && (
Profile Orders Settings
)}
); } return (
); }; const renderMobileAuthButtons = () => { if (user) { return (
{ e.stopPropagation(); setIsMobileProfileMenuOpen(!isMobileProfileMenuOpen); }}> {user.profilePic ? ( Profile ) : (
{user.name.charAt(0).toUpperCase()}
)} {user.name}
{isMobileProfileMenuOpen && (
Profile Orders Settings
)}
); } return (
setIsMobileMenuOpen(false)}> setIsMobileMenuOpen(false)}>
); }; const handleCartClick = (e: React.MouseEvent) => { e.preventDefault(); toggleCart(); }; return (
{renderMobileAuthButtons()}
Cart ({totalItems})
  • Electronics
  • Clothing
  • Books
  • Sports
  • Home & Living
  • Electronics
  • Clothing
  • Books
  • Sports
  • Home & Living
) } export default Navbar