Rev 3574 | Ir a la última revisión | 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;
}
}
export const apiClientInstance = new ApiClient();
export const api = apiClientInstance.getInstance();