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 { toast } from "../../components/Toaster"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from "@/components/ui/alert-dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Skeleton } from "@/components/ui/skeleton"; 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.isPending ? ( ) : ( ID 用户名 角色 创建时间 {(usersQ.data ?? []).map((x) => ( {x.id} {x.username} {x.role} {x.created_at.slice(0, 19).replace("T", " ")} 删除用户 {x.username}? 该用户的阅读进度与书签一并删除。 取消 del.mutate(x.id)}> 删除 ))}
)}
); }