11'use client' ;
22import Link from 'next/link' ;
3- import { useState } from 'react' ;
3+ import { useState , useEffect , useRef } from 'react' ;
44import Image from 'next/image' ;
55
66export default function Header ( ) {
77 const [ isMenuOpen , setIsMenuOpen ] = useState ( false ) ;
8-
8+ const menuRef = useRef ( null ) ;
9+
10+ // Manejador para cerrar el menú
11+ useEffect ( ( ) => {
12+ function handleClickOutside ( event ) {
13+ if ( menuRef . current && ! menuRef . current . contains ( event . target ) && isMenuOpen ) {
14+ setIsMenuOpen ( false ) ;
15+ }
16+ }
17+
18+ // Listener solo cuando el menú está abierto
19+ if ( isMenuOpen ) {
20+ document . addEventListener ( 'mousedown' , handleClickOutside ) ;
21+ document . addEventListener ( 'touchstart' , handleClickOutside ) ;
22+ }
23+
24+ // Limpieza al desmontar
25+ return ( ) => {
26+ document . removeEventListener ( 'mousedown' , handleClickOutside ) ;
27+ document . removeEventListener ( 'touchstart' , handleClickOutside ) ;
28+ } ;
29+ } , [ isMenuOpen ] ) ;
30+
31+ // Manejador para cerrar el menú
32+ const handleLinkClick = ( ) => {
33+ setIsMenuOpen ( false ) ;
34+ } ;
35+
936 return (
1037 < header className = "bg-black/30 backdrop-blur-md sticky top-0 z-50" >
1138 < div className = "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8" >
1239 < div className = "flex justify-between items-center py-4" >
1340 < Link href = "/" className = "flex items-center space-x-2" >
1441 < div className = "w-12 h-12 relative" >
15- < Image
16- src = "/images/logo.webp"
17- alt = "PyDay Chile Logo"
18- fill
19- className = "object-contain"
42+ < Image
43+ src = "/images/logo.webp"
44+ alt = "PyDay Chile Logo"
45+ fill
46+ className = "object-contain"
2047 />
2148 </ div >
2249 < span className = "text-xl font-bold" > PyDay Chile 2025</ span >
2350 </ Link >
24-
51+
2552 { /* Menú para móvil */ }
2653 < div className = "md:hidden" >
2754 < button
2855 onClick = { ( ) => setIsMenuOpen ( ! isMenuOpen ) }
2956 className = "text-white p-2"
57+ aria-label = { isMenuOpen ? "Cerrar menú" : "Abrir menú" }
3058 >
3159 { isMenuOpen ? (
3260 < svg xmlns = "http://www.w3.org/2000/svg" className = "h-6 w-6" fill = "none" viewBox = "0 0 24 24" stroke = "currentColor" >
@@ -39,24 +67,26 @@ export default function Header() {
3967 ) }
4068 </ button >
4169 </ div >
42-
70+
4371 { /* Menú para desktop */ }
4472 < nav className = "hidden md:flex space-x-8" >
4573 < Link href = "/" className = "text-white hover:text-green-400 transition" > Inicio</ Link >
74+ < Link href = "/talks" className = "text-white hover:text-green-400 transition" > Charlas</ Link >
4675 < Link href = "/multimedia" className = "text-white hover:text-green-400 transition" > Multimedia</ Link >
4776 < Link href = "/previous-editions" className = "text-white hover:text-green-400 transition" > Ediciones Anteriores</ Link >
4877 < Link href = "/register" className = "text-white bg-green-600 hover:bg-green-700 px-4 py-2 rounded-full transition" > Registrarse</ Link >
4978 </ nav >
5079 </ div >
51-
80+
5281 { /* Menú móvil desplegable */ }
5382 { isMenuOpen && (
54- < div className = "md:hidden py-4" >
83+ < div className = "md:hidden py-4" ref = { menuRef } >
5584 < div className = "flex flex-col space-y-4" >
56- < Link href = "/" className = "text-white hover:text-green-400 transition" > Inicio</ Link >
57- < Link href = "/multimedia" className = "text-white hover:text-green-400 transition" > Multimedia</ Link >
58- < Link href = "/previous-editions" className = "text-white hover:text-green-400 transition" > Ediciones Anteriores</ Link >
59- < Link href = "/register" className = "text-white bg-green-600 hover:bg-green-700 px-4 py-2 rounded-full transition text-center" > Registrarse</ Link >
85+ < Link href = "/" onClick = { handleLinkClick } className = "text-white hover:text-green-400 transition" > Inicio</ Link >
86+ < Link href = "/talks" onClick = { handleLinkClick } className = "text-white hover:text-green-400 transition" > Charlas</ Link >
87+ < Link href = "/multimedia" onClick = { handleLinkClick } className = "text-white hover:text-green-400 transition" > Multimedia</ Link >
88+ < Link href = "/previous-editions" onClick = { handleLinkClick } className = "text-white hover:text-green-400 transition" > Ediciones Anteriores</ Link >
89+ < Link href = "/register" onClick = { handleLinkClick } className = "text-white bg-green-600 hover:bg-green-700 px-4 py-2 rounded-full transition text-center" > Registrarse</ Link >
6090 </ div >
6191 </ div >
6292 ) }
0 commit comments