Merged in feat/SW-3494-noOfNightsStayed (pull request #2832)

feat(SW-3494): removed properties that we dont need in the tracking

* feat(SW-3494): removed properties that we dont need in the tracking

* Fixed waiting on user response before tracking

* Refactor and cleanup

* Cleanup


Approved-by: Joakim Jäderberg
This commit is contained in:
Linus Flood
2025-09-22 07:38:05 +00:00
parent 9770281863
commit db546d7167
7 changed files with 76 additions and 95 deletions

View File

@@ -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,
})

View File

@@ -38,8 +38,6 @@ type LoggedInScandicUserData = TrackingSDKUserDataBase & {
memberId?: string
membershipNumber?: string
memberLevel?: MembershipLevel
noOfNightsStayed?: number
totalPointsAvailableToSpend?: number
loginAction?: "login success"
}

View File

@@ -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
}

View File

@@ -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<TransitionStatus>(
@@ -50,8 +48,13 @@ export const useTrackSoftNavigation = ({
const { isTransitioning, stopRouterTransition } = useRouterTransitionStore()
const previousPathname = useRef<string | null>(null)
const { userData, isPending } = useTrackingUserData()
useEffect(() => {
if (isPending) {
return
}
if (!userData) {
return
}

View File

@@ -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 }
}

View File

@@ -35,8 +35,6 @@ export type TrackingUserData =
memberId?: string
membershipNumber?: string
memberLevel?: MembershipLevel
noOfNightsStayed?: number
totalPointsAvailableToSpend?: number
loginAction?: "login success"
}
| {

View File

@@ -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
}
})