From 6f224ed1ef6d8b59ee1020042b484cd8493c9ae1 Mon Sep 17 00:00:00 2001 From: degradin Date: Wed, 7 May 2025 15:21:19 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BD=D0=B0=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=86=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/AdminMediaPage.jsx | 311 ++++++++++++++--------------------- src/pages/ProfilePage.jsx | 211 ++++++++++++------------ src/pages/RegisterPage.jsx | 4 +- 3 files changed, 232 insertions(+), 294 deletions(-) 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} -
- )} -
-
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- -