Teledrive2 / web /src /utils /Fetcher.ts
Mythus's picture
Upload 225 files
35ee763
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) {
// ignore
}
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) {
// ignore
}
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
}
}