import { notFound, redirect } from "next/navigation" import { getBreakfastPackages, getCreditCardsSafely, getHotelData, getProfileSafely, getRoomAvailability, getSelectedRoomAvailability, } from "@/lib/trpc/memoizedRequests" import { HotelIncludeEnum } from "@/server/routers/hotels/input" import BedType from "@/components/HotelReservation/EnterDetails/BedType" import Breakfast from "@/components/HotelReservation/EnterDetails/Breakfast" import Details from "@/components/HotelReservation/EnterDetails/Details" import HistoryStateManager from "@/components/HotelReservation/EnterDetails/HistoryStateManager" import Payment from "@/components/HotelReservation/EnterDetails/Payment" import SectionAccordion from "@/components/HotelReservation/EnterDetails/SectionAccordion" import { getQueryParamsForEnterDetails } from "@/components/HotelReservation/SelectRate/RoomSelection/utils" import { getIntl } from "@/i18n" import { StepEnum } from "@/types/components/hotelReservation/enterDetails/step" import { SelectRateSearchParams } from "@/types/components/hotelReservation/selectRate/selectRate" import type { LangParams, PageArgs } from "@/types/params" export function preload() { void getProfileSafely() void getCreditCardsSafely() } function isValidStep(step: string): step is StepEnum { return Object.values(StepEnum).includes(step as StepEnum) } export default async function StepPage({ params, searchParams, }: PageArgs) { const { lang } = params void getBreakfastPackages(searchParams.hotel) const intl = await getIntl() const selectRoomParams = new URLSearchParams(searchParams) const { hotel: hotelId, adults, children, roomTypeCode, rateCode, fromDate, toDate, } = getQueryParamsForEnterDetails(selectRoomParams) void getRoomAvailability({ hotelId: parseInt(hotelId), adults, children, roomStayStartDate: fromDate, roomStayEndDate: toDate, rateCode }) if (!rateCode || !roomTypeCode) { return notFound() } const [ hotelData, user, savedCreditCards, breakfastPackages, roomAvailability, ] = await Promise.all([ getHotelData({ hotelId, language: lang, include: [HotelIncludeEnum.RoomCategories], }), getProfileSafely(), getCreditCardsSafely(), getBreakfastPackages(searchParams.hotel), getSelectedRoomAvailability({ hotelId: parseInt(searchParams.hotel), adults, children, roomStayStartDate: fromDate, roomStayEndDate: toDate, rateCode, roomTypeCode, }), ]) if (!isValidStep(params.step) || !hotelData || !roomAvailability) { return notFound() } const mustBeGuaranteed = roomAvailability?.mustBeGuaranteed ?? false const paymentGuarantee = intl.formatMessage({ id: "Payment Guarantee", }) const payment = intl.formatMessage({ id: "Payment", }) const guaranteeWithCard = intl.formatMessage({ id: "Guarantee booking with credit card", }) const selectPaymentMethod = intl.formatMessage({ id: "Select payment method", }) const availableRoom = roomAvailability.selectedRoom?.roomType const bedTypes = hotelData.included ?.find((room) => room.name === availableRoom) ?.roomTypes.map((room) => ({ description: room.mainBed.description, size: room.mainBed.widthRange, value: room.code, })) return (
{/* TODO: How to handle no beds found? */} {bedTypes ? ( ) : null}
) }