"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 (
{/* 进度条 */}
学习进度 {completedCount}/{totalLessons} 节 · {progressPercent}%
{/* 导航 */} {/* 标题 */}

{lessonName} {isFreeTrial && ( 试看 )}

时长 {lessonDuration}

{/* 内容区 */} {children} {/* 上/下一节 */}
{prevLesson ? ( 上一节 ) : (
)} {nextLesson ? ( 下一节 ) : ( 返回课程首页 )}
); }