import React, { useEffect, useState, useCallback } from 'react'; import { Link } from 'react-router-dom'; import { getLatestReviews, listMedia, listUsersRankedByReviews, getFileUrl, getMediaCount, getReviewsCount } from '../../services/pocketbaseService'; import { FaStar, FaHeart, FaComment, FaCrown, FaMedal } from 'react-icons/fa'; import GridMotionMobile from '../components/GridMotionMobile'; import CountUp from '../../components/reactbits/TextAnimations/CountUp/CountUp'; import { motion, AnimatePresence } from 'framer-motion'; import RotatingText from '../../components/reactbits/TextAnimations/RotatingText/RotatingText'; const MobileHome = () => { const [popularMedia, setPopularMedia] = useState([]); const [latestReviews, setLatestReviews] = useState([]); const [topUsers, setTopUsers] = useState([]); const [stats, setStats] = useState({ mediaCount: 0, reviewsCount: 0 }); const [posters, setPosters] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [isDataReady, setIsDataReady] = useState(false); useEffect(() => { const fetchData = async () => { try { setLoading(true); setError(null); const [mediaData, reviewsData, usersData, mediaCount, reviewsCount] = await Promise.all([ listMedia(null, 1, 40, null, false, true, '-review_count'), getLatestReviews(5), listUsersRankedByReviews(3), getMediaCount(), getReviewsCount() ]); setPopularMedia(mediaData?.data || []); setLatestReviews(reviewsData || []); setTopUsers(usersData || []); setStats({ mediaCount: parseInt(mediaCount) || 0, reviewsCount: parseInt(reviewsCount) || 0 }); setPosters((mediaData?.data || []).filter(item => item.poster).map(item => getFileUrl(item, 'poster'))); setIsDataReady(true); setLoading(false); console.log(mediaData?.data) } catch (err) { setError('Не удалось загрузить данные'); setLoading(false); } }; fetchData(); }, []); if (loading || !isDataReady) { return (
Загрузка...
); } if (error) { return (
{error}
); } // Для GridMotionMobile: минимум 48 постеров const minPosters = 48; let postersForGrid = posters; console.log(posters) if (posters.length < minPosters) { const placeholder = '/placeholder-poster.jpg'; postersForGrid = [ ...posters, ...Array(minPosters - posters.length).fill(placeholder) ]; } return (
{/* GridMotion + статистика */}

Составляй рецензии на

Медиа в каталоге

Рецензий написано

{/* Топ рецензенты */}

Топ рецензенты

{topUsers.map((user, idx) => (
{user.username}
{idx + 1}
{user.username} {user.review_count} рецензий
))}
Посмотреть рейтинг
{/* Последние обзоры */}

Последние обзоры

{latestReviews.map((review) => (
{review.expand?.media_id?.title}

{review.expand?.media_id?.title}

{review.rating}
{new Date(review.created).toLocaleDateString()}

{review.text}

{review.likes?.length || 0}
{review.comments?.length || 0}
))}
{/* Популярные медиа */}

Популярные медиа

{popularMedia.filter(media => media?.path).map((media) => ( {media.title}

{media.title}

{media.average_rating?.toFixed(1) || '0.0'}
))}
); }; export default MobileHome;