@@ -14,6 +14,7 @@ export function Navbar() {
1414 const [ searchResults , setSearchResults ] = useState < any [ ] > ( [ ] ) ;
1515 const [ loading , setLoading ] = useState ( false ) ;
1616 const [ showDropdown , setShowDropdown ] = useState ( false ) ;
17+ const [ showProfileDropdown , setShowProfileDropdown ] = useState ( false ) ;
1718 const [ isOpen , setIsOpen ] = useState ( false ) ; // State for Sheet open/closed
1819 const navigate = useNavigate ( ) ;
1920 const [ isScrolled , setIsScrolled ] = useState < boolean > ( false ) ;
@@ -90,11 +91,14 @@ export function Navbar() {
9091 if ( showDropdown && ! ( event . target as Element ) . closest ( ".search-container" ) ) {
9192 setShowDropdown ( false ) ;
9293 }
94+ if ( showProfileDropdown && ! ( event . target as Element ) . closest ( ".profile-dropdown-container" ) ) {
95+ setShowProfileDropdown ( false ) ;
96+ }
9397 }
9498
9599 document . addEventListener ( "mousedown" , handleClickOutside ) ;
96100 return ( ) => document . removeEventListener ( "mousedown" , handleClickOutside ) ;
97- } , [ showDropdown ] ) ;
101+ } , [ showDropdown , showProfileDropdown ] ) ;
98102
99103 const renderResultItem = ( item : any , idx : number ) => {
100104 if ( item . type === "challenge" ) {
@@ -262,20 +266,47 @@ export function Navbar() {
262266 ) }
263267
264268 { ! isAuthenticated ? (
265- < >
266- < Button variant = "outline" asChild className = "text-gray-300 dark:text-gray-600 border-gray-700 dark:border-gray-300 hover:bg-gray-700 dark:hover:bg-gray-200" >
267- < Link to = "/login" > Log In</ Link >
268- </ Button >
269- < Button asChild className = "bg-blue-600 dark:bg-blue-500 text-white hover:bg-blue-700 dark:hover:bg-blue-600" >
270- < Link to = "/register" > Sign Up</ Link >
271- </ Button >
272- </ >
269+ < Button asChild className = "bg-blue-600 dark:bg-blue-500 text-white hover:bg-blue-700 dark:hover:bg-blue-600" >
270+ < Link to = "/register" > Enter</ Link >
271+ </ Button >
273272 ) : (
274- < div className = "flex items-center gap-4" >
275- < Link to = { `/profile/${ user ?. username } ` } > { renderUserAvatar ( ) } </ Link >
276- < Button onClick = { logout } variant = "outline" className = "text-gray-300 dark:text-gray-600 border-gray-700 dark:border-gray-300 hover:bg-gray-700 dark:hover:bg-gray-200" >
277- Logout
273+ < div className = "relative profile-dropdown-container" >
274+ < Button
275+ variant = "ghost"
276+ className = "p-0 h-auto"
277+ onClick = { ( ) => setShowProfileDropdown ( ! showProfileDropdown ) }
278+ >
279+ { renderUserAvatar ( ) }
278280 </ Button >
281+
282+ < AnimatePresence >
283+ { showProfileDropdown && (
284+ < motion . div
285+ initial = { { opacity : 0 , y : - 10 } }
286+ animate = { { opacity : 1 , y : 0 } }
287+ exit = { { opacity : 0 , y : - 10 } }
288+ transition = { { duration : 0.15 } }
289+ className = "absolute right-0 mt-2 w-32 bg-gray-800 dark:bg-white border border-gray-700 dark:border-gray-200 rounded-md shadow-lg z-50 overflow-hidden"
290+ >
291+ < Link
292+ to = { `/profile/${ user ?. username } ` }
293+ className = "block px-4 py-2 text-sm text-gray-300 dark:text-gray-700 hover:bg-gray-700 dark:hover:bg-gray-100 transition-colors"
294+ onClick = { ( ) => setShowProfileDropdown ( false ) }
295+ >
296+ View Profile
297+ </ Link >
298+ < button
299+ onClick = { ( ) => {
300+ logout ( ) ;
301+ setShowProfileDropdown ( false ) ;
302+ } }
303+ className = "block w-full text-left px-4 py-2 text-sm text-red-400 dark:text-red-600 hover:bg-red-600/20 dark:hover:bg-red-100 hover:text-red-300 dark:hover:text-red-700 transition-colors"
304+ >
305+ Logout
306+ </ button >
307+ </ motion . div >
308+ ) }
309+ </ AnimatePresence >
279310 </ div >
280311 ) }
281312 </ div >
@@ -377,23 +408,13 @@ export function Navbar() {
377408
378409 < div className = "mt-6 pt-6 border-t border-gray-700 dark:border-gray-200" >
379410 { ! isAuthenticated ? (
380- < div className = "flex flex-col gap-3" >
381- < Button
382- variant = "outline"
383- asChild
384- className = "w-full text-gray-300 dark:text-gray-600 border-gray-700 dark:border-gray-300 hover:bg-gray-700 dark:hover:bg-gray-200"
385- onClick = { ( ) => setIsOpen ( false ) } // Close Sheet on click
386- >
387- < Link to = "/login" > Log In</ Link >
388- </ Button >
389- < Button
390- asChild
391- className = "w-full bg-blue-600 dark:bg-blue-500 text-white hover:bg-blue-700 dark:hover:bg-blue-600"
392- onClick = { ( ) => setIsOpen ( false ) } // Close Sheet on click
393- >
394- < Link to = "/register" > Sign Up</ Link >
395- </ Button >
396- </ div >
411+ < Button
412+ asChild
413+ className = "w-full bg-blue-600 dark:bg-blue-500 text-white hover:bg-blue-700 dark:hover:bg-blue-600"
414+ onClick = { ( ) => setIsOpen ( false ) } // Close Sheet on click
415+ >
416+ < Link to = "/register" > Enter</ Link >
417+ </ Button >
397418 ) : (
398419 < div className = "flex flex-col gap-4" >
399420 < div className = "flex items-center gap-3" >
0 commit comments