import React, { useState } from 'react'; import { useQuery } from 'react-query'; import { Link } from 'react-router-dom'; import { useAuth } from '../contexts/AuthContext'; import { coursesAPI } from '../services/api'; import { MagnifyingGlassIcon, PlusIcon, StarIcon, ClockIcon, UserIcon, AcademicCapIcon, } from '@heroicons/react/24/outline'; import LoadingSpinner from '../components/LoadingSpinner'; const Courses = () => { const { isTrainer, isSuperAdmin } = useAuth(); const [search, setSearch] = useState(''); const [category, setCategory] = useState(''); const [level, setLevel] = useState(''); const [sortBy, setSortBy] = useState('createdAt'); const [sortOrder, setSortOrder] = useState('DESC'); const { data: coursesData, isLoading } = useQuery( ['courses', { search, category, level, sortBy, sortOrder }], () => coursesAPI.getAll({ search, category, level, sortBy, sortOrder }), { keepPreviousData: true } ); const { data: categoriesData } = useQuery( ['categories'], () => coursesAPI.getCategories(), { enabled: !isTrainer && !isSuperAdmin } ); const formatPrice = (price) => { return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', }).format(price); }; const formatDuration = (minutes) => { if (!minutes) return 'N/A'; const hours = Math.floor(minutes / 60); const mins = minutes % 60; return hours > 0 ? `${hours}h ${mins}m` : `${mins}m`; }; const getLevelColor = (level) => { const colors = { beginner: 'badge-success', intermediate: 'badge-warning', advanced: 'badge-danger', }; return colors[level] || 'badge-secondary'; }; if (isLoading) { return ; } return (

Courses

{isTrainer || isSuperAdmin ? 'Manage your courses and create new ones' : 'Discover and enroll in courses' }

{(isTrainer || isSuperAdmin) && ( Create Course )}
{/* Filters */}
setSearch(e.target.value)} />
{/* Course Grid */}
{coursesData?.courses?.map((course) => (
{course.thumbnail ? ( {course.title} ) : (
)}

{course.title}

{course.level}

{course.shortDescription || course.description}

{course.trainer?.firstName} {course.trainer?.lastName}
{formatDuration(course.duration)}
{course.rating && (
{course.rating} ({course.totalRatings} ratings)
)}
{formatPrice(course.price)}
{isTrainer || isSuperAdmin ? 'Edit' : 'View Details'}
))}
{/* Empty State */} {coursesData?.courses?.length === 0 && (

No courses found

{search || category || level ? 'Try adjusting your filters' : 'Get started by creating your first course' }

)} {/* Pagination */} {coursesData?.pagination && coursesData.pagination.totalPages > 1 && (
)}
); }; export default Courses;