Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 860 | Rev 1180 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
797 stevensc 1
import axios from 'axios'
2
 
3
export class Request {
4
  #client
5
  #abortController
6
 
853 stevensc 7
  constructor() {
8
    this.#client = axios.create()
801 stevensc 9
 
10
    this.#client.interceptors.request.use(
11
      async (request) => {
12
        const token = window.localStorage.getItem('jwt')
13
 
14
        if (token) {
15
          request.headers.Authorization = 'Bearer ' + token
16
        }
17
 
18
        if (['post', 'put', 'delete'].includes(request.method)) {
19
          try {
807 stevensc 20
            const { data: responseData } = await this.#client.get('/csrf')
801 stevensc 21
            const { data, success } = responseData
22
 
23
            if (success) {
24
              request.headers['X-CSRF-TOKEN'] = data
25
              return request
26
            }
27
          } catch (err) {
28
            throw new Error(
29
              `Axios problem with request during pre-flight phase: ${err}.`
30
            )
31
          }
32
        }
33
 
34
        if (['get'].includes(request.method)) {
35
          const headers = {
860 stevensc 36
            'Content-Type': 'application/json',
37
            'Cache-Control': 'no-cache, no-store',
801 stevensc 38
            Accept: 'application/json',
860 stevensc 39
            Vary: 'Accept'
801 stevensc 40
          }
1179 stevensc 41
 
801 stevensc 42
          request.headers = { ...request.headers, ...headers }
1179 stevensc 43
          request.timeout = 3000
44
 
801 stevensc 45
          return request
46
        }
47
 
48
        return request
49
      },
50
      (error) => {
51
        return Promise.reject(error)
52
      }
53
    )
54
 
808 stevensc 55
    this.#client.interceptors.response.use(
56
      async (response) => {
57
        const { fatal } = response.data
58
 
59
        if (fatal) {
60
          window.localStorage.removeItem('jwt')
61
          window.localStorage.removeItem('aes')
62
          window.location.reload()
63
          return
64
        }
65
 
66
        return response
67
      },
68
      (error) => {
69
        return Promise.reject(error)
70
      }
71
    )
72
 
797 stevensc 73
    this.#abortController = new AbortController()
802 stevensc 74
 
75
    if (Request.instance) {
76
      return Request.instance
77
    }
78
 
79
    Request.instance = this
797 stevensc 80
  }
81
 
802 stevensc 82
  setBaseURL(baseURL = '') {
83
    if (typeof baseURL !== 'string') throw new Error('baseURL must be a string')
84
    this.#client.defaults.baseURL = baseURL
85
  }
86
 
797 stevensc 87
  async MakeRequest(method = 'get', { endpoint, data, params }) {
88
    const config = { ...params }
89
    config.signal = this.#abortController.signal
90
 
91
    const response =
92
      method === 'get' || method === 'delete'
93
        ? await this.#client[method](endpoint, config)
94
        : await this.#client[method](endpoint, data, config)
95
 
805 stevensc 96
    return response
797 stevensc 97
  }
98
 
99
  async get(endpoint, params) {
100
    return await this.MakeRequest('get', { endpoint, params })
101
  }
102
 
103
  async delete(endpoint, params) {
104
    return await this.MakeRequest('delete', { endpoint, params })
105
  }
106
 
107
  async post(endpoint, data, params) {
108
    return await this.MakeRequest('post', { endpoint, data, params })
109
  }
110
 
111
  async put(endpoint, data, params) {
112
    return await this.MakeRequest('put', { endpoint, data, params })
113
  }
114
 
115
  cancelToken() {
116
    if (!this.#abortController.signal.aborted) {
117
      this.#abortController.abort()
118
    }
119
  }
120
}