summaryrefslogtreecommitdiff
path: root/packages/frontend/src
diff options
context:
space:
mode:
authorsyuilo <4439005+syuilo@users.noreply.github.com>2024-11-21 07:58:34 +0900
committerGitHub <noreply@github.com>2024-11-21 07:58:34 +0900
commitf0c3a4cc0b47b392dd155ebabea0d5587df2753d (patch)
tree116098b3f4f5013d3656f5c33573d1fb030db3a0 /packages/frontend/src
parentfeat: 絵文字のポップアップメニューに編集を追加 (#15004) (diff)
downloadsharkey-f0c3a4cc0b47b392dd155ebabea0d5587df2753d.tar.gz
sharkey-f0c3a4cc0b47b392dd155ebabea0d5587df2753d.tar.bz2
sharkey-f0c3a4cc0b47b392dd155ebabea0d5587df2753d.zip
perf(frontend): reduce api requests for non-logged-in enviroment (#15001)
* wip * Update CHANGELOG.md * wip
Diffstat (limited to 'packages/frontend/src')
-rw-r--r--packages/frontend/src/pages/clip.vue14
-rw-r--r--packages/frontend/src/pages/note.vue11
-rw-r--r--packages/frontend/src/pages/user/index.vue18
-rw-r--r--packages/frontend/src/server-context.ts23
4 files changed, 60 insertions, 6 deletions
diff --git a/packages/frontend/src/pages/clip.vue b/packages/frontend/src/pages/clip.vue
index 7b1737fece..891d59d605 100644
--- a/packages/frontend/src/pages/clip.vue
+++ b/packages/frontend/src/pages/clip.vue
@@ -33,25 +33,28 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { computed, watch, provide, ref } from 'vue';
import * as Misskey from 'misskey-js';
+import { url } from '@@/js/config.js';
+import type { MenuItem } from '@/types/menu.js';
import MkNotes from '@/components/MkNotes.vue';
import { $i } from '@/account.js';
import { i18n } from '@/i18n.js';
import * as os from '@/os.js';
import { misskeyApi } from '@/scripts/misskey-api.js';
import { definePageMetadata } from '@/scripts/page-metadata.js';
-import { url } from '@@/js/config.js';
import MkButton from '@/components/MkButton.vue';
import { clipsCache } from '@/cache.js';
import { isSupportShare } from '@/scripts/navigator.js';
import { copyToClipboard } from '@/scripts/copy-to-clipboard.js';
import { genEmbedCode } from '@/scripts/get-embed-code.js';
-import type { MenuItem } from '@/types/menu.js';
+import { getServerContext } from '@/server-context.js';
+
+const CTX_CLIP = getServerContext('clip');
const props = defineProps<{
clipId: string,
}>();
-const clip = ref<Misskey.entities.Clip | null>(null);
+const clip = ref<Misskey.entities.Clip | null>(CTX_CLIP);
const favorited = ref(false);
const pagination = {
endpoint: 'clips/notes' as const,
@@ -64,6 +67,11 @@ const pagination = {
const isOwned = computed<boolean | null>(() => $i && clip.value && ($i.id === clip.value.userId));
watch(() => props.clipId, async () => {
+ if (CTX_CLIP && CTX_CLIP.id === props.clipId) {
+ clip.value = CTX_CLIP;
+ return;
+ }
+
clip.value = await misskeyApi('clips/show', {
clipId: props.clipId,
});
diff --git a/packages/frontend/src/pages/note.vue b/packages/frontend/src/pages/note.vue
index 454ee3c6bc..3e1d04bd6d 100644
--- a/packages/frontend/src/pages/note.vue
+++ b/packages/frontend/src/pages/note.vue
@@ -62,13 +62,16 @@ import { dateString } from '@/filters/date.js';
import MkClipPreview from '@/components/MkClipPreview.vue';
import { defaultStore } from '@/store.js';
import { pleaseLogin } from '@/scripts/please-login.js';
+import { getServerContext } from '@/server-context.js';
+
+const CTX_NOTE = getServerContext('note');
const props = defineProps<{
noteId: string;
initialTab?: string;
}>();
-const note = ref<null | Misskey.entities.Note>();
+const note = ref<null | Misskey.entities.Note>(CTX_NOTE);
const clips = ref<Misskey.entities.Clip[]>();
const showPrev = ref<'user' | 'channel' | false>(false);
const showNext = ref<'user' | 'channel' | false>(false);
@@ -116,6 +119,12 @@ function fetchNote() {
showPrev.value = false;
showNext.value = false;
note.value = null;
+
+ if (CTX_NOTE && CTX_NOTE.id === props.noteId) {
+ note.value = CTX_NOTE;
+ return;
+ }
+
misskeyApi('notes/show', {
noteId: props.noteId,
}).then(res => {
diff --git a/packages/frontend/src/pages/user/index.vue b/packages/frontend/src/pages/user/index.vue
index a6244e2a93..d862387401 100644
--- a/packages/frontend/src/pages/user/index.vue
+++ b/packages/frontend/src/pages/user/index.vue
@@ -39,6 +39,7 @@ import { definePageMetadata } from '@/scripts/page-metadata.js';
import { i18n } from '@/i18n.js';
import { $i } from '@/account.js';
import MkHorizontalSwipe from '@/components/MkHorizontalSwipe.vue';
+import { getServerContext } from '@/server-context.js';
const XHome = defineAsyncComponent(() => import('./home.vue'));
const XTimeline = defineAsyncComponent(() => import('./index.timeline.vue'));
@@ -52,6 +53,8 @@ const XFlashs = defineAsyncComponent(() => import('./flashs.vue'));
const XGallery = defineAsyncComponent(() => import('./gallery.vue'));
const XRaw = defineAsyncComponent(() => import('./raw.vue'));
+const CTX_USER = getServerContext('user');
+
const props = withDefaults(defineProps<{
acct: string;
page?: string;
@@ -61,13 +64,24 @@ const props = withDefaults(defineProps<{
const tab = ref(props.page);
-const user = ref<null | Misskey.entities.UserDetailed>(null);
+const user = ref<null | Misskey.entities.UserDetailed>(CTX_USER);
const error = ref<any>(null);
function fetchUser(): void {
if (props.acct == null) return;
+
+ const { username, host } = Misskey.acct.parse(props.acct);
+
+ if (CTX_USER && CTX_USER.username === username && CTX_USER.host === host) {
+ user.value = CTX_USER;
+ return;
+ }
+
user.value = null;
- misskeyApi('users/show', Misskey.acct.parse(props.acct)).then(u => {
+ misskeyApi('users/show', {
+ username,
+ host,
+ }).then(u => {
user.value = u;
}).catch(err => {
error.value = err;
diff --git a/packages/frontend/src/server-context.ts b/packages/frontend/src/server-context.ts
new file mode 100644
index 0000000000..aa44a10290
--- /dev/null
+++ b/packages/frontend/src/server-context.ts
@@ -0,0 +1,23 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+import * as Misskey from 'misskey-js';
+import { $i } from '@/account.js';
+
+const providedContextEl = document.getElementById('misskey_clientCtx');
+
+export type ServerContext = {
+ clip?: Misskey.entities.Clip;
+ note?: Misskey.entities.Note;
+ user?: Misskey.entities.UserLite;
+} | null;
+
+export const serverContext: ServerContext = (providedContextEl && providedContextEl.textContent) ? JSON.parse(providedContextEl.textContent) : null;
+
+export function getServerContext<K extends keyof NonNullable<ServerContext>>(entity: K): Required<Pick<NonNullable<ServerContext>, K>> | null {
+ // contextは非ログイン状態の情報しかないためログイン時は利用できない
+ if ($i) return null;
+
+ return serverContext ? (serverContext[entity] ?? null) : null;
+}