From 9fcf362587049047c7759ebcc1e6d54ec395ab14 Mon Sep 17 00:00:00 2001 From: Erik Tiekstra Date: Fri, 20 Sep 2024 14:27:20 +0200 Subject: [PATCH] feat(SW-272) added mega menu --- .../MyPagesMenu/myPagesMenu.module.css | 17 --- .../NavigationMenuItem/index.tsx | 112 ++++++++++++++---- .../navigationMenuItem.module.css | 105 ++++++++++++++++ .../TempDesignSystem/Card/card.module.css | 38 ++++-- components/TempDesignSystem/Card/card.ts | 10 +- components/TempDesignSystem/Card/index.tsx | 22 ++-- stores/main-menu.ts | 58 +++++++++ types/components/dropdown/dropdown.ts | 3 + 8 files changed, 307 insertions(+), 58 deletions(-) diff --git a/components/Header/MainMenu/MyPagesMenu/myPagesMenu.module.css b/components/Header/MainMenu/MyPagesMenu/myPagesMenu.module.css index 39002b177..02d097654 100644 --- a/components/Header/MainMenu/MyPagesMenu/myPagesMenu.module.css +++ b/components/Header/MainMenu/MyPagesMenu/myPagesMenu.module.css @@ -26,21 +26,4 @@ min-width: 20rem; z-index: var(--menu-overlay-z-index); } - - /* Triangle above dropdown */ - .dropdown::before { - content: ""; - position: absolute; - top: -1.25rem; - right: 2.4rem; - transform: rotate(180deg); - border-width: 0.75rem; - border-style: solid; - border-color: var(--Base-Surface-Primary-light-Normal) transparent - transparent transparent; - } - - .dropdown.isExpanded { - display: block; - } } diff --git a/components/Header/MainMenu/NavigationMenu/NavigationMenuItem/index.tsx b/components/Header/MainMenu/NavigationMenu/NavigationMenuItem/index.tsx index 453a02b46..5b1b2c80a 100644 --- a/components/Header/MainMenu/NavigationMenu/NavigationMenuItem/index.tsx +++ b/components/Header/MainMenu/NavigationMenu/NavigationMenuItem/index.tsx @@ -1,9 +1,16 @@ "use client" -import { useState } from "react" +import useDropdownStore from "@/stores/main-menu" -import { ChevronDownIcon, ChevronRightIcon } from "@/components/Icons" +import { + ArrowRightIcon, + ChevronDownIcon, + ChevronRightIcon, +} from "@/components/Icons" +import Card from "@/components/TempDesignSystem/Card" import Link from "@/components/TempDesignSystem/Link" +import Caption from "@/components/TempDesignSystem/Text/Caption" +import { useHandleKeyUp } from "@/hooks/useHandleKeyUp" import MainMenuButton from "../../MainMenuButton" @@ -12,28 +19,93 @@ import styles from "./navigationMenuItem.module.css" import type { NavigationMenuItemProps } from "@/types/components/header/navigationMenuItem" export default function MenuItem({ item, isMobile }: NavigationMenuItemProps) { - const { submenu, title, link } = item - const [isExpanded, setIsExpanded] = useState(false) // TODO: Use store to manage this state when adding the menu itself. + const { openMegaMenu, toggleMegaMenu } = useDropdownStore() + const { submenu, title, link, seeAllLink, card } = item + const isMegaMenuOpen = openMegaMenu === title - function handleButtonClick() { - setIsExpanded((prev) => !prev) + useHandleKeyUp((event: KeyboardEvent) => { + if (event.key === "Escape" && isMegaMenuOpen) { + toggleMegaMenu(false) + } + }) + + function handleLinkClick() { + toggleMegaMenu(false) } return submenu.length ? ( - - {title} - {isMobile ? ( - - ) : ( - - )} - + + toggleMegaMenu(title)} + className={`${styles.navigationMenuItem} ${isMobile ? styles.mobile : styles.desktop}`} + > + {title} + {isMobile ? ( + + ) : ( + + )} + + {isMegaMenuOpen ? ( + + ) : null} + ) : ( void + onSecondaryButtonClick?: () => void } diff --git a/components/TempDesignSystem/Card/index.tsx b/components/TempDesignSystem/Card/index.tsx index d611c784a..c4f414359 100644 --- a/components/TempDesignSystem/Card/index.tsx +++ b/components/TempDesignSystem/Card/index.tsx @@ -21,24 +21,28 @@ export default function Card({ className, theme, backgroundImage, + onPrimaryButtonClick, + onSecondaryButtonClick, }: CardProps) { const { buttonTheme, primaryLinkColor, secondaryLinkColor } = getTheme(theme) return (
{backgroundImage && ( - {backgroundImage.meta.alt +
+ {backgroundImage.meta.alt +
)}
{scriptedTopTitle ? ( @@ -73,6 +77,7 @@ export default function Card({ href={primaryButton.href} target={primaryButton.openInNewTab ? "_blank" : undefined} color={primaryLinkColor} + onClick={onPrimaryButtonClick} > {primaryButton.title} @@ -90,6 +95,7 @@ export default function Card({ href={secondaryButton.href} target={secondaryButton.openInNewTab ? "_blank" : undefined} color={secondaryLinkColor} + onClick={onSecondaryButtonClick} > {secondaryButton.title} diff --git a/stores/main-menu.ts b/stores/main-menu.ts index 4ccbcb290..cae5320b5 100644 --- a/stores/main-menu.ts +++ b/stores/main-menu.ts @@ -16,6 +16,7 @@ const useDropdownStore = create((set, get) => ({ isHeaderLanguageSwitcherOpen: false, isHeaderLanguageSwitcherMobileOpen: false, isFooterLanguageSwitcherOpen: false, + openMegaMenu: false, handleHamburgerClick: () => { const state = get() if (state.isMyPagesMobileMenuOpen) { @@ -31,9 +32,27 @@ const useDropdownStore = create((set, get) => ({ } } }, + toggleMegaMenu: (menu: string | false) => + set( + produce((state: DropdownState) => { + if (state.openMegaMenu === menu) { + state.openMegaMenu = false + } else { + state.openMegaMenu = menu + } + state.isHamburgerMenuOpen = false + state.isMyPagesMobileMenuOpen = false + state.isMyPagesMenuOpen = false + state.isHeaderLanguageSwitcherOpen = false + state.isHeaderLanguageSwitcherMobileOpen = false + state.isFooterLanguageSwitcherOpen = false + }) + ), toggleDropdown: (dropdown: DropdownTypeEnum) => set( produce((state: DropdownState) => { + state.openMegaMenu = false + switch (dropdown) { case DropdownTypeEnum.HamburgerMenu: state.isHamburgerMenuOpen = !state.isHamburgerMenuOpen @@ -97,3 +116,42 @@ const useDropdownStore = create((set, get) => ({ })) export default useDropdownStore + +const error = [ + { + query: { + hotelId: "698", + params: { hotelId: "698", language: "En", include: "RoomCategories" }, + }, + }, + { + query: { lang: "en" }, + error: { + issues: [ + { + code: "invalid_type", + expected: "object", + received: "undefined", + path: [ + "all_header", + "items", + 0, + "menu_items", + 0, + "submenu", + 0, + "links", + 0, + "linkConnection", + "edges", + 0, + "node", + "web", + ], + message: "Required", + }, + ], + name: "ZodError", + }, + }, +] diff --git a/types/components/dropdown/dropdown.ts b/types/components/dropdown/dropdown.ts index 899086336..e282e5ee1 100644 --- a/types/components/dropdown/dropdown.ts +++ b/types/components/dropdown/dropdown.ts @@ -5,6 +5,8 @@ export interface DropdownState { isHeaderLanguageSwitcherOpen: boolean isHeaderLanguageSwitcherMobileOpen: boolean isFooterLanguageSwitcherOpen: boolean + openMegaMenu: string | false + toggleMegaMenu: (menu: string | false) => void toggleDropdown: (dropdown: DropdownTypeEnum) => void handleHamburgerClick: () => void } @@ -16,6 +18,7 @@ export enum DropdownTypeEnum { HeaderLanguageSwitcher = "headerLanguageSwitcher", HeaderLanguageSwitcherMobile = "headerLanguageSwitcherMobile", FooterLanguageSwitcher = "footerLanguageSwitcher", + MegaMenu = "megaMenu", } export type DropdownType = `${DropdownTypeEnum}`