22import Link from "next/link"
33import Image from "next/image"
44import { useCallback , useEffect , useRef , useState } from "react"
5+ import { useIsMobile } from "@/hooks/use-mobile"
56import { HeaderMenu } from "./header-menu"
67import { AnimatePresence } from "motion/react"
78import { merge } from "@halvaradop/ui-core"
@@ -10,36 +11,31 @@ import menu from "@/assets/menu.svg"
1011import arrow from "@/assets/arrow.svg"
1112
1213export const Header = ( ) => {
14+ const isMobile = useIsMobile ( )
1315 const [ isOpen , setIsOpen ] = useState ( false )
1416 const menuRef = useRef < HTMLDivElement > ( null )
1517
1618 const handleToggleMenu = ( ) => {
17- setIsOpen ( ! isOpen )
19+ setIsOpen ( previous => ! previous )
1820 }
1921
2022 const handleMenuLinkClick = useCallback ( ( ) => {
21- if ( window . innerWidth < 900 ) {
23+ if ( ! isMobile ) {
2224 setIsOpen ( false )
2325 }
2426 } , [ ] )
2527
2628 useEffect ( ( ) => {
27- const matchScreen = matchMedia ( "(min-width: 900px)" )
28-
29- const handleSetMatchMedia = ( ) => {
30- setIsOpen ( matchScreen . matches )
31- }
32-
33- setIsOpen ( matchScreen . matches )
34- matchScreen . addEventListener ( "change" , handleSetMatchMedia )
35- return ( ) => matchScreen . removeEventListener ( "change" , handleSetMatchMedia )
36- } , [ ] )
29+ setIsOpen ( ! isMobile )
30+ } , [ isMobile ] )
3731
3832 useEffect ( ( ) => {
3933 if ( ! isOpen ) return
4034 const handleClickOutside = ( event : MouseEvent ) => {
41- if ( window . innerWidth < 900 && menuRef . current && ! menuRef . current . contains ( event . target as Node ) ) {
42- setIsOpen ( false )
35+ const node = event . target as HTMLElement
36+ if ( node . hasAttribute ( "aria-description" ) && node . getAttribute ( "aria-description" ) === "menu icon" ) return
37+ if ( isMobile && menuRef . current && ! menuRef . current . contains ( event . target as Node ) ) {
38+ setIsOpen ( ( ) => false )
4339 }
4440 }
4541 document . addEventListener ( "mousedown" , handleClickOutside )
@@ -57,7 +53,7 @@ export const Header = () => {
5753 < Link href = "/" > @halvaradop/tailwindcss</ Link >
5854 </ h2 >
5955 </ div >
60- < div ref = { menuRef } style = { { display : "contents" } } >
56+ < div ref = { menuRef } >
6157 < AnimatePresence mode = "wait" > { isOpen && < HeaderMenu onLinkClick = { handleMenuLinkClick } /> } </ AnimatePresence >
6258 </ div >
6359 </ nav >
@@ -66,7 +62,7 @@ export const Header = () => {
6662 variant = "ghost"
6763 onClick = { handleToggleMenu }
6864 >
69- < Image className = "hover:cursor-pointer" src = { menu } alt = "menu icon" />
65+ < Image className = "hover:cursor-pointer" src = { menu } alt = "menu icon" aria-description = "menu icon" />
7066 </ Button >
7167 < figure className = "group w-10 h-16 hidden img:transition-transform img:ease-linear img:duration-300 hover:cursor-pointer base:w-16 base:flex base:items-center base:justify-center base:relative base:overflow-hidden" >
7268 < Image
0 commit comments