✅ Actualización PWA Manual (v1.0.89)
Cambios Realizados Service Worker (public/service-worker.js) ❌ Removido skipWaiting() automático en install ❌ Removido claim() automático en activate ✅ Solo se activa cuando recibe mensaje SKIP_WAITING del usuario App.jsx ✅ Modal se muestra cuando hay actualización ✅ Nueva versión se instala en segundo plano ⏸️ Espera confirmación del usuario ✅ Solo actualiza cuando el usuario presiona el botón ✅ Protección contra recargas múltiples (refreshing flag) Flujo Actualizado Deploy de nueva versión (ej: v1.0.89) Usuario abre la app con versión antigua (v1.0.88) Service Worker detecta nueva versión Descarga en segundo plano la nueva versión Modal aparece → "¡Nueva Actualización!" ⏸️ La app sigue funcionando normalmente 👆 Usuario presiona "🚀 ACTUALIZAR AHORA" Service Worker se activa (skipWaiting) Página se recarga automáticamente ✅ Nueva versión activa Ventajas ✅ Usuario tiene control total ✅ No interrumpe trabajo en curso ✅ Puede terminar inspección antes de actualizar ✅ Modal bloqueante asegura que eventualmente actualice ✅ Actualización instantánea al presionar botón Ahora el usuario DEBE presionar el botón para actualizar! 🎯
This commit is contained in:
@@ -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
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user