// ============ Pantallas: Mis Cursos + Detalle de curso ============
function CourseCard({ c, go }) {
const done = c.progress === 100;
const started = c.progress > 0;
const totalLessons = c.modules.reduce((s, m) => s + m.lessons.length, 0);
const doneLessons = c.modules.reduce((s, m) => s + m.lessons.filter((l) => l.done).length, 0);
return (
go("curso", { courseId: c.id })}>
{c.level}
{done &&
Completado}
{c.title}
{c.subtitle}
{c.instructor}
{c.hours}
{doneLessons}/{totalLessons} lecciones
{done ? "Repasar" : started ? "Continuar" : "Empezar"}
);
}
function CourseList({ go, query = "" }) {
const [tab, setTab] = useState("todos");
const q = query.toLowerCase().trim();
const filtered = DATA.courses.filter((c) => {
if (q && !c.title.toLowerCase().includes(q) && !(c.subtitle || "").toLowerCase().includes(q)) return false;
if (tab === "curso") return c.progress > 0 && c.progress < 100;
if (tab === "completados") return c.progress === 100;
if (tab === "nuevos") return c.progress === 0;
return true;
});
const tabs = [["todos", "Todos"], ["curso", "En curso"], ["completados", "Completados"], ["nuevos", "Por empezar"]];
return (
{tabs.map(([id, l]) => (
))}
{filtered.map((c) => )}
);
}
function ModuleRow({ m, courseId, openDefault, go }) {
const [open, setOpen] = useState(openDefault);
const locked = m.state === "locked";
const doneCount = m.lessons.filter((l) => l.done).length;
const allDone = doneCount === m.lessons.length;
return (
{open && !locked && (
{m.lessons.map((l) => {
const meta = TYPE_META[l.type];
return (
);
})}
)}
);
}
function CourseDetail({ courseId, go }) {
const c = DATA.courses.find((x) => x.id === courseId);
const totalLessons = c.modules.reduce((s, m) => s + m.lessons.length, 0);
const doneLessons = c.modules.reduce((s, m) => s + m.lessons.filter((l) => l.done).length, 0);
const activeIdx = c.modules.findIndex((m) => m.state === "active");
return (
{c.level}
{c.title}
{c.subtitle}
{c.instructor}
{c.hours} de contenido
{c.modules.length} módulos
{doneLessons} de {totalLessons} lecciones
{
for (const m of c.modules) for (const l of m.lessons) if (!l.done) return go("leccion", { courseId: c.id, moduleId: m.id, lessonId: l.id });
go("leccion", { courseId: c.id, moduleId: c.modules[0].id, lessonId: c.modules[0].lessons[0].id });
}}>
{c.progress === 0 ? "Empezar curso" : c.progress === 100 ? "Repasar" : "Continuar"}
Contenido del curso
{c.modules.map((m, i) => (
))}
);
}
Object.assign(window, { CourseCard, CourseList, ModuleRow, CourseDetail });