Files
web/packages/booking-flow/lib/components/SelectRate/index.tsx
Bianca Widstam 57d0e1b27b Merged in fix/BOOK-662-handle-overlapping-dates-timezone (pull request #3319)
Fix/BOOK-662 handle overlapping dates timezone

* fix(BOOK-662): handle overlapping dates alerts

* fix(BOOK-662): handle overlapping dates alerts

* fix(BOOK-662): add test same dates


Approved-by: Anton Gunnarsson
2025-12-19 14:03:30 +00:00

96 lines
3.0 KiB
TypeScript

import { cookies } from "next/headers"
import { FamilyAndFriendsCodes } from "@scandic-hotels/common/constants/familyAndFriends"
import { dt } from "@scandic-hotels/common/dt"
import { HotelInfoCard } from "@scandic-hotels/design-system/HotelInfoCard"
import { mapApiImagesToGalleryImages } from "../../misc/imageGallery"
import { filterOverlappingDates } from "../../utils/SelectRate"
import FnFNotAllowedAlert from "../FnFNotAllowedAlert"
import { HotelDetailsSidePeek } from "../HotelDetailsSidePeek"
import { AmenitiesSidePeekLabel } from "./AmenititesSidePeekLabel"
import AvailabilityError from "./AvailabilityError"
import { RoomsContainer } from "./RoomsContainer"
import type { RouterOutput } from "@scandic-hotels/trpc/client"
import type { SelectRateBooking } from "../../types/components/selectRate/selectRate"
export { SelectRateSkeleton } from "./SelectRateSkeleton"
export async function SelectRate({
booking,
hotelData,
}: {
hotelData: NonNullable<RouterOutput["hotel"]["get"]>
booking: SelectRateBooking
}) {
const bookingCode = booking.bookingCode
let isInValidFNF = false
if (bookingCode && FamilyAndFriendsCodes.includes(bookingCode)) {
const cookieStore = await cookies()
isInValidFNF = cookieStore.get("sc")?.value !== "1"
}
const validAlerts = filterOverlappingDates(
hotelData.hotel.specialAlerts.filter((alert) => alert.displayInBookingFlow),
dt.utc(booking.fromDate),
dt.utc(booking.toDate)
)
return (
<>
<HotelInfoCard
hotel={{
id: hotelData.hotel.id,
name: hotelData.hotel.name,
url: hotelData.url,
ratings: hotelData.hotel.ratings,
}}
address={{
streetAddress: hotelData.hotel.address.streetAddress,
city: hotelData.hotel.address.city,
kilometersToCentre: hotelData.hotel.location.distanceToCentre / 1000,
}}
galleryImages={mapApiImagesToGalleryImages(
hotelData.hotel.galleryImages
)}
description={
hotelData.hotel.hotelContent.texts.descriptions?.medium ?? ""
}
alerts={validAlerts.map((alert) => ({
...alert,
heading: alert.heading ?? "",
text: alert.text ?? "",
}))}
facilities={hotelData.hotel.detailedFacilities}
slot={
<HotelDetailsSidePeek
hotel={{
...hotelData.hotel,
url: hotelData.url,
}}
restaurants={hotelData.restaurants}
additionalHotelData={hotelData.additionalData}
triggerLabel={<AmenitiesSidePeekLabel />}
buttonVariant="primary"
/>
}
/>
{isInValidFNF ? (
<FnFNotAllowedAlert />
) : (
<RoomsContainer
hotelType={hotelData.hotel.hotelType}
roomCategories={hotelData.roomCategories}
vat={hotelData.hotel.vat}
/>
)}
<AvailabilityError booking={booking} hotelName={hotelData.hotel.name} />
</>
)
}