import {useState, useEffect, useCallback} from "react"; import "../styles/feed.css"; import {API_URL} from "../config/constants"; import Sidebar from "../components/Sidebar"; import RightSidebar from "../components/RightSidebar"; import AdCard from "../components/AdCard"; import PostModal from "../components/PostModal"; import MenuIcon from "../components/icons/MenuIcon" export default function FeedPage() { const [sidebarOpen, setSidebarOpen] = useState(false); const [activeNav, setActiveNav] = useState("Главная"); const [modalOpen, setModalOpen] = useState(false); const [ads, setAds] = useState([]); const [liked, setLiked] = useState(new Set()); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); useEffect(() => { const load = async () => { setLoading(true); setError(""); try { const res = await fetch(`${API_URL}/api/v1/posts`); if (!res.ok) { throw new Error(`Ошибка ${res.status}`); } const data = await res.json(); // поддерживаем { items: [] } и просто [] setAds(Array.isArray(data) ? data : (data.items ?? [])); } catch (err) { setError(err.message || "Не удалось загрузить объявления"); } finally { setLoading(false); } }; load(); }, []); const toggleLike = useCallback((id) => { setLiked(prev => { const next = new Set(prev); next.has(id) ? next.delete(id) : next.add(id); return next; }); }, []); // Новое объявление — добавляем в начало ленты const handleNewAd = useCallback((ad) => { setAds(prev => [ad, ...prev]); }, []); const renderContent = () => { if (loading) { return (
Загружаем объявления...
); } if (error) { return (
⚠️
Не удалось загрузить ленту
{error}
); } if (!ads.length) { return (
🔍
Объявлений пока нет
Будьте первым — разместите объявление
о потере или находке
); } return ads.map(ad => ( )); }; return ( <>
setSidebarOpen(false)} onNavClick={setActiveNav} />
{renderContent()}
{modalOpen && ( setModalOpen(false)} onSuccess={handleNewAd} /> )}
); }