Proyectos de Subversion LeadersLinked - SPA

Rev

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