muryshev's picture
update
4f9f661
import axios, { AxiosError, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } 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?: AxiosRequestConfig['responseType'];
notCauseError?: boolean;
signal?: AbortSignal;
}
export interface IQueryErrorResponse {
error: {
status: unknown;
data: unknown;
headers?: AxiosResponse['headers'];
notCauseError?: boolean;
};
}
export interface GenericIdentityFn<Type> {
data: Type;
headers?: AxiosResponse['headers'];
}
export const instance = axios.create({
baseURL: apiBaseUrl ? `${apiBaseUrl}` : '',
timeout: 600000,
});
const requestInterceptors = (req: InternalAxiosRequestConfig) => {
// Добавляем jwt токен для всех маршрутов
const token = localStorage.getItem('authToken');
if (token) {
req.headers.Authorization = `Bearer ${token}`;
}
return req;
};
const successInterceptors = (response: AxiosResponse) => response;
const errorInterceptors = async (error: AxiosError) => {
const message = error.message;
if (message.includes('409')) {
console.log('409');
queryClient.invalidateQueries({ queryKey: ['processing'] });
}
if (error.response?.status === 401) {
localStorage.removeItem('authToken');
window.location.href = '/login'; // Редирект на логин при 401
} else {
if (!axios.isCancel(error) && !message.includes('409')) {
alert(`${message} Произошла ошибка`);
}
}
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();
}
}
};