"use client" import {useEffect, useState} from "react" import {Button} from "@/components/ui/button" import {Switch} from "@/components/ui/switch" import {Separator} from "@/components/ui/separator" import {Table, TableBody, TableCell, TableHead, TableHeader, TableRow} from "@/components/ui/table" import {Sheet, SheetContent, SheetTitle} from "@/components/ui/sheet" import {Badge} from "@/components/ui/badge" import {Avatar, AvatarFallback, AvatarImage} from "@/components/ui/avatar" import { ChevronDown, ChevronLeft, ChevronRight, Eye, Filter, Globe, Layers, Loader2, Mail, MapPin, Plus, Search, ShieldCheck, Smartphone, Trash2, UserCheck, UserX, VenusAndMars, X } from "lucide-react" import {Tooltip, TooltipContent, TooltipProvider, TooltipTrigger} from "@/components/ui/tooltip" import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from "@/components/ui/alert-dialog" import {AdminUser} from "@/lib/services" import {cn, formatDateTime} from "@/lib/utils" import {EmptyStateWithBorder} from "@/components/layout/empty" import {LoadingStateWithBorder} from "@/components/layout/loading" import {ErrorInline} from "@/components/layout/error" import {DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger} from "@/components/ui/dropdown-menu" import {useAdminUsers} from "@/contexts/admin-users-context" import {CreateUserModal} from "./create-user-modal" export function UsersManager() { const { users, total, loading, error, page, pageSize, searchUserId, searchUsername, statusFilter, setPage, setPageSize, setSearchUserId, setSearchUsername, setStatusFilter, fetchUsers, getUserDetail, updateUserStatus, deleteUser } = useAdminUsers() const [selectedUser, setSelectedUser] = useState(null) const [detailOpen, setDetailOpen] = useState(false) const [detailLoading, setDetailLoading] = useState(false) const [deleteTarget, setDeleteTarget] = useState(null) const [deleteLoading, setDeleteLoading] = useState(false) const [createModalOpen, setCreateModalOpen] = useState(false) useEffect(() => { fetchUsers() }, [fetchUsers]) const handleStatusToggle = async (user: AdminUser) => { await updateUserStatus(user) if (selectedUser?.id === user.id) { setSelectedUser(prev => prev ? { ...prev, is_active: !prev.is_active } : null) } } const handleShowDetail = async (user: AdminUser) => { setSelectedUser(user) setDetailOpen(true) setDetailLoading(true) try { const detail = await getUserDetail(user.id) setSelectedUser(detail) } catch { setSelectedUser(user) } finally { setDetailLoading(false) } } const handleDeleteUser = async () => { if (!deleteTarget) return setDeleteLoading(true) try { await deleteUser(deleteTarget) if (selectedUser?.id === deleteTarget.id) { setDetailOpen(false) setSelectedUser(null) } setDeleteTarget(null) } finally { setDeleteLoading(false) } } const displayValue = (value?: string) => value && value.trim() ? value : "-" const totalPages = Math.ceil(total / pageSize) const hasSearchFilter = Boolean(searchUserId || searchUsername) const renderFilterBar = () => (
setSearchUserId(e.target.value)} /> setSearchUsername(e.target.value)} /> {hasSearchFilter && ( )}
{ e.preventDefault(); setStatusFilter('all') }} >
全部状态 { e.preventDefault(); setStatusFilter('active') }} >
正常 { e.preventDefault(); setStatusFilter('inactive') }} >
禁用 {(hasSearchFilter || statusFilter !== 'all') && ( <> )}
{total} 条记录
{page}/{totalPages}
{[20, 50, 100].map(size => ( setPageSize(size)} className={cn("font-mono text-xs", pageSize === size && "bg-accent")} > {size}条/页 ))}
) return (
用户管理
{renderFilterBar()} {error ? (
fetchUsers(true)} className="justify-center" />
) : loading && users.length === 0 ? ( ) : users.length === 0 ? ( ) : (
ID 用户 上次登陆 注册时间 上次更新 操作 {users.map((user) => ( handleShowDetail(user)} > {user.id}
{user.username.substring(0, 2).toUpperCase()}
{user.nickname} {user.is_admin && ( ADM )}
@{user.username}
{formatDateTime(user.last_login_at)} {formatDateTime(user.created_at)} {formatDateTime(user.updated_at)} e.stopPropagation()}>
handleStatusToggle(user)} disabled={user.is_admin} className="scale-75 data-[state=checked]:bg-green-600 h-4 w-7" />
{user.is_admin ? '管理员账户' : user.is_active ? '禁用账户' : '启用账户'}
查看详情 {!user.is_admin && ( 删除用户 )}
))}
)} 用户档案 {selectedUser && ( <>
{selectedUser.username.substring(0, 2).toUpperCase()}

{selectedUser.nickname}

@{selectedUser.username} UID: {selectedUser.id} {selectedUser.is_admin && ( Admin )}
{detailLoading && (
正在刷新详情
)}
注册时间 {formatDateTime(selectedUser.created_at).split(' ')[0]}

个人资料

邮箱 {displayValue(selectedUser.email)}
手机 {displayValue(selectedUser.phone)}
性别 {displayValue(selectedUser.gender)}
所在地 {displayValue(selectedUser.location)}
网站 {displayValue(selectedUser.website)}
简介 {displayValue(selectedUser.bio)}

系统记录

账户状态 {selectedUser.is_active ? "正常" : "禁用"}
管理员 {selectedUser.is_admin ? "是" : "否"}
最后登录 {formatDateTime(selectedUser.last_login_at)}
注册时间 {formatDateTime(selectedUser.created_at)}
最后更新 {formatDateTime(selectedUser.updated_at)}
{!selectedUser.is_admin && (
)} )}
!open && !deleteLoading && setDeleteTarget(null)}> 确认删除用户 确定要删除用户 {deleteTarget?.nickname || deleteTarget?.username} 吗?该操作会移除用户账号,删除后无法撤销。 取消 {deleteLoading && } 确认删除 setCreateModalOpen(false)} />
) }