diff --git a/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-rate/page.tsx b/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-rate/page.tsx
index 603bbbf4a..48a0b30b1 100644
--- a/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-rate/page.tsx
+++ b/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-rate/page.tsx
@@ -58,6 +58,8 @@ export default async function SelectRatePage({
return "No hotel data found" // TODO: Add a proper error message
}
+ console.log(selectRoomParamsObject)
+
const roomCategories = hotelData?.included
return (
diff --git a/components/BookingWidget/MobileToggleButton/index.tsx b/components/BookingWidget/MobileToggleButton/index.tsx
index 3bc438c41..a58bdd1b2 100644
--- a/components/BookingWidget/MobileToggleButton/index.tsx
+++ b/components/BookingWidget/MobileToggleButton/index.tsx
@@ -68,7 +68,14 @@ export default function MobileToggleButton({
{`${selectedFromDate} - ${selectedToDate} (${intl.formatMessage(
{ id: "booking.nights" },
{ totalNights: nights }
- )}) ${intl.formatMessage({ id: "booking.adults" }, { totalAdults })}, ${intl.formatMessage({ id: "booking.children" }, { totalChildren })}, ${intl.formatMessage({ id: "booking.rooms" }, { totalRooms })}`}
+ )}) ${intl.formatMessage({ id: "booking.adults" }, { totalAdults })}, ${
+ totalChildren > 0
+ ? intl.formatMessage(
+ { id: "booking.children" },
+ { totalChildren }
+ ) + ", "
+ : ""
+ }${intl.formatMessage({ id: "booking.rooms" }, { totalRooms })}`}
diff --git a/components/HotelReservation/SelectRate/RoomFilter/index.tsx b/components/HotelReservation/SelectRate/RoomFilter/index.tsx
index 836dd5b49..19fd4d8b7 100644
--- a/components/HotelReservation/SelectRate/RoomFilter/index.tsx
+++ b/components/HotelReservation/SelectRate/RoomFilter/index.tsx
@@ -9,6 +9,7 @@ import { z } from "zod"
import { InfoCircleIcon } from "@/components/Icons"
import CheckboxChip from "@/components/TempDesignSystem/Form/FilterChip/Checkbox"
import Body from "@/components/TempDesignSystem/Text/Body"
+import Caption from "@/components/TempDesignSystem/Text/Caption"
import { Tooltip } from "@/components/TempDesignSystem/Tooltip"
import { getIconForFeatureCode } from "../utils"
@@ -49,6 +50,12 @@ export default function RoomFilter({
const petFriendly = watch(RoomPackageCodeEnum.PETR)
const allergyFriendly = watch(RoomPackageCodeEnum.ALLG)
+ const selectedFilters = useMemo(() => getValues(), [getValues])
+
+ const tooltipText = intl.formatMessage({
+ id: "Pet-friendly rooms have an additional fee of 20 EUR per stay",
+ })
+
const submitFilter = useCallback(() => {
const data = getValues()
onFilter(data)
@@ -61,9 +68,33 @@ export default function RoomFilter({
return (
-
- {intl.formatMessage({ id: "Room types available" }, { numberOfRooms })}
-
+
+
+ {intl.formatMessage(
+ { id: "Room types available" },
+ { numberOfRooms }
+ )}
+
+
+
+
+
+ {intl.formatMessage({ id: "Filter" })}
+
+
+ {Object.entries(selectedFilters)
+ .filter(([_, value]) => value)
+ .map(([key]) => intl.formatMessage({ id: key }))
+ .join(", ")}
+
+
+
+ {intl.formatMessage(
+ { id: "Room types available" },
+ { numberOfRooms }
+ )}
+
+
) : (
@@ -64,6 +67,9 @@ export default function PriceList({
{memberLocalPrice.currency}
+
+ /{intl.formatMessage({ id: "night" })}
+
) : (
diff --git a/components/HotelReservation/SelectRate/RoomSelection/FlexibilityOption/PriceList/priceList.module.css b/components/HotelReservation/SelectRate/RoomSelection/FlexibilityOption/PriceList/priceList.module.css
index 7320cf1be..4f3431525 100644
--- a/components/HotelReservation/SelectRate/RoomSelection/FlexibilityOption/PriceList/priceList.module.css
+++ b/components/HotelReservation/SelectRate/RoomSelection/FlexibilityOption/PriceList/priceList.module.css
@@ -12,3 +12,8 @@
display: flex;
gap: var(--Spacing-x-half);
}
+
+.perNight {
+ font-weight: 400;
+ font-size: var(--typography-Caption-Regular-fontSize);
+}
diff --git a/components/HotelReservation/SelectRate/RoomSelection/RateSummary/index.tsx b/components/HotelReservation/SelectRate/RoomSelection/RateSummary/index.tsx
index 98915efa6..3b9f6dbf6 100644
--- a/components/HotelReservation/SelectRate/RoomSelection/RateSummary/index.tsx
+++ b/components/HotelReservation/SelectRate/RoomSelection/RateSummary/index.tsx
@@ -2,6 +2,8 @@ import { useIntl } from "react-intl"
import Button from "@/components/TempDesignSystem/Button"
import Body from "@/components/TempDesignSystem/Text/Body"
+import Caption from "@/components/TempDesignSystem/Text/Caption"
+import Footnote from "@/components/TempDesignSystem/Text/Footnote"
import Subtitle from "@/components/TempDesignSystem/Text/Subtitle"
import styles from "./rateSummary.module.css"
@@ -13,12 +15,19 @@ export default function RateSummary({
rateSummary,
isUserLoggedIn,
packages,
+ roomsAvailability,
}: RateSummaryProps) {
const intl = useIntl()
+ const {
+ member,
+ public: publicRate,
+ features,
+ roomType,
+ priceName,
+ } = rateSummary
+ const priceToShow = isUserLoggedIn ? member : publicRate
- const priceToShow = isUserLoggedIn ? rateSummary.member : rateSummary.public
-
- const isPetRoomSelect = rateSummary.features.some(
+ const isPetRoomSelect = features.some(
(feature) => feature.code === RoomPackageCodeEnum.PETR
)
@@ -26,17 +35,23 @@ export default function RateSummary({
(pkg) => pkg.code === RoomPackageCodeEnum.PETR
)
- const petRoomPrice = petRoomPackage ? petRoomPackage.calculatedPrice : null
- const petRoomCurrency = petRoomPackage ? petRoomPackage.currency : null
+ const petRoomPrice = petRoomPackage?.calculatedPrice ?? null
+ const petRoomCurrency = petRoomPackage?.currency ?? null
+
+ const checkInDate = new Date(roomsAvailability.checkInDate)
+ const checkOutDate = new Date(roomsAvailability.checkOutDate)
+ const nights = Math.ceil(
+ (checkOutDate.getTime() - checkInDate.getTime()) / (1000 * 60 * 60 * 24)
+ )
return (
- {rateSummary.roomType}
- {rateSummary.priceName}
+ {roomType}
+ {priceName}
-
+
{priceToShow?.localPrice.pricePerStay}{" "}
{priceToShow?.localPrice.currency}
@@ -47,6 +62,38 @@ export default function RateSummary({
{priceToShow?.requestedPrice?.currency}