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 GuestDetails from "@/components/HotelReservation/MyStay/GuestDetails" import Price from "@/components/HotelReservation/MyStay/Price" import { hasModifiableRate } from "@/components/HotelReservation/MyStay/utils" import { hasBreakfastPackageFromBookingFlow } from "@/components/HotelReservation/MyStay/utils/hasBreakfastPackage" import ImageGallery from "@/components/ImageGallery" import Accordion from "@/components/TempDesignSystem/Accordion" import AccordionItem from "@/components/TempDesignSystem/Accordion/AccordionItem" import IconChip from "@/components/TempDesignSystem/IconChip" import SidePeek from "@/components/TempDesignSystem/SidePeek" import useLang from "@/hooks/useLang" import { mapApiImagesToGalleryImages } from "@/utils/imageGallery" import RoomDetails from "./RoomDetails" import styles from "./bookedRoomSidePeek.module.css" import { RoomPackageCodeEnum } from "@/types/components/hotelReservation/selectRate/roomFilter" import { SidePeekEnum } from "@/types/components/hotelReservation/sidePeek" import type { BookedRoomSidePeekProps } from "@/types/components/sidePeeks/bookedRoomSidePeek" export default function BookedRoomSidePeek({ room, activeSidePeek, user, confirmationNumber, close, }: BookedRoomSidePeekProps) { const intl = useIntl() const lang = useLang() const bookedRoom = useMyStayRoomDetailsStore((state) => state.bookedRoom) const linkedReservationRooms = useMyStayRoomDetailsStore( (state) => state.linkedReservationRooms ) const updateBookedRoom = useMyStayRoomDetailsStore( (state) => state.actions.updateBookedRoom ) const updateLinkedReservationRoom = useMyStayRoomDetailsStore( (state) => state.actions.updateLinkedReservationRoom ) const allRooms = [bookedRoom, ...linkedReservationRooms] const matchingRoomBooking = allRooms.find( (r) => r.confirmationNumber === confirmationNumber ) if (!matchingRoomBooking) { return null } const { roomNumber, cancellationNumber, adults, childrenInRoom, terms, packages, bedType, checkInDate, bookingCode, roomPrice, isCancelled, } = matchingRoomBooking const fromDate = dt(checkInDate).locale(lang) const roomDescription = room.descriptions.medium const galleryImages = mapApiImagesToGalleryImages(room.images) const adultsMsg = intl.formatMessage( { defaultMessage: "{adults, plural, one {# adult} other {# adults}}", }, { adults: adults, } ) const childrenMsg = intl.formatMessage( { defaultMessage: "{children, plural, one {# child} other {# children}}", }, { children: childrenInRoom.length, } ) const adultsOnlyMsg = adultsMsg const adultsAndChildrenMsg = [adultsMsg, childrenMsg].join(", ") return (
{isCancelled ? ( } > {intl.formatMessage({ defaultMessage: "Cancelled", })} ) : (
{intl.formatMessage( { defaultMessage: "Room {roomIndex}", }, { roomIndex: roomNumber } )}
)}
{isCancelled ? ( {intl.formatMessage({ defaultMessage: "Cancellation no", })} {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */} {":"} ) : ( {intl.formatMessage({ defaultMessage: "Reference", })} {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */} {":"} )} {isCancelled ? ( {cancellationNumber} ) : ( {confirmationNumber} )}

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

{childrenInRoom.length > 0 ? adultsAndChildrenMsg : adultsOnlyMsg}

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

{terms}

{hasModifiableRate( matchingRoomBooking.rateDefinition.cancellationRule ) && (

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

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

)}

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

{packages && hasBreakfastPackageFromBookingFlow( packages.map((pkg) => ({ code: pkg.code, })) ) ? intl.formatMessage({ defaultMessage: "Included", }) : intl.formatMessage({ defaultMessage: "Not included", })}

{packages?.some((item) => Object.values(RoomPackageCodeEnum).includes( item.code as RoomPackageCodeEnum ) ) && (

{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?.description}

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

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