import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { Plus, MoreVertical, Eye, Edit, Trash2, UserCheck, UserX, Mail, } from 'lucide-react'; import { Button } from '@components/atoms/Button'; import { Avatar } from '@components/atoms/Avatar'; import { Card, CardHeader, CardTitle, CardContent } from '@components/molecules/Card'; import { DataTable, type Column } from '@components/organisms/DataTable'; import { Dropdown, type DropdownItem } from '@components/organisms/Dropdown'; import { ConfirmModal } from '@components/organisms/Modal'; import { Breadcrumbs } from '@components/organisms/Breadcrumbs'; import { NoDataEmptyState, ErrorEmptyState } from '@components/templates/EmptyState'; import { useUsers } from '@features/users/hooks'; import { UserStatusBadge } from '@features/users/components/UserStatusBadge'; import { UserFiltersPanel } from '@features/users/components/UserFiltersPanel'; import type { User } from '@features/users/types'; import { formatDate } from '@utils/formatters'; export function UsersListPage() { const navigate = useNavigate(); const [userToDelete, setUserToDelete] = useState(null); const [userToToggle, setUserToToggle] = useState<{ user: User; action: 'activate' | 'deactivate' } | null>(null); const { users, total, page, totalPages, isLoading, error, filters, setFilters, deleteUser, activateUser, deactivateUser, refresh, } = useUsers({ page: 1, limit: 10 }); const getActionsMenu = (user: User): DropdownItem[] => { const items: DropdownItem[] = [ { key: 'view', label: 'Ver detalle', icon: , onClick: () => navigate(`/users/${user.id}`), }, { key: 'edit', label: 'Editar', icon: , onClick: () => navigate(`/users/${user.id}/edit`), }, { key: 'email', label: 'Enviar email', icon: , onClick: () => window.location.href = `mailto:${user.email}`, }, ]; if (user.status === 'active') { items.push({ key: 'deactivate', label: 'Desactivar', icon: , onClick: () => setUserToToggle({ user, action: 'deactivate' }), }); } else { items.push({ key: 'activate', label: 'Activar', icon: , onClick: () => setUserToToggle({ user, action: 'activate' }), }); } items.push({ key: 'delete', label: 'Eliminar', icon: , danger: true, onClick: () => setUserToDelete(user), }); return items; }; const columns: Column[] = [ { key: 'user', header: 'Usuario', render: (user) => (
{user.firstName} {user.lastName}
{user.email}
), }, { key: 'role', header: 'Rol', render: (user) => ( {user.role?.name || '-'} ), }, { key: 'status', header: 'Estado', render: (user) => , }, { key: 'lastLoginAt', header: 'Último acceso', render: (user) => ( {user.lastLoginAt ? formatDate(user.lastLoginAt, 'relative') : 'Nunca'} ), }, { key: 'createdAt', header: 'Creado', sortable: true, render: (user) => ( {formatDate(user.createdAt, 'short')} ), }, { key: 'actions', header: '', render: (user) => ( } items={getActionsMenu(user)} align="right" /> ), }, ]; const handlePageChange = (newPage: number) => { setFilters({ ...filters, page: newPage }); }; const handleSort = (key: string) => { const newOrder = filters.sortBy === key && filters.sortOrder === 'asc' ? 'desc' : 'asc'; setFilters({ ...filters, sortBy: key, sortOrder: newOrder }); }; const handleDeleteConfirm = async () => { if (userToDelete) { await deleteUser(userToDelete.id); setUserToDelete(null); } }; const handleToggleConfirm = async () => { if (userToToggle) { if (userToToggle.action === 'activate') { await activateUser(userToToggle.user.id); } else { await deactivateUser(userToToggle.user.id); } setUserToToggle(null); } }; if (error) { return (
); } return (

Usuarios

Gestiona los usuarios del sistema

Lista de usuarios
{users.length === 0 && !isLoading ? ( navigate('/users/new')} /> ) : ( )}
{/* Delete confirmation modal */} setUserToDelete(null)} onConfirm={handleDeleteConfirm} title="Eliminar usuario" message={`¿Estás seguro de que deseas eliminar a ${userToDelete?.firstName} ${userToDelete?.lastName}? Esta acción no se puede deshacer.`} variant="danger" confirmText="Eliminar" /> {/* Activate/Deactivate confirmation modal */} setUserToToggle(null)} onConfirm={handleToggleConfirm} title={userToToggle?.action === 'activate' ? 'Activar usuario' : 'Desactivar usuario'} message={ userToToggle?.action === 'activate' ? `¿Deseas activar a ${userToToggle?.user.firstName} ${userToToggle?.user.lastName}?` : `¿Deseas desactivar a ${userToToggle?.user.firstName} ${userToToggle?.user.lastName}? El usuario no podrá acceder al sistema.` } variant={userToToggle?.action === 'activate' ? 'success' : 'warning'} confirmText={userToToggle?.action === 'activate' ? 'Activar' : 'Desactivar'} />
); } export default UsersListPage;