Rev 3396 | Rev 3405 | Ir a la última revisión | 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 =
request.method === 'get' && request.url === '/signin'
? ''
: `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()
}
}
}