import { useState, useEffect, useRef } from 'react' import { useNavigate } from '@tanstack/react-router' import { useAuthStore } from '@/store/auth-store' import { useUser } from '@/hooks/use-auth' import { useAuthModalStore } from '@/store/auth-modal-store' /** Avatar circle with first letter of name, deterministic color */ function Avatar({ name }: { name: string }) { const colors = ['bg-blue-600', 'bg-green-600', 'bg-violet-600', 'bg-rose-600', 'bg-amber-600'] const color = colors[name.charCodeAt(0) % colors.length] return (
{name.charAt(0).toUpperCase()}
) } export function UserMenu() { const user = useUser() const logout = useAuthStore((s) => s.logout) const openModal = useAuthModalStore((s) => s.open) const navigate = useNavigate() const [dropdownOpen, setDropdownOpen] = useState(false) const menuRef = useRef(null) // Close on outside click useEffect(() => { if (!dropdownOpen) return function handleClick(e: MouseEvent) { if (menuRef.current && !menuRef.current.contains(e.target as Node)) { setDropdownOpen(false) } } document.addEventListener('mousedown', handleClick) return () => document.removeEventListener('mousedown', handleClick) }, [dropdownOpen]) async function handleLogout() { setDropdownOpen(false) await logout() navigate({ to: '/' }) } if (!user) { return (
) } return (
{dropdownOpen && (
{user.name}
{user.email}
)}
) }