diff --git a/src/components/MainFeed.jsx b/src/components/MainFeed.jsx index cd58aaa..26f5b43 100644 --- a/src/components/MainFeed.jsx +++ b/src/components/MainFeed.jsx @@ -12,6 +12,7 @@ import AuthModal from "./AuthModal"; import RulesModal from "./RulesModal"; import { useAuthContext } from "../context/AuthContext"; import { useDeletePost } from "../hooks/useDeletePost"; +import { useFavorites } from "../hooks/useFavorites"; /** * MainFeed — корневой компонент приложения. @@ -22,6 +23,7 @@ export default function MainFeed() { const navigate = useNavigate(); const { user, token, isAuthenticated, logout } = useAuthContext(); const { deletePost } = useDeletePost(); + const { toggleFavorite, loadFavorites } = useFavorites(); // Открыт ли левый сайдбар (мобильный слайд-аут) const [sidebarOpen, setSidebarOpen] = useState(false); @@ -99,6 +101,17 @@ export default function MainFeed() { } }, []); + // Загружаем лайки пользователя при авторизации + useEffect(() => { + if (isAuthenticated && token) { + loadFavorites(token).then(favoriteIds => { + setLiked(new Set(favoriteIds)); + }); + } else { + setLiked(new Set()); + } + }, [isAuthenticated, token, loadFavorites]); + // Первичная загрузка при монтировании компонента useEffect(() => { loadFeed(); }, [loadFeed]); @@ -130,16 +143,22 @@ export default function MainFeed() { }, [user?.id]); /** - * Переключает лайк на объявлении. - * Состояние хранится только на клиенте — без запроса к API. + * Переключает лайк на объявлении через API. */ - const toggleLike = useCallback((id) => { - setLiked(prev => { - const next = new Set(prev); - next.has(id) ? next.delete(id) : next.add(id); - return next; - }); - }, []); + const toggleLike = useCallback(async (id) => { + if (!isAuthenticated || !token) { + return; + } + + const success = await toggleFavorite(id, token); + if (success) { + // Перезагружаем ленту для получения обновлённых данных + loadFeed(); + if (activeNav === "Мои объявления") { + loadMyPosts(); + } + } + }, [isAuthenticated, token, toggleFavorite, loadFeed, loadMyPosts, activeNav]); /** Удаляет объявление и перезагружает ленту */ const handleDelete = useCallback(async (postId) => { diff --git a/src/components/PostOnFeed.jsx b/src/components/PostOnFeed.jsx index aaa49f7..60bea67 100644 --- a/src/components/PostOnFeed.jsx +++ b/src/components/PostOnFeed.jsx @@ -90,7 +90,7 @@ export default function PostOnFeed({ ad, liked, onLike, onEdit, onDelete, isOwne