import axios, { AxiosError, AxiosRequestConfig, AxiosResponse, AxiosResponseHeaders, InternalAxiosRequestConfig, RawAxiosResponseHeaders, ResponseType, } from "axios"; import { apiBaseUrl } from "../constants"; import { queryClient } from "@/main"; export interface IAxiosParams { method: AxiosRequestConfig["method"]; url: string; params?: AxiosRequestConfig["params"]; data?: AxiosRequestConfig["data"]; headers?: AxiosRequestConfig["headers"]; responseType?: ResponseType | undefined; notCauseError?: boolean; signal?: AbortSignal; } export interface IQueryErrorResponse { error: { status: unknown; data: unknown; headers?: RawAxiosResponseHeaders | AxiosResponseHeaders; notCauseError?: boolean; }; } export interface GenericIdentityFn { data: Type; headers?: RawAxiosResponseHeaders | AxiosResponseHeaders; } /** * Инстанс аксиоса */ export const instance = axios.create({ baseURL: apiBaseUrl ? `${apiBaseUrl}` : "", timeout: 600000, }); /** * Интерцептор на запрос */ const requestInterceptors = (req: InternalAxiosRequestConfig) => { return req; }; /** * Интерцептор на успешный ответ сервера */ const successInterceptors = (response: AxiosResponse) => response; /** * Интерцептор на ошибку сервера */ const errorInterceptors = async (error: AxiosError) => { const message = error.message; if (!axios.isCancel(error) && !message.includes("409")) { alert(`${message} Произошла ошибка`); } if (message.includes("409")) { console.log("409"); queryClient.invalidateQueries({ queryKey: ["processing"] }); } return Promise.reject(error); }; instance.interceptors.request.use(requestInterceptors); instance.interceptors.response.use(successInterceptors, errorInterceptors); export const query = async ( { url, signal, ...requestOptions }: IAxiosParams, baseUrl = apiBaseUrl ): Promise | IQueryErrorResponse> => { const controller = new AbortController(); const requestSignal = signal || controller.signal; try { console.log("Попытка отправки запроса"); const result = await instance({ url: `${baseUrl}${url}`, signal: requestSignal, ...requestOptions, }); console.log("Запрос отправлен, результат:", result); return { data: result.data as T, headers: result.headers }; } catch (axiosError) { if (axios.isCancel(axiosError)) { console.log("Запрос отменен"); return { error: { status: "Cancelled", data: "Request was cancelled", notCauseError: true, }, }; } const err = axiosError as AxiosError; console.log("Ошибка при отправке запроса"); return { error: { status: err.response?.status, data: err.response?.data, headers: err.response?.headers, }, }; } finally { if (!signal) { controller.abort(); } } };