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 @@
-
-
+
+
+
+ 正在刷新更新列表…
+
+
+
+
+