{text}
))}import Link from "next/link" import { notFound } from "next/navigation" import { ChevronLeft, ChevronRight, List } from "lucide-react" import { Button } from "@/components/ui/button" import { ReadingSettings } from "@/components/reading-settings" import { CommentSection } from "@/components/comment-section" import { TTSPlayer } from "@/components/tts-player" import { ChapterReaderProgress } from "./chapter-reader-progress" import { prisma } from "@/lib/prisma" import connectToMongoDB from "@/lib/mongoose" import { Chapter as ChapterModel } from "@/lib/models/chapter" export default async function ChapterReaderPage({ params }: { params: Promise<{ slug: string; chapterId: string }> }) { const { slug, chapterId } = await params const chapterNumber = parseInt(chapterId, 10) if (isNaN(chapterNumber)) { notFound() } const novel = await prisma.novel.findUnique({ where: { slug } }) if (!novel) { notFound() } await connectToMongoDB() const chapter = await ChapterModel.findOne({ novelId: novel.id, number: chapterNumber }).lean() if (!chapter) { notFound() } const maxChapter = await ChapterModel.countDocuments({ novelId: novel.id }) const commentsData = await prisma.comment.findMany({ where: { novelId: novel.id, chapterId: chapter._id.toString() }, include: { user: true }, orderBy: { createdAt: "desc" } }) const comments = commentsData.map(c => ({ id: c.id, userId: c.user.id, username: c.user.name || "User", avatarColor: c.user.image || "bg-primary", novelId: c.novelId, chapterId: c.chapterId, content: c.content, createdAt: c.createdAt.toISOString().split("T")[0] })) // Increment views quietly (fire and forget to not block render) Promise.all([ ChapterModel.updateOne({ _id: chapter._id }, { $inc: { views: 1 } }), prisma.novel.update({ where: { id: novel.id }, data: { views: { increment: 1 } } }).catch(e => console.error("Error incrementing novel views:", e)) ]).catch(e => console.error("Error updating views:", e)) const hasPrev = chapterNumber > 1 const hasNext = chapterNumber < maxChapter // Extract paragraphs for TTS const paragraphs = chapter.content.split("\n").map((p: string) => p.trim()).filter(Boolean) return (
{text}
))}