"use client"; import React, { useEffect, useState } from "react"; import { FolderTree, Edit3, Trash2, Plus, ChevronRight, ChevronDown, } from "lucide-react"; import { createCategory, deleteCategory, getTree, updateCategory } from "@/lib/categories.api"; import { slugify } from "@/lib/slug"; interface Category { id: string; name: string; slug: string; parentId?: string | null; children?: Category[]; } export default function ManageCategoryClient() { const [tree, setTree] = useState([]); const [loading, setLoading] = useState(false); const [modalOpen, setModalOpen] = useState(false); const [form, setForm] = useState({ id: null as string | null, name: "", slug: "", parentId: null as string | null, }); async function load() { setLoading(true); try { const t = await getTree(); setTree(t); } finally { setLoading(false); } } useEffect(() => { load(); }, []); async function save() { const payload = { name: form.name, slug: form.slug || slugify(form.name), parentId: form.parentId, }; if (form.id) { await updateCategory(form.id, payload); } else { await createCategory(payload); } closeModal(); load(); } async function remove(id: string) { if (!confirm("Delete this category?")) return; await deleteCategory(id); load(); } function openCreate(parentId?: string) { setForm({ id: null, name: "", slug: "", parentId: parentId || null, }); setModalOpen(true); } function openEdit(cat: Category) { setForm({ id: cat.id, name: cat.name, slug: cat.slug, parentId: cat.parentId || null, }); setModalOpen(true); } function closeModal() { setModalOpen(false); setForm({ id: null, name: "", slug: "", parentId: null }); } function TreeNode({ node, level = 0, }: { node: Category; level?: number; }) { const [open, setOpen] = useState(true); return (
openEdit(node)} className="text-sm font-medium cursor-pointer hover:text-blue-600" > {node.name}
{open && node.children?.map((child) => )}
); } return ( <>

Categories

{loading ? (

Loading...

) : ( tree.map((node) => ) )}
{modalOpen && (

{form.id ? "Edit Category" : "Create Category"}

setForm({ ...form, name: e.target.value, slug: slugify(e.target.value), }) } /> setForm({ ...form, slug: e.target.value })} />
)} ); }