Merged in feat/sw-2865-move-navigation-router-to-trpc-package (pull request #2427)

feat(SW-2862): Move navigation router to trpc package

* Fix most errors in scandic-web

Just 100 left...

* Move Props type out of trpc

* Fix CategorizedFilters types

* Move more schemas in hotel router

* Fix deps

* fix getNonContentstackUrls

* Fix import error

* Fix entry error handling

* Fix generateMetadata metrics

* Fix alertType enum

* Fix duplicated types

* lint:fix

* Merge branch 'master' into feat/sw-2863-move-contentstack-router-to-trpc-package

* Fix broken imports

* Move booking router to trpc package

* Move partners router to trpc package

* Move autocomplete router to trpc package

* Move booking router to trpc package

* Remove translations from My Pages navigation trpc procedure

* Move navigation router to trpc package

* Merge branch 'master' into feat/sw-2862-move-booking-router-to-trpc-package

* Merge branch 'feat/sw-2862-move-booking-router-to-trpc-package' into feat/sw-2865-move-navigation-router-to-trpc-package

* Merge branch 'master' into feat/sw-2865-move-navigation-router-to-trpc-package

* Merge branch 'master' into feat/sw-2865-move-navigation-router-to-trpc-package

* Merge branch 'master' into feat/sw-2865-move-navigation-router-to-trpc-package


Approved-by: Linus Flood
This commit is contained in:
Anton Gunnarsson
2025-06-27 06:54:49 +00:00
parent 39250e21e3
commit 00bcdaaa28
39 changed files with 150 additions and 130 deletions

View File

@@ -1,8 +1,9 @@
import { getEurobonusMembership } from "@scandic-hotels/trpc/routers/user/helpers"
import { getProfileSafely } from "@/lib/trpc/memoizedRequests"
import { SASLevelUpgradeCheck } from "@/components/MyPages/SASLevelUpgradeCheck"
import Surprises from "@/components/MyPages/Surprises"
import { getEurobonusMembership } from "@/utils/user"
import styles from "./layout.module.css"

View File

@@ -1,7 +1,8 @@
import { headers } from "next/headers"
import { notFound, redirect } from "next/navigation"
import { overview } from "@/constants/routes/myPages"
import { overview } from "@scandic-hotels/common/constants/routes/myPages"
import { isSignupPage } from "@/constants/routes/signup"
import { env } from "@/env/server"

View File

@@ -2,11 +2,10 @@
import Link from "next/link"
import { useIntl } from "react-intl"
import { partnerSas } from "@scandic-hotels/common/constants/routes/myPages"
import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon"
import { Typography } from "@scandic-hotels/design-system/Typography"
import { partnerSas } from "@/constants/routes/myPages"
import Button from "@/components/TempDesignSystem/Button"
import useLang from "@/hooks/useLang"

View File

@@ -2,11 +2,10 @@
import { Link } from "react-aria-components"
import { useIntl } from "react-intl"
import { profile } from "@scandic-hotels/common/constants/routes/myPages"
import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon"
import { Typography } from "@scandic-hotels/design-system/Typography"
import { profile } from "@/constants/routes/myPages"
import Button from "@/components/TempDesignSystem/Button"
import useLang from "@/hooks/useLang"

View File

@@ -1,6 +1,6 @@
import { ArrowLeft } from "react-feather"
import { overview as profileOverview } from "@/constants/routes/myPages"
import { overview as profileOverview } from "@scandic-hotels/common/constants/routes/myPages"
import Image from "@/components/Image"
import Link from "@/components/TempDesignSystem/Link"
@@ -13,12 +13,12 @@ import type { PropsWithChildren } from "react"
import type { LangParams, LayoutArgs } from "@/types/params"
export default async function SasXScandicLayout(props: PropsWithChildren<LayoutArgs<LangParams>>) {
const params = await props.params;
export default async function SasXScandicLayout(
props: PropsWithChildren<LayoutArgs<LangParams>>
) {
const params = await props.params
const {
children
} = props;
const { children } = props
const intl = await getIntl()

View File

@@ -5,10 +5,10 @@ import { useTransition } from "react"
import { FormProvider, useForm } from "react-hook-form"
import { useIntl } from "react-intl"
import { profileEdit } from "@scandic-hotels/common/constants/routes/myPages"
import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon"
import { Typography } from "@scandic-hotels/design-system/Typography"
import { profileEdit } from "@/constants/routes/myPages"
import { sasPartnershipTermsAndConditions } from "@/constants/webHrefs"
import Image from "@/components/Image"

View File

@@ -1,9 +1,9 @@
import { redirect } from "next/navigation"
import React from "react"
import { getProfileSafely } from "@/lib/trpc/memoizedRequests"
import { getEurobonusMembership } from "@scandic-hotels/trpc/routers/user/helpers"
import { getEurobonusMembership } from "@/utils/user"
import { getProfileSafely } from "@/lib/trpc/memoizedRequests"
import { SASModal } from "../components/SASModal"
import { LinkAccountForm } from "./LinkAccountForm"
@@ -11,7 +11,7 @@ import { LinkAccountForm } from "./LinkAccountForm"
import type { LangParams, PageArgs } from "@/types/params"
export default async function SASxScandicLinkPage(props: PageArgs<LangParams>) {
const params = await props.params;
const params = await props.params
const profile = await getProfileSafely()
if (!profile || !profile.loyalty) return null

View File

@@ -1,10 +1,9 @@
import React from "react"
import { partnerSas } from "@scandic-hotels/common/constants/routes/myPages"
import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon"
import { Typography } from "@scandic-hotels/design-system/Typography"
import { partnerSas } from "@/constants/routes/myPages"
import { Redirect } from "@/components/Redirect"
import { getIntl } from "@/i18n"
@@ -13,7 +12,7 @@ import { SASModal } from "../../components/SASModal"
import type { LangParams, PageArgs } from "@/types/params"
export default async function SASxScandicLinkPage(props: PageArgs<LangParams>) {
const params = await props.params;
const params = await props.params
const intl = await getIntl()
return (

View File

@@ -2,13 +2,13 @@ import { cookies } from "next/headers"
import { redirect } from "next/navigation"
import { z } from "zod"
import { myPages } from "@scandic-hotels/common/constants/routes/myPages"
import { safeTry } from "@scandic-hotels/common/utils/safeTry"
import {
SAS_TOKEN_STORAGE_KEY,
SAS_TRANSFER_POINT_KEY,
} from "@scandic-hotels/trpc/constants/partnerSAS"
import { myPages } from "@/constants/routes/myPages"
import { serverClient } from "@/lib/trpc/server"
import { getIntl } from "@/i18n"

View File

@@ -1,11 +1,11 @@
import Link from "next/link"
import React, { Suspense } from "react"
import { partnerSas } from "@scandic-hotels/common/constants/routes/myPages"
import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon"
import { Typography } from "@scandic-hotels/design-system/Typography"
import { hotelreservation } from "@/constants/routes/hotelReservation"
import { partnerSas } from "@/constants/routes/myPages"
import { getProfileSafely } from "@/lib/trpc/memoizedRequests"
import Image from "@/components/Image"

View File

@@ -1,10 +1,9 @@
import React from "react"
import { overview } from "@scandic-hotels/common/constants/routes/myPages"
import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon"
import { Typography } from "@scandic-hotels/design-system/Typography"
import { overview } from "@/constants/routes/myPages"
import { Redirect } from "@/components/Redirect"
import { getIntl } from "@/i18n"
@@ -12,8 +11,10 @@ import { SASModal } from "../../components/SASModal"
import type { LangParams, PageArgs } from "@/types/params"
export default async function SASxScandicUnlinkSuccessPage(props: PageArgs<LangParams>) {
const params = await props.params;
export default async function SASxScandicUnlinkSuccessPage(
props: PageArgs<LangParams>
) {
const params = await props.params
const intl = await getIntl()
return (

View File

@@ -1,6 +1,6 @@
import { Lang } from "@scandic-hotels/common/constants/language"
import { profile } from "@scandic-hotels/common/constants/routes/myPages"
import { profile } from "@/constants/routes/myPages"
import { serverClient } from "@/lib/trpc/server"
import { getPublicURL } from "@/server/utils"

View File

@@ -1,10 +1,10 @@
import { type NextRequest, NextResponse } from "next/server"
import { overview } from "@scandic-hotels/common/constants/routes/myPages"
import { isValidSession } from "@scandic-hotels/trpc/utils/session"
import { DTMC_SUCCESS_BANNER_KEY } from "@/constants/dtmc"
import { linkEmploymentError } from "@/constants/routes/dtmc"
import { overview } from "@/constants/routes/myPages"
import { internalServerError } from "@/server/errors/next"
import { getPublicURL } from "@/server/utils"

View File

@@ -4,6 +4,7 @@ import { type ReactNode, Suspense } from "react"
import DiamondAddIcon from "@scandic-hotels/design-system/Icons/DiamondAddIcon"
import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon"
import { Typography } from "@scandic-hotels/design-system/Typography"
import { getEurobonusMembership } from "@scandic-hotels/trpc/routers/user/helpers"
import {
SAS_EUROBONUS_TIER_TO_NAME_MAP,
@@ -17,7 +18,6 @@ import SectionHeader from "@/components/Section/Header"
import SectionLink from "@/components/Section/Link"
import SkeletonShimmer from "@/components/SkeletonShimmer"
import { getIntl } from "@/i18n"
import { getEurobonusMembership } from "@/utils/user"
import { UnlinkSAS } from "./UnlinkSAS"

View File

@@ -1,12 +1,12 @@
import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon"
import { Typography } from "@scandic-hotels/design-system/Typography"
import { getEurobonusMembership } from "@scandic-hotels/trpc/routers/user/helpers"
import { getProfileWithExtendedPartnerData } from "@/lib/trpc/memoizedRequests"
import Image from "@/components/Image"
import SkeletonShimmer from "@/components/SkeletonShimmer"
import { getIntl } from "@/i18n"
import { getEurobonusMembership } from "@/utils/user"
import { TransferPointsFormClient } from "./TransferPointsFormClient"

View File

@@ -5,9 +5,9 @@ import { usePathname } from "next/navigation"
import { useIntl } from "react-intl"
import { findMyBookingCurrentWebPath } from "@scandic-hotels/common/constants/routes/findMyBooking"
import { myPages } from "@scandic-hotels/common/constants/routes/myPages"
import { logout } from "@/constants/routes/handleAuth"
import { myPages } from "@/constants/routes/myPages"
import { env } from "@/env/client"
import useDropdownStore from "@/stores/main-menu"

View File

@@ -5,9 +5,9 @@ import { useIntl } from "react-intl"
import { Divider } from "@scandic-hotels/design-system/Divider"
import { logout } from "@/constants/routes/handleAuth"
import { trpc } from "@/lib/trpc/client"
import useDropdownStore from "@/stores/main-menu"
import { useMyPagesNavigation } from "@/components/Header/MainMenu/MyPagesMenuContent"
import SkeletonShimmer from "@/components/SkeletonShimmer"
import Link from "@/components/TempDesignSystem/Link"
import Title from "@/components/TempDesignSystem/Text/Title"
@@ -143,8 +143,3 @@ function Skeletons({ count }: { count: number }) {
</>
)
}
function useMyPagesNavigation() {
const lang = useLang()
return trpc.navigation.myPages.useQuery({ lang })
}

View File

@@ -1,5 +1,6 @@
import { overview } from "@scandic-hotels/common/constants/routes/myPages"
import { logout } from "@/constants/routes/handleAuth"
import { overview } from "@/constants/routes/myPages"
import { getName } from "@/lib/trpc/memoizedRequests"
import LoginButton from "@/components/LoginButton"

View File

@@ -5,11 +5,11 @@ import { useEffect, useState } from "react"
import { FormProvider, useForm } from "react-hook-form"
import { useIntl } from "react-intl"
import { profile } from "@scandic-hotels/common/constants/routes/myPages"
import { langToApiLang } from "@scandic-hotels/trpc/constants/apiLang"
import { getDefaultCountryFromLang } from "@/constants/languages"
import { logout } from "@/constants/routes/handleAuth"
import { profile } from "@/constants/routes/myPages"
import { trpc } from "@/lib/trpc/client"
import { editProfile } from "@/actions/editProfile"

View File

@@ -16,6 +16,8 @@ import useLang from "@/hooks/useLang"
import styles from "./myPagesMenuContent.module.css"
import type { MyPagesLinkKey } from "@scandic-hotels/trpc/routers/navigation/mypages/MyPagesLink"
import type { MyPagesMenuProps } from "../MyPagesMenu"
type Props = MyPagesMenuProps & { toggleOpenStateFn: () => void }
@@ -165,7 +167,51 @@ function SecondaryLinks({
export const useMyPagesNavigation = () => {
const lang = useLang()
return trpc.navigation.myPages.useQuery({
const intl = useIntl()
const MyPagesLinkTranslationMap: Record<MyPagesLinkKey, string> = {
overview: intl.formatMessage({
defaultMessage: "Overview",
}),
points: intl.formatMessage({
defaultMessage: "My points",
}),
stays: intl.formatMessage({
defaultMessage: "My stays",
}),
benefits: intl.formatMessage({
defaultMessage: "My benefits",
}),
partnerSas: intl.formatMessage({
defaultMessage: "Scandic ♥ SAS",
}),
teamMemberCard: intl.formatMessage({
defaultMessage: "Team Member Card",
}),
scandicFriends: intl.formatMessage({
defaultMessage: "About Scandic Friends",
}),
profile: intl.formatMessage({
defaultMessage: "My profile",
}),
}
const result = trpc.navigation.myPages.useQuery({
lang: lang,
})
if (result.data) {
const primaryLinks = result.data.primaryLinks.map((link) => ({
...link,
text: MyPagesLinkTranslationMap[link.key],
}))
const secondaryLinks = result.data.secondaryLinks.map((link) => ({
...link,
text: MyPagesLinkTranslationMap[link.key],
}))
return { ...result, data: { primaryLinks, secondaryLinks } }
}
return { ...result, data: null }
}

View File

@@ -6,10 +6,10 @@ import { Dialog } from "react-aria-components"
import { FormProvider, useForm } from "react-hook-form"
import { useIntl } from "react-intl"
import { profileEdit } from "@scandic-hotels/common/constants/routes/myPages"
import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon"
import { Typography } from "@scandic-hotels/design-system/Typography"
import { profileEdit } from "@/constants/routes/myPages"
import { isWebview } from "@/constants/routes/webviews"
import { trpc } from "@/lib/trpc/client"

View File

@@ -1,4 +1,5 @@
import { Lang } from "@scandic-hotels/common/constants/language"
import { profileEdit } from "@scandic-hotels/common/constants/routes/myPages"
import { isValidLang } from "@scandic-hotels/common/utils/languages"
import { Divider } from "@scandic-hotels/design-system/Divider"
import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon"
@@ -6,7 +7,6 @@ import { Typography } from "@scandic-hotels/design-system/Typography"
import { countriesMap } from "@scandic-hotels/trpc/constants/countries"
import { languages } from "@/constants/languages"
import { profileEdit } from "@/constants/routes/myPages"
import { getProfile } from "@/lib/trpc/memoizedRequests"
import ButtonLink from "@/components/ButtonLink"

View File

@@ -4,8 +4,9 @@ import { usePathname, useRouter } from "next/navigation"
import { useEffect, useRef } from "react"
import { useIntl } from "react-intl"
import { partnerSas } from "@scandic-hotels/common/constants/routes/myPages"
import { TIER_TO_FRIEND_MAP } from "@/constants/membershipLevels"
import { partnerSas } from "@/constants/routes/myPages"
import { trpc } from "@/lib/trpc/client"
import { toast } from "@/components/TempDesignSystem/Toasts"

View File

@@ -6,9 +6,9 @@ import React, { useState } from "react"
import { Dialog, Modal, ModalOverlay } from "react-aria-components"
import { useIntl } from "react-intl"
import { benefits } from "@scandic-hotels/common/constants/routes/myPages"
import { Typography } from "@scandic-hotels/design-system/Typography"
import { benefits } from "@/constants/routes/myPages"
import {
benefits as webviewBenefits,
myPagesWebviews,

View File

@@ -1,9 +1,9 @@
import { headers } from "next/headers"
import { redirect } from "next/navigation"
import { overview } from "@scandic-hotels/common/constants/routes/myPages"
import { isValidSession } from "@scandic-hotels/trpc/utils/session"
import { overview } from "@/constants/routes/myPages"
import { getProfile } from "@/lib/trpc/memoizedRequests"
import { auth } from "@/auth"

View File

@@ -6,7 +6,7 @@ import {
profile,
profileEdit,
stays,
} from "./myPages"
} from "@scandic-hotels/common/constants/routes/myPages"
/**
* These are routes in code we know requires auth

View File

@@ -1,99 +0,0 @@
/**
* @file Due to these records being used in next.config.js, and that is required
* to be a js file, we use jsdoc to type these.
*/
/**
* These are routes that define code entries for My pages
*/
/** @type {import('@scandic-hotels/common/constants/routes/langRoute').LangRoute} */
export const scandicFriends = {
da: "/da/scandic-friends",
de: "/de/scandic-friends",
en: "/en/scandic-friends",
fi: "/fi/scandic-friends",
no: "/no/scandic-friends",
sv: "/sv/scandic-friends",
}
/** @type {import('@scandic-hotels/common/constants/routes/langRoute').LangRoute} */
export const myPages = {
da: `${scandicFriends.da}/mine-sider`,
de: `${scandicFriends.de}/mein-bereich`,
en: `${scandicFriends.en}/my-pages`,
fi: `${scandicFriends.fi}/omat-sivut`,
no: `${scandicFriends.no}/mine-sider`,
sv: `${scandicFriends.sv}/mina-sidor`,
}
/** @type {import('@scandic-hotels/common/constants/routes/langRoute').LangRoute} */
export const overview = {
da: `${myPages.da}/oversigt`,
de: `${myPages.de}/uberblick`,
en: `${myPages.en}/overview`,
fi: `${myPages.fi}/yleista`,
no: `${myPages.no}/oversikt`,
sv: `${myPages.sv}/oversikt`,
}
/** TODO: Update to relevant paths */
/** @type {import('@scandic-hotels/common/constants/routes/langRoute').LangRoute} */
export const profile = {
da: `${myPages.da}/profil`,
de: `${myPages.de}/profil`,
en: `${myPages.en}/profile`,
fi: `${myPages.fi}/profiili`,
no: `${myPages.no}/profil`,
sv: `${myPages.sv}/profil`,
}
/** @type {import('@scandic-hotels/common/constants/routes/langRoute').LangRoute} */
export const profileEdit = {
da: `${profile.da}/rediger`,
de: `${profile.de}/bearbeiten`,
en: `${profile.en}/edit`,
fi: `${profile.fi}/muokkaa`,
no: `${profile.no}/rediger`,
sv: `${profile.sv}/redigera`,
}
/** @type {import('@scandic-hotels/common/constants/routes/langRoute').LangRoute} */
export const points = {
da: `${myPages.da}/point`,
de: `${myPages.de}/punkte`,
en: `${myPages.en}/points`,
fi: `${myPages.fi}/pisteet`,
no: `${myPages.no}/poeng`,
sv: `${myPages.sv}/poang`,
}
/** @type {import('@scandic-hotels/common/constants/routes/langRoute').LangRoute} */
export const benefits = {
da: `${myPages.da}/fordele`,
de: `${myPages.de}/vorteile`,
en: `${myPages.en}/benefits`,
fi: `${myPages.fi}/edut`,
no: `${myPages.no}/fordeler`,
sv: `${myPages.sv}/formaner`,
}
/** @type {import('@scandic-hotels/common/constants/routes/langRoute').LangRoute} */
export const stays = {
da: `${myPages.da}/ophold`,
de: `${myPages.de}/aufenthalte`,
en: `${myPages.en}/stays`,
fi: `${myPages.fi}/varaukset`,
no: `${myPages.no}/opphold`,
sv: `${myPages.sv}/vistelser`,
}
/** @type {import('@scandic-hotels/common/constants/routes/langRoute').LangRoute} */
export const partnerSas = {
da: `${myPages.da}/sas-eurobonus`,
de: `${myPages.de}/sas-eurobonus`,
en: `${myPages.en}/sas-eurobonus`,
fi: `${myPages.fi}/sas-eurobonus`,
no: `${myPages.no}/sas-eurobonus`,
sv: `${myPages.sv}/sas-eurobonus`,
}

View File

@@ -1,14 +1,14 @@
import { type NextMiddleware, NextResponse } from "next/server"
import { findLang } from "@scandic-hotels/common/utils/languages"
import { resolve as resolveEntry } from "@scandic-hotels/trpc/utils/entry"
import {
myPages,
overview,
profile,
profileEdit,
} from "@/constants/routes/myPages"
} from "@scandic-hotels/common/constants/routes/myPages"
import { findLang } from "@scandic-hotels/common/utils/languages"
import { resolve as resolveEntry } from "@scandic-hotels/trpc/utils/entry"
import { internalServerError, notFound } from "@/server/errors/next"
import { getPublicNextURL } from "@/server/utils"

View File

@@ -4,13 +4,13 @@ import * as Sentry from "@sentry/nextjs"
import createJiti from "jiti"
import { findMyBooking } from "@scandic-hotels/common/constants/routes/findMyBooking"
import { myPages } from "@scandic-hotels/common/constants/routes/myPages"
import {
myStay,
preliminaryReceipt,
} from "@scandic-hotels/common/constants/routes/myStay"
import { login, logout } from "./constants/routes/handleAuth.js"
import { myPages } from "./constants/routes/myPages.js"
import {
myStay as myStayWebview,
preliminaryReceipt as preliminaryReceiptWebview,

View File

@@ -4,9 +4,9 @@ import { autocompleteRouter } from "@scandic-hotels/trpc/routers/autocomplete"
import { bookingRouter } from "@scandic-hotels/trpc/routers/booking"
import { contentstackRouter } from "@scandic-hotels/trpc/routers/contentstack"
import { hotelsRouter } from "@scandic-hotels/trpc/routers/hotels"
import { navigationRouter } from "@scandic-hotels/trpc/routers/navigation"
import { partnerRouter } from "@scandic-hotels/trpc/routers/partners"
import { navigationRouter } from "./routers/navigation"
import { userRouter } from "./routers/user"
export const appRouter = router({

View File

@@ -1,5 +0,0 @@
import { router } from "@scandic-hotels/trpc"
import { myPagesNavigation } from "./mypages/index"
export const navigationRouter = router({ myPages: myPagesNavigation })

View File

@@ -1,10 +0,0 @@
type BaseLink = {
type: "link" | "withbadge"
text: string
href: string
}
type NormalLink = BaseLink & { type: "link" }
type LinkWithBadge = BaseLink & { type: "withbadge"; number: number }
export type MyPagesLink = NormalLink | LinkWithBadge

View File

@@ -1,99 +0,0 @@
import { cache } from "react"
import { safeTry } from "@scandic-hotels/common/utils/safeTry"
import * as routes from "@/constants/routes/myPages"
import { env } from "@/env/server"
import { getIntl } from "@/i18n"
import { getEurobonusMembership } from "@/utils/user"
import type { Lang } from "@scandic-hotels/common/constants/language"
import type { UserLoyalty } from "@scandic-hotels/trpc/types/user"
import type { MyPagesLink } from "./MyPagesLink"
export const getPrimaryLinks = cache(
async ({
lang,
userLoyalty,
}: {
lang: Lang
userLoyalty?: UserLoyalty
}): Promise<MyPagesLink[]> => {
const intl = await getIntl({ lang })
const showSASLink = userLoyalty ? isScandicXSASActive(userLoyalty) : false
const [showTeamMemberLink] = await safeTry(showTeamMemberCard())
const menuItems: MyPagesLink[] = [
{
type: "link",
text: intl.formatMessage({
defaultMessage: "Overview",
}),
href: routes.overview[lang],
},
{
type: "link",
text: intl.formatMessage({
defaultMessage: "My points",
}),
href: routes.points[lang],
},
{
type: "link",
text: intl.formatMessage({
defaultMessage: "My stays",
}),
href: routes.stays[lang],
},
{
type: "link",
text: intl.formatMessage({
defaultMessage: "My benefits",
}),
href: routes.benefits[lang],
},
]
if (showSASLink) {
menuItems.push({
type: "link",
text: intl.formatMessage({
defaultMessage: "Scandic ♥ SAS",
}),
href: routes.partnerSas[lang],
})
}
if (showTeamMemberLink) {
menuItems.push({
type: "link",
text: intl.formatMessage({
defaultMessage: "Team Member Card",
}),
href: "#",
})
}
return menuItems
}
)
const isScandicXSASActive = (loyalty: UserLoyalty) => {
const eurobonusMembership = getEurobonusMembership(loyalty)
const isLinked = Boolean(eurobonusMembership)
return env.SAS_ENABLED && isLinked
}
const showTeamMemberCard = cache(async () => {
async function getIsTeamMember() {
// TODO: Implement this check
return false
}
const isTeamMember = await getIsTeamMember()
return isTeamMember
})

View File

@@ -1,33 +0,0 @@
import * as routes from "@/constants/routes/myPages"
import { getIntl } from "@/i18n"
import type { Lang } from "@scandic-hotels/common/constants/language"
import type { MyPagesLink } from "./MyPagesLink"
export async function getSecondaryLinks({
lang,
}: {
lang: Lang
}): Promise<MyPagesLink[]> {
const intl = await getIntl({ lang })
const menuItems: MyPagesLink[] = [
{
type: "link",
text: intl.formatMessage({
defaultMessage: "About Scandic Friends",
}),
href: routes.scandicFriends[lang],
},
{
type: "link",
text: intl.formatMessage({
defaultMessage: "My profile",
}),
href: routes.profile[lang],
},
]
return menuItems
}

View File

@@ -1,56 +0,0 @@
import { TRPCError } from "@trpc/server"
import { z } from "zod"
import { Lang } from "@scandic-hotels/common/constants/language"
import { safeProtectedProcedure } from "@scandic-hotels/trpc/procedures"
import { getVerifiedUser } from "@scandic-hotels/trpc/routers/user/utils"
import { isValidSession } from "@scandic-hotels/trpc/utils/session"
import { getPrimaryLinks } from "./getPrimaryLinks"
import { getSecondaryLinks } from "./getSecondaryLinks"
import type { MyPagesLink } from "./MyPagesLink"
export const myPagesNavigation = safeProtectedProcedure
.input(
z.object({
lang: z.nativeEnum(Lang).optional(),
})
)
.query(
async ({
ctx,
input,
}): Promise<{
primaryLinks: MyPagesLink[]
secondaryLinks: MyPagesLink[]
} | null> => {
if (!isValidSession(ctx.session)) {
return null
}
const lang = input.lang || ctx.lang
if (!lang) {
throw new TRPCError({
code: "BAD_REQUEST",
message: "Language must be provided.",
})
}
const user = await getVerifiedUser({ session: ctx.session })
if (!user || user.error) {
return null
}
const [primaryLinks, secondaryLinks] = await Promise.all([
getPrimaryLinks({ lang, userLoyalty: user.data.loyalty }),
getSecondaryLinks({ lang }),
])
return {
primaryLinks,
secondaryLinks,
}
}
)

View File

@@ -4,22 +4,7 @@ import {
} from "@scandic-hotels/common/constants/membershipLevels"
import { scandicMembershipTypes } from "@scandic-hotels/trpc/routers/user/helpers"
import type {
EurobonusMembership,
Membership,
User,
UserLoyalty,
} from "@scandic-hotels/trpc/types/user"
function isEurobonusMembership(
membership: Membership
): membership is EurobonusMembership {
return membership.type === scandicMembershipTypes.SAS_EB
}
export function getEurobonusMembership(loyalty: UserLoyalty) {
return loyalty.memberships?.find(isEurobonusMembership)
}
import type { User, UserLoyalty } from "@scandic-hotels/trpc/types/user"
export function getMembershipCards(userLoyalty: UserLoyalty) {
return userLoyalty.memberships