fix(i18n): validated English messages Approved-by: Bianca Widstam Approved-by: Christian Andolf
141 lines
4.6 KiB
TypeScript
141 lines
4.6 KiB
TypeScript
import { useIntl } from "react-intl"
|
||
|
||
import ImageGallery from "@/components/ImageGallery"
|
||
import SidePeek from "@/components/TempDesignSystem/SidePeek"
|
||
import Body from "@/components/TempDesignSystem/Text/Body"
|
||
import Caption from "@/components/TempDesignSystem/Text/Caption"
|
||
import Subtitle from "@/components/TempDesignSystem/Text/Subtitle"
|
||
import { mapApiImagesToGalleryImages } from "@/utils/imageGallery"
|
||
|
||
import { getBedIcon } from "./bedIcon"
|
||
import { getFacilityIcon } from "./facilityIcon"
|
||
|
||
import styles from "./roomSidePeek.module.css"
|
||
|
||
import { SidePeekEnum } from "@/types/components/hotelReservation/sidePeek"
|
||
import type { RoomSidePeekProps } from "@/types/components/sidePeeks/roomSidePeek"
|
||
|
||
export default function RoomSidePeek({
|
||
room,
|
||
activeSidePeek,
|
||
close,
|
||
}: RoomSidePeekProps) {
|
||
const intl = useIntl()
|
||
|
||
const roomSize = room.roomSize
|
||
const totalOccupancy = room.totalOccupancy
|
||
const roomDescription = room.descriptions.medium
|
||
const galleryImages = mapApiImagesToGalleryImages(room.images)
|
||
|
||
return (
|
||
<SidePeek
|
||
title={room.name}
|
||
isOpen={activeSidePeek === SidePeekEnum.roomDetails}
|
||
handleClose={close}
|
||
>
|
||
<div className={styles.wrapper}>
|
||
<div className={styles.mainContent}>
|
||
{totalOccupancy && (
|
||
<Caption color="uiTextMediumContrast" className={styles.guests}>
|
||
{intl.formatMessage(
|
||
{
|
||
id: "Max. {max, plural, one {{range} guest} other {{range} guests}}",
|
||
},
|
||
{
|
||
max: totalOccupancy.max,
|
||
range: totalOccupancy.range,
|
||
}
|
||
)}
|
||
</Caption>
|
||
)}
|
||
{roomSize && (
|
||
<Caption color="uiTextMediumContrast">
|
||
{roomSize.min === roomSize.max
|
||
? intl.formatMessage(
|
||
{ id: "{roomSize} m²" },
|
||
{
|
||
roomSize: roomSize.min,
|
||
}
|
||
)
|
||
: intl.formatMessage(
|
||
{
|
||
id: "{roomSizeMin}–{roomSizeMax} m²",
|
||
},
|
||
{
|
||
roomSizeMin: roomSize.min,
|
||
roomSizeMax: roomSize.max,
|
||
}
|
||
)}
|
||
</Caption>
|
||
)}
|
||
<div className={styles.imageContainer}>
|
||
<ImageGallery
|
||
images={galleryImages}
|
||
title={room.name}
|
||
height={280}
|
||
/>
|
||
</div>
|
||
<Body color="uiTextHighContrast">{roomDescription}</Body>
|
||
</div>
|
||
<div className={styles.listContainer}>
|
||
<Subtitle type="two" color="uiTextHighContrast">
|
||
{intl.formatMessage({ id: "Room amenities" })}
|
||
</Subtitle>
|
||
<ul className={styles.facilityList}>
|
||
{room.roomFacilities
|
||
.sort((a, b) => a.sortOrder - b.sortOrder)
|
||
.map((facility) => {
|
||
const Icon = getFacilityIcon(facility.icon)
|
||
return (
|
||
<li key={facility.name}>
|
||
{Icon && (
|
||
<Icon
|
||
width={24}
|
||
height={24}
|
||
color="uiTextMediumContrast"
|
||
/>
|
||
)}
|
||
<Body
|
||
asChild
|
||
className={!Icon ? styles.noIcon : undefined}
|
||
color="uiTextMediumContrast"
|
||
>
|
||
<span>{facility.name}</span>
|
||
</Body>
|
||
</li>
|
||
)
|
||
})}
|
||
</ul>
|
||
</div>
|
||
<div className={styles.listContainer}>
|
||
<Subtitle type="two" color="uiTextHighContrast">
|
||
{intl.formatMessage({ id: "Bed options" })}
|
||
</Subtitle>
|
||
<Body color="grey">
|
||
{intl.formatMessage({ id: "Based on availability" })}
|
||
</Body>
|
||
<ul className={styles.bedOptions}>
|
||
{room.roomTypes.map((roomType) => {
|
||
const BedIcon = getBedIcon(roomType.mainBed.type)
|
||
return (
|
||
<li key={roomType.code}>
|
||
{BedIcon && (
|
||
<BedIcon
|
||
color="uiTextMediumContrast"
|
||
width={24}
|
||
height={24}
|
||
/>
|
||
)}
|
||
<Body color="uiTextMediumContrast" asChild>
|
||
<span>{roomType.mainBed.description}</span>
|
||
</Body>
|
||
</li>
|
||
)
|
||
})}
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</SidePeek>
|
||
)
|
||
}
|