166 lines
5.2 KiB
JavaScript
166 lines
5.2 KiB
JavaScript
import ProductCard from "@/components/Common/ProductCard";
|
|
import NoData from "@/components/EmptyStates/NoData";
|
|
import AllItemsSkeleton from "@/components/PagesComponent/Home/AllItemsSkeleton";
|
|
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
|
|
import { Button } from "@/components/ui/button";
|
|
import { resetBreadcrumb } from "@/redux/reducer/breadCrumbSlice";
|
|
import { CurrentLanguageData } from "@/redux/reducer/languageSlice";
|
|
import { t } from "@/utils";
|
|
import { allItemApi } from "@/utils/api";
|
|
import { Info, X } from "lucide-react";
|
|
import { useEffect, useState } from "react";
|
|
import { useDispatch, useSelector } from "react-redux";
|
|
const AllItems = ({ cityData, KmRange }) => {
|
|
const dispatch = useDispatch();
|
|
const CurrentLanguage = useSelector(CurrentLanguageData);
|
|
const [AllItem, setAllItem] = useState([]);
|
|
const [hasMore, setHasMore] = useState(true);
|
|
const [currentPage, setCurrentPage] = useState(1);
|
|
const [isLoading, setIsLoading] = useState(false);
|
|
const [isLoadMore, setIsLoadMore] = useState(false);
|
|
|
|
// State to track if we should show location alert
|
|
const [locationAlertMessage, setLocationAlertMessage] = useState("");
|
|
|
|
const getAllItemData = async (page) => {
|
|
if (page === 1) {
|
|
setIsLoading(true);
|
|
}
|
|
try {
|
|
const params = {
|
|
page,
|
|
current_page: "home",
|
|
};
|
|
if (Number(KmRange) > 0 && (cityData?.areaId || cityData?.city)) {
|
|
// Add location-based parameters for non-demo mode
|
|
params.radius = KmRange;
|
|
params.latitude = cityData.lat;
|
|
params.longitude = cityData.long;
|
|
} else {
|
|
// Add location hierarchy parameters for non-demo mode
|
|
if (cityData?.areaId) {
|
|
params.area_id = cityData.areaId;
|
|
} else if (cityData?.city) {
|
|
params.city = cityData.city;
|
|
} else if (cityData?.state) {
|
|
params.state = cityData.state;
|
|
} else if (cityData?.country) {
|
|
params.country = cityData.country;
|
|
}
|
|
}
|
|
|
|
const response = await allItemApi.getItems(params);
|
|
if (response.data?.error === true) {
|
|
throw new Error(response.data?.message);
|
|
}
|
|
|
|
const apiMessage = response.data.message;
|
|
// Check if message indicates no items in selected location
|
|
const isNoItemsInLocation = apiMessage
|
|
?.toLowerCase()
|
|
.includes("no ads found");
|
|
|
|
// Show alert only if there are items but from different location
|
|
if (isNoItemsInLocation && response?.data?.data?.data?.length > 0) {
|
|
setLocationAlertMessage(apiMessage);
|
|
} else {
|
|
setLocationAlertMessage("");
|
|
}
|
|
|
|
if (response?.data?.data?.data?.length > 0) {
|
|
const data = response?.data?.data?.data;
|
|
if (page === 1) {
|
|
setAllItem(data);
|
|
} else {
|
|
setAllItem((prevData) => [...prevData, ...data]);
|
|
}
|
|
const currentPage = response?.data?.data?.current_page;
|
|
const lastPage = response?.data?.data?.last_page;
|
|
setHasMore(currentPage < lastPage);
|
|
setCurrentPage(currentPage);
|
|
} else {
|
|
setAllItem([]);
|
|
}
|
|
} catch (error) {
|
|
console.error("Error:", error);
|
|
} finally {
|
|
setIsLoading(false);
|
|
setIsLoadMore(false);
|
|
}
|
|
};
|
|
|
|
useEffect(() => {
|
|
getAllItemData(1);
|
|
}, [cityData.lat, cityData.long, KmRange, CurrentLanguage?.id]);
|
|
|
|
const handleLoadMore = () => {
|
|
setIsLoadMore(true);
|
|
getAllItemData(currentPage + 1);
|
|
};
|
|
|
|
useEffect(() => {
|
|
// reset breadcrumb path when in home page
|
|
dispatch(resetBreadcrumb());
|
|
}, []);
|
|
|
|
const handleLikeAllData = (id) => {
|
|
const updatedItems = AllItem.map((item) => {
|
|
if (item.id === id) {
|
|
return { ...item, is_liked: !item.is_liked };
|
|
}
|
|
return item;
|
|
});
|
|
setAllItem(updatedItems);
|
|
};
|
|
|
|
return (
|
|
<section className="container mt-12">
|
|
<h5 className="text-xl sm:text-2xl font-medium">
|
|
{t("allAdvertisements")}
|
|
</h5>
|
|
|
|
{/* Location Alert - shows when items are from different location */}
|
|
{locationAlertMessage && AllItem.length > 0 && (
|
|
<Alert variant="warning" className="mt-3">
|
|
<Info className="size-4" />
|
|
<AlertTitle>{locationAlertMessage}</AlertTitle>
|
|
<AlertDescription className="sr-only"></AlertDescription>
|
|
</Alert>
|
|
)}
|
|
|
|
<div className="grid grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-3 sm:gap-6 mt-6">
|
|
{isLoading ? (
|
|
<AllItemsSkeleton />
|
|
) : AllItem && AllItem.length > 0 ? (
|
|
AllItem?.map((item) => (
|
|
<ProductCard
|
|
key={item?.id}
|
|
item={item}
|
|
handleLike={handleLikeAllData}
|
|
/>
|
|
))
|
|
) : (
|
|
<div className="col-span-full">
|
|
<NoData name={t("advertisement")} />
|
|
</div>
|
|
)}
|
|
</div>
|
|
|
|
{AllItem && AllItem.length > 0 && hasMore && (
|
|
<div className="text-center mt-6">
|
|
<Button
|
|
variant="outline"
|
|
className="text-sm sm:text-base text-primary w-[256px]"
|
|
disabled={isLoading || isLoadMore}
|
|
onClick={handleLoadMore}
|
|
>
|
|
{isLoadMore ? t("loading") : t("loadMore")}
|
|
</Button>
|
|
</div>
|
|
)}
|
|
</section>
|
|
);
|
|
};
|
|
|
|
export default AllItems;
|