feat: add logout for navbar
This commit is contained in:
@@ -1,10 +1,41 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { ref } from 'vue';
|
||||||
import { useLanguageStore } from './stores/language';
|
import { useLanguageStore } from './stores/language';
|
||||||
import { useTokenStore } from './stores/token';
|
import { useTokenStore } from './stores/token';
|
||||||
|
import MessageBox from '@/components/MessageBox.vue';
|
||||||
|
import { logout as apiCommonLogout } from './api/common';
|
||||||
|
import { goToHome } from '@/router';
|
||||||
|
|
||||||
const language = useLanguageStore();
|
const language = useLanguageStore();
|
||||||
const token = useTokenStore();
|
const token = useTokenStore();
|
||||||
|
|
||||||
|
const isBurgerActive = ref<boolean>(false);
|
||||||
|
|
||||||
|
const messagebox = ref<InstanceType<typeof MessageBox> | null>(null);
|
||||||
|
|
||||||
|
const logout = async () => {
|
||||||
|
const tokenStore = useTokenStore();
|
||||||
|
const rv = await apiCommonLogout(tokenStore.currentToken);
|
||||||
|
if (rv) {
|
||||||
|
// OK. We logged out.
|
||||||
|
// Clear token.
|
||||||
|
tokenStore.logout();
|
||||||
|
// And go to Home page
|
||||||
|
goToHome();
|
||||||
|
} else {
|
||||||
|
// Show logout error.
|
||||||
|
messagebox.value?.show("Fail to logout due to unknow reason. Consider refreshing page to solve problem.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process burger menu.
|
||||||
|
// This is copied from Bulma website and modified for Vue.
|
||||||
|
// Check for click events on the navbar burger icon
|
||||||
|
const toggleBurger = () => {
|
||||||
|
// Toggle the "is-active" class on both the "navbar-burger" and the "navbar-menu"
|
||||||
|
isBurgerActive.value = !isBurgerActive
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -14,15 +45,15 @@ const token = useTokenStore();
|
|||||||
<img src="/public/favicon.ico"><b style="margin:0 0 0 14px;">coconut-leaf</b>
|
<img src="/public/favicon.ico"><b style="margin:0 0 0 14px;">coconut-leaf</b>
|
||||||
</router-link>
|
</router-link>
|
||||||
|
|
||||||
<a role="button" class="navbar-burger burger" aria-label="menu" aria-expanded="false"
|
<a role="button" class="navbar-burger burger" :class="{ 'is-active': isBurgerActive }" @click="toggleBurger"
|
||||||
data-target="coleaf-navbar">
|
aria-label="menu" aria-expanded="false" data-target="coleaf-navbar">
|
||||||
<span aria-hidden="true"></span>
|
<span aria-hidden="true"></span>
|
||||||
<span aria-hidden="true"></span>
|
<span aria-hidden="true"></span>
|
||||||
<span aria-hidden="true"></span>
|
<span aria-hidden="true"></span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="coleaf-navbar" class="navbar-menu">
|
<div id="coleaf-navbar" class="navbar-menu" :class="{ 'is-active': isBurgerActive }">
|
||||||
<div class="navbar-start">
|
<div class="navbar-start">
|
||||||
<router-link class="navbar-item" to="/home">Home</router-link>
|
<router-link class="navbar-item" to="/home">Home</router-link>
|
||||||
<router-link v-if="token.isLoggedIn" class="navbar-item" to="/collection">Collection</router-link>
|
<router-link v-if="token.isLoggedIn" class="navbar-item" to="/collection">Collection</router-link>
|
||||||
@@ -36,7 +67,7 @@ const token = useTokenStore();
|
|||||||
<router-link v-if="!token.isLoggedIn" class="button is-primary" to="/login">Login</router-link>
|
<router-link v-if="!token.isLoggedIn" class="button is-primary" to="/login">Login</router-link>
|
||||||
</p>
|
</p>
|
||||||
<p class="navbar-item">
|
<p class="navbar-item">
|
||||||
<a v-if="token.isLoggedIn" class="button is-primary">Logout</a>
|
<a v-if="token.isLoggedIn" class="button is-primary" @click="logout">Logout</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="navbar-item has-dropdown is-hoverable">
|
<div class="navbar-item has-dropdown is-hoverable">
|
||||||
@@ -51,8 +82,11 @@ const token = useTokenStore();
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<!-- The output result of router -->
|
<!-- The output result of router -->
|
||||||
<router-view></router-view>
|
<router-view></router-view>
|
||||||
|
|
||||||
|
<MessageBox ref="messagebox" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped></style>
|
<style scoped></style>
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ export const useTokenStore = defineStore('token', {
|
|||||||
|
|
||||||
getters: {
|
getters: {
|
||||||
isLoggedIn: (state) => typeof state.token === 'string',
|
isLoggedIn: (state) => typeof state.token === 'string',
|
||||||
|
currentToken: (state) => state.token as string,
|
||||||
},
|
},
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
import MessageBox from '@/components/MessageBox.vue';
|
|
||||||
import { useTokenStore } from '@/stores/token';
|
import { useTokenStore } from '@/stores/token';
|
||||||
|
import MessageBox from '@/components/MessageBox.vue';
|
||||||
import { webLogin as apiCommonWebLogin } from '@/api/common';
|
import { webLogin as apiCommonWebLogin } from '@/api/common';
|
||||||
import { goToHome } from '@/router';
|
import { goToHome } from '@/router';
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user