Presupuestador_web/client/src/lib/axios/setupInterceptors.ts
2024-09-23 17:56:15 +02:00

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