diff --git a/frontend/src/components/IndicadorActualizacion.jsx b/frontend/src/components/IndicadorActualizacion.jsx new file mode 100644 index 0000000..6da6483 --- /dev/null +++ b/frontend/src/components/IndicadorActualizacion.jsx @@ -0,0 +1,97 @@ +// src/components/IndicadorActualizacion.jsx +// Indicador (arriba-derecha) con la hora de la última actualización + botón de +// recarga. Al pulsar: re-lee las bases para la vista actual y recachea el resto. +import { useState, useEffect, useCallback } from "react"; +import { api } from "../lib/api"; +import { getVistaActual, emitirRefresco } from "../lib/vistaActual"; + +function formatearHora(iso) { + if (!iso) return "—"; + try { + const d = new Date(iso); + return d.toLocaleString("es-PE", { + day: "2-digit", month: "2-digit", + hour: "2-digit", minute: "2-digit", + }); + } catch { + return "—"; + } +} + +export default function IndicadorActualizacion() { + const [hora, setHora] = useState(null); + const [cargando, setCargando] = useState(false); + + const consultar = useCallback(async () => { + try { + const r = await api.ultimaActualizacion(); + setHora(r?.hora || null); + } catch { /* silencioso */ } + }, []); + + useEffect(() => { + consultar(); + const id = setInterval(consultar, 60000); + return () => clearInterval(id); + }, [consultar]); + + async function recargar() { + if (cargando) return; + setCargando(true); + try { + const r = await api.cacheRefreshManual(getVistaActual()); + setHora(r?.hora || null); + emitirRefresco(); + } catch { /* silencioso */ } + finally { setCargando(false); } + } + + return ( + <> + +
+ + {cargando ? "Actualizando…" : formatearHora(hora)} + + +
+ + ); +} \ No newline at end of file