Files
checklist/frontend/public/service-worker.js
ronalds 023a004c53 IMPLEMENTADO - Previsualización de Imágenes en Chat Assistant
📸 Frontend actualizado a v1.2.3
He implementado un sistema completo de previsualización de imágenes en el chat assistant:

🎨 Características Implementadas:
1. Preview Antes de Enviar (Zona de Input)
Miniaturas 20x20px con superposición de nombre
Botón de eliminar en esquina superior derecha (rojo con X)
Fondo oscuro translúcido para nombre del archivo
Hover effects para mejor UX

// Vista previa antes de enviar:
┌─────────────────────────────┐
│  [IMG]  [IMG]  📄 file.pdf  │  ← Miniaturas clickeables
│   ✕      ✕       ✕          │
└─────────────────────────────┘

2. Imágenes en Mensajes del Chat
Renderizado completo de imágenes en mensajes del usuario
Máximo 256px de altura (responsive)
Click para abrir en nueva pestaña (full size)
Metadata bajo la imagen (nombre + tamaño)
Esquina redondeada para mejor diseño
Transición hover (opacity 90%)

// Mensaje del usuario con imagen:
┌────────────────────────────┐
│ [Texto del mensaje]        │
│                            │
│ ┌────────────────────────┐ │
│ │                        │ │
│ │    [IMAGEN PREVIEW]    │ │ ← Click para ampliar
│ │                        │ │
│ └────────────────────────┘ │
│ 🖼️ photo.jpg (128.5 KB)   │
│                            │
│ 10:45                      │
└────────────────────────────┘

3. Gestión de Memoria
URLs temporales con URL.createObjectURL()
Limpieza automática al eliminar archivo
useEffect cleanup al desmontar modal
No memory leaks garantizados
2025-12-04 11:03:19 -03:00

68 lines
1.9 KiB
JavaScript

// 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.2.3';
const urlsToCache = [
'/',
'/index.html'
];
// Instalación del service worker
self.addEventListener('install', (event) => {
console.log('Service Worker: Installing version', CACHE_NAME);
event.waitUntil(
caches.open(CACHE_NAME)
.then((cache) => {
console.log('Service Worker: Caching files');
return cache.addAll(urlsToCache);
})
// NO hacer skipWaiting automáticamente - esperar a que el usuario lo active
);
});
// Activación del service worker
self.addEventListener('activate', (event) => {
console.log('Service Worker: Activating...');
event.waitUntil(
caches.keys().then((cacheNames) => {
return Promise.all(
cacheNames.map((cacheName) => {
if (cacheName !== CACHE_NAME) {
console.log('Service Worker: Deleting old cache:', cacheName);
return caches.delete(cacheName);
}
})
);
})
// NO hacer claim automáticamente - solo cuando el usuario actualice manualmente
);
});
// Estrategia: Network First, fallback to Cache
self.addEventListener('fetch', (event) => {
event.respondWith(
fetch(event.request)
.then((response) => {
// Clone la respuesta
const responseToCache = response.clone();
// Actualizar cache con la nueva respuesta
caches.open(CACHE_NAME).then((cache) => {
cache.put(event.request, responseToCache);
});
return response;
})
.catch(() => {
// Si falla la red, usar cache
return caches.match(event.request);
})
);
});
// Mensaje para notificar actualización
self.addEventListener('message', (event) => {
if (event.data && event.data.type === 'SKIP_WAITING') {
self.skipWaiting();
}
});