diff --git a/app/[lang]/(live)/@header/[...paths]/@myPagesMobileDropdown/page.tsx b/app/[lang]/(live)/@header/[...paths]/@myPagesMobileDropdown/page.tsx new file mode 100644 index 000000000..92e3a69b4 --- /dev/null +++ b/app/[lang]/(live)/@header/[...paths]/@myPagesMobileDropdown/page.tsx @@ -0,0 +1,10 @@ +import { logout } from "@/constants/routes/handleAuth" +import { serverClient } from "@/lib/trpc/server" + +import MyPagesMobileDropdown from "@/components/Current/Header/MyPagesMobileDropdown" + +export default async function MyPagesMobileDropdownPage() { + // TODO: Figure out how to pass down props at the paralell route level. + // - POssibly by parsing [...paths] + return +} diff --git a/app/[lang]/(live)/@header/[...paths]/layout.tsx b/app/[lang]/(live)/@header/[...paths]/layout.tsx index 8b88b75e1..73a42092b 100644 --- a/app/[lang]/(live)/@header/[...paths]/layout.tsx +++ b/app/[lang]/(live)/@header/[...paths]/layout.tsx @@ -5,8 +5,15 @@ import { LangParams, PageArgs } from "@/types/params" export default function HeaderLayout({ params, languageSwitcher, + myPagesMobileDropdown, }: PageArgs & { languageSwitcher: React.ReactNode -}) { - return +} & { myPagesMobileDropdown: React.ReactNode }) { + return ( + + ) } diff --git a/app/[lang]/(live)/@header/page.tsx b/app/[lang]/(live)/@header/page.tsx index 53bf8ae11..1e4be86af 100644 --- a/app/[lang]/(live)/@header/page.tsx +++ b/app/[lang]/(live)/@header/page.tsx @@ -2,6 +2,7 @@ import { baseUrls } from "@/constants/routes/baseUrls" import Header from "@/components/Current/Header" import LanguageSwitcher from "@/components/Current/Header/LanguageSwitcher" +import MyPagesMobileDropdown from "@/components/Current/Header/MyPagesMobileDropdown" import { LangParams, PageArgs } from "@/types/params" @@ -9,6 +10,7 @@ export default async function HeaderPage({ params }: PageArgs) { return ( } languageSwitcher={} /> ) diff --git a/app/[lang]/(live-current)/@myPagesMobileDropdown/page.tsx b/app/[lang]/(live-current)/@myPagesMobileDropdown/page.tsx new file mode 100644 index 000000000..bbcb00595 --- /dev/null +++ b/app/[lang]/(live-current)/@myPagesMobileDropdown/page.tsx @@ -0,0 +1,12 @@ +import { serverClient } from "@/lib/trpc/server" + +import MyPagesMobileDropdown from "@/components/Current/Header/MyPagesMobileDropdown" + +export default async function MyPagesMobileDropdownPage() { + // TODO: Dirty way to get lang value. Figure out a proper way. + const data = await serverClient().contentstack.languageSwitcher.get() + if (!data) { + return null + } + return +} diff --git a/app/[lang]/(live-current)/layout.tsx b/app/[lang]/(live-current)/layout.tsx index ce6ac8a4d..9712b1a86 100644 --- a/app/[lang]/(live-current)/layout.tsx +++ b/app/[lang]/(live-current)/layout.tsx @@ -24,8 +24,11 @@ export default async function RootLayout({ children, params, languageSwitcher, + myPagesMobileDropdown, }: React.PropsWithChildren< - LayoutArgs & { languageSwitcher: React.ReactNode } + LayoutArgs & { languageSwitcher: React.ReactNode } & { + myPagesMobileDropdown: React.ReactNode + } >) { const { defaultLocale, locale, messages } = await getIntl() return ( @@ -82,7 +85,11 @@ export default async function RootLayout({ - + {children} diff --git a/components/Current/Header/MainMenu/index.tsx b/components/Current/Header/MainMenu/index.tsx index 1c84c7e3e..366c5ab2b 100644 --- a/components/Current/Header/MainMenu/index.tsx +++ b/components/Current/Header/MainMenu/index.tsx @@ -4,6 +4,7 @@ import { useIntl } from "react-intl" import { login } from "@/constants/routes/handleAuth" import { myPages } from "@/constants/routes/myPages" +import useDropdownStore from "@/stores/main-menu" import Image from "@/components/Image" import Link from "@/components/TempDesignSystem/Link" @@ -21,16 +22,19 @@ export function MainMenu({ logo, topMenuMobileLinks, languageSwitcher, + myPagesMobileDropdown, bookingHref, isLoggedIn, lang, }: MainMenuProps) { const intl = useIntl() - const [isOpen, setIsOpen] = useState(false) - function toogleIsOpen() { - setIsOpen((prevIsOpen) => !prevIsOpen) - } + const { + isHamburgerMenuOpen, + isMyPagesMobileMenuOpen, + toggleHamburgerMenu, + toggleMyPagesMobileMenu, + } = useDropdownStore() return ( @@ -43,8 +47,8 @@ export function MainMenu({ @@ -66,7 +70,7 @@ export function MainMenu({ {isLoggedIn ? ( @@ -140,7 +144,17 @@ export function MainMenu({ + {/* {myPagesMobileDropdown ? ( */} + {/* toggleMyPagesMobileMenu()} */} + {/* className={styles.userAvatar} */} + {/* > */} + {/* CM */} + {/* */} + {/* ) : null} */} + {/* {isMyPagesMenuOpen ? myPagesMobileDropdown : null} */} diff --git a/components/Current/Header/MyPagesMobileDropdown/index.tsx b/components/Current/Header/MyPagesMobileDropdown/index.tsx new file mode 100644 index 000000000..28db26551 --- /dev/null +++ b/components/Current/Header/MyPagesMobileDropdown/index.tsx @@ -0,0 +1,69 @@ +import { Fragment } from "react" + +import { Lang } from "@/constants/languages" +import { logout } from "@/constants/routes/handleAuth" +import { serverClient } from "@/lib/trpc/server" + +import Divider from "@/components/TempDesignSystem/Divider" +import Link from "@/components/TempDesignSystem/Link" +import Title from "@/components/TempDesignSystem/Text/Title" + +import styles from "./my-pages-mobile-dropdown.module.css" + +export default async function MyPagesMobileDropdown({ + lang, +}: { + lang: Lang | null +}) { + const navigation = await serverClient().contentstack.myPages.navigation.get() + if (!navigation) { + return null + } + + return ( + + + {navigation.title} + + {navigation.menuItems.map((menuItem, idx) => ( + + {/*TODO: add pale color? */} + + + + {menuItem.links.map((link) => ( + + + {/*TODO: add myPageMobileMenu variant */} + {link.linkText} + + + ))} + {/* {menuItem.display_sign_out_link ? ( */} + {/* */} + {/* */} + {/* {formatMessage({ id: "Log out" })} */} + {/* */} + {/* */} + {/* ) : null} */} + + + + ))} + + ) +} diff --git a/components/Current/Header/MyPagesMobileDropdown/my-pages-mobile-dropdown.module.css b/components/Current/Header/MyPagesMobileDropdown/my-pages-mobile-dropdown.module.css new file mode 100644 index 000000000..a3b6c3081 --- /dev/null +++ b/components/Current/Header/MyPagesMobileDropdown/my-pages-mobile-dropdown.module.css @@ -0,0 +1,55 @@ +.navigationMenu { + background-color: #fff; + border-top: 1px solid #e3e0db; + display: none; + list-style: none; + overflow-y: visible; + margin: 0; + padding-inline-start: 0; +} + +.navigationMenu.navigationMenuIsOpen { + display: block; + left: 0; + position: absolute; + right: 0; + top: 100%; +} + +.dropdownWrapper { + display: flex; + width: 100%; + padding: 20px; + flex-direction: column; + justify-content: center; + align-items: flex-start; + background-color: var(--Main-Grey-White); + box-shadow: + 0px 276px 77px 0px rgba(0, 0, 0, 0), + 0px 177px 71px 0px rgba(0, 0, 0, 0.01), + 0px 99px 60px 0px rgba(0, 0, 0, 0.05), + 0px 44px 44px 0px rgba(0, 0, 0, 0.09), + 0px 11px 24px 0px rgba(0, 0, 0, 0.1); +} + +.heading { + padding: 20px; +} + +.dropdownLinks { + display: flex; + flex-direction: column; + gap: var(--Spacing-x-half); + width: 100%; + list-style: none; +} + +@media screen and (min-width: 950px) { + .navigationMenu { + display: none; + } + + .navigationMenu.navigationMenuIsOpen { + display: none; + } +} diff --git a/components/Current/Header/index.tsx b/components/Current/Header/index.tsx index b72164ab4..000b139ed 100644 --- a/components/Current/Header/index.tsx +++ b/components/Current/Header/index.tsx @@ -15,7 +15,10 @@ import { LangParams } from "@/types/params" export default async function Header({ lang, languageSwitcher, -}: LangParams & { languageSwitcher: React.ReactNode }) { + myPagesMobileDropdown, +}: LangParams & { languageSwitcher: React.ReactNode } & { + myPagesMobileDropdown: React.ReactNode +}) { const data = await serverClient().contentstack.base.header({ lang, }) @@ -49,6 +52,7 @@ export default async function Header({ logo={logo} topMenuMobileLinks={topMenuMobileLinks} languageSwitcher={languageSwitcher} + myPagesMobileDropdown={myPagesMobileDropdown} bookingHref={homeHref} isLoggedIn={!!session} lang={lang} diff --git a/stores/main-menu.ts b/stores/main-menu.ts new file mode 100644 index 000000000..cbd6f1004 --- /dev/null +++ b/stores/main-menu.ts @@ -0,0 +1,31 @@ +import { create } from "zustand" + +interface DropdownState { + isHamburgerMenuOpen: boolean + isMyPagesMobileMenuOpen: boolean + toggleHamburgerMenu: () => void + toggleMyPagesMobileMenu: () => void +} + +const useDropdownStore = create((set) => ({ + isHamburgerMenuOpen: false, + isMyPagesMobileMenuOpen: false, + toggleHamburgerMenu: () => + set((state) => { + // Close the other dropdown if it's open + if (!state.isHamburgerMenuOpen && state.isMyPagesMobileMenuOpen) { + set({ isMyPagesMobileMenuOpen: false }) + } + return { isHamburgerMenuOpen: !state.isHamburgerMenuOpen } + }), + toggleMyPagesMobileMenu: () => + set((state) => { + // Close the other dropdown if it's open + if (!state.isMyPagesMobileMenuOpen && state.isHamburgerMenuOpen) { + set({ isHamburgerMenuOpen: false }) + } + return { isMyPagesMobileMenuOpen: !state.isMyPagesMobileMenuOpen } + }), +})) + +export default useDropdownStore diff --git a/types/components/current/header/mainMenu.ts b/types/components/current/header/mainMenu.ts index 7604c12b1..86347a530 100644 --- a/types/components/current/header/mainMenu.ts +++ b/types/components/current/header/mainMenu.ts @@ -13,6 +13,7 @@ export type MainMenuProps = { logo: Image topMenuMobileLinks: TopMenuHeaderLink[] languageSwitcher: React.ReactNode | null + myPagesMobileDropdown: React.ReactNode | null bookingHref: string isLoggedIn: boolean lang: Lang