fix: loyalty levels fetch in rsc for mobile menu
fix: get loyalty level in rsc fix: typo
This commit is contained in:
@@ -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"
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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
4
env/server.ts
vendored
@@ -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,
|
||||||
|
|||||||
@@ -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
2
next-env.d.ts
vendored
@@ -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.
|
||||||
|
|||||||
@@ -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]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user