2024-07-24 23:20:45 +03:00
|
|
|
/**
|
|
|
|
* Module: generic API for backend REST communications.
|
|
|
|
*/
|
|
|
|
import { AxiosError, AxiosRequestConfig } from 'axios';
|
|
|
|
import { toast } from 'react-toastify';
|
|
|
|
|
|
|
|
import { ErrorData } from '@/components/info/InfoError';
|
2024-08-18 12:55:41 +03:00
|
|
|
import { extractErrorMessage } from '@/utils/utils';
|
2024-07-24 23:20:45 +03:00
|
|
|
|
2025-01-23 19:41:31 +03:00
|
|
|
import { axiosInstance } from './axiosInstance';
|
2024-07-24 23:20:45 +03:00
|
|
|
|
|
|
|
// ================ Data transfer types ================
|
|
|
|
export type DataCallback<ResponseData = undefined> = (data: ResponseData) => void;
|
|
|
|
|
|
|
|
export interface IFrontRequest<RequestData, ResponseData> {
|
|
|
|
data?: RequestData;
|
|
|
|
onSuccess?: DataCallback<ResponseData>;
|
|
|
|
onError?: (error: ErrorData) => void;
|
|
|
|
setLoading?: (loading: boolean) => void;
|
|
|
|
showError?: boolean;
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface FrontPush<DataType> extends IFrontRequest<DataType, undefined> {
|
|
|
|
data: DataType;
|
|
|
|
}
|
|
|
|
export interface FrontPull<DataType> extends IFrontRequest<undefined, DataType> {
|
|
|
|
onSuccess: DataCallback<DataType>;
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface FrontExchange<RequestData, ResponseData> extends IFrontRequest<RequestData, ResponseData> {
|
|
|
|
data: RequestData;
|
|
|
|
onSuccess: DataCallback<ResponseData>;
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface FrontAction extends IFrontRequest<undefined, undefined> {}
|
|
|
|
|
|
|
|
export interface IAxiosRequest<RequestData, ResponseData> {
|
|
|
|
endpoint: string;
|
|
|
|
request: IFrontRequest<RequestData, ResponseData>;
|
|
|
|
options?: AxiosRequestConfig;
|
|
|
|
}
|
|
|
|
|
|
|
|
// ================ Transport API calls ================
|
|
|
|
export function AxiosGet<ResponseData>({ endpoint, request, options }: IAxiosRequest<undefined, ResponseData>) {
|
2025-01-21 20:33:05 +03:00
|
|
|
request.setLoading?.(true);
|
2024-07-24 23:20:45 +03:00
|
|
|
axiosInstance
|
|
|
|
.get<ResponseData>(endpoint, options)
|
|
|
|
.then(response => {
|
2025-01-21 20:33:05 +03:00
|
|
|
request.setLoading?.(false);
|
|
|
|
request.onSuccess?.(response.data);
|
2024-07-24 23:20:45 +03:00
|
|
|
})
|
|
|
|
.catch((error: Error | AxiosError) => {
|
2025-01-21 20:33:05 +03:00
|
|
|
request.setLoading?.(false);
|
2024-08-18 12:55:41 +03:00
|
|
|
if (request.showError) toast.error(extractErrorMessage(error));
|
2025-01-21 20:33:05 +03:00
|
|
|
request.onError?.(error);
|
2024-07-24 23:20:45 +03:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
export function AxiosPost<RequestData, ResponseData>({
|
|
|
|
endpoint,
|
|
|
|
request,
|
|
|
|
options
|
|
|
|
}: IAxiosRequest<RequestData, ResponseData>) {
|
2025-01-21 20:33:05 +03:00
|
|
|
request.setLoading?.(true);
|
2024-07-24 23:20:45 +03:00
|
|
|
axiosInstance
|
|
|
|
.post<ResponseData>(endpoint, request.data, options)
|
|
|
|
.then(response => {
|
2025-01-21 20:33:05 +03:00
|
|
|
request.setLoading?.(false);
|
|
|
|
request.onSuccess?.(response.data);
|
2024-07-24 23:20:45 +03:00
|
|
|
})
|
|
|
|
.catch((error: Error | AxiosError) => {
|
2025-01-21 20:33:05 +03:00
|
|
|
request.setLoading?.(false);
|
2024-08-18 12:55:41 +03:00
|
|
|
if (request.showError) toast.error(extractErrorMessage(error));
|
2025-01-21 20:33:05 +03:00
|
|
|
request.onError?.(error);
|
2024-07-24 23:20:45 +03:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
export function AxiosDelete<RequestData, ResponseData>({
|
|
|
|
endpoint,
|
|
|
|
request,
|
|
|
|
options
|
|
|
|
}: IAxiosRequest<RequestData, ResponseData>) {
|
2025-01-21 20:33:05 +03:00
|
|
|
request.setLoading?.(true);
|
2024-07-24 23:20:45 +03:00
|
|
|
axiosInstance
|
|
|
|
.delete<ResponseData>(endpoint, options)
|
|
|
|
.then(response => {
|
2025-01-21 20:33:05 +03:00
|
|
|
request.setLoading?.(false);
|
|
|
|
request.onSuccess?.(response.data);
|
2024-07-24 23:20:45 +03:00
|
|
|
})
|
|
|
|
.catch((error: Error | AxiosError) => {
|
2025-01-21 20:33:05 +03:00
|
|
|
request.setLoading?.(false);
|
2024-08-18 12:55:41 +03:00
|
|
|
if (request.showError) toast.error(extractErrorMessage(error));
|
2025-01-21 20:33:05 +03:00
|
|
|
request.onError?.(error);
|
2024-07-24 23:20:45 +03:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
export function AxiosPatch<RequestData, ResponseData>({
|
|
|
|
endpoint,
|
|
|
|
request,
|
|
|
|
options
|
|
|
|
}: IAxiosRequest<RequestData, ResponseData>) {
|
2025-01-21 20:33:05 +03:00
|
|
|
request.setLoading?.(true);
|
2024-07-24 23:20:45 +03:00
|
|
|
axiosInstance
|
|
|
|
.patch<ResponseData>(endpoint, request.data, options)
|
|
|
|
.then(response => {
|
2025-01-21 20:33:05 +03:00
|
|
|
request.setLoading?.(false);
|
|
|
|
request.onSuccess?.(response.data);
|
2024-07-24 23:20:45 +03:00
|
|
|
return response.data;
|
|
|
|
})
|
|
|
|
.catch((error: Error | AxiosError) => {
|
2025-01-21 20:33:05 +03:00
|
|
|
request.setLoading?.(false);
|
2024-08-18 12:55:41 +03:00
|
|
|
if (request.showError) toast.error(extractErrorMessage(error));
|
2025-01-21 20:33:05 +03:00
|
|
|
request.onError?.(error);
|
2024-07-24 23:20:45 +03:00
|
|
|
});
|
|
|
|
}
|