import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { useState, type FormEvent } from "react"; import { api } from "../../api/client"; import { useAuth } from "../../auth/AuthContext"; import { TopBar } from "../../components/TopBar"; import { toast } from "../../components/Toaster"; import { btn, btnPrimary, card, input } from "../../components/ui"; export default function AdminUsers() { const qc = useQueryClient(); const { user: me } = useAuth(); const usersQ = useQuery({ queryKey: ["users"], queryFn: api.listUsers }); const [u, setU] = useState(""); const [p, setP] = useState(""); const [role, setRole] = useState<"member" | "admin">("member"); const create = useMutation({ mutationFn: () => api.createUser(u.trim(), p, role), onSuccess: () => { toast("ok", "用户已创建"); setU(""); setP(""); void qc.invalidateQueries({ queryKey: ["users"] }); }, onError: (e) => toast("err", e instanceof Error ? e.message : "创建失败"), }); const del = useMutation({ mutationFn: (id: number) => api.deleteUser(id), onSuccess: () => { toast("ok", "用户已删除(其阅读进度一并删除)"); void qc.invalidateQueries({ queryKey: ["users"] }); }, onError: (e) => toast("err", e instanceof Error ? e.message : "删除失败"), }); function submit(e: FormEvent) { e.preventDefault(); create.mutate(); } return (
| ID | 用户名 | 角色 | 创建时间 | |
|---|---|---|---|---|
| {x.id} | {x.username} | {x.role} | {x.created_at.slice(0, 19).replace("T", " ")} |