Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3574 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3481 stevensc 1
import axios from 'axios';
2
 
3
async function fetchCsrfToken(axiosInstance) {
4
  try {
5
    const csrfToken = await axiosInstance.get('/csrf');
6
    return csrfToken;
7
  } catch (error) {
8
    console.error('Error fetching CSRF token:', error);
9
    throw new Error('Error fetching CSRF token');
10
  }
11
}
12
 
13
class ApiClient {
14
  constructor(baseURL = null, config = {}) {
15
    this.instance = axios.create({ baseURL, ...config });
16
 
17
    this.instance.interceptors.request.use(
18
      (request) => this.requestInterceptor(request),
19
      (error) => Promise.reject(error)
20
    );
21
    this.instance.interceptors.response.use(
22
      (response) => this.responseInterceptor(response),
23
      (error) => Promise.reject(error)
24
    );
25
  }
26
 
27
  async requestInterceptor(request) {
28
    const token = window.localStorage.getItem('jwt');
29
    if (token) request.headers.Authorization = `Bearer ${token}`;
30
 
31
    if (request.method === 'post') {
32
      const csrfToken = await fetchCsrfToken(this.instance);
33
      request.headers['Content-Type'] = 'multipart/form-data';
34
      request.headers['X-CSRF-TOKEN'] = csrfToken;
35
    }
36
 
37
    if (request.method === 'get') {
38
      request.headers['Content-Type'] = 'application/json';
39
    }
40
 
41
    return request;
42
  }
43
 
44
  responseInterceptor(response) {
3483 stevensc 45
    const { fatal, success, data } = response.data;
3481 stevensc 46
    if (fatal) throw new Error('La sesión ha caducado');
3483 stevensc 47
    if (!data) return response.data;
48
    if (!success) {
49
      const errorMessage =
50
        typeof data === 'string'
51
          ? data
52
          : 'Ha ocurrido un error inesperado, por favor intente más tarde.';
53
      throw new Error(errorMessage);
54
    }
55
    return data;
3481 stevensc 56
  }
57
 
58
  setBaseURL(baseURL) {
59
    this.instance.defaults.baseURL = baseURL;
60
  }
61
 
62
  getInstance() {
63
    return this.instance;
64
  }
65
}
66
 
67
export const apiClientInstance = new ApiClient();
68
export const api = apiClientInstance.getInstance();