import { differenceInCalendarDays, format, isWeekend } from "date-fns" import { Suspense } from "react" import { getBookingConfirmation } from "@/lib/trpc/memoizedRequests" import TrackingSDK from "@/components/TrackingSDK" import { getLang } from "@/i18n/serverContext" import { invertedBedTypeMap } from "../utils" import Confirmation from "./Confirmation" import type { BookingConfirmationProps } from "@/types/components/hotelReservation/bookingConfirmation/bookingConfirmation" import { TrackingChannelEnum, type TrackingSDKHotelInfo, type TrackingSDKPageData, type TrackingSDKPaymentInfo, } from "@/types/components/tracking" import { BreakfastPackageEnum } from "@/types/enums/breakfast" export default async function BookingConfirmation({ confirmationNumber, }: BookingConfirmationProps) { const lang = getLang() const { booking, hotel, room } = await getBookingConfirmation(confirmationNumber) const arrivalDate = new Date(booking.checkInDate) const departureDate = new Date(booking.checkOutDate) const breakfastPkgSelected = booking.packages.find( (pkg) => pkg.code === BreakfastPackageEnum.REGULAR_BREAKFAST ) const breakfastAncillary = breakfastPkgSelected && { hotelid: hotel.operaId, productName: "BreakfastAdult", productCategory: "", // TODO: Add category productId: breakfastPkgSelected.code ?? "", productPrice: +breakfastPkgSelected.unitPrice, productUnits: booking.adults, productPoints: 0, productType: "food", } const initialPageTrackingData: TrackingSDKPageData = { pageId: "booking-confirmation", domainLanguage: lang, channel: TrackingChannelEnum["hotelreservation"], pageName: `hotelreservation|confirmation`, siteSections: `hotelreservation|confirmation`, pageType: "confirmation", siteVersion: "new-web", } const initialHotelsTrackingData: TrackingSDKHotelInfo = { arrivalDate: format(arrivalDate, "yyyy-MM-dd"), departureDate: format(departureDate, "yyyy-MM-dd"), noOfAdults: booking.adults, noOfChildren: booking.childrenAges?.length, ageOfChildren: booking.childrenAges?.join(","), childBedPreference: booking?.extraBedTypes ?.flatMap((c) => Array(c.quantity).fill(invertedBedTypeMap[c.bedType])) .join("|"), noOfRooms: 1, // // TODO: Handle multiple rooms duration: differenceInCalendarDays(departureDate, arrivalDate), leadTime: differenceInCalendarDays(arrivalDate, new Date()), searchType: "hotel", bookingTypeofDay: isWeekend(arrivalDate) ? "weekend" : "weekday", country: hotel?.address.country, hotelID: hotel.operaId, region: hotel?.address.city, rateCode: booking.rateDefinition.rateCode ?? undefined, rateCodeType: booking.rateDefinition.title ?? undefined, rateCodeName: booking.rateDefinition.rateCode ?? undefined, rateCodeCancellationRule: booking.rateDefinition?.cancellationText ?? undefined, revenueCurrencyCode: booking.currencyCode, breakfastOption: booking.rateDefinition.breakfastIncluded ? "breakfast buffet" : "no breakfast", totalPrice: booking.totalPrice, //specialRoomType: getSpecialRoomType(booking.packages), TODO: Add //roomTypeName: booking.roomTypeCode ?? undefined, TODO: Do we get the name? bedType: room?.bedType.name, roomTypeCode: booking.roomTypeCode ?? undefined, roomPrice: booking.roomPrice, bnr: booking.confirmationNumber ?? undefined, ancillaries: breakfastAncillary ? [breakfastAncillary] : [], } const paymentInfo: TrackingSDKPaymentInfo = { paymentStatus: "confirmed", } return ( <> ) }