import { differenceInCalendarDays, format, isWeekend } from "date-fns" import { Suspense } from "react" import { env } from "@/env/server" import { getCityCoordinates } from "@/lib/trpc/memoizedRequests" import { fetchAvailableHotels, getFiltersFromHotels, } from "@/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-hotel/utils" import TrackingSDK from "@/components/TrackingSDK" import { safeTry } from "@/utils/safeTry" import { getHotelPins } from "../../HotelCardDialogListing/utils" import SelectHotelMap from "." import { ChildBedMapEnum } from "@/types/components/bookingWidget/enums" import type { HotelData, NullableHotelData, } from "@/types/components/hotelReservation/selectHotel/hotelCardListingProps" import type { SelectHotelMapContainerProps } from "@/types/components/hotelReservation/selectHotel/map" import { TrackingChannelEnum, type TrackingSDKHotelInfo, type TrackingSDKPageData, } from "@/types/components/tracking" import type { Lang } from "@/constants/languages" function isValidHotelData(hotel: NullableHotelData): hotel is HotelData { return hotel !== null && hotel !== undefined } export async function SelectHotelMapContainer({ city, searchParams, adultsInRoom, childrenInRoom, child, }: SelectHotelMapContainerProps) { const googleMapId = env.GOOGLE_DYNAMIC_MAP_ID const googleMapsApiKey = env.GOOGLE_STATIC_MAP_KEY const fetchAvailableHotelsPromise = safeTry( fetchAvailableHotels({ cityId: city.id, roomStayStartDate: searchParams.fromDate, roomStayEndDate: searchParams.toDate, adults: adultsInRoom, children: childrenInRoom, }) ) const [hotels] = await fetchAvailableHotelsPromise const validHotels = hotels?.filter(isValidHotelData) || [] const hotelPins = getHotelPins(validHotels) const filterList = getFiltersFromHotels(validHotels) const cityCoordinates = await getCityCoordinates({ city: city.name, hotel: { address: hotels?.[0]?.hotelData?.address.streetAddress }, }) const arrivalDate = new Date(searchParams.fromDate) const departureDate = new Date(searchParams.toDate) const pageTrackingData: TrackingSDKPageData = { pageId: "select-hotel", domainLanguage: searchParams.lang as Lang, channel: TrackingChannelEnum["hotelreservation"], pageName: "hotelreservation|select-hotel|mapview", siteSections: "hotelreservation|select-hotel|mapview", pageType: "bookinghotelsmapviewpage", 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: child?.length, ageOfChildren: child?.map((c) => c.age).join(","), childBedPreference: child?.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 ( <> ) }