import { useState, useCallback } from "react"; import { API_URL } from "../config/authConstants"; const PAGE_SIZE = 20; /** * Управляет основной лентой объявлений: загрузка, пагинация, поиск. */ export function useFeedPosts() { const [ads, setAds] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); const [page, setPage] = useState(0); const [hasMore, setHasMore] = useState(true); const [loadingMore, setLoadingMore] = useState(false); const loadFeed = useCallback(async (pageNum = 0, search = "", append = false) => { if (pageNum === 0) { setLoading(true); } else { setLoadingMore(true); } setError(""); try { const params = new URLSearchParams({ page: pageNum, size: PAGE_SIZE }); if (search) params.set("search", search); const res = await fetch(`${API_URL}/api/v1/posts?${params}`); if (!res.ok) throw new Error(`Error ${res.status}`); const data = await res.json(); const content = data.content ?? []; const normalizedAds = content.map(ad => ({ ...ad, type: ad.type ? ad.type.toLowerCase() : "loss", })); setAds(prev => (append ? [...prev, ...normalizedAds] : normalizedAds)); setHasMore(!data.last); setPage(pageNum); } catch (err) { setError(err.message || "Failed to load ads"); } finally { setLoading(false); setLoadingMore(false); } }, []); return { ads, loading, error, page, hasMore, loadingMore, loadFeed }; }