From 42046caf2cb76649cc928f39e8b450c35f8a0a5e Mon Sep 17 00:00:00 2001 From: shenmo Date: Thu, 16 Apr 2026 14:00:33 +0800 Subject: [PATCH] =?UTF-8?q?feat(update-center):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E7=8A=B6=E6=80=81=E5=A4=84=E7=90=86=E5=8F=8A?= =?UTF-8?q?UI=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为更新中心添加加载状态管理,包括: - 在打开和刷新操作时显示加载状态 - 禁用刷新按钮防止重复操作 - 添加加载中的动画效果和提示文本 - 优化加载时的UI显示 --- electron/main/backend/update-center/index.ts | 9 +++- .../update-center/UpdateCenterModal.test.ts | 49 +++++++++++++++++++ .../unit/update-center/store.test.ts | 17 ++++++- src/components/UpdateCenterModal.vue | 36 ++++++++++---- .../update-center/UpdateCenterToolbar.vue | 8 +-- src/modules/updateCenter.ts | 22 +++++++-- 6 files changed, 122 insertions(+), 19 deletions(-) diff --git a/electron/main/backend/update-center/index.ts b/electron/main/backend/update-center/index.ts index 808dd7d9..b6edd005 100644 --- a/electron/main/backend/update-center/index.ts +++ b/electron/main/backend/update-center/index.ts @@ -191,7 +191,14 @@ const loadAptssItemMetadata = async ( } const metadata = parsePrintUrisOutput(metadataResult.stdout); - console.log(`[DEBUG] APTSS parsed metadata:`, metadata); + if (metadata) { + console.log(`[DEBUG] APTSS parsed metadata:`, { + ...metadata, + downloadUrl: `${metadata.downloadUrl}.metalink`, + }); + } else { + console.log(`[DEBUG] APTSS parsed metadata:`, metadata); + } if (!metadata) { return { diff --git a/src/__tests__/unit/update-center/UpdateCenterModal.test.ts b/src/__tests__/unit/update-center/UpdateCenterModal.test.ts index 17290d8c..069e47eb 100644 --- a/src/__tests__/unit/update-center/UpdateCenterModal.test.ts +++ b/src/__tests__/unit/update-center/UpdateCenterModal.test.ts @@ -63,6 +63,7 @@ const createStore = ( return { isOpen: ref(true), + loading: ref(false), showCloseConfirm: ref(true), showMigrationConfirm: ref(false), searchQuery: ref(""), @@ -220,4 +221,52 @@ describe("UpdateCenterModal", () => { expect(store.requestClose).toHaveBeenCalledTimes(1); }); + + it("shows loading panel when loading with no items", () => { + const store = createStore({ + items: [], + tasks: [], + warnings: [], + hasRunningTasks: false, + }); + store.loading.value = true; + + render(UpdateCenterModal, { + props: { + show: true, + store, + }, + }); + + expect(screen.getByText("正在检查更新…")).toBeTruthy(); + }); + + it("shows refresh hint while loading with existing items", () => { + const store = createStore({ hasRunningTasks: false }); + store.loading.value = true; + + render(UpdateCenterModal, { + props: { + show: true, + store, + }, + }); + + expect(screen.getByText("Spark Weather")).toBeTruthy(); + expect(screen.getByText("正在刷新更新列表…")).toBeTruthy(); + }); + + it("disables refresh button while loading", () => { + const store = createStore({ hasRunningTasks: false }); + store.loading.value = true; + + render(UpdateCenterModal, { + props: { + show: true, + store, + }, + }); + + expect(screen.getByRole("button", { name: /刷新/ })).toBeDisabled(); + }); }); diff --git a/src/__tests__/unit/update-center/store.test.ts b/src/__tests__/unit/update-center/store.test.ts index 8481ac22..e2ef7884 100644 --- a/src/__tests__/unit/update-center/store.test.ts +++ b/src/__tests__/unit/update-center/store.test.ts @@ -61,10 +61,16 @@ describe("updateCenter store", () => { open.mockResolvedValue(snapshot); const store = createUpdateCenterStore(); - await store.open("apm"); + const openPromise = store.open("apm"); + + expect(store.isOpen.value).toBe(true); + expect(store.loading.value).toBe(true); + + await openPromise; expect(open).toHaveBeenCalledWith("apm"); expect(store.isOpen.value).toBe(true); + expect(store.loading.value).toBe(false); expect(store.snapshot.value).toEqual(snapshot); expect(store.filteredItems.value).toEqual(snapshot.items); }); @@ -76,7 +82,12 @@ describe("updateCenter store", () => { const store = createUpdateCenterStore(); await store.open("apm"); - await store.refresh(); + + const refreshPromise = store.refresh(); + expect(store.loading.value).toBe(true); + + await refreshPromise; + expect(store.loading.value).toBe(false); expect(refresh).toHaveBeenCalledWith("apm"); }); @@ -209,11 +220,13 @@ describe("updateCenter store", () => { it("blocks close requests while the snapshot reports running tasks", () => { const store = createUpdateCenterStore(); store.isOpen.value = true; + store.loading.value = true; store.snapshot.value = createSnapshot({ hasRunningTasks: true }); store.requestClose(); expect(store.isOpen.value).toBe(false); + expect(store.loading.value).toBe(false); expect(store.showCloseConfirm.value).toBe(false); }); diff --git a/src/components/UpdateCenterModal.vue b/src/components/UpdateCenterModal.vue index f50d1406..7660c37a 100644 --- a/src/components/UpdateCenterModal.vue +++ b/src/components/UpdateCenterModal.vue @@ -22,6 +22,7 @@ :selected-count="selectedCount" :all-selected="store.allSelected.value" :some-selected="store.someSelected.value" + :loading="store.loading.value" @refresh="store.refresh" @start-selected="emit('request-start-selected')" @request-close="store.requestClose" @@ -42,16 +43,33 @@

-
- +
+
+ +

正在检查更新…

+
+