Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3575 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

import axios from 'axios';

async function fetchCsrfToken(axiosInstance) {
  try {
    const csrfToken = await axiosInstance.get('/csrf');
    return csrfToken;
  } catch (error) {
    console.error('Error fetching CSRF token:', error);
    throw new Error('Error fetching CSRF token');
  }
}

class ApiClient {
  constructor(baseURL = null, config = {}) {
    this.instance = axios.create({ baseURL, ...config });

    this.instance.interceptors.request.use(
      (request) => this.requestInterceptor(request),
      (error) => Promise.reject(error)
    );
    this.instance.interceptors.response.use(
      (response) => this.responseInterceptor(response),
      (error) => Promise.reject(error)
    );
  }

  async requestInterceptor(request) {
    const token = window.localStorage.getItem('jwt');
    if (token) request.headers.Authorization = `Bearer ${token}`;

    if (request.method === 'post') {
      const csrfToken = await fetchCsrfToken(this.instance);
      request.headers['Content-Type'] = 'multipart/form-data';
      request.headers['X-CSRF-TOKEN'] = csrfToken;
    }

    if (request.method === 'get') {
      request.headers['Content-Type'] = 'application/json';
    }

    return request;
  }

  responseInterceptor(response) {
    const { fatal, success, data } = response.data;
    if (fatal) throw new Error('La sesión ha caducado');
    if (!data) return response.data;
    if (!success) {
      const errorMessage =
        typeof data === 'string'
          ? data
          : 'Ha ocurrido un error inesperado, por favor intente más tarde.';
      throw new Error(errorMessage);
    }
    return data;
  }

  setBaseURL(baseURL) {
    this.instance.defaults.baseURL = baseURL;
  }

  getInstance() {
    return this.instance;
  }
}

const API_URL = import.meta.env.VITE_API_URL;
export const apiClientInstance = new ApiClient(API_URL);
export const api = apiClientInstance.getInstance();