import React, { useState, useEffect } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; import { useQuery, useMutation, useQueryClient } from 'react-query'; import { useAuth } from '../contexts/AuthContext'; import { coursesAPI } from '../services/api'; import { AcademicCapIcon, ClockIcon, CurrencyDollarIcon, BookOpenIcon, TagIcon, UserGroupIcon, } from '@heroicons/react/24/outline'; import LoadingSpinner from '../components/LoadingSpinner'; import toast from 'react-hot-toast'; const CourseEdit = () => { const { id } = useParams(); const navigate = useNavigate(); const { isTrainer, isSuperAdmin } = useAuth(); const queryClient = useQueryClient(); const [loading, setLoading] = useState(false); const [formData, setFormData] = useState(null); // Course image upload state const [imageFile, setImageFile] = useState(null); const [imagePreview, setImagePreview] = useState(null); const [uploadingImage, setUploadingImage] = useState(false); const handleImageChange = (e) => { const f = e.target.files[0]; setImageFile(f); setImagePreview(f ? URL.createObjectURL(f) : null); }; const handleImageUpload = async () => { if (!imageFile || !formData?.title) return; setUploadingImage(true); try { await coursesAPI.uploadCourseImage(formData.title.replace(/\s+/g, '-').toLowerCase(), imageFile); toast.success('Course image uploaded!'); setImageFile(null); setImagePreview(null); } catch (err) { toast.error('Upload failed'); } finally { setUploadingImage(false); } }; const { data: courseData, isLoading, error } = useQuery( ['course', id], () => coursesAPI.getById(id), { enabled: !!id } ); useEffect(() => { if (courseData && courseData.course) { const c = courseData.course; setFormData({ title: c.title || '', description: c.description || '', shortDescription: c.shortDescription || '', price: c.price || 0, duration: c.duration || '', level: c.level || 'beginner', category: c.category || '', tags: c.tags ? c.tags.join(', ') : '', requirements: c.requirements || '', learningOutcomes: c.learningOutcomes || '', maxStudents: c.maxStudents || '', startDate: c.startDate ? c.startDate.slice(0, 10) : '', endDate: c.endDate ? c.endDate.slice(0, 10) : '', isPublished: c.isPublished || false, isFeatured: c.isFeatured || false, }); } }, [courseData]); const updateCourseMutation = useMutation( (data) => coursesAPI.update(id, data), { onSuccess: () => { queryClient.invalidateQueries(['courses']); queryClient.invalidateQueries(['course', id]); toast.success('Course updated successfully!'); navigate(`/courses/${id}`); }, onError: (error) => { toast.error(error.response?.data?.error || 'Failed to update course'); setLoading(false); }, } ); const handleSubmit = async (e) => { e.preventDefault(); setLoading(true); const courseData = { ...formData, price: parseFloat(formData.price), duration: formData.duration ? parseInt(formData.duration) : null, maxStudents: formData.maxStudents ? parseInt(formData.maxStudents) : null, tags: formData.tags ? formData.tags.split(',').map(tag => tag.trim()) : [], startDate: formData.startDate || null, endDate: formData.endDate || null, }; updateCourseMutation.mutate(courseData); }; const handleInputChange = (e) => { const { name, value, type, checked } = e.target; setFormData(prev => ({ ...prev, [name]: type === 'checkbox' ? checked : value })); }; if (!isTrainer && !isSuperAdmin) { return (

Access Denied

You don't have permission to edit courses.

); } if (isLoading || !formData) { return ; } if (error) { return (

Error loading course

Failed to load course details.

Error: {error.message}

); } return (

Edit Course

Update the details below and save your changes

{/* Basic Information */}

Basic Information