diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8a4576a76cbf..875d14ef683a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,6 +19,7 @@
- Fix: MiAuth認可画面で、認可処理に失敗した場合でもコールバックURLに遷移してしまう問題を修正
(Cherry-picked from https://github.com/TeamNijimiss/misskey/commit/800359623e41a662551d774de15b0437b6849bb4)
- Fix: ノート作成画面でファイルの添付可能個数を超えてもノートボタンが押せていた問題を修正
+- Fix: 「アカウントを管理」画面で、ユーザー情報の取得に失敗したアカウント(削除されたアカウントなど)が表示されない問題を修正
### Server
- Fix: ユーザーのプロフィール画面をアドレス入力などで直接表示した際に概要タブの描画に失敗する問題の修正( #15032 )
diff --git a/packages/frontend/src/pages/settings/accounts.vue b/packages/frontend/src/pages/settings/accounts.vue
index 97e960675faf..c2588736b35a 100644
--- a/packages/frontend/src/pages/settings/accounts.vue
+++ b/packages/frontend/src/pages/settings/accounts.vue
@@ -12,7 +12,16 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts.reloadAccountsList }}
-
+
+
+
+
@@ -29,9 +38,10 @@ import { getAccounts, removeAccount as _removeAccount, login, $i, getAccountWith
import { i18n } from '@/i18n.js';
import { definePageMetadata } from '@/scripts/page-metadata.js';
import MkUserCardMini from '@/components/MkUserCardMini.vue';
+import { MenuItem } from '@/types/menu';
const storedAccounts = ref<{ id: string, token: string }[] | null>(null);
-const accounts = ref([]);
+const accounts = ref(new Map());
const init = async () => {
getAccounts().then(accounts => {
@@ -41,21 +51,35 @@ const init = async () => {
userIds: storedAccounts.value.map(x => x.id),
});
}).then(response => {
- accounts.value = response;
+ if (storedAccounts.value == null) return;
+ accounts.value = new Map(storedAccounts.value.map(x => [x.id, response.find((y: Misskey.entities.UserDetailed) => y.id === x.id) ?? null]));
});
};
-function menu(account: Misskey.entities.UserDetailed, ev: MouseEvent) {
- os.popupMenu([{
- text: i18n.ts.switch,
- icon: 'ti ti-switch-horizontal',
- action: () => switchAccount(account),
- }, {
- text: i18n.ts.logout,
- icon: 'ti ti-trash',
- danger: true,
- action: () => removeAccount(account),
- }], ev.currentTarget ?? ev.target);
+function menu(account: Misskey.entities.UserDetailed | string, ev: MouseEvent) {
+ let menu: MenuItem[];
+
+ if (typeof account === 'string') {
+ menu = [{
+ text: i18n.ts.logout,
+ icon: 'ti ti-trash',
+ danger: true,
+ action: () => removeAccount(account),
+ }];
+ } else {
+ menu = [{
+ text: i18n.ts.switch,
+ icon: 'ti ti-switch-horizontal',
+ action: () => switchAccount(account.id),
+ }, {
+ text: i18n.ts.logout,
+ icon: 'ti ti-trash',
+ danger: true,
+ action: () => removeAccount(account.id),
+ }];
+ }
+
+ os.popupMenu(menu, ev.currentTarget ?? ev.target);
}
function addAccount(ev: MouseEvent) {
@@ -68,9 +92,9 @@ function addAccount(ev: MouseEvent) {
}], ev.currentTarget ?? ev.target);
}
-async function removeAccount(account: Misskey.entities.UserDetailed) {
- await _removeAccount(account.id);
- accounts.value = accounts.value.filter(x => x.id !== account.id);
+async function removeAccount(id: string) {
+ await _removeAccount(id);
+ accounts.value.delete(id);
}
function addExistingAccount() {
@@ -90,9 +114,9 @@ function createAccount() {
});
}
-async function switchAccount(account: Misskey.entities.UserDetailed) {
+async function switchAccount(id: string) {
const fetchedAccounts = await getAccounts();
- const token = fetchedAccounts.find(x => x.id === account.id)!.token;
+ const token = fetchedAccounts.find(x => x.id === id)!.token;
switchAccountWithToken(token);
}
@@ -112,6 +136,49 @@ definePageMetadata(() => ({