CampFireCritics/src/pages/HomePage.jsx
2025-05-14 22:42:39 +03:00

133 lines
4.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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";
const HomePage = () => {
const [media, setMedia] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
const { user } = useAuth();
useEffect(() => {
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);
}
};
loadMedia();
}, []);
if (loading) {
return (
<div className="min-h-screen bg-campfire-dark pt-20">
<div className="container-custom py-12">
<div className="flex justify-center items-center h-64">
<div className="animate-spin rounded-full h-12 w-12 border-t-2 border-b-2 border-campfire-amber"></div>
</div>
</div>
</div>
);
}
if (error) {
return (
<div className="min-h-screen bg-campfire-dark pt-20">
<div className="container-custom py-12">
<div className="bg-status-error/20 text-status-error p-4 rounded-lg text-center">
{error}
</div>
</div>
</div>
);
}
return (
<div className="min-h-screen bg-campfire-dark pt-20">
<div className="container-custom py-12">
<div className="flex justify-between items-center mb-8">
<h1 className="text-3xl font-bold text-campfire-light">
Добро пожаловать в CampFire
</h1>
{user?.role === "admin" && (
<Link to="/admin/media" className="btn-secondary">
Управление контентом
</Link>
)}
</div>
{media.length > 0 ? (
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6">
{media.map((item) => (
<Link
key={`${item.id}-${item.type}`}
to={`/media/${item.id}`}
className="group"
>
<div className="bg-campfire-charcoal rounded-lg overflow-hidden shadow-lg border border-campfire-ash/20 transition-all duration-300 hover:shadow-xl hover:border-campfire-amber/30">
<div className="aspect-[2/3] relative">
<img
src={item.poster_url}
alt={item.title}
className="w-full h-full object-cover"
/>
<div className="absolute inset-0 bg-gradient-to-t from-campfire-charcoal/80 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300" />
</div>
<div className="p-4">
<div className="flex items-center justify-between mb-2">
<span className="text-xs font-medium px-2 py-1 rounded-full bg-campfire-amber/20 text-campfire-amber">
{item.type === "movie" ? "Фильм" : "Сериал"}
</span>
<span className="text-sm text-campfire-ash">
{new Date(item.release_date).getFullYear()}
</span>
</div>
<h3 className="text-lg font-semibold text-campfire-light mb-1 group-hover:text-campfire-amber transition-colors">
{item.title}
</h3>
<p className="text-sm text-campfire-ash line-clamp-2">
{item.description}
</p>
</div>
</div>
</Link>
))}
</div>
) : (
<div className="text-center py-12">
<p className="text-campfire-ash text-lg">
Пока нет доступного контента
</p>
{user?.role === "admin" && (
<Link to="/admin/media" className="inline-block mt-4 btn-primary">
Добавить контент
</Link>
)}
</div>
)}
</div>
</div>
);
};
export default HomePage;