Files
IRTH/client/src/components/searchPage/LayoutOptions.tsx
T
2024-06-25 15:56:48 +05:00

195 lines
5.4 KiB
TypeScript

/* eslint-disable react-hooks/exhaustive-deps */
import { useEffect, useState } from "react";
import LayoutCard from "./LayoutCard";
import SortButton from "./SortButton";
import SearchIcon from "../icons/SearchIcon";
import Button from "../Button";
import FilterIcon from "../icons/FilterIcon";
import useModal from "../../store/useModal";
import { MobileModalWrapper } from "../modals/mobile/MobileModalWrapper";
import SearchFiltersModal from "../modals/mobile/SearchFiltersModal";
import { updateAccessToken } from "../../api/updateAccessToken";
import useApartments from "../../store/useApartments";
import useSearchFilters from "../../store/useSearchFilters";
import { useDebounce } from "@uidotdev/usehooks";
import {
perPageInitial,
pageInitial,
} from "../../consts/initialMasterplanFilters";
import { getFilteredApartments } from "../../calc/getFilteredApartments";
import SearchLoader from "./SearchLoader";
const LayoutOptions = () => {
const { apartments, setApartments } = useApartments();
const [isLoading, setIsLoading] = useState(false);
const { setModal } = useModal();
const {
roveHomeTypeCheckboxes,
apartmentTypeCheckboxes,
multirangeSliders,
viewCheckboxes,
switchers,
sortList,
setSortList,
page,
setPage,
setPerPage,
perPage,
} = useSearchFilters();
const debouncedSliders = useDebounce(multirangeSliders, 300);
const handleOnSortClick = (sortId: string) => {
const updatedSortList = sortList.map((sort) => {
const isSelected = sort.id === sortId;
return { ...sort, isSelected: isSelected };
});
setSortList(updatedSortList);
};
const handleOnFilterClick = () => {
setModal(
<MobileModalWrapper>
<SearchFiltersModal />
</MobileModalWrapper>
);
};
function handleOnShowMoreBtnClick(): void {
const _page = page + 1;
const _perPage = _page * perPageInitial;
setPage(_page);
setPerPage(_perPage);
}
useEffect(() => {
const zohoToken = localStorage.getItem("ACCESS_TOKEN");
setIsLoading(true);
updateAccessToken()
.then((token) => {
if (token) {
getFilteredApartments(
token,
setApartments,
roveHomeTypeCheckboxes,
apartmentTypeCheckboxes,
debouncedSliders,
switchers,
viewCheckboxes,
sortList,
pageInitial,
perPage
);
}
})
.then(() =>
getFilteredApartments(
zohoToken,
setApartments,
roveHomeTypeCheckboxes,
apartmentTypeCheckboxes,
debouncedSliders,
switchers,
viewCheckboxes,
sortList,
pageInitial,
perPage
)
)
.finally(() => {
setIsLoading(false);
});
// getFilteredApartments(
// zohoToken,
// setApartments,
// roveHomeTypeCheckboxes,
// apartmentTypeCheckboxes,
// debouncedSliders,
// switchers,
// viewCheckboxes,
// sortList,
// pageInitial,
// perPage
// )
// .catch((error) => {
// const errorStatus = error.response.status;
// if (errorStatus === 401) {
// updateAccessToken().then((token) => {
// if (token) {
// getFilteredApartments(
// token,
// setApartments,
// roveHomeTypeCheckboxes,
// apartmentTypeCheckboxes,
// debouncedSliders,
// switchers,
// viewCheckboxes,
// sortList,
// pageInitial,
// perPage
// );
// }
// });
// }
// })
// .finally(() => {
// setIsLoading(false);
// });
}, [
setApartments,
roveHomeTypeCheckboxes,
apartmentTypeCheckboxes,
debouncedSliders,
switchers,
viewCheckboxes,
sortList,
perPage,
]);
return (
<section className="w-full p-6 flex flex-col">
<div className="flex justify-between items-center border-b">
<div className="flex w-full justify-between pb-4 lg:flex-row lg:items-center flex-col">
<div className="flex gap-4 font-semibold text-subheadline-s leading-7 py-[6px]">
<h2 className="text-[#0D1922]">Units</h2>
<p className="text-[#73787C]">
{apartments ? apartments.length : 0}
</p>
</div>
<SortButton sortList={sortList} onClick={handleOnSortClick} />
</div>
<div className="lg:hidden block">
<Button
icon={<FilterIcon />}
text="Filters"
className="text-[#0D1922B2]"
onClick={handleOnFilterClick}
/>
</div>
</div>
{isLoading ? (
<SearchLoader />
) : (
<div className="grid 2xl:grid-cols-4 xl:grid-cols-3 grid-cols-2 gap-4 pt-6">
{apartments &&
apartments.map((apartment) => (
<LayoutCard apartmentCard={apartment} key={apartment.id} />
))}
</div>
)}
<div
className="bg-white rounded-lg mt-4 py-[10px] flex justify-center select-none cursor-pointer items-center gap-2"
onClick={handleOnShowMoreBtnClick}
>
<SearchIcon /> Show 12 more apartments
</div>
</section>
);
};
export default LayoutOptions;