diff --git a/frontend/src/components/MessageInput.tsx b/frontend/src/components/MessageInput.tsx index 1e3576ee..62e6dea0 100644 --- a/frontend/src/components/MessageInput.tsx +++ b/frontend/src/components/MessageInput.tsx @@ -9,13 +9,16 @@ import SourceIcon from '../assets/source.svg'; import ToolIcon from '../assets/tool.svg'; import SpinnerDark from '../assets/spinner-dark.svg'; import Spinner from '../assets/spinner.svg'; +import ExitIcon from '../assets/exit.svg'; +import AlertIcon from '../assets/alert.svg'; import SourcesPopup from './SourcesPopup'; import ToolsPopup from './ToolsPopup'; import { selectSelectedDocs, selectToken } from '../preferences/preferenceSlice'; import { ActiveState } from '../models/misc'; import Upload from '../upload/Upload'; import ClipIcon from '../assets/clip.svg'; -import { setAttachments } from '../conversation/conversationSlice'; +import { setAttachments, removeAttachment } from '../conversation/conversationSlice'; + interface MessageInputProps { value: string; @@ -71,50 +74,59 @@ export default function MessageInput({ status: 'uploading' }; - setUploads(prev => [...prev, uploadState]); - const uploadIndex = uploads.length; - - xhr.upload.addEventListener('progress', (event) => { - if (event.lengthComputable) { - const progress = Math.round((event.loaded / event.total) * 100); - setUploads(prev => prev.map((upload, index) => - index === uploadIndex - ? { ...upload, progress } - : upload - )); - } - }); - - xhr.onload = () => { - if (xhr.status === 200) { - const response = JSON.parse(xhr.responseText); - console.log('File uploaded successfully:', response); - - if (response.task_id) { - setUploads(prev => prev.map((upload, index) => - index === uploadIndex - ? { ...upload, taskId: response.task_id, status: 'processing' } + setUploads(prev => { + const newUploads = [...prev, uploadState]; + const uploadIndex = newUploads.length - 1; + + xhr.upload.addEventListener('progress', (event) => { + if (event.lengthComputable) { + const progress = Math.round((event.loaded / event.total) * 100); + setUploads(current => current.map((upload, idx) => + idx === uploadIndex + ? { ...upload, progress } : upload )); } - } else { - setUploads(prev => prev.map((upload, index) => - index === uploadIndex + }); + + xhr.onload = () => { + if (xhr.status === 200) { + const response = JSON.parse(xhr.responseText); + console.log('File uploaded successfully:', response); + + if (response.task_id) { + setUploads(current => current.map((upload, idx) => + idx === uploadIndex + ? { + ...upload, + taskId: response.task_id, + status: 'processing', + progress: 10 + } + : upload + )); + } + } else { + setUploads(current => current.map((upload, idx) => + idx === uploadIndex + ? { ...upload, status: 'failed' } + : upload + )); + console.error('Error uploading file:', xhr.responseText); + } + }; + + xhr.onerror = () => { + setUploads(current => current.map((upload, idx) => + idx === uploadIndex ? { ...upload, status: 'failed' } : upload )); - console.error('Error uploading file:', xhr.responseText); - } - }; - - xhr.onerror = () => { - setUploads(prev => prev.map((upload, index) => - index === uploadIndex - ? { ...upload, status: 'failed' } - : upload - )); - console.error('Network error during file upload'); - }; + console.error('Network error during file upload'); + }; + + return newUploads; + }); xhr.open('POST', `${apiHost}${endpoints.USER.STORE_ATTACHMENT}`); xhr.setRequestHeader('Authorization', `Bearer ${token}`); @@ -233,45 +245,68 @@ export default function MessageInput({ {uploads.map((upload, index) => (