diff options
| author | syuilo <4439005+syuilo@users.noreply.github.com> | 2025-03-18 17:31:25 +0900 |
|---|---|---|
| committer | syuilo <4439005+syuilo@users.noreply.github.com> | 2025-03-18 17:31:25 +0900 |
| commit | d609f41f61d82d64cb8b01a0f4e52fb1af2c893e (patch) | |
| tree | da49d6df08f1feb73dfcc32fa2ba85d7aa69ee28 /packages/frontend/src/components/global/NestedRouterView.vue | |
| parent | 🎨 (diff) | |
| download | sharkey-d609f41f61d82d64cb8b01a0f4e52fb1af2c893e.tar.gz sharkey-d609f41f61d82d64cb8b01a0f4e52fb1af2c893e.tar.bz2 sharkey-d609f41f61d82d64cb8b01a0f4e52fb1af2c893e.zip | |
🎨
Diffstat (limited to 'packages/frontend/src/components/global/NestedRouterView.vue')
| -rw-r--r-- | packages/frontend/src/components/global/NestedRouterView.vue | 65 |
1 files changed, 65 insertions, 0 deletions
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 @@ +<!-- +SPDX-FileCopyrightText: syuilo and misskey-project +SPDX-License-Identifier: AGPL-3.0-only +--> + +<template> +<Suspense :timeout="0"> + <component :is="currentPageComponent" :key="key" v-bind="Object.fromEntries(currentPageProps)"/> + + <template #fallback> + <MkLoading/> + </template> +</Suspense> +</template> + +<script lang="ts" setup> +import { inject, onBeforeUnmount, provide, ref, shallowRef } from 'vue'; +import type { IRouter, Resolved } from '@/nirax.js'; +import MkLoadingPage from '@/pages/_loading_.vue'; +import { DI } from '@/di.js'; + +const props = defineProps<{ + router?: IRouter; +}>(); + +const router = props.router ?? inject(DI.router); + +if (router == null) { + throw new Error('no router provided'); +} + +const currentDepth = inject(DI.routerCurrentDepth, 0); +provide(DI.routerCurrentDepth, currentDepth + 1); + +function resolveNested(current: Resolved, d = 0): Resolved | null { + if (d === currentDepth) { + return current; + } else { + if (current.child) { + return resolveNested(current.child, d + 1); + } else { + return null; + } + } +} + +const current = resolveNested(router.current)!; +const currentPageComponent = shallowRef('component' in current.route ? current.route.component : MkLoadingPage); +const currentPageProps = ref(current.props); +const key = ref(router.getCurrentKey() + JSON.stringify(Object.fromEntries(current.props))); + +function onChange({ resolved, key: newKey }) { + const current = resolveNested(resolved); + if (current == null || 'redirect' in current.route) return; + currentPageComponent.value = current.route.component; + currentPageProps.value = current.props; + key.value = newKey + JSON.stringify(Object.fromEntries(current.props)); +} + +router.addListener('change', onChange); + +onBeforeUnmount(() => { + router.removeListener('change', onChange); +}); +</script> |