File size: 1,690 Bytes
70e641d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// Manejo uniforme de errores en trabajo as铆ncrono.
//
// El port desde JS hered贸 dos idioms que tragaban fallos en silencio: handlers `async` pasados
// directamente a `addEventListener` (nadie consume la promesa, as铆 que un rechazo s贸lo aparece
// como "unhandled rejection" en consola) y llamadas fire-and-forget sin `.catch`. En una
// herramienta de diagn贸stico eso significa que un fallo de red al guardar o al analizar no le
// llega al veterinario. Estos dos helpers hacen que todo rechazo acabe en el toast de error.

import { mostrarToast } from './form-inject.js';

function reportarFallo(contexto: string, error: unknown): void {
  const detalle = error instanceof Error ? error.message : String(error);
  // console.error (no log) para no filtrar datos de paciente y respetar la regla no-console.
  console.error(`[${contexto}]`, error);
  mostrarToast(`${contexto}: ${detalle}`, true);
}

/**
 * Envuelve un handler as铆ncrono para usarlo donde se espera un handler s铆ncrono
 * (`addEventListener`, `onclick`). Consume la promesa y reporta el rechazo.
 */
export function manejadorAsync<E extends Event>(
  contexto: string,
  handler: (evento: E) => Promise<void>,
): (evento: E) => void {
  return (evento: E): void => {
    handler(evento).catch((error: unknown) => reportarFallo(contexto, error));
  };
}

/**
 * Lanza trabajo as铆ncrono deliberadamente sin esperarlo, pero con el rechazo reportado.
 * Usar s贸lo cuando no hay nada que esperar (arranque, precargas); si el resultado importa,
 * hacer `await`.
 */
export function sinEsperar(contexto: string, promesa: Promise<unknown>): void {
  promesa.catch((error: unknown) => reportarFallo(contexto, error));
}