"use client" import { useEffect, useMemo, useState } from "react" import { Layers, Loader2, Pencil, Plus, Save, Trash2, X } from "lucide-react" import { toast } from "sonner" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Textarea } from "@/components/ui/textarea" interface SeriesItem { id: string name: string slug: string description?: string | null _count?: { novels: number } } export function SeriesClient() { const [series, setSeries] = useState([]) const [loading, setLoading] = useState(true) const [submitting, setSubmitting] = useState(false) const [name, setName] = useState("") const [description, setDescription] = useState("") const [editingId, setEditingId] = useState(null) const [keyword, setKeyword] = useState("") const filteredSeries = useMemo(() => { const q = keyword.trim().toLowerCase() if (!q) return series return series.filter((item) => { return ( item.name.toLowerCase().includes(q) || item.slug.toLowerCase().includes(q) || (item.description || "").toLowerCase().includes(q) ) }) }, [keyword, series]) const fetchSeries = async () => { try { const res = await fetch("/api/mod/series") if (!res.ok) throw new Error("Không thể tải danh sách series") const data = await res.json() setSeries(data) } catch (error: any) { toast.error(error.message || "Không thể tải danh sách series") } finally { setLoading(false) } } useEffect(() => { fetchSeries() }, []) const resetForm = () => { setEditingId(null) setName("") setDescription("") } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!name.trim()) { toast.error("Vui lòng nhập tên series") return } setSubmitting(true) try { const payload = { id: editingId, name: name.trim(), description: description.trim(), } const res = await fetch("/api/mod/series", { method: editingId ? "PUT" : "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload), }) const data = await res.json() if (!res.ok) { throw new Error(data.error || "Không thể lưu series") } toast.success(editingId ? "Đã cập nhật series" : "Đã tạo series") resetForm() fetchSeries() } catch (error: any) { toast.error(error.message || "Không thể lưu series") } finally { setSubmitting(false) } } const handleEdit = (item: SeriesItem) => { setEditingId(item.id) setName(item.name) setDescription(item.description || "") } const handleDelete = async (id: string) => { if (!confirm("Bạn chắc chắn muốn xóa series này?")) return setSubmitting(true) try { const res = await fetch(`/api/mod/series?id=${id}`, { method: "DELETE" }) const data = await res.json() if (!res.ok) { throw new Error(data.error || "Không thể xóa series") } toast.success("Đã xóa series") if (editingId === id) resetForm() fetchSeries() } catch (error: any) { toast.error(error.message || "Không thể xóa series") } finally { setSubmitting(false) } } return (

Quản lý series

setKeyword(e.target.value)} placeholder="Tìm series..." className="max-w-xs" />

{editingId ? "Chỉnh sửa series" : "Tạo series mới"}

setName(e.target.value)} placeholder="Ví dụ: Overlord" />