'use client'; import { useEffect, useState } from 'react'; import { useTranslations } from 'next-intl'; 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, Pencil, Plus, UserRound, UserX } from 'lucide-react'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from '@/components/ui/tooltip'; 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'; import { EditUserModal } from './components/edit-user-modal'; export default function UsersPage() { const t = useTranslations('admin.users'); const { users, loading, error, fetchUsers, getUserDetail, updateUserStatus } = useAdminUsers(); const [selectedUser, setSelectedUser] = useState(null); const [detailOpen, setDetailOpen] = useState(false); const [detailLoading, setDetailLoading] = useState(false); const [createModalOpen, setCreateModalOpen] = useState(false); const [editTarget, setEditTarget] = useState(null); 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); } }; return (
{/* 顶部标题栏 */}

{t('pageTitle')}

{/* 筛选与分页栏 (已拆分为独立自治组件) */} {error ? (
fetchUsers(true)} className='justify-center' />
) : loading && users.length === 0 ? ( ) : users.length === 0 ? ( ) : (
ID {t('colUser')} {t('colEmail')} {t('colLastLogin')} {t('colRegisteredAt')} {t('colLastUpdate')} {t('colActions')} {users.map((user) => ( handleShowDetail(user)} > {user.id}
{user.username.substring(0, 2).toUpperCase()}
{user.nickname} {user.is_admin && ( ADM )}
@{user.username}
{user.email || '-'} {formatDateTime(user.last_login_at)} {formatDateTime(user.created_at)} {formatDateTime(user.updated_at)} e.stopPropagation()} >
handleStatusToggle(user)} disabled={user.is_admin} className='scale-75' />
{user.is_admin ? t('adminAccount') : user.is_active ? t('disableAccount') : t('enableAccount')}
{t('viewDetail')} {t('editUser')}
))}
)} {/* 用户详情侧拉抽屉 (已拆分为独立子组件) */} {/* 编辑用户弹窗 */} setEditTarget(null)} /> {/* 新建用户模态弹窗 */} setCreateModalOpen(false)} />
); }