import React from 'react'; import ReactDOM from 'react-dom/client'; import { registerSW } from 'virtual:pwa-register'; import App from './app/App.jsx'; import { installGlobalErrorReporter } from './utils/errorReporter.js'; import './styles/tokens.css'; import './styles/app.css'; installGlobalErrorReporter(); // autoUpdate: toma la version nueva del service worker sola en cuanto esta lista, sin pedirle // nada al usuario (no hay riesgo de mostrar una version vieja de la UI por mucho tiempo). registerSW({ immediate: true, // Ademas de al cargar, revisa si hay version nueva cada 30 min y al volver a la pestaña -- // asi una pestaña abierta todo el dia no se queda en la version anterior. onRegisteredSW(_url, registration) { if (!registration) return; const check = () => registration.update().catch(() => {}); setInterval(check, 30 * 60 * 1000); document.addEventListener('visibilitychange', () => { if (document.visibilityState === 'visible') check(); }); }, }); // skipWaiting+clientsClaim (activados por autoUpdate) hacen que el service worker nuevo tome // control solo, pero eso NO refresca la pagina ya abierta -- el usuario seguia viendo JS/CSS // viejo hasta un F5 manual. Con esto, en cuanto el nuevo SW toma control, se refresca sola una // vez (la bandera evita un loop si el evento dispara mas de una vez). if ('serviceWorker' in navigator) { let reloaded = false; navigator.serviceWorker.addEventListener('controllerchange', () => { if (reloaded) return; reloaded = true; window.location.reload(); }); } ReactDOM.createRoot(document.getElementById('root')).render( );