import { useState, useEffect } from 'react'; import { useHospitalStore } from '@/hooks/useHospitalStore'; import type { Usuario, RolUsuario, Area } 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 } from 'lucide-react'; const API_BASE = import.meta.env.VITE_API_URL || '/api'; export function GestionUsuarios() { const { currentUser } = useHospitalStore(); const [usuarios, setUsuarios] = useState([]); const [areas, setAreas] = 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: '', areaId: '', }); useEffect(() => { fetchUsuarios(); fetchAreas(); }, []); const fetchUsuarios = async () => { try { const res = await fetch(`${API_BASE}/usuarios`); const data = await res.json(); setUsuarios(data); } catch (err) { console.error(err); } finally { setLoading(false); } }; const fetchAreas = async () => { try { const res = await fetch(`${API_BASE}/areas`); const data = await res.json(); setAreas(data); } catch (err) { console.error(err); } }; const resetForm = () => { setForm({ apellido: '', nombre: '', dni: '', fechaNacimiento: '', email: '', rol: 'medico', matriculaProfesional: '', password: '', areaId: '', }); 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: '', areaId: usu.areaId || '', }); 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 getAreaName = (areaId?: string) => { if (!areaId) return '-'; return areas.find(a => a.id === areaId)?.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 Área Email Matrícula Acciones {usuarios.map((usu) => ( {usu.apellido}, {usu.nombre} {usu.dni} {getRolLabel(usu.rol)} {getAreaName(usu.areaId)} {usu.email || '-'} {usu.matriculaProfesional || '-'}
))}
{/* Mobile Cards View */}
{usuarios.map((usu) => (

{usu.apellido}, {usu.nombre}

DNI: {usu.dni}

{getRolLabel(usu.rol)}
Área {getAreaName(usu.areaId)}
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 })} />
); }