From 15bd7f9379545cc43684f06d4971d657bff0c893 Mon Sep 17 00:00:00 2001 From: Bohdan Hrabynskyi Date: Sun, 8 Dec 2024 17:11:25 +0100 Subject: [PATCH] Update FilteredPlacesPage with new features to be all components functional as in the App.jsx --- src/App.jsx | 2 +- .../FilteredPlacesPage/FilteredPlacesPage.jsx | 137 ++++++++++++------ 2 files changed, 91 insertions(+), 48 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index 9b5bb67e..525ad8fc 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,6 +1,6 @@ import axios from "axios"; import { useEffect, useState } from "react"; -import { Link, useOutletContext, useSearchParams } from "react-router-dom"; +import { useOutletContext, useSearchParams } from "react-router-dom"; import "./App.css"; import CategoryTabs from "./components/CategoryTabs/CategoryTabs"; import ProductCard from "./components/ProductCard/ProductCard"; diff --git a/src/pages/FilteredPlacesPage/FilteredPlacesPage.jsx b/src/pages/FilteredPlacesPage/FilteredPlacesPage.jsx index 0fcba0cc..cc6e0317 100644 --- a/src/pages/FilteredPlacesPage/FilteredPlacesPage.jsx +++ b/src/pages/FilteredPlacesPage/FilteredPlacesPage.jsx @@ -1,53 +1,96 @@ -import { useState, useEffect } from "react"; -import ProductCard from "../../components/ProductCard/ProductCard"; -import { BASE_URL } from "../../constants/constants"; import axios from "axios"; -import { Link, useParams, useSearchParams } from "react-router-dom"; +import { useEffect, useState } from "react"; +import { useOutletContext, useSearchParams } from "react-router-dom"; +import "../../App.css"; import CategoryTabs from "../../components/CategoryTabs/CategoryTabs"; +import ProductCard from "../../components/ProductCard/ProductCard"; import CalendarToggle from "../../components/calendarToggle/CalendarToggle"; +import { BASE_URL } from "../../constants/constants"; +import PriceRangeModal from "../../components/PriceRangeModal/PriceRangeModal"; +import useOutsideClick from "../../hooks/useOutsideClick"; + + +function FilteredPlacesPage() { + const [places, setPlaces] = useState([]); + const [selectPlaceId, setSelectPlaceId] = useState(null); + const [searchParams] = useSearchParams(); + const { modalIsVisible, setModalIsVisible, closeModal } = useOutletContext(); + const [isModalOpen, setModalOpen] = useState(false); + const [histogramData, setHistogramData] = useState([]); + + const toggleModal = () => setModalOpen((prev) => !prev); + + const priceRangeRef = useOutsideClick(() => setModalOpen(false)) + + useEffect(() => { + if (isModalOpen) { + document.body.classList.add('modalOpen'); + } else { + document.body.classList.remove('modalOpen'); + } + }, [isModalOpen]); + + useEffect(() => { + axios + .get(`${BASE_URL}places`, {params: searchParams}) + .then((response) => setPlaces(response?.data)) + .catch((error) => console.error(`Something went wrong. ${error.message}.`)); + }, [searchParams]); + + const handlePlaceClick = (placeId) => { + setSelectPlaceId(placeId); + console.log("Selected Place ID:", placeId); + + axios + .post(`${BASE_URL}savePlace`, { placeId }) + .then((response) => { + console.log("Place ID sent successfully:", response.data); + }) + .catch((error) => { + console.error("Error sending place ID:", error.message); + }); + }; + + return ( +
+
+ +
+ + + +
+ {places.map((place) => { + if (!place.id) return null; -const FilteredPlacesPage = () => { - const [filteredPlaces, setFilteredPlaces] = useState([]); - const {region} = useParams(); - const [searchParams] = useSearchParams(); - - useEffect(()=> { - axios.get(`${BASE_URL}s/${region}/homes`, { - params: searchParams - }) - .then(response => { - setFilteredPlaces(response?.data); - }) - .catch(error => console.error(`Something went wrong. ${error.message}.`)) - }, [region, searchParams]) - - return ( - <> -
- -
- -
- { - filteredPlaces.map((filteredPlace) => { - return ( - handlePlaceClick(filteredPlace.id)} // Optional: Handle click here if needed - > - -

{filteredPlace.title}

-

{filteredPlace.host}

-

{filteredPlace.price}

- -
- ) - }) - } -
- - ) + return ( + handlePlaceClick(place.id)} + modalIsVisible={modalIsVisible} + setModalIsVisible={setModalIsVisible} + closeModal={closeModal} + > +

{place.title}

+

{place.host}

+

{place.price}

+
+ ); + })} +
+ {isModalOpen && ( + + )} +
+ ); } -export default FilteredPlacesPage; \ No newline at end of file +export default FilteredPlacesPage;