فهرست منبع

feat: file upload error handling

Timothy J. Baek 1 سال پیش
والد
کامیت
9a63376e55
3فایلهای تغییر یافته به همراه91 افزوده شده و 42 حذف شده
  1. 1 0
      backend/apps/rag/main.py
  2. 82 42
      src/lib/components/chat/MessageInput.svelte
  3. 8 0
      src/routes/(app)/+page.svelte

+ 1 - 0
backend/apps/rag/main.py

@@ -28,6 +28,7 @@ from pydantic import BaseModel
 from typing import Optional
 
 import uuid
+import time
 
 from utils.misc import calculate_sha256
 from utils.utils import get_current_user

+ 82 - 42
src/lib/components/chat/MessageInput.svelte

@@ -91,6 +91,26 @@
 		}
 	};
 
+	const uploadDoc = async (file) => {
+		console.log(file);
+
+		const doc = {
+			type: 'doc',
+			name: file.name,
+			collection_name: '',
+			upload_status: false,
+			error: ''
+		};
+
+		files = [...files, doc];
+		const res = await uploadDocToVectorDB(localStorage.token, '', file);
+
+		if (res) {
+			doc.upload_status = true;
+			files = files;
+		}
+	};
+
 	onMount(() => {
 		const dropZone = document.querySelector('body');
 
@@ -123,19 +143,7 @@
 					if (['image/gif', 'image/jpeg', 'image/png'].includes(file['type'])) {
 						reader.readAsDataURL(file);
 					} else if (['application/pdf', 'text/plain', 'text/csv'].includes(file['type'])) {
-						console.log(file);
-						const res = await uploadDocToVectorDB(localStorage.token, '', file);
-
-						if (res) {
-							files = [
-								...files,
-								{
-									type: 'doc',
-									name: file.name,
-									collection_name: res.collection_name
-								}
-							];
-						}
+						uploadDoc(file);
 					} else {
 						toast.error(`Unsupported File Type '${file['type']}'.`);
 					}
@@ -241,20 +249,8 @@
 							if (['image/gif', 'image/jpeg', 'image/png'].includes(file['type'])) {
 								reader.readAsDataURL(file);
 							} else if (['application/pdf', 'text/plain', 'text/csv'].includes(file['type'])) {
-								console.log(file);
-								const res = await uploadDocToVectorDB(localStorage.token, '', file);
-
-								if (res) {
-									files = [
-										...files,
-										{
-											type: 'doc',
-											name: file.name,
-											collection_name: res.collection_name
-										}
-									];
-									filesInputElement.value = '';
-								}
+								uploadDoc(file);
+								filesInputElement.value = '';
 							} else {
 								toast.error(`Unsupported File Type '${file['type']}'.`);
 								inputFiles = null;
@@ -281,21 +277,65 @@
 											class="h-16 w-[15rem] flex items-center space-x-3 px-2.5 dark:bg-gray-600 rounded-xl border border-gray-200 dark:border-none"
 										>
 											<div class="p-2.5 bg-red-400 text-white rounded-lg">
-												<svg
-													xmlns="http://www.w3.org/2000/svg"
-													viewBox="0 0 24 24"
-													fill="currentColor"
-													class="w-6 h-6"
-												>
-													<path
-														fill-rule="evenodd"
-														d="M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625ZM7.5 15a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 7.5 15Zm.75 2.25a.75.75 0 0 0 0 1.5H12a.75.75 0 0 0 0-1.5H8.25Z"
-														clip-rule="evenodd"
-													/>
-													<path
-														d="M12.971 1.816A5.23 5.23 0 0 1 14.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 0 1 3.434 1.279 9.768 9.768 0 0 0-6.963-6.963Z"
-													/>
-												</svg>
+												{#if file.upload_status}
+													<svg
+														xmlns="http://www.w3.org/2000/svg"
+														viewBox="0 0 24 24"
+														fill="currentColor"
+														class="w-6 h-6"
+													>
+														<path
+															fill-rule="evenodd"
+															d="M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625ZM7.5 15a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 7.5 15Zm.75 2.25a.75.75 0 0 0 0 1.5H12a.75.75 0 0 0 0-1.5H8.25Z"
+															clip-rule="evenodd"
+														/>
+														<path
+															d="M12.971 1.816A5.23 5.23 0 0 1 14.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 0 1 3.434 1.279 9.768 9.768 0 0 0-6.963-6.963Z"
+														/>
+													</svg>
+												{:else}
+													<svg
+														class=" w-6 h-6 translate-y-[0.5px]"
+														fill="currentColor"
+														viewBox="0 0 24 24"
+														xmlns="http://www.w3.org/2000/svg"
+														><style>
+															.spinner_qM83 {
+																animation: spinner_8HQG 1.05s infinite;
+															}
+															.spinner_oXPr {
+																animation-delay: 0.1s;
+															}
+															.spinner_ZTLf {
+																animation-delay: 0.2s;
+															}
+															@keyframes spinner_8HQG {
+																0%,
+																57.14% {
+																	animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);
+																	transform: translate(0);
+																}
+																28.57% {
+																	animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);
+																	transform: translateY(-6px);
+																}
+																100% {
+																	transform: translate(0);
+																}
+															}
+														</style><circle class="spinner_qM83" cx="4" cy="12" r="2.5" /><circle
+															class="spinner_qM83 spinner_oXPr"
+															cx="12"
+															cy="12"
+															r="2.5"
+														/><circle
+															class="spinner_qM83 spinner_ZTLf"
+															cx="20"
+															cy="12"
+															r="2.5"
+														/></svg
+													>
+												{/if}
 											</div>
 
 											<div class="flex flex-col justify-center -space-y-0.5">

+ 8 - 0
src/routes/(app)/+page.svelte

@@ -124,6 +124,14 @@
 		} else if (messages.length != 0 && messages.at(-1).done != true) {
 			// Response not done
 			console.log('wait');
+		} else if (
+			files.length > 0 &&
+			files.filter((file) => file.upload_status === false).length > 0
+		) {
+			// Upload not done
+			toast.error(
+				`Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.`
+			);
 		} else {
 			// Reset chat message textarea height
 			document.getElementById('chat-textarea').style.height = '';