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 (

用户管理

setU(e.target.value)} /> setP(e.target.value)} />
{(usersQ.data ?? []).map((x) => ( ))}
ID 用户名 角色 创建时间
{x.id} {x.username} {x.role} {x.created_at.slice(0, 19).replace("T", " ")}
); }