import { cn } from "@/lib/utils"; import { getStatesApi } from "@/utils/api"; import { Loader2, Minus, Plus } from "lucide-react"; import { useSearchParams } from "next/navigation"; import { useEffect, useMemo, useState } from "react"; import StateNode from "./StateNode"; import { t } from "@/utils"; import { setSelectedLocation } from "@/redux/reducer/globalStateSlice"; import { useDispatch } from "react-redux"; const CountryNode = ({ country }) => { const dispatch = useDispatch(); const searchParams = useSearchParams(); const [states, setStates] = useState({ data: [], currentPage: 1, hasMore: false, isLoading: false, isLoadMore: false, expanded: false, }); const lat = searchParams.get("lat") || ""; const lng = searchParams.get("lng") || ""; const selectedState = searchParams.get("state") || ""; const selectedCity = searchParams.get("city") || ""; const selectedArea = searchParams.get("area") || ""; const selectedCountry = searchParams.get("country") || ""; const isSelected = useMemo(() => { return ( country?.latitude === lat && country?.longitude === lng && !selectedState && !selectedCity && !selectedArea ); }, [lat, lng]); const shouldExpand = selectedCountry === country?.name && selectedState; useEffect(() => { if (shouldExpand && !states.expanded) { fetchStates(); } }, []); useEffect(() => { if (isSelected) { dispatch(setSelectedLocation(country)); } }, [isSelected, country]); const fetchStates = async (page = 1) => { try { page > 1 ? setStates((prev) => ({ ...prev, isLoadMore: true })) : setStates((prev) => ({ ...prev, isLoading: true })); const response = await getStatesApi.getStates({ country_id: country.id, page, }); const newData = response?.data?.data?.data ?? []; const currentPage = response?.data?.data?.current_page; const lastPage = response?.data?.data?.last_page; setStates((prev) => ({ ...prev, data: page > 1 ? [...prev.data, ...newData] : newData, currentPage, hasMore: lastPage > currentPage, expanded: true, })); } catch (error) { console.log(error); } finally { setStates((prev) => ({ ...prev, isLoading: false, isLoadMore: false, })); } }; const handleToggleExpand = async () => { if (!states.expanded && states.data.length === 0) { await fetchStates(); } else { setStates((prev) => ({ ...prev, expanded: !prev.expanded })); } }; const handleClick = () => { const newSearchParams = new URLSearchParams(searchParams); newSearchParams.set("country", country?.name); newSearchParams.set("lat", country.latitude); newSearchParams.set("lng", country.longitude); newSearchParams.delete("state"); newSearchParams.delete("city"); newSearchParams.delete("area"); newSearchParams.delete("areaId"); newSearchParams.delete("km_range"); window.history.pushState(null, '', `/ads?${newSearchParams.toString()}`); }; const loadMore = async () => { await fetchStates(states.currentPage + 1); }; return (
  • {states?.isLoading ? ( ) : ( country.states_count > 0 && ( ) )}
    {states.expanded && ( )}
  • ); }; export default CountryNode;