From d609f41f61d82d64cb8b01a0f4e52fb1af2c893e Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Tue, 18 Mar 2025 17:31:25 +0900 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../frontend/src/components/MkPageWindow.vue | 7 +- .../src/components/global/MkPageHeader.vue | 4 +- .../components/global/NestedRouterView.vue | 65 ++++++ .../src/components/global/RouterView.vue | 60 +++--- .../components/global/StackingRouterView.vue | 191 ++++++++++++++++++ packages/frontend/src/components/index.ts | 6 + packages/frontend/src/di.ts | 1 + packages/frontend/src/page.ts | 11 +- .../frontend/src/pages/admin/_header_.vue | 8 +- packages/frontend/src/pages/admin/index.vue | 6 +- .../frontend/src/pages/settings/index.vue | 4 +- .../frontend/src/pages/settings/other.vue | 4 + packages/frontend/src/pages/timeline.vue | 8 +- packages/frontend/src/preferences/def.ts | 4 + packages/frontend/src/ui/deck/main-column.vue | 5 +- packages/frontend/src/ui/minimum.vue | 2 +- packages/frontend/src/ui/universal.vue | 5 +- packages/frontend/src/ui/visitor.vue | 2 +- packages/frontend/src/ui/zen.vue | 2 +- .../utility/autogen/settings-search-index.ts | 2 +- 20 files changed, 324 insertions(+), 73 deletions(-) create mode 100644 packages/frontend/src/components/global/NestedRouterView.vue create mode 100644 packages/frontend/src/components/global/StackingRouterView.vue diff --git a/packages/frontend/src/components/MkPageWindow.vue b/packages/frontend/src/components/MkPageWindow.vue index 51f19faf29..eae2ccec4a 100644 --- a/packages/frontend/src/components/MkPageWindow.vue +++ b/packages/frontend/src/components/MkPageWindow.vue @@ -22,8 +22,10 @@ SPDX-License-Identifier: AGPL-3.0-only -
- +
+ + +
@@ -44,6 +46,7 @@ import { useRouterFactory } from '@/router/supplier.js'; import { mainRouter } from '@/router/main.js'; import { analytics } from '@/analytics.js'; import { DI } from '@/di.js'; +import { prefer } from '@/preferences.js'; const props = defineProps<{ initialPath: string; diff --git a/packages/frontend/src/components/global/MkPageHeader.vue b/packages/frontend/src/components/global/MkPageHeader.vue index 69bbd88cb6..b353269fef 100644 --- a/packages/frontend/src/components/global/MkPageHeader.vue +++ b/packages/frontend/src/components/global/MkPageHeader.vue @@ -49,9 +49,9 @@ import type { Tab } from './MkPageHeader.tabs.vue'; import type { PageHeaderItem } from '@/types/page-header.js'; import type { PageMetadata } from '@/page.js'; import { globalEvents } from '@/events.js'; -import { injectReactiveMetadata } from '@/page.js'; import { openAccountMenu as openAccountMenu_ } from '@/accounts.js'; import { $i } from '@/i.js'; +import { DI } from '@/di.js'; const props = withDefaults(defineProps<{ overridePageMetadata?: PageMetadata; @@ -69,7 +69,7 @@ const emit = defineEmits<{ (ev: 'update:tab', key: string); }>(); -const injectedPageMetadata = injectReactiveMetadata(); +const injectedPageMetadata = inject(DI.pageMetadata); const pageMetadata = computed(() => props.overridePageMetadata ?? injectedPageMetadata.value); const hideTitle = computed(() => inject('shouldOmitHeaderTitle', false) || props.hideTitle); diff --git a/packages/frontend/src/components/global/NestedRouterView.vue b/packages/frontend/src/components/global/NestedRouterView.vue new file mode 100644 index 0000000000..eb7192d8e0 --- /dev/null +++ b/packages/frontend/src/components/global/NestedRouterView.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/packages/frontend/src/components/global/RouterView.vue b/packages/frontend/src/components/global/RouterView.vue index 25a29a4ae7..b01e355c5e 100644 --- a/packages/frontend/src/components/global/RouterView.vue +++ b/packages/frontend/src/components/global/RouterView.vue @@ -4,18 +4,20 @@ SPDX-License-Identifier: AGPL-3.0-only --> + + diff --git a/packages/frontend/src/components/index.ts b/packages/frontend/src/components/index.ts index 66ac871f7d..c28c457e33 100644 --- a/packages/frontend/src/components/index.ts +++ b/packages/frontend/src/components/index.ts @@ -16,6 +16,8 @@ import MkTime from './global/MkTime.vue'; import MkUrl from './global/MkUrl.vue'; import I18n from './global/I18n.vue'; import RouterView from './global/RouterView.vue'; +import NestedRouterView from './global/NestedRouterView.vue'; +import StackingRouterView from './global/StackingRouterView.vue'; import MkLoading from './global/MkLoading.vue'; import MkError from './global/MkError.vue'; import MkAd from './global/MkAd.vue'; @@ -38,6 +40,8 @@ export default function(app: App) { export const components = { I18n: I18n, RouterView: RouterView, + NestedRouterView: NestedRouterView, + StackingRouterView: StackingRouterView, Mfm: Mfm, MkA: MkA, MkAcct: MkAcct, @@ -65,6 +69,8 @@ declare module '@vue/runtime-core' { export interface GlobalComponents { I18n: typeof I18n; RouterView: typeof RouterView; + NestedRouterView: typeof NestedRouterView; + StackingRouterView: typeof StackingRouterView; Mfm: typeof Mfm; MkA: typeof MkA; MkAcct: typeof MkAcct; diff --git a/packages/frontend/src/di.ts b/packages/frontend/src/di.ts index 192242984c..2afe35550d 100644 --- a/packages/frontend/src/di.ts +++ b/packages/frontend/src/di.ts @@ -10,4 +10,5 @@ export const DI = { routerCurrentDepth: Symbol() as InjectionKey, router: Symbol() as InjectionKey, mock: Symbol() as InjectionKey, + pageMetadata: Symbol() as InjectionKey>>, }; diff --git a/packages/frontend/src/page.ts b/packages/frontend/src/page.ts index f3ec09a16f..0107f17be4 100644 --- a/packages/frontend/src/page.ts +++ b/packages/frontend/src/page.ts @@ -5,6 +5,7 @@ import * as Misskey from 'misskey-js'; import { inject, isRef, onActivated, onBeforeUnmount, provide, ref, toValue, watch } from 'vue'; +import { DI } from './di.js'; import type { MaybeRefOrGetter, Ref } from 'vue'; export type PageMetadata = { @@ -31,9 +32,6 @@ const METADATA_KEY = Symbol('MetadataKey'); const setMetadata = (v: Ref): void => { provide>(METADATA_KEY, v); }; -const getMetadata = (): Ref | undefined => { - return inject>(METADATA_KEY); -}; export const definePage = (maybeRefOrGetterMetadata: MaybeRefOrGetter): void => { const metadataRef = ref(toValue(maybeRefOrGetterMetadata)); @@ -55,6 +53,8 @@ export const definePage = (maybeRefOrGetterMetadata: MaybeRefOrGetter { receiver?.(metadataGetter); }); + + provide(DI.pageMetadata, metadataRef); }; export const provideMetadataReceiver = (receiver: PageMetadataReceiver): void => { @@ -64,8 +64,3 @@ export const provideMetadataReceiver = (receiver: PageMetadataReceiver): void => export const provideReactiveMetadata = (metadataRef: Ref): void => { setMetadata(metadataRef); }; - -export const injectReactiveMetadata = (): Ref => { - const metadataRef = getMetadata(); - return isRef(metadataRef) ? metadataRef : ref(null); -}; diff --git a/packages/frontend/src/pages/admin/_header_.vue b/packages/frontend/src/pages/admin/_header_.vue index 1382cad9a4..f073a4af7e 100644 --- a/packages/frontend/src/pages/admin/_header_.vue +++ b/packages/frontend/src/pages/admin/_header_.vue @@ -33,13 +33,13 @@ SPDX-License-Identifier: AGPL-3.0-only