From a95e77669944778574cf73f05f4426b64c50171c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 20 Nov 2025 06:25:11 +0000 Subject: [PATCH] fix: improve file upload performance with batch processing and progress feedback - Add batch processing (5 files concurrently) to uploadNotes function - Use Promise.allSettled for parallel file processing - Add setTimeout(0) between batches to yield to event loop - Show loading toast when uploading more than 5 files - Add translation keys for uploading progress (en, zh-cn, zh-tw) Co-authored-by: DeJeune <67425183+DeJeune@users.noreply.github.com> --- src/renderer/src/i18n/locales/en-us.json | 3 +- src/renderer/src/i18n/locales/zh-cn.json | 3 +- src/renderer/src/i18n/locales/zh-tw.json | 3 +- src/renderer/src/pages/notes/NotesPage.tsx | 11 ++++++ src/renderer/src/services/NotesService.ts | 39 ++++++++++++++++------ 5 files changed, 46 insertions(+), 13 deletions(-) diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index c1c0dc2620..507a8d13aa 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -2175,7 +2175,8 @@ "untitled_folder": "New Folder", "untitled_note": "Untitled Note", "upload_failed": "Note upload failed", - "upload_success": "Note uploaded success" + "upload_success": "Note uploaded success", + "uploading_files": "Uploading {{count}} files..." }, "notification": { "assistant": "Assistant Response", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 2a1ee09688..b3c6c9515f 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -2175,7 +2175,8 @@ "untitled_folder": "新文件夹", "untitled_note": "无标题笔记", "upload_failed": "笔记上传失败", - "upload_success": "笔记上传成功" + "upload_success": "笔记上传成功", + "uploading_files": "正在上传 {{count}} 个文件..." }, "notification": { "assistant": "助手响应", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index f5a0264875..cefdf0f826 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -2175,7 +2175,8 @@ "untitled_folder": "新資料夾", "untitled_note": "無標題筆記", "upload_failed": "筆記上傳失敗", - "upload_success": "筆記上傳成功" + "upload_success": "筆記上傳成功", + "uploading_files": "正在上傳 {{count}} 個檔案..." }, "notification": { "assistant": "助手回應", diff --git a/src/renderer/src/pages/notes/NotesPage.tsx b/src/renderer/src/pages/notes/NotesPage.tsx index 105ceee36a..ce4528792f 100644 --- a/src/renderer/src/pages/notes/NotesPage.tsx +++ b/src/renderer/src/pages/notes/NotesPage.tsx @@ -621,8 +621,19 @@ const NotesPage: FC = () => { throw new Error('No folder path selected') } + // Show loading toast for multiple files to indicate processing + let loadingToast: number | string | undefined + if (files.length > 5) { + loadingToast = window.toast.loading(t('notes.uploading_files', { count: files.length })) + } + const result = await uploadNotes(files, targetFolderPath) + // Dismiss loading toast if shown + if (loadingToast) { + window.toast.dismiss(loadingToast) + } + // 检查上传结果 if (result.fileCount === 0) { window.toast.warning(t('notes.no_valid_files')) diff --git a/src/renderer/src/services/NotesService.ts b/src/renderer/src/services/NotesService.ts index 940c8db106..914fbd4114 100644 --- a/src/renderer/src/services/NotesService.ts +++ b/src/renderer/src/services/NotesService.ts @@ -101,18 +101,37 @@ export async function uploadNotes(files: File[], targetPath: string): Promise { + const { dir, name } = resolveFileTarget(file, basePath) + const { safeName } = await window.api.file.checkFileName(dir, name, true) + const finalPath = `${dir}/${safeName}${MARKDOWN_EXT}` - try { - const content = await file.text() - await window.api.file.write(finalPath, content) - fileCount += 1 - } catch (error) { - logger.error('Failed to write uploaded file:', error as Error) + const content = await file.text() + await window.api.file.write(finalPath, content) + return true + }) + ) + + // Count successful uploads + results.forEach((result) => { + if (result.status === 'fulfilled') { + fileCount += 1 + } else { + logger.error('Failed to write uploaded file:', result.reason) + } + }) + + // Yield to the event loop between batches to keep UI responsive + if (i + BATCH_SIZE < markdownFiles.length) { + await new Promise((resolve) => setTimeout(resolve, 0)) } }