Merged in fix/allow-single-rateCode (pull request #1438)

fix: allow rates that only have either of member or public to be selectable

* fix: allow rates that only have either of member or public to be selectable


Approved-by: Michael Zetterberg
This commit is contained in:
Simon.Emanuelsson
2025-03-03 08:28:55 +00:00
committed by Linus Flood
parent 3f01266a75
commit c3e3fa62ec
30 changed files with 487 additions and 573 deletions

View File

@@ -3,7 +3,6 @@ import { useIntl } from "react-intl"
import { useRatesStore } from "@/stores/select-rate"
import { getRates } from "@/components/HotelReservation/SelectRate/utils"
import { EditIcon } from "@/components/Icons"
import Image from "@/components/Image"
import Button from "@/components/TempDesignSystem/Button"
@@ -15,9 +14,11 @@ import { useRoomContext } from "@/contexts/SelectRate/Room"
import styles from "./selectedRoomPanel.module.css"
import type { Rate } from "@/types/components/hotelReservation/selectRate/selectRate"
export default function SelectedRoomPanel() {
const intl = useIntl()
const { isUserLoggedIn, rateDefinitions, roomCategories } = useRatesStore(
const { isUserLoggedIn, roomCategories } = useRatesStore(
(state) => ({
isUserLoggedIn: state.isUserLoggedIn,
rateDefinitions: state.roomsAvailability?.rateDefinitions,
@@ -37,23 +38,13 @@ export default function SelectedRoomPanel() {
)
)?.images
if (!rateDefinitions) {
return null
}
const rates = getRates(rateDefinitions)
const freeCancelation = intl.formatMessage({ id: "Free cancellation" })
const nonRefundable = intl.formatMessage({ id: "Non-refundable" })
const freeBooking = intl.formatMessage({ id: "Free rebooking" })
const payLater = intl.formatMessage({ id: "Pay later" })
const payNow = intl.formatMessage({ id: "Pay now" })
function getRateDetails(rateCode: string) {
const rate = Object.keys(rates).find((k) =>
rates[k as keyof typeof rates].find((a) => a.rateCode === rateCode)
)
function getRateTitle(rate: Rate["rate"]) {
switch (rate) {
case "change":
return `${freeBooking}, ${payNow}`
@@ -65,10 +56,14 @@ export default function SelectedRoomPanel() {
}
}
const rate =
isUserLoggedIn && isMainRoom && selectedRate?.product.productType.member
? selectedRate?.product.productType.member
: selectedRate?.product.productType.public
if (!selectedRate) {
return null
}
const selectedProduct =
isUserLoggedIn && isMainRoom && selectedRate.product?.member
? selectedRate.product?.member
: selectedRate.product?.public
return (
<div className={styles.selectedRoomPanel}>
@@ -80,20 +75,21 @@ export default function SelectedRoomPanel() {
)}
</Caption>
<Subtitle className={styles.subtitle} color="uiTextHighContrast">
{selectedRate?.roomType}
{selectedRate.roomType}
</Subtitle>
<Body color="uiTextMediumContrast">
{rate?.rateCode ? getRateDetails(rate.rateCode) : null}
{getRateTitle(selectedRate.product.rate)}
</Body>
<Body color="uiTextHighContrast">
{rate?.localPrice.pricePerNight} {rate?.localPrice.currency}/
{selectedProduct?.localPrice.pricePerNight}{" "}
{selectedProduct?.localPrice.currency}/
{intl.formatMessage({ id: "night" })}
</Body>
</div>
<div className={styles.imageContainer}>
{images?.[0]?.imageSizes?.tiny ? (
<Image
alt={selectedRate?.roomType ?? images[0].metaData?.altText ?? ""}
alt={selectedRate.roomType ?? images[0].metaData?.altText ?? ""}
className={styles.img}
height={300}
src={images[0].imageSizes.tiny}