diff --git a/frontend/package.json b/frontend/package.json index c217920..ebb992f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "checklist-frontend", "private": true, - "version": "1.3.3", + "version": "1.3.4", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/public/service-worker.js b/frontend/public/service-worker.js index be650a3..36e7eac 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.3.3'; +const CACHE_NAME = 'ayutec-v1.3.4'; const urlsToCache = [ '/', '/index.html' diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 7245b6c..f48f721 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -5593,20 +5593,11 @@ function AIAssistantChatModal({ question, inspection, allAnswers, messages, setM const sendMessage = async () => { if ((!inputMessage.trim() && attachedFiles.length === 0) || loading) return - const userMessage = { - role: 'user', - content: inputMessage || '📎 Archivos adjuntos', - timestamp: new Date().toISOString(), - 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]) - + // Guardar datos antes de limpiar const currentFiles = attachedFiles + const userMessageText = inputMessage || '📎 Archivos adjuntos' + + // Limpiar inputs setInputMessage('') setAttachedFiles([]) setLoading(true) @@ -5713,46 +5704,38 @@ function AIAssistantChatModal({ question, inspection, allAnswers, messages, setM const data = await response.json() console.log('📥 Respuesta de IA:', data) - // Actualizar el mensaje del usuario con las URLs reales de S3 - if (data.attached_files && data.attached_files.length > 0) { - setMessages(prev => { - const updated = [...prev] - const lastUserMsgIndex = updated.length - 1 - if (updated[lastUserMsgIndex].role === 'user' && updated[lastUserMsgIndex].files) { - // Reemplazar blob URLs con URLs de S3 - updated[lastUserMsgIndex].files = updated[lastUserMsgIndex].files.map((file, idx) => { - const serverFile = data.attached_files[idx] - if (serverFile?.url) { - // Liberar blob URL anterior - if (file.preview) { - URL.revokeObjectURL(file.preview) - } - return { - ...file, - preview: serverFile.url // Ahora es URL de S3 - } - } - return file - }) + // Crear mensaje del usuario CON las URLs de S3 del servidor + const userMessage = { + role: 'user', + content: userMessageText, + timestamp: new Date().toISOString(), + files: (data.attached_files || []).map((serverFile, idx) => { + const originalFile = currentFiles[idx] + + // Liberar blob URL si existe + if (originalFile?.preview) { + URL.revokeObjectURL(originalFile.preview) + } + + return { + name: serverFile.filename || originalFile?.name || 'archivo', + type: serverFile.type || originalFile?.type || 'application/octet-stream', + size: originalFile?.size || 0, + preview: serverFile.url || originalFile?.preview // Usar URL de S3, fallback a blob } - return updated }) } - // Crear mensaje del asistente con archivos adjuntos (usando URLs del servidor) + // Crear mensaje del asistente const assistantMessage = { role: 'assistant', content: data.response, timestamp: new Date().toISOString(), - confidence: data.confidence, - attachedFiles: data.attached_files?.map(f => ({ - filename: f.filename, - type: f.type, - url: f.url // URL de S3, no blob - })) || [] + confidence: data.confidence } - setMessages(prev => [...prev, assistantMessage]) + // Agregar ambos mensajes (usuario + asistente) + setMessages(prev => [...prev, userMessage, assistantMessage]) } catch (error) { console.error('Error al enviar mensaje:', error) diff --git a/frontend/src/Sidebar.jsx b/frontend/src/Sidebar.jsx index 55e626a..f1075b8 100644 --- a/frontend/src/Sidebar.jsx +++ b/frontend/src/Sidebar.jsx @@ -153,7 +153,7 @@ export default function Sidebar({ user, activeTab, setActiveTab, sidebarOpen, se className="w-10 h-10 object-contain bg-white rounded p-1" />

- Ayutec v1.3.3 + Ayutec v1.3.4