'use client'; import { Button } from "@/components/ui/button"; import { Skeleton } from "@/components/ui/skeleton"; import { Table, TableBody, TableCaption, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { TooltipContent, TooltipProvider, TooltipTrigger, Tooltip } from "@/components/ui/tooltip"; import { useUserList } from "@/hooks/admin/user/use-user-list"; import { useState } from "react"; import { UserInfoEditor } from "./components/user-info-editor"; import { User } from "@/lib/types/user"; import { CreateUserEditor } from "./components/create-user-editor"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from "@/components/ui/alert-dialog"; import { AdminApi } from "@/lib/api"; import { toast } from "sonner"; import { ApiError } from "next/dist/server/api-utils"; export default function Page() { const { users, isLoading, error, total, page, pageSize, mutate, refresh } = useUserList(); const [editorUserId, setEditorUserId] = useState(""); const handleUserUpdateLocal = async (newUser: User) => { await mutate( (data) => { if (!data) return data; return { ...data, items: data.items.map((user) => user.userId === newUser.userId ? newUser : user ), }; }, { revalidate: false, } ) } const handleUserDeleteLocal = async (userId: string, soft: boolean) => { await mutate( (data) => { if (!data) return data; return soft ? { ...data, items: data.items.map(u => u.userId === userId ? { ...u, deletedAt: new Date().toLocaleString() } : u) } : { ...data, items: data.items.filter((user) => user.userId !== userId), }; }, { revalidate: false, } ) } const [deletedUserId, setDeletedUserId] = useState(''); const handleUserDelete = async (userId: string) => { try { await AdminApi.user.remove(userId, false); toast.success('删除成功'); handleUserDeleteLocal(userId, false); setDeletedUserId(''); } catch (error) { toast.error((error as ApiError).message || '删除失败'); } } return ( <>