first commit
This commit is contained in:
163
resources/frontend/core/router/index.js
Normal file
163
resources/frontend/core/router/index.js
Normal file
@@ -0,0 +1,163 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user