'use client'; import React, { useEffect, useRef, useState } from 'react'; import Link from 'next/link'; import { useRouter } from 'next/navigation'; import { User, Package, MapPin, Settings, Heart, GitCompare, ShoppingCart, Wrench, LogOut, ChevronDown, LogIn, } from 'lucide-react'; import { useAuthStore } from '@/store/authStore'; import { apiFetch, clearTokens } from '@/services/api/client'; import { useCartStore } from '@/store/cartStore'; import GoogleAuthModal from '@/components/auth/GoogleAuthModal'; type MenuItem = { label: string; href?: string; icon: React.ComponentType<{ size?: number; className?: string }>; onClick?: () => void; dividerAfter?: boolean; }; export const AccountMenu: React.FC = () => { const router = useRouter(); const { isAuthenticated, customer, clearAuth, bootstrapAuth, authReady } = useAuthStore(); const setCartDrawerOpen = useCartStore((s) => s.setCartDrawerOpen); const [open, setOpen] = useState(false); const [authModalOpen, setAuthModalOpen] = useState(false); const rootRef = useRef(null); const closeTimer = useRef | null>(null); useEffect(() => { void bootstrapAuth(); }, [bootstrapAuth]); useEffect(() => { const onDoc = (e: MouseEvent) => { if (!rootRef.current?.contains(e.target as Node)) setOpen(false); }; const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') setOpen(false); }; document.addEventListener('mousedown', onDoc); document.addEventListener('keydown', onKey); return () => { document.removeEventListener('mousedown', onDoc); document.removeEventListener('keydown', onKey); }; }, []); const clearCloseTimer = () => { if (closeTimer.current) { clearTimeout(closeTimer.current); closeTimer.current = null; } }; const scheduleClose = () => { clearCloseTimer(); closeTimer.current = setTimeout(() => setOpen(false), 160); }; const handleLogout = async () => { setOpen(false); try { await apiFetch('/api/v1/customer/auth/logout', { method: 'POST', skipAuth: true, }); } catch { /* ignore */ } finally { clearTokens(); clearAuth(); router.push('/'); } }; const handleAuthSuccess = () => { setAuthModalOpen(false); setOpen(false); router.push('/'); }; const loggedInItems: MenuItem[] = [ { label: 'My Profile', href: '/account?tab=dashboard', icon: User, }, { label: 'Orders', href: '/account?tab=orders', icon: Package, }, { label: 'Saved Addresses', href: '/account?tab=addresses', icon: MapPin, }, { label: 'Account Settings', href: '/account?tab=settings', icon: Settings, dividerAfter: true, }, { label: 'Wishlist', href: '/wishlist', icon: Heart, }, { label: 'Compare', href: '/compare', icon: GitCompare, }, { label: 'My Cart', icon: ShoppingCart, onClick: () => { setOpen(false); setCartDrawerOpen(true); }, dividerAfter: true, }, { label: 'Track Repair', href: '/services/tracking', icon: Wrench, dividerAfter: true, }, { label: 'Sign Out', icon: LogOut, onClick: handleLogout, }, ]; const displayName = customer?.first_name || 'Account'; return ( <>
{ if (!authReady) return; clearCloseTimer(); setOpen(true); }} onMouseLeave={scheduleClose} > {open && (
{!isAuthenticated ? (

Welcome

setOpen(false)} className="flex items-center gap-3 px-4 py-2.5 text-[13px] text-[#333] hover:bg-[#f7f9fc] hover:text-primary transition-colors" > Wishlist setOpen(false)} className="flex items-center gap-3 px-4 py-2.5 text-[13px] text-[#333] hover:bg-[#f7f9fc] hover:text-primary transition-colors" > Compare
) : (

Your Account

{loggedInItems.map((item) => { const Icon = item.icon; const className = 'w-full flex items-center gap-3 px-4 py-2.5 text-[13px] text-[#333] hover:bg-[#f7f9fc] hover:text-primary transition-colors text-left'; const row = item.href ? ( setOpen(false)} className={className} > {item.label} ) : ( ); return ( {row} {item.dividerAfter ? (
) : null} ); })}
)}
)}
setAuthModalOpen(false)} onSuccess={handleAuthSuccess} /> ); };