1- import React , { useState } from "react" ;
1+ import React , { useState , useEffect , useRef } from "react" ;
22import { Link , NavLink } from "react-router-dom" ;
33import { useAuth } from "./AuthContext" ;
44import { signOut } from "firebase/auth" ;
55import { auth } from "./firebase" ;
6- import {
6+ import {
77 LuChartLine ,
88 LuLayoutDashboard ,
99 LuInfo ,
@@ -14,7 +14,7 @@ import {
1414 LuMenu ,
1515 LuX ,
1616} from "react-icons/lu" ;
17- import { FaRegUserCircle , FaUserAlt } from "react-icons/fa" ;
17+ import { FaRegUserCircle , FaUserAlt } from "react-icons/fa" ;
1818import "./Header.css" ;
1919import ThemeToggle from "./ThemeToggle" ;
2020
@@ -23,9 +23,26 @@ const Header = () => {
2323 const [ isMenuOpen , setIsMenuOpen ] = useState ( false ) ;
2424 const [ dashBoardOpen , setDashBoardOpen ] = useState ( false ) ;
2525
26+ const dropdownRef = useRef ( null ) ;
27+
28+ // Close dropdown when clicking outside
29+ useEffect ( ( ) => {
30+ function handleClickOutside ( event ) {
31+ if ( dropdownRef . current && ! dropdownRef . current . contains ( event . target ) ) {
32+ setDashBoardOpen ( false ) ;
33+ }
34+ }
35+
36+ document . addEventListener ( "mousedown" , handleClickOutside ) ;
37+ return ( ) => {
38+ document . removeEventListener ( "mousedown" , handleClickOutside ) ;
39+ } ;
40+ } , [ ] ) ;
41+
2642 const handleLogout = ( ) => {
2743 signOut ( auth ) ;
2844 setIsMenuOpen ( false ) ;
45+ setDashBoardOpen ( false ) ; // close dropdown on logout
2946 } ;
3047
3148 const toggleMenu = ( ) => setIsMenuOpen ( ! isMenuOpen ) ;
@@ -59,35 +76,40 @@ const Header = () => {
5976 </ NavLink >
6077 </ div >
6178
62-
63- { /* //User-dashboard: */ }
64- < div className = "nav-actions" >
65- < ThemeToggle className = 'toggle-theme' />
79+ { /* User Dashboard */ }
80+ < div className = "nav-actions" ref = { dropdownRef } >
81+ < ThemeToggle className = "toggle-theme" />
6682 < div className = "user-dashboard" >
67- < FaRegUserCircle onClick = { ( ) => setDashBoardOpen ( prev => ! prev ) } />
83+ < FaRegUserCircle onClick = { ( ) => setDashBoardOpen ( prev => ! prev ) } />
6884 </ div >
69- { dashBoardOpen ? < >
70- { currentUser ? (
71- < div className = "user-section" >
72- < span className = "welcome-message" > { getUsername ( currentUser . email ) . toUpperCase ( ) } </ span >
73- < NavLink to = '/profile' className = "user-profile" >
74- < FaUserAlt /> < span > Profile</ span >
75- </ NavLink >
76- < NavLink onClick = { handleLogout } className = "logout-button" >
77- < LuLogOut className = "logout-icon" /> < span > Logout</ span >
78- </ NavLink >
79- </ div >
80- ) : (
81- < div className = "user-section" >
82- < NavLink to = "/login" className = "login-button" onClick = { closeMenu } >
85+ < div className = { `user-section ${ dashBoardOpen ? "show" : "" } ` } >
86+ { currentUser ? (
87+ < >
88+ < span className = "welcome-message" > { getUsername ( currentUser . email ) . toUpperCase ( ) } </ span >
89+ < NavLink
90+ to = "/profile"
91+ className = "user-profile"
92+ onClick = { ( ) => setDashBoardOpen ( false ) }
93+ >
94+ < FaUserAlt /> < span > Profile</ span >
95+ </ NavLink >
96+ < NavLink
97+ onClick = { handleLogout }
98+ className = "logout-button"
99+ >
100+ < LuLogOut className = "logout-icon" /> < span > Logout</ span >
101+ </ NavLink >
102+ </ >
103+ ) : (
104+ < NavLink
105+ to = "/login"
106+ className = "login-button"
107+ onClick = { ( ) => { closeMenu ( ) ; setDashBoardOpen ( false ) ; } }
108+ >
83109 < LuLogIn className = "login-icon" /> < span > Login</ span >
84- </ NavLink >
85- </ div >
86- ) }
87-
88- </ >
89- :
90- < > { null } </ > }
110+ </ NavLink >
111+ ) }
112+ </ div >
91113 </ div >
92114 </ nav >
93115
@@ -101,7 +123,9 @@ const Header = () => {
101123
102124 { /* Mobile Dropdown Menu */ }
103125 < nav className = { `mobile-menu ${ isMenuOpen ? "mobile-menu-open" : "" } ` } >
104- { currentUser && < h1 className = "nav-link-email" > { getUsername ( currentUser ?. email ) . toUpperCase ( ) } </ h1 > }
126+ { currentUser && (
127+ < h1 className = "nav-link-email" > { getUsername ( currentUser ?. email ) . toUpperCase ( ) } </ h1 >
128+ ) }
105129
106130 < NavLink to = "/" className = "nav-link" onClick = { closeMenu } end >
107131 < div className = "nav-icon" > < LuLayoutDashboard /> < span > Home</ span > </ div >
@@ -115,27 +139,36 @@ const Header = () => {
115139 < NavLink to = "/watchlist" className = "nav-link" onClick = { closeMenu } >
116140 < div className = "nav-icon" > < LuClipboardList /> < span > Watchlist</ span > </ div >
117141 </ NavLink >
118- { currentUser ?
119- < >
120- < NavLink to = "/profile" className = "nav-link" onClick = { closeMenu } >
121- < div className = "nav-icon" > < FaUserAlt /> < span > Profile</ span > </ div >
122- </ NavLink >
123- < NavLink onClick = { ( ) => { handleLogout ( ) ; closeMenu ( ) } } className = "logout-button" >
124- < div className = "nav-icon" > < LuLogOut /> < span > Logout</ span > </ div >
125- </ NavLink >
126- </ >
127- :
128- < >
129- < NavLink to = "/login" className = "logout-button" onClick = { closeMenu } >
142+
143+ { currentUser ? (
144+ < >
145+ < NavLink
146+ to = "/profile"
147+ className = "nav-link"
148+ onClick = { ( ) => { closeMenu ( ) ; setDashBoardOpen ( false ) ; } }
149+ >
150+ < div className = "nav-icon" > < FaUserAlt /> < span > Profile</ span > </ div >
151+ </ NavLink >
152+ < NavLink
153+ onClick = { ( ) => { handleLogout ( ) ; closeMenu ( ) ; setDashBoardOpen ( false ) ; } }
154+ className = "logout-button"
155+ >
156+ < div className = "nav-icon" > < LuLogOut /> < span > Logout</ span > </ div >
157+ </ NavLink >
158+ </ >
159+ ) : (
160+ < NavLink
161+ to = "/login"
162+ className = "logout-button"
163+ onClick = { ( ) => { closeMenu ( ) ; setDashBoardOpen ( false ) ; } }
164+ >
130165 < div className = "nav-icon" > < LuLogIn /> < span > Login</ span > </ div >
131166 </ NavLink >
132- </ > }
133-
134-
167+ ) }
135168 </ nav >
136169 </ div >
137170 </ header >
138171 ) ;
139172} ;
140173
141- export default Header ;
174+ export default Header ;
0 commit comments