import Link from 'next/link' import { CourseActions } from './CourseActions' import { ModuleAccordion } from '@/components/ModuleAccordion' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Progress } from '@/components/ui/progress' import { Play, BookOpen } from 'lucide-react' import { getCourseDisplayName } from '@/lib/course-display' import { formatDuration } from '@/lib/utils' import { prisma } from '@/lib/prisma' interface CoursePageProps { params: Promise<{ slug: string }> } async function getCourse(slug: string) { const course = await prisma.course.findFirst({ where: { slug, hidden: false }, include: { modules: { orderBy: { order: 'asc' }, include: { lessons: { orderBy: { order: 'asc' }, include: { progress: { where: { userId: 'local-user' }, take: 1, }, }, }, }, }, }, }) if (!course) return null const modules = course.modules.map((module) => ({ ...module, lessons: module.lessons.map((lesson) => ({ ...lesson, progress: lesson.progress[0] ? { completed: lesson.progress[0].completed, position: lesson.progress[0].position, lastWatched: lesson.progress[0].lastWatched.toISOString(), } : null, })), })) const allLessons = modules.flatMap((module) => module.lessons) const completedLessons = allLessons.filter((lesson) => lesson.progress?.completed).length const totalLessons = allLessons.length const totalDuration = allLessons.reduce((sum, lesson) => sum + (lesson.duration || 0), 0) const percentage = totalLessons > 0 ? Math.round((completedLessons / totalLessons) * 100) : 0 const latestProgress = await prisma.progress.findFirst({ where: { userId: 'local-user', courseId: course.id, lessonId: { not: null } }, orderBy: { lastWatched: 'desc' }, select: { lessonId: true }, }) return { ...course, modules, stats: { totalLessons, completedLessons, totalDuration, percentage, lastLessonId: latestProgress?.lessonId || null, }, } } export default async function CoursePage({ params }: CoursePageProps) { const { slug } = await params const course = await getCourse(slug) if (!course) return null const courseTitle = getCourseDisplayName(course) const modules = course.modules || [] return (
{course.thumbnail ? ( {courseTitle} ) : (
)}
{modules.length} modules {course.stats.totalLessons} lessons {formatDuration(course.stats.totalDuration)}

{courseTitle}

{course.description &&

{course.description}

}
{course.stats.completedLessons} / {course.stats.totalLessons} lessons completed {course.stats.percentage}%
Course Content
{course.stats.lastLessonId ? ( <>

Ready to continue?

You left off at Lesson {(modules.flatMap((module: any) => module.lessons).find((lesson: any) => lesson.id === course.stats.lastLessonId)?.order ?? 0) + 1}

) : ( <>

Start Learning

Select a lesson from the sidebar to begin.

{modules[0]?.lessons[0] && ( )} )}
) }