Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 801 | Rev 805 | 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
 
802 stevensc 7
  constructor(timeout = 5000) {
8
    this.#client = axios.create({ timeout })
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 {
20
            const { data: responseData } = await this.MakeRequest.get('/csrf')
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 = {
36
            Accept: 'application/json',
37
            Vary: 'Accept',
38
            'Cache-Control': 'no-cache, no-store',
39
            'Content-Type': 'application/json'
40
          }
41
          request.headers = { ...request.headers, ...headers }
42
          return request
43
        }
44
 
45
        return request
46
      },
47
      (error) => {
48
        return Promise.reject(error)
49
      }
50
    )
51
 
797 stevensc 52
    this.#abortController = new AbortController()
802 stevensc 53
 
54
    if (Request.instance) {
55
      return Request.instance
56
    }
57
 
58
    Request.instance = this
797 stevensc 59
  }
60
 
802 stevensc 61
  setBaseURL(baseURL = '') {
62
    if (typeof baseURL !== 'string') throw new Error('baseURL must be a string')
63
    this.#client.defaults.baseURL = baseURL
64
  }
65
 
797 stevensc 66
  async MakeRequest(method = 'get', { endpoint, data, params }) {
67
    const config = { ...params }
68
    config.signal = this.#abortController.signal
69
 
70
    const response =
71
      method === 'get' || method === 'delete'
72
        ? await this.#client[method](endpoint, config)
73
        : await this.#client[method](endpoint, data, config)
74
 
75
    return response.data
76
  }
77
 
78
  async get(endpoint, params) {
79
    return await this.MakeRequest('get', { endpoint, params })
80
  }
81
 
82
  async delete(endpoint, params) {
83
    return await this.MakeRequest('delete', { endpoint, params })
84
  }
85
 
86
  async post(endpoint, data, params) {
87
    return await this.MakeRequest('post', { endpoint, data, params })
88
  }
89
 
90
  async put(endpoint, data, params) {
91
    return await this.MakeRequest('put', { endpoint, data, params })
92
  }
93
 
94
  cancelToken() {
95
    if (!this.#abortController.signal.aborted) {
96
      this.#abortController.abort()
97
    }
98
  }
99
}