interface HamburgerClose { menuVisible: boolean; setMenuVisible: Dispatch>; menuRef: RefObject; hamburgerButtonRef: RefObject; mouseOverMenu: boolean; setMouseOverMenu: Dispatch>; timeoutRef: RefObject; menuTimeout: () => void; } import { Dispatch, RefObject, SetStateAction, useEffect } from "react"; const useHamburgerClose = ({ menuVisible, setMenuVisible, menuRef, hamburgerButtonRef, mouseOverMenu, setMouseOverMenu, timeoutRef, menuTimeout, }: HamburgerClose) => { useEffect(() => { const handleMouseDownOutsideMenu = (event: MouseEvent) => { if ( menuVisible && menuRef.current && !menuRef.current.contains(event.target as Node) && hamburgerButtonRef.current && !hamburgerButtonRef.current.contains(event.target as Node) ) { setMenuVisible(false); setMouseOverMenu(false); } }; document.addEventListener("mousedown", handleMouseDownOutsideMenu); return () => { document.removeEventListener("mousedown", handleMouseDownOutsideMenu); }; }, [menuVisible]); useEffect(() => { if (menuVisible && !mouseOverMenu) { menuTimeout(); } else { if (timeoutRef.current) { clearTimeout(timeoutRef.current); } } }, [mouseOverMenu, menuVisible]); }; export default useHamburgerClose;