diff --git a/apps/scandic-web/components/TrackingSDK/hooks.ts b/apps/scandic-web/components/TrackingSDK/hooks.ts index f16f3dd28..1f7456600 100644 --- a/apps/scandic-web/components/TrackingSDK/hooks.ts +++ b/apps/scandic-web/components/TrackingSDK/hooks.ts @@ -7,6 +7,7 @@ import { trpc } from "@/lib/trpc/client" import useRouterTransitionStore from "@/stores/router-transition" import useTrackingStore from "@/stores/tracking" +import useLang from "@/hooks/useLang" import { useSessionId } from "@/hooks/useSessionId" import { promiseWithTimeout } from "@/utils/promiseWithTimeout" import { createSDKPageObject, trackPageView } from "@/utils/tracking" @@ -31,11 +32,12 @@ export const useTrackHardNavigation = ({ paymentInfo, ancillaries, }: TrackingSDKProps) => { + const lang = useLang() const { data: userTrackingData, isPending, isError, - } = trpc.user.userTrackingInfo.useQuery() + } = trpc.user.userTrackingInfo.useQuery({ lang }) const sessionId = useSessionId() const pathName = usePathname() @@ -93,11 +95,12 @@ export const useTrackSoftNavigation = ({ paymentInfo, ancillaries, }: TrackingSDKProps) => { + const lang = useLang() const { data: userTrackingData, isPending, isError, - } = trpc.user.userTrackingInfo.useQuery() + } = trpc.user.userTrackingInfo.useQuery({ lang }) const [status, setStatus] = useState( TransitionStatusEnum.NotRun diff --git a/apps/scandic-web/server/routers/user/input.ts b/apps/scandic-web/server/routers/user/input.ts index f3f81adbd..b1d70b524 100644 --- a/apps/scandic-web/server/routers/user/input.ts +++ b/apps/scandic-web/server/routers/user/input.ts @@ -5,6 +5,9 @@ import { Lang } from "@/constants/languages" import { signUpSchema } from "@/components/Forms/Signup/schema" // Query +export const userTrackingInput = z.object({ + lang: z.nativeEnum(Lang).optional(), +}) export const staysInput = z .object({ cursor: z diff --git a/apps/scandic-web/server/routers/user/query.ts b/apps/scandic-web/server/routers/user/query.ts index 625a2aa10..bbde3acad 100644 --- a/apps/scandic-web/server/routers/user/query.ts +++ b/apps/scandic-web/server/routers/user/query.ts @@ -15,6 +15,7 @@ import { friendTransactionsInput, getSavedPaymentCardsInput, staysInput, + userTrackingInput, } from "./input" import { getFriendTransactionsSchema } from "./output" import { @@ -124,72 +125,77 @@ export const userQueryRouter = router({ const membershipLevel = getFriendsMembership(verifiedData.data.loyalty) return membershipLevel }), - userTrackingInfo: safeProtectedProcedure.query(async function ({ ctx }) { - const userTrackingInfoCounter = createCounter("user", "userTrackingInfo") - const metricsUserTrackingInfo = userTrackingInfoCounter.init() + userTrackingInfo: safeProtectedProcedure + .input(userTrackingInput) + .query(async function ({ ctx, input }) { + const { lang } = input + const language = lang || ctx.lang - metricsUserTrackingInfo.start() + const userTrackingInfoCounter = createCounter("user", "userTrackingInfo") + const metricsUserTrackingInfo = userTrackingInfoCounter.init() - const notLoggedInUserTrackingData: TrackingSDKUserData = { - loginStatus: "Non-logged in", - } + metricsUserTrackingInfo.start() - if (!isValidSession(ctx.session)) { - metricsUserTrackingInfo.success({ - reason: "invalid session", - data: notLoggedInUserTrackingData, - }) - return notLoggedInUserTrackingData - } + const notLoggedInUserTrackingData: TrackingSDKUserData = { + loginStatus: "Non-logged in", + } - try { - const verifiedUserData = await getVerifiedUser({ session: ctx.session }) - - if (!verifiedUserData || "error" in verifiedUserData) { + if (!isValidSession(ctx.session)) { metricsUserTrackingInfo.success({ - reason: "invalid user data", + reason: "invalid session", data: notLoggedInUserTrackingData, }) return notLoggedInUserTrackingData } - const previousStaysData = await getPreviousStays( - ctx.session.token.access_token, - 1, - ctx.lang - ) - if (!previousStaysData) { + try { + const verifiedUserData = await getVerifiedUser({ session: ctx.session }) + + if (!verifiedUserData || "error" in verifiedUserData) { + metricsUserTrackingInfo.success({ + reason: "invalid user data", + data: notLoggedInUserTrackingData, + }) + return notLoggedInUserTrackingData + } + + const previousStaysData = await getPreviousStays( + ctx.session.token.access_token, + 1, + language + ) + if (!previousStaysData) { + metricsUserTrackingInfo.success({ + reason: "no previous stays data", + data: notLoggedInUserTrackingData, + }) + return notLoggedInUserTrackingData + } + + const membership = getFriendsMembership(verifiedUserData.data.loyalty) + + const loggedInUserTrackingData: TrackingSDKUserData = { + loginStatus: "logged in", + loginType: ctx.session.token.loginType as LoginType, + memberId: verifiedUserData.data.profileId, + membershipNumber: membership?.membershipNumber, + memberLevel: membership?.membershipLevel, + noOfNightsStayed: previousStaysData.links?.totalCount ?? 0, + totalPointsAvailableToSpend: membership?.currentPoints, + loginAction: "login success", + } + metricsUserTrackingInfo.success({ - reason: "no previous stays data", - data: notLoggedInUserTrackingData, + reason: "valid logged in", + data: loggedInUserTrackingData, }) + + return loggedInUserTrackingData + } catch (error) { + metricsUserTrackingInfo.fail(error) return notLoggedInUserTrackingData } - - const membership = getFriendsMembership(verifiedUserData.data.loyalty) - - const loggedInUserTrackingData: TrackingSDKUserData = { - loginStatus: "logged in", - loginType: ctx.session.token.loginType as LoginType, - memberId: verifiedUserData.data.profileId, - membershipNumber: membership?.membershipNumber, - memberLevel: membership?.membershipLevel, - noOfNightsStayed: previousStaysData.links?.totalCount ?? 0, - totalPointsAvailableToSpend: membership?.currentPoints, - loginAction: "login success", - } - - metricsUserTrackingInfo.success({ - reason: "valid logged in", - data: loggedInUserTrackingData, - }) - - return loggedInUserTrackingData - } catch (error) { - metricsUserTrackingInfo.fail(error) - return notLoggedInUserTrackingData - } - }), + }), stays: router({ previous: languageProtectedProcedure