import Link from "next/link" import { notFound } from "next/navigation" import { ChevronLeft, ChevronRight, List } from "lucide-react" import { Button } from "@/components/ui/button" import { CommentSection } from "@/components/comment-section" import { ReaderFAB } from "@/components/reader-fab" import { ChapterReaderProgress } from "./chapter-reader-progress" import { readerApiFetch, readerApiFetchNullable } from "@/lib/server-api" export const dynamic = "force-dynamic" type NovelDetail = { id: string title: string slug: string } type ChapterDetail = { id: string novelId: string number: number title: string content: string volumeNumber?: number | null volumeTitle?: string | null volumeChapterNumber?: number | null prevChapterNumber?: number | null nextChapterNumber?: number | null maxChapter: number } type CommentsResponse = { comments: Array<{ id: string userId: string username: string content: string chapterId?: string | null createdAt: string | null }> } 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 readerApiFetchNullable(`/api/novels/${encodeURIComponent(slug)}`) if (!novel) { notFound() } const chapter = await readerApiFetchNullable(`/api/truyen/${encodeURIComponent(novel.id)}/chapters/by-number/${chapterNumber}`) if (!chapter) { notFound() } const commentsData = await readerApiFetch( `/api/truyen/${encodeURIComponent(novel.id)}/comments?chapterId=${encodeURIComponent(chapter.id)}&page=1&limit=50` ) const comments = commentsData.comments.map((comment) => ({ id: comment.id, userId: comment.userId, username: comment.username || "User", avatarColor: "bg-primary", novelId: novel.id, chapterId: comment.chapterId || undefined, content: comment.content, createdAt: comment.createdAt ? comment.createdAt.split("T")[0] : "", })) const hasPrev = Boolean(chapter.prevChapterNumber) const hasNext = Boolean(chapter.nextChapterNumber) const paragraphs = chapter.content.split("\n").map((p: string) => p.trim()).filter(Boolean) const chapterLabel = chapter.volumeChapterNumber ? `Chương ${chapter.volumeChapterNumber}` : `Chương ${chapter.number}` const volumeLabel = chapter.volumeTitle || (chapter.volumeNumber ? `Quyển ${chapter.volumeNumber}` : null) return (
{novel.title}

{volumeLabel ? `${volumeLabel} - ` : ""}{chapterLabel}: {chapter.title}

{paragraphs.map((text: string, idx: number) => (

{text}

))}
) }