"use client" import { APIProvider } from "@vis.gl/react-google-maps" import { useEffect, useMemo, useRef, useState } from "react" import { useIntl } from "react-intl" import { useMediaQuery } from "usehooks-ts" import { selectHotel } from "@/constants/routes/hotelReservation" import { useHotelFilterStore } from "@/stores/hotel-filters" import { useHotelsMapStore } from "@/stores/hotels-map" import { CloseIcon, CloseLargeIcon } from "@/components/Icons" import InteractiveMap from "@/components/Maps/InteractiveMap" import { BackToTopButton } from "@/components/TempDesignSystem/BackToTopButton" import Button from "@/components/TempDesignSystem/Button" import Link from "@/components/TempDesignSystem/Link" import useLang from "@/hooks/useLang" import FilterAndSortModal from "../FilterAndSortModal" import HotelListing from "./HotelListing" import styles from "./selectHotelMap.module.css" import type { SelectHotelMapProps } from "@/types/components/hotelReservation/selectHotel/map" export default function SelectHotelMap({ apiKey, hotelPins, mapId, hotels, filterList, cityCoordinates, }: SelectHotelMapProps) { const lang = useLang() const intl = useIntl() const isAboveMobile = useMediaQuery("(min-width: 768px)") const [showBackToTop, setShowBackToTop] = useState(false) const listingContainerRef = useRef(null) const activeFilters = useHotelFilterStore((state) => state.activeFilters) const { activeHotelCard, activeHotelPin } = useHotelsMapStore() const coordinates = isAboveMobile ? cityCoordinates : { ...cityCoordinates, lat: cityCoordinates.lat - 0.006 } useEffect(() => { if (listingContainerRef.current) { const activeElement = listingContainerRef.current.querySelector(`[data-active="true"]`) if (activeElement) { activeElement.scrollIntoView({ behavior: "smooth", block: "nearest" }) } } }, [activeHotelCard, activeHotelPin]) useEffect(() => { const hotelListingElement = document.querySelector( `.${styles.listingContainer}` ) if (!hotelListingElement) return const handleScroll = () => { const hasScrolledPast = hotelListingElement.scrollTop > 490 setShowBackToTop(hasScrolledPast) } hotelListingElement.addEventListener("scroll", handleScroll) return () => hotelListingElement.removeEventListener("scroll", handleScroll) }, []) function scrollToTop() { const hotelListingElement = document.querySelector( `.${styles.listingContainer}` ) hotelListingElement?.scrollTo({ top: 0, behavior: "smooth" }) } const filteredHotelPins = useMemo( () => hotelPins.filter((hotel) => activeFilters.every((filterId) => hotel.facilityIds.includes(Number(filterId)) ) ), [activeFilters, hotelPins] ) const closeButton = ( ) return (
{showBackToTop && ( )}
) }