diff --git a/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-rate/page.tsx b/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-rate/page.tsx index fd9db4d6c..5682773c3 100644 --- a/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-rate/page.tsx +++ b/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-rate/page.tsx @@ -1,22 +1,16 @@ import { notFound } from "next/navigation" +import { Suspense } from "react" import { dt } from "@/lib/dt" -import { - getHotelData, - getLocations, - getProfileSafely, -} from "@/lib/trpc/memoizedRequests" -import { serverClient } from "@/lib/trpc/server" +import { getHotelData, getLocations } from "@/lib/trpc/memoizedRequests" +import LoadingSpinner from "@/components/Current/LoadingSpinner" import HotelInfoCard from "@/components/HotelReservation/SelectRate/HotelInfoCard" -import Rooms from "@/components/HotelReservation/SelectRate/Rooms" -import { - generateChildrenString, - getHotelReservationQueryParams, -} from "@/components/HotelReservation/SelectRate/RoomSelection/utils" +import { RoomsContainer } from "@/components/HotelReservation/SelectRate/Rooms/RoomsContainer" +import { getHotelReservationQueryParams } from "@/components/HotelReservation/SelectRate/RoomSelection/utils" import { setLang } from "@/i18n/serverContext" +import { safeTry } from "@/utils/safeTry" -import { RoomPackageCodeEnum } from "@/types/components/hotelReservation/selectRate/roomFilter" import type { SelectRateSearchParams } from "@/types/components/hotelReservation/selectRate/selectRate" import type { LangParams, PageArgs } from "@/types/params" @@ -45,71 +39,48 @@ export default async function SelectRatePage({ return notFound() } - const validFromDate = + const fromDate = searchParams.fromDate && dt(searchParams.fromDate).isAfter(dt().subtract(1, "day")) - ? searchParams.fromDate - : dt().utc().format("YYYY-MM-DD") - const validToDate = - searchParams.toDate && dt(searchParams.toDate).isAfter(validFromDate) - ? searchParams.toDate - : dt().utc().add(1, "day").format("YYYY-MM-DD") + ? dt(searchParams.fromDate) + : dt().utc() + const toDate = + searchParams.toDate && dt(searchParams.toDate).isAfter(fromDate) + ? dt(searchParams.toDate) + : dt().utc().add(1, "day") + const adults = selectRoomParamsObject.room[0].adults || 1 // TODO: Handle multiple rooms - const childrenCount = selectRoomParamsObject.room[0].child?.length - const children = selectRoomParamsObject.room[0].child - ? generateChildrenString(selectRoomParamsObject.room[0].child) - : undefined // TODO: Handle multiple rooms + const children = selectRoomParamsObject.room[0].child // TODO: Handle multiple rooms - const [hotelData, roomsAvailability, packages, user] = await Promise.all([ - getHotelData({ hotelId: searchParams.hotel, language: params.lang }), - serverClient().hotel.availability.rooms({ - hotelId: parseInt(searchParams.hotel, 10), - roomStayStartDate: validFromDate, - roomStayEndDate: validToDate, - adults, - children, - }), - serverClient().hotel.packages.get({ - hotelId: searchParams.hotel, - startDate: searchParams.fromDate, - endDate: searchParams.toDate, - adults, - children: childrenCount, - packageCodes: [ - RoomPackageCodeEnum.ACCESSIBILITY_ROOM, - RoomPackageCodeEnum.PET_ROOM, - RoomPackageCodeEnum.ALLERGY_ROOM, - ], - }), - getProfileSafely(), - ]) - - if (!roomsAvailability) { - return "No rooms found" // TODO: Add a proper error message - } - - if (!hotelData) { - return "No hotel data found" // TODO: Add a proper error message - } - - const roomCategories = hotelData?.included - - const noRoomsAvailable = roomsAvailability.roomConfigurations.reduce( - (acc, room) => { - return acc && room.status === "NotAvailable" - }, - true + const [hotelData, hotelDataError] = await safeTry( + getHotelData({ hotelId: searchParams.hotel, language: params.lang }) ) + if (!hotelData && !hotelDataError) { + return notFound() + } + + const hotelId = +searchParams.hotel return ( <> - - + }> + + ) } diff --git a/components/HotelReservation/SelectRate/HotelInfoCard/index.tsx b/components/HotelReservation/SelectRate/HotelInfoCard/index.tsx index 946b82ad2..92eebc27d 100644 --- a/components/HotelReservation/SelectRate/HotelInfoCard/index.tsx +++ b/components/HotelReservation/SelectRate/HotelInfoCard/index.tsx @@ -1,7 +1,8 @@ -"use client" -import { useEffect } from "react" +import { Suspense, useEffect } from "react" import { useIntl } from "react-intl" +import { Lang } from "@/constants/languages" +import { getHotelData } from "@/lib/trpc/memoizedRequests" import useRoomAvailableStore from "@/stores/roomAvailability" import { mapFacilityToIcon } from "@/components/ContentType/HotelPage/data" @@ -11,38 +12,54 @@ import Divider from "@/components/TempDesignSystem/Divider" import Body from "@/components/TempDesignSystem/Text/Body" import Caption from "@/components/TempDesignSystem/Text/Caption" import Title from "@/components/TempDesignSystem/Text/Title" +import { getIntl } from "@/i18n" import ReadMore from "../../ReadMore" import TripAdvisorChip from "../../TripAdvisorChip" +import { NoRoomsAlert } from "./NoRoomsAlert" import styles from "./hotelInfoCard.module.css" -import type { HotelInfoCardProps } from "@/types/components/hotelReservation/selectRate/hotelInfoCardProps" -import { AlertTypeEnum } from "@/types/enums/alert" +import { Child } from "@/types/components/hotelReservation/selectRate/selectRate" + +type Props = { + hotelId: number + lang: Lang + fromDate: Date + toDate: Date + adultCount: number + childArray: Child[] +} + +export default async function HotelInfoCard({ + hotelId, + lang, + ...props +}: Props) { + const hotelData = await getHotelData({ + hotelId: hotelId.toString(), + language: lang, + }) -export default function HotelInfoCard({ - hotelData, - noAvailability = false, -}: HotelInfoCardProps) { const hotelAttributes = hotelData?.data.attributes - const intl = useIntl() + const intl = await getIntl() - const noRoomsAvailable = useRoomAvailableStore( - (state) => state.noRoomsAvailable - ) - const setNoRoomsAvailable = useRoomAvailableStore( - (state) => state.setNoRoomsAvailable - ) + // const noRoomsAvailable = useRoomAvailableStore( + // (state) => state.noRoomsAvailable + // ) + // const setNoRoomsAvailable = useRoomAvailableStore( + // (state) => state.setNoRoomsAvailable + // ) const sortedFacilities = hotelAttributes?.detailedFacilities .sort((a, b) => b.sortOrder - a.sortOrder) .slice(0, 5) - useEffect(() => { - if (noAvailability) { - setNoRoomsAvailable() - } - }, [noAvailability, setNoRoomsAvailable]) + // useEffect(() => { + // if (noAvailability) { + // setNoRoomsAvailable() + // } + // }, [noAvailability, setNoRoomsAvailable]) return (
@@ -117,16 +134,10 @@ export default function HotelInfoCard({ ) })} - {noRoomsAvailable ? ( -
- -
- ) : null} + + + +
) }