Files
web/packages/booking-flow/lib/pages/SelectRatePage.tsx
Bianca Widstam 30b214c6ff Merged in feat/BOOK-131-tracking-no-availability (pull request #2886)
feat(BOOK-131): add no availability tracking

* feat(BOOK-131): add no availability tracking

* feat(BOOK-131): add no availability tracking

* feat(BOOK-131): extract noAvailability function

* feat(BOOK-131): fix every render problem

* feat(BOOK-131): noavailability handle return in function


Approved-by: Erik Tiekstra
Approved-by: Joakim Jäderberg
2025-10-07 06:59:49 +00:00

86 lines
2.4 KiB
TypeScript

import { notFound } from "next/navigation"
import { logger } from "@scandic-hotels/common/logger"
import { SEARCH_TYPE_REDEMPTION } from "@scandic-hotels/trpc/constants/booking"
import { SelectRate } from "../components/SelectRate"
import { SelectRateTracking } from "../components/SelectRate/Tracking/SelectRateTracking"
import { SelectRateProvider } from "../contexts/SelectRate/SelectRateContext"
import { getHotel } from "../trpc/memoizedRequests"
import { parseSelectRateSearchParams } from "../utils/url"
import type { Lang } from "@scandic-hotels/common/constants/language"
import type { NextSearchParams } from "../types"
export { SelectRateSkeleton as SelectRatePageSkeleton } from "../components/SelectRate"
const rateTypeRegex = {
ARB: /(^B[a-z]{3}\d{6}$)/,
VOUCHER: /(^VO[0-9a-z]*$)/,
}
const singleRoomRateTypes = combineRegExps(
[rateTypeRegex.ARB, rateTypeRegex.VOUCHER],
"i"
)
export async function SelectRatePage({
lang,
searchParams,
}: {
lang: Lang
searchParams: NextSearchParams
}) {
const booking = parseSelectRateSearchParams(searchParams)
if (!booking) {
logger.debug("Invalid search params", searchParams)
notFound()
}
const isMultiRoom = booking.rooms.length > 1
const isRedemption = booking.searchType === SEARCH_TYPE_REDEMPTION
const isArbOrVoucher = booking.bookingCode
? singleRoomRateTypes.test(booking.bookingCode)
: false
if ((isMultiRoom && isRedemption) || (isMultiRoom && isArbOrVoucher)) {
logger.debug(
"Invalid search params, can't have multiroom and redemption/voucher",
{ isMultiRoom, isRedemption, isArbOrVoucher }
)
notFound()
}
// If someone tries to update the url with
// a bookingCode also, then we need to remove it
if (isRedemption && searchParams.bookingCode) {
delete searchParams.bookingCode
}
const hotelData = await getHotel({
hotelId: booking.hotelId,
isCardOnlyPayment: false,
language: lang,
})
if (!hotelData) {
logger.debug("Unable to find hotel data")
notFound()
}
return (
<>
<SelectRateProvider hotelData={hotelData}>
<SelectRate hotelData={hotelData} booking={booking} />
<SelectRateTracking hotelData={hotelData} booking={booking} />
</SelectRateProvider>
</>
)
}
function combineRegExps(regexps: RegExp[], flags = "") {
return new RegExp(regexps.map((r) => r.source).join("|"), flags)
}