iceshrimp/packages/client/src/components/global/RouterView.vue

80 lines
1.7 KiB
Vue
Raw Normal View History

<template>
2023-04-08 09:01:42 +09:00
<KeepAlive :max="defaultStore.state.numberOfPageCache">
<Suspense>
<component
:is="currentPageComponent"
:key="key"
v-bind="Object.fromEntries(currentPageProps)"
tabindex="-1"
v-focus
2023-05-01 05:27:27 +09:00
style="outline: none"
2023-04-08 09:01:42 +09:00
/>
<template #fallback>
<MkLoading />
</template>
</Suspense>
</KeepAlive>
</template>
<script lang="ts" setup>
2023-04-08 09:01:42 +09:00
import {
inject,
nextTick,
onBeforeUnmount,
onMounted,
onUnmounted,
provide,
watch,
} from "vue";
import { Resolved, Router } from "@/nirax";
import { defaultStore } from "@/store";
const props = defineProps<{
router?: Router;
}>();
2023-04-08 09:01:42 +09:00
const router = props.router ?? inject("router");
if (router == null) {
2023-04-08 09:01:42 +09:00
throw new Error("no router provided");
}
2023-04-08 09:01:42 +09:00
const currentDepth = inject("routerCurrentDepth", 0);
provide("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)!;
let currentPageComponent = $shallowRef(current.route.component);
let currentPageProps = $ref(current.props);
2023-04-08 09:01:42 +09:00
let key = $ref(
current.route.path + JSON.stringify(Object.fromEntries(current.props))
);
function onChange({ resolved, key: newKey }) {
const current = resolveNested(resolved);
if (current == null) return;
currentPageComponent = current.route.component;
currentPageProps = current.props;
2023-04-08 09:01:42 +09:00
key =
current.route.path + JSON.stringify(Object.fromEntries(current.props));
}
2023-04-08 09:01:42 +09:00
router.addListener("change", onChange);
onBeforeUnmount(() => {
2023-04-08 09:01:42 +09:00
router.removeListener("change", onChange);
});
</script>