Rev 860 | Rev 1180 | 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 = 'Bearer ' + token
}
if (['post', 'put', 'delete'].includes(request.method)) {
try {
const { data: responseData } = await this.#client.get('/csrf')
const { data, success } = responseData
if (success) {
request.headers['X-CSRF-TOKEN'] = data
return request
}
} catch (err) {
throw new Error(
`Axios problem with request during pre-flight phase: ${err}.`
)
}
}
if (['get'].includes(request.method)) {
const headers = {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache, no-store',
Accept: 'application/json',
Vary: 'Accept'
}
request.headers = { ...request.headers, ...headers }
request.timeout = 3000
return request
}
return request
},
(error) => {
return Promise.reject(error)
}
)
this.#client.interceptors.response.use(
async (response) => {
const { fatal } = response.data
if (fatal) {
window.localStorage.removeItem('jwt')
window.localStorage.removeItem('aes')
window.location.reload()
return
}
return response
},
(error) => {
return Promise.reject(error)
}
)
this.#abortController = new AbortController()
if (Request.instance) {
return Request.instance
}
Request.instance = this
}
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()
}
}
}