import { prisma } from "@/lib/prisma"; import Link from "next/link"; import { notFound } from "next/navigation"; interface Props { params: Promise<{ courseSlug: string; moduleId: string }>; } export default async function ModulePage({ params }: Props) { const { courseSlug, moduleId } = await params; const moduleData = await prisma.module.findFirst({ where: { id: moduleId, course: { slug: courseSlug }, }, include: { course: true, }, }); if (!moduleData) return notFound(); const quiz = moduleData.quizData ? JSON.parse(moduleData.quizData) : null; return (
{/* Breadcrumb */}
Learn / {moduleData.course.title} / {moduleData.title}
{/* Header */}
Module {moduleData.order}

{moduleData.title}

{moduleData.description}

{/* Content */}
{/* Quiz */} {quiz && quiz.length > 0 && (

Quick Check

{quiz.map((q: any, i: number) => (

{i + 1}. {q.question}

{q.options.map((opt: string, j: number) => ( ))}
))}
)} {/* Navigation */}
← All Courses
); } // Simple markdown renderer (production should use a proper library) function renderMarkdown(md: string): string { return md .replace(/## 🎯 Key Concept/g, '

🎯 Key Concept

') .replace(/## 📖 Details/g, '

📖 Details

') .replace(/## 🤔 Reflection/g, '

🤔 Reflection

') .replace(/## ⚡ Action Step/g, '

⚡ Action Step

') .replace(/## /g, '

') .replace(/\*\*(.*?)\*\*/g, '$1') .replace(/\n\n/g, '

') .replace(/\n/g, '
') .replace(/^/, '

') .replace(/$/, '

'); }