"use client"; import { useEffect, useState } from "react"; import Link from "next/link"; import { useParams } from "next/navigation"; import LessonRow from "@/components/LessonRow"; import ProgressBar from "@/components/ProgressBar"; import { getCourseBySlug } from "@/lib/data/courseCatalog"; import { getCourseProgress, getCourseProgressPercent, markLessonComplete, setLastLesson, } from "@/lib/progress/localProgress"; import { teacherCoursesUpdatedEventName } from "@/lib/data/teacherCourses"; import { supabaseBrowser } from "@/lib/supabase/browser"; import type { Course, Lesson } from "@/types/course"; const lessonContent = (lesson: Lesson) => { if (lesson.type === "video") { return (
Video placeholder ({lesson.minutes} min)
{lesson.videoUrl ? (

Demo video URL: {lesson.videoUrl}

) : null}
); } if (lesson.type === "reading") { return (

Reading placeholder content for lesson: {lesson.title}. Replace with full lesson text and references in Phase 2.

); } return (

Interactive placeholder for lesson: {lesson.title}.

); }; export default function CourseLearnPage() { const params = useParams<{ slug: string }>(); const slug = params.slug; const [course, setCourse] = useState(() => getCourseBySlug(slug)); const [hasResolvedCourse, setHasResolvedCourse] = useState(false); const [userId, setUserId] = useState("guest"); const [isAuthed, setIsAuthed] = useState(false); const [selectedLessonId, setSelectedLessonId] = useState(null); const [completedLessonIds, setCompletedLessonIds] = useState([]); const [progress, setProgress] = useState(0); useEffect(() => { const loadCourse = () => { setCourse(getCourseBySlug(slug)); setHasResolvedCourse(true); }; loadCourse(); window.addEventListener(teacherCoursesUpdatedEventName, loadCourse); return () => window.removeEventListener(teacherCoursesUpdatedEventName, loadCourse); }, [slug]); useEffect(() => { const client = supabaseBrowser(); if (!client) return; client.auth.getUser().then(({ data }) => { setUserId(data.user?.id ?? "guest"); setIsAuthed(Boolean(data.user)); }); const { data } = client.auth.onAuthStateChange((_event, session) => { setUserId(session?.user?.id ?? "guest"); setIsAuthed(Boolean(session?.user)); }); return () => data.subscription.unsubscribe(); }, []); useEffect(() => { if (!course) return; const progressState = getCourseProgress(userId, course.slug); const fallback = course.lessons[0]?.id ?? null; setSelectedLessonId(progressState.lastLessonId ?? fallback); setCompletedLessonIds(progressState.completedLessonIds); setProgress(getCourseProgressPercent(userId, course.slug, course.lessons.length)); }, [course, userId]); const completionSet = new Set(completedLessonIds); if (!course && !hasResolvedCourse) { return (

Loading course...

); } if (!course) { return (

Course not found

The requested course slug does not exist in mock data.

Back to courses
); } const selectedLesson = course.lessons.find((lesson) => lesson.id === selectedLessonId) ?? course.lessons[0]; if (!selectedLesson) { return (

No lessons available

This course currently has no lessons configured.

Back to course
); } const isLocked = (lesson: Lesson) => !lesson.isPreview && !isAuthed; const onSelectLesson = (lesson: Lesson) => { if (isLocked(lesson)) return; setSelectedLessonId(lesson.id); setLastLesson(userId, course.slug, lesson.id); }; const onMarkComplete = () => { if (!selectedLesson) return; markLessonComplete(userId, course.slug, selectedLesson.id); const progressState = getCourseProgress(userId, course.slug); setCompletedLessonIds(progressState.completedLessonIds); setProgress(getCourseProgressPercent(userId, course.slug, course.lessons.length)); }; return (
{"<-"} Back to Course

Course Content

{course.lessons.map((lesson, index) => (
onSelectLesson(lesson)} /> {completionSet.has(lesson.id) ? (

Completed

) : null}
))}

{selectedLesson.title}

{selectedLesson.type} | {selectedLesson.minutes} min

{lessonContent(selectedLesson)}
); }