import { useState, useEffect } from 'react'; import { useHospitalStore } from '@/hooks/useHospitalStore'; import type { Usuario, RolUsuario, Grupo } from '@/types'; import { Card, CardContent } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { Badge } from '@/components/ui/badge'; import { Plus, Pencil, Trash2, UserCog } from 'lucide-react'; const API_BASE = import.meta.env.VITE_API_URL || '/api'; export function GestionUsuarios() { const { currentUser } = useHospitalStore(); const [usuarios, setUsuarios] = useState([]); const [grupos, setGrupos] = useState([]); const [loading, setLoading] = useState(true); const [dialogOpen, setDialogOpen] = useState(false); const [editUsuario, setEditUsuario] = useState(null); const [form, setForm] = useState({ apellido: '', nombre: '', dni: '', fechaNacimiento: '', email: '', rol: 'medico' as RolUsuario, matriculaProfesional: '', password: '', grupoId: '', }); useEffect(() => { fetchUsuarios(); fetchGrupos(); }, []); const fetchUsuarios = async () => { try { const res = await fetch(`${API_BASE}/usuarios`); if (res.ok) { const data = await res.json(); if (Array.isArray(data)) setUsuarios(data); } } catch (err) { console.error(err); } finally { setLoading(false); } }; const fetchGrupos = async () => { try { const res = await fetch(`${API_BASE}/grupos`); if (res.ok) { const data = await res.json(); if (Array.isArray(data)) setGrupos(data); } } catch (err) { console.error(err); } }; const resetForm = () => { setForm({ apellido: '', nombre: '', dni: '', fechaNacimiento: '', email: '', rol: 'medico', matriculaProfesional: '', password: '', grupoId: '', }); setEditUsuario(null); }; const openEdit = (usu: Usuario) => { setEditUsuario(usu); setForm({ apellido: usu.apellido, nombre: usu.nombre, dni: usu.dni, fechaNacimiento: usu.fechaNacimiento, email: usu.email, rol: usu.rol, matriculaProfesional: usu.matriculaProfesional || '', password: '', grupoId: usu.grupoId || '', }); setDialogOpen(true); }; const handleSubmit = async () => { if (!form.apellido.trim() || !form.nombre.trim() || !form.dni.trim()) { alert('Por favor ingrese Apellido, Nombre y DNI.'); return; } try { let res: Response; if (editUsuario) { res = await fetch(`${API_BASE}/usuarios/${editUsuario.id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(form), }); } else { res = await fetch(`${API_BASE}/usuarios`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(form), }); } if (!res.ok) { const errData = await res.json().catch(() => ({ error: 'Error al guardar usuario' })); alert(errData.error || 'Error al guardar usuario'); return; } setDialogOpen(false); resetForm(); await fetchUsuarios(); } catch (err) { console.error(err); alert('Error al guardar usuario'); } }; const handleDelete = async (id: string) => { if (!confirm('¿Está seguro de eliminar este usuario?')) return; try { const res = await fetch(`${API_BASE}/usuarios/${id}`, { method: 'DELETE' }); if (!res.ok) { const errData = await res.json().catch(() => ({ error: 'Error al eliminar usuario' })); alert(errData.error || 'Error al eliminar usuario'); return; } await fetchUsuarios(); } catch (err) { console.error(err); alert('Error al eliminar usuario'); } }; const getRolLabel = (rol: RolUsuario) => { switch (rol) { case 'admin': return 'Administrador'; case 'medico': return 'Médico'; case 'enfermero': return 'Enfermero'; } }; const getGrupoName = (grupoId?: string) => { if (!grupoId) return '-'; return grupos.find(a => a.id === grupoId)?.nombre || '-'; }; if (!currentUser || currentUser.rol !== 'admin') { return (
No tiene permisos para acceder al módulo de gestión de usuarios.
); } if (loading) { return
Cargando...
; } return (

Gestión de Usuarios

Administrar usuarios del sistema

{/* Desktop Table View */} Apellido, Nombre DNI Rol Grupo Email Matrícula Acciones {usuarios.map((usu) => ( {usu.apellido}, {usu.nombre} {usu.dni} {getRolLabel(usu.rol)} {getGrupoName(usu.grupoId)} {usu.email || '-'} {usu.matriculaProfesional || '-'}
))}
{/* Mobile Cards View */}
{usuarios.map((usu) => (

{usu.apellido}, {usu.nombre}

DNI: {usu.dni}

{getRolLabel(usu.rol)}
Grupo {getGrupoName(usu.grupoId)}
Matrícula {usu.matriculaProfesional || '-'}
{usu.email && (
Email {usu.email}
)}
))}
{editUsuario ? 'Editar Usuario' : 'Nuevo Usuario'}
setForm({ ...form, apellido: e.target.value })} />
setForm({ ...form, nombre: e.target.value })} />
setForm({ ...form, dni: e.target.value })} disabled={!!editUsuario} />
setForm({ ...form, fechaNacimiento: e.target.value })} />
setForm({ ...form, email: e.target.value })} />
setForm({ ...form, matriculaProfesional: e.target.value })} />
{form.rol !== 'admin' && (
)}
setForm({ ...form, password: e.target.value })} />
); }