"use client" import { Button as ButtonRAC, DialogTrigger } from "react-aria-components" import { useIntl } from "react-intl" import DiscountIcon from "@scandic-hotels/design-system/Icons/DiscountIcon" import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" import { Typography } from "@scandic-hotels/design-system/Typography" import { dt } from "@/lib/dt" import { getBookedHotelRoom } from "@/server/routers/booking/utils" import { useMyStayStore } from "@/stores/my-stay" import GuestDetails from "@/components/HotelReservation/MyStay/GuestDetails" import PriceDetails from "@/components/HotelReservation/MyStay/PriceDetails" import PriceType from "@/components/HotelReservation/MyStay/PriceType" import { hasModifiableRate } from "@/components/HotelReservation/MyStay/utils" import { IconForFeatureCode } from "@/components/HotelReservation/utils" import Image from "@/components/Image" import BookedRoomSidePeek from "@/components/SidePeeks/BookedRoomSidePeek" import SkeletonShimmer from "@/components/SkeletonShimmer" import IconChip from "@/components/TempDesignSystem/IconChip" import useLang from "@/hooks/useLang" import { formatPrice } from "@/utils/numberFormatting" import styles from "./room.module.css" import { RoomPackageCodeEnum } from "@/types/components/hotelReservation/selectRate/roomFilter" import type { Room, RoomCategories } from "@/types/hotel" import type { SafeUser } from "@/types/user" interface RoomProps { bedType: Room["roomTypes"][number] image: Room["images"][number] user: SafeUser roomCategories: RoomCategories } export default function SingleRoom({ bedType, image, user, roomCategories, }: RoomProps) { const intl = useIntl() const lang = useLang() const { adults, bookingCode, breakfast, checkInDate, cheques, childrenAges, confirmationNumber, formattedTotalPrice, guest, isCancelled, packages, priceType, rateDefinition, roomName, roomNumber, roomPoints, roomTypeCode, totalPrice, vouchers, bookedRoom, } = useMyStayStore((state) => ({ adults: state.bookedRoom.adults, bookingCode: state.bookedRoom.bookingCode, breakfast: state.bookedRoom.breakfast, guest: state.bookedRoom.guest, checkInDate: state.bookedRoom.checkInDate, cheques: state.bookedRoom.cheques, childrenAges: state.bookedRoom.childrenAges, confirmationNumber: state.bookedRoom.confirmationNumber, formattedTotalPrice: state.totalPrice, hotel: state.hotel, isCancelled: state.bookedRoom.isCancelled, packages: state.bookedRoom.packages, priceType: state.bookedRoom.priceType, rateDefinition: state.bookedRoom.rateDefinition, roomName: state.bookedRoom.roomName, roomNumber: state.bookedRoom.roomNumber, roomPoints: state.bookedRoom.roomPoints, roomTypeCode: state.bookedRoom.roomTypeCode, totalPrice: state.bookedRoom.totalPrice, vouchers: state.bookedRoom.vouchers, bookedRoom: state.bookedRoom, })) if (!roomNumber) { return (
) } const fromDate = dt(checkInDate).locale(lang) const mainBedWidthValueMsg = intl.formatMessage( { defaultMessage: "{value} cm", }, { value: bedType.mainBed.widthRange.min, } ) const mainBedWidthRangeMsg = intl.formatMessage( { defaultMessage: "{min}–{max} cm", }, { min: bedType.mainBed.widthRange.min, max: bedType.mainBed.widthRange.max, } ) const adultsMsg = intl.formatMessage( { defaultMessage: "{adults, plural, one {# adult} other {# adults}}", }, { adults, } ) const childrenMsg = intl.formatMessage( { defaultMessage: "{children, plural, one {# child} other {# children}}", }, { children: childrenAges.length, } ) const adultsOnlyMsg = adultsMsg const adultsAndChildrenMsg = [adultsMsg, childrenMsg].join(", ") const hasPackages = packages?.some((item) => Object.values(RoomPackageCodeEnum).includes( item.code as RoomPackageCodeEnum ) ) let breakfastPrice = null if (rateDefinition.breakfastIncluded) { breakfastPrice = intl.formatMessage({ defaultMessage: "Included", }) } else if (breakfast) { breakfastPrice = formatPrice( intl, breakfast.localPrice.totalPrice, breakfast.localPrice.currency ) } const hotelRoom = getBookedHotelRoom(roomCategories, roomTypeCode) return (

{roomName}

{intl.formatMessage( { defaultMessage: "Room {roomIndex}", }, { roomIndex: roomNumber, } )}
{intl.formatMessage({ defaultMessage: "Booking number", })} {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */} {":"} {confirmationNumber}
{intl.formatMessage({ defaultMessage: "View room details", })}
{packages?.some((item) => Object.values(RoomPackageCodeEnum).includes( item.code as RoomPackageCodeEnum ) ) && (
{packages .filter((item) => Object.values(RoomPackageCodeEnum).includes( item.code as RoomPackageCodeEnum ) ) .map((item) => { return ( ) })}
)}
{roomName}

{intl.formatMessage({ defaultMessage: "Guests", })}

{childrenAges.length > 0 ? adultsAndChildrenMsg : adultsOnlyMsg}

{rateDefinition.cancellationText ? (

{intl.formatMessage({ defaultMessage: "Terms", })}

{rateDefinition.cancellationText}

) : null} {hasModifiableRate(rateDefinition.cancellationRule) && (

{intl.formatMessage({ defaultMessage: "Modify By", })}

{intl.formatMessage( { defaultMessage: "Until {time}, {date}", }, { time: "18:00", date: fromDate.format("dddd D MMM"), } )}

)} {breakfastPrice !== null && (

{intl.formatMessage({ defaultMessage: "Breakfast", })}

{breakfastPrice}

)} {hasPackages && (

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

{packages! .filter((item) => Object.values(RoomPackageCodeEnum).includes( item.code as RoomPackageCodeEnum ) ) .map((item) => item.description) .join(", ")}

)}

{intl.formatMessage({ defaultMessage: "Bed preference", })}

{bedType.mainBed.description} {bedType.mainBed.widthRange.min === bedType.mainBed.widthRange.max ? // eslint-disable-next-line formatjs/no-literal-string-in-jsx ` (${mainBedWidthValueMsg})` : // eslint-disable-next-line formatjs/no-literal-string-in-jsx ` (${mainBedWidthRangeMsg})`}

{bookingCode && ( } > {intl.formatMessage( { defaultMessage: "Booking code: {value}", }, { value: bookingCode, strong: (text) => ( {text} ), } )} )}

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

) }