flaschengeist-frontend/src/boot/axios.ts

58 lines
1.6 KiB
TypeScript
Raw Normal View History

import axios, { AxiosInstance, AxiosError } from 'axios';
2020-10-02 07:13:14 +00:00
import { boot } from 'quasar/wrappers';
2020-10-16 07:38:14 +00:00
import config from '../config';
import { Store } from 'vuex';
import { StateInterface } from 'src/store';
2020-10-02 07:13:14 +00:00
declare module 'vue/types/vue' {
interface Vue {
$axios: AxiosInstance;
}
}
export default boot<Store<StateInterface>>(({ Vue, store, router }) => {
2020-10-02 07:13:14 +00:00
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
Vue.prototype.$axios = axios;
2020-10-15 01:35:44 +00:00
axios.defaults.baseURL = config.baseURL;
/***
* Intercept requests and insert Token if available
*/
2020-10-16 07:38:14 +00:00
axios.interceptors.request.use(config => {
const session = store.state.session.currentSession;
if (session?.token) {
config.headers = { Authorization: 'Bearer ' + session.token };
2020-10-16 07:38:14 +00:00
}
return config;
});
/***
* Intercept responses
* - filter 401 --> logout
* - filter timeout or 502-504 --> backendOffline
*/
axios.interceptors.response.use(
response => response,
error => {
if (error) {
const e = <AxiosError>error;
if (
e.code === 'ECONNABORTED' ||
(e.response && e.response.status >= 502 && e.response.status <= 504)
) {
return router.push({
name: 'offline',
query: { redirect: router.currentRoute.fullPath }
});
} else if (e.response && e.response.status == 401) {
if (router.currentRoute.name !== 'login')
return store.dispatch('session/clearCurrent');
}
}
return Promise.reject(error);
}
);
2020-10-02 07:13:14 +00:00
});
2020-10-15 09:23:41 +00:00
export { axios };