diff --git a/app/components/NavBar.tsx b/app/components/NavBar.tsx index 7ad410f..09f86d9 100644 --- a/app/components/NavBar.tsx +++ b/app/components/NavBar.tsx @@ -105,6 +105,12 @@ function Icon({ name }: { name: string }) { ); + case 'chevron-down': + return ( + + + + ); default: return null; } @@ -115,7 +121,9 @@ export default function NavBar() { const [user, setUser] = useState(null); const [pendingCount, setPendingCount] = useState(0); const [adminMenuOpen, setAdminMenuOpen] = useState(false); + const [userMenuOpen, setUserMenuOpen] = useState(false); const adminMenuRef = useRef(null); + const userMenuRef = useRef(null); async function loadUser() { try { @@ -133,7 +141,10 @@ export default function NavBar() { }, []); useEffect(() => { - if (!user) setAdminMenuOpen(false); + if (!user) { + setAdminMenuOpen(false); + setUserMenuOpen(false); + } }, [user]); useEffect(() => { @@ -167,15 +178,19 @@ export default function NavBar() { const showAdminMenu = Boolean(user && (showApprovals || isAdmin)); useEffect(() => { - if (!adminMenuOpen) return; + if (!userMenuOpen && !adminMenuOpen) return; const onMouseDown = (e: MouseEvent) => { const target = e.target as Node | null; - if (target && adminMenuRef.current && !adminMenuRef.current.contains(target)) { - setAdminMenuOpen(false); - } + const insideAdmin = adminMenuRef.current && target && adminMenuRef.current.contains(target); + const insideUser = userMenuRef.current && target && userMenuRef.current.contains(target); + if (!insideAdmin) setAdminMenuOpen(false); + if (!insideUser) setUserMenuOpen(false); }; const onKeyDown = (e: KeyboardEvent) => { - if (e.key === 'Escape') setAdminMenuOpen(false); + if (e.key === 'Escape') { + setAdminMenuOpen(false); + setUserMenuOpen(false); + } }; document.addEventListener('mousedown', onMouseDown); document.addEventListener('keydown', onKeyDown); @@ -183,7 +198,7 @@ export default function NavBar() { document.removeEventListener('mousedown', onMouseDown); document.removeEventListener('keydown', onKeyDown); }; - }, [adminMenuOpen]); + }, [adminMenuOpen, userMenuOpen]); return ( @@ -199,18 +214,46 @@ export default function NavBar() { {user ? ( <> - - {user.email} ยท {user.role} - - - {t('navProfile')} - - - {t('navMyListings')} - - - {t('navNewListing')} - + + setUserMenuOpen((v) => !v)} + style={{ display: 'inline-flex', alignItems: 'center', gap: 10 }} + > + + {user.email} + {user.role} + + + + {userMenuOpen ? ( + + setUserMenuOpen(false)}> + {t('navProfile')} + + setUserMenuOpen(false)}> + {t('navMyListings')} + + setUserMenuOpen(false)}> + {t('navNewListing')} + + { + setUserMenuOpen(false); + logout(); + }} + > + {t('navLogout')} + + + ) : null} + {showAdminMenu ? ( setAdminMenuOpen((v) => !v)} + style={{ display: 'inline-flex', alignItems: 'center', gap: 8 }} > {t('navAdmin')} {showApprovals && pendingCount > 0 ? ( @@ -226,6 +270,7 @@ export default function NavBar() { {t('approvalsBadge', { count: pendingCount })} ) : null} + {adminMenuOpen ? ( @@ -258,9 +303,6 @@ export default function NavBar() { ) : null} ) : null} - - {t('navLogout')} - > ) : ( <>