File size: 2,307 Bytes
35ee763
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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
  }
}