Files
myprojplanet_vite/src/common/axios.ts
2022-11-13 22:39:25 +01:00

71 lines
2.0 KiB
TypeScript
Executable File

import axios, {
AxiosError,
AxiosRequestConfig,
AxiosResponse,
} from 'axios'
// import { default as VueRouter } from 'vue-router'
import { serv_constants } from '@src/store/Modules/serv_constants'
// import { TokenHelper } from "./token-helper";
let initialized = false
interface IRequestConfig extends AxiosRequestConfig {
ignore: number[]
}
function handle(status: number, exclude: number[]) {
if (exclude.length === 0) return true
return exclude.find(o => o === status) === undefined
}
export function UseAxios(router: any) { // VueRouter
if (!initialized) {
// @ts-ignore
axios.interceptors.request.use((config: IRequestConfig) => {
// @ts-ignore
if (!config.headers.Authorization) {
// append authorization header
/* ++Todo: disattivato per ora...
let bearerToken = TokenHelper.getBearerToken()
if (bearerToken.Authorization)
Object.assign(config.headers, bearerToken)
*/
}
// ensure axios does not follow redirects, so custom response interceptor below can push to app login page
if (!config.maxRedirects || (config.maxRedirects === 5)) {
config.maxRedirects = 0
}
return config
})
axios.interceptors.response.use(undefined, (config: AxiosError) => {
// @ts-ignore
const { response } = config
const exclude = (<IRequestConfig>config.config).ignore || []
if (response) {
if (response.status === 401 && handle(response.status, exclude)) {
const location: string | undefined = response.headers.location || response.headers.Location
if (location) {
const redirectTo = `/${location}`
window.setTimeout(() => router.replace(redirectTo), 200)
}
}
if (response.status === serv_constants.RIS_CODE__HTTP_FORBIDDEN_INVALID_TOKEN && handle(response.status, exclude)) {
window.setTimeout(() => router.replace('/forbidden'), 200)
}
}
return config
})
initialized = true
}
}