fix: refactor tracking requests

This commit is contained in:
Christel Westerberg
2024-07-15 13:35:00 +02:00
parent c7446032fe
commit 183e1cd6d2
14 changed files with 74 additions and 163 deletions

View File

@@ -12,16 +12,14 @@ import type { LangParams, PageArgs } from "@/types/params"
export default async function MyPages({
params,
}: PageArgs<LangParams & { path: string[] }>) {
const accountPage = await serverClient().contentstack.accountPage.get()
const accountPageRes = await serverClient().contentstack.accountPage.get()
const { formatMessage } = await getIntl()
if (!accountPage) {
if (!accountPageRes) {
return null
}
const accountPageTracking = serverClient().contentstack.accountPage.tracking()
const userTrackingData = serverClient().user.tracking()
const { tracking, accountPage } = accountPageRes
return (
<main className={styles.blocks}>
<Title>{accountPage.heading}</Title>
@@ -30,10 +28,7 @@ export default async function MyPages({
) : (
<p>{formatMessage({ id: "No content published" })}</p>
)}
<TrackingSDK
pageDataPromise={accountPageTracking}
userDataPromise={userTrackingData}
/>
<TrackingSDK pageData={tracking} />
</main>
)
}

View File

@@ -5,13 +5,11 @@ import { serverClient } from "@/lib/trpc/server"
import TrackingSDK from "@/components/TrackingSDK"
export default async function ProfilePage() {
const accountPageTracking = serverClient().contentstack.accountPage.tracking()
const userTrackingData = serverClient().user.tracking()
const accountPage = await serverClient().contentstack.accountPage.get()
return (
<TrackingSDK
pageDataPromise={accountPageTracking}
userDataPromise={userTrackingData}
/>
)
if (!accountPage) {
return null
}
return <TrackingSDK pageData={accountPage.tracking} />
}

View File

@@ -8,6 +8,7 @@ import TrpcProvider from "@/lib/trpc/Provider"
import AdobeSDKScript from "@/components/Current/AdobeSDKScript"
import Footer from "@/components/Current/Footer"
import VwoScript from "@/components/Current/VwoScript"
import { preloadUserTracking } from "@/components/TrackingSDK"
import { getIntl } from "@/i18n"
import ServerIntlProvider from "@/i18n/Provider"
@@ -29,6 +30,8 @@ export default async function RootLayout({
header: React.ReactNode
}
>) {
preloadUserTracking()
const { defaultLocale, locale, messages } = await getIntl()
return (
<html lang={params.lang}>

View File

@@ -11,14 +11,14 @@ import styles from "./loyaltyPage.module.css"
import type { LangParams } from "@/types/params"
export default async function LoyaltyPage({ lang }: LangParams) {
const loyaltyPage = await serverClient().contentstack.loyaltyPage.get()
const loyaltyPageRes = await serverClient().contentstack.loyaltyPage.get()
if (!loyaltyPage) {
if (!loyaltyPageRes) {
return null
}
const loyaltyPageTracking = serverClient().contentstack.loyaltyPage.tracking()
const userTracking = serverClient().user.tracking()
const { tracking, loyaltyPage } = loyaltyPageRes
return (
<section className={styles.content}>
{loyaltyPage.sidebar.length ? (
@@ -31,10 +31,7 @@ export default async function LoyaltyPage({ lang }: LangParams) {
<Blocks blocks={loyaltyPage.blocks} lang={lang} />
) : null}
</MaxWidth>
<TrackingSDK
pageDataPromise={loyaltyPageTracking}
userDataPromise={userTracking}
/>
<TrackingSDK pageData={tracking} />
</section>
)
}

View File

@@ -14,14 +14,13 @@ import styles from "./accountPage.module.css"
import { LangParams } from "@/types/params"
export default async function MyPages({ lang }: LangParams) {
const accountPage = await serverClient().contentstack.accountPage.get()
const accountPageRes = await serverClient().contentstack.accountPage.get()
if (!accountPage) {
if (!accountPageRes) {
return null
}
const accountPageTracking = serverClient().contentstack.accountPage.tracking()
const userTrackingData = serverClient().user.tracking()
const { tracking, accountPage } = accountPageRes
const linkToOverview = `/${lang}/webview${accountPage.url}` !== overview[lang]
@@ -29,10 +28,7 @@ export default async function MyPages({ lang }: LangParams) {
<MaxWidth className={styles.blocks} tag="main">
{linkToOverview ? <LinkToOverview lang={lang} /> : null}
<Content lang={lang} content={accountPage.content} />
<TrackingSDK
pageDataPromise={accountPageTracking}
userDataPromise={userTrackingData}
/>
<TrackingSDK pageData={tracking} />
</MaxWidth>
)
}

View File

@@ -11,15 +11,13 @@ import styles from "./loyaltyPage.module.css"
import { LangParams } from "@/types/params"
export default async function AboutScandicFriends({ lang }: LangParams) {
const loyaltyPage = await serverClient().contentstack.loyaltyPage.get()
const loyaltyPageRes = await serverClient().contentstack.loyaltyPage.get()
if (!loyaltyPage) {
if (!loyaltyPageRes) {
return null
}
const loyaltyPageTracking = serverClient().contentstack.loyaltyPage.tracking()
const userTrackingData = serverClient().user.tracking()
const { tracking, loyaltyPage } = loyaltyPageRes
return (
<section className={styles.content}>
<LinkToOverview lang={lang} />
@@ -27,10 +25,7 @@ export default async function AboutScandicFriends({ lang }: LangParams) {
<Title>{loyaltyPage.heading}</Title>
<Blocks blocks={loyaltyPage.blocks} lang={lang} />
</MaxWidth>
<TrackingSDK
pageDataPromise={loyaltyPageTracking}
userDataPromise={userTrackingData}
/>
<TrackingSDK pageData={tracking} />
</section>
)
}

View File

@@ -1,16 +1,19 @@
import { serverClient } from "@/lib/trpc/server"
import TrackingSDKClient from "./Client"
import { TrackingSDKProps } from "@/types/components/tracking"
import { TrackingSDKPageData } from "@/types/components/tracking"
export const preloadUserTracking = () => {
void serverClient().user.tracking()
}
export default async function TrackingSDK({
pageDataPromise,
userDataPromise,
pageData,
}: {
pageDataPromise: Promise<TrackingSDKProps["pageData"]>
userDataPromise: Promise<TrackingSDKProps["userData"]>
pageData: TrackingSDKPageData
}) {
const pageData = await pageDataPromise
const userData = await userDataPromise
const userTrackingData = await serverClient().user.tracking()
return <TrackingSDKClient pageData={pageData} userData={userData} />
return <TrackingSDKClient pageData={pageData} userData={userTrackingData} />
}

View File

@@ -18,6 +18,12 @@ query GetAccountPage($locale: String!, $uid: String!) {
...AccountPageContentShortcuts
...AccountPageContentTextContent
}
system {
uid
created_at
updated_at
locale
}
}
}
@@ -99,15 +105,3 @@ query GetFiNoSvUrlsAccountPage($uid: String!) {
}
}
}
query GetTrackingAccountPage($locale: String!, $uid: String!) {
account_page(locale: $locale, uid: $uid) {
system {
locale
created_at
uid
updated_at
}
title
}
}

View File

@@ -172,6 +172,7 @@ query GetLoyaltyPage($locale: String!, $uid: String!) {
uid
created_at
updated_at
locale
}
}
}
@@ -362,14 +363,3 @@ query GetFiNoSvUrlsLoyaltyPage($uid: String!) {
}
}
}
query GetTrackingLoyaltyPage($locale: String!, $uid: String!) {
loyalty_page(locale: $locale, uid: $uid) {
system {
locale
created_at
uid
updated_at
}
}
}

View File

@@ -125,6 +125,12 @@ export const validateAccountPageSchema = z.object({
url: z.string(),
title: z.string(),
content: z.array(accountPageContentItem),
system: z.object({
uid: z.string(),
locale: z.nativeEnum(Lang),
created_at: z.string(),
updated_at: z.string(),
}),
}),
})
@@ -189,18 +195,3 @@ export const validateAccountPageRefsSchema = z.object({
export type AccountPageRefsDataRaw = z.infer<
typeof validateAccountPageRefsSchema
>
//Tracking
const validateAccountTrackingData = z.object({
account_page: z.object({
system: z.object({
uid: z.string(),
locale: z.string(),
updated_at: z.string(),
created_at: z.string(),
}),
title: z.string().nullable(),
}),
})
export type AccountPageTackingData = z.infer<typeof validateAccountTrackingData>

View File

@@ -2,7 +2,6 @@ import { Lang } from "@/constants/languages"
import {
GetAccountPage,
GetAccountPageRefs,
GetTrackingAccountPage,
} from "@/lib/graphql/Query/AccountPage.graphql"
import { request } from "@/lib/graphql/request"
import { notFound } from "@/server/errors/trpc"
@@ -19,7 +18,6 @@ import {
type AccountPage,
AccountPageDataRaw,
AccountPageRefsDataRaw,
AccountPageTackingData,
validateAccountPageRefsSchema,
validateAccountPageSchema,
} from "./output"
@@ -136,32 +134,18 @@ export const accountPageQueryRouter = router({
content,
} as AccountPage
return accountPage
}),
tracking: contentstackExtendedProcedureUID.query(async ({ ctx }) => {
const { lang, uid } = ctx
const response = await request<AccountPageTackingData>(
GetTrackingAccountPage,
{
locale: lang,
uid,
}
)
if (!response.data) {
throw notFound(response)
}
const accountTrackingData: TrackingSDKPageData = {
pageId: response.data.account_page.system.uid,
lang: response.data.account_page.system.locale as Lang,
publishedDate: response.data.account_page.system.updated_at,
createdDate: response.data.account_page.system.created_at,
const tracking: TrackingSDKPageData = {
pageId: validatedAccountPage.data.account_page.system.uid,
lang: validatedAccountPage.data.account_page.system.locale as Lang,
publishedDate: validatedAccountPage.data.account_page.system.updated_at,
createdDate: validatedAccountPage.data.account_page.system.created_at,
channel: TrackingChannelEnum["scandic-friends"],
pageType: `member${response.data.account_page.title}page`,
}
return accountTrackingData
return {
accountPage,
tracking,
}
}),
})

View File

@@ -193,7 +193,12 @@ export const validateLoyaltyPageSchema = z.object({
heading: z.string().nullable(),
blocks: z.array(loyaltyPageBlockItem).nullable(),
sidebar: z.array(loyaltyPageSidebarItem).nullable(),
system: z.object({ uid: z.string() }),
system: z.object({
uid: z.string(),
locale: z.nativeEnum(Lang),
created_at: z.string(),
updated_at: z.string(),
}),
})
// Block types
@@ -417,17 +422,3 @@ export const validateLoyaltyPageRefsSchema = z.object({
export type LoyaltyPageRefsDataRaw = z.infer<
typeof validateLoyaltyPageRefsSchema
>
//Tracking
const validateLoyaltyTrackingData = z.object({
loyalty_page: z.object({
system: z.object({
uid: z.string(),
locale: z.string(),
updated_at: z.string(),
created_at: z.string(),
}),
}),
})
export type LoyaltyPageTackingData = z.infer<typeof validateLoyaltyTrackingData>

View File

@@ -2,7 +2,6 @@ import { Lang } from "@/constants/languages"
import {
GetLoyaltyPage,
GetLoyaltyPageRefs,
GetTrackingLoyaltyPage,
} from "@/lib/graphql/Query/LoyaltyPage.graphql"
import { request } from "@/lib/graphql/request"
import { notFound } from "@/server/errors/trpc"
@@ -20,7 +19,6 @@ import { removeEmptyObjects } from "../../utils"
import {
LoyaltyPage,
type LoyaltyPageRefsDataRaw,
LoyaltyPageTackingData,
validateLoyaltyPageRefsSchema,
validateLoyaltyPageSchema,
} from "./output"
@@ -228,24 +226,6 @@ export const loyaltyPageQueryRouter = router({
return null
}
// Assert LoyaltyPage type to get correct typings for RTE fields
return validatedLoyaltyPage.data as LoyaltyPage
}),
tracking: contentstackExtendedProcedureUID.query(async ({ ctx }) => {
const { lang, uid } = ctx
const response = await request<LoyaltyPageTackingData>(
GetTrackingLoyaltyPage,
{
locale: lang,
uid,
}
)
if (!response.data) {
throw notFound(response)
}
const loyaltyTrackingData: TrackingSDKPageData = {
pageId: response.data.loyalty_page.system.uid,
lang: response.data.loyalty_page.system.locale as Lang,
@@ -255,6 +235,10 @@ export const loyaltyPageQueryRouter = router({
pageType: "loyaltycontentpage",
}
return loyaltyTrackingData
// Assert LoyaltyPage type to get correct typings for RTE fields
return {
loyaltyPage: validatedLoyaltyPage.data as LoyaltyPage,
tracking: loyaltyTrackingData,
}
}),
})

View File

@@ -248,18 +248,9 @@ export const userQueryRouter = router({
)
if (!previousStaysResponse.ok) {
// switch (apiResponse.status) {
// case 400:
// throw badRequestError(apiResponse)
// case 401:
// throw unauthorizedError(apiResponse)
// case 403:
// throw forbiddenError(apiResponse)
// default:
// throw internalServerError(apiResponse)
// }
console.info(`API Response Failed - Getting Previous Stays`)
console.info(`User: (${JSON.stringify(ctx.session.user)})`)
console.info(
`API Response Failed - Getting Previous Stays for tracking user`
)
console.error(previousStaysResponse)
return notLoggedInUserTrackingData
}
@@ -268,8 +259,7 @@ export const userQueryRouter = router({
const verifiedPreviousStaysData =
getStaysSchema.safeParse(previousStaysApiJson)
if (!verifiedPreviousStaysData.success) {
console.info(`Failed to validate Previous Stays Data`)
console.info(`User: (${JSON.stringify(ctx.session.user)})`)
console.info(`Failed to validate Previous Stays Data for tracking user`)
console.error(verifiedPreviousStaysData.error)
return notLoggedInUserTrackingData
}