Skip to content

Commit cd0376c

Browse files
committed
feat(navbar): adds navbar drawer router outlet
1 parent 8d7102e commit cd0376c

File tree

5 files changed

+29
-6
lines changed

5 files changed

+29
-6
lines changed

src/components/AppComponent.vue

+9-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,15 @@ const { isAuthenticated } = useAuthSettingsStoreRefs();
1212

1313
<template>
1414
<header>
15-
<NavbarComponent v-if="isAuthenticated" />
15+
<RouterView v-slot="{ Component, route }" name="navbar">
16+
<NavbarComponent v-if="isAuthenticated">
17+
<template v-if="Component" #drawer>
18+
<KeepAlive>
19+
<component :is="Component" :key="route.path" />
20+
</KeepAlive>
21+
</template>
22+
</NavbarComponent>
23+
</RouterView>
1624
</header>
1725
<main>
1826
<RouterView v-slot="{ Component, route }">

src/components/common/navbar/NavbarComponent.vue

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script lang="ts" setup>
22
import { NTab, NTabs } from 'naive-ui';
3-
import { ref } from 'vue';
3+
import { computed, ref, useSlots } from 'vue';
44
import { useRoute, useRouter } from 'vue-router';
55
66
import NavbarSettingsDropdown from '~/components/common/navbar/NavbarSettingsDopdown.vue';
@@ -11,6 +11,7 @@ import { useI18n } from '~/utils';
1111
const i18n = useI18n('route');
1212
const route = useRoute();
1313
const router = useRouter();
14+
const slots = useSlots();
1415
1516
const navigate = (to: Route) => {
1617
router.push(to);
@@ -19,6 +20,8 @@ const navigate = (to: Route) => {
1920
const routes = [Route.Progress, Route.Calendar, Route.History, Route.List, Route.Search];
2021
2122
const isHover = ref(false);
23+
const showDrawer = computed(() => route.name && !!slots.drawer && isHover.value);
24+
2225
const navElement = ref<HTMLElement>();
2326
</script>
2427

@@ -51,8 +54,8 @@ const navElement = ref<HTMLElement>();
5154
<NavbarSettingsDropdown v-if="navElement" :parent-element="navElement" />
5255
</NTab>
5356
</NTabs>
54-
<div class="drawer" :class="{ visible: isHover }">
55-
<div>This is an optional drawer</div>
57+
<div class="drawer" :class="{ visible: showDrawer }">
58+
<slot name="drawer"></slot>
5659
</div>
5760
</nav>
5861
</template>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<script setup lang="ts"></script>
2+
3+
<template>
4+
<div>History Navbar</div>
5+
</template>

src/router/routes.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,18 @@ export const routes: RouteRecordRaw[] = [
2323
{
2424
path: `/${Route.Calendar}`,
2525
name: Route.Calendar,
26-
component: () => import('../components/views/calendar/CalendarComponent.vue'),
26+
components: {
27+
default: () => import('../components/views/calendar/CalendarComponent.vue'),
28+
navbar: () => import('../components/views/calendar/CalendarNavbar.vue'),
29+
},
2730
},
2831
{
2932
path: `/${Route.History}`,
3033
name: Route.History,
31-
component: () => import('../components/views/history/HistoryComponent.vue'),
34+
components: {
35+
default: () => import('../components/views/history/HistoryComponent.vue'),
36+
navbar: () => import('../components/views/history/HistoryNavbar.vue'),
37+
},
3238
},
3339
{
3440
path: `/${Route.List}`,

src/stores/router.store.ts

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export const useRouterStore = defineStore('router', () => {
2525
};
2626

2727
const setLastRoute = (_route: RouteLocationNormalized) => {
28+
if (lastRoute.value?.name === _route.name) return;
2829
lastRoute.value = _route;
2930
return storage.local.set('app.state.last-route', _route);
3031
};

0 commit comments

Comments
 (0)