"use client" import { notFound, useSearchParams } from "next/navigation" import { useIntl } from "react-intl" import { trpc } from "@/lib/trpc/client" import { selectRateRoomsAvailabilityInputSchema } from "@/server/routers/hotels/input" import Alert from "@/components/TempDesignSystem/Alert" import useLang from "@/hooks/useLang" import RatesProvider from "@/providers/RatesProvider" import { parseSelectRateSearchParams, searchParamsToRecord } from "@/utils/url" import RateSummary from "./RateSummary" import Rooms from "./Rooms" import { RoomsContainerSkeleton } from "./RoomsContainerSkeleton" import styles from "./index.module.css" import type { RoomsContainerProps } from "@/types/components/hotelReservation/selectRate/roomsContainer" import { AlertTypeEnum } from "@/types/enums/alert" export function RoomsContainer({ hotelType, roomCategories, vat, }: RoomsContainerProps) { const lang = useLang() const intl = useIntl() const searchParams = useSearchParams() const booking = parseSelectRateSearchParams( searchParamsToRecord(searchParams) ) if (!booking) return notFound() const bookingInput = selectRateRoomsAvailabilityInputSchema.safeParse({ booking, lang, }) const { data, isFetching, isError, error } = trpc.hotel.availability.selectRate.rooms.useQuery(bookingInput.data!, { retry(failureCount, error) { if (error.data?.code === "BAD_REQUEST") { return false } return failureCount <= 3 }, enabled: bookingInput.success, }) if (isFetching) { return } if (isError || !bookingInput.success) { const errorMessage = getErrorMessage( error?.data?.zodError?.formErrors, intl ) return (
) } return ( ) } function getErrorMessage( formErrors: string[] | undefined, intl: ReturnType ) { const firstError = formErrors?.at(0) switch (firstError) { case "FROMDATE_INVALID": case "TODATE_INVALID": case "TODATE_MUST_BE_AFTER_FROMDATE": case "FROMDATE_CANNOT_BE_IN_THE_PAST": { return intl.formatMessage({ defaultMessage: "Invalid dates", }) } default: return intl.formatMessage({ defaultMessage: "Something went wrong", }) } }