diff --git a/src/pages/AdminMediaPage.jsx b/src/pages/AdminMediaPage.jsx
index d760274..5505a8d 100644
--- a/src/pages/AdminMediaPage.jsx
+++ b/src/pages/AdminMediaPage.jsx
@@ -1,219 +1,150 @@
-import React, { useEffect, useState } from 'react';
-import { useMedia } from '../contexts/MediaContext';
-import { listMedia } from '../services/supabase';
-import { mediaTypes } from '../services/mediaService';
-import { useAuth } from "../contexts/AuthContext";
-import { useNavigate } from "react-router-dom";
-import { createMedia } from "../services/supabase";
+import React, { useState, useEffect } from 'react';
+import { useNavigate } from 'react-router-dom';
+import { useAuth } from '../contexts/AuthContext';
+import { supabase } from '../services/supabase';
+import MediaForm from '../components/admin/MediaForm';
const AdminMediaPage = () => {
+ const navigate = useNavigate();
+ const { user, userProfile, loading: authLoading } = useAuth();
const [media, setMedia] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
- const navigate = useNavigate();
- const { currentUser, userProfile } = useAuth();
- const [page, setPage] = useState(1);
- const [hasMore, setHasMore] = useState(true);
-
- const [mediaData, setMediaData] = useState({
- title: "",
- type: "movie",
- poster_url: "",
- backdrop_url: "",
- overview: "",
- release_date: "",
- is_published: false,
- });
-
- // Проверка прав доступа
- if (!userProfile?.role || !["admin", "editor"].includes(userProfile.role)) {
- return (
-
-
-
Доступ запрещен
-
У вас нет прав для доступа к этой странице.
-
-
- );
- }
+ const [showForm, setShowForm] = useState(false);
useEffect(() => {
- const fetchMedia = async () => {
- try {
- setLoading(true);
- setError(null);
- const data = await listMedia(null, 1, 100); // Получаем все медиа
- setMedia(data || []);
- } catch (err) {
- console.error('Error fetching media:', err);
- setError('Не удалось загрузить медиа');
- } finally {
- setLoading(false);
- }
- };
+ console.log('AdminMediaPage mounted, user:', user);
+
+ if (!authLoading && !user) {
+ console.log('No user, redirecting to login');
+ navigate('/login');
+ return;
+ }
- fetchMedia();
- }, []); // Запускаем только при монтировании компонента
+ if (userProfile?.role !== 'admin') {
+ console.log('Access denied');
+ navigate('/');
+ return;
+ }
- const handleInputChange = (e) => {
- const { name, value, type, checked } = e.target;
- setMediaData((prev) => ({
- ...prev,
- [name]: type === "checkbox" ? checked : value,
- }));
- };
-
- const handleSubmit = async (e) => {
- e.preventDefault();
- setLoading(true);
- setError("");
+ loadMedia();
+ }, [user, userProfile, authLoading, navigate]);
+ const loadMedia = async () => {
try {
- const newMedia = await createMedia({
- ...mediaData,
- created_by: currentUser.id,
- });
+ setLoading(true);
+ const { data, error } = await supabase
+ .from('media')
+ .select('*')
+ .order('created_at', { ascending: false });
- setMedia(prev => [newMedia, ...prev]);
- setMediaData({
- title: "",
- type: "movie",
- poster_url: "",
- backdrop_url: "",
- overview: "",
- release_date: "",
- is_published: false,
- });
+ if (error) throw error;
+
+ setMedia(data || []);
} catch (err) {
- setError("Ошибка при создании медиа. Пожалуйста, попробуйте снова.");
- console.error("Error creating media:", err);
+ console.error('Error loading media:', err);
+ setError(err.message);
} finally {
setLoading(false);
}
};
- if (loading) {
- return Загрузка...
;
+ const handleDelete = async (id) => {
+ if (!window.confirm('Вы уверены, что хотите удалить этот медиа-контент?')) {
+ return;
+ }
+
+ try {
+ const { error } = await supabase
+ .from('media')
+ .delete()
+ .eq('id', id);
+
+ if (error) throw error;
+
+ setMedia(media.filter(item => item.id !== id));
+ } catch (err) {
+ console.error('Error deleting media:', err);
+ setError(err.message);
+ }
+ };
+
+ if (authLoading) {
+ return Загрузка...
;
}
- if (error) {
- return {error}
;
+ if (!user || userProfile?.role !== 'admin') {
+ return null;
}
return (
-
-
Управление медиа
-
-
- {media.map((item) => (
-
-
{item.title}
-
Тип: {item.type}
- {item.rating && (
-
Рейтинг: {item.rating}
- )}
-
- ))}
+
+
+
Управление медиа
+
- {/* Форма создания медиа */}
-
-
Создать новое медиа
- {error && (
-
- {error}
-
- )}
-
+ ))}
+
+ )}
+
+ {showForm && (
+
setShowForm(false)}
+ onSuccess={() => {
+ setShowForm(false);
+ loadMedia();
+ }}
+ />
+ )}
);
};
diff --git a/src/pages/ProfilePage.jsx b/src/pages/ProfilePage.jsx
index 0a7ce16..726194a 100644
--- a/src/pages/ProfilePage.jsx
+++ b/src/pages/ProfilePage.jsx
@@ -1,7 +1,7 @@
-import { useState, useEffect } from "react";
-import { useParams, useNavigate } from "react-router-dom";
-import { useAuth } from "../contexts/AuthContext";
-import { getUserProfile, getUserReviews } from "../services/supabase";
+import React, { useState, useEffect } from 'react';
+import { useParams, Link } from 'react-router-dom';
+import { useAuth } from '../contexts/AuthContext';
+import { supabase } from '../services/supabase';
import {
FiEdit,
FiSettings,
@@ -14,52 +14,59 @@ import {
import ReviewCard from "../components/reviews/ReviewCard";
import RatingChart from "../components/reviews/RatingChart";
-function ProfilePage() {
- const { userId } = useParams();
- const navigate = useNavigate();
- const { currentUser, userProfile } = useAuth();
+const ProfilePage = () => {
const [profile, setProfile] = useState(null);
const [reviews, setReviews] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
+ const { username } = useParams();
+ const { user } = useAuth();
useEffect(() => {
const loadProfile = async () => {
try {
setLoading(true);
setError(null);
-
- // Если userId не указан, показываем профиль текущего пользователя
- const targetUserId = userId || currentUser?.id;
- if (!targetUserId) {
- navigate('/login');
- return;
- }
- const profileData = await getUserProfile(targetUserId);
+ // Получаем профиль по username
+ const { data: profileData, error: profileError } = await supabase
+ .from('users')
+ .select('*')
+ .eq('username', username)
+ .single();
+
+ if (profileError) throw profileError;
setProfile(profileData);
- const reviewsData = await getUserReviews(targetUserId);
+ // Получаем отзывы пользователя
+ const { data: reviewsData, error: reviewsError } = await supabase
+ .from('reviews')
+ .select(`
+ *,
+ media(title, type, poster_url)
+ `)
+ .eq('user_id', profileData.id)
+ .order('created_at', { ascending: false });
+
+ if (reviewsError) throw reviewsError;
setReviews(reviewsData);
} catch (err) {
- setError("Ошибка при загрузке профиля");
- console.error("Error loading profile:", err);
+ console.error('Error loading profile:', err);
+ setError('Не удалось загрузить профиль');
} finally {
setLoading(false);
}
};
loadProfile();
- }, [userId, currentUser, navigate]);
+ }, [username]);
if (loading) {
return (
-
-
-
-
-
-
+
@@ -68,10 +75,11 @@ function ProfilePage() {
if (error) {
return (
-
-
-
Ошибка
-
{error}
+
);
@@ -79,95 +87,94 @@ function ProfilePage() {
if (!profile) {
return (
-
-
-
Профиль не найден
-
Пользователь с таким ID не существует.
+
+
+
+
+ Профиль не найден
+
+
+ Вернуться на главную
+
+
);
}
- const isOwnProfile = currentUser?.id === profile.id;
-
return (
-
-
- {/* Заголовок профиля */}
-
- {profile.profile_picture && (
-

- )}
-
-
-
-
+
+
+
+
+
+ {profile.profile_picture ? (
+

+ ) : (
+
+ {profile.username[0].toUpperCase()}
+
+ )}
+
-
{profile.username}
+
+ {profile.username}
+
- {profile.is_critic ? "Критик" : "Пользователь"}
+ {profile.is_critic ? 'Критик' : 'Пользователь'}
- {isOwnProfile && (
-
- )}
- {profile.bio && (
-
-
О себе
-
{profile.bio}
-
- )}
-
- {/* Отзывы пользователя */}
-
-
Отзывы
- {reviews.length === 0 ? (
-
Пока нет отзывов
- ) : (
-
- {reviews.map((review) => (
-
-
-

-
-
{review.media.title}
-
- {review.media.type === 'movie' ? 'Фильм' :
- review.media.type === 'series' ? 'Сериал' : 'Игра'}
-
-
-
-
{review.content}
-
);
-}
+};
export default ProfilePage;
diff --git a/src/pages/RegisterPage.jsx b/src/pages/RegisterPage.jsx
index ff3663a..fa5075c 100644
--- a/src/pages/RegisterPage.jsx
+++ b/src/pages/RegisterPage.jsx
@@ -10,7 +10,7 @@ function RegisterPage() {
const [error, setError] = useState("");
const [loading, setLoading] = useState(false);
- const { signup } = useAuth();
+ const { signUp } = useAuth();
const navigate = useNavigate();
const handleSubmit = async (e) => {
@@ -34,7 +34,7 @@ function RegisterPage() {
try {
setError("");
setLoading(true);
- await signup(email, password, username);
+ await signUp(email, password, username);
navigate("/");
} catch (err) {
setError(