From 7f0a5dccb139504346a431c15e8c6ca35c94f820 Mon Sep 17 00:00:00 2001 From: elisejakob Date: Mon, 13 May 2024 00:49:52 +0200 Subject: [PATCH] improve main menu interactions --- .../components/events/eventHeader.module.scss | 1 + web/src/components/layout/Header.tsx | 97 ++++++++++++++++--- web/src/components/layout/header.module.scss | 29 ++++-- 3 files changed, 107 insertions(+), 20 deletions(-) diff --git a/web/src/components/events/eventHeader.module.scss b/web/src/components/events/eventHeader.module.scss index fa8e5a9..3faf4bc 100644 --- a/web/src/components/events/eventHeader.module.scss +++ b/web/src/components/events/eventHeader.module.scss @@ -13,6 +13,7 @@ .image { grid-column: span 2; + margin-top: calc(var(--spacing-sitepadding)*-2); img { max-width: 100%; diff --git a/web/src/components/layout/Header.tsx b/web/src/components/layout/Header.tsx index fd1d43a..902420d 100644 --- a/web/src/components/layout/Header.tsx +++ b/web/src/components/layout/Header.tsx @@ -1,5 +1,6 @@ "use client"; -import { useState } from "react"; +import { useState, useEffect, useRef } from "react"; +import { usePathname } from "next/navigation"; import Link from "next/link"; import styles from "./header.module.scss"; import { Logo } from "../general/Logo"; @@ -9,25 +10,74 @@ export const Header = () => { function toggleMenu() { setShowMenu(!showMenu); } + const siteMenu = useRef(null); + useEffect(() => { + // only add the event listener when the siteMenu is opened + if (!showMenu) return; + function handleClick(event: Event) { + if ( + siteMenu.current && + !siteMenu.current.contains(event.target as Node) + ) { + setShowMenu(false); + setActiveMenuItem(undefined); + } + } + window.addEventListener("click", handleClick); + // clean up + return () => window.removeEventListener("click", handleClick); + }, [showMenu]); + + useEffect(() => { + if (showMenu) { + document.body.style.overflow = "hidden"; + document.body.style.height = "100vh"; + } else { + document.body.style.overflow = ""; + document.body.style.height = ""; + } + }, [showMenu]); + + const pathname = usePathname(); + useEffect(() => { + // hide menu on path change + setShowMenu(false); + setActiveMenuItem(undefined); + }, [pathname]); + + const [activeMenuItem, setActiveMenuItem] = useState( + undefined + ); return (
-