import axios from "axios"; import { setConnectionError } from "../store/actions"; import store from "../store/index"; import { API_ENDPOINT } from './endpointDef'; import { refreshTokens } from "./tokenService/tokenApiClient"; const axiosApiInstance = axios.create(); const globalLog = false; const defaultOptions = { log: false } export const Get = (url, options) => { return request("GET", url, { ...defaultOptions, ...options }); } export const Post = (url, data, options) => { return request("POST", url, { ...defaultOptions, ...options, data }); } export const Put = (url, data, options) => { return request("PUT", url, { ...defaultOptions, ...options, data }); } export const Delete = (url, options) => { return request("DELETE", url, { ...defaultOptions, ...options }); } const isLogging = (log) => { return (globalLog || log); } const request = (method, url, options) => { const { data, log } = options; if (isLogging(log)) console.log("REQUEST URL : ", url); const requestObject = { method, url: API_ENDPOINT + url, timeout: 60000 } if (data) { if (isLogging(log)) console.log(`DATA FOR : ${url}`, data); requestObject.data = data; } else { requestObject.data = undefined; } // console.log("url", url) return axiosApiInstance(requestObject).then((response) => { if (isLogging(log)) console.log(`RESPONSE for ${url} : `, response); return { ...response, OK: true }; }) .catch((error) => { if (isLogging(log)) console.log(`RESPONSE for catch ${url} : `, (error.response ? error.response : error)); //if we get a request timeout error if (!error.response) { store.dispatch(setConnectionError(error)); return { error, OK: false }; } //if we get a response other than OK if (error.response) { return { ...error.response, OK: false }; } return { OK: false }; }) } axiosApiInstance.interceptors.request.use( (config) => { // console.log('sending request') const accessToken = store.getState().user.token; config.headers = { "Authorization": `Bearer ${accessToken}`, "Accept": "application/json", "Content-Type": "application/json", "Referer": config.url }; return config; }, (error) => { Promise.reject(error); } ); axiosApiInstance.interceptors.response.use( (response) => { return response; }, async (error) => { // console.log('********************************************************************', error) const originalRequest = error.config if (originalRequest._retried) { console.log("Request second attempt failed.") } if (!originalRequest._retried && error.response && error.response.status === 401) { try { await refreshTokens() } catch (e) { throw error; } return await axiosApiInstance({ ...originalRequest, _retried: true }) } throw error; } ); export default axiosApiInstance;