import axios, { AxiosError, AxiosResponse } from 'axios'; import { ReloadHandler } from './reload-handler'; import { isRelativeUrl } from './utils'; export interface UnauthorizedHandler { isUnauthorized?(response: AxiosResponse, defaultHandler: () => boolean): boolean; unauthorizedHandler?(): void; } export function initAjaxHandlersUnauthorized(options: UnauthorizedHandler = {}) { const reloadHandler = new ReloadHandler({ id: 'ajax-handlers-unauthorized' }); const defaultUnauthorizedHandler = { isUnauthorized(response: AxiosResponse) { return isRelativeUrl(response.config) && response.status === 401; }, unauthorizedHandler() { reloadHandler.reload(); }, }; const { isUnauthorized, unauthorizedHandler } = { ...defaultUnauthorizedHandler, ...options }; axios.interceptors.response.use(undefined, (error: AxiosError) => { if ( error.response && isUnauthorized(error.response, () => defaultUnauthorizedHandler.isUnauthorized(error.response!) ) ) { unauthorizedHandler(); } return Promise.reject(error); }); }