import { useEffect, useMemo, useState } from "react"; import { Link as RouterLink } from "react-router-dom"; import { Box, Button, Card, CardContent, Chip, LinearProgress, Stack, Typography } from "@mui/material"; import { listCourses, enroll, getProgress } from "../api/client"; import { CourseOut, ProgressOut } from "../api/types"; export default function CoursesPage() { const [courses, setCourses] = useState([]); const [progress, setProgress] = useState(null); const [error, setError] = useState(null); useEffect(() => { listCourses().then(setCourses).catch((err) => setError(err.message)); getProgress().then(setProgress).catch(() => null); }, []); const progressMap = useMemo(() => { const map: Record = {}; progress?.courses.forEach((c) => { map[c.course_id] = { percent: c.percent, status: c.status }; }); return map; }, [progress]); return ( Courses {progress && } {error && {error}} {courses.map((course) => { const info = progressMap[course.id] || { percent: 0, status: "" }; const isCompleted = info.percent >= 100 || info.status === "passed"; return ( {course.title} {course.description} {Math.round(info.percent)}% complete {isCompleted && } ); })} ); }