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