Spaces:
Sleeping
Sleeping
File size: 3,122 Bytes
79278ec |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
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<Type> {
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 <T>(
{ url, signal, ...requestOptions }: IAxiosParams,
baseUrl = apiBaseUrl
): Promise<GenericIdentityFn<T> | 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();
}
}
};
|