diff --git a/packages/booking-flow/lib/components/EnterDetails/Payment/BookingAlert/index.tsx b/packages/booking-flow/lib/components/EnterDetails/Payment/BookingAlert/index.tsx index a1471109b..baf7e4c4b 100644 --- a/packages/booking-flow/lib/components/EnterDetails/Payment/BookingAlert/index.tsx +++ b/packages/booking-flow/lib/components/EnterDetails/Payment/BookingAlert/index.tsx @@ -6,7 +6,6 @@ import { useIntl } from "react-intl" import { AlertTypeEnum } from "@scandic-hotels/common/constants/alert" import { selectRate } from "@scandic-hotels/common/constants/routes/hotelReservation" -import { useSessionId } from "@scandic-hotels/common/hooks/useSessionId" import useStickyPosition from "@scandic-hotels/common/hooks/useStickyPosition" import { Alert } from "@scandic-hotels/design-system/Alert" import { trackNoAvailability } from "@scandic-hotels/tracking/NoAvailabilityTracking" @@ -173,7 +172,6 @@ function useNoAvailabilityTracking() { useEnterDetailsStore((state) => state.booking) const hotelName = useEnterDetailsStore((state) => state.hotelName) const lang = useLang() - const sessionId = useSessionId() const specialRoomType = rooms ?.map((room) => { @@ -201,7 +199,6 @@ function useNoAvailabilityTracking() { pageName: "hotelreservation|details", pageType: "bookingenterdetailspage", siteSections: "hotelreservation|details", - sessionId, domain: typeof window !== "undefined" ? window.location.host : "", }), [ @@ -214,7 +211,6 @@ function useNoAvailabilityTracking() { rooms.length, searchType, bookingCode, - sessionId, ] ) return track diff --git a/packages/booking-flow/lib/components/SelectHotel/index.tsx b/packages/booking-flow/lib/components/SelectHotel/index.tsx index ef009f832..1510f79f6 100644 --- a/packages/booking-flow/lib/components/SelectHotel/index.tsx +++ b/packages/booking-flow/lib/components/SelectHotel/index.tsx @@ -34,7 +34,7 @@ interface SelectHotelProps { lang: Lang } -export async function SelectHotel({ +export function SelectHotel({ bookingCode, city, hotels, diff --git a/packages/booking-flow/lib/components/SelectRate/AvailabilityError.tsx b/packages/booking-flow/lib/components/SelectRate/AvailabilityError.tsx index e953ce54a..de90239f2 100644 --- a/packages/booking-flow/lib/components/SelectRate/AvailabilityError.tsx +++ b/packages/booking-flow/lib/components/SelectRate/AvailabilityError.tsx @@ -4,7 +4,6 @@ import { usePathname, useSearchParams } from "next/navigation" import { useCallback, useEffect } from "react" import { useIntl } from "react-intl" -import { useSessionId } from "@scandic-hotels/common/hooks/useSessionId" import { toast } from "@scandic-hotels/design-system/Toast" import { trackNoAvailability } from "@scandic-hotels/tracking/NoAvailabilityTracking" import { SEARCH_TYPE_REDEMPTION } from "@scandic-hotels/trpc/constants/booking" @@ -27,7 +26,6 @@ export default function AvailabilityError({ const intl = useIntl() const pathname = usePathname() const searchParams = useSearchParams() - const sessionId = useSessionId() const lang = useLang() @@ -71,7 +69,6 @@ export default function AvailabilityError({ pageName: "hotelreservation|select-rate", pageType: "bookingroomsandratespage", siteSections: "hotelreservation|select-rate", - sessionId, domain: typeof window !== "undefined" ? window.location.host : "", }) }, [ @@ -83,7 +80,6 @@ export default function AvailabilityError({ searchType, hotelId, bookingCode, - sessionId, ]) useEffect(() => { diff --git a/packages/booking-flow/lib/components/SelectRate/RoomsContainer/index.tsx b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/index.tsx index 429e4a2d0..505d6d5fc 100644 --- a/packages/booking-flow/lib/components/SelectRate/RoomsContainer/index.tsx +++ b/packages/booking-flow/lib/components/SelectRate/RoomsContainer/index.tsx @@ -6,8 +6,13 @@ import { useIntl } from "react-intl" import { AlertTypeEnum } from "@scandic-hotels/common/constants/alert" import { Alert } from "@scandic-hotels/design-system/Alert" +import { trackNoAvailability } from "@scandic-hotels/tracking/NoAvailabilityTracking" +import { SEARCH_TYPE_REDEMPTION } from "@scandic-hotels/trpc/constants/booking" +import { AvailabilityEnum } from "@scandic-hotels/trpc/enums/selectHotel" import { useSelectRateContext } from "../../../contexts/SelectRate/SelectRateContext" +import useLang from "../../../hooks/useLang" +import { mapPackageToLabel } from "../../../utils/getRoomFeatureDescription" import { trackLowestRoomPrice, trackRoomsLoaded } from "../Tracking/tracking" import { RateSummary } from "./RateSummary" import Rooms from "./Rooms" @@ -23,8 +28,10 @@ interface RoomsContainerProps export function RoomsContainer({}: RoomsContainerProps) { const intl = useIntl() + const lang = useLang() const { + hotel, availability: { error, isFetching, isError, data: availabilityData }, input: { hasError: hasInputError, errorCode, data: inputData }, getLowestRoomPrice, @@ -33,7 +40,20 @@ export function RoomsContainer({}: RoomsContainerProps) { const { price: lowestRoomPrice, currency: lowestRoomPriceCurrency } = getLowestRoomPrice() ?? {} const dataAvailable = availabilityData?.length - const { hotelId, fromDate, toDate } = inputData?.booking ?? {} + const { hotelId, fromDate, toDate, bookingCode, searchType, rooms } = + inputData?.booking ?? {} + + const specialRoomType = rooms + ?.map((room) => { + const packages = room.packages + ?.map((pkg) => { + mapPackageToLabel(pkg) + }) + .join(",") + + return packages ?? "" + }) + .join("|") useEffect(() => { if (!dataAvailable) return @@ -61,6 +81,48 @@ export function RoomsContainer({}: RoomsContainerProps) { trackRoomsLoaded() }, [isFetching]) + useEffect(() => { + if (isFetching || !availabilityData || !toDate || !fromDate) return + const shouldTrackNoAvailability = availabilityData.some((room) => { + if (!room || "error" in room) return false + + return room.roomConfigurations.every( + (roomConfig) => roomConfig.status === AvailabilityEnum.NotAvailable + ) + }) + if (shouldTrackNoAvailability) { + trackNoAvailability({ + specialRoomType, + searchTerm: hotel.data?.additionalData?.name || "", + lang, + fromDate, + toDate, + noOfRooms: rooms?.length, + searchType: "hotel", + hotelId, + rewardNight: searchType === SEARCH_TYPE_REDEMPTION ? "yes" : "no", + bookingCode, + pageId: "select-rate", + pageName: "hotelreservation|select-rate", + pageType: "bookingroomsandratespage", + siteSections: "hotelreservation|select-rate", + domain: typeof window !== "undefined" ? window.location.host : "", + }) + } + }, [ + isFetching, + availabilityData, + bookingCode, + hotelId, + fromDate, + toDate, + specialRoomType, + hotel.data?.additionalData?.name, + rooms?.length, + searchType, + lang, + ]) + if (isFetching) { return } diff --git a/packages/booking-flow/lib/components/SelectRate/Tracking/SelectRateTracking.tsx b/packages/booking-flow/lib/components/SelectRate/Tracking/SelectRateTracking.tsx index b2fbcc6d4..cb7497083 100644 --- a/packages/booking-flow/lib/components/SelectRate/Tracking/SelectRateTracking.tsx +++ b/packages/booking-flow/lib/components/SelectRate/Tracking/SelectRateTracking.tsx @@ -1,9 +1,7 @@ "use client" -import { NoAvailabilityTracking } from "@scandic-hotels/tracking/NoAvailabilityTracking" import { TrackingSDK } from "@scandic-hotels/tracking/TrackingSDK" import { SEARCH_TYPE_REDEMPTION } from "@scandic-hotels/trpc/constants/booking" -import { AvailabilityEnum } from "@scandic-hotels/trpc/enums/selectHotel" import { useSelectRateContext } from "../../../contexts/SelectRate/SelectRateContext" import useLang from "../../../hooks/useLang" @@ -22,7 +20,7 @@ interface TrackingProps { export function SelectRateTracking({ hotelData, booking }: TrackingProps) { const lang = useLang() - const { availability, input } = useSelectRateContext() + const { input } = useSelectRateContext() const { fromDate, toDate } = getValidDates(booking.fromDate, booking.toDate) @@ -39,6 +37,7 @@ export function SelectRateTracking({ hotelData, booking }: TrackingProps) { return packages ?? "" }) .join("|") + const { hotelsTrackingData, pageTrackingData } = getSelectRateTracking({ lang, arrivalDate, @@ -53,47 +52,7 @@ export function SelectRateTracking({ hotelData, booking }: TrackingProps) { rooms, }) - let shouldTrackNoAvailability = false - if (availability && !availability.isFetching && availability.data) { - shouldTrackNoAvailability = availability.data.some((room) => { - if (!room || "error" in room) return false - - const allRoomsNotAvailable = room.roomConfigurations.every( - (roomConfig) => roomConfig.status === AvailabilityEnum.NotAvailable - ) - - const isPublicPromotionWithCode = room.roomConfigurations.some((r) => { - const filteredCampaigns = r.campaign.filter(Boolean) - return filteredCampaigns.length - ? filteredCampaigns.every( - (product) => !!product.rateDefinition?.isCampaignRate - ) - : false - }) - - const noAvailableBookingCodeRooms = - !isPublicPromotionWithCode && - room.roomConfigurations.every( - (r) => r.status === AvailabilityEnum.NotAvailable || !r.code.length - ) - - return ( - allRoomsNotAvailable || - (input.bookingCode && noAvailableBookingCodeRooms) - ) - }) - } - return ( - <> - - - - + ) } diff --git a/packages/booking-flow/lib/pages/AlternativeHotelsPage.tsx b/packages/booking-flow/lib/pages/AlternativeHotelsPage.tsx index 45c20a834..0f0f7be56 100644 --- a/packages/booking-flow/lib/pages/AlternativeHotelsPage.tsx +++ b/packages/booking-flow/lib/pages/AlternativeHotelsPage.tsx @@ -128,13 +128,13 @@ export async function AlternativeHotelsPage({ } lang={lang} /> + - ) } diff --git a/packages/booking-flow/lib/pages/SelectHotelPage.tsx b/packages/booking-flow/lib/pages/SelectHotelPage.tsx index 3b10304c9..dc4c5fd72 100644 --- a/packages/booking-flow/lib/pages/SelectHotelPage.tsx +++ b/packages/booking-flow/lib/pages/SelectHotelPage.tsx @@ -112,13 +112,14 @@ export async function SelectHotelPage({ title={city.name} lang={lang} /> + + - ) } diff --git a/packages/tracking/lib/NoAvailabilityTracking.tsx b/packages/tracking/lib/NoAvailabilityTracking.tsx index 08ed5c4c6..b5700f113 100644 --- a/packages/tracking/lib/NoAvailabilityTracking.tsx +++ b/packages/tracking/lib/NoAvailabilityTracking.tsx @@ -79,11 +79,11 @@ export function NoAvailabilityTracking({ } type TrackNoAvailabilityParams = { - specialRoomType: string + specialRoomType?: string fromDate: string toDate: string - hotelId: string - noOfRooms: number + hotelId?: string + noOfRooms?: number searchType?: string bookingCode?: string searchTerm: string @@ -93,7 +93,6 @@ type TrackNoAvailabilityParams = { pageType: string siteSections: string lang: Lang - sessionId: string | null domain?: string } @@ -112,7 +111,6 @@ export function trackNoAvailability({ pageName, pageType, siteSections, - sessionId, domain, }: TrackNoAvailabilityParams) { const arrivalDate = new Date(fromDate) @@ -142,8 +140,6 @@ export function trackNoAvailability({ pageName, pageType, siteSections, - sessionId, - siteVersion: "new-web", }, }) }