📸 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
68 lines
1.9 KiB
JavaScript
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();
|
|
}
|
|
});
|