diff --git a/frontend/package.json b/frontend/package.json index 9919164..c5ef6ca 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "checklist-frontend", "private": true, - "version": "1.2.2", + "version": "1.2.3", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/public/service-worker.js b/frontend/public/service-worker.js index 33e8bd9..35efd75 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.2.2'; +const CACHE_NAME = 'ayutec-v1.2.3'; const urlsToCache = [ '/', '/index.html' diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index a06b595..d1a78b9 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -5466,6 +5466,17 @@ function AIAssistantChatModal({ question, inspection, allAnswers, messages, setM chatEndRef.current?.scrollIntoView({ behavior: 'smooth' }) }, [messages]) + // Limpiar URLs temporales al desmontar el componente + useEffect(() => { + return () => { + attachedFiles.forEach(fileWrapper => { + if (fileWrapper?.preview) { + URL.revokeObjectURL(fileWrapper.preview) + } + }) + } + }, [attachedFiles]) + // Manejar adjuntos de archivos const handleFileAttach = (e) => { const files = Array.from(e.target.files) @@ -5478,11 +5489,28 @@ function AIAssistantChatModal({ question, inspection, allAnswers, messages, setM } return isValid }) - setAttachedFiles(prev => [...prev, ...validFiles]) + + // Crear objetos con File y URL temporal para preview + const filesWithPreview = validFiles.map(file => ({ + file: file, + preview: file.type.startsWith('image/') ? URL.createObjectURL(file) : null, + name: file.name, + type: file.type, + size: file.size + })) + + setAttachedFiles(prev => [...prev, ...filesWithPreview]) } const removeAttachedFile = (index) => { - setAttachedFiles(prev => prev.filter((_, i) => i !== index)) + setAttachedFiles(prev => { + const fileToRemove = prev[index] + // Liberar URL temporal si existe + if (fileToRemove?.preview) { + URL.revokeObjectURL(fileToRemove.preview) + } + return prev.filter((_, i) => i !== index) + }) } // Enviar mensaje al asistente @@ -5493,7 +5521,12 @@ function AIAssistantChatModal({ question, inspection, allAnswers, messages, setM role: 'user', content: inputMessage || '📎 Archivos adjuntos', timestamp: new Date().toISOString(), - files: attachedFiles.map(f => ({ name: f.name, type: f.type, size: f.size })) + files: attachedFiles.map(f => ({ + name: f.name, + type: f.type, + size: f.size, + preview: f.preview // Guardar URL temporal para mostrar en chat + })) } setMessages(prev => [...prev, userMessage]) @@ -5516,9 +5549,9 @@ function AIAssistantChatModal({ question, inspection, allAnswers, messages, setM formData.append('assistant_instructions', config.assistant_instructions || '') formData.append('response_length', config.response_length || 'medium') - // Adjuntar archivos - currentFiles.forEach((file, index) => { - formData.append('files', file) + // Adjuntar archivos (extraer el objeto File del wrapper) + currentFiles.forEach((fileWrapper, index) => { + formData.append('files', fileWrapper.file || fileWrapper) }) // Recopilar fotos de preguntas anteriores según configuración @@ -5674,12 +5707,30 @@ function AIAssistantChatModal({ question, inspection, allAnswers, messages, setM )} {/* Mostrar archivos adjuntos si existen */} {msg.files && msg.files.length > 0 && ( -
- Ayutec v1.2.2 + Ayutec v1.2.3