"use client" import {useEffect, useState} from "react" import {Button} from "@/components/ui/button" import {Switch} from "@/components/ui/switch" import {Table, TableBody, TableCell, TableHead, TableHeader, TableRow} from "@/components/ui/table" import {Badge} from "@/components/ui/badge" import {Avatar, AvatarFallback, AvatarImage} from "@/components/ui/avatar" import {Eye, Layers, Loader2, Plus, Trash2, UserRound, UserX,} 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 type {AdminUser} from "@/lib/services/admin" import {formatDateTime} from "@/lib/utils" import {EmptyStateWithBorder} from "@/components/layout/empty" import {LoadingStateWithBorder} from "@/components/layout/loading" import {ErrorInline} from "@/components/layout/error" import {useAdminUsers} from "@/contexts/admin-users-context" import {CreateUserModal} from "./components/create-user-modal" import {UserFilterBar} from "./components/user-filter-bar" import {UserDetailSheet} from "./components/user-detail-sheet" export default function UsersPage() { const { users, loading, error, 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) } } return (
{/* 顶部标题栏 */}

用户管理

{/* 筛选与分页栏 (已拆分为独立自治组件) */} {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 && ( 删除用户 )}
))}
)} {/* 用户详情侧拉抽屉 (已拆分为独立子组件) */} {/* 删除确认警告弹窗 */} !open && !deleteLoading && setDeleteTarget(null)}> 确认删除用户 确定要删除用户 {deleteTarget?.nickname || deleteTarget?.username} 吗?该操作会移除用户账号,删除后无法撤销。 取消 {deleteLoading && } 确认删除 {/* 新建用户模态弹窗 */} setCreateModalOpen(false)} />
) }