/** * Module: generic API for backend REST communications. */ import { AxiosError, AxiosRequestConfig } from 'axios'; import { toast } from 'react-toastify'; import { ErrorData } from '@/components/info/InfoError'; import { extractErrorMessage } from '@/utils/utils'; import { axiosInstance } from './apiConfiguration'; // ================ Data transfer types ================ export type DataCallback = (data: ResponseData) => void; export interface IFrontRequest { data?: RequestData; onSuccess?: DataCallback; onError?: (error: ErrorData) => void; setLoading?: (loading: boolean) => void; showError?: boolean; } export interface FrontPush extends IFrontRequest { data: DataType; } export interface FrontPull extends IFrontRequest { onSuccess: DataCallback; } export interface FrontExchange extends IFrontRequest { data: RequestData; onSuccess: DataCallback; } export interface FrontAction extends IFrontRequest {} export interface IAxiosRequest { endpoint: string; request: IFrontRequest; options?: AxiosRequestConfig; } // ================ Transport API calls ================ export function AxiosGet({ endpoint, request, options }: IAxiosRequest) { if (request.setLoading) request.setLoading(true); axiosInstance .get(endpoint, options) .then(response => { if (request.setLoading) request.setLoading(false); if (request.onSuccess) request.onSuccess(response.data); }) .catch((error: Error | AxiosError) => { if (request.setLoading) request.setLoading(false); if (request.showError) toast.error(extractErrorMessage(error)); if (request.onError) request.onError(error); }); } export function AxiosPost({ endpoint, request, options }: IAxiosRequest) { if (request.setLoading) request.setLoading(true); axiosInstance .post(endpoint, request.data, options) .then(response => { if (request.setLoading) request.setLoading(false); if (request.onSuccess) request.onSuccess(response.data); }) .catch((error: Error | AxiosError) => { if (request.setLoading) request.setLoading(false); if (request.showError) toast.error(extractErrorMessage(error)); if (request.onError) request.onError(error); }); } export function AxiosDelete({ endpoint, request, options }: IAxiosRequest) { if (request.setLoading) request.setLoading(true); axiosInstance .delete(endpoint, options) .then(response => { if (request.setLoading) request.setLoading(false); if (request.onSuccess) request.onSuccess(response.data); }) .catch((error: Error | AxiosError) => { if (request.setLoading) request.setLoading(false); if (request.showError) toast.error(extractErrorMessage(error)); if (request.onError) request.onError(error); }); } export function AxiosPatch({ endpoint, request, options }: IAxiosRequest) { if (request.setLoading) request.setLoading(true); axiosInstance .patch(endpoint, request.data, options) .then(response => { if (request.setLoading) request.setLoading(false); if (request.onSuccess) request.onSuccess(response.data); return response.data; }) .catch((error: Error | AxiosError) => { if (request.setLoading) request.setLoading(false); if (request.showError) toast.error(extractErrorMessage(error)); if (request.onError) request.onError(error); }); }