feat(SW-572): Added support for logged in and logged out variants of the top link inside the header

This commit is contained in:
Erik Tiekstra
2024-11-11 14:03:08 +01:00
parent cc9f0509a1
commit d732138696
17 changed files with 215 additions and 68 deletions
@@ -2,5 +2,16 @@
display: flex;
align-items: center;
gap: var(--Spacing-x1);
font-size: var(--typography-Caption-Regular-fontSize);
}
.headerLink:hover {
color: var(--Base-Text-High-contrast);
}
.headerLink .icon * {
fill: var(--Base-Text-Medium-contrast);
}
.headerLink:hover .icon * {
fill: var(--Base-Text-High-contrast);
}
+16 -10
View File
@@ -1,4 +1,7 @@
import Link from "@/components/TempDesignSystem/Link"
import Link from "next/link"
import { getIconByIconName } from "@/components/Icons/get-icon-by-icon-name"
import Caption from "@/components/TempDesignSystem/Text/Caption"
import styles from "./headerLink.module.css"
@@ -6,16 +9,19 @@ import type { HeaderLinkProps } from "@/types/components/header/headerLink"
export default function HeaderLink({
children,
className,
...props
href,
iconName,
iconSize = 20,
}: HeaderLinkProps) {
const Icon = getIconByIconName(iconName)
return (
<Link
color="burgundy"
className={`${styles.headerLink} ${className}`}
{...props}
>
{children}
</Link>
<Caption type="regular" color="textMediumContrast" asChild>
<Link href={href} className={styles.headerLink}>
{Icon ? (
<Icon className={styles.icon} width={iconSize} height={iconSize} />
) : null}
{children}
</Link>
</Caption>
)
}
@@ -7,21 +7,23 @@ import { useMediaQuery } from "usehooks-ts"
import useDropdownStore from "@/stores/main-menu"
import { GiftIcon, SearchIcon, ServiceIcon } from "@/components/Icons"
import LanguageSwitcher from "@/components/LanguageSwitcher"
import { useHandleKeyUp } from "@/hooks/useHandleKeyUp"
import HeaderLink from "../../HeaderLink"
import TopLink from "../../TopLink"
import styles from "./mobileMenu.module.css"
import { DropdownTypeEnum } from "@/types/components/dropdown/dropdown"
import type { MobileMenuProps } from "@/types/components/header/mobileMenu"
import { IconName } from "@/types/components/icon"
export default function MobileMenu({
children,
languageUrls,
topLink,
isLoggedIn,
}: React.PropsWithChildren<MobileMenuProps>) {
const intl = useIntl()
const {
@@ -77,18 +79,11 @@ export default function MobileMenu({
>
<Suspense fallback={"Loading nav"}>{children}</Suspense>
<footer className={styles.footer}>
<HeaderLink href="#">
<SearchIcon width={20} height={20} color="burgundy" />
<HeaderLink href="#" iconName={IconName.Search}>
{intl.formatMessage({ id: "Find booking" })}
</HeaderLink>
{topLink.link ? (
<HeaderLink href={topLink.link.url}>
<GiftIcon width={20} height={20} color="burgundy" />
{topLink.title}
</HeaderLink>
) : null}
<HeaderLink href="#">
<ServiceIcon width={20} height={20} color="burgundy" />
<TopLink isLoggedIn={isLoggedIn} topLink={topLink} iconSize={20} />
<HeaderLink href="#" iconName={IconName.Service}>
{intl.formatMessage({ id: "Customer service" })}
</HeaderLink>
<LanguageSwitcher type="mobileHeader" urls={languageUrls} />
@@ -1,4 +1,8 @@
import { getHeader, getLanguageSwitcher } from "@/lib/trpc/memoizedRequests"
import {
getHeader,
getLanguageSwitcher,
getName,
} from "@/lib/trpc/memoizedRequests"
import MobileMenu from "../MobileMenu"
@@ -8,13 +12,18 @@ export default async function MobileMenuWrapper({
// preloaded
const languages = await getLanguageSwitcher()
const header = await getHeader()
const user = await getName()
if (!languages || !header) {
return null
}
return (
<MobileMenu languageUrls={languages.urls} topLink={header.data.topLink}>
<MobileMenu
languageUrls={languages.urls}
topLink={header.data.topLink}
isLoggedIn={!!user}
>
{children}
</MobileMenu>
)
+26
View File
@@ -0,0 +1,26 @@
import HeaderLink from "../HeaderLink"
import type { TopLinkProps } from "@/types/components/header/topLink"
import { IconName } from "@/types/components/icon"
export default function TopLink({
isLoggedIn,
topLink,
iconSize = 16,
}: TopLinkProps) {
const linkData = isLoggedIn ? topLink.logged_in : topLink.logged_out
if (!linkData?.link?.url || !linkData?.title) {
return null
}
return (
<HeaderLink
href={linkData.link.url}
iconName={linkData.icon || IconName.Gift}
iconSize={iconSize}
>
{linkData.title}
</HeaderLink>
)
}
+12 -19
View File
@@ -1,21 +1,27 @@
import { getHeader, getLanguageSwitcher } from "@/lib/trpc/memoizedRequests"
import {
getHeader,
getLanguageSwitcher,
getName,
} from "@/lib/trpc/memoizedRequests"
import { GiftIcon, SearchIcon } from "@/components/Icons"
import LanguageSwitcher from "@/components/LanguageSwitcher"
import Link from "@/components/TempDesignSystem/Link"
import Caption from "@/components/TempDesignSystem/Text/Caption"
import { getIntl } from "@/i18n"
import HeaderLink from "../HeaderLink"
import TopLink from "../TopLink"
import styles from "./topMenu.module.css"
import { IconName } from "@/types/components/icon"
export default async function TopMenu() {
// cached
const intl = await getIntl()
// both preloaded
const languages = await getLanguageSwitcher()
const header = await getHeader()
const user = await getName()
if (!languages || !header) {
return null
@@ -24,28 +30,15 @@ export default async function TopMenu() {
return (
<div className={styles.topMenu}>
<div className={styles.content}>
{header.data.topLink.link ? (
<Caption type="regular" color="textMediumContrast" asChild>
<Link
href={header.data.topLink.link.url}
color="peach80"
variant="icon"
>
<GiftIcon width={20} height={20} />
{header.data.topLink.title}
</Link>
</Caption>
) : null}
<TopLink isLoggedIn={!!user} topLink={header.data.topLink} />
<div className={styles.options}>
<LanguageSwitcher type="desktopHeader" urls={languages.urls} />
<Caption type="regular" color="textMediumContrast" asChild>
<Link href="#" color="peach80" variant="icon">
<SearchIcon width={20} height={20} />
<HeaderLink href="#" iconName={IconName.Search}>
{intl.formatMessage({ id: "Find booking" })}
</Link>
</HeaderLink>
</Caption>
<HeaderLink href="#"></HeaderLink>
</div>
</div>
</div>
+7 -1
View File
@@ -1,6 +1,10 @@
import { Suspense } from "react"
import { getHeader, getLanguageSwitcher } from "@/lib/trpc/memoizedRequests"
import {
getHeader,
getLanguageSwitcher,
getName,
} from "@/lib/trpc/memoizedRequests"
import MainMenu from "./MainMenu"
import TopMenu from "./TopMenu"
@@ -10,6 +14,8 @@ import styles from "./header.module.css"
export default function Header() {
void getHeader()
void getLanguageSwitcher()
void getName()
return (
<header className={styles.header}>
<Suspense fallback="Loading top menu">