From 8bda3252cd28f6f404fe962dd3e7387972a78f61 Mon Sep 17 00:00:00 2001 From: degradin Date: Wed, 7 May 2025 13:35:53 +0300 Subject: [PATCH] =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B2=D0=BD=D0=B0=D1=8F=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Создание главной страницы --- src/pages/HomePage.jsx | 286 +++++++++++++++++------------------------ 1 file changed, 118 insertions(+), 168 deletions(-) diff --git a/src/pages/HomePage.jsx b/src/pages/HomePage.jsx index 9348347..036b0f0 100644 --- a/src/pages/HomePage.jsx +++ b/src/pages/HomePage.jsx @@ -1,188 +1,138 @@ -import { useEffect } from "react"; -import { Link } from "react-router-dom"; -import { useMedia } from "../contexts/MediaContext"; -import { useAuth } from "../contexts/AuthContext"; -import MediaCarousel from "../components/media/MediaCarousel"; +import React, { useState, useEffect } from 'react'; +import { Link } from 'react-router-dom'; +import { useMedia } from '../contexts/MediaContext'; +import { useAuth } from '../contexts/AuthContext'; +import { listMedia } from '../services/supabase'; +import { mediaTypes } from '../services/mediaService'; import { FiTrendingUp, FiCalendar, FiAward } from "react-icons/fi"; +import MediaCarousel from "../components/media/MediaCarousel"; import { getImageUrl } from "../services/tmdbApi"; -function HomePage() { - const { fetchTrendingMedia, trendingMovies, trendingTvShows, loading } = - useMedia(); - const { currentUser } = useAuth(); +const HomePage = () => { + const [media, setMedia] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const { user } = useAuth(); useEffect(() => { - fetchTrendingMedia(); - }, [fetchTrendingMedia]); + const loadMedia = async () => { + try { + setLoading(true); + setError(null); + const { data, error } = await listMedia(); + + if (error) { + throw new Error(error); + } + + setMedia(data || []); + } catch (err) { + console.error('Error loading media:', err); + setError('Не удалось загрузить контент'); + } finally { + setLoading(false); + } + }; - // Get featured media (first trending movie with backdrop) - const featuredMedia = - trendingMovies.find((movie) => movie.backdrop_path) || trendingMovies[0]; + loadMedia(); + }, []); - return ( -
- {/* Hero Section */} - {featuredMedia && ( -
-
- {featuredMedia.title} -
-
- -
- - Trending - -

- {featuredMedia.title} -

-

- {featuredMedia.overview.substring(0, 200)}... -

- - View Details - -
-
- )} - - {/* Welcome Message for Logged In Users */} - {currentUser && ( -
-
-

- С возвращением, {currentUser.username}! -

-

- Продолжайте открывать отличный контент и делиться своими мыслями с - сообществом. -

- - Перейти в профиль → - -
-
- )} - - {/* Main Content */} -
- {loading ? ( + if (loading) { + return ( +
+
- ) : ( - <> - {/* Trending Movies */} -
-
- -

Фильмы

-
- -
+
+
+ ); + } - {/* Trending TV Shows */} -
-
- -

Сериалы

-
- -
+ if (error) { + return ( +
+
+
+ {error} +
+
+
+ ); + } - {/* Latest Reviews */} -
-
- -

Последние рецензии

-
-
- {/* Placeholder for latest reviews */} -
-

Рецензий пока нет

- {!currentUser && ( - - Войдите, чтобы написать рецензию - - )} -
-
-

Рецензий пока нет

- {!currentUser && ( - - Войдите, чтобы написать рецензию - - )} -
-
-
+ return ( +
+
+
+

+ Добро пожаловать в CampFire +

+ {user?.role === 'admin' && ( + + Управление контентом + + )} +
- {/* Critic's Choice */} -
-
- -

Выбор Резидентов

-
-
- {trendingMovies.slice(0, 3).map((movie) => ( - -
-
- {movie.title} -
-
-

- {movie.title} -

-

- {movie.overview} -

-
+ {media.length > 0 ? ( +
+ {media.map((item) => ( + +
+
+ {item.title} +
+
+
+
+ + {item.type === 'movie' ? 'Фильм' : 'Сериал'} + + + {new Date(item.release_date).getFullYear()} +
- - ))} -
-
- +

+ {item.title} +

+

+ {item.description} +

+
+
+ + ))} +
+ ) : ( +
+

+ Пока нет доступного контента +

+ {user?.role === 'admin' && ( + + Добавить контент + + )} +
)}
); -} +}; export default HomePage;