diff --git a/app/[lang]/(live)/(public)/hotelreservation/(confirmation)/booking-confirmation/page.tsx b/app/[lang]/(live)/(public)/hotelreservation/(confirmation)/booking-confirmation/page.tsx index cc92e8c47..2d4496b98 100644 --- a/app/[lang]/(live)/(public)/hotelreservation/(confirmation)/booking-confirmation/page.tsx +++ b/app/[lang]/(live)/(public)/hotelreservation/(confirmation)/booking-confirmation/page.tsx @@ -1,18 +1,8 @@ -import { differenceInCalendarDays, format, isWeekend } from "date-fns" -import { Suspense } from "react" - import { getBookingConfirmation } from "@/lib/trpc/memoizedRequests" import BookingConfirmation from "@/components/HotelReservation/BookingConfirmation" -import TrackingSDK from "@/components/TrackingSDK" import { setLang } from "@/i18n/serverContext" -import { - TrackingChannelEnum, - type TrackingSDKHotelInfo, - type TrackingSDKPageData, -} from "@/types/components/tracking" -import { CurrencyEnum } from "@/types/enums/currency" import type { LangParams, PageArgs } from "@/types/params" export default async function BookingConfirmationPage({ @@ -23,67 +13,11 @@ export default async function BookingConfirmationPage({ const bookingConfirmationPromise = getBookingConfirmation( searchParams.confirmationNumber ) - const { hotel, booking } = await bookingConfirmationPromise - - const arrivalDate = new Date(booking.checkInDate) - const departureDate = new Date(booking.checkOutDate) - - const initialPageTrackingData: TrackingSDKPageData = { - pageId: "booking-confirmation", - domainLanguage: params.lang, - channel: TrackingChannelEnum["hotelreservation"], - pageName: `hotelreservation|confirmation`, - siteSections: `hotelreservation|confirmation`, - pageType: "confirmation", - siteVersion: "new-web", - } - - const initialHotelsTrackingData: TrackingSDKHotelInfo = { - searchTerm: searchParams.city, - 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?.map((c) => 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: CurrencyEnum[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: bedType?.description, TODO: Can we get bedType? - roomTypeCode: booking.roomTypeCode ?? undefined, - roomPrice: booking.roomPrice, - bnr: booking.confirmationNumber ?? undefined, - } return ( - <> - - - - - - + ) } diff --git a/components/HotelReservation/BookingConfirmation/confirmation.module.css b/components/HotelReservation/BookingConfirmation/Confirmation/confirmation.module.css similarity index 100% rename from components/HotelReservation/BookingConfirmation/confirmation.module.css rename to components/HotelReservation/BookingConfirmation/Confirmation/confirmation.module.css diff --git a/components/HotelReservation/BookingConfirmation/Confirmation/index.tsx b/components/HotelReservation/BookingConfirmation/Confirmation/index.tsx new file mode 100644 index 000000000..3d2e5dc9a --- /dev/null +++ b/components/HotelReservation/BookingConfirmation/Confirmation/index.tsx @@ -0,0 +1,45 @@ +"use client" +import { use, useRef } from "react" + +import Header from "@/components/HotelReservation/BookingConfirmation/Header" +import HotelDetails from "@/components/HotelReservation/BookingConfirmation/HotelDetails" +import PaymentDetails from "@/components/HotelReservation/BookingConfirmation/PaymentDetails" +import Promos from "@/components/HotelReservation/BookingConfirmation/Promos" +import Receipt from "@/components/HotelReservation/BookingConfirmation/Receipt" +import Rooms from "@/components/HotelReservation/BookingConfirmation/Rooms" +import SidePanel from "@/components/HotelReservation/SidePanel" +import Divider from "@/components/TempDesignSystem/Divider" + +import styles from "./confirmation.module.css" + +import type { ConfirmationProps } from "@/types/components/hotelReservation/bookingConfirmation/bookingConfirmation" + +export default function Confirmation({ + bookingConfirmationPromise, +}: ConfirmationProps) { + const bookingConfirmation = use(bookingConfirmationPromise) + const mainRef = useRef(null) + + const { booking, hotel, room } = bookingConfirmation + + return ( +
+
+
+ + + + + +
+ +
+
+ +
+ ) +} diff --git a/components/HotelReservation/BookingConfirmation/index.tsx b/components/HotelReservation/BookingConfirmation/index.tsx index c97da8908..91ee99d35 100644 --- a/components/HotelReservation/BookingConfirmation/index.tsx +++ b/components/HotelReservation/BookingConfirmation/index.tsx @@ -1,57 +1,81 @@ -"use client" -import { use, useRef } from "react" +import { differenceInCalendarDays, format, isWeekend } from "date-fns" +import { Suspense } from "react" -import Header from "@/components/HotelReservation/BookingConfirmation/Header" -import HotelDetails from "@/components/HotelReservation/BookingConfirmation/HotelDetails" -import PaymentDetails from "@/components/HotelReservation/BookingConfirmation/PaymentDetails" -import Promos from "@/components/HotelReservation/BookingConfirmation/Promos" -import Receipt from "@/components/HotelReservation/BookingConfirmation/Receipt" -import Rooms from "@/components/HotelReservation/BookingConfirmation/Rooms" -import SidePanel from "@/components/HotelReservation/SidePanel" -import Divider from "@/components/TempDesignSystem/Divider" +import TrackingSDK from "@/components/TrackingSDK" -import styles from "./confirmation.module.css" +import Confirmation from "./Confirmation" import type { BookingConfirmationProps } from "@/types/components/hotelReservation/bookingConfirmation/bookingConfirmation" +import { + TrackingChannelEnum, + type TrackingSDKHotelInfo, + type TrackingSDKPageData, +} from "@/types/components/tracking" +import { CurrencyEnum } from "@/types/enums/currency" -export default function BookingConfirmation({ +export default async function BookingConfirmation({ bookingConfirmationPromise, + lang, }: BookingConfirmationProps) { - const bookingConfirmation = use(bookingConfirmationPromise) - const mainRef = useRef(null) + const bookingConfirmation = await bookingConfirmationPromise + + const { booking, hotel } = bookingConfirmation + + const arrivalDate = new Date(booking.checkInDate) + const departureDate = new Date(booking.checkOutDate) + + 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?.map((c) => 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: CurrencyEnum[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: bedType?.description, TODO: Can we get bedType? + roomTypeCode: booking.roomTypeCode ?? undefined, + roomPrice: booking.roomPrice, + bnr: booking.confirmationNumber ?? undefined, + } + return ( -
-
-
- + + + - - - - -
- -
-
- -
+ + ) } diff --git a/server/routers/hotels/output.ts b/server/routers/hotels/output.ts index dea367591..f69c58d08 100644 --- a/server/routers/hotels/output.ts +++ b/server/routers/hotels/output.ts @@ -1,6 +1,6 @@ import { z } from "zod" -import { ChildBedTypeEnum ,type PaymentMethodEnum } from "@/constants/booking" +import { ChildBedTypeEnum, type PaymentMethodEnum } from "@/constants/booking" import { dt } from "@/lib/dt" import { toLang } from "@/server/utils" @@ -99,10 +99,15 @@ const locationSchema = z.object({ }) const hotelContentSchema = z.object({ - images: z.object({ - metaData: imageMetaDataSchema, - imageSizes: imageSizesSchema, - }), + images: z + .object({ + metaData: imageMetaDataSchema, + imageSizes: imageSizesSchema, + }) + .default({ + metaData: { title: "", altText: "", altText_En: "", copyRight: "" }, + imageSizes: { tiny: "", small: "", medium: "", large: "" }, + }), texts: z.object({ facilityInformation: z.string().optional(), surroundingInformation: z.string(), diff --git a/types/components/hotelReservation/bookingConfirmation/bookingConfirmation.ts b/types/components/hotelReservation/bookingConfirmation/bookingConfirmation.ts index 32eaf9965..4b9352677 100644 --- a/types/components/hotelReservation/bookingConfirmation/bookingConfirmation.ts +++ b/types/components/hotelReservation/bookingConfirmation/bookingConfirmation.ts @@ -1,5 +1,11 @@ +import type { Lang } from "@/constants/languages" import type { RouterOutput } from "@/lib/trpc/client" export interface BookingConfirmationProps { + lang: Lang + bookingConfirmationPromise: Promise +} + +export interface ConfirmationProps { bookingConfirmationPromise: Promise }