1- import { ReactNode , useState } from "react" ;
1+ import { ReactNode , useRef , useState } from "react" ;
22import { useRouter } from "next/router" ;
33import Bars3Icon from "@heroicons/react/24/solid/Bars3Icon" ;
44
@@ -7,12 +7,20 @@ import Logo from "@/assets/images/brand/logo-200x200.webp";
77import Link from "./Link" ;
88import Button from "../controls/Button" ;
99import NavLink from "./NavLink" ;
10+ import useOutsideClick from "@/hooks/useOutsideClick" ;
1011
1112const Header = ( ) => {
1213 const router = useRouter ( ) ;
1314
15+ const buttonRef = useRef < HTMLButtonElement > ( null ) ;
16+ const itemsContainerRef = useRef < HTMLDivElement > ( null ) ;
17+
1418 const [ open , setOpen ] = useState ( false ) ;
1519
20+ useOutsideClick ( [ buttonRef , itemsContainerRef ] , ( e ) => {
21+ setOpen ( false ) ;
22+ } ) ;
23+
1624 return (
1725 < header className = "relative flex items-center w-full gap-4 p-4 transition-all md:px-8 md:gap-12" >
1826 < Link color = "primary" className = "flex items-center justify-center text-2xl font-bold transition-all lg:text-4xl" href = "/" >
@@ -25,10 +33,22 @@ const Header = () => {
2533 />
2634 < span > Commit Rocket</ span >
2735 </ Link >
28- < Button color = "secondary" className = "p-2 ml-auto rounded-full md:hidden" aria-expanded = { open } aria-controls = "header-items" onClick = { ( ) => setOpen ( ! open ) } >
36+ < Button
37+ ref = { buttonRef }
38+ className = "p-2 ml-auto rounded-full md:hidden"
39+ color = "secondary"
40+ aria-expanded = { open }
41+ aria-controls = "header-items"
42+ onClick = { ( ) => setOpen ( ! open ) }
43+ >
2944 < Bars3Icon className = "w-6 h-6" />
3045 </ Button >
31- < div id = "header-items" className = "absolute flex flex-col bg-fill gap-0 p-4 top-full inset-x-4 rounded-md shadow shadow-primary z-10 aria-[expanded='false']:hidden md:aria-[expanded='false']:flex md:flex-row md:items-center md:p-0 md:shadow-none md:static md:bg-transparent md:gap-12" >
46+ < div
47+ ref = { itemsContainerRef }
48+ className = "absolute flex flex-col bg-fill gap-0 p-4 top-full inset-x-4 rounded-md shadow shadow-primary z-10 data-[expanded='false']:hidden md:data-[expanded='false']:flex md:flex-row md:items-center md:p-0 md:shadow-none md:static md:bg-transparent md:gap-12"
49+ id = "header-items"
50+ data-expanded = { open }
51+ >
3252 < NavLink href = "/" currentHref = { router . pathname } >
3353 Home
3454 </ NavLink >
0 commit comments