234 lines
7.4 KiB
Vue
234 lines
7.4 KiB
Vue
<script setup lang="ts">
|
|
import { sluggy, useSettingsStore } from '#imports';
|
|
import { useHuntStore } from '~/stores/hunt';
|
|
import { useTitleStore } from '~/stores/title';
|
|
|
|
const { loggedIn, clear, user } = useUserSession();
|
|
const { t } = useI18n();
|
|
const localePath = useLocalePath();
|
|
const route = useRoute();
|
|
const breakpoints = useBreakpoint();
|
|
const titleStore = useTitleStore();
|
|
const huntStore = useHuntStore();
|
|
|
|
const settingsStore = useSettingsStore();
|
|
const { isSidebarVisible } = storeToRefs(settingsStore);
|
|
|
|
const slugs = computed(() => checkSlug(route.params));
|
|
|
|
const isHuntAdmin = computed(
|
|
() =>
|
|
slugs.value?.huntSlug !== undefined &&
|
|
huntStore.huntId === slugs.value.huntSlug.id &&
|
|
huntStore.isMember
|
|
);
|
|
</script>
|
|
|
|
<template>
|
|
<VaLayout
|
|
:top="{ fixed: true, order: 2 }"
|
|
:left="{
|
|
fixed: true,
|
|
absolute: breakpoints.smDown,
|
|
order: 1,
|
|
overlay: breakpoints.smDown && isSidebarVisible
|
|
}"
|
|
@left-overlay-click="isSidebarVisible = false"
|
|
>
|
|
<template #top>
|
|
<VaNavbar shadowed>
|
|
<template #left>
|
|
<VaButton
|
|
preset="secondary"
|
|
:icon="isSidebarVisible ? 'menu_open' : 'menu'"
|
|
@click="isSidebarVisible = !isSidebarVisible"
|
|
/>
|
|
</template>
|
|
<template #center>
|
|
{{ titleStore.title || t('layouts.default_tile') }}</template
|
|
>
|
|
</VaNavbar>
|
|
</template>
|
|
|
|
<template #left>
|
|
<VaSidebar v-model="isSidebarVisible" :hoverable="breakpoints.mdUp">
|
|
<VaSidebarItem
|
|
:to="localePath('/')"
|
|
:active="localePath('/') === route.path"
|
|
>
|
|
<VaSidebarItemContent>
|
|
<VaIcon name="home" />
|
|
<VaSidebarItemTitle>{{ t('page.home.title') }}</VaSidebarItemTitle>
|
|
</VaSidebarItemContent>
|
|
</VaSidebarItem>
|
|
<VaSidebarItem
|
|
:to="localePath('/hunt')"
|
|
:active="localePath('/hunt') === route.path"
|
|
>
|
|
<VaSidebarItemContent>
|
|
<VaIcon name="cases" />
|
|
<VaSidebarItemTitle>{{ t('page.hunt.title') }}</VaSidebarItemTitle>
|
|
</VaSidebarItemContent>
|
|
</VaSidebarItem>
|
|
<VaSidebarItem
|
|
v-if="user?.role === 'CREATOR' || user?.role === 'ADMIN'"
|
|
text-color="success"
|
|
hover-color="success"
|
|
active-color="onSuccess"
|
|
:to="localePath('/admin/hunt/create')"
|
|
:active="localePath('/admin/hunt/create') === route.path"
|
|
>
|
|
<VaSidebarItemContent>
|
|
<VaIcon name="add_circle" />
|
|
<VaSidebarItemTitle>{{
|
|
t('page.create_hunt.sidebar')
|
|
}}</VaSidebarItemTitle>
|
|
</VaSidebarItemContent>
|
|
</VaSidebarItem>
|
|
<VaSidebarItem
|
|
v-if="slugs?.huntSlug"
|
|
:to="localePath(`/hunt/${sluggy(slugs.huntSlug)}`)"
|
|
:active="localePath(`/hunt/${sluggy(slugs.huntSlug)}`) === route.path"
|
|
>
|
|
<VaSidebarItemContent>
|
|
<VaIcon name="camera" />
|
|
<VaSidebarItemTitle>{{
|
|
slugs.huntSlug.name || 'Hunt'
|
|
}}</VaSidebarItemTitle>
|
|
</VaSidebarItemContent>
|
|
</VaSidebarItem>
|
|
<VaSidebarItem
|
|
v-if="slugs?.huntSlug && isHuntAdmin"
|
|
text-color="danger"
|
|
hover-color="danger"
|
|
active-color="onDanger"
|
|
:to="localePath(`/hunt/${sluggy(slugs.huntSlug)}/admin`)"
|
|
:active="
|
|
localePath(`/hunt/${sluggy(slugs.huntSlug)}/admin`) === route.path
|
|
"
|
|
>
|
|
<VaSidebarItemContent>
|
|
<VaIcon name="admin_panel_settings" />
|
|
<VaSidebarItemTitle>Hunt Admin</VaSidebarItemTitle>
|
|
</VaSidebarItemContent>
|
|
</VaSidebarItem>
|
|
<VaSidebarItem
|
|
v-if="slugs?.huntSlug && isHuntAdmin"
|
|
text-color="danger"
|
|
hover-color="danger"
|
|
active-color="onDanger"
|
|
:to="localePath(`/hunt/${sluggy(slugs.huntSlug)}/teams`)"
|
|
:active="
|
|
localePath(`/hunt/${sluggy(slugs.huntSlug)}/teams`) === route.path
|
|
"
|
|
>
|
|
<VaSidebarItemContent>
|
|
<VaIcon name="groups" />
|
|
<VaSidebarItemTitle>Hunt Teams</VaSidebarItemTitle>
|
|
</VaSidebarItemContent>
|
|
</VaSidebarItem>
|
|
<VaSidebarItem
|
|
v-if="slugs?.huntSlug && slugs?.questSlug"
|
|
:to="
|
|
localePath(
|
|
`/hunt/${sluggy(slugs.huntSlug)}/${sluggy(slugs.questSlug)}`
|
|
)
|
|
"
|
|
:active="
|
|
localePath(
|
|
`/hunt/${sluggy(slugs.huntSlug)}/${sluggy(slugs.questSlug)}`
|
|
) === route.path
|
|
"
|
|
>
|
|
<VaSidebarItemContent>
|
|
<VaIcon name="question_mark" />
|
|
<VaSidebarItemTitle>{{
|
|
slugs.questSlug.name || 'Quest'
|
|
}}</VaSidebarItemTitle>
|
|
</VaSidebarItemContent>
|
|
</VaSidebarItem>
|
|
<VaSidebarItem
|
|
v-if="slugs?.huntSlug && slugs?.questSlug && isHuntAdmin"
|
|
text-color="danger"
|
|
hover-color="danger"
|
|
active-color="onDanger"
|
|
:to="
|
|
localePath(
|
|
`/hunt/${sluggy(slugs.huntSlug)}/${sluggy(slugs.questSlug)}/admin`
|
|
)
|
|
"
|
|
:active="
|
|
localePath(
|
|
`/hunt/${sluggy(slugs.huntSlug)}/${sluggy(slugs.questSlug)}/admin`
|
|
) === route.path
|
|
"
|
|
>
|
|
<VaSidebarItemContent>
|
|
<VaIcon name="question_mark" />
|
|
<VaSidebarItemTitle>Quest Admin</VaSidebarItemTitle>
|
|
</VaSidebarItemContent>
|
|
</VaSidebarItem>
|
|
<VaSpacer />
|
|
<VaSidebarItem
|
|
:to="localePath('/impressum')"
|
|
:active="localePath('/impressum') === route.path"
|
|
>
|
|
<VaSidebarItemContent>
|
|
<VaIcon name="balance" />
|
|
<VaSidebarItemTitle>{{
|
|
t('page.imprint.title')
|
|
}}</VaSidebarItemTitle>
|
|
</VaSidebarItemContent>
|
|
</VaSidebarItem>
|
|
<VaSidebarItem
|
|
v-if="user"
|
|
:to="localePath('/profile')"
|
|
:active="localePath('/profile') === route.path"
|
|
:hover-color="user.role === 'ADMIN' ? 'danger' : undefined"
|
|
:text-color="user.role === 'ADMIN' ? 'danger' : undefined"
|
|
>
|
|
<VaSidebarItemContent>
|
|
<VaIcon
|
|
:name="
|
|
user.role === 'ADMIN'
|
|
? 'admin_panel_settings'
|
|
: 'account_circle'
|
|
"
|
|
/>
|
|
<VaSidebarItemTitle>
|
|
{{ user.name }}
|
|
</VaSidebarItemTitle>
|
|
</VaSidebarItemContent>
|
|
</VaSidebarItem>
|
|
<VaSidebarItem v-if="loggedIn" @click="clear">
|
|
<VaSidebarItemContent>
|
|
<VaIcon name="logout" />
|
|
<VaSidebarItemTitle>
|
|
{{ t('auth.logout') }}
|
|
</VaSidebarItemTitle>
|
|
</VaSidebarItemContent>
|
|
</VaSidebarItem>
|
|
<VaSidebarItem v-else :to="localePath(`/login?to=${route.path}`)">
|
|
<VaSidebarItemContent>
|
|
<VaIcon name="login" />
|
|
<VaSidebarItemTitle>
|
|
{{ t('auth.login') }}
|
|
</VaSidebarItemTitle>
|
|
</VaSidebarItemContent>
|
|
</VaSidebarItem>
|
|
<LangSwitcher />
|
|
</VaSidebar>
|
|
</template>
|
|
|
|
<template #content>
|
|
<main>
|
|
<article class="p-4">
|
|
<Suspense>
|
|
<slot />
|
|
</Suspense>
|
|
</article>
|
|
</main>
|
|
</template>
|
|
</VaLayout>
|
|
</template>
|