135 lines
3.5 KiB
TypeScript
135 lines
3.5 KiB
TypeScript
import { AxiosError, AxiosInstance, AxiosResponse, InternalAxiosRequestConfig } from "axios";
|
|
import { getApiAuthorization } from "../api";
|
|
|
|
const onRequest = (request: InternalAxiosRequestConfig): InternalAxiosRequestConfig => {
|
|
request.headers.Authorization = getApiAuthorization();
|
|
return request;
|
|
};
|
|
|
|
const onRequestError = (error: AxiosError): Promise<AxiosError> => {
|
|
/*console.group("[request error]");
|
|
console.dir(error);
|
|
console.groupEnd();*/
|
|
|
|
return Promise.reject(error);
|
|
};
|
|
|
|
const onResponse = (response: AxiosResponse): AxiosResponse => {
|
|
/*console.group("[response]");
|
|
console.dir(response);
|
|
console.groupEnd();*/
|
|
|
|
const config = response?.config;
|
|
if (config.raw) {
|
|
return response;
|
|
}
|
|
|
|
/*if (response.status === 200) {
|
|
const data = response?.data;
|
|
if (!data) {
|
|
throw new HttpError("API Error. No data!");
|
|
}
|
|
return data;
|
|
}*/
|
|
//throw new HttpError("API Error! Invalid status code!");
|
|
|
|
return response;
|
|
};
|
|
|
|
const onResponseError = (error: AxiosError): Promise<AxiosError> => {
|
|
console.log("[response error]");
|
|
|
|
if (error.response) {
|
|
// La respuesta fue hecha y el servidor respondió con un código de estado
|
|
// que esta fuera del rango de 2xx
|
|
console.log("1 => El servidor respondió con un código de estado > 200");
|
|
|
|
const data = error.response.data;
|
|
const status = error.response.status;
|
|
|
|
console.log(data);
|
|
console.log(status);
|
|
|
|
/*
|
|
|
|
{
|
|
detail: "Quote data not valid",
|
|
instance: "/api/v1/quotes",
|
|
status: 422,
|
|
title: "Unprocessable Entity",
|
|
type: "about:blank",
|
|
context: {
|
|
params: {
|
|
},
|
|
query: {
|
|
},
|
|
body: {
|
|
date: "2024-08-13",
|
|
customer_information: "",
|
|
reference: "",
|
|
status: "draft",
|
|
id: "9c1c6073-127a-4bde-a73c-6229efb51ad0",
|
|
},
|
|
},
|
|
extra: {
|
|
errors: [
|
|
{
|
|
reference: "{reference} is not allowed to be empty",
|
|
},
|
|
{
|
|
customer_information: "{customer_information} is not allowed to be empty",
|
|
},
|
|
],
|
|
},
|
|
}
|
|
|
|
*/
|
|
|
|
switch (status) {
|
|
case 400:
|
|
console.error("Bad Request");
|
|
break;
|
|
case 401:
|
|
console.error("UnAuthorized");
|
|
//window.location.href = "/logout";
|
|
break;
|
|
case 403:
|
|
console.error("Forbidden");
|
|
break;
|
|
/*AppEvents.publish(Events.N_Error, {
|
|
message: "Forbidden",
|
|
description: "Operation ",
|
|
});*/
|
|
case 404:
|
|
console.error("Not found");
|
|
break;
|
|
|
|
case 422:
|
|
console.error("Unprocessable Content");
|
|
break;
|
|
}
|
|
return Promise.reject(data);
|
|
} else if (error.request) {
|
|
// La petición fue hecha pero no se recibió respuesta
|
|
console.log("2 => El servidor no respondió");
|
|
console.error(error);
|
|
} else {
|
|
if (error.code === "ERR_CANCELED") {
|
|
// La petición fue hecha pero se ha cancelado
|
|
console.log("3 => Petición cancelada");
|
|
} else {
|
|
// Algo paso al preparar la petición que lanzo un Error
|
|
console.log("4 => Error desconocido");
|
|
console.error(error);
|
|
}
|
|
}
|
|
console.groupEnd();
|
|
return Promise.reject(error);
|
|
};
|
|
|
|
export function setupInterceptorsTo(axiosInstance: AxiosInstance): AxiosInstance {
|
|
axiosInstance.interceptors.request.use(onRequest, onRequestError);
|
|
axiosInstance.interceptors.response.use(onResponse, onResponseError);
|
|
return axiosInstance;
|
|
}
|