Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3432 | 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}`;
        }

        const contentType = request.method === 'post' ? 'multipart/form-data' : 'application/json';

        request.headers['Content-Type'] = contentType;

        if (request.method !== 'get') {
          const csrfToken = await this.getCsrfToken();
          request.headers['X-CSRF-TOKEN'] = csrfToken;
        }

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

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

        if (fatal === true) {
          throw new Error('La sesión ha caducado');
        }

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

    this.#abortController = new AbortController();
  }

  async getCsrfToken() {
    const response = await this.#client.get('/csrf');
    const { data: csrfToken, success } = response.data;
    if (!success) throw new Error('Error al obtener el CSRF token');
    return csrfToken;
  }

  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();
    }
  }
}