"use client" 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 { useMyStayRoomDetailsStore } from "@/stores/my-stay/myStayRoomDetailsStore" import { IconForFeatureCode } from "@/components/HotelReservation/utils" import Image from "@/components/Image" import SkeletonShimmer from "@/components/SkeletonShimmer" import IconChip from "@/components/TempDesignSystem/IconChip" import useLang from "@/hooks/useLang" import { formatPrice } from "@/utils/numberFormatting" import GuestDetails from "../GuestDetails" import Points from "../Points" import Price from "../Price" import PriceDetails from "../PriceDetails" import ToggleSidePeek from "./ToggleSidePeek" import styles from "./room.module.css" import { RoomPackageCodeEnum } from "@/types/components/hotelReservation/selectRate/roomFilter" import type { Hotel, Room } from "@/types/hotel" import type { User } from "@/types/user" interface RoomProps { bedType: Room["roomTypes"][number] image: Room["images"][number] hotel: Hotel user: User | null } export function SingleRoom({ bedType, image, hotel, user }: RoomProps) { const intl = useIntl() const lang = useLang() const bookedRoom = useMyStayRoomDetailsStore((state) => state.bookedRoom) const updateBookedRoom = useMyStayRoomDetailsStore( (state) => state.actions.updateBookedRoom ) if (!bookedRoom.roomNumber) { return (
) } const fromDate = dt(bookedRoom.checkInDate).locale(lang) const { adults, childrenAges, confirmationNumber, bookingCode, roomPrice, roomPoints, breakfast, packages, rateDefinition, isCancelled, priceType, vouchers, } = bookedRoom const mainBedWidthValueMsg = intl.formatMessage( { id: "{value} cm" }, { value: bedType.mainBed.widthRange.min, } ) const mainBedWidthRangeMsg = intl.formatMessage( { id: "{min}–{max} cm", }, { min: bedType.mainBed.widthRange.min, max: bedType.mainBed.widthRange.max, } ) const adultsMsg = intl.formatMessage( { id: "{adults, plural, one {# adult} other {# adults}}" }, { adults, } ) const childrenMsg = intl.formatMessage( { id: "{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 ) ) const breakfastText = rateDefinition.breakfastIncluded ? intl.formatMessage({ id: "Included" }) : breakfast ? formatPrice( intl, breakfast.localPrice.totalPrice, breakfast.localPrice.currency ) : null return (

{bookedRoom.roomName}

{intl.formatMessage( { id: "Room {roomIndex}" }, { roomIndex: bookedRoom.roomNumber, } )}
{intl.formatMessage({ id: "Reference" })}: {confirmationNumber}
{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 ( ) })}
)}
{bookedRoom.roomName}

{intl.formatMessage({ id: "Guests" })}

{childrenAges.length > 0 ? adultsAndChildrenMsg : adultsOnlyMsg}

{intl.formatMessage({ id: "Terms" })}

{rateDefinition.cancellationText}

{intl.formatMessage({ id: "Modify By" })}

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

{breakfastText !== null && (

{intl.formatMessage({ id: "Breakfast" })}

{breakfastText}

)} {hasPackages && (

{intl.formatMessage({ id: "Room classification" })}

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

)}

{intl.formatMessage({ id: "Bed preference" })}

{bedType.mainBed.description} {bedType.mainBed.widthRange.min === bedType.mainBed.widthRange.max ? ` (${mainBedWidthValueMsg})` : ` (${mainBedWidthRangeMsg})`}

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

{intl.formatMessage({ id: "Room total" })}

{priceType === "points" ? ( ) : priceType === "voucher" ? (

{intl.formatMessage( { id: "{count} voucher" }, { count: vouchers } )}

) : ( )}
) }