"use client" import { useState, useEffect, Suspense } from "react" import { useSearchParams } from "next/navigation" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Textarea } from "@/components/ui/textarea" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { FileText, Loader2, Plus, ArrowLeft } from "lucide-react" import { toast } from "sonner" import Link from "next/link" interface Chapter { _id: string number: number title: string views: number createdAt: string } function ChapterManager() { const searchParams = useSearchParams() const novelId = searchParams.get("novelId") const [chapters, setChapters] = useState([]) const [loading, setLoading] = useState(true) const [openAdd, setOpenAdd] = useState(false) const [submitting, setSubmitting] = useState(false) // Form states const [number, setNumber] = useState("") const [title, setTitle] = useState("") const [content, setContent] = useState("") const fetchChapters = async () => { if (!novelId) return try { const res = await fetch(`/api/mod/chuong?novelId=${novelId}`) if (!res.ok) throw new Error("Lỗi fetch") const data = await res.json() setChapters(data) if (data.length > 0) { setNumber((data[data.length - 1].number + 1).toString()) } else { setNumber("1") } } catch { toast.error("Không tải được danh sách chương") } finally { setLoading(false) } } useEffect(() => { fetchChapters() }, [novelId]) const handleAddSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!number || !title || !content || !novelId) { toast.error("Vui lòng điền đầy đủ") return } setSubmitting(true) try { const res = await fetch("/api/mod/chuong", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ novelId, number: parseInt(number), title, content }), }) const resData = await res.json() if (!res.ok) throw new Error(resData.error || "Thêm mới thất bại") toast.success("Đã đăng chương mới thành công!") setOpenAdd(false) setTitle("") setContent("") setNumber((parseInt(number) + 1).toString()) fetchChapters() } catch (error: any) { toast.error(error.message) } finally { setSubmitting(false) } } if (!novelId) { return (
Vui lòng chọn một truyện từ mục Quản lý truyện để xem danh sách chương.
) } return (

Quản lý chương

Đăng Chương Mới Thêm nội dung một chương truyện để gửi đến độc giả.
setNumber(e.target.value)} required />
setTitle(e.target.value)} placeholder="Ví dụ: Thiếu niên kỳ bạt" required autoFocus />