"use client" import { useIntl } from "react-intl" import { dt } from "@/lib/dt" import { getIconForFeatureCode } from "@/components/HotelReservation/utils" import { BedDoubleIcon, CoffeeIcon, ContractIcon, DoorOpenIcon, PersonIcon, } from "@/components/Icons" import RocketLaunch from "@/components/Icons/Refresh" import Image from "@/components/Image" import Body from "@/components/TempDesignSystem/Text/Body" import Subtitle from "@/components/TempDesignSystem/Text/Subtitle" import useLang from "@/hooks/useLang" import { formatPrice } from "@/utils/numberFormatting" import ToggleSidePeek from "../../EnterDetails/SelectedRoom/ToggleSidePeek" import PriceDetailsModal from "../../PriceDetailsModal" import GuestDetails from "./GuestDetails" 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) 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.title}
{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 ? intl.formatMessage( { id: "{adults} adults, {children} children" }, { adults: booking.adults, children: booking.childrenAges.length, } ) : intl.formatMessage( { id: "{adults} adults" }, { adults: booking.adults, } )}
{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 ? ` (${room.bedType.mainBed.widthRange.min} ${intl.formatMessage({ id: "cm" })})` : ` (${room.bedType.mainBed.widthRange.min} - ${room.bedType.mainBed.widthRange.max} ${intl.formatMessage({ id: "cm" })})`}
{intl.formatMessage({ id: "Room total" })} {formatPrice(intl, booking.totalPrice, booking.currencyCode)}
) }