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 (