"use client"; import { useEffect, useState } from "react"; import { lmsApi, Course, Lesson } from "@/lib/api"; import Link from "next/link"; import { useAuth } from "@/context/AuthContext"; import { useRouter } from "next/navigation"; import { Rocket, CheckCircle2, ArrowRight, Star, Calendar, Clock, AlertCircle, Zap, TrendingUp } from "lucide-react"; import Leaderboard from "@/components/Leaderboard"; export default function CatalogPage() { const [courses, setCourses] = useState([]); const [enrollments, setEnrollments] = useState([]); const [loading, setLoading] = useState(true); const [gamification, setGamification] = useState<{ points: number, level: number, badges: any[] } | null>(null); const [upcomingDeadlines, setUpcomingDeadlines] = useState<{ lesson: Lesson, courseTitle: string, courseId: string }[]>([]); const { user } = useAuth(); const router = useRouter(); useEffect(() => { const fetchData = async () => { try { const coursesData = await lmsApi.getCatalog(user?.organization_id, user?.id); setCourses(coursesData); if (user) { const enrollmentData = await lmsApi.getEnrollments(user.id); setEnrollments(enrollmentData.map(e => e.course_id)); const gamificationData = await lmsApi.getGamification(user.id); setGamification(gamificationData); // Fetch deadlines for enrolled courses const deadlines: { lesson: Lesson, courseTitle: string, courseId: string }[] = []; for (const enrollment of enrollmentData) { try { const { course, modules } = await lmsApi.getCourseOutline(enrollment.course_id); modules.forEach(mod => { mod.lessons.forEach(l => { if (l.due_date && new Date(l.due_date) >= new Date()) { deadlines.push({ lesson: l, courseTitle: course.title, courseId: enrollment.course_id }); } }); }); } catch (err) { console.error(`No se pudo cargar el esquema del curso ${enrollment.course_id}`, err); } } setUpcomingDeadlines(deadlines.sort((a, b) => new Date(a.lesson.due_date!).getTime() - new Date(b.lesson.due_date!).getTime()).slice(0, 3)); } } catch (err) { console.error(err); } finally { setLoading(false); } }; fetchData(); }, [user]); const handleEnrollOrBuy = async (course: Course) => { if (!user) { router.push("/auth/login"); return; } try { await lmsApi.enroll(course.id, user.id); setEnrollments(prev => [...prev, course.id]); } catch (err: any) { // Check for 402 Payment Required if (err.message.includes("Payment Required")) { try { const { init_point } = await lmsApi.createPaymentPreference(course.id); window.location.href = init_point; } catch (pErr) { console.error("Falló la creación de preferencia de pago", pErr); alert("No se pudo iniciar el proceso de pago."); } } else { console.error("Falló la inscripción", err); } } }; if (loading) { return (
{[1, 2, 3].map(i => (
))}
); } return (
Currículo Premier

Explorar Cursos

Domina las habilidades del futuro con nuestro contenido educativo de alta fidelidad.

{!user && ( Comienza Gratis )}
{user && gamification && (
{gamification.level}
Posición Actual

Nivel {gamification.level} Pionero

{gamification.points} / {Math.pow(gamification.level, 2) * 100} XP
{Math.floor(((gamification.points - Math.pow(gamification.level - 1, 2) * 100) / (Math.pow(gamification.level, 2) * 100 - Math.pow(gamification.level - 1, 2) * 100)) * 100)}% para el Nivel {gamification.level + 1}
{/* Background Flair */}

Mis Insignias

{gamification.badges.length === 0 ? (

Aún no has ganado insignias. ¡Comienza a aprender para desbloquear logros!

) : ( gamification.badges.map(badge => (
🏆
)) )}
)} {user && upcomingDeadlines.length > 0 && (

Próximos Vencimientos

{upcomingDeadlines.map(({ lesson, courseTitle, courseId }) => (
{lesson.important_date_type || 'Actividad'}
{new Date(lesson.due_date!).toLocaleDateString()}
Vencimiento

{lesson.title}

{courseTitle}

))}
)} {courses.length === 0 ? (

Aún no se han publicado cursos.

) : (
{courses.map((course) => { const isEnrolled = enrollments.includes(course.id); return (
{isEnrolled && ( Inscrito )}

{course.title}

{course.description || "Currículo detallado que cubre desde los principios fundamentales hasta el dominio avanzado, elaborado por veteranos de la industria."}

{isEnrolled ? ( Continuar Aprendiendo ) : ( )}
); })}
)}
); }