From b2398efead30cd82238a1e65f3e0f7fac4836084 Mon Sep 17 00:00:00 2001 From: ronalds Date: Sun, 30 Nov 2025 23:30:57 -0300 Subject: [PATCH] =?UTF-8?q?=E2=9C=85=20Actualizaci=C3=B3n=20PWA=20Manual?= =?UTF-8?q?=20(v1.0.89)=20Cambios=20Realizados=20Service=20Worker=20(publi?= =?UTF-8?q?c/service-worker.js)=20=E2=9D=8C=20Removido=20skipWaiting()=20a?= =?UTF-8?q?utom=C3=A1tico=20en=20install=20=E2=9D=8C=20Removido=20claim()?= =?UTF-8?q?=20autom=C3=A1tico=20en=20activate=20=E2=9C=85=20Solo=20se=20ac?= =?UTF-8?q?tiva=20cuando=20recibe=20mensaje=20SKIP=5FWAITING=20del=20usuar?= =?UTF-8?q?io=20App.jsx=20=E2=9C=85=20Modal=20se=20muestra=20cuando=20hay?= =?UTF-8?q?=20actualizaci=C3=B3n=20=E2=9C=85=20Nueva=20versi=C3=B3n=20se?= =?UTF-8?q?=20instala=20en=20segundo=20plano=20=E2=8F=B8=EF=B8=8F=20Espera?= =?UTF-8?q?=20confirmaci=C3=B3n=20del=20usuario=20=E2=9C=85=20Solo=20actua?= =?UTF-8?q?liza=20cuando=20el=20usuario=20presiona=20el=20bot=C3=B3n=20?= =?UTF-8?q?=E2=9C=85=20Protecci=C3=B3n=20contra=20recargas=20m=C3=BAltiple?= =?UTF-8?q?s=20(refreshing=20flag)=20Flujo=20Actualizado=20Deploy=20de=20n?= =?UTF-8?q?ueva=20versi=C3=B3n=20(ej:=20v1.0.89)=20Usuario=20abre=20la=20a?= =?UTF-8?q?pp=20con=20versi=C3=B3n=20antigua=20(v1.0.88)=20Service=20Worke?= =?UTF-8?q?r=20detecta=20nueva=20versi=C3=B3n=20Descarga=20en=20segundo=20?= =?UTF-8?q?plano=20la=20nueva=20versi=C3=B3n=20Modal=20aparece=20=E2=86=92?= =?UTF-8?q?=20"=C2=A1Nueva=20Actualizaci=C3=B3n!"=20=E2=8F=B8=EF=B8=8F=20L?= =?UTF-8?q?a=20app=20sigue=20funcionando=20normalmente=20=F0=9F=91=86=20Us?= =?UTF-8?q?uario=20presiona=20"=F0=9F=9A=80=20ACTUALIZAR=20AHORA"=20Servic?= =?UTF-8?q?e=20Worker=20se=20activa=20(skipWaiting)=20P=C3=A1gina=20se=20r?= =?UTF-8?q?ecarga=20autom=C3=A1ticamente=20=E2=9C=85=20Nueva=20versi=C3=B3?= =?UTF-8?q?n=20activa=20Ventajas=20=E2=9C=85=20Usuario=20tiene=20control?= =?UTF-8?q?=20total=20=E2=9C=85=20No=20interrumpe=20trabajo=20en=20curso?= =?UTF-8?q?=20=E2=9C=85=20Puede=20terminar=20inspecci=C3=B3n=20antes=20de?= =?UTF-8?q?=20actualizar=20=E2=9C=85=20Modal=20bloqueante=20asegura=20que?= =?UTF-8?q?=20eventualmente=20actualice=20=E2=9C=85=20Actualizaci=C3=B3n?= =?UTF-8?q?=20instant=C3=A1nea=20al=20presionar=20bot=C3=B3n=20Ahora=20el?= =?UTF-8?q?=20usuario=20DEBE=20presionar=20el=20bot=C3=B3n=20para=20actual?= =?UTF-8?q?izar!=20=F0=9F=8E=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/package.json | 2 +- frontend/public/service-worker.js | 7 ++++--- frontend/src/App.jsx | 19 ++++++++++++++----- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index ab5d65b..788682b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "checklist-frontend", "private": true, - "version": "1.0.88", + "version": "1.0.89", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/public/service-worker.js b/frontend/public/service-worker.js index 5c17b67..8886a97 100644 --- a/frontend/public/service-worker.js +++ b/frontend/public/service-worker.js @@ -1,6 +1,6 @@ // Service Worker para PWA con detección de actualizaciones // IMPORTANTE: Actualizar esta versión cada vez que se despliegue una nueva versión -const CACHE_NAME = 'ayutec-v1.0.88'; +const CACHE_NAME = 'ayutec-v1.0.89'; const urlsToCache = [ '/', '/index.html' @@ -15,7 +15,7 @@ self.addEventListener('install', (event) => { console.log('Service Worker: Caching files'); return cache.addAll(urlsToCache); }) - .then(() => self.skipWaiting()) // Forzar activación inmediata + // NO hacer skipWaiting automáticamente - esperar a que el usuario lo active ); }); @@ -32,7 +32,8 @@ self.addEventListener('activate', (event) => { } }) ); - }).then(() => self.clients.claim()) // Tomar control de todas las páginas + }) + // NO hacer claim automáticamente - solo cuando el usuario actualice manualmente ); }); diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 13fb162..3ccc4b9 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -21,6 +21,7 @@ function App() { // Verificar si hay actualización esperando if (registration.waiting) { + console.log('⚠️ Hay una actualización esperando'); setWaitingWorker(registration.waiting); setUpdateAvailable(true); } @@ -32,8 +33,8 @@ function App() { newWorker.addEventListener('statechange', () => { if (newWorker.state === 'installed' && navigator.serviceWorker.controller) { - // Hay nueva versión disponible - console.log('✨ Nueva versión lista!'); + // Hay nueva versión disponible - MOSTRAR MODAL, NO ACTIVAR AUTOMÁTICAMENTE + console.log('✨ Nueva versión instalada - esperando confirmación del usuario'); setWaitingWorker(newWorker); setUpdateAvailable(true); } @@ -45,17 +46,25 @@ function App() { }); // Escuchar cambios de controlador (cuando se activa nueva versión) + // SOLO se dispara DESPUÉS de que el usuario presione el botón + let refreshing = false; navigator.serviceWorker.addEventListener('controllerchange', () => { - console.log('🔄 Controlador cambiado, recargando página...'); - window.location.reload(); + if (!refreshing) { + refreshing = true; + console.log('🔄 Controlador cambiado, recargando página...'); + window.location.reload(); + } }); } }, []); - // Función para actualizar la app + // Función para actualizar la app - SOLO cuando el usuario presiona el botón const handleUpdate = () => { if (waitingWorker) { + console.log('👆 Usuario confirmó actualización - activando nueva versión...'); + // Enviar mensaje al service worker para que se active waitingWorker.postMessage({ type: 'SKIP_WAITING' }); + // El controllerchange listener manejará la recarga } };