158 lines
4.3 KiB
JavaScript
158 lines
4.3 KiB
JavaScript
import 'core-js/stable';
|
|
import {createApp, configureCompat } from 'vue';
|
|
import VueVimeoPlayer from 'vue-vimeo-player';
|
|
import apolloClientFactory from './graphql/client';
|
|
import App from './App.vue';
|
|
import {postLoginRedirectUrlKey, router} from './router';
|
|
import { store } from '@/store';
|
|
import VueScrollTo from 'vue-scrollto';
|
|
import autoGrow from '@/directives/auto-grow';
|
|
import clickOutside from '@/directives/click-outside';
|
|
import ME_QUERY from '@/graphql/gql/queries/meQuery.gql';
|
|
import VueModal from '@/plugins/modal';
|
|
import VueRemoveEdges from '@/plugins/edges';
|
|
import VueMatomo from 'vue-matomo';
|
|
import VueLogger from 'vuejs3-logger';
|
|
import { createApolloProvider } from '@vue/apollo-option';
|
|
import { joiningClass, loginRequired, unauthorizedAccess } from '@/router/guards';
|
|
import flavorPlugin from '@/plugins/flavor';
|
|
|
|
const publicApolloClient = apolloClientFactory('/api/graphql-public/', null);
|
|
const privateApolloClient = apolloClientFactory('/api/graphql/', networkErrorCallback);
|
|
|
|
const apolloProvider = createApolloProvider({
|
|
clients: {
|
|
publicClient: publicApolloClient,
|
|
},
|
|
defaultClient: privateApolloClient,
|
|
});
|
|
|
|
configureCompat({
|
|
MODE: 2
|
|
});
|
|
|
|
const app = createApp(App);
|
|
|
|
app.use(store);
|
|
|
|
const isProduction = process.env.NODE_ENV === 'production';
|
|
|
|
app.use(VueModal);
|
|
app.use(VueRemoveEdges);
|
|
app.use(VueVimeoPlayer);
|
|
app.use(VueLogger, {
|
|
isEnabled: true,
|
|
logLevel: isProduction ? 'error' : 'debug',
|
|
stringifyArguments: false,
|
|
showConsoleColors: true,
|
|
});
|
|
app.use(apolloProvider);
|
|
app.use(router);
|
|
|
|
// VueScrollTo.setDefaults({
|
|
// duration: 500,
|
|
// easing: 'ease-out',
|
|
// offset: -50,
|
|
// });
|
|
|
|
app.directive('scroll-to', VueScrollTo);
|
|
|
|
|
|
app.use(flavorPlugin);
|
|
|
|
if (process.env.MATOMO_HOST) {
|
|
app.use(VueMatomo, {
|
|
host: process.env.MATOMO_HOST,
|
|
siteId: process.env.MATOMO_SITE_ID,
|
|
router: router,
|
|
});
|
|
}
|
|
|
|
app.directive('click-outside', clickOutside);
|
|
app.directive('auto-grow', autoGrow);
|
|
|
|
/* guards */
|
|
|
|
|
|
|
|
function redirectUsersWithoutValidLicense() {
|
|
return privateApolloClient.query({
|
|
query: ME_QUERY,
|
|
}).then(({data}) => data.me.expiryDate == null);
|
|
}
|
|
|
|
function redirectStudentsWithoutClass() {
|
|
return privateApolloClient.query({
|
|
query: ME_QUERY,
|
|
}).then(({data}) => data.me.schoolClasses.length === 0 && !data.me.isTeacher);
|
|
}
|
|
|
|
function redirectUsersToOnboarding() {
|
|
return privateApolloClient.query({
|
|
query: ME_QUERY,
|
|
}).then(({data}) => !data.me.onboardingVisited);
|
|
}
|
|
|
|
function networkErrorCallback(statusCode) {
|
|
if (statusCode === 402) {
|
|
router.push({name: 'licenseActivation'});
|
|
}
|
|
}
|
|
|
|
|
|
router.beforeEach(async (to, from, next) => {
|
|
// todo: make logger work outside vue app
|
|
// const logger = inject('vuejs3-logger');
|
|
// logger.$log.debug('navigation guard called', to, from);
|
|
if (to.path === '/logout') {
|
|
await publicApolloClient.resetStore();
|
|
if (process.env.LOGOUT_REDIRECT_URL) {
|
|
location.replace(`https://sso.hep-verlag.ch/logout?return_to=${process.env.LOGOUT_REDIRECT_URL}`);
|
|
next(false);
|
|
return;
|
|
} else {
|
|
next({name: 'hello'});
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (unauthorizedAccess(to)) {
|
|
//logger.$log.debug('unauthorized', to);
|
|
const postLoginRedirectionUrl = to.path;
|
|
const redirectUrl = `/hello/`;
|
|
|
|
if (window.localStorage) {
|
|
localStorage.setItem(postLoginRedirectUrlKey, postLoginRedirectionUrl);
|
|
}
|
|
|
|
// logger.$log.debug('redirecting to hello', to);
|
|
next(redirectUrl);
|
|
return;
|
|
}
|
|
|
|
if (to.name && to.name !== 'licenseActivation' && loginRequired(to) && await redirectUsersWithoutValidLicense()) {
|
|
// logger.$log.debug('redirecting to licenseActivation', to, null);
|
|
console.log('redirecting to licenseActivation', to, null);
|
|
next({name: 'licenseActivation'});
|
|
return;
|
|
}
|
|
|
|
if (!joiningClass(to) && loginRequired(to) && await redirectStudentsWithoutClass()) {
|
|
//logger.$log.debug('redirecting to join-class', to);
|
|
//logger.$log.debug('await redirectStudentsWithoutClass()', await redirectStudentsWithoutClass());
|
|
next({name: 'join-class'});
|
|
return;
|
|
}
|
|
|
|
if ((to.name && to.name.indexOf('onboarding') === -1) && !joiningClass(to) && loginRequired(to) && await redirectUsersToOnboarding()) {
|
|
//logger.$log.debug('redirecting to onboarding-start', to);
|
|
next({name: 'onboarding-start'});
|
|
return;
|
|
}
|
|
|
|
//logger.$log.debug('End of Guard reached', to);
|
|
next();
|
|
});
|
|
|
|
app.mount('#app');
|