import React, { useState, useEffect, useMemo } from 'react'; import { Link } from 'react-router-dom'; import { listMedia, deleteMedia, getFileUrl, // Import getFileUrl mediaTypes // Import mediaTypes } from '../services/pocketbaseService'; import { useAuth } from '../contexts/AuthContext'; import Modal from '../components/Modal'; import MediaForm from '../components/admin/MediaForm'; // Import MediaForm const AdminMediaPage = () => { const [media, setMedia] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [isModalOpen, setIsModalOpen] = useState(false); const [currentMedia, setCurrentMedia] = useState(null); // For editing const [page, setPage] = useState(1); const [totalPages, setTotalPages] = useState(1); const [filterType, setFilterType] = useState(''); // State for type filter const [filterPublished, setFilterPublished] = useState(''); // State for published filter const [sortField, setSortField] = useState('-created'); // State for sorting const { userProfile } = useAuth(); const isAdminOrCritic = userProfile && (userProfile.role === 'admin' || userProfile.is_critic === true); // Define sort options const sortOptions = useMemo(() => [ { value: '-created', label: 'Дата создания (новые)' }, { value: 'created', label: 'Дата создания (старые)' }, { value: '-title', label: 'Название (Я-А)' }, { value: 'title', label: 'Название (А-Я)' }, { value: '-average_rating', label: 'Рейтинг (убыв.)' }, { value: 'average_rating', label: 'Рейтинг (возр.)' }, { value: '-review_count', label: 'Рецензии (убыв.)' }, { value: 'review_count', label: 'Рецензии (возр.)' }, ], []); const fetchMedia = async (currentPage, type, published, sort) => { setLoading(true); setError(null); try { // Pass filter and sort parameters to listMedia const publishedFilter = published === '' ? null : published === 'true'; // Convert string to boolean or null const { data, totalPages } = await listMedia(type || null, currentPage, 20, userProfile, false, publishedFilter, sort); setMedia(data); setTotalPages(totalPages); } catch (err) { console.error("Error fetching media:", err); setError("Не удалось загрузить список контента."); } finally { setLoading(false); } }; useEffect(() => { // Fetch media when page, filter, or sort changes fetchMedia(page, filterType, filterPublished, sortField); }, [page, filterType, filterPublished, sortField, userProfile]); // Add userProfile as dependency const handleDelete = async (id) => { if (window.confirm("Вы уверены, что хотите удалить этот контент?")) { try { await deleteMedia(id); // Refresh the list after deletion fetchMedia(page, filterType, filterPublished, sortField); } catch (err) { console.error("Error deleting media:", err); setError("Не удалось удалить контент."); } } }; const handleCreateClick = () => { setCurrentMedia(null); // Clear currentMedia for creation setIsModalOpen(true); }; const handleEditClick = (mediaItem) => { setCurrentMedia(mediaItem); // Set mediaItem for editing setIsModalOpen(true); }; const handleModalClose = () => { setIsModalOpen(false); setCurrentMedia(null); // Clear currentMedia // Refresh the list after modal close (assuming create/edit happened) fetchMedia(page, filterType, filterPublished, sortField); }; if (!isAdminOrCritic) { return (

У вас нет прав для просмотра этой страницы.

); } if (loading) { return (
); } if (error) { return (
{error}
); } return (

Управление контентом

{/* Filter and Sort Controls */}
{media.length > 0 ? (
{media.map((item) => ( ))}
Постер Название Тип Опубликовано Популярное Рейтинг Рецензии Действия
{item.title} {item.title} {mediaTypes[item.type]?.label || item.type} {item.is_published ? 'Да' : 'Нет'} {item.is_popular ? 'Да' : 'Нет'} {item.average_rating !== null && item.average_rating !== undefined ? item.average_rating.toFixed(1) : 'N/A'} {item.review_count !== null && item.review_count !== undefined ? item.review_count : 0}
) : (
Нет доступного контента.
)} {/* Pagination */} {totalPages > 1 && (
Страница {page} из {totalPages}
)} {/* Media Create/Edit Modal */}
); }; export default AdminMediaPage;