import { useState, useEffect, useCallback } from "react"; import { get, post, put, del } from "../lib/api"; import DataTable, { type Column } from "../components/DataTable"; import Modal from "../components/Modal"; interface GameClass { id: string; name: string; balance: string; roleId: string | null; } interface ClassesResponse { classes: GameClass[]; } export default function Classes() { const [classes, setClasses] = useState([]); const [loading, setLoading] = useState(true); const [modalOpen, setModalOpen] = useState(false); const [editing, setEditing] = useState(null); const [form, setForm] = useState<{ id?: string; name: string; balance: string; roleId: string | null }>({ name: "", balance: "0", roleId: null }); const [saving, setSaving] = useState(false); const fetchClasses = useCallback(() => { setLoading(true); get("/api/classes") .then((data) => setClasses(data.classes)) .catch(() => {}) .finally(() => setLoading(false)); }, []); useEffect(() => { fetchClasses(); }, [fetchClasses]); const openCreate = () => { setEditing(null); setForm({ id: "", name: "", balance: "0", roleId: null }); setModalOpen(true); }; const openEdit = (cls: GameClass) => { setEditing(cls); setForm({ name: cls.name, balance: cls.balance, roleId: cls.roleId }); setModalOpen(true); }; const handleSave = async () => { setSaving(true); try { if (editing) { await put(`/api/classes/${editing.id}`, { name: form.name, balance: form.balance, roleId: form.roleId }); } else { await post("/api/classes", { id: form.id, name: form.name, balance: form.balance, roleId: form.roleId }); } setModalOpen(false); fetchClasses(); } catch (e) { alert(typeof e === "object" && e && "error" in e ? (e as { error: string }).error : "Failed to save"); } finally { setSaving(false); } }; const handleDelete = async (cls: GameClass) => { if (!confirm(`Delete "${cls.name}"?`)) return; await del(`/api/classes/${cls.id}`); fetchClasses(); }; const columns: Column[] = [ { key: "id", header: "ID", className: "w-24" }, { key: "name", header: "Name" }, { key: "balance", header: "Balance", render: (r) => BigInt(r.balance).toLocaleString() }, { key: "roleId", header: "Role ID", render: (r) => r.roleId ?? "—" }, { key: "actions", header: "", className: "w-24", render: (row) => (
), }, ]; return (

Classes

[]} keyField="id" loading={loading} /> setModalOpen(false)} title={editing ? `Edit: ${editing.name}` : "New Class"} actions={ <> } >
{!editing && (
setForm({ ...form, id: e.target.value })} />
)}
setForm({ ...form, name: e.target.value })} />
setForm({ ...form, balance: e.target.value })} />
setForm({ ...form, roleId: e.target.value || null })} />
); }