"use client" import { cx } from "class-variance-authority" import { useIntl } from "react-intl" import { formatPrice } from "@scandic-hotels/common/utils/numberFormatting" import { Button } from "@scandic-hotels/design-system/Button" import { Divider } from "@scandic-hotels/design-system/Divider" import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" import { Typography } from "@scandic-hotels/design-system/Typography" import { ChildBedTypeEnum } from "@scandic-hotels/trpc/enums/childBedTypeEnum" import { CancellationRuleEnum } from "@/constants/booking" import { useBookingConfirmationStore } from "@/stores/booking-confirmation" import { getFeatureDescription } from "@/components/HotelReservation/utils/getRoomFeatureDescription" import Modal from "@/components/Modal" import Breakfast from "./Breakfast" import RoomSkeletonLoader from "./RoomSkeletonLoader" import styles from "./room.module.css" import type { BookingConfirmationReceiptRoomProps } from "@/types/components/hotelReservation/bookingConfirmation/receipt" export default function ReceiptRoom({ room, roomNumber, roomCount, }: BookingConfirmationReceiptRoomProps) { const intl = useIntl() const { currencyCode, isVatCurrency } = useBookingConfirmationStore( (state) => ({ currencyCode: state.currencyCode, isVatCurrency: state.isVatCurrency, }) ) if (!room) { return } const childBedCrib = room.childBedPreferences.find( (c) => c.bedType === ChildBedTypeEnum.Crib ) const childBedExtraBed = room.childBedPreferences.find( (c) => c.bedType === ChildBedTypeEnum.ExtraBed ) const adultsMsg = intl.formatMessage( { defaultMessage: "{totalAdults, plural, one {# adult} other {# adults}}", }, { totalAdults: room.adults } ) const guestsParts = [adultsMsg] if (room.childrenAges?.length) { const childrenMsg = intl.formatMessage( { defaultMessage: "{totalChildren, plural, one {# child} other {# children}}", }, { totalChildren: room.childrenAges.length } ) guestsParts.push(childrenMsg) } const guests = guestsParts.join(", ") const showDiscounted = room.rateDefinition.isMemberRate return ( <>
{roomCount > 1 ? (

{intl.formatMessage( { defaultMessage: "Room {roomIndex}", }, { roomIndex: roomNumber, } )}

) : null}

{room.name}

{guestsParts.join(", ")}

{room.rateDefinition.cancellationText}

{room.formattedRoomCost}

{/* TODO: add original price, we're currently not receiving this value from API */}
{room.rateDefinition.generalTerms ? (
{intl.formatMessage({ defaultMessage: "Reservation policy", })} } title={ (isVatCurrency ? room.rateDefinition.cancellationText : room.rateDefinition.title) || "" } subtitle={ room.rateDefinition.cancellationRule === CancellationRuleEnum.CancellableBefore6PM ? intl.formatMessage({ defaultMessage: "Pay later", }) : intl.formatMessage({ defaultMessage: "Pay now", }) } >
{room.rateDefinition.generalTerms?.map((info) => ( {info} ))}
) : null}
{room.roomFeatures ? room.roomFeatures.map((feature) => (

{getFeatureDescription( feature.code, feature.description, intl )}

{formatPrice(intl, feature.totalPrice, feature.currency)}

)) : null}

{room.bedDescription}

{formatPrice(intl, 0, currencyCode)}

{childBedCrib ? (

{intl.formatMessage( { defaultMessage: "Crib (child) × {count}", }, { count: childBedCrib.quantity } )}

{intl.formatMessage({ defaultMessage: "Subject to availability", })}

{formatPrice(intl, 0, currencyCode)}
) : null} {childBedExtraBed ? (

{intl.formatMessage( { defaultMessage: "Extra bed (child) × {count}", }, { count: childBedExtraBed.quantity, } )}

{formatPrice(intl, 0, currencyCode)}
) : null}
) }