From d2ce24dcc68ce09877dbb9f60c24ffc28ef3ce5e Mon Sep 17 00:00:00 2001 From: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Sat, 27 Dec 2025 15:09:16 +0900 Subject: [PATCH 01/10] =?UTF-8?q?fix(frontend):=20=E3=83=AD=E3=82=B0?= =?UTF-8?q?=E3=82=A2=E3=82=A6=E3=83=88=E3=81=99=E3=82=8B=E3=81=A8=E3=81=99?= =?UTF-8?q?=E3=81=B9=E3=81=A6=E3=81=AE=E3=82=A2=E3=82=AB=E3=82=A6=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=81=8B=E3=82=89=E3=83=AD=E3=82=B0=E3=82=A2=E3=82=A6?= =?UTF-8?q?=E3=83=88=E3=81=95=E3=82=8C=E3=82=8B=E5=95=8F=E9=A1=8C=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/ja-JP.yml | 3 + packages/frontend/src/accounts.ts | 23 ++-- .../src/components/MkUserCardMini.vue | 2 +- packages/frontend/src/lib/pizzax.ts | 39 ++++++ .../frontend/src/pages/settings/accounts.vue | 121 ++++++++++++++---- packages/frontend/src/preferences/manager.ts | 30 +++++ packages/frontend/src/signout.ts | 62 +++++++-- packages/frontend/src/store.ts | 4 +- packages/i18n/src/autogen/locale.ts | 12 ++ 9 files changed, 248 insertions(+), 48 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 1eea745e0c..516922f83f 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -34,6 +34,7 @@ noAccountDescription: "自己紹介はありません" login: "ログイン" loggingIn: "ログイン中" logout: "ログアウト" +logoutFromAll: "すべてのアカウントからログアウト" signup: "新規登録" uploading: "アップロード中" save: "保存" @@ -991,6 +992,8 @@ numberOfPageCache: "ページキャッシュ数" numberOfPageCacheDescription: "多くすると利便性が向上しますが、負荷とメモリ使用量が増えます。" logoutConfirm: "ログアウトしますか?" logoutWillClearClientData: "ログアウトするとクライアントの設定情報がブラウザから消去されます。再ログイン時に設定情報を復元できるようにするためには、設定の自動バックアップを有効にしてください。" +removeAccountConfirm: "{username}からログアウトしますか?" +removeAccountWillClearClientData: "このアカウントを削除すると、このアカウントに関するクライアントの設定情報がブラウザから消去されます。再度このアカウントでログインする場合、設定情報を復元できるようにするためには、このアカウントに切り替えて、設定の自動バックアップを有効にしてください。" lastActiveDate: "最終利用日時" statusbar: "ステータスバー" pleaseSelect: "選択してください" diff --git a/packages/frontend/src/accounts.ts b/packages/frontend/src/accounts.ts index 79086c2b39..c66d3819af 100644 --- a/packages/frontend/src/accounts.ts +++ b/packages/frontend/src/accounts.ts @@ -19,13 +19,15 @@ import { signout } from '@/signout.js'; type AccountWithToken = Misskey.entities.MeDetailed & { token: string }; -export async function getAccounts(): Promise<{ +export type AccountData = { host: string; id: Misskey.entities.User['id']; username: Misskey.entities.User['username']; user?: Misskey.entities.MeDetailed | null; token: string | null; -}[]> { +}; + +export async function getAccounts(): Promise { const tokens = store.s.accountTokens; const accountInfos = store.s.accountInfos; const accounts = prefer.s.accounts; @@ -162,14 +164,17 @@ export async function refreshCurrentAccount() { }); } -export async function login(token: AccountWithToken['token'], redirect?: string) { +export async function login(token: AccountWithToken['token'], redirect?: string, showWaiting = true) { const showing = ref(true); - const { dispose } = popup(defineAsyncComponent(() => import('@/components/MkWaitingDialog.vue')), { - success: false, - showing: showing, - }, { - closed: () => dispose(), - }); + + if (showWaiting) { + const { dispose } = popup(defineAsyncComponent(() => import('@/components/MkWaitingDialog.vue')), { + success: false, + showing: showing, + }, { + closed: () => dispose(), + }); + } const me = await fetchAccount(token, undefined, true).catch(reason => { showing.value = false; diff --git a/packages/frontend/src/components/MkUserCardMini.vue b/packages/frontend/src/components/MkUserCardMini.vue index dde2efd8ee..b65ac79bf6 100644 --- a/packages/frontend/src/components/MkUserCardMini.vue +++ b/packages/frontend/src/components/MkUserCardMini.vue @@ -7,7 +7,7 @@ SPDX-License-Identifier: AGPL-3.0-only
- + @{{ acct(user) }}
diff --git a/packages/frontend/src/lib/pizzax.ts b/packages/frontend/src/lib/pizzax.ts index 80543d10e4..e96af3401e 100644 --- a/packages/frontend/src/lib/pizzax.ts +++ b/packages/frontend/src/lib/pizzax.ts @@ -222,6 +222,45 @@ export class Pizzax { return this.def[key].default; } + /** 現在のアカウントに紐づくデータをデバイスから削除します */ + public async clearCurrentAccountDataFromDevice() { + if ($i == null) return; + + // deviceAccount + { + const deviceAccountState = await get(this.deviceAccountStateKeyName) || {}; + let changed = false; + for (const [k, v] of Object.entries(this.def) as [keyof T, T[keyof T]['default']][]) { + if (v.where === 'deviceAccount' && Object.prototype.hasOwnProperty.call(deviceAccountState, k)) { + delete deviceAccountState[k]; + changed = true; + } + } + if (changed) { + await this.addIdbSetJob(async () => { + await set(this.deviceAccountStateKeyName, deviceAccountState); + }); + } + } + + // account (cacheを消す) + { + const registryCache = await get(this.registryCacheKeyName) || {}; + let changed = false; + for (const [k, v] of Object.entries(this.def) as [keyof T, T[keyof T]['default']][]) { + if (v.where === 'account' && Object.prototype.hasOwnProperty.call(registryCache, k)) { + delete registryCache[k]; + changed = true; + } + } + if (changed) { + await this.addIdbSetJob(async () => { + await set(this.registryCacheKeyName, registryCache); + }); + } + } + } + /** * 特定のキーの、簡易的なgetter/setterを作ります * 主にvue上で設定コントロールのmodelとして使う用 diff --git a/packages/frontend/src/pages/settings/accounts.vue b/packages/frontend/src/pages/settings/accounts.vue index 764ec72652..63eda39dfb 100644 --- a/packages/frontend/src/pages/settings/accounts.vue +++ b/packages/frontend/src/pages/settings/accounts.vue @@ -8,11 +8,23 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts.addAccount }} + {{ i18n.ts.logoutFromAll }}
@@ -20,36 +32,69 @@ SPDX-License-Identifier: AGPL-3.0-only