Spaces:
Sleeping
Sleeping
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(); | |
} | |
} | |
}; | |