|
import axios from 'axios' |
|
import { RETRY_COUNT } from './Constant' |
|
export const apiUrl = `${localStorage.getItem('API_URL') || process.env.REACT_APP_API_URL || ''}/api/v1` |
|
export const req = axios.create({ |
|
baseURL: apiUrl, |
|
withCredentials: true |
|
}) |
|
req.interceptors.response.use( |
|
response => { |
|
try { |
|
const requests = [ |
|
...JSON.parse(sessionStorage.getItem('requests') || '[]'), |
|
{ |
|
date: new Date().toISOString(), |
|
ref: location.href, |
|
...response |
|
} |
|
] |
|
sessionStorage.setItem('requests', JSON.stringify(requests.slice(-200))) |
|
} catch (error) { |
|
|
|
} |
|
return response |
|
}, |
|
async error => { |
|
try { |
|
const requests = [ |
|
...JSON.parse(sessionStorage.getItem('requests') || '[]'), |
|
{ |
|
date: new Date().toISOString(), |
|
ref: location.href, |
|
...error |
|
} |
|
] |
|
sessionStorage.setItem('requests', JSON.stringify(requests.slice(-200))) |
|
} catch (error) { |
|
|
|
} |
|
if (!error.response) return Promise.reject(error) |
|
const { config, response: { status, data } } = error |
|
if (status === 401 && data?.details?.errorMessage !== 'SESSION_PASSWORD_NEEDED') { |
|
try { |
|
await req.post('/auth/refreshToken') |
|
} catch (error) { |
|
return Promise.reject(error) |
|
} |
|
return req(config) |
|
} else if (status === 429) { |
|
await new Promise(resolve => setTimeout(resolve, data.retryAfter || 1000)) |
|
return req(config) |
|
} else if (status > 500) { |
|
config.headers = { |
|
...config?.headers || {}, |
|
'x-retry-count': config.headers['x-retry-count'] || 0 |
|
} |
|
if (config.headers['x-retry-count'] < RETRY_COUNT) { |
|
await new Promise(resolve => setTimeout(resolve, ++config.headers['x-retry-count'] * 3000)) |
|
return req(config) |
|
} |
|
} |
|
return Promise.reject(error) |
|
} |
|
) |
|
export const fetcher = async (url: string, authorization?: string): Promise<any> => { |
|
const fetch = async () => { |
|
const { data } = await req.get(url, { |
|
...authorization ? { headers: { authorization: `Bearer ${authorization}` } } : {}, |
|
withCredentials: true |
|
}) |
|
return data |
|
} |
|
try { |
|
return await fetch() |
|
} catch ({ response }) { |
|
throw response |
|
} |
|
} |