{lessonName} {isFreeTrial && ( 试看 )}
时长 {lessonDuration}
{/* 内容区 */} {children} {/* 上/下一节 */}"use client"; import { useEffect, useCallback } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import type { CourseConfig } from "@/lib/content/config"; type LessonLayoutProps = { courseConfig: CourseConfig; moduleIndex: number; lessonIndex: number; lessonName: string; lessonDuration: string; isFreeTrial: boolean; unlocked: boolean; totalLessons: number; completedCount: number; prevLesson: { moduleIndex: number; lessonIndex: number } | null; nextLesson: { moduleIndex: number; lessonIndex: number } | null; courseHomeHref: string; payHref: string; children: React.ReactNode; }; export function LessonLayout({ courseConfig, moduleIndex, lessonIndex, lessonName, lessonDuration, isFreeTrial, unlocked, totalLessons, completedCount, prevLesson, nextLesson, courseHomeHref, payHref, children, }: LessonLayoutProps) { const router = useRouter(); const courseBase = courseHomeHref.replace(/\/$/, ""); const lessonBase = courseBase.includes("/course") ? courseBase : `${courseBase}/course`; const progressPercent = totalLessons > 0 ? Math.round((completedCount / totalLessons) * 100) : 0; const handleKeyDown = useCallback( (e: KeyboardEvent) => { if (e.target && (e.target as HTMLElement).tagName === "INPUT") return; if (e.key === "ArrowLeft" && prevLesson) { router.push(`${lessonBase}/${prevLesson.moduleIndex}/${prevLesson.lessonIndex}`); } else if (e.key === "ArrowRight" && nextLesson) { router.push(`${lessonBase}/${nextLesson.moduleIndex}/${nextLesson.lessonIndex}`); } }, [prevLesson, nextLesson, lessonBase, router] ); useEffect(() => { window.addEventListener("keydown", handleKeyDown); return () => window.removeEventListener("keydown", handleKeyDown); }, [handleKeyDown]); return (
时长 {lessonDuration}
{/* 内容区 */} {children} {/* 上/下一节 */}