diff --git a/apps/scandic-web/components/HotelReservation/BookingConfirmation/Tracking/index.tsx b/apps/scandic-web/components/HotelReservation/BookingConfirmation/Tracking/index.tsx index da10c4dd5..90950fe6e 100644 --- a/apps/scandic-web/components/HotelReservation/BookingConfirmation/Tracking/index.tsx +++ b/apps/scandic-web/components/HotelReservation/BookingConfirmation/Tracking/index.tsx @@ -1,5 +1,7 @@ "use client" +import { useEffect, useState } from "react" + import { useBookingConfirmationStore } from "@/stores/booking-confirmation" import TrackingSDK from "@/components/TrackingSDK" @@ -17,6 +19,22 @@ export default function Tracking({ }) { const lang = useLang() const bookingRooms = useBookingConfirmationStore((state) => state.rooms) + + const [hasLoadedBookingConfirmation] = useState(() => { + if (typeof window !== "undefined") { + return sessionStorage.getItem("hasLoadedBookingConfirmation") + } + return null + }) + + useEffect(() => { + sessionStorage.setItem("hasLoadedBookingConfirmation", "true") + + return () => { + sessionStorage.removeItem("hasLoadedBookingConfirmation") + } + }, []) + if (!bookingRooms.every(Boolean)) { return null } @@ -34,8 +52,8 @@ export default function Tracking({ return ( ) diff --git a/apps/scandic-web/components/HotelReservation/EnterDetails/BedType/index.tsx b/apps/scandic-web/components/HotelReservation/EnterDetails/BedType/index.tsx index e4c3160e3..ba4ac4679 100644 --- a/apps/scandic-web/components/HotelReservation/EnterDetails/BedType/index.tsx +++ b/apps/scandic-web/components/HotelReservation/EnterDetails/BedType/index.tsx @@ -57,7 +57,9 @@ export default function BedType() { const selectedBedType = methods.watch("bedType") const handleSubmit = methods.handleSubmit useEffect(() => { - handleSubmit(onSubmit)() + if (selectedBedType) { + handleSubmit(onSubmit)() + } }, [selectedBedType, handleSubmit, onSubmit]) return ( diff --git a/apps/scandic-web/components/HotelReservation/EnterDetails/Breakfast/index.tsx b/apps/scandic-web/components/HotelReservation/EnterDetails/Breakfast/index.tsx index 4a665f495..44ef6061a 100644 --- a/apps/scandic-web/components/HotelReservation/EnterDetails/Breakfast/index.tsx +++ b/apps/scandic-web/components/HotelReservation/EnterDetails/Breakfast/index.tsx @@ -69,7 +69,9 @@ export default function Breakfast() { const selectedBreakfast = methods.watch("breakfast") const handleSubmit = methods.handleSubmit useEffect(() => { - handleSubmit(onSubmit)() + if (selectedBreakfast) { + handleSubmit(onSubmit)() + } }, [selectedBreakfast, handleSubmit, onSubmit]) return ( diff --git a/apps/scandic-web/components/HotelReservation/EnterDetails/Tracking/tracking.ts b/apps/scandic-web/components/HotelReservation/EnterDetails/Tracking/tracking.ts index b1b7b8f63..2ff72c06a 100644 --- a/apps/scandic-web/components/HotelReservation/EnterDetails/Tracking/tracking.ts +++ b/apps/scandic-web/components/HotelReservation/EnterDetails/Tracking/tracking.ts @@ -93,22 +93,27 @@ export function getTracking( .join("|"), country: hotel?.address.country, departureDate: format(departureDate, "yyyy-MM-dd"), - discount: rooms - .map((room, idx) => { - const isMainRoom = idx === 0 - if ( - hasMemberPrice(room.roomRate) && - isMainRoom && - isMember && - hasPublicPrice(room.roomRate) - ) { - const memberPrice = room.roomRate.member.localPrice.pricePerStay - const publicPrice = room.roomRate.public.localPrice.pricePerStay - return publicPrice - memberPrice - } - return 0 - }) - .join(","), + discount: rooms.reduce((total, room, idx) => { + const isMainRoom = idx === 0 + if ( + hasMemberPrice(room.roomRate) && + isMainRoom && + isMember && + hasPublicPrice(room.roomRate) + ) { + const memberPrice = room.roomRate.member.localPrice.pricePerStay + const publicPrice = room.roomRate.public.localPrice.pricePerStay + total += publicPrice - memberPrice + } else if ( + hasPublicPrice(room.roomRate) && + room.roomRate.public.localPrice.regularPricePerStay + ) { + const publicPrice = room.roomRate.public.localPrice.pricePerStay + const regularPrice = room.roomRate.public.localPrice.regularPricePerStay + total += regularPrice - publicPrice + } + return total + }, 0), duration: differenceInCalendarDays(departureDate, arrivalDate), hotelID: hotel?.operaId, leadTime: differenceInCalendarDays(arrivalDate, new Date()), @@ -194,19 +199,18 @@ export function getTracking( const ancillaries: TrackingSDKAncillaries = roomsWithPetRoom .slice(0, 1) // should only be one item .map((room) => { - const petRoomPackage = room.packages.find( - (p) => p.code === RoomPackageCodeEnum.PET_ROOM - ) - return { - hotelId: hotel.operaId, - productId: petRoomPackage?.code!, // property is guaranteed at this point - productUnits: roomsWithPetRoom.length, - productPoints: 0, - productPrice: petRoomPackage?.localPrice.totalPrice ?? 0, - productType: "room preference", - productName: "pet room", - productCategory: "", - } + return room.packages + .filter((p) => p.code === RoomPackageCodeEnum.PET_ROOM) + .map((pkg) => ({ + hotelId: hotel.operaId, + productId: pkg.code, + productUnits: roomsWithPetRoom.length, + productPoints: 0, + productPrice: pkg.localPrice.totalPrice * roomsWithPetRoom.length, + productType: "room preference", + productName: "pet room", + productCategory: "", + }))[0] }) return { @@ -215,6 +219,7 @@ export function getTracking( ancillaries, } } + function hasPublicPrice( roomRate: Product ): roomRate is PriceProduct & { public: NonNullable } { @@ -223,6 +228,7 @@ function hasPublicPrice( } return false } + function hasMemberPrice( roomRate: Product ): roomRate is PriceProduct & { member: NonNullable } { @@ -231,6 +237,7 @@ function hasMemberPrice( } return false } + function hasPetRoom( room: Room ): room is Room & { packages: NonNullable } { @@ -239,6 +246,7 @@ function hasPetRoom( } return room.packages.some((p) => p.code === RoomPackageCodeEnum.PET_ROOM) } + function calcTotalPrice(rooms: Room[], isMember: boolean) { const totalRoomPrice = calcTotalRoomPrice(rooms, isMember) const totalPackageSum = rooms.reduce((total, room) => { @@ -247,6 +255,7 @@ function calcTotalPrice(rooms: Room[], isMember: boolean) { }, 0) return totalRoomPrice + totalPackageSum } + function calcTotalRoomPrice(rooms: Room[], isMember: boolean) { return rooms.reduce((total, room, idx) => { // When it comes special rates, only redemption has additional price and that should be added diff --git a/apps/scandic-web/components/TrackingSDK/hooks.ts b/apps/scandic-web/components/TrackingSDK/hooks.ts index 9739c1e72..f16f3dd28 100644 --- a/apps/scandic-web/components/TrackingSDK/hooks.ts +++ b/apps/scandic-web/components/TrackingSDK/hooks.ts @@ -1,13 +1,7 @@ "use client" import { usePathname } from "next/navigation" -import { - startTransition, - useEffect, - useOptimistic, - useRef, - useState, -} from "react" +import { startTransition, useEffect, useRef, useState } from "react" import { trpc } from "@/lib/trpc/client" import useRouterTransitionStore from "@/stores/router-transition" @@ -105,7 +99,6 @@ export const useTrackSoftNavigation = ({ isError, } = trpc.user.userTrackingInfo.useQuery() - const [loading, setLoading] = useOptimistic(false) const [status, setStatus] = useState( TransitionStatusEnum.NotRun ) @@ -125,22 +118,17 @@ export const useTrackSoftNavigation = ({ if (isTransitioning && status === TransitionStatusEnum.NotRun) { startTransition(() => { setStatus(TransitionStatusEnum.Running) - setLoading(true) }) return } - if ( - !loading && - isTransitioning && - status === TransitionStatusEnum.Running - ) { + if (isTransitioning && status === TransitionStatusEnum.Running) { setStatus(TransitionStatusEnum.Done) stopRouterTransition() return } - if (!loading && !isTransitioning && status === TransitionStatusEnum.Done) { + if (!isTransitioning && status === TransitionStatusEnum.Done) { const pageLoadTime = getPageLoadTime() const trackingData = { ...pageData, @@ -149,29 +137,27 @@ export const useTrackSoftNavigation = ({ pageLoadTime: pageLoadTime, } const pageObject = createSDKPageObject(trackingData) - if (previousPathname.current !== pathName) { - const userData: TrackingSDKUserData = isError - ? { loginStatus: "Error" } - : userTrackingData + const userData: TrackingSDKUserData = isError + ? { loginStatus: "Error" } + : userTrackingData - trackPageView({ - event: "pageView", - pageInfo: pageObject, - userInfo: userData, - hotelInfo: hotelInfo, - paymentInfo, - ancillaries, - }) - } + trackPageView({ + event: "pageView", + pageInfo: pageObject, + userInfo: userData, + hotelInfo: hotelInfo, + paymentInfo, + ancillaries, + }) + + setStatus(TransitionStatusEnum.NotRun) // Reset status previousPathname.current = pathName // Update for next render } }, [ isError, isPending, isTransitioning, - loading, status, - setLoading, stopRouterTransition, pageData, pathName, diff --git a/apps/scandic-web/components/TrackingSDK/index.tsx b/apps/scandic-web/components/TrackingSDK/index.tsx index 2374a9af8..74bd5192f 100644 --- a/apps/scandic-web/components/TrackingSDK/index.tsx +++ b/apps/scandic-web/components/TrackingSDK/index.tsx @@ -1,9 +1,6 @@ "use client" -import { - useTrackHardNavigation, - useTrackSoftNavigation, -} from "@/components/TrackingSDK/hooks" +import { useTrackSoftNavigation } from "@/components/TrackingSDK/hooks" import type { TrackingSDKAncillaries, @@ -23,7 +20,9 @@ export default function TrackingSDK({ paymentInfo?: TrackingSDKPaymentInfo ancillaries?: TrackingSDKAncillaries }) { - useTrackHardNavigation({ pageData, hotelInfo, paymentInfo, ancillaries }) + // This hook doesnt seem to be needed. Soft navigation hook seems to fire + // on both hard and soft navigations + // useTrackHardNavigation({ pageData, hotelInfo, paymentInfo, ancillaries }) useTrackSoftNavigation({ pageData, hotelInfo, paymentInfo, ancillaries }) return null