From f3dc818c0629c102f58aaaa617b52dab16adf4c2 Mon Sep 17 00:00:00 2001 From: Hrishikesh Vaipurkar Date: Thu, 2 Oct 2025 07:31:46 +0000 Subject: [PATCH] Merged in fix/SW-3442-tracking-event-lowestroomprice- (pull request #2797) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix(SW-3442): Fixed lowest price tracking and other lint issues * fix(SW-3442): Fixed lowest price tracking and other lint issues Approved-by: Joakim Jäderberg --- .../BookingConfirmation/Tracking/tracking.ts | 2 +- .../RoomsContainer/Rooms/RoomsList/index.tsx | 1 + .../SelectRate/RoomsContainer/index.tsx | 22 ++++++++++++++-- .../SelectRate/Tracking/tracking.ts | 17 +++++++++++++ .../contexts/SelectRate/SelectRateContext.tsx | 25 +++++++++++++++++++ .../lib/contexts/SelectRate/types.ts | 6 +++++ 6 files changed, 70 insertions(+), 3 deletions(-) diff --git a/packages/booking-flow/lib/components/BookingConfirmation/Tracking/tracking.ts b/packages/booking-flow/lib/components/BookingConfirmation/Tracking/tracking.ts index 5175a2dd2..84272ac0a 100644 --- a/packages/booking-flow/lib/components/BookingConfirmation/Tracking/tracking.ts +++ b/packages/booking-flow/lib/components/BookingConfirmation/Tracking/tracking.ts @@ -14,9 +14,9 @@ import { import { BreakfastPackageEnum } from "@scandic-hotels/trpc/enums/breakfast" import { RoomPackageCodeEnum } from "@scandic-hotels/trpc/enums/roomFilter" -import { readPaymentInfoFromSessionStorage } from "../../../components/EnterDetails/Payment/helpers" import { invertedBedTypeMap } from "../../../utils/SelectRate" import { getSpecialRoomType } from "../../../utils/specialRoomType" +import { readPaymentInfoFromSessionStorage } from "../../EnterDetails/Payment/helpers" import type { Lang } from "@scandic-hotels/common/constants/language" import type { BookingConfirmation } from "@scandic-hotels/trpc/types/bookingConfirmation" diff --git a/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/index.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/index.tsx index 7df23ef94..89fc72904 100644 --- a/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/index.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/Rooms/RoomsList/index.tsx @@ -1,4 +1,5 @@ "use client" + import { useSelectRateContext } from "../../../../../contexts/SelectRate/SelectRateContext" import { RoomListItem } from "./RoomListItem" import { RoomsListSkeleton } from "./RoomsListSkeleton" diff --git a/packages/booking-flow/lib/components/SelectRate/RoomsContainer/index.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/index.tsx index a6281e049..7e8070c2b 100644 --- a/packages/booking-flow/lib/components/SelectRate/RoomsContainer/index.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/index.tsx @@ -1,12 +1,14 @@ "use client" import { TRPCClientError } from "@trpc/client" +import { useEffect } from "react" import { useIntl } from "react-intl" import { AlertTypeEnum } from "@scandic-hotels/common/constants/alert" import { Alert } from "@scandic-hotels/design-system/Alert" import { useSelectRateContext } from "../../../contexts/SelectRate/SelectRateContext" +import { trackLowestRoomPrice } from "../Tracking/tracking" import { RateSummary } from "./RateSummary" import Rooms from "./Rooms" import { RoomsContainerSkeleton } from "./RoomsContainerSkeleton" @@ -23,10 +25,26 @@ export function RoomsContainer({}: RoomsContainerProps) { const intl = useIntl() const { - availability: { error, isFetching, isError }, - input: { hasError: hasInputError, errorCode }, + availability: { error, isFetching, isError, data: availabilityData }, + input: { hasError: hasInputError, errorCode, data: inputData }, + getLowestRoomPrice, } = useSelectRateContext() + useEffect(() => { + if (availabilityData) { + const lowestRoomPrice = getLowestRoomPrice() + const booking = inputData?.booking! + + trackLowestRoomPrice({ + hotelId: booking.hotelId, + arrivalDate: booking?.fromDate, + departureDate: booking?.toDate, + lowestPrice: lowestRoomPrice.price.toString(), + currency: lowestRoomPrice.currency, + }) + } + }, [availabilityData, inputData, getLowestRoomPrice]) + if (isFetching) { return } diff --git a/packages/booking-flow/lib/components/SelectRate/Tracking/tracking.ts b/packages/booking-flow/lib/components/SelectRate/Tracking/tracking.ts index 0e226fba8..3e6e90845 100644 --- a/packages/booking-flow/lib/components/SelectRate/Tracking/tracking.ts +++ b/packages/booking-flow/lib/components/SelectRate/Tracking/tracking.ts @@ -1,6 +1,8 @@ import { differenceInCalendarDays, format, isWeekend } from "date-fns" +import { trackEvent } from "@scandic-hotels/tracking/base" import { + type LowestRoomPriceEvent, TrackingChannelEnum, type TrackingSDKHotelInfo, type TrackingSDKPageData, @@ -107,3 +109,18 @@ export function getSelectRateTracking({ pageTrackingData, } } + +export function trackLowestRoomPrice(event: LowestRoomPriceEvent) { + trackEvent({ + event: "lowestRoomPrice", + hotelInfo: { + hotelId: event.hotelId, + arrivalDate: event.arrivalDate, + departureDate: event.departureDate, + }, + viewItemInfo: { + lowestPrice: event.lowestPrice, + currency: event.currency, + }, + }) +} diff --git a/packages/booking-flow/lib/contexts/SelectRate/SelectRateContext.tsx b/packages/booking-flow/lib/contexts/SelectRate/SelectRateContext.tsx index 1df7ddb55..80dc7c4ac 100644 --- a/packages/booking-flow/lib/contexts/SelectRate/SelectRateContext.tsx +++ b/packages/booking-flow/lib/contexts/SelectRate/SelectRateContext.tsx @@ -36,6 +36,7 @@ import { includeRoomInfo } from "./includeRoomInfo" import { isRateSelected as isRateSelected_Inner } from "./isRateSelected" import type { BreakfastPackageEnum } from "@scandic-hotels/trpc/enums/breakfast" +import type { PriceProduct } from "@scandic-hotels/trpc/types/roomAvailability" import type { SelectRateBooking } from "../../types/components/selectRate/selectRate" import type { Price } from "../../types/price" @@ -380,6 +381,8 @@ export function SelectRateProvider({ roomIndex, roomAvailabilityWithAdjustedRoomCount ), + getLowestRoomPrice: () => + getLowestRoomPrice(roomAvailabilityWithAdjustedRoomCount), isRateSelected, getPackagesForRoom, bookingCodeFilter, @@ -520,6 +523,28 @@ function calculateNumberOfNights( return dt(toDate).diff(dt(fromDate), "day") } +function getLowestRoomPrice( + roomAvailability: (AvailabilityWithRoomInfo | null)[][] +) { + // First room is always cheapest room because sort by price is default + const firstRoomAvailability = roomAvailability[0] + return firstRoomAvailability + .filter((room) => !!room)[0] + .products.filter( + (product): product is PriceProduct => + !!( + ("public" in product && product.public) || + ("member" in product && product.member) + ) + ) + .map((product) => ({ + currency: (product.member?.localPrice.currency || + product.public?.localPrice.currency)!, + price: (product.member?.localPrice.pricePerNight || + product.public?.localPrice.pricePerNight)!, + }))[0] +} + function getAvailabilityForRoom( roomIndex: number, roomAvailability: (AvailabilityWithRoomInfo | null)[][] | undefined diff --git a/packages/booking-flow/lib/contexts/SelectRate/types.ts b/packages/booking-flow/lib/contexts/SelectRate/types.ts index 57eeaff4d..8a2d2f0b5 100644 --- a/packages/booking-flow/lib/contexts/SelectRate/types.ts +++ b/packages/booking-flow/lib/contexts/SelectRate/types.ts @@ -1,5 +1,6 @@ import { type RouterOutput } from "@scandic-hotels/trpc/client" +import type { CurrencyEnum } from "@scandic-hotels/common/constants/currency" import type { RoomPackageCodeEnum } from "@scandic-hotels/trpc/enums/roomFilter" import type { RoomsAvailabilityOutputSchema } from "@scandic-hotels/trpc/routers/hotels/availability/selectRate/rooms/schema" import type { PackageEnum } from "@scandic-hotels/trpc/types/packages" @@ -31,6 +32,11 @@ export type SelectRateContext = { roomIndex: number ) => AvailabilityWithRoomInfo[] | undefined + getLowestRoomPrice: () => { + price: number + currency: CurrencyEnum + } + getPackagesForRoom: (roomIndex: number) => { selectedPackages: RoomPackage[] availablePackages: (DefaultRoomPackage | RoomPackage)[]