import Vue from 'vue' import Vuex from 'vuex' import axios from 'axios' const JWT_KEY_NAME = "JWT"; const baseURL = process.env.VUE_APP_API_LOCATION; Vue.use(Vuex) export default { namespaced: true, state() { return { processing: false, token: localStorage.getItem(JWT_KEY_NAME) || '', name: '' } }, mutations: { auth_started(state) { state.processing = true; }, auth_success(state, {token, name}) { state.processing = false; state.token = token; state.name = name; }, auth_fail(state) { state.processing = false; state.token = ''; state.name = ''; }, logout(state) { state.token = ''; state.name = ''; } }, actions: { performLogin({commit}, creds) { return new Promise((resolve, reject) => { commit('auth_started') axios.post("auth/login", creds, {baseURL}).then(resp => { const token = resp.data.token; if (!token) { return reject(); } localStorage.setItem(JWT_KEY_NAME, token) commit('auth_success', {token, name: creds.name}) return resolve(resp); }).catch(err => { commit('auth_fail') localStorage.removeItem(JWT_KEY_NAME) return reject(err); }) }) }, performRegister({commit}, creds) { return new Promise((resolve, reject) => { commit('auth_started') axios.post("auth/signup", creds, {baseURL}).then(resp => { const token = resp.data.token; if (!token) { return reject(); } localStorage.setItem(JWT_KEY_NAME, token) commit('auth_success', {token, name: creds.name}) resolve(resp) }).catch(err => { commit('auth_fail') localStorage.removeItem(JWT_KEY_NAME) reject(err) }) }) }, performLogout({commit}) { return new Promise((resolve) => { localStorage.removeItem(JWT_KEY_NAME) commit('logout') resolve(); }); } }, modules: {}, getters: { isLoggedIn(state) { return !!state.token; }, authInProgress(state) { return state.processing; } } }