"use client"; import { useState, useEffect } from "react"; import Link from "next/link"; import { Section } from "../Section"; import { CURRICULUM_CONFIG } from "../../config/course"; import { canWatchLesson } from "../../lib/payment"; import { isBookmarked, toggleBookmark, getBookmarks, getCompletedLessons } from "../../lib/learning"; export function CurriculumSection() { const [expanded, setExpanded] = useState>(() => Object.fromEntries(CURRICULUM_CONFIG.modules.map((_, i) => [i, i === 0])) ); const [bookmarks, setBookmarks] = useState>(new Set()); const [completed, setCompleted] = useState>(new Set()); useEffect(() => { setBookmarks(getBookmarks()); setCompleted(getCompletedLessons()); const onB = () => setBookmarks(getBookmarks()); const onP = () => setCompleted(getCompletedLessons()); window.addEventListener("learning:bookmarks", onB); window.addEventListener("learning:progress", onP); return () => { window.removeEventListener("learning:bookmarks", onB); window.removeEventListener("learning:progress", onP); }; }, []); const toggle = (i: number) => { setExpanded((prev) => ({ ...prev, [i]: !prev[i] })); }; const allLessons = CURRICULUM_CONFIG.modules.flatMap((m, mi) => m.lessons.map((l, li) => ({ moduleIndex: mi, lessonIndex: li, ...l, moduleTitle: m.title })) ); const filteredByModule = CURRICULUM_CONFIG.modules.map((m, mi) => ({ ...m, lessons: allLessons.filter((l) => l.moduleIndex === mi), })); return (

{CURRICULUM_CONFIG.title}

{CURRICULUM_CONFIG.subtitle}

{filteredByModule.map((c, i) => { const moduleIndex = CURRICULUM_CONFIG.modules.findIndex((m) => m.title === c.title); const isOpen = expanded[moduleIndex] ?? true; return (
{isOpen && (
    {c.lessons.map((l) => { const free = false; /* 暂时全部加锁 */ const unlocked = canWatchLesson(l.moduleIndex, l.lessonIndex); const key = `${l.moduleIndex}-${l.lessonIndex}`; const bookmarked = isBookmarked(l.moduleIndex, l.lessonIndex); const isCompleted = completed.has(key); return (
  • {l.name} {free && ( 试看 )} {isCompleted && ( )} {!unlocked && ( 🔒 )} {l.duration}
  • ); })}
)}
); })}
); }