fixed code
This commit is contained in:
41
src/hooks/useCityFeed.jsx
Normal file
41
src/hooks/useCityFeed.jsx
Normal file
@@ -0,0 +1,41 @@
|
||||
import { useState, useEffect, useCallback } from "react";
|
||||
import { useSearchPosts } from "./useSearchPosts";
|
||||
|
||||
/**
|
||||
* Поиск объявлений по нескольким выбранным городам, с объединением
|
||||
* результатов без дублей. Автоматически перезапускается при смене
|
||||
* selectedCities.
|
||||
*/
|
||||
export function useCityFeed(selectedCities) {
|
||||
const { loading: cityLoading, searchPosts } = useSearchPosts();
|
||||
const [cityAds, setCityAds] = useState([]);
|
||||
|
||||
const searchCities = useCallback((citiesToSearch) => {
|
||||
if (!citiesToSearch.length) return Promise.resolve([]);
|
||||
return Promise.all(citiesToSearch.map(c => searchPosts(c))).then(results => {
|
||||
const seen = new Set();
|
||||
const merged = [];
|
||||
results.flat().forEach(ad => {
|
||||
if (!seen.has(ad.id)) {
|
||||
seen.add(ad.id);
|
||||
merged.push(ad);
|
||||
}
|
||||
});
|
||||
return merged;
|
||||
});
|
||||
}, [searchPosts]);
|
||||
|
||||
useEffect(() => {
|
||||
if (selectedCities.length === 0) {
|
||||
setCityAds([]);
|
||||
return;
|
||||
}
|
||||
let cancelled = false;
|
||||
searchCities(selectedCities).then(result => {
|
||||
if (!cancelled) setCityAds(result);
|
||||
});
|
||||
return () => { cancelled = true; };
|
||||
}, [selectedCities, searchCities]);
|
||||
|
||||
return { cityAds, cityLoading, searchCities };
|
||||
}
|
||||
Reference in New Issue
Block a user