Proyectos de Subversion LeadersLinked - SPA

Rev

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

import axios from 'axios'

export class Request {
  #client
  #abortController

  constructor() {
    this.#client = axios.create()

    this.#client.interceptors.request.use(
      async (request) => {
        const token = window.localStorage.getItem('jwt')

        if (token) {
          request.headers.Authorization = 'Bearer ' + token
        }

        if (['post', 'put', 'delete'].includes(request.method)) {
          try {
            const { data: responseData } = await this.#client.get('/csrf')
            const { data, success } = responseData

            if (success) {
              request.headers['X-CSRF-TOKEN'] = data
              return request
            }
          } catch (err) {
            throw new Error(
              `Axios problem with request during pre-flight phase: ${err}.`
            )
          }
        }

        if (['get'].includes(request.method)) {
          const headers = {
            'Content-Type': 'application/json',
            'Cache-Control': 'no-cache, no-store',
            Accept: 'application/json',
            Vary: 'Accept'
          }

          request.headers = { ...request.headers, ...headers }
          request.timeout = 3000

          return request
        }

        return request
      },
      (error) => {
        return Promise.reject(error)
      }
    )

    this.#client.interceptors.response.use(
      async (response) => {
        const { fatal } = response.data

        if (fatal) {
          window.localStorage.removeItem('jwt')
          window.localStorage.removeItem('aes')
          window.location.reload()
          return
        }

        return response
      },
      (error) => {
        return Promise.reject(error)
      }
    )

    this.#abortController = new AbortController()

    if (Request.instance) {
      return Request.instance
    }

    Request.instance = this
  }

  setBaseURL(baseURL = '') {
    if (typeof baseURL !== 'string') throw new Error('baseURL must be a string')
    this.#client.defaults.baseURL = baseURL
  }

  async MakeRequest(method = 'get', { endpoint, data, params }) {
    const config = { ...params }
    config.signal = this.#abortController.signal

    const response =
      method === 'get' || method === 'delete'
        ? await this.#client[method](endpoint, config)
        : await this.#client[method](endpoint, data, config)

    return response
  }

  async get(endpoint, params) {
    return await this.MakeRequest('get', { endpoint, params })
  }

  async delete(endpoint, params) {
    return await this.MakeRequest('delete', { endpoint, params })
  }

  async post(endpoint, data, params) {
    return await this.MakeRequest('post', { endpoint, data, params })
  }

  async put(endpoint, data, params) {
    return await this.MakeRequest('put', { endpoint, data, params })
  }

  cancelToken() {
    if (!this.#abortController.signal.aborted) {
      this.#abortController.abort()
    }
  }
}