import { useState, useRef, useEffect } from 'react'; import { useNavigate } from '@remix-run/react'; import { useStore } from '@nanostores/react'; import { authStore, logout } from '~/lib/stores/auth'; import { motion, AnimatePresence } from 'framer-motion'; import { classNames } from '~/utils/classNames'; export function UserMenu() { const navigate = useNavigate(); const authState = useStore(authStore); const [isOpen, setIsOpen] = useState(false); const menuRef = useRef(null); useEffect(() => { function handleClickOutside(event: MouseEvent) { if (menuRef.current && !menuRef.current.contains(event.target as Node)) { setIsOpen(false); } } document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, []); const handleLogout = async () => { await logout(); navigate('/auth'); }; const handleManageUsers = () => { setIsOpen(false); navigate('/admin/users'); }; const handleSettings = () => { setIsOpen(false); // Open settings modal or navigate to settings }; if (!authState.isAuthenticated || !authState.user) { return null; } return (
{/* User Avatar Button */} {/* Dropdown Menu */} {isOpen && ( {/* User Info */}
{authState.user.avatar ? ( {authState.user.firstName} ) : ( {authState.user.firstName[0].toUpperCase()} )}

{authState.user.firstName}

@{authState.user.username}

{/* Menu Items */}
{/* Footer */}

Member since {new Date(authState.user.createdAt).toLocaleDateString()}

)}
); }