summaryrefslogtreecommitdiff
path: root/packages/frontend
diff options
context:
space:
mode:
authorかっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>2024-02-06 16:26:03 +0900
committerGitHub <noreply@github.com>2024-02-06 16:26:03 +0900
commitedb39a089d6652eb5b0212069f3050823c4c07e7 (patch)
tree65db3ab25af5f2ff23fd698c5099049cda29106b /packages/frontend
parentenhance(frontend): シンタックスハイライトにテーマを適用で... (diff)
downloadmisskey-edb39a089d6652eb5b0212069f3050823c4c07e7.tar.gz
misskey-edb39a089d6652eb5b0212069f3050823c4c07e7.tar.bz2
misskey-edb39a089d6652eb5b0212069f3050823c4c07e7.zip
enhance(frontend): KeepAliveのページキャッシュを削除できるように (#13180)
* enhance(frontend): 内部のページキャッシュを削除できるように * Update Changelog
Diffstat (limited to 'packages/frontend')
-rw-r--r--packages/frontend/src/components/global/RouterView.vue42
-rw-r--r--packages/frontend/src/events.ts8
-rw-r--r--packages/frontend/src/pages/settings/profile.vue5
3 files changed, 48 insertions, 7 deletions
diff --git a/packages/frontend/src/components/global/RouterView.vue b/packages/frontend/src/components/global/RouterView.vue
index dc7474835d..aeb87e659b 100644
--- a/packages/frontend/src/components/global/RouterView.vue
+++ b/packages/frontend/src/components/global/RouterView.vue
@@ -4,7 +4,10 @@ SPDX-License-Identifier: AGPL-3.0-only
-->
<template>
-<KeepAlive :max="defaultStore.state.numberOfPageCache">
+<KeepAlive
+ :max="defaultStore.state.numberOfPageCache"
+ :exclude="pageCacheController"
+>
<Suspense :timeout="0">
<component :is="currentPageComponent" :key="key" v-bind="Object.fromEntries(currentPageProps)"/>
@@ -16,9 +19,11 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
-import { inject, onBeforeUnmount, provide, ref, shallowRef } from 'vue';
-import { IRouter, Resolved } from '@/nirax.js';
+import { inject, onBeforeUnmount, provide, ref, shallowRef, computed, nextTick } from 'vue';
+import { IRouter, Resolved, RouteDef } from '@/nirax.js';
import { defaultStore } from '@/store.js';
+import { globalEvents } from '@/events.js';
+import MkLoadingPage from '@/pages/_loading_.vue';
const props = defineProps<{
router?: IRouter;
@@ -46,20 +51,47 @@ function resolveNested(current: Resolved, d = 0): Resolved | null {
}
const current = resolveNested(router.current)!;
-const currentPageComponent = shallowRef(current.route.component);
+const currentPageComponent = shallowRef('component' in current.route ? current.route.component : MkLoadingPage);
const currentPageProps = ref(current.props);
const key = ref(current.route.path + JSON.stringify(Object.fromEntries(current.props)));
function onChange({ resolved, key: newKey }) {
const current = resolveNested(resolved);
- if (current == null) return;
+ if (current == null || 'redirect' in current.route) return;
currentPageComponent.value = current.route.component;
currentPageProps.value = current.props;
key.value = current.route.path + JSON.stringify(Object.fromEntries(current.props));
+
+ nextTick(() => {
+ // ページ遷移完了後に再びキャッシュを有効化
+ if (clearCacheRequested.value) {
+ clearCacheRequested.value = false;
+ }
+ });
}
router.addListener('change', onChange);
+// #region キャッシュ制御
+
+/**
+ * キャッシュクリアが有効になったら、全キャッシュをクリアする
+ *
+ * keepAlive側にwatcherがあるのですぐ消えるとはおもうけど、念のためページ遷移完了まではキャッシュを無効化しておく。
+ * キャッシュ有効時向けにexcludeを使いたい場合は、pageCacheControllerに並列に突っ込むのではなく、下に追記すること
+ */
+const pageCacheController = computed(() => clearCacheRequested.value ? /.*/ : undefined);
+const clearCacheRequested = ref(false);
+
+globalEvents.on('requestClearPageCache', () => {
+ if (_DEV_) console.log('clear page cache requested');
+ if (!clearCacheRequested.value) {
+ clearCacheRequested.value = true;
+ }
+});
+
+// #endregion
+
onBeforeUnmount(() => {
router.removeListener('change', onChange);
});
diff --git a/packages/frontend/src/events.ts b/packages/frontend/src/events.ts
index 90d5f6eede..46faec8d3e 100644
--- a/packages/frontend/src/events.ts
+++ b/packages/frontend/src/events.ts
@@ -4,6 +4,10 @@
*/
import { EventEmitter } from 'eventemitter3';
+import * as Misskey from 'misskey-js';
-// TODO: 型付け
-export const globalEvents = new EventEmitter();
+export const globalEvents = new EventEmitter<{
+ themeChanged: () => void;
+ clientNotification: (notification: Misskey.entities.Notification) => void;
+ requestClearPageCache: () => void;
+}>();
diff --git a/packages/frontend/src/pages/settings/profile.vue b/packages/frontend/src/pages/settings/profile.vue
index 3e707041eb..aba7d0574a 100644
--- a/packages/frontend/src/pages/settings/profile.vue
+++ b/packages/frontend/src/pages/settings/profile.vue
@@ -125,6 +125,7 @@ import { langmap } from '@/scripts/langmap.js';
import { definePageMetadata } from '@/scripts/page-metadata.js';
import { claimAchievement } from '@/scripts/achievements.js';
import { defaultStore } from '@/store.js';
+import { globalEvents } from '@/events.js';
import MkInfo from '@/components/MkInfo.vue';
import MkTextarea from '@/components/MkTextarea.vue';
@@ -173,6 +174,7 @@ function saveFields() {
os.apiWithDialog('i/update', {
fields: fields.value.filter(field => field.name !== '' && field.value !== '').map(field => ({ name: field.name, value: field.value })),
});
+ globalEvents.emit('requestClearPageCache');
}
function save() {
@@ -191,6 +193,7 @@ function save() {
isBot: !!profile.isBot,
isCat: !!profile.isCat,
});
+ globalEvents.emit('requestClearPageCache');
claimAchievement('profileFilled');
if (profile.name === 'syuilo' || profile.name === 'しゅいろ') {
claimAchievement('setNameToSyuilo');
@@ -222,6 +225,7 @@ function changeAvatar(ev) {
});
$i.avatarId = i.avatarId;
$i.avatarUrl = i.avatarUrl;
+ globalEvents.emit('requestClearPageCache');
claimAchievement('profileFilled');
});
}
@@ -248,6 +252,7 @@ function changeBanner(ev) {
});
$i.bannerId = i.bannerId;
$i.bannerUrl = i.bannerUrl;
+ globalEvents.emit('requestClearPageCache');
});
}