import { useState } from 'react'; import { Users as UsersIcon, Plus, MoreVertical, Eye, Edit2, Trash2, Key, Mail, RefreshCw, Search, UserCheck, UserX, Shield, } from 'lucide-react'; import { Button } from '@components/atoms/Button'; 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 { Breadcrumbs } from '@components/organisms/Breadcrumbs'; import { ConfirmModal } from '@components/organisms/Modal'; import { NoDataEmptyState, ErrorEmptyState } from '@components/templates/EmptyState'; import { useUsers } from '@features/settings/hooks'; import type { User, UserRole } from '@features/settings/types'; import { USER_ROLE_LABELS } from '@features/settings/types'; import { formatDate } from '@utils/formatters'; const roleColors: Record = { admin: 'bg-red-100 text-red-700', manager: 'bg-blue-100 text-blue-700', user: 'bg-green-100 text-green-700', viewer: 'bg-gray-100 text-gray-700', }; export function UsersSettingsPage() { const [searchTerm, setSearchTerm] = useState(''); const [selectedRole, setSelectedRole] = useState(''); const [showActiveOnly, setShowActiveOnly] = useState(undefined); const [userToDelete, setUserToDelete] = useState(null); const [userToToggle, setUserToToggle] = useState(null); const [userToResetPassword, setUserToResetPassword] = useState(null); const { users, total, page, totalPages, isLoading, error, setFilters, refresh, remove, toggleActive, resetPassword, resendInvitation, } = useUsers({ initialFilters: { search: searchTerm, role: selectedRole || undefined, isActive: showActiveOnly, }, }); const handleSearch = (value: string) => { setSearchTerm(value); setFilters({ search: value }); }; const handleRoleFilter = (role: UserRole | '') => { setSelectedRole(role); setFilters({ role: role || undefined }); }; const handleActiveFilter = (active: boolean | undefined) => { setShowActiveOnly(active); setFilters({ isActive: active }); }; const columns: Column[] = [ { key: 'name', header: 'Usuario', render: (user) => (
{user.avatarUrl ? ( {user.name} ) : ( {user.name.split(' ').map(n => n[0]).join('').toUpperCase().slice(0, 2)} )}
{user.name}
{user.email}
), }, { key: 'role', header: 'Rol', render: (user) => ( {USER_ROLE_LABELS[user.role]} ), }, { key: 'isActive', header: 'Estado', render: (user) => ( {user.isActive ? ( <> Activo ) : ( <> Inactivo )} ), }, { key: 'lastLoginAt', header: 'Ultimo acceso', render: (user) => ( {user.lastLoginAt ? formatDate(user.lastLoginAt, 'short') : 'Nunca'} ), }, { key: 'createdAt', header: 'Creado', render: (user) => ( {formatDate(user.createdAt, 'short')} ), }, { key: 'actions', header: '', render: (user) => { const items: DropdownItem[] = [ { key: 'view', label: 'Ver detalle', icon: , onClick: () => console.log('View', user.id), }, { key: 'edit', label: 'Editar', icon: , onClick: () => console.log('Edit', user.id), }, { key: 'toggle', label: user.isActive ? 'Desactivar' : 'Activar', icon: user.isActive ? : , onClick: () => setUserToToggle(user), }, { key: 'resetPassword', label: 'Restablecer contrasena', icon: , onClick: () => setUserToResetPassword(user), }, { key: 'resendInvitation', label: 'Reenviar invitacion', icon: , onClick: () => resendInvitation(user.id), }, { key: 'delete', label: 'Eliminar', icon: , danger: true, onClick: () => setUserToDelete(user), }, ]; return ( } items={items} align="right" /> ); }, }, ]; const handleDeleteUser = async () => { if (userToDelete) { await remove(userToDelete.id); setUserToDelete(null); } }; const handleToggleUser = async () => { if (userToToggle) { await toggleActive(userToToggle.id); setUserToToggle(null); } }; const handleResetPassword = async () => { if (userToResetPassword) { // Generate a temporary password or show a form const tempPassword = 'TempPass123!'; await resetPassword(userToResetPassword.id, tempPassword); setUserToResetPassword(null); alert(`Contrasena restablecida. Nueva contrasena temporal: ${tempPassword}`); } }; // Stats const activeUsers = users.filter(u => u.isActive).length; const adminCount = users.filter(u => u.role === 'admin').length; const managerCount = users.filter(u => u.role === 'manager').length; if (error) { return (
); } return (

Usuarios

Gestiona los usuarios de tu empresa

{/* Summary Stats */}
Total usuarios
{total}
handleActiveFilter(true)}>
Activos
{activeUsers}
handleRoleFilter('admin')}>
Administradores
{adminCount}
handleRoleFilter('manager')}>
Gerentes
{managerCount}
Lista de Usuarios
{/* Filters */}
handleSearch(e.target.value)} className="w-full rounded-md border border-gray-300 py-2 pl-10 pr-4 focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500" />
{(searchTerm || selectedRole || showActiveOnly !== undefined) && ( )}
{/* Table */} {users.length === 0 && !isLoading ? ( ) : ( setFilters({ page: p }), }} /> )}
{/* Delete User Modal */} setUserToDelete(null)} onConfirm={handleDeleteUser} title="Eliminar usuario" message={`¿Eliminar al usuario "${userToDelete?.name}"? Esta accion no se puede deshacer.`} variant="danger" confirmText="Eliminar" /> {/* Toggle User Modal */} setUserToToggle(null)} onConfirm={handleToggleUser} title={userToToggle?.isActive ? 'Desactivar usuario' : 'Activar usuario'} message={userToToggle?.isActive ? `¿Desactivar al usuario "${userToToggle?.name}"? No podra acceder al sistema.` : `¿Activar al usuario "${userToToggle?.name}"? Podra acceder al sistema nuevamente.` } variant={userToToggle?.isActive ? 'warning' : 'success'} confirmText={userToToggle?.isActive ? 'Desactivar' : 'Activar'} /> {/* Reset Password Modal */} setUserToResetPassword(null)} onConfirm={handleResetPassword} title="Restablecer contrasena" message={`¿Restablecer la contrasena de "${userToResetPassword?.name}"? Se generara una contrasena temporal.`} variant="warning" confirmText="Restablecer" />
); } export default UsersSettingsPage;