Files
dancefinder-app/layouts/default.vue
T

157 lines
5.0 KiB
Vue
Raw Normal View History

2019-01-15 13:21:24 +01:00
<template>
<v-app :key='$i18n.locale + isAuthenticated'>
<themed>
<v-navigation-drawer v-model='nav' temporary app>
<v-list dense>
<v-list-item>
<v-list-item-action>
<v-switch v-model='darkMode' />
</v-list-item-action>
<v-list-item-title>{{ $t('app.darkMode') }}</v-list-item-title>
</v-list-item>
<v-list-item @click="locale = 'en'">
<v-list-item-title>In English 🇬🇧</v-list-item-title>
</v-list-item>
<v-list-item @click="locale = 'sv'">
<v-list-item-title> Svenska 🇸🇪</v-list-item-title>
</v-list-item>
<v-list-item v-if='!user' link @click='doLogin'>
<v-list-item-title>{{ $t('app.login') }}</v-list-item-title>
</v-list-item>
<v-list-item v-if='isAuthenticated && user'>
<v-list-item-avatar>
<v-img :src='user.picture' :alt='user.name' />
</v-list-item-avatar>
<v-list-item-content>
<v-list-item-title><span v-text='user.name' /></v-list-item-title>
</v-list-item-content>
</v-list-item>
<v-list-item link to='/'>
<v-list-item-action>
<v-icon>mdi-calendar-outline</v-icon>
</v-list-item-action>
<v-list-item-title>{{ $t('app.links.events') }}</v-list-item-title>
</v-list-item>
<v-list-item v-if='isAuthenticated' link to='/origins/'>
<v-list-item-action>
<v-icon>mdi-home</v-icon>
</v-list-item-action>
<v-list-item-title>{{ $t('app.links.origins') }}</v-list-item-title>
</v-list-item>
<v-list-item v-if='isAuthenticated' link to='/filters/'>
<v-list-item-action>
<v-icon>mdi-magnify</v-icon>
</v-list-item-action>
<v-list-item-title>{{ $t('app.links.filters') }}</v-list-item-title>
</v-list-item>
<v-list-item v-if='isAuthenticated' link>
<v-list-item-action>
<v-icon>exit_to_app</v-icon>
</v-list-item-action>
<v-list-item-content @click='doLogout'>
<v-list-item-title>{{ $t('app.logout') }}</v-list-item-title>
</v-list-item-content>
</v-list-item>
</v-list>
</v-navigation-drawer>
<v-app-bar app scroll-off-screen>
<v-app-bar-nav-icon @click='nav = !nav' />
<v-toolbar-title><span v-text='title' /></v-toolbar-title>
2020-01-25 14:59:14 +01:00
<v-spacer />
<v-toolbar-items>
<v-list-item v-if='isAuthenticated && user'>
<v-list-item-avatar>
<v-img :src='user.picture' :alt='user.name' />
</v-list-item-avatar>
<v-list-item-content>
<v-list-item-title><span v-text='user.name' /></v-list-item-title>
</v-list-item-content>
</v-list-item>
</v-toolbar-items>
</v-app-bar>
2020-06-21 17:59:14 +02:00
<v-main>
<v-container v-if='!loading' fluid>
2020-01-25 14:59:14 +01:00
<nuxt />
</v-container>
2020-06-21 17:59:14 +02:00
</v-main>
</themed>
2019-01-21 20:58:25 +01:00
</v-app>
2019-01-15 13:21:24 +01:00
</template>
<script>
import { computed, getCurrentInstance, provide, ref } from 'vue'
import { useRouter, useStore } from '@nuxtjs/composition-api'
import { DefaultApolloClient } from '@vue/apollo-composable'
2020-01-25 14:59:14 +01:00
import Themed from './components/themed'
import { setDarkMode } from '~/utils/localStorage'
import { useAuth } from '~/plugins/auth'
2019-01-15 13:21:24 +01:00
export default {
name: 'DefaultLayout',
components: {
2020-01-25 14:59:14 +01:00
Themed
2019-01-15 13:21:24 +01:00
},
setup() {
const instance = getCurrentInstance()
if (instance) {
provide(DefaultApolloClient, instance.proxy.$apollo)
}
const router = useRouter()
const store = useStore()
const { title } = store.state
const onRedirectCallback = (appState) => {
router.push(
appState && appState.targetUrl
? appState.targetUrl
: window.location.pathname
2020-01-25 14:59:14 +01:00
)
2019-01-15 13:21:24 +01:00
}
const { loading, isAuthenticated, user, loginWithRedirect, logout } =
useAuth(onRedirectCallback)
const doLogin = () => {
loginWithRedirect()
2019-01-15 13:21:24 +01:00
}
const doLogout = () => {
logout({
returnTo: window.location.origin
2020-01-25 14:59:14 +01:00
})
2019-01-15 13:21:24 +01:00
}
const darkMode = computed({
get: () => (instance ? instance.proxy.$vuetify.theme.dark : false),
set: (val) => {
if (instance) {
instance.proxy.$vuetify.theme.dark = val
setDarkMode(instance.proxy.$vuetify.theme.dark)
}
}
})
const locale = computed({
get: () => (instance ? instance.proxy.$i18n.locale : 'sv'),
set: (newLocale) => {
if (instance) {
instance.proxy.$i18n.setLocaleCookie(newLocale)
instance.proxy.$vuetify.lang.current = newLocale
instance.proxy.$i18n.locale = newLocale
}
}
})
const nav = ref(false)
locale.value = instance.proxy.$i18n.locale
return {
title,
loading,
isAuthenticated,
user,
doLogin,
doLogout,
darkMode,
locale,
nav
}
2020-01-25 14:59:14 +01:00
}
}
2019-01-15 13:21:24 +01:00
</script>