Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 1179 | Rev 1188 | 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
 
801 stevensc 44
          return request
45
        }
46
 
47
        return request
48
      },
49
      (error) => {
50
        return Promise.reject(error)
51
      }
52
    )
53
 
808 stevensc 54
    this.#client.interceptors.response.use(
55
      async (response) => {
56
        const { fatal } = response.data
57
 
58
        if (fatal) {
59
          window.localStorage.removeItem('jwt')
60
          window.localStorage.removeItem('aes')
61
          window.location.reload()
62
          return
63
        }
64
 
65
        return response
66
      },
67
      (error) => {
68
        return Promise.reject(error)
69
      }
70
    )
71
 
797 stevensc 72
    this.#abortController = new AbortController()
802 stevensc 73
 
74
    if (Request.instance) {
75
      return Request.instance
76
    }
77
 
78
    Request.instance = this
797 stevensc 79
  }
80
 
802 stevensc 81
  setBaseURL(baseURL = '') {
1180 stevensc 82
    if (typeof baseURL !== 'string') {
83
      throw new Error('baseURL must be a string')
84
    }
802 stevensc 85
    this.#client.defaults.baseURL = baseURL
86
  }
87
 
797 stevensc 88
  async MakeRequest(method = 'get', { endpoint, data, params }) {
89
    const config = { ...params }
90
    config.signal = this.#abortController.signal
91
 
92
    const response =
93
      method === 'get' || method === 'delete'
94
        ? await this.#client[method](endpoint, config)
95
        : await this.#client[method](endpoint, data, config)
96
 
805 stevensc 97
    return response
797 stevensc 98
  }
99
 
100
  async get(endpoint, params) {
101
    return await this.MakeRequest('get', { endpoint, params })
102
  }
103
 
104
  async delete(endpoint, params) {
105
    return await this.MakeRequest('delete', { endpoint, params })
106
  }
107
 
108
  async post(endpoint, data, params) {
109
    return await this.MakeRequest('post', { endpoint, data, params })
110
  }
111
 
112
  async put(endpoint, data, params) {
113
    return await this.MakeRequest('put', { endpoint, data, params })
114
  }
115
 
116
  cancelToken() {
117
    if (!this.#abortController.signal.aborted) {
118
      this.#abortController.abort()
119
    }
120
  }
121
}