import Auth from '../api/auth'; import { parseAPIErrorResponse } from '../store/utils/api'; const parseErrorCode = error => { if (error && typeof error === 'object') { error.message = parseAPIErrorResponse(error); } return Promise.reject(error); }; const AUTH_HEADERS = ['access-token', 'token-type', 'client', 'expiry', 'uid']; export default axios => { const { apiHost = '' } = window.chatwootConfig || {}; const wootApi = axios.create({ baseURL: `${apiHost}/`, withCredentials: true, }); const authHeaders = {}; let refreshRequest; wootApi.interceptors.request.use(config => { Object.assign(config.headers, authHeaders); return config; }); wootApi.interceptors.response.use( response => { AUTH_HEADERS.forEach(header => { if (response.headers?.[header]) authHeaders[header] = response.headers[header]; }); return response; }, async error => { const request = error.config; if ( error.response?.status !== 401 || // eslint-disable-next-line no-underscore-dangle request?._retry || // eslint-disable-next-line no-underscore-dangle request?._sessionRefresh || !Auth.hasAuthCookie() ) { return parseErrorCode(error); } // eslint-disable-next-line no-underscore-dangle request._retry = true; refreshRequest ||= wootApi .get('/auth/validate_token', { _sessionRefresh: true }) .finally(() => { refreshRequest = null; }); await refreshRequest; return wootApi(request); } ); return wootApi; };