"use client"; import { useEffect, useMemo, useState, useTransition } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { Check, Lock, PlayCircle } from "lucide-react"; import { toggleLessonComplete } from "@/app/(protected)/courses/[slug]/learn/actions"; import ProgressBar from "@/components/ProgressBar"; type ClassroomLesson = { id: string; title: string; description: string; videoUrl: string | null; estimatedDuration: number; }; type ClassroomModule = { id: string; title: string; lessons: ClassroomLesson[]; }; type StudentClassroomClientProps = { courseSlug: string; courseTitle: string; modules: ClassroomModule[]; initialSelectedLessonId: string; initialCompletedLessonIds: string[]; }; export default function StudentClassroomClient({ courseSlug, courseTitle, modules, initialSelectedLessonId, initialCompletedLessonIds, }: StudentClassroomClientProps) { const router = useRouter(); const [isSaving, startTransition] = useTransition(); const [selectedLessonId, setSelectedLessonId] = useState(initialSelectedLessonId); const [completedLessonIds, setCompletedLessonIds] = useState(initialCompletedLessonIds); useEffect(() => { setSelectedLessonId(initialSelectedLessonId); }, [initialSelectedLessonId]); useEffect(() => { setCompletedLessonIds(initialCompletedLessonIds); }, [initialCompletedLessonIds]); const flatLessons = useMemo(() => modules.flatMap((module) => module.lessons), [modules]); const completedSet = useMemo(() => new Set(completedLessonIds), [completedLessonIds]); const totalLessons = flatLessons.length; const completedCount = completedLessonIds.length; const progressPercent = totalLessons > 0 ? Math.round((completedCount / totalLessons) * 100) : 0; const selectedLesson = flatLessons.find((lesson) => lesson.id === selectedLessonId) ?? flatLessons[0] ?? null; const isRestricted = (lessonId: string) => { const lessonIndex = flatLessons.findIndex((lesson) => lesson.id === lessonId); if (lessonIndex <= 0) return false; if (completedSet.has(lessonId)) return false; const previousLesson = flatLessons[lessonIndex - 1]; return !completedSet.has(previousLesson.id); }; const navigateToLesson = (lessonId: string) => { if (isRestricted(lessonId)) return; setSelectedLessonId(lessonId); router.push(`/courses/${courseSlug}/learn?lesson=${lessonId}`, { scroll: false }); }; const handleToggleComplete = async () => { if (!selectedLesson || isSaving) return; const lessonId = selectedLesson.id; const wasCompleted = completedSet.has(lessonId); setCompletedLessonIds((prev) => wasCompleted ? prev.filter((id) => id !== lessonId) : [...prev, lessonId], ); startTransition(async () => { const result = await toggleLessonComplete({ courseSlug, lessonId }); if (!result.success) { setCompletedLessonIds((prev) => wasCompleted ? [...prev, lessonId] : prev.filter((id) => id !== lessonId), ); return; } setCompletedLessonIds((prev) => { if (result.isCompleted) { return prev.includes(lessonId) ? prev : [...prev, lessonId]; } return prev.filter((id) => id !== lessonId); }); router.refresh(); }); }; if (!selectedLesson) { return (

No lessons available yet

This course does not have lessons configured.

); } return (
{"<-"} Back to Course
{selectedLesson.videoUrl ? (

{selectedLesson.title}

{selectedLesson.description ? (

{selectedLesson.description}

) : null}

Duration: {Math.max(1, Math.ceil(selectedLesson.estimatedDuration / 60))} min

); }