hi currently what i am facing is after i login using this.$store.dispatch("auth/saveToken", data); this.$store.dispatch("auth/setUser", data);
then direct to my dashboard page and i try to refresh my user data all gone and still stay in the dashboard page (supposed to be login page) . i am not sure i setting my store,Middleware and router correctly or not using NUXT2
in /store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
import * as auth from './auth';
Vue.use(Vuex);
export const store = new Vuex.Store({
modules: {
auth
}
});
in store/auth.js
/**
* Initial state
*/
export const state = () => ({
user: null,
token: process.client ? window.localStorage.getItem('auth_token') || null : null,
});
/**
* Mutations
*/
export const mutations = {
SET_USER(state, payload) {
state.user = payload;
console.log(state,'state')
},
LOGOUT: (state) => {
state.user = null
state.token = null
window.localStorage.removeItem('auth_token')
},
FETCH_USER_FAILURE: (state) => {
state.user = null
window.localStorage.removeItem('auth_token')
},
SET_TOKEN: (state, { token }) => {
state.token = token
window.localStorage.setItem('auth_token', token)
}
}
/**
* Actions
*/
export const actions =
{
saveToken({ commit }, payload) {
commit('SET_TOKEN', payload)
},
async fetchUser({ commit }) {
try {
const { data } = await this.$axios.get('/auth/me');
console.log(data.data)
commit('SET_USER', data.data);
} catch (error) {
commit('FETCH_USER_FAILURE', error);
}
},
setUser({ commit }, payload) {
commit('SET_USER', payload)
},
async logout({ commit }, payload) {
await axios.post('/auth/logout')
commit('LOGOUT', payload)
},
destroy({ commit }) {
commit('LOGOUT', payload)
}
}
/**
* Getters
*/
export const getters = {
user: state => state.user,
check: state => state.user !== null,
token: state => state.token,
}
in my middleware/authMiddleware.js
// middleware/authMiddleware.js
export default async function ({ store, route, redirect }) {
// Token exists, check login status
if (store.getters["auth/token"]) {
try {
await store.dispatch("auth/fetchUser");
} catch (e) { }
}
// Define your rules here
const rules = {
guest: { fail: "admin/dashboard", check: () => !store.getters["auth/check"] },
auth: { fail: "login", check: () => store.getters["auth/check"] },
};
// Check route meta rules
if (route.meta && route.meta.rules) {
for (const rule of route.meta.rules) {
const check = rules[rule].check();
if (!check) {
// If rule fails, redirect
if (rule === "auth") {
return redirect({ name: rules[rule].fail });
}
}
}
}
}
in y nuxt.config
router: {
middleware: 'authMiddleware',
extendRoutes(routes, resolve) {
// Define your custom routes
const customRoutes = [
{ path: '/login', name: 'login', component: resolve(__dirname, 'pages/admin/views/auth/login.vue') },
{ path: '/dashboard', name: 'dashboard', component: resolve(__dirname, 'pages/admin/views/dashboard/dashboard.vue') },
{ path: '/company/listing', name: 'company', component: resolve(__dirname, 'pages/admin/views/company/index.vue') },
{ path: '/company/create', name: 'new_company', component: resolve(__dirname, 'pages/admin/views/company/create.vue') },
{ path: '/company/edit/:company_id', name: 'edit_company', component: resolve(__dirname, 'pages/admin/views/company/update.vue') },
{ path: '/company/read/:company_id', name: 'read_company', component: resolve(__dirname, 'pages/admin/views/company/read.vue') },
{ path: '/approve/:company_id', name: 'approve_company', component: resolve(__dirname, 'pages/admin/views/company/approve.vue') },
{ path: '/member/list', name: 'member_list', component: resolve(__dirname, 'pages/admin/views/member/list.vue') },
{ path: '/merchant/list', name: 'merchant_list', component: resolve(__dirname, 'pages/admin/views/merchant/list.vue') },
{ path: '/merchant/create', name: 'merchant_create', component: resolve(__dirname, 'pages/admin/views/merchant/create.vue') },
{ path: '/menu/merchant_list', name: 'menu_merchant_list', component: resolve(__dirname, 'pages/admin/views/menu/merchant_list.vue') },
{ path: '/coin_price', name: 'coin_price', component: resolve(__dirname, 'pages/admin/views/merchant/create.vue') },
{ path: '/merchant/create', name: 'merchant_create', component: resolve(__dirname, 'pages/admin/views/core/coin_price.vue') },
];
// Prefix all custom routes with '/admin'
customRoutes.forEach(route => {
route.path = '/admin' + route.path;
});
// Push custom routes to the existing routes
routes.push(...customRoutes);
}
},