import React, { useState, useRef, useEffect } from 'react'; import { useQuery } from 'react-query'; import { Link } from 'react-router-dom'; import { useAuth } from '../contexts/AuthContext'; import { enrollmentsAPI, coursesAPI } from '../services/api'; import { UsersIcon, BookOpenIcon, CalendarIcon, ChartBarIcon, EllipsisVerticalIcon, UserIcon, EyeIcon, XMarkIcon, } from '@heroicons/react/24/outline'; import LoadingSpinner from '../components/LoadingSpinner'; import toast from 'react-hot-toast'; const TrainerStudents = () => { const { user } = useAuth(); const [selectedCourse, setSelectedCourse] = useState('all'); const [showActionsDropdown, setShowActionsDropdown] = useState(null); const dropdownRef = useRef(null); // Close dropdown when clicking outside useEffect(() => { const handleClickOutside = (event) => { if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { setShowActionsDropdown(null); } }; document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, []); // Fetch trainer's courses const { data: coursesData, isLoading: coursesLoading } = useQuery( ['trainer-courses'], () => coursesAPI.getTrainerCourses(user?.id), { enabled: !!user?.id } ); // Fetch enrollments for selected course const { data: enrollmentsData, isLoading: enrollmentsLoading } = useQuery( ['trainer-enrollments', selectedCourse], () => selectedCourse === 'all' ? enrollmentsAPI.getTrainerEnrollments(user?.id) : enrollmentsAPI.getCourseTrainees(selectedCourse), { enabled: !!user?.id && !!selectedCourse } ); const handleRemoveStudent = async (enrollmentId, studentName, courseTitle) => { if (window.confirm(`Are you sure you want to remove ${studentName} from ${courseTitle}?`)) { try { await enrollmentsAPI.delete(enrollmentId); toast.success(`${studentName} removed from ${courseTitle} successfully!`); // Refetch the data window.location.reload(); } catch (error) { toast.error('Failed to remove student from course'); } } }; if (coursesLoading || enrollmentsLoading) return ; const courses = coursesData?.courses || []; const enrollments = enrollmentsData?.enrollments || enrollmentsData?.trainees || []; // Get unique students across all courses const uniqueStudents = enrollments.reduce((acc, enrollment) => { const studentId = enrollment.user?.id || enrollment.userId; if (!acc.find(s => s.id === studentId)) { acc.push({ id: studentId, firstName: enrollment.user?.firstName || enrollment.user?.firstName, lastName: enrollment.user?.lastName || enrollment.user?.lastName, email: enrollment.user?.email || enrollment.user?.email, avatar: enrollment.user?.avatar || enrollment.user?.avatar, enrollments: [] }); } const student = acc.find(s => s.id === studentId); student.enrollments.push({ courseId: enrollment.course?.id || enrollment.courseId, courseTitle: enrollment.course?.title || enrollment.course?.title, status: enrollment.status, enrolledAt: enrollment.enrolledAt, progress: enrollment.progress || 0, enrollmentId: enrollment.id }); return acc; }, []); return (
{/* Header */}

My Students

Manage students enrolled in your courses

{/* Stats Cards */}

Total Students

{uniqueStudents.length}

Total Courses

{courses.length}

Total Enrollments

{enrollments.length}

{/* Course Filter */}
{/* Students List */} {uniqueStudents.length === 0 ? (

No students

{selectedCourse === 'all' ? "You don't have any students enrolled in your courses yet." : "No students are enrolled in this course." }

) : (
{uniqueStudents.map((student) => (
{/* Student Header */}
{student.avatar ? ( {`${student.firstName} ) : (
)}

{student.firstName} {student.lastName}

{student.email}

View Profile {/* Actions Dropdown */}
{showActionsDropdown === student.id && (
)}
{/* Enrollments */}

Course Enrollments

{student.enrollments.map((enrollment) => (
{enrollment.courseTitle}
{enrollment.status}
Enrolled: {new Date(enrollment.enrolledAt).toLocaleDateString()}
Progress: {enrollment.progress}%
))}
))}
)}
); }; export default TrainerStudents;