fix: loyalty levels fetch in rsc for mobile menu

fix: get loyalty level in rsc

fix: typo
This commit is contained in:
Christel Westerberg
2024-09-30 09:52:33 +02:00
parent 2886084a82
commit 44747058d0
11 changed files with 40 additions and 22 deletions

View File

@@ -19,7 +19,7 @@ DESIGN_SYSTEM_ACCESS_TOKEN=""
NEXTAUTH_REDIRECT_PROXY_URL="http://localhost:3000/api/web/auth" NEXTAUTH_REDIRECT_PROXY_URL="http://localhost:3000/api/web/auth"
NEXTAUTH_SECRET="" NEXTAUTH_SECRET=""
REVALIDATE_SECRET="" REVALIDATE_SECRET=""
SALESFORCE_PREFRENCE_BASE_URL="https://mc31njyvc80x-2b9wg-24jxcj5yq.pub.sfmc-content.com/disfelgm4fv" SALESFORCE_PREFERENCE_BASE_URL="https://cloud.emails.scandichotels.com/preference-center"
SEAMLESS_LOGIN_DA="http://www.example.dk/updatelogin" SEAMLESS_LOGIN_DA="http://www.example.dk/updatelogin"
SEAMLESS_LOGIN_DE="http://www.example.de/updatelogin" SEAMLESS_LOGIN_DE="http://www.example.de/updatelogin"

View File

@@ -24,6 +24,7 @@ export default function MyPagesMenu({
membership, membership,
navigation, navigation,
user, user,
membershipLevel,
}: MyPagesMenuProps) { }: MyPagesMenuProps) {
const intl = useIntl() const intl = useIntl()
const myPagesMenuRef = useRef<HTMLDivElement>(null) const myPagesMenuRef = useRef<HTMLDivElement>(null)
@@ -57,6 +58,7 @@ export default function MyPagesMenu({
{isMyPagesMenuOpen ? ( {isMyPagesMenuOpen ? (
<div className={styles.dropdown}> <div className={styles.dropdown}>
<MyPagesMenuContent <MyPagesMenuContent
membershipLevel={membershipLevel}
navigation={navigation} navigation={navigation}
user={user} user={user}
membership={membership} membership={membership}

View File

@@ -2,9 +2,7 @@
import { useIntl } from "react-intl" import { useIntl } from "react-intl"
import { MembershipLevelEnum } from "@/constants/membershipLevels"
import { logout } from "@/constants/routes/handleAuth" import { logout } from "@/constants/routes/handleAuth"
import { trpc } from "@/lib/trpc/client"
import { ArrowRightIcon } from "@/components/Icons" import { ArrowRightIcon } from "@/components/Icons"
import Divider from "@/components/TempDesignSystem/Divider" import Divider from "@/components/TempDesignSystem/Divider"
@@ -23,18 +21,12 @@ export default function MyPagesMenuContent({
navigation, navigation,
toggleOpenStateFn, toggleOpenStateFn,
user, user,
membershipLevel,
}: MyPagesMenuContentProps) { }: MyPagesMenuContentProps) {
const intl = useIntl() const intl = useIntl()
const lang = useLang() const lang = useLang()
const myPagesMenuContentRef = useTrapFocus() const myPagesMenuContentRef = useTrapFocus()
const membershipLevel = trpc.contentstack.loyaltyLevels.byLevel.useQuery(
{
level: MembershipLevelEnum[membership?.membershipLevel!],
},
{ enabled: !!membership?.membershipLevel }
).data
const membershipPoints = membership?.currentPoints const membershipPoints = membership?.currentPoints
const introClassName = const introClassName =
membershipLevel && membershipPoints membershipLevel && membershipPoints

View File

@@ -1,3 +1,4 @@
import { MembershipLevelEnum } from "@/constants/membershipLevels"
import { myPages } from "@/constants/routes/myPages" import { myPages } from "@/constants/routes/myPages"
import { serverClient } from "@/lib/trpc/server" import { serverClient } from "@/lib/trpc/server"
@@ -20,16 +21,24 @@ export default async function MyPagesMenuWrapper() {
serverClient().user.safeMembershipLevel(), serverClient().user.safeMembershipLevel(),
]) ])
const membershipLevel = membership?.membershipLevel
? await serverClient().contentstack.loyaltyLevels.byLevel({
level: MembershipLevelEnum[membership.membershipLevel],
})
: null
return ( return (
<> <>
{user ? ( {user ? (
<> <>
<MyPagesMenu <MyPagesMenu
membershipLevel={membershipLevel}
membership={membership} membership={membership}
navigation={myPagesNavigation} navigation={myPagesNavigation}
user={user} user={user}
/> />
<MyPagesMobileMenu <MyPagesMobileMenu
membershipLevel={membershipLevel}
membership={membership} membership={membership}
navigation={myPagesNavigation} navigation={myPagesNavigation}
user={user} user={user}

View File

@@ -20,6 +20,7 @@ import { DropdownTypeEnum } from "@/types/components/dropdown/dropdown"
import type { MyPagesMenuProps } from "@/types/components/header/myPagesMenu" import type { MyPagesMenuProps } from "@/types/components/header/myPagesMenu"
export default function MyPagesMobileMenu({ export default function MyPagesMobileMenu({
membershipLevel,
membership, membership,
navigation, navigation,
user, user,
@@ -62,6 +63,7 @@ export default function MyPagesMobileMenu({
aria-label={intl.formatMessage({ id: "My pages menu" })} aria-label={intl.formatMessage({ id: "My pages menu" })}
> >
<MyPagesMenuContent <MyPagesMenuContent
membershipLevel={membershipLevel}
membership={membership} membership={membership}
navigation={navigation} navigation={navigation}
user={user} user={user}

4
env/server.ts vendored
View File

@@ -47,7 +47,7 @@ export const env = createEnv({
.default("false"), .default("false"),
PUBLIC_URL: z.string().optional(), PUBLIC_URL: z.string().optional(),
REVALIDATE_SECRET: z.string(), REVALIDATE_SECRET: z.string(),
SALESFORCE_PREFRENCE_BASE_URL: z.string(), SALESFORCE_PREFERENCE_BASE_URL: z.string(),
SEAMLESS_LOGIN_DA: z.string(), SEAMLESS_LOGIN_DA: z.string(),
SEAMLESS_LOGIN_DE: z.string(), SEAMLESS_LOGIN_DE: z.string(),
SEAMLESS_LOGIN_EN: z.string(), SEAMLESS_LOGIN_EN: z.string(),
@@ -105,7 +105,7 @@ export const env = createEnv({
PRINT_QUERY: process.env.PRINT_QUERY, PRINT_QUERY: process.env.PRINT_QUERY,
PUBLIC_URL: process.env.PUBLIC_URL, PUBLIC_URL: process.env.PUBLIC_URL,
REVALIDATE_SECRET: process.env.REVALIDATE_SECRET, REVALIDATE_SECRET: process.env.REVALIDATE_SECRET,
SALESFORCE_PREFRENCE_BASE_URL: process.env.SALESFORCE_PREFRENCE_BASE_URL, SALESFORCE_PREFERENCE_BASE_URL: process.env.SALESFORCE_PREFERENCE_BASE_URL,
SEAMLESS_LOGIN_DA: process.env.SEAMLESS_LOGIN_DA, SEAMLESS_LOGIN_DA: process.env.SEAMLESS_LOGIN_DA,
SEAMLESS_LOGIN_DE: process.env.SEAMLESS_LOGIN_DE, SEAMLESS_LOGIN_DE: process.env.SEAMLESS_LOGIN_DE,
SEAMLESS_LOGIN_EN: process.env.SEAMLESS_LOGIN_EN, SEAMLESS_LOGIN_EN: process.env.SEAMLESS_LOGIN_EN,

View File

@@ -21,8 +21,6 @@ export namespace endpoints {
upcomingStays = "booking/v1/Stays/future", upcomingStays = "booking/v1/Stays/future",
rewards = `${profile}/reward`, rewards = `${profile}/reward`,
tierRewards = `${profile}/TierRewards`, tierRewards = `${profile}/TierRewards`,
intiateSaveCard = `${creditCards}/initiateSaveCard`,
deleteCreditCard = `${profile}/creditCards`,
subscriberId = `${profile}/SubscriberId`, subscriberId = `${profile}/SubscriberId`,
} }
} }

2
next-env.d.ts vendored
View File

@@ -2,4 +2,4 @@
/// <reference types="next/image-types/global" /> /// <reference types="next/image-types/global" />
// NOTE: This file should not be edited // NOTE: This file should not be edited
// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. // see https://nextjs.org/docs/basic-features/typescript for more information.

View File

@@ -31,6 +31,17 @@ const getAllLoyaltyLevelFailCounter = meter.createCounter(
"trpc.contentstack.loyaltyLevel.all-fail" "trpc.contentstack.loyaltyLevel.all-fail"
) )
const getByLevelLoyaltyLevelCounter = meter.createCounter(
"trpc.contentstack.loyaltyLevel.byLevel"
)
const getByLevelLoyaltyLevelSuccessCounter = meter.createCounter(
"trpc.contentstack.loyaltyLevel.byLevel-success"
)
const getByLevelLoyaltyLevelFailCounter = meter.createCounter(
"trpc.contentstack.loyaltyLevel.byLevel-fail"
)
export async function getAllLoyaltyLevels(ctx: Context) { export async function getAllLoyaltyLevels(ctx: Context) {
getAllLoyaltyLevelCounter.add(1) getAllLoyaltyLevelCounter.add(1)
@@ -87,7 +98,9 @@ export async function getAllLoyaltyLevels(ctx: Context) {
} }
export async function getLoyaltyLevel(ctx: Context, level_id: MembershipLevel) { export async function getLoyaltyLevel(ctx: Context, level_id: MembershipLevel) {
getAllLoyaltyLevelCounter.add(1) getByLevelLoyaltyLevelCounter.add(1, {
query: JSON.stringify({ lang: ctx.lang, level_id }),
})
const loyaltyLevelsConfigResponse = await request<LoyaltyLevelsResponse>( const loyaltyLevelsConfigResponse = await request<LoyaltyLevelsResponse>(
GetLoyaltyLevel, GetLoyaltyLevel,
@@ -103,10 +116,10 @@ export async function getLoyaltyLevel(ctx: Context, level_id: MembershipLevel) {
!loyaltyLevelsConfigResponse.data || !loyaltyLevelsConfigResponse.data ||
!loyaltyLevelsConfigResponse.data.all_loyalty_level.items.length !loyaltyLevelsConfigResponse.data.all_loyalty_level.items.length
) { ) {
getAllLoyaltyLevelFailCounter.add(1) getByLevelLoyaltyLevelFailCounter.add(1)
const notFoundError = notFound(loyaltyLevelsConfigResponse) const notFoundError = notFound(loyaltyLevelsConfigResponse)
console.error( console.error(
"contentstack.loyaltyLevels not found error", "contentstack.loyaltyLevel not found error",
JSON.stringify({ JSON.stringify({
query: { lang: ctx.lang, level_id }, query: { lang: ctx.lang, level_id },
error: { code: notFoundError.code }, error: { code: notFoundError.code },
@@ -119,10 +132,10 @@ export async function getLoyaltyLevel(ctx: Context, level_id: MembershipLevel) {
loyaltyLevelsConfigResponse.data loyaltyLevelsConfigResponse.data
) )
if (!validatedLoyaltyLevels.success) { if (!validatedLoyaltyLevels.success) {
getAllLoyaltyLevelFailCounter.add(1) getByLevelLoyaltyLevelFailCounter.add(1)
console.error(validatedLoyaltyLevels.error) console.error(validatedLoyaltyLevels.error)
console.error( console.error(
"contentstack.rewards validation error", "contentstack.loyaltyLevel validation error",
JSON.stringify({ JSON.stringify({
query: { lang: ctx.lang, level_id }, query: { lang: ctx.lang, level_id },
error: validatedLoyaltyLevels.error, error: validatedLoyaltyLevels.error,
@@ -131,7 +144,7 @@ export async function getLoyaltyLevel(ctx: Context, level_id: MembershipLevel) {
return null return null
} }
getAllLoyaltyLevelSuccessCounter.add(1) getByLevelLoyaltyLevelSuccessCounter.add(1)
return validatedLoyaltyLevels.data[0] return validatedLoyaltyLevels.data[0]
} }

View File

@@ -197,7 +197,7 @@ export const userMutationRouter = router({
return null return null
} }
const preferencesLink = new URL(env.SALESFORCE_PREFRENCE_BASE_URL) const preferencesLink = new URL(env.SALESFORCE_PREFERENCE_BASE_URL)
preferencesLink.searchParams.set("subKey", validatedData.data.subscriberId) preferencesLink.searchParams.set("subKey", validatedData.data.subscriberId)
generatePreferencesLinkSuccessCounter.add(1) generatePreferencesLinkSuccessCounter.add(1)

View File

@@ -3,6 +3,7 @@ import { navigationQueryRouter } from "@/server/routers/contentstack/myPages/nav
import { FriendsMembership } from "@/utils/user" import { FriendsMembership } from "@/utils/user"
import type { User } from "@/types/user" import type { User } from "@/types/user"
import type { LoyaltyLevel } from "@/server/routers/contentstack/loyaltyLevel/output"
type MyPagesNavigation = Awaited< type MyPagesNavigation = Awaited<
ReturnType<(typeof navigationQueryRouter)["get"]> ReturnType<(typeof navigationQueryRouter)["get"]>
@@ -12,6 +13,7 @@ export interface MyPagesMenuProps {
navigation: MyPagesNavigation navigation: MyPagesNavigation
user: Pick<User, "firstName" | "lastName"> user: Pick<User, "firstName" | "lastName">
membership?: FriendsMembership | null membership?: FriendsMembership | null
membershipLevel: LoyaltyLevel | null
} }
export interface MyPagesMenuContentProps extends MyPagesMenuProps { export interface MyPagesMenuContentProps extends MyPagesMenuProps {