diff --git a/surfsense_web/components/sources/DocumentUploadTab.tsx b/surfsense_web/components/sources/DocumentUploadTab.tsx index 4c3615086..7d8f44c71 100644 --- a/surfsense_web/components/sources/DocumentUploadTab.tsx +++ b/surfsense_web/components/sources/DocumentUploadTab.tsx @@ -109,6 +109,11 @@ const FILE_TYPE_CONFIG: Record> = { }, }; +interface FileWithId { + id: string; + file: File; +} + const cardClass = "border border-border bg-slate-400/5 dark:bg-white/5"; // Upload limits — files are sent in batches of 5 to avoid proxy timeouts @@ -122,7 +127,7 @@ export function DocumentUploadTab({ onAccordionStateChange, }: DocumentUploadTabProps) { const t = useTranslations("upload_documents"); - const [files, setFiles] = useState([]); + const [files, setFiles] = useState([]); const [uploadProgress, setUploadProgress] = useState(0); const [accordionValue, setAccordionValue] = useState(""); const [shouldSummarize, setShouldSummarize] = useState(false); @@ -143,9 +148,9 @@ export function DocumentUploadTab({ const onDrop = useCallback( (acceptedFiles: File[]) => { setFiles((prev) => { - const newFiles = [...prev, ...acceptedFiles]; + const newEntries = acceptedFiles.map((f) => ({ id: crypto.randomUUID(), file: f })); + const newFiles = [...prev, ...newEntries]; - // Check file count limit if (newFiles.length > MAX_FILES) { toast.error(t("max_files_exceeded"), { description: t("max_files_exceeded_desc", { max: MAX_FILES }), @@ -153,8 +158,7 @@ export function DocumentUploadTab({ return prev; } - // Check total size limit - const newTotalSize = newFiles.reduce((sum, file) => sum + file.size, 0); + const newTotalSize = newFiles.reduce((sum, entry) => sum + entry.file.size, 0); if (newTotalSize > MAX_TOTAL_SIZE_BYTES) { toast.error(t("max_size_exceeded"), { description: t("max_size_exceeded_desc", { max: MAX_TOTAL_SIZE_MB }), @@ -189,7 +193,7 @@ export function DocumentUploadTab({ return `${parseFloat((bytes / k ** i).toFixed(2))} ${sizes[i]}`; }; - const totalFileSize = files.reduce((total, file) => total + file.size, 0); + const totalFileSize = files.reduce((total, entry) => total + entry.file.size, 0); // Check if limits are reached const isFileCountLimitReached = files.length >= MAX_FILES; @@ -217,8 +221,9 @@ export function DocumentUploadTab({ setUploadProgress((prev) => (prev >= 90 ? prev : prev + Math.random() * 10)); }, 200); + const rawFiles = files.map((entry) => entry.file); uploadDocuments( - { files, search_space_id: Number(searchSpaceId), should_summarize: shouldSummarize }, + { files: rawFiles, search_space_id: Number(searchSpaceId), should_summarize: shouldSummarize }, { onSuccess: () => { clearInterval(progressInterval); @@ -345,21 +350,21 @@ export function DocumentUploadTab({
- {files.map((file, index) => ( + {files.map((entry) => (
-

{file.name}

+

{entry.file.name}

- {formatFileSize(file.size)} + {formatFileSize(entry.file.size)} - {file.type || "Unknown type"} + {entry.file.type || "Unknown type"}
@@ -367,7 +372,7 @@ export function DocumentUploadTab({