diff --git a/src/components/FlatCard.tsx b/src/components/FlatCard.tsx index 1686fd5..0487aa7 100644 --- a/src/components/FlatCard.tsx +++ b/src/components/FlatCard.tsx @@ -11,7 +11,7 @@ function FlatCard({ salesPrice, }: IUnit) { return ( -
+

{project}

diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 195575c..b366e15 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -12,10 +12,10 @@ function Header() { } return ( -
+
+ ); diff --git a/src/components/ModalContainer.tsx b/src/components/ModalContainer.tsx index fc73bdd..06898e7 100644 --- a/src/components/ModalContainer.tsx +++ b/src/components/ModalContainer.tsx @@ -51,7 +51,7 @@ function ModalContainer() { >
diff --git a/src/components/SearchFilters.tsx b/src/components/SearchFilters.tsx index c0e9b24..1b677f9 100644 --- a/src/components/SearchFilters.tsx +++ b/src/components/SearchFilters.tsx @@ -9,6 +9,7 @@ import { useNavigate, useSearchParams } from "react-router"; import UnitTypesFilter from "./UnitTypesFilter"; import { projects } from "../data/projects"; import { useDebounce } from "../hooks/useDebounce"; +import clsx from "clsx"; interface Filters { unitTypes: string[]; @@ -23,7 +24,7 @@ function SearchFilters({ ref, }: { inModal?: boolean; - ref: RefObject; + ref?: RefObject; }) { const [project, setProject] = useState(); const [unitTypes, setUnitTypes] = useState([]); @@ -171,7 +172,10 @@ function SearchFilters({ return (

@@ -204,7 +208,7 @@ function SearchFilters({ max={filters?.cost[1]} currentMin={currentMinCost!} currentMax={currentMaxCost!} - step={1} + offset={1} onChangeMin={setCurrentMinCost} onChangeMax={setCurrentMaxCost} label="Cost, AED" @@ -214,7 +218,7 @@ function SearchFilters({ max={filters?.floor[1]} currentMin={currentMinFloor!} currentMax={currentMaxFloor!} - step={1} + offset={1} onChangeMin={setCurrentMinFloor} onChangeMax={setCurrentMaxFloor} label="Floor" @@ -224,7 +228,7 @@ function SearchFilters({ max={filters?.area[1]} currentMin={currentMinArea!} currentMax={currentMaxArea!} - step={1} + offset={1} onChangeMin={setCurrentMinArea} onChangeMax={setCurrentMaxArea} label="Total Area, Sqft" diff --git a/src/components/modals/UnitFiltersModal.tsx b/src/components/modals/UnitFiltersModal.tsx new file mode 100644 index 0000000..5d131ba --- /dev/null +++ b/src/components/modals/UnitFiltersModal.tsx @@ -0,0 +1,7 @@ +import SearchFilters from "../SearchFilters"; + +function UnitFiltersModal() { + return ; +} + +export default UnitFiltersModal; diff --git a/src/components/ui/MultiRangeSlider.tsx b/src/components/ui/MultiRangeSlider.tsx index f617f42..a6410c4 100644 --- a/src/components/ui/MultiRangeSlider.tsx +++ b/src/components/ui/MultiRangeSlider.tsx @@ -13,7 +13,7 @@ interface IMultiRangeSlider { max: number; currentMin: number; currentMax: number; - step: number; + offset: number; disabled?: boolean; label: string; onChangeMin: (min: number) => void; @@ -27,7 +27,7 @@ function MultiRangeSlider({ min, onChangeMin, onChangeMax, - step, + offset, label, disabled = false, }: IMultiRangeSlider) { @@ -41,11 +41,9 @@ function MultiRangeSlider({ const percentage = (clientX - rect.x) / rect.width; const value = min + percentage * (max - min); - if (isMin) { - return Math.max(Math.min(value, currentMax - step), min); - } - - return Math.min(Math.max(value, currentMin + step), max); + return isMin + ? Math.max(Math.min(value, currentMax - offset), min) + : Math.min(Math.max(value, currentMin + offset), max); } function handleChange( @@ -57,11 +55,8 @@ function MultiRangeSlider({ const value = calculateValue(clientX, current === "min"); if (value !== undefined) { - if (current === "min") { - onChangeMin(value); - } else { - onChangeMax(value); - } + if (current === "min") onChangeMin(value); + else onChangeMax(value); } } diff --git a/src/pages/SearchPage.tsx b/src/pages/SearchPage.tsx index 137d6eb..448504c 100644 --- a/src/pages/SearchPage.tsx +++ b/src/pages/SearchPage.tsx @@ -8,6 +8,7 @@ import { useNavigate, useSearchParams } from "react-router"; import Button from "../components/ui/Button"; import FiltersIcon from "../components/icons/FiltersIcon"; import RestartIcon from "../components/icons/RestartIcon"; +import clsx from "clsx"; const STEP = 12; @@ -44,6 +45,8 @@ function SearchPage() { const filtersRef = useRef(null); const observerRef = useRef(null); + const [filtersInModal, setFiltersInModal] = useState(false); + useEffect(() => { if (!hasNextPage || isFetchingNextPage) return; const observerElement = observerRef.current; @@ -74,18 +77,38 @@ function SearchPage() { }; }, []); + const [footerReached, setFooterReached] = useState(false); + + useEffect(() => { + const footer = document.querySelector("footer"); + const observer = new IntersectionObserver((entries) => + setFooterReached(entries[0].isIntersecting) + ); + if (footer) observer.observe(footer); + + return () => { + if (footer) observer.unobserve(footer); + }; + }, []); + return (

- +
{data?.pages.flat().map((unit) => ( ))}
-
{showButtons && ( -
-
)} +
); }