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 => { /*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 => { 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; }