From cbc970f60b431f46efbf56a9393192660fd87dd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Gierwia=C5=82o?= Date: Sat, 15 Nov 2025 23:09:45 +0100 Subject: [PATCH] feat(nav): add responsive mobile dropdown menu with avatar and counters - Hide desktop items on small screens, add Menu/X toggle - Include Matches badge, History, Profile, and Logout - Keep real-time pending matches counter --- frontend/src/components/layout/Navbar.jsx | 69 ++++++++++++++++++++++- 1 file changed, 66 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/layout/Navbar.jsx b/frontend/src/components/layout/Navbar.jsx index c47fc6b..e7124ed 100644 --- a/frontend/src/components/layout/Navbar.jsx +++ b/frontend/src/components/layout/Navbar.jsx @@ -1,6 +1,6 @@ import { Link, useNavigate } from 'react-router-dom'; import { useAuth } from '../../contexts/AuthContext'; -import { Video, LogOut, User, History, Users } from 'lucide-react'; +import { Video, LogOut, User, History, Users, Menu, X } from 'lucide-react'; import Avatar from '../common/Avatar'; import { useState, useEffect } from 'react'; import { matchesAPI } from '../../services/api'; @@ -10,6 +10,7 @@ const Navbar = () => { const { user, logout } = useAuth(); const navigate = useNavigate(); const [pendingMatchesCount, setPendingMatchesCount] = useState(0); + const [menuOpen, setMenuOpen] = useState(false); const handleLogout = () => { logout(); @@ -68,8 +69,8 @@ const Navbar = () => { spotlight.cam - -
+ {/* Desktop menu */} +
{ Logout
+ + {/* Mobile menu button */} +
+ +
+ + {/* Mobile dropdown */} + {menuOpen && ( +
+
+ +
+

{user.username}

+
+
+
+ setMenuOpen(false)} + className="flex items-center justify-between px-3 py-2 rounded-md text-sm font-medium text-gray-700 hover:bg-gray-100" + > + + Matches + + {pendingMatchesCount > 0 && ( + + {pendingMatchesCount} + + )} + + setMenuOpen(false)} + className="flex items-center gap-2 px-3 py-2 rounded-md text-sm font-medium text-gray-700 hover:bg-gray-100" + > + History + + setMenuOpen(false)} + className="flex items-center gap-2 px-3 py-2 rounded-md text-sm font-medium text-gray-700 hover:bg-gray-100" + > + Profile + + +
+
+ )} ); };