resources/frontend/core/router/index.js
import Vue from 'vue';
import VueRouter from 'vue-router';
import { store } from '@/store';
// Fixing new issue with VueRouter caused by new Promise API
const originalPush = VueRouter.prototype.push;
VueRouter.prototype.push = function push(location) {
return originalPush.call(this, location).catch(err => err);
};
Vue.use(VueRouter);
const routes = [
{
path: '/auth/login',
name: 'auth.login',
meta: {
auth: false,
guest: true,
layout: 'auth-layout',
},
component: () => import(/* webpackChunkName: "login" */ '@/views/Auth/Login.vue'),
beforeEnter: (to, from, next) => {
if (store.getters['user/loggedIn']) {
next('/');
} else {
next();
}
},
},
{
path: '/auth/desktop/login',
name: 'auth.desktop.login',
meta: {
auth: false,
guest: true,
layout: 'auth-layout',
},
beforeEnter: (to, from, next) => {
if (store.getters['user/loggedIn']) {
next('/');
} else {
next();
}
},
component: () => import(/* webpackChunkName: "desktop-login" */ '@/views/Auth/Desktop.vue'),
},
{
path: '/auth/password/reset',
name: 'auth.password.reset',
meta: {
auth: false,
},
component: () => import(/* webpackChunkName: "ResetPassword" */ '@/views/Auth/ResetPassword.vue'),
},
{
path: '/auth/register',
name: 'auth.register',
meta: {
auth: false,
},
component: () => import(/* webpackChunkName: "Register" */ '@/views/Auth/Register.vue'),
beforeEnter: (to, from, next) => {
if (store.getters['user/loggedIn']) {
store.dispatch('user/forceUserExit');
}
next();
},
},
{
path: '*',
name: 'not-found',
meta: {
auth: false,
},
component: () => import(/* webpackChunkName: "PageNotFound" */ '@/views/PageNotFound.vue'),
},
{
path: '/error',
name: 'api.error',
meta: {
auth: false,
},
component: () => import(/* webpackChunkName: "ApiError" */ '@/views/ApiError.vue'),
},
{
path: '/forbidden',
name: 'forbidden',
meta: {
auth: false,
},
component: () => import(/* webpackChunkName: "PageForbidden" */ '@/views/PageForbidden.vue'),
},
{
path: '/about',
name: 'about',
component: () => import(/* webpackChunkName: "About" */ '@/views/About.vue'),
},
{
path: '/desktop-login',
name: 'desktop-login',
component: () => import(/* webpackChunkName: "DesktopLogin" */ '@/views/DesktopLogin.vue'),
},
];
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes,
});
router.beforeEach(async (to, from, next) => {
// Close pending requests when switching pages
await store.dispatch('httpRequest/cancelPendingRequests');
if (to.matched.some(record => record.meta.auth || typeof record.meta.auth === 'undefined')) {
if (!store.getters['user/loggedIn']) {
return next({ name: 'auth.login' });
}
} else if (to.matched.some(record => !record.meta.auth) && !store.getters['user/loggedIn']) {
return next();
}
if (to.name === 'setup') {
if (store.getters['httpRequest/getStatusOfInstalling']) {
next({ name: 'forbidden' });
}
return next();
}
if (to.matched.some(record => typeof record.meta.guest !== 'undefined' && record.meta.guest)) {
if (store.getters['user/loggedIn']) {
return next('/');
}
}
const checkPermission = () => {
if (!Vue.prototype.$gate.user) {
Vue.prototype.$gate.auth(store.getters['user/user']);
}
if (to?.meta?.checkPermission) {
return to.meta.checkPermission() ? next() : next({ name: 'forbidden' });
}
return next();
};
if (!store.getters['user/user'] || !Object.keys(store.getters['user/user']).length) {
store.watch(
() => store.getters['user/user'],
() => {
checkPermission();
},
);
} else {
checkPermission();
}
});
export default router;