import { differenceInCalendarDays, format, isWeekend } from "date-fns" import { Suspense } from "react" import { selectHotel, selectHotelMap, } from "@/constants/routes/hotelReservation" import { fetchAvailableHotels, getFiltersFromHotels, } from "@/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-hotel/utils" import { ChevronRightIcon } from "@/components/Icons" import StaticMap from "@/components/Maps/StaticMap" import Alert from "@/components/TempDesignSystem/Alert" import Breadcrumbs from "@/components/TempDesignSystem/Breadcrumbs" import Button from "@/components/TempDesignSystem/Button" import Link from "@/components/TempDesignSystem/Link" import Subtitle from "@/components/TempDesignSystem/Text/Subtitle" import TrackingSDK from "@/components/TrackingSDK" import { getIntl } from "@/i18n" import { safeTry } from "@/utils/safeTry" import HotelCardListing from "../HotelCardListing" import HotelCount from "./HotelCount" import HotelFilter from "./HotelFilter" import HotelSorter from "./HotelSorter" import MobileMapButtonContainer from "./MobileMapButtonContainer" import styles from "./selectHotel.module.css" import { ChildBedMapEnum } from "@/types/components/bookingWidget/enums" import type { HotelData } from "@/types/components/hotelReservation/selectHotel/hotelCardListingProps" import type { SelectHotelProps } from "@/types/components/hotelReservation/selectHotel/selectHotel" import { TrackingChannelEnum, type TrackingSDKHotelInfo, type TrackingSDKPageData, } from "@/types/components/tracking" import { AlertTypeEnum } from "@/types/enums/alert" export default async function SelectHotel({ city, params, reservationParams, }: SelectHotelProps) { const { selectHotelParams, searchParams, adultsInRoom, childrenInRoom, childrenInRoomArray, } = reservationParams const intl = await getIntl() const hotelsPromise = safeTry( fetchAvailableHotels({ cityId: city.id, roomStayStartDate: searchParams.fromDate, roomStayEndDate: searchParams.toDate, adults: adultsInRoom, children: childrenInRoom, }) ) const [hotels] = await hotelsPromise const arrivalDate = new Date(searchParams.fromDate) const departureDate = new Date(searchParams.toDate) const isCityWithCountry = (city: any): city is { country: string } => "country" in city const validHotels = hotels?.filter((hotel): hotel is HotelData => hotel !== null) || [] const filterList = getFiltersFromHotels(validHotels) const breadcrumbs = [ { title: intl.formatMessage({ id: "Home" }), href: `/${params.lang}`, uid: "home-page", }, { title: intl.formatMessage({ id: "Hotel reservation" }), href: `/${params.lang}/hotelreservation`, uid: "hotel-reservation", }, { title: intl.formatMessage({ id: "Select hotel" }), href: `${selectHotel(params.lang)}/?${selectHotelParams}`, uid: "select-hotel", }, { title: city.name, uid: city.id, }, ] const isAllUnavailable = hotels?.every((hotel) => hotel.price === undefined) const pageTrackingData: TrackingSDKPageData = { pageId: "select-hotel", domainLanguage: params.lang, channel: TrackingChannelEnum["hotelreservation"], pageName: "hotelreservation|select-hotel", siteSections: "hotelreservation|select-hotel", pageType: "bookinghotelspage", siteVersion: "new-web", } const hotelsTrackingData: TrackingSDKHotelInfo = { availableResults: validHotels.length, searchTerm: searchParams.city, arrivalDate: format(arrivalDate, "yyyy-MM-dd"), departureDate: format(departureDate, "yyyy-MM-dd"), noOfAdults: adultsInRoom, noOfChildren: childrenInRoomArray?.length, ageOfChildren: childrenInRoomArray?.map((c) => c.age).join(","), childBedPreference: childrenInRoomArray ?.map((c) => ChildBedMapEnum[c.bed]) .join("|"), noOfRooms: 1, // // TODO: Handle multiple rooms duration: differenceInCalendarDays(departureDate, arrivalDate), leadTime: differenceInCalendarDays(arrivalDate, new Date()), searchType: "destination", bookingTypeofDay: isWeekend(arrivalDate) ? "weekend" : "weekday", country: validHotels?.[0].hotelData.address.country, region: validHotels?.[0].hotelData.address.city, } return ( <>
{city.name}
{hotels && hotels.length > 0 ? ( // TODO: Temp fix until API returns hotels that are not available
) : (
)}
{isAllUnavailable && ( )}
) }