diff --git a/packages/tracking/lib/TrackingSDK.tsx b/packages/tracking/lib/TrackingSDK.tsx index c0f74d275..5388e5885 100644 --- a/packages/tracking/lib/TrackingSDK.tsx +++ b/packages/tracking/lib/TrackingSDK.tsx @@ -2,9 +2,6 @@ import { usePathname } from "next/navigation" -import { trpc } from "@scandic-hotels/trpc/client" - -import useLang from "./hooks/useLang" import { useTrackHardNavigation } from "./useTrackHardNavigation" import { useTrackSoftNavigation } from "./useTrackSoftNavigation" @@ -13,7 +10,6 @@ import type { TrackingSDKHotelInfo, TrackingSDKPageData, TrackingSDKPaymentInfo, - TrackingSDKUserData, } from "./types" export function TrackingSDK({ @@ -28,31 +24,20 @@ export function TrackingSDK({ ancillaries?: TrackingSDKAncillaries }) { const pathName = usePathname() - const lang = useLang() - - const { data, isError } = trpc.user.userTrackingInfo.useQuery({ - lang, - }) - - const userData: TrackingSDKUserData = - !data || isError - ? ({ loginStatus: "Error" } as const) - : { ...data, memberType: "scandic-friends" } useTrackHardNavigation({ pageData, hotelInfo, paymentInfo, ancillaries, - userData, pathName, }) + useTrackSoftNavigation({ pageData, hotelInfo, paymentInfo, ancillaries, - userData, pathName, }) diff --git a/packages/tracking/lib/types.ts b/packages/tracking/lib/types.ts index 95e7fa552..f0d2b557e 100644 --- a/packages/tracking/lib/types.ts +++ b/packages/tracking/lib/types.ts @@ -38,8 +38,6 @@ type LoggedInScandicUserData = TrackingSDKUserDataBase & { memberId?: string membershipNumber?: string memberLevel?: MembershipLevel - noOfNightsStayed?: number - totalPointsAvailableToSpend?: number loginAction?: "login success" } diff --git a/packages/tracking/lib/useTrackHardNavigation.ts b/packages/tracking/lib/useTrackHardNavigation.ts index 7acfdef19..9b6404291 100644 --- a/packages/tracking/lib/useTrackHardNavigation.ts +++ b/packages/tracking/lib/useTrackHardNavigation.ts @@ -7,6 +7,7 @@ import { logger } from "@scandic-hotels/common/logger" import { promiseWithTimeout } from "@scandic-hotels/common/utils/promiseWithTimeout" import { createSDKPageObject, trackPageView } from "./pageview" +import { useTrackingUserData } from "./useTrackingUserData" import type { TrackingSDKAncillaries, @@ -21,7 +22,6 @@ type TrackingSDKProps = { hotelInfo?: TrackingSDKHotelInfo paymentInfo?: TrackingSDKPaymentInfo ancillaries?: TrackingSDKAncillaries - userData: TrackingSDKUserData | undefined pathName: string } @@ -31,12 +31,16 @@ export const useTrackHardNavigation = ({ hotelInfo, paymentInfo, ancillaries, - userData, pathName, }: TrackingSDKProps) => { const sessionId = useSessionId() + const { userData, isPending } = useTrackingUserData() useEffect(() => { + if (isPending) { + return + } + if (!userData) { return } diff --git a/packages/tracking/lib/useTrackSoftNavigation.ts b/packages/tracking/lib/useTrackSoftNavigation.ts index 13a5b12e3..45250c82c 100644 --- a/packages/tracking/lib/useTrackSoftNavigation.ts +++ b/packages/tracking/lib/useTrackSoftNavigation.ts @@ -7,13 +7,13 @@ import useRouterTransitionStore from "@scandic-hotels/common/stores/router-trans import useTrackingStore from "@scandic-hotels/common/stores/tracking" import { createSDKPageObject, trackPageView } from "./pageview" +import { useTrackingUserData } from "./useTrackingUserData" import type { TrackingSDKAncillaries, TrackingSDKHotelInfo, TrackingSDKPageData, TrackingSDKPaymentInfo, - TrackingSDKUserData, } from "./types" type TrackingSDKProps = { @@ -21,7 +21,6 @@ type TrackingSDKProps = { hotelInfo?: TrackingSDKHotelInfo paymentInfo?: TrackingSDKPaymentInfo ancillaries?: TrackingSDKAncillaries - userData: TrackingSDKUserData | undefined pathName: string } @@ -38,7 +37,6 @@ export const useTrackSoftNavigation = ({ hotelInfo, paymentInfo, ancillaries, - userData, pathName, }: TrackingSDKProps) => { const [status, setStatus] = useState( @@ -50,8 +48,13 @@ export const useTrackSoftNavigation = ({ const { isTransitioning, stopRouterTransition } = useRouterTransitionStore() const previousPathname = useRef(null) + const { userData, isPending } = useTrackingUserData() useEffect(() => { + if (isPending) { + return + } + if (!userData) { return } diff --git a/packages/tracking/lib/useTrackingUserData.ts b/packages/tracking/lib/useTrackingUserData.ts new file mode 100644 index 000000000..72bf412d4 --- /dev/null +++ b/packages/tracking/lib/useTrackingUserData.ts @@ -0,0 +1,17 @@ +"use client" + +import { trpc } from "@scandic-hotels/trpc/client" + +import type { TrackingSDKUserData } from "./types" + +export const useTrackingUserData = () => { + const { data, isError, isPending } = trpc.user.userTrackingInfo.useQuery() + + const userData: TrackingSDKUserData | undefined = !isPending + ? isError || !data + ? ({ loginStatus: "Error" } as const) + : { ...data, memberType: "scandic-friends" } + : undefined + + return { userData, isPending, isError } +} diff --git a/packages/trpc/lib/routers/types.ts b/packages/trpc/lib/routers/types.ts index 186976c68..c9e4c71cd 100644 --- a/packages/trpc/lib/routers/types.ts +++ b/packages/trpc/lib/routers/types.ts @@ -35,8 +35,6 @@ export type TrackingUserData = memberId?: string membershipNumber?: string memberLevel?: MembershipLevel - noOfNightsStayed?: number - totalPointsAvailableToSpend?: number loginAction?: "login success" } | { diff --git a/packages/trpc/lib/routers/user/query/userTrackingInfo.ts b/packages/trpc/lib/routers/user/query/userTrackingInfo.ts index bd0752279..9552e1853 100644 --- a/packages/trpc/lib/routers/user/query/userTrackingInfo.ts +++ b/packages/trpc/lib/routers/user/query/userTrackingInfo.ts @@ -1,92 +1,68 @@ -import { z } from "zod" - -import { Lang } from "@scandic-hotels/common/constants/language" import { createCounter } from "@scandic-hotels/common/telemetry" import { safeProtectedProcedure } from "../../../procedures" import { isValidSession } from "../../../utils/session" import { getFriendsMembership } from "../helpers" -import { getPreviousStays, getVerifiedUser } from "../utils" +import { getVerifiedUser } from "../utils" import type { LoginType } from "@scandic-hotels/common/constants/loginType" import type { TrackingUserData } from "../../types" -export const userTrackingInput = z.object({ - lang: z.nativeEnum(Lang).optional(), -}) -export const userTrackingInfo = safeProtectedProcedure - .input(userTrackingInput) - .query(async function ({ ctx, input }) { - const { lang } = input - const language = lang || ctx.lang +export const userTrackingInfo = safeProtectedProcedure.query(async function ({ + ctx, +}) { + const userTrackingInfoCounter = createCounter("user", "userTrackingInfo") + const metricsUserTrackingInfo = userTrackingInfoCounter.init() - const userTrackingInfoCounter = createCounter("user", "userTrackingInfo") - const metricsUserTrackingInfo = userTrackingInfoCounter.init() + metricsUserTrackingInfo.start() - metricsUserTrackingInfo.start() + const notLoggedInUserTrackingData: TrackingUserData = { + loginStatus: "Non-logged in", + } - const notLoggedInUserTrackingData: TrackingUserData = { - loginStatus: "Non-logged in", - } + if (!isValidSession(ctx.session)) { + metricsUserTrackingInfo.success({ + reason: "invalid session", + data: notLoggedInUserTrackingData, + }) + return notLoggedInUserTrackingData + } - if (!isValidSession(ctx.session)) { + try { + const verifiedUserData = await getVerifiedUser({ session: ctx.session }) + + if ( + !verifiedUserData || + "error" in verifiedUserData || + !verifiedUserData.data.loyalty + ) { metricsUserTrackingInfo.success({ - reason: "invalid session", + reason: "invalid user data", data: notLoggedInUserTrackingData, }) return notLoggedInUserTrackingData } - try { - const verifiedUserData = await getVerifiedUser({ session: ctx.session }) + const membership = getFriendsMembership(verifiedUserData.data.loyalty) - if ( - !verifiedUserData || - "error" in verifiedUserData || - !verifiedUserData.data.loyalty - ) { - 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: TrackingUserData = { - 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 + const loggedInUserTrackingData: TrackingUserData = { + loginStatus: "logged in", + loginType: ctx.session.token.loginType as LoginType, + memberId: verifiedUserData.data.profileId, + membershipNumber: membership?.membershipNumber, + memberLevel: membership?.membershipLevel, + loginAction: "login success", } - }) + + metricsUserTrackingInfo.success({ + reason: "valid logged in", + data: loggedInUserTrackingData, + }) + + return loggedInUserTrackingData + } catch (error) { + metricsUserTrackingInfo.fail(error) + return notLoggedInUserTrackingData + } +})