import { Loader2, Minus, Plus } from "lucide-react"; import { useSearchParams } from "next/navigation"; import { useEffect, useMemo, useState } from "react"; import AreaNode from "./AreaNode"; import { cn } from "@/lib/utils"; import { getAreasApi } from "@/utils/api"; import { t } from "@/utils"; import { useDispatch } from "react-redux"; import { setSelectedLocation } from "@/redux/reducer/globalStateSlice"; const CityNode = ({ city, country, state }) => { const dispatch = useDispatch(); const searchParams = useSearchParams(); const [areas, setAreas] = useState({ data: [], currentPage: 1, hasMore: false, isLoading: false, isLoadMore: false, expanded: false, }); const lat = searchParams.get("lat") || ""; const lng = searchParams.get("lng") || ""; const selectedCity = searchParams.get("city") || ""; const selectedArea = searchParams.get("area") || ""; const isSelected = useMemo(() => { return city?.latitude === lat && city?.longitude === lng && !selectedArea; }, [lat, lng]); const shouldExpand = selectedCity === city?.name && selectedArea; useEffect(() => { if (isSelected) { dispatch(setSelectedLocation(city)); } }, [isSelected, city]); useEffect(() => { if (shouldExpand && !areas.expanded) { fetchAreas(); } }, []); const fetchAreas = async (page = 1) => { try { page > 1 ? setAreas((prev) => ({ ...prev, isLoadMore: true })) : setAreas((prev) => ({ ...prev, isLoading: true })); const response = await getAreasApi.getAreas({ city_id: city.id, page, }); const newData = response?.data?.data?.data ?? []; const currentPage = response?.data?.data?.current_page; const lastPage = response?.data?.data?.last_page; setAreas((prev) => ({ ...prev, data: page > 1 ? [...prev.data, ...newData] : newData, currentPage, hasMore: lastPage > currentPage, expanded: true, })); } catch (error) { console.log(error); } finally { setAreas((prev) => ({ ...prev, isLoading: false, isLoadMore: false, })); } }; const handleToggleExpand = async () => { if (!areas.expanded && areas.data.length === 0) { await fetchAreas(); } else { setAreas((prev) => ({ ...prev, expanded: !prev.expanded })); } }; const handleClick = () => { const newSearchParams = new URLSearchParams(searchParams); newSearchParams.set("country", country?.name); newSearchParams.set("state", state?.name); newSearchParams.set("city", city?.name); newSearchParams.set("lat", city.latitude); newSearchParams.set("lng", city.longitude); // Always remove unrelated location filters to avoid redundancy newSearchParams.delete("area"); newSearchParams.delete("areaId"); newSearchParams.delete("km_range"); window.history.pushState(null, '', `/ads?${newSearchParams.toString()}`); }; const loadMore = async () => { await fetchAreas(areas.currentPage + 1); }; return (