Rev 3483 | 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 } = response.data;
if (fatal) throw new Error('La sesión ha caducado');
return response;
}
setBaseURL(baseURL) {
this.instance.defaults.baseURL = baseURL;
}
getInstance() {
return this.instance;
}
}
export const apiClientInstance = new ApiClient();
export const api = apiClientInstance.getInstance();