|
<script setup lang='ts'> |
|
import { computed } from 'vue' |
|
import { NLayout, NLayoutContent } from 'naive-ui' |
|
import { useRouter } from 'vue-router' |
|
import Sider from './sider/index.vue' |
|
import Permission from './Permission.vue' |
|
import { useBasicLayout } from '@/hooks/useBasicLayout' |
|
import { useAppStore, useAuthStore, useChatStore } from '@/store' |
|
|
|
const router = useRouter() |
|
const appStore = useAppStore() |
|
const chatStore = useChatStore() |
|
const authStore = useAuthStore() |
|
|
|
router.replace({ name: 'Chat', params: { uuid: chatStore.active } }) |
|
|
|
const { isMobile } = useBasicLayout() |
|
|
|
const collapsed = computed(() => appStore.siderCollapsed) |
|
|
|
const needPermission = computed(() => !!authStore.session?.auth && !authStore.token) |
|
|
|
const getMobileClass = computed(() => { |
|
if (isMobile.value) |
|
return ['rounded-none', 'shadow-none'] |
|
return ['border', 'rounded-md', 'shadow-md', 'dark:border-neutral-800'] |
|
}) |
|
|
|
const getContainerClass = computed(() => { |
|
return [ |
|
'h-full', |
|
{ 'pl-[260px]': !isMobile.value && !collapsed.value }, |
|
] |
|
}) |
|
</script> |
|
|
|
<template> |
|
<div class="h-full dark:bg-[#24272e] transition-all" :class="[isMobile ? 'p-0' : 'p-4']"> |
|
<div class="h-full overflow-hidden" :class="getMobileClass"> |
|
<NLayout class="z-40 transition" :class="getContainerClass" has-sider> |
|
<Sider /> |
|
<NLayoutContent class="h-full"> |
|
<RouterView v-slot="{ Component, route }"> |
|
<component :is="Component" :key="route.fullPath" /> |
|
</RouterView> |
|
</NLayoutContent> |
|
</NLayout> |
|
</div> |
|
<Permission :visible="needPermission" /> |
|
</div> |
|
</template> |
|
|