import { useState } from 'react'; import { FileText, Plus, Search, Eye, MoreHorizontal, Pencil, Trash2, X, Save, Activity, Heart, Wind, Thermometer, Droplets } from 'lucide-react'; 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 { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu'; import { toast } from 'sonner'; import type { Evolucion, Internacion, Paciente, Cama, SignosVitales, ExamenFisico } from '@/types'; import { useHospitalStore } from '@/hooks/useHospitalStore'; import { getNombreProfesional } from '@/lib/utils'; interface EvolucionesProps { evoluciones: Evolucion[]; internaciones: Internacion[]; pacientes: Paciente[]; camas?: Cama[]; getCamaById?: (id: string) => Cama | undefined; onAgregarEvolucion: (evolucion: Omit) => Promise | void; onActualizarEvolucion?: (id: string, datos: Partial) => Promise | void; onEliminarEvolucion: (id: string) => Promise | void; getPacienteById: (id: string) => Paciente | undefined; getInternacionActivaByPaciente: (pacienteId: string) => Internacion | undefined; } export function Evoluciones({ evoluciones, internaciones, pacientes, camas, getCamaById, onAgregarEvolucion, onActualizarEvolucion, onEliminarEvolucion, getPacienteById, getInternacionActivaByPaciente }: EvolucionesProps) { const { currentUser } = useHospitalStore(); const [busqueda, setBusqueda] = useState(''); const [pacienteSeleccionado, setPacienteSeleccionado] = useState(''); const [dialogoAbierto, setDialogoAbierto] = useState(false); const [evolucionDetalle, setEvolucionDetalle] = useState(null); const [evolucionEditando, setEvolucionEditando] = useState(null); const [fecha, setFecha] = useState(new Date().toISOString().split('T')[0]); const [hora, setHora] = useState(new Date().toTimeString().slice(0, 5)); const effectiveMedico = getNombreProfesional(currentUser); const [temperatura, setTemperatura] = useState(''); const [presionSistolica, setPresionSistolica] = useState(''); const [presionDiastolica, setPresionDiastolica] = useState(''); const [frecuenciaCardiaca, setFrecuenciaCardiaca] = useState(''); const [frecuenciaRespiratoria, setFrecuenciaRespiratoria] = useState(''); const [saturacionO2, setSaturacionO2] = useState(''); const [snc, setSnc] = useState(''); const [cardiovascular, setCardiovascular] = useState(''); const [respiratorio, setRespiratorio] = useState(''); const [abdominal, setAbdominal] = useState(''); const [genitourinario, setGenitourinario] = useState(''); const [pielAnexos, setPielAnexos] = useState(''); const [soma, setSoma] = useState(''); const [novedades, setNovedades] = useState(''); const [comentario, setComentario] = useState(''); const [pendientes, setPendientes] = useState(''); const resetFormulario = () => { setFecha(new Date().toISOString().split('T')[0]); setHora(new Date().toTimeString().slice(0, 5)); setTemperatura(''); setPresionSistolica(''); setPresionDiastolica(''); setFrecuenciaCardiaca(''); setFrecuenciaRespiratoria(''); setSaturacionO2(''); setSnc(''); setCardiovascular(''); setRespiratorio(''); setAbdominal(''); setGenitourinario(''); setPielAnexos(''); setSoma(''); setNovedades(''); setComentario(''); setPendientes(''); setEvolucionEditando(null); }; const abrirEditar = (evo: Evolucion) => { setEvolucionEditando(evo); const internacion = internaciones.find(i => i.id === evo.internacionId); if (internacion) { setPacienteSeleccionado(internacion.pacienteId); } setFecha(evo.fecha); setHora(evo.hora); setTemperatura(evo.signosVitales?.temperatura?.toString() || ''); setPresionSistolica(evo.signosVitales?.presionSistolica?.toString() || ''); setPresionDiastolica(evo.signosVitales?.presionDiastolica?.toString() || ''); setFrecuenciaCardiaca(evo.signosVitales?.frecuenciaCardiaca?.toString() || ''); setFrecuenciaRespiratoria(evo.signosVitales?.frecuenciaRespiratoria?.toString() || ''); setSaturacionO2(evo.signosVitales?.saturacionO2?.toString() || ''); setSnc(evo.examenFisico?.SNC || ''); setCardiovascular(evo.examenFisico?.Cardiovascular || ''); setRespiratorio(evo.examenFisico?.Respiratorio || ''); setAbdominal(evo.examenFisico?.Abdominal || ''); setGenitourinario(evo.examenFisico?.Genitourinario || ''); setPielAnexos(evo.examenFisico?.PielAnexos || ''); setSoma(evo.examenFisico?.SOMA || ''); setNovedades(evo.novedades || ''); setComentario(evo.comentario || ''); setPendientes(evo.pendientes || ''); setDialogoAbierto(true); }; const handleGuardar = async () => { const internacion = evolucionEditando ? internaciones.find(i => i.id === evolucionEditando.internacionId) : getInternacionActivaByPaciente(pacienteSeleccionado); if (!effectiveMedico.trim()) { toast.error('Debe completar el nombre del médico'); return; } if (!internacion) { toast.error('Seleccione un paciente internado'); return; } const signosVitales: SignosVitales | undefined = temperatura || presionSistolica || frecuenciaCardiaca ? { temperatura: temperatura ? parseFloat(temperatura) : undefined, presionSistolica: presionSistolica ? parseInt(presionSistolica) : undefined, presionDiastolica: presionDiastolica ? parseInt(presionDiastolica) : undefined, frecuenciaCardiaca: frecuenciaCardiaca ? parseInt(frecuenciaCardiaca) : undefined, frecuenciaRespiratoria: frecuenciaRespiratoria ? parseInt(frecuenciaRespiratoria) : undefined, saturacionO2: saturacionO2 ? parseInt(saturacionO2) : undefined, } : undefined; const examenFisico: ExamenFisico | undefined = snc || cardiovascular || respiratorio || abdominal || genitourinario || pielAnexos || soma ? { SNC: snc || undefined, Cardiovascular: cardiovascular || undefined, Respiratorio: respiratorio || undefined, Abdominal: abdominal || undefined, Genitourinario: genitourinario || undefined, PielAnexos: pielAnexos || undefined, SOMA: soma || undefined, } : undefined; const evolucionData = { fecha, hora, medico: effectiveMedico.trim(), signosVitales, examenFisico, novedades: novedades || undefined, comentario: comentario || undefined, pendientes: pendientes || undefined, }; try { if (evolucionEditando && onActualizarEvolucion) { await onActualizarEvolucion(evolucionEditando.id, evolucionData); toast.success('Evolución actualizada correctamente'); } else { await onAgregarEvolucion({ ...evolucionData, internacionId: internacion.id }); toast.success('Evolución agregada correctamente'); } resetFormulario(); setDialogoAbierto(false); } catch (err) { console.error('Error al guardar evolución:', err); toast.error('Error al guardar los cambios de la evolución'); } }; const pacientesInternados = pacientes.filter(p => { const internacion = getInternacionActivaByPaciente(p.id); return internacion !== undefined; }); const evolucionesFiltradas = evoluciones .filter(e => { const internacion = internaciones.find(i => i.id === e.internacionId); if (!internacion) return false; const paciente = getPacienteById(internacion.pacienteId); if (!paciente) return false; return !busqueda || paciente.nombre.toLowerCase().includes(busqueda.toLowerCase()) || paciente.apellido.toLowerCase().includes(busqueda.toLowerCase()) || paciente.dni.includes(busqueda); }) .sort((a, b) => new Date(b.fecha + 'T' + b.hora).getTime() - new Date(a.fecha + 'T' + a.hora).getTime()); return (

Evoluciones Diarias

Registro de evoluciones y signos vitales

{evolucionEditando ? 'Editar Evolución' : 'Nueva Evolución'}
{!evolucionEditando && (
)}
setFecha(e.target.value)} />
setHora(e.target.value)} />

Signos Vitales

setPresionSistolica(e.target.value)} placeholder="120" />
setPresionDiastolica(e.target.value)} placeholder="80" />
setFrecuenciaCardiaca(e.target.value)} placeholder="72" />
setFrecuenciaRespiratoria(e.target.value)} placeholder="16" />
setTemperatura(e.target.value)} placeholder="36.5" />
setSaturacionO2(e.target.value)} placeholder="98" />

Examen Físico