frontPanel/src/api/makeRequest.ts

49 lines
1.3 KiB
TypeScript
Raw Normal View History

import * as KIT from "@frontend/kitui";
import { Method, ResponseType, AxiosError } from "axios";
import { clearAuthToken } from "@frontend/kitui";
import { cleanAuthTicketData } from "@root/ticket";
import { clearUserData } from "@root/user";
import { clearQuizData } from "@root/quizes/store";
import { redirect } from "react-router-dom";
2024-05-13 13:24:41 +00:00
import type { AxiosResponse } from "axios";
2024-04-17 14:16:49 +00:00
interface MakeRequest {
method?: Method | undefined;
url: string;
body?: unknown;
useToken?: boolean | undefined;
contentType?: boolean | undefined;
responseType?: ResponseType | undefined;
signal?: AbortSignal | undefined;
withCredentials?: boolean | undefined;
}
2024-05-13 13:24:41 +00:00
type ExtendedAxiosResponse = AxiosResponse & { message: string };
export const makeRequest = async <TRequest = unknown, TResponse = unknown>(
2024-04-17 14:16:49 +00:00
data: MakeRequest,
2024-05-13 13:24:41 +00:00
): Promise<TResponse> => {
2024-04-17 14:16:49 +00:00
try {
2024-05-13 13:24:41 +00:00
const response = await KIT.makeRequest<unknown, TResponse>(data);
return response;
} catch (nativeError) {
const error = nativeError as AxiosError;
2024-04-17 14:16:49 +00:00
if (
error.response?.status === 400 &&
2024-05-13 13:24:41 +00:00
(error.response?.data as ExtendedAxiosResponse)?.message ===
"refreshToken is empty"
2024-04-17 14:16:49 +00:00
) {
cleanAuthTicketData();
clearAuthToken();
clearUserData();
clearQuizData();
redirect("/");
}
2024-05-13 13:24:41 +00:00
throw nativeError;
2024-04-17 14:16:49 +00:00
}
2024-05-13 13:24:41 +00:00
};