import React, { useState, useEffect, useCallback } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { useAuth } from '../../contexts/AuthContext'; import { getMediaById, // To get the parent media title getSeasonsByMediaId, createSeason, updateSeason, deleteSeason, getFileUrl, // To display season posters uploadFile, // To upload season posters deleteFile // To delete season posters } from '../../services/pocketbaseService'; import Modal from '../../components/common/Modal'; import DatePicker from 'react-datepicker'; // Assuming you have react-datepicker installed import "react-datepicker/dist/react-datepicker.css"; // Import styles import { FaEdit, FaTrashAlt, FaPlus } from 'react-icons/fa'; // Import icons // Season Form Component (can be reused for Add and Edit) const SeasonForm = ({ season, mediaId, onSubmit, onCancel, isSubmitting, error }) => { const { user } = useAuth(); // Get current user for created_by const [formData, setFormData] = useState({ season_number: '', title: '', overview: '', release_date: null, // poster: null, // File object for new upload - Handled by separate state is_published: false, // media_id and created_by will be added in onSubmit handler }); const [currentPosterUrl, setCurrentPosterUrl] = useState(null); // To display existing poster const [posterFile, setPosterFile] = useState(null); // State for the selected file input const [deleteExistingPoster, setDeleteExistingPoster] = useState(false); // State to track if existing poster should be deleted useEffect(() => { console.log('SeasonForm useEffect: season changed', season); if (season) { // Pre-fill form for editing setFormData({ season_number: season.season_number || '', title: season.title || '', overview: season.overview || '', release_date: season.release_date ? new Date(season.release_date) : null, // poster: null, // Clear file input state - Handled by separate state is_published: season.is_published ?? false, }); // Set current poster URL if exists setCurrentPosterUrl(season.poster ? getFileUrl(season, 'poster') : null); setPosterFile(null); // Clear file input setDeleteExistingPoster(false); // Reset delete flag } else { // Reset form for adding setFormData({ season_number: '', title: '', overview: '', release_date: null, // poster: null, is_published: false, }); setCurrentPosterUrl(null); setPosterFile(null); setDeleteExistingPoster(false); } }, [season]); const handleChange = (e) => { const { name, value, type, checked } = e.target; setFormData(prev => ({ ...prev, [name]: type === 'checkbox' ? checked : value })); }; const handleDateChange = (date) => { setFormData(prev => ({ ...prev, release_date: date })); }; const handleFileChange = (e) => { const file = e.target.files?.[0] || null; setPosterFile(file); // Store the file object // If a new file is selected, don't delete the existing one if (file) { setDeleteExistingPoster(false); } }; const handleRemoveExistingPoster = () => { setCurrentPosterUrl(null); // Hide the current poster preview setDeleteExistingPoster(true); // Mark for deletion on submit setPosterFile(null); // Ensure no new file is selected }; const handleSubmit = async (e) => { e.preventDefault(); // Basic validation if (!formData.season_number || isNaN(parseInt(formData.season_number)) || parseInt(formData.season_number) <= 0) { alert('Номер сезона обязателен и должен быть положительным числом.'); return; } // Create FormData for PocketBase const dataToSend = new FormData(); dataToSend.append('media_id', mediaId); // Link to parent media dataToSend.append('season_number', parseInt(formData.season_number)); // Ensure number type dataToSend.append('title', formData.title || ''); dataToSend.append('overview', formData.overview || ''); if (formData.release_date) { // PocketBase expects ISO string for datetime/date fields dataToSend.append('release_date', formData.release_date.toISOString()); } else { // Append empty string or null if date is optional and not set // PocketBase handles empty string for optional date fields dataToSend.append('release_date', ''); } dataToSend.append('is_published', formData.is_published); dataToSend.append('created_by', user.id); // Set creator to current user // Handle poster file upload or deletion if (posterFile) { // Append the new file dataToSend.append('poster', posterFile); } else if (deleteExistingPoster) { // If no new file and delete flag is true, signal deletion // For FormData, set the file field to an empty string or empty FileList // Empty string is simpler for single file fields dataToSend.append('poster', ''); // Signal deletion } // If no new file and not deleting, do not append 'poster' field at all // This prevents PocketBase from trying to update it if it's unchanged onSubmit(dataToSend); // Pass FormData to parent handler }; return (
{error && (
Ошибка: {error}
)} {/* Season Number */}
{/* Title */}
{/* Overview */}