"use client"; import Link from "next/link"; import { useParams } from "next/navigation"; import { useEffect, useState } from "react"; import ProgressBar from "@/components/ProgressBar"; import { getCourseBySlug } from "@/lib/data/courseCatalog"; import { getCourseProgressPercent, progressUpdatedEventName } from "@/lib/progress/localProgress"; import { teacherCoursesUpdatedEventName } from "@/lib/data/teacherCourses"; import { supabaseBrowser } from "@/lib/supabase/browser"; import type { Course } from "@/types/course"; export default function CourseDetailPage() { 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 [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 }) => { const nextId = data.user?.id ?? "guest"; setUserId(nextId); 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 load = () => setProgress(getCourseProgressPercent(userId, course.slug, course.lessons.length)); load(); window.addEventListener(progressUpdatedEventName, load); return () => window.removeEventListener(progressUpdatedEventName, load); }, [course, userId]); 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 redirect = `/courses/${course.slug}/learn`; const loginUrl = `/auth/login?redirectTo=${encodeURIComponent(redirect)}`; return (
{"<-"} Back to Courses
{course.level} Contract Law

{course.title}

{course.summary}

Rating {course.rating.toFixed(1)} {course.students.toLocaleString()} students {course.weeks} weeks {course.lessonsCount} lessons
); }