import Link from "next/link"; import { BookOpenCheck, Clock3, UserRound } from "lucide-react"; import { cn } from "@/lib/utils"; import type { CatalogCourseCardView } from "@/lib/courses/publicCourses"; type CourseCardProps = { course: CatalogCourseCardView; }; const stageVisuals: Record = { base: "from-[#eadbc9] via-[#f4e9dc] to-[#fdf8f2]", consolidacion: "from-[#e7ddd0] via-[#f3ece2] to-[#fdf9f3]", especializacion: "from-[#e4d6dd] via-[#f2e8ee] to-[#fdf9fc]", }; const availabilityClass: Record = { published: "border-emerald-300/70 bg-emerald-50 text-emerald-800 dark:border-emerald-700/40 dark:bg-emerald-900/30 dark:text-emerald-200", upcoming: "border-amber-300/70 bg-amber-50 text-amber-800 dark:border-amber-700/50 dark:bg-amber-900/30 dark:text-amber-200", draft: "border-slate-300/70 bg-slate-100 text-slate-700 dark:border-slate-700/60 dark:bg-slate-800/70 dark:text-slate-200", }; function getInitials(title: string): string { return title .split(" ") .filter(Boolean) .slice(0, 2) .map((chunk) => chunk[0]?.toUpperCase() ?? "") .join(""); } function getCtaLabel(course: CatalogCourseCardView): string { if (course.availabilityState === "upcoming") return "Ver programa"; if (course.isEnrolled && course.progressPercent > 0 && course.progressPercent < 100) return "Continuar"; return "Conocer programa"; } export default function CourseCard({ course }: CourseCardProps) { return (
{course.thumbnailUrl ? ( {`Portada ) : (
{getInitials(course.title)}
)}
{course.stageLabel} {course.availabilityLabel}

{course.title}

{course.shortDescription}

{course.durationLabel}
{course.lessonCount} lecciones
{course.instructor}
{course.isEnrolled ? (
Progreso {course.progressPercent}%
) : null}
{course.studentsCount.toLocaleString()} inscritos {getCtaLabel(course)}
); }