diff --git a/apps/scandic-web/components/HotelReservation/SelectHotel/NoAvailabilityAlert.tsx b/apps/scandic-web/components/HotelReservation/SelectHotel/NoAvailabilityAlert.tsx index f1ff11e7f..d0a436f21 100644 --- a/apps/scandic-web/components/HotelReservation/SelectHotel/NoAvailabilityAlert.tsx +++ b/apps/scandic-web/components/HotelReservation/SelectHotel/NoAvailabilityAlert.tsx @@ -18,7 +18,7 @@ export default async function NoAvailabilityAlert({ const intl = await getIntl() const lang = await getLang() - if (bookingCode && isBookingCodeRateNotAvailable) { + if (bookingCode && isBookingCodeRateNotAvailable && hotelsLength > 0) { const bookingCodeText = intl.formatMessage( { defaultMessage: diff --git a/apps/scandic-web/components/HotelReservation/SelectHotel/helpers.ts b/apps/scandic-web/components/HotelReservation/SelectHotel/helpers.ts index d418738d3..138af84d2 100644 --- a/apps/scandic-web/components/HotelReservation/SelectHotel/helpers.ts +++ b/apps/scandic-web/components/HotelReservation/SelectHotel/helpers.ts @@ -1,3 +1,4 @@ +import { dt } from "@scandic-hotels/common/dt" import { AvailabilityEnum } from "@scandic-hotels/trpc/enums/selectHotel" import { generateChildrenString } from "@scandic-hotels/trpc/routers/hotels/helpers" @@ -182,6 +183,14 @@ export async function getHotels({ redemption, }: GetHotelsInput) { let availableHotelsResponse: SettledResult = [] + + // Return empty array (forced No availability) when search dates are invalid + if ( + dt(fromDate).isBefore(dt(), "day") || + dt(toDate).isSameOrBefore(fromDate, "day") + ) { + return [] + } if (isAlternativeFor) { availableHotelsResponse = await Promise.allSettled( rooms.map(async (room) => { diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/index.tsx b/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/index.tsx index cea02e683..1acf7e87e 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/index.tsx +++ b/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/index.tsx @@ -14,8 +14,6 @@ import { RoomsContainerSkeleton } from "./RoomsContainerSkeleton" import styles from "./index.module.css" -import type { AppRouter } from "@scandic-hotels/trpc/routers/appRouter" - import type { RoomsContainerProps } from "@/types/components/hotelReservation/selectRate/roomsContainer" export function RoomsContainer({}: RoomsContainerProps) { @@ -23,7 +21,7 @@ export function RoomsContainer({}: RoomsContainerProps) { const { availability: { error, isFetching, isError }, - input: { hasError: hasInputError }, + input: { hasError: hasInputError, errorCode }, } = useSelectRateContext() if (isFetching) { @@ -31,7 +29,7 @@ export function RoomsContainer({}: RoomsContainerProps) { } if (isError || hasInputError) { - const errorMessage = getErrorMessage(error, intl) + const errorMessage = getErrorMessage(error ?? errorCode, intl) return (
@@ -49,15 +47,14 @@ export function RoomsContainer({}: RoomsContainerProps) { } function getErrorMessage(error: unknown, intl: ReturnType) { - if (!isTRPCClientError(error)) { - return intl.formatMessage({ - defaultMessage: "Something went wrong", - }) + let errorCode = "" + if (error instanceof TRPCClientError) { + errorCode = error.data?.zodError?.formErrors?.at(0) + } else if (typeof error == "string") { + errorCode = error } - const firstError = error.data?.zodError?.formErrors?.at(0) - - switch (firstError) { + switch (errorCode) { case "FROMDATE_INVALID": case "TODATE_INVALID": case "TODATE_MUST_BE_AFTER_FROMDATE": @@ -72,9 +69,3 @@ function getErrorMessage(error: unknown, intl: ReturnType) { }) } } - -function isTRPCClientError( - cause: unknown -): cause is TRPCClientError { - return cause instanceof TRPCClientError -} diff --git a/apps/scandic-web/contexts/SelectRate/SelectRateContext.tsx b/apps/scandic-web/contexts/SelectRate/SelectRateContext.tsx index b85ca9ea0..f97ea78e1 100644 --- a/apps/scandic-web/contexts/SelectRate/SelectRateContext.tsx +++ b/apps/scandic-web/contexts/SelectRate/SelectRateContext.tsx @@ -85,10 +85,7 @@ export function SelectRateProvider({ lang, }) - const hotelId = selectRateInput.data?.booking.hotelId - if (hotelId !== hotelData.hotel.id) { - throw new Error("Mismatched hotel ID in SelectRateProvider") - } + const hotelId = selectRateInput.data?.booking.hotelId ?? hotelData.hotel.id const hotelQuery = trpc.hotel.get.useQuery( { hotelId: hotelId!, language: lang, isCardOnlyPayment: false }, @@ -394,6 +391,7 @@ export function SelectRateProvider({ selectRateInput.data?.booking.fromDate, selectRateInput.data?.booking.toDate ), + errorCode: selectRateInput.error?.errors[0].message, bookingCode: selectRateInput.data?.booking.bookingCode, roomCount: roomCount, isMultiRoom: roomCount > 1, diff --git a/apps/scandic-web/contexts/SelectRate/types.ts b/apps/scandic-web/contexts/SelectRate/types.ts index e1d8ba2b2..10a01fb0d 100644 --- a/apps/scandic-web/contexts/SelectRate/types.ts +++ b/apps/scandic-web/contexts/SelectRate/types.ts @@ -15,6 +15,7 @@ export type SelectRateContext = { > input: { data: RoomsAvailabilityOutputSchema | undefined + errorCode?: string hasError: boolean nights: number isMultiRoom: boolean