import React, { useState, useEffect } from 'react'; import { Users, Search, CheckCircle, XCircle, Trash2, Shield, Loader2, AlertCircle, Clock } from 'lucide-react'; import { AuthSession } from '../lib/auth'; interface User { id: string; email: string; created_at: string; status: 'Master' | 'Validated' | 'Pending'; } interface UserManagementViewProps { session: AuthSession; } export function UserManagementView({ session }: UserManagementViewProps) { const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [warning, setWarning] = useState(null); const [search, setSearch] = useState(''); const [processingId, setProcessingId] = useState(null); const [deleteConfirmUser, setDeleteConfirmUser] = useState(null); const fetchUsers = async () => { setLoading(true); setError(null); setWarning(null); try { const res = await fetch('/api/users-admin', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${session.access_token}` }, body: JSON.stringify({ action: 'list' }) }); if (!res.ok) { const data = await res.json().catch(() => ({})); throw new Error(data.error || 'Failed to fetch users.'); } const data = await res.json(); setUsers(data.users || []); setWarning(data.warning || null); } catch (err: any) { console.error('[UserManagement] fetch error:', err); setError(err.message || 'Error fetching user list.'); } finally { setLoading(false); } }; useEffect(() => { fetchUsers(); }, [session]); const handleToggleValidation = async (user: User, approve: boolean) => { setProcessingId(user.id); setError(null); setWarning(null); try { const res = await fetch('/api/users-admin', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${session.access_token}` }, body: JSON.stringify({ action: 'validate', targetUserId: user.id, email: user.email, validated: approve }) }); if (!res.ok) { const data = await res.json().catch(() => ({})); throw new Error(data.error || 'Failed to update user approval status.'); } const data = await res.json().catch(() => ({})); // Update local state setUsers(prev => prev.map(u => { if (u.id === user.id) { return { ...u, status: approve ? 'Validated' : 'Pending' }; } return u; })); if (data.warning) { setWarning(data.warning); } } catch (err: any) { setError(err.message || 'Error updating approval status.'); } finally { setProcessingId(null); } }; const handleDeleteUser = async (userId: string) => { setProcessingId(userId); setError(null); setDeleteConfirmUser(null); try { const res = await fetch('/api/users-admin', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${session.access_token}` }, body: JSON.stringify({ action: 'delete', targetUserId: userId }) }); if (!res.ok) { const data = await res.json().catch(() => ({})); throw new Error(data.error || 'Failed to delete user.'); } // Remove from local list setUsers(prev => prev.filter(u => u.id !== userId)); } catch (err: any) { setError(err.message || 'Error deleting user.'); } finally { setProcessingId(null); } }; const filteredUsers = users.filter(user => user.email.toLowerCase().includes(search.toLowerCase()) ); const formatDate = (dateStr: string) => { try { return new Date(dateStr).toLocaleDateString('es-ES', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }); } catch { return dateStr; } }; return (
{/* Header */}

Validación de Usuarios

Administra los accesos y los registros de usuarios en la plataforma.

setSearch(e.target.value)} className="bg-slate-900 border border-slate-800 rounded-md pl-9 pr-4 py-2 text-sm text-white placeholder:text-slate-500 focus:outline-none focus:border-blue-500 focus:ring-1 focus:ring-blue-500 w-64 transition-all" />
{/* Main Content Area */}
{error && (
Error: {error}
)} {warning && (
Aviso: {warning}
)} {loading ? (

Cargando lista de usuarios...

) : filteredUsers.length === 0 ? (
{search ? (

No se encontraron usuarios que coincidan con la búsqueda.

) : (

No hay registros de usuarios registrados.

)}
) : (
{filteredUsers.map(user => { const isProcessing = processingId === user.id; return ( ); })}
Email Fecha de Registro Estado Acciones
{user.email} {formatDate(user.created_at)} {user.status === 'Master' ? ( Administrador Principal ) : user.status === 'Validated' ? ( Validado ) : ( Pendiente Validación )} {user.status === 'Master' ? ( Protegido ) : (
{user.status === 'Pending' ? ( ) : ( )}
)}
)}
{/* Confirmation Modal */} {deleteConfirmUser && (

¿Eliminar usuario definitivamente?

Estás a punto de eliminar la cuenta del usuario:

{deleteConfirmUser.email}

Esta acción no se puede deshacer. Se eliminarán sus accesos y toda su información asociada al servicio de autenticación.

)}
); }