Code for this can be found in the Github Branch
The final step in wrapping up auth before getting back to the ingredients form is being able to log a user out of the application. Again firebase does the heavy lifting and all we need to do is make sure our state is updated.
Store #
The store needs to be refactored and updated after I noticed a few issues. The first is that the user details can be stored as an Object for easier use in the app called currentUser.
store/auth/authIndex.js
import authActions from './authActions.js'; import authMutations from './authMutations'; import authGetters from './authGetters'; export default { namespaced: true, state() { return { currentUser: { id: 0, username: '', email: '' }, registrationError: false, isLoggedIn: false, errorMsg: '', }; }, mutations: authMutations, actions: authActions, getters: authGetters, }; Below you can see the use of firebase to sign out the user from the system. The snippet below is without the full code for register and login. Take a look at the repo for full code.
store/auth/authActions.js
import firebase from '@/firebase.js'; const userRef = firebase.firestore().collection('/user'); export default { async register({ commit }, user) { ... }, async login({ commit }, user) { ... }, async logout({ commit }) { await firebase.auth().signOut(); commit('logout'); }, }; Our mutation now has to update the state of the user being logged out. I also refactor the currentUser data in both the logout and authSuccess.
store/auth/authMutations.js
import router from '@/router'; export default { authSuccess(state, user) { state.currentUser.id = user.uid; state.currentUser.email = user.email; state.currentUser.username = user.username; state.registrationError = false; state.isLoggedIn = true; state.errorMsg = ''; router.push({ name: 'home' }); }, authFail(state, error) { state.registrationError = true; state.isLoggedIn = false; state.errorMsg = error.message; }, logout(state) { state.isLoggedIn = false; state.currentUser.id = null; state.currentUser.email = null; state.currentUser.username = null; router.replace({ name: 'home' }); }, }; Implement #
With this done we complete the logout functionality and now just need to use the action after clicking the button.
components/ui/TheHeader.vue
<template> <img alt="App logo" src="https://res.cloudinary.com/hiltonmeyer-com/image/upload/v1611488325/pantry/cooking-robot_xdaw7k.png" /> <div id="nav"> <router-link to="/">Home</router-link> <router-link v-if="isLoggedIn" to="/ingredients"> Ingredients</router-link> </div> <div id="auth"> <router-link v-if="!isLoggedIn" to="/login" tag="button"> <button>Login</button> </router-link> <router-link v-if="!isLoggedIn" to="/register"> <button>Register</button> </router-link> <button v-if="isLoggedIn" @click.prevent="logout">Logout</button> </div> </template> <script> import { mapGetters, mapActions } from 'vuex'; export default { computed: { ...mapGetters('auth', ['isLoggedIn']), }, methods: { ...mapActions('auth', ['logout']), }, }; </script>
Top comments (0)