sotlas-frontend/src/main.js

119 wiersze
4.6 KiB
JavaScript

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import Buefy from 'buefy'
import VueSVGIcon from 'vue-svgicon'
import vueDebounce from 'vue-debounce'
import VueClipboard from 'vue-clipboard2'
import MatchMedia from 'vue-match-media/src'
import VueKeyCloak from '@dsb-norge/vue-keycloak-js'
import { library } from '@fortawesome/fontawesome-svg-core'
import { faCheck, faCheckCircle, faInfoCircle, faExclamationTriangle, faExclamationCircle, faArrowUp, faPlus, faCheckDouble,
faAngleRight, faAngleLeft, faAngleDown, faAngleUp, faEye, faEyeSlash, faCaretUp, faUpload, faLink, faHistory, faThList, faImages,
faQuoteRight, faSearch, faMountains, faUser, faClock, faChevronCircleUp, faChevronCircleDown, faChartBar, faFileDownload,
faExchange, faGlobe, faCalendarDay, faTrashAlt, faEdit, faClone, faCheckCircle as farCheckCircle, faArrowsH, faArrowsAlt,
faSnowflake, faWindowMinimize, faWindowMaximize, faWindowClose, faExpandArrows, faLocation, faCalendarCheck, faComment, faSpinner,
faBookUser } from '@fortawesome/pro-regular-svg-icons'
import { faMap, faCheckCircle as fasCheckCircle, faChevronCircleDown as fasChevronCircleDown, faChevronCircleUp as fasChevronCircleUp,
faParking, faSquare, faBus, faHiking, faCircle, faCamera, faCameraHome, faVolume, faVolumeMute, faCog, faCaretDown as fasCaretDown,
faLocationArrow as fasLocationArrow, faInfoCircle as fasInfoCircle } from '@fortawesome/pro-solid-svg-icons'
import { faWikipediaW, faGoogle, faGithub } from '@fortawesome/free-brands-svg-icons'
import { FontAwesomeIcon, FontAwesomeLayers } from '@fortawesome/vue-fontawesome'
import '@/assets/global.css'
import store from './store'
import axios from 'axios'
library.add(faCheck, faCheckCircle, faInfoCircle, faExclamationTriangle, faExclamationCircle, faArrowUp, faPlus, faCheckDouble,
faAngleRight, faAngleLeft, faAngleDown, faAngleUp, faEye, faEyeSlash, faCaretUp, faUpload, faLink, faHistory, faThList, faImages,
faQuoteRight, faSearch, faMountains, faUser, faClock, faChevronCircleUp, faChevronCircleDown, faMap, faChartBar, faFileDownload,
faExchange, faGlobe, faCalendarDay, faTrashAlt, faEdit, faClone, farCheckCircle, faArrowsH, faArrowsAlt,
faSnowflake, faWindowMinimize, faWindowMaximize, faWindowClose, faExpandArrows, faLocation, faCalendarCheck, faComment, faSpinner,
faBookUser)
library.add(faMap, fasCheckCircle, fasChevronCircleDown, fasChevronCircleUp, faParking, faSquare, faBus, faHiking, faCircle, faCamera,
faCameraHome, faVolume, faVolumeMute, faCog, fasCaretDown, fasLocationArrow, fasInfoCircle)
library.add(faWikipediaW, faGoogle, faGithub)
Vue.component('font-awesome-icon', FontAwesomeIcon)
Vue.component('font-awesome-layers', FontAwesomeLayers)
Vue.use(VueSVGIcon)
Vue.use(vueDebounce)
Vue.use(VueClipboard)
Vue.use(Buefy, {
defaultIconComponent: 'font-awesome-icon',
defaultIconPack: 'far'
})
Vue.use(MatchMedia)
let myVue
if (window.performance && performance.navigation.type === 1) {
// Store last reload timestamp so user reloads can be detected despite SSO redirect
sessionStorage.setItem('lastReload', new Date().getTime())
}
if (sessionStorage.getItem('wantSso') || localStorage.getItem('wantSso')) {
Vue.use(VueKeyCloak, {
config: {
realm: 'SOTA',
url: 'https://sso.sota.org.uk/auth',
clientId: 'sotlas'
},
init: {
onLoad: 'check-sso',
checkLoginIframe: false
},
onReady: keycloak => {
if (sessionStorage.getItem('wantSsoLogin')) {
sessionStorage.removeItem('wantSsoLogin')
keycloak.login()
} else {
startVue()
}
},
onInitError: error => {
console.error('Keycloak error: ' + error)
startVue()
},
autoUpdateToken: false
})
} else {
startVue()
}
Vue.config.productionTip = false
// Axios error handling
let lastError = null
axios.interceptors.response.use(response => {
return response
}, error => {
if ((!lastError || new Date().getTime() - lastError > 9000) && (!error.response || error.response.status !== 404) && myVue) {
// SnackbarProgrammatic.open doesn't work with Webpack 5
// See https://github.com/buefy/buefy/issues/2299
myVue.$buefy.snackbar.open({
duration: 9000,
message: 'Network or server error while loading data, try again later',
type: 'is-danger',
position: 'is-bottom-left',
queue: false
})
lastError = new Date().getTime()
}
return Promise.reject(error)
})
function startVue () {
myVue = new Vue({
store,
router,
render: h => h(App),
mq: {
mobile: '(max-width: 768px)',
desktop: '(min-width: 1024px)',
widescreen: '(min-width: 1216px)',
fullhd: '(min-width: 1408px)'
}
}).$mount('#app')
}