"use client" import { useIntl } from "react-intl" import { dt } from "@/lib/dt" import PriceDetailsModal from "@/components/HotelReservation/PriceDetailsModal" import { getIconForFeatureCode } from "@/components/HotelReservation/utils" import { BedDoubleIcon, BookingCodeIcon, CoffeeIcon, ContractIcon, DoorOpenIcon, PersonIcon, } from "@/components/Icons" import RocketLaunch from "@/components/Icons/Refresh" import Image from "@/components/Image" import IconChip from "@/components/TempDesignSystem/IconChip" import Body from "@/components/TempDesignSystem/Text/Body" import Caption from "@/components/TempDesignSystem/Text/Caption" import Subtitle from "@/components/TempDesignSystem/Text/Subtitle" import useLang from "@/hooks/useLang" import { formatPrice } from "@/utils/numberFormatting" import GuestDetails from "./GuestDetails" import PriceDetailsTable from "./PriceDetailsTable" import ToggleSidePeek from "./ToggleSidePeek" import styles from "./room.module.css" import { RoomPackageCodeEnum } from "@/types/components/hotelReservation/selectRate/roomFilter" import { BreakfastPackageEnum } from "@/types/enums/breakfast" import type { Hotel, Room } from "@/types/hotel" import type { BookingConfirmation } from "@/types/trpc/routers/booking/confirmation" import type { User } from "@/types/user" interface RoomProps { booking: BookingConfirmation["booking"] room: | (Room & { bedType: Room["roomTypes"][number] }) | null hotel: Hotel user: User | null } function hasBreakfastPackage( packages: BookingConfirmation["booking"]["packages"] ) { return packages.some( (p) => p.code === BreakfastPackageEnum.REGULAR_BREAKFAST || p.code === BreakfastPackageEnum.FREE_MEMBER_BREAKFAST || p.code === BreakfastPackageEnum.SPECIAL_PACKAGE_BREAKFAST ) } function RoomHeader({ room, hotel, }: { room: RoomProps["room"] hotel: Hotel }) { if (!room) return null return (
{room.name}
) } export function Room({ booking, room, hotel, user }: RoomProps) { const intl = useIntl() const lang = useLang() if (!room) return null const fromDate = dt(booking.checkInDate).locale(lang) const mainBedWidthValueMsg = intl.formatMessage( { id: "{value} cm" }, { value: room.bedType.mainBed.widthRange.min, } ) const mainBedWidthRangeMsg = intl.formatMessage( { id: "{min}–{max} cm", }, { min: room.bedType.mainBed.widthRange.min, max: room.bedType.mainBed.widthRange.max, } ) const adultsMsg = intl.formatMessage( { id: "{adults, plural, one {# adult} other {# adults}}", }, { adults: booking.adults, } ) const childrenMsg = intl.formatMessage( { id: "{children, plural, one {# child} other {# children}}", }, { children: booking.childrenAges.length, } ) const adultsOnlyMsg = adultsMsg const adultsAndChildrenMsg = [adultsMsg, childrenMsg].join(", ") return (
{booking.packages .filter((item) => Object.values(RoomPackageCodeEnum).includes( item.code as RoomPackageCodeEnum ) ) .map((item) => { const Icon = getIconForFeatureCode( item.code as RoomPackageCodeEnum ) return ( ) })}
{room.images.slice(0, 2).map((image) => ( {room?.name ))}
{intl.formatMessage({ id: "Booking policy" })}
{booking.rateDefinition.cancellationText}
{intl.formatMessage({ id: "Rebooking" })}
{intl.formatMessage( { id: "Until {time}, {date}" }, { time: "18:00", date: fromDate.format("dddd D MMM") } )}
{booking.packages.some((item) => Object.values(RoomPackageCodeEnum).includes( item.code as RoomPackageCodeEnum ) ) && (
{intl.formatMessage({ id: "Room type" })}
{booking.packages .filter((item) => Object.values(RoomPackageCodeEnum).includes( item.code as RoomPackageCodeEnum ) ) .map((item) => item.description) .join(", ")}
)}
{intl.formatMessage({ id: "Guests" })}
{booking.childrenAges.length > 0 ? adultsAndChildrenMsg : adultsOnlyMsg}
{intl.formatMessage({ id: "Breakfast" })}
{hasBreakfastPackage(booking.packages) ? intl.formatMessage({ id: "Included" }) : intl.formatMessage({ id: "Not included" })}
{intl.formatMessage({ id: "Bed preference" })}
{room.bedType.mainBed.description} {room.bedType.mainBed.widthRange.min === room.bedType.mainBed.widthRange.max ? ` (${mainBedWidthValueMsg})` : ` (${mainBedWidthRangeMsg})`}
{booking?.bookingCode && ( }> {intl.formatMessage({ id: "Booking code" })} {booking.bookingCode} )}
{intl.formatMessage({ id: "Room total" })} {formatPrice(intl, booking.totalPrice, booking.currencyCode)}
) }