Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 460 | Autoría | Ultima modificación | Ver Log |

import axios from 'axios'

export class Request {
  #client
  #abortController

  constructor(baseURL, timeout = 5000) {
    this.#client = axios({ baseURL, timeout })

    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 resp = await this.get("/csrf");
            const { data, success } = resp.data

            if (success) {
              request.headers["X-CSRF-TOKEN"] = data;
              return request;
            }

          } catch (err) {
            throw new Error(
              `Axios problem with request during pre-flight phase: ${err}.`
            );
          }
        }
      },
      (error) => {
        return Promise.reject(error);
      }
    );

    this.#abortController = new AbortController()
  }

  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.data
  }

  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('delete', { endpoint, data, params })
  }

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

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