diff --git a/CHANGELOG.md b/CHANGELOG.md index 910328a915..38dab6591b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,10 +7,12 @@ - Enhance: AiScriptAppウィジェットで構文エラーを検知してもダイアログではなくウィジェット内にエラーを表示するように - Enhance: /flushページでサイトキャッシュをクリアできるようになりました - Enhance: クリップ/リスト/アンテナ/ロール追加系メニュー項目において、表示件数を拡張 +- Enhance: 「キャッシュを削除」ボタンでブラウザの内部キャッシュの削除も行えるように - Enhance: プロフィールへのリンクをユーザーポップアップのアバターに追加 - Enhance: ユーザーのノート、フォロー、フォロワーページへのリンクをユーザーポップアップに追加 - Fix: プッシュ通知を有効にできない問題を修正 - Fix: RSSティッカーウィジェットが正しく動作しない問題を修正 +- Fix: プロファイルを復元後アカウントの切り替えができない問題を修正 - Fix: エラー画像が横に引き伸ばされてしまう問題に対応 ### Server diff --git a/package.json b/package.json index df1b3892bb..faafb9c264 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "2025.9.0-alpha.0", + "version": "2025.9.0-alpha.1", "codename": "nasubi", "repository": { "type": "git", diff --git a/packages/backend/src/server/api/ApiServerService.ts b/packages/backend/src/server/api/ApiServerService.ts index 32818003ad..57d74ef2b1 100644 --- a/packages/backend/src/server/api/ApiServerService.ts +++ b/packages/backend/src/server/api/ApiServerService.ts @@ -176,6 +176,17 @@ export class ApiServerService { } }); + fastify.all('/clear-browser-cache', (request, reply) => { + if (['GET', 'POST'].includes(request.method)) { + reply.header('Clear-Site-Data', '"cache", "prefetchCache", "prerenderCache", "executionContexts"'); + reply.code(204); + reply.send(); + } else { + reply.code(405); + reply.send(); + } + }); + // Make sure any unknown path under /api returns HTTP 404 Not Found, // because otherwise ClientServerService will return the base client HTML // page with HTTP 200. diff --git a/packages/frontend/src/accounts.ts b/packages/frontend/src/accounts.ts index afa2ecb911..60f7cd0b4b 100644 --- a/packages/frontend/src/accounts.ts +++ b/packages/frontend/src/accounts.ts @@ -251,13 +251,30 @@ export async function openAccountMenu(opts: { } }, }; - } else { + } else { // プロファイルを復元した場合などはアカウントのトークンや詳細情報はstoreにキャッシュされていない return { type: 'button' as const, text: username, active: opts.active != null ? opts.active === id : false, action: async () => { - // TODO + const { dispose } = popup(defineAsyncComponent(() => import('@/components/MkSigninDialog.vue')), { + initialUsername: username, + }, { + done: async (res: Misskey.entities.SigninFlowResponse & { finished: true }) => { + store.set('accountTokens', { ...store.s.accountTokens, [host + '/' + res.id]: res.i }); + + if (callback) { + fetchAccount(res.i, id).then(account => { + callback(account); + }); + } else { + switchAccount(host, id); + } + }, + closed: () => { + dispose(); + }, + }); }, }; } diff --git a/packages/frontend/src/components/MkSignin.input.vue b/packages/frontend/src/components/MkSignin.input.vue index aacd1eae2a..4c73eab3f5 100644 --- a/packages/frontend/src/components/MkSignin.input.vue +++ b/packages/frontend/src/components/MkSignin.input.vue @@ -69,9 +69,11 @@ import MkInfo from '@/components/MkInfo.vue'; const props = withDefaults(defineProps<{ message?: string, openOnRemote?: OpenOnRemoteOptions, + initialUsername?: string; }>(), { message: '', openOnRemote: undefined, + initialUsername: undefined, }); const emit = defineEmits<{ @@ -81,7 +83,7 @@ const emit = defineEmits<{ const host = toUnicode(configHost); -const username = ref(''); +const username = ref(props.initialUsername ?? ''); //#region Open on remote function openRemote(options: OpenOnRemoteOptions, targetHost?: string): void { diff --git a/packages/frontend/src/components/MkSignin.vue b/packages/frontend/src/components/MkSignin.vue index b0fbe3c490..93a29b0b54 100644 --- a/packages/frontend/src/components/MkSignin.vue +++ b/packages/frontend/src/components/MkSignin.vue @@ -20,6 +20,7 @@ SPDX-License-Identifier: AGPL-3.0-only key="input" :message="message" :openOnRemote="openOnRemote" + :initialUsername="initialUsername" @usernameSubmitted="onUsernameSubmitted" @passkeyClick="onPasskeyLogin" @@ -89,10 +90,12 @@ const props = withDefaults(defineProps<{ autoSet?: boolean; message?: string, openOnRemote?: OpenOnRemoteOptions, + initialUsername?: string; }>(), { autoSet: false, message: '', openOnRemote: undefined, + initialUsername: undefined, }); const page = ref<'input' | 'password' | 'totp' | 'passkey'>('input'); diff --git a/packages/frontend/src/components/MkSigninDialog.vue b/packages/frontend/src/components/MkSigninDialog.vue index 60c99880cd..77141f1714 100644 --- a/packages/frontend/src/components/MkSigninDialog.vue +++ b/packages/frontend/src/components/MkSigninDialog.vue @@ -16,7 +16,7 @@ SPDX-License-Identifier: AGPL-3.0-only
- +
@@ -34,10 +34,12 @@ withDefaults(defineProps<{ autoSet?: boolean; message?: string, openOnRemote?: OpenOnRemoteOptions, + initialUsername?: string; }>(), { autoSet: false, message: '', openOnRemote: undefined, + initialUsername: undefined, }); const emit = defineEmits<{ diff --git a/packages/frontend/src/utility/clear-cache.ts b/packages/frontend/src/utility/clear-cache.ts index 8a62265438..8f1f73466f 100644 --- a/packages/frontend/src/utility/clear-cache.ts +++ b/packages/frontend/src/utility/clear-cache.ts @@ -4,6 +4,7 @@ */ import { unisonReload } from '@/utility/unison-reload.js'; +import { misskeyApiGet } from '@/utility/misskey-api.js'; import * as os from '@/os.js'; import { miLocalStorage } from '@/local-storage.js'; import { fetchCustomEmojis } from '@/custom-emojis.js'; @@ -16,6 +17,9 @@ export async function clearCache() { miLocalStorage.removeItem('theme'); miLocalStorage.removeItem('emojis'); miLocalStorage.removeItem('lastEmojisFetchedAt'); + await misskeyApiGet('clear-browser-cache', {}).catch(() => { + // ignore + }); await fetchInstance(true); await fetchCustomEmojis(true); unisonReload(); diff --git a/packages/misskey-js/etc/misskey-js.api.md b/packages/misskey-js/etc/misskey-js.api.md index d901232d8f..ac405c1fb0 100644 --- a/packages/misskey-js/etc/misskey-js.api.md +++ b/packages/misskey-js/etc/misskey-js.api.md @@ -1449,6 +1449,10 @@ export type Endpoints = Overwrite; res: AdminRolesCreateResponse; }; + 'clear-browser-cache': { + req: EmptyRequest; + res: EmptyResponse; + }; }>; // @public (undocumented) diff --git a/packages/misskey-js/package.json b/packages/misskey-js/package.json index e3122622c6..344b625ca7 100644 --- a/packages/misskey-js/package.json +++ b/packages/misskey-js/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "misskey-js", - "version": "2025.9.0-alpha.0", + "version": "2025.9.0-alpha.1", "description": "Misskey SDK for JavaScript", "license": "MIT", "main": "./built/index.js", diff --git a/packages/misskey-js/src/api.types.ts b/packages/misskey-js/src/api.types.ts index fa803194bf..a842f0e47c 100644 --- a/packages/misskey-js/src/api.types.ts +++ b/packages/misskey-js/src/api.types.ts @@ -1,6 +1,12 @@ import { Endpoints as Gen } from './autogen/endpoint.js'; import { UserDetailed } from './autogen/models.js'; -import { AdminRolesCreateRequest, AdminRolesCreateResponse, UsersShowRequest } from './autogen/entities.js'; +import { + AdminRolesCreateRequest, + AdminRolesCreateResponse, + EmptyRequest, + EmptyResponse, + UsersShowRequest, +} from './autogen/entities.js'; import { PartialRolePolicyOverride, SigninFlowRequest, @@ -106,6 +112,10 @@ export type Endpoints = Overwrite< 'admin/roles/create': { req: Overwrite; res: AdminRolesCreateResponse; - } + }, + 'clear-browser-cache': { + req: EmptyRequest; + res: EmptyResponse; + }, } >;