Stage 2: student lesson viewer, Kinescope player, PDF files, prev/next nav, My Courses dashboard

This commit is contained in:
2026-04-07 12:13:12 +05:00
parent 03e3972388
commit 05dd4d1df2
13 changed files with 657 additions and 40 deletions
@@ -2,6 +2,7 @@ import { prisma } from "@/lib/prisma";
import { notFound } from "next/navigation";
import Link from "next/link";
import { LessonEditor } from "@/components/admin/lesson-editor";
import { LessonFilesManager } from "@/components/admin/lesson-files-manager";
interface Props {
params: Promise<{ courseId: string; moduleId: string; lessonId: string }>;
@@ -13,6 +14,7 @@ export default async function LessonEditorPage({ params }: Props) {
const lesson = await prisma.lesson.findUnique({
where: { id: lessonId },
include: {
files: { orderBy: { createdAt: "asc" } },
module: {
include: { course: { select: { title: true } } },
},
@@ -23,31 +25,38 @@ export default async function LessonEditorPage({ params }: Props) {
return (
<div className="p-8 max-w-4xl">
<nav className="text-sm text-slate-400 mb-6">
<Link href="/admin/courses" className="hover:text-slate-600">Курсы</Link>
<nav className="text-xs mb-6 uppercase tracking-widest" style={{ color: "var(--muted-foreground)" }}>
<Link href="/admin/courses" className="hover:underline">Курсы</Link>
<span className="mx-2">/</span>
<Link href={`/admin/courses/${courseId}`} className="hover:text-slate-600">
{lesson.module.course.title}
</Link>
<Link href={`/admin/courses/${courseId}`} className="hover:underline">{lesson.module.course.title}</Link>
<span className="mx-2">/</span>
<Link href={`/admin/courses/${courseId}/modules/${moduleId}`} className="hover:text-slate-600">
{lesson.module.title}
</Link>
<Link href={`/admin/courses/${courseId}/modules/${moduleId}`} className="hover:underline">{lesson.module.title}</Link>
<span className="mx-2">/</span>
<span className="text-slate-700">{lesson.title}</span>
<span style={{ color: "var(--foreground)" }}>{lesson.title}</span>
</nav>
<LessonEditor
lesson={{
id: lesson.id,
title: lesson.title,
kinescopeId: lesson.kinescopeId ?? "",
content: lesson.content as object ?? {},
published: lesson.published,
}}
courseId={courseId}
moduleId={moduleId}
/>
{/* Lesson editor */}
<div className="card-aubade p-6 mb-6">
<LessonEditor
lesson={{
id: lesson.id,
title: lesson.title,
kinescopeId: lesson.kinescopeId ?? "",
content: (lesson.content as object) ?? {},
published: lesson.published,
}}
courseId={courseId}
moduleId={moduleId}
/>
</div>
{/* Files section */}
<div className="card-aubade p-6">
<p className="text-xs font-bold uppercase tracking-widest mb-4" style={{ color: "var(--muted-foreground)" }}>
Файлы и материалы
</p>
<LessonFilesManager lessonId={lessonId} initialFiles={lesson.files} />
</div>
</div>
);
}