- ✅ Ticket 1.1: Estructura Clean Architecture en backend - ✅ Ticket 1.2: Schemas Zod compartidos - ✅ Ticket 1.3: Refactorización drugs.ts (1362 → 8 archivos modulares) - ✅ Ticket 1.4: Refactorización procedures.ts (3583 → 6 archivos modulares) - ✅ Ticket 1.5: Eliminación de duplicidades (~50 líneas) Cambios principales: - Creada estructura Clean Architecture en backend/src/ - Schemas Zod compartidos en backend/src/shared/schemas/ - Refactorización modular de drugs y procedures - Utilidades genéricas en src/utils/ (filter, validation) - Eliminados scripts obsoletos y documentación antigua - Corregidos errores: QueryClient, import test-error-handling - Build verificado y funcionando correctamente
2 lines
5.8 KiB
JavaScript
2 lines
5.8 KiB
JavaScript
import{r as n,j as e,a as E}from"./0-vendor-react-DWOJpYrt.js";import{u as I,L as P}from"./page-herramientas-BzovIToK.js";import{B as v}from"./page-ajustes-DgawOEJM.js";import{C as p,c as u,d as h,e as x,I as D}from"./page-comunicacion-DmHQUHoW.js";import{f as R,C as T,g as F}from"./timers-DtW-cs9v.js";import"./1-vendor-utils-Delnuc0l.js";import"./2-vendor-markdown-BQlHAcA7.js";const y=[{id:"reconocimiento",title:"Reconocimiento",description:"Identifica sepsis o shock séptico de forma precoz.",steps:[{id:"recon-infeccion",title:"Sospecha de infección",description:"Foco probable + fiebre/hipotermia, taquicardia o taquipnea."},{id:"recon-disfuncion",title:"Disfunción orgánica",description:"Alteración del estado mental, FR elevada, hipotensión o hipoxemia."},{id:"recon-qsofa",title:"Cribado rápido",description:"qSOFA ≥ 2 o signos de hipoperfusión."}]},{id:"acciones",title:"Acciones inmediatas (0-15 min)",description:"Estabiliza y prepara tratamiento.",steps:[{id:"acci-abcde",title:"ABCDE + monitorización",description:"Oxígeno, monitor, vía aérea y control de constantes."},{id:"acci-iv",title:"Vías y analíticas",description:"Dos vías periféricas + extracción para lactato si procede."},{id:"acci-cultivos",title:"Cultivos si es posible",description:"Antes de antibiótico cuando no retrase el inicio."},{id:"acci-fluidos",title:"Iniciar fluidos",description:"Cristaloides 30 ml/kg si hipotensión o lactato ≥ 4."}]},{id:"tratamiento",title:"Tratamiento (15-60 min)",description:"Control del foco y soporte hemodinámico.",steps:[{id:"trat-antibiotico",title:"Antibiótico temprano",description:"Administrar < 1 hora desde reconocimiento."},{id:"trat-vasopresor",title:"Vasopresor si MAP < 65",description:"Tras fluidos, considerar noradrenalina."},{id:"trat-reevaluacion",title:"Reevaluación clínica",description:"TA, FC, relleno capilar, estado mental, diuresis."}]},{id:"traslado",title:"Reevaluación y traslado",description:"Documenta, comunica y prepara el traslado.",steps:[{id:"tras-documentar",title:"Documentar tiempos",description:"Inicio síntomas, antibiótico y volumen administrado."},{id:"tras-comunicar",title:"Comunicación hospitalaria",description:"Preaviso con situación, tiempos y respuesta clínica."},{id:"tras-traslado",title:"Traslado monitorizado",description:"Reevaluar cada 5-10 min durante el transporte."}]}],b="pathway_shock_septico_v1",M=30,r={startedAt:null,completed:{},manualWeightKg:void 0},_=()=>{if(typeof window>"u")return r;try{const s=window.localStorage.getItem(b);if(!s)return r;const a=JSON.parse(s);return{...r,...a}}catch{return r}},K=s=>{if(!(typeof window>"u"))try{window.localStorage.setItem(b,JSON.stringify(s))}catch{}},G=()=>{const{state:s}=I(),[a,c]=n.useState(r),[O,w]=n.useState(Date.now());n.useEffect(()=>{c(_())},[]),n.useEffect(()=>{K(a)},[a]),n.useEffect(()=>{const t=window.setInterval(()=>w(Date.now()),1e3);return()=>window.clearInterval(t)},[]);const d=a.startedAt,N=F(d),m=y.reduce((t,i)=>t+i.steps.length,0),f=Object.values(a.completed).filter(Boolean).length,g=m?Math.round(f/m*100):0,l=s.patient.weight??a.manualWeightKg,j=n.useMemo(()=>l?Math.round(l*M):null,[l]),S=(t,i)=>{c(o=>({...o,completed:{...o.completed,[t]:i}}))},C=()=>{d||c(t=>({...t,startedAt:Date.now()}))},k=()=>{c(r)},A=t=>{const i=Number(t);c(o=>({...o,manualWeightKg:Number.isFinite(i)?i:void 0}))};return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("header",{className:"space-y-2",children:[e.jsx("h1",{className:"text-xl font-semibold text-foreground",children:"Pathway shock séptico"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Flujo guiado para reconocimiento, tratamiento inicial y traslado."})]}),e.jsxs(p,{children:[e.jsxs(u,{className:"flex flex-row items-center justify-between space-y-0",children:[e.jsx(h,{className:"text-base",children:"Progreso"}),e.jsxs("div",{className:"text-sm text-muted-foreground",children:[f,"/",m," completados (",g,"%)"]})]}),e.jsxs(x,{className:"space-y-3",children:[e.jsx("div",{className:"h-2 w-full rounded-full bg-muted",children:e.jsx("div",{className:"h-2 rounded-full bg-secondary transition-all",style:{width:`${g}%`}})}),e.jsxs("div",{className:"flex flex-col gap-2 md:flex-row md:items-center md:justify-between",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:d?`Tiempo: ${R(N)}`:"Sin iniciar"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(v,{onClick:C,disabled:!!d,children:"Iniciar"}),e.jsx(v,{variant:"outline",onClick:k,children:"Reiniciar"})]})]})]})]}),e.jsxs(p,{children:[e.jsx(u,{children:e.jsx(h,{className:"text-base",children:"Cálculo rápido de fluidos"})}),e.jsxs(x,{className:"space-y-3",children:[e.jsxs("div",{className:"rounded-md border border-border/60 bg-muted/30 p-3 space-y-2",children:[e.jsx(P,{children:"Peso (kg)"}),e.jsx(D,{type:"number",inputMode:"numeric",value:l??"",onChange:t=>A(t.target.value),placeholder:"Ej: 70"}),e.jsx("div",{className:"text-sm text-muted-foreground",children:j?`Volumen recomendado: ${j} ml (30 ml/kg)`:"Introduce el peso para calcular el bolo de fluidos."})]}),e.jsx(E,{to:"/advanced/vitals",className:"text-sm text-secondary underline underline-offset-4",children:"Abrir panel de constantes"})]})]}),y.map(t=>e.jsxs(p,{children:[e.jsxs(u,{className:"space-y-1",children:[e.jsx(h,{className:"text-base",children:t.title}),t.description&&e.jsx("p",{className:"text-sm text-muted-foreground",children:t.description})]}),e.jsx(x,{className:"space-y-3",children:t.steps.map(i=>e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(T,{checked:!!a.completed[i.id],onCheckedChange:o=>S(i.id,!!o)}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-sm font-medium text-foreground",children:i.title}),e.jsx("p",{className:"text-sm text-muted-foreground",children:i.description})]})]},i.id))})]},t.id))]})};export{G as default};
|