import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { AdminLayout } from '@/features/admin/admin-layout'; import { ApiClientError, apiClient } from '@/lib/api-client'; import type { AdminUser, AdminUserSession } from '@repo/api-contract'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { useLocation } from '@tanstack/react-router'; import { Ban, CheckCircle2, Globe, LogIn, Monitor, RefreshCw, ShieldAlert, Users, } from 'lucide-react'; import { useState } from 'react'; function SessionsDialog({ user, onClose, }: { user: AdminUser; onClose: () => void; }) { const queryClient = useQueryClient(); const { data, isLoading } = useQuery({ queryKey: ['admin-user-sessions', user.id], queryFn: () => apiClient.admin.getUserSessions(user.id), }); const revokeMutation = useMutation({ mutationFn: () => apiClient.admin.revokeAllSessions(user.id), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin-user-sessions', user.id] }); queryClient.invalidateQueries({ queryKey: ['admin-users'] }); }, }); return ( !open && onClose()}> Sesiones de {user.name} {data?.length ?? 0} sesiones activas
{isLoading ? (

Cargando sesiones...

) : data?.length === 0 ? (

Sin sesiones activas.

) : ( data?.map((session) => ) )}
{revokeMutation.error && (

{revokeMutation.error instanceof ApiClientError ? String(revokeMutation.error.details ?? revokeMutation.error.message) : revokeMutation.error.message}

)}
{data && data.length > 0 && ( )}
); } function SessionRow({ session }: { session: AdminUserSession }) { const isExpired = new Date(session.expiresAt) < new Date(); const userAgent = session.userAgent ?? 'Desconocido'; const ip = session.ipAddress ?? '—'; return (
{userAgent} {isExpired ? ( Expirada ) : ( Activa )}
{ip} {new Date(session.createdAt).toLocaleString()}
); } function BlockDialog({ user, onClose, }: { user: AdminUser; onClose: () => void; }) { const queryClient = useQueryClient(); const [reason, setReason] = useState(''); const mutation = useMutation({ mutationFn: (banReason?: string) => apiClient.admin.blockUser(user.id, { banReason }), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin-users'] }); onClose(); }, }); return ( !open && onClose()}> Bloquear usuario ¿Estás seguro de bloquear a {user.name} ({user.email})? No podrá iniciar sesión en Playzer.
setReason(e.target.value)} placeholder="Violación de términos..." maxLength={500} />
{mutation.error && (

{mutation.error instanceof ApiClientError ? String(mutation.error.details ?? mutation.error.message) : mutation.error.message}

)}
); } function UnblockDialog({ user, onClose, }: { user: AdminUser; onClose: () => void; }) { const queryClient = useQueryClient(); const mutation = useMutation({ mutationFn: () => apiClient.admin.unblockUser(user.id), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin-users'] }); onClose(); }, }); return ( !open && onClose()}> Desbloquear usuario ¿Estás seguro de desbloquear a {user.name}? Podrá volver a iniciar sesión en Playzer. {mutation.error && (

{mutation.error instanceof ApiClientError ? String(mutation.error.details ?? mutation.error.message) : mutation.error.message}

)}
); } function RoleBadge({ role }: { role: string }) { if (role === 'super_admin') { return ( Super Admin ); } return ( {role} ); } export function UsersPage() { const location = useLocation(); const queryClient = useQueryClient(); const [blockingUser, setBlockingUser] = useState(null); const [unblockingUser, setUnblockingUser] = useState(null); const [sessionsUser, setSessionsUser] = useState(null); const { data, isLoading } = useQuery({ queryKey: ['admin-users'], queryFn: () => apiClient.admin.listUsers(), }); return (

Usuarios

{data?.length ?? 0} usuarios registrados en Playzer.

{blockingUser && setBlockingUser(null)} />} {unblockingUser && ( setUnblockingUser(null)} /> )} {sessionsUser && setSessionsUser(null)} />} {isLoading ? (

Cargando usuarios...

) : data?.length === 0 ? (

No hay usuarios registrados.

) : (
{data?.map((user) => ( ))}
Usuario Rol Complejos Sesiones Registro Estado Acción

{user.name}

{user.email}

{user.complexCount} {new Date(user.createdAt).toLocaleDateString()} {user.banned ? ( Bloqueado ) : ( Activo )}
{user.banned ? ( ) : ( )}
)}
); }