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
96 lines
3.0 KiB
TypeScript
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} />
|
|
</>
|
|
)
|
|
}
|