From 3a4aa7807a6ba198fc0fb1549fe5066200fd39e9 Mon Sep 17 00:00:00 2001 From: momen Date: Tue, 19 May 2026 00:07:26 +0800 Subject: [PATCH] fix(favorites): clear account data on logout --- src/App.vue | 32 +++++++++++++++-- .../unit/App.account-placeholders.test.ts | 34 ++++++++++++++++++- 2 files changed, 62 insertions(+), 4 deletions(-) diff --git a/src/App.vue b/src/App.vue index cc6bc309..62aed9cb 100644 --- a/src/App.vue +++ b/src/App.vue @@ -35,7 +35,7 @@ @open-favorites="openFavoriteManagement" @open-forum="openExternalUrl(FLARUM_BASE_URL)" @edit-profile="openExternalUrl(FLARUM_SETTINGS_URL)" - @logout="logout" + @logout="handleLogout" /> @@ -1318,6 +1318,29 @@ const openLoginFromPrompt = () => { showLoginModal.value = true; }; +const clearFavoriteState = () => { + favoriteFolders.value = []; + activeFavoriteFolderId.value = null; + favoriteItems.value = []; + showFavoriteSelector.value = false; + favoriteTargetApp.value = null; + favoriteLoading.value = false; + favoriteError.value = ""; +}; + +const handleLogout = () => { + logout(); + clearFavoriteState(); + showLoginModal.value = false; + showLoginPrompt.value = false; + isSidebarOpen.value = false; + if (currentView.value === "favorites" || currentView.value === "account") { + currentView.value = "default"; + activeTab.value = "home"; + selectedCategory.value = "all"; + } +}; + const handleFlarumLogin = async (payload: FlarumLoginPayload) => { loginLoading.value = true; loginError.value = ""; @@ -1347,8 +1370,11 @@ const openUserManagement = () => { const loadFavoriteFolders = async (): Promise => { favoriteFolders.value = await listFavoriteFolders(); - if (!activeFavoriteFolderId.value && favoriteFolders.value.length > 0) { - activeFavoriteFolderId.value = favoriteFolders.value[0].id; + const activeFolderExists = favoriteFolders.value.some( + (folder) => folder.id === activeFavoriteFolderId.value, + ); + if (!activeFolderExists) { + activeFavoriteFolderId.value = favoriteFolders.value[0]?.id ?? null; } }; diff --git a/src/__tests__/unit/App.account-placeholders.test.ts b/src/__tests__/unit/App.account-placeholders.test.ts index cde5ebc3..df9debbe 100644 --- a/src/__tests__/unit/App.account-placeholders.test.ts +++ b/src/__tests__/unit/App.account-placeholders.test.ts @@ -163,7 +163,9 @@ describe("App account placeholders", () => { it("shows the favorites placeholder from the logged-in quick menu", async () => { render(App); - await fireEvent.click(await screen.findByRole("button", { name: /Momen/ })); + await fireEvent.click( + await screen.findByRole("button", { name: /^Momen$/ }), + ); await fireEvent.click(screen.getByText("我的收藏")); expect( @@ -259,4 +261,34 @@ describe("App account placeholders", () => { pkgnameList: ["wps"], }); }); + + it("clears favorite data and leaves protected favorites view after logout", async () => { + render(App); + + await fireEvent.click(await screen.findByRole("button", { name: /Momen/ })); + await fireEvent.click(screen.getByText("我的收藏")); + + expect( + await screen.findByRole("heading", { name: "我的收藏" }), + ).toBeTruthy(); + expect(await screen.findByText("默认收藏夹 (1)")).toBeTruthy(); + expect(await screen.findByText("wps · office")).toBeTruthy(); + + await fireEvent.click( + await screen.findByRole("button", { name: /^Momen$/ }), + ); + if (!screen.queryByText("退出登录")) { + await fireEvent.click( + await screen.findByRole("button", { name: /^Momen$/ }), + ); + } + await fireEvent.click(screen.getByText("退出登录")); + + await waitFor(() => { + expect(screen.getByRole("button", { name: "登录 / 注册" })).toBeTruthy(); + }); + expect(screen.queryByText("默认收藏夹 (1)")).toBeNull(); + expect(screen.queryByText("wps · office")).toBeNull(); + expect(screen.queryByRole("heading", { name: "我的收藏" })).toBeNull(); + }); });