11import { useState , useEffect } from "react" ;
22import { Button } from "../components/ui/button.js" ;
33import { useNavigate } from "react-router-dom" ;
4- import { Menu , X } from "lucide-react" ;
4+ import { Menu , X , PlusSquare , LogIn , LogOut } from "lucide-react" ;
5+ import axios from "axios" ;
56
67function Header ( ) {
78 const [ isScrolled , setIsScrolled ] = useState ( false ) ;
89 const [ isMobileMenuOpen , setIsMobileMenuOpen ] = useState ( false ) ;
10+ const [ user , setUser ] = useState < { _id : string ; name : string } | null > ( null ) ;
11+ const [ isDropdownOpen , setIsDropdownOpen ] = useState ( false ) ;
912 const navigate = useNavigate ( ) ;
1013
14+ // Scroll effect
1115 useEffect ( ( ) => {
12- const handleScroll = ( ) => {
13- setIsScrolled ( window . scrollY > 20 ) ;
14- } ;
16+ const handleScroll = ( ) => setIsScrolled ( window . scrollY > 20 ) ;
1517 window . addEventListener ( "scroll" , handleScroll ) ;
1618 return ( ) => window . removeEventListener ( "scroll" , handleScroll ) ;
1719 } , [ ] ) ;
1820
21+ // Fetch authenticated user
22+ useEffect ( ( ) => {
23+ const token = localStorage . getItem ( "token" ) ;
24+ if ( ! token ) return ;
25+
26+ const fetchUser = async ( ) => {
27+ try {
28+ const res = await axios . get ( "http://localhost:3000/api/auth/me" , {
29+ headers : { Authorization : `Bearer ${ token } ` } ,
30+ } ) ;
31+ setUser ( res . data . user ) ;
32+ } catch {
33+ setUser ( null ) ;
34+ localStorage . removeItem ( "token" ) ; // remove invalid token
35+ }
36+ } ;
37+
38+ fetchUser ( ) ;
39+ } , [ ] ) ;
40+
1941 const scrollToSection = ( id : string ) => {
2042 const element = document . getElementById ( id ) ;
2143 if ( element ) {
@@ -24,25 +46,36 @@ function Header() {
2446 }
2547 } ;
2648
49+ // Navigate to a separate page which provides actions (join/create/logout)
50+ const handleJoinNow = ( ) => {
51+ if ( ! user ) {
52+ navigate ( "/signin" ) ;
53+ } else {
54+ navigate ( "/room-actions" ) ;
55+ }
56+ } ;
57+
58+ const handleLogout = ( ) => {
59+ localStorage . removeItem ( "token" ) ;
60+ setUser ( null ) ;
61+ setIsDropdownOpen ( false ) ;
62+ navigate ( "/" ) ;
63+ } ;
64+
2765 return (
2866 < header
2967 className = { `fixed top-0 left-0 right-0 z-50 transition-all duration-300 ${
30- isScrolled
31- ? "bg-white/80 backdrop-blur-lg shadow-lg"
32- : "bg-transparent"
68+ isScrolled ? "bg-white/80 backdrop-blur-lg shadow-lg" : "bg-transparent"
3369 } `}
3470 >
3571 < nav className = "container mx-auto px-6 py-4" >
3672 < div className = "flex items-center justify-between" >
37- < a
38- href = "/"
39- className = "text-2xl font-bold text-green-600 bg-clip-text"
40- >
73+ < a href = "/" className = "text-2xl font-bold text-green-600 bg-clip-text" >
4174 PeerCall
4275 </ a >
4376
4477 { /* Desktop Navigation */ }
45- < div className = "hidden md:flex items-center gap-8" >
78+ < div className = "hidden md:flex items-center gap-8 relative " >
4679 < button
4780 onClick = { ( ) => scrollToSection ( "features" ) }
4881 className = "text-gray-900 hover:text-green-600 transition-colors font-medium"
@@ -55,13 +88,15 @@ function Header() {
5588 >
5689 Tech Stack
5790 </ button >
58- < Button
59- size = "default"
60- className = "bg-green-600 text-white hover:bg-green-700"
61- onClick = { ( ) => navigate ( "/signup" ) }
62- >
63- Join Now
64- </ Button >
91+ < div className = "relative" >
92+ < Button
93+ size = "default"
94+ className = "bg-green-600 text-white hover:bg-green-700 flex items-center gap-2"
95+ onClick = { handleJoinNow }
96+ >
97+ Join Now
98+ </ Button >
99+ </ div >
65100 </ div >
66101
67102 { /* Mobile Menu Button */ }
@@ -91,11 +126,12 @@ function Header() {
91126 </ button >
92127 < Button
93128 size = "default"
94- className = "w-full bg-green-600 text-white hover:bg-green-700"
95- onClick = { ( ) => navigate ( "/signup" ) }
129+ className = "w-full bg-green-600 text-white hover:bg-green-700 flex items-center justify-center gap-2 "
130+ onClick = { handleJoinNow }
96131 >
97132 Join Now
98133 </ Button >
134+ { /* mobile: action buttons moved to /room-actions page */ }
99135 </ div >
100136 ) }
101137 </ nav >
0 commit comments