/** * 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) { request.setLoading?.(true); axiosInstance .get(endpoint, options) .then(response => { request.setLoading?.(false); request.onSuccess?.(response.data); }) .catch((error: Error | AxiosError) => { request.setLoading?.(false); if (request.showError) toast.error(extractErrorMessage(error)); request.onError?.(error); }); } export function AxiosPost({ endpoint, request, options }: IAxiosRequest) { request.setLoading?.(true); axiosInstance .post(endpoint, request.data, options) .then(response => { request.setLoading?.(false); request.onSuccess?.(response.data); }) .catch((error: Error | AxiosError) => { request.setLoading?.(false); if (request.showError) toast.error(extractErrorMessage(error)); request.onError?.(error); }); } export function AxiosDelete({ endpoint, request, options }: IAxiosRequest) { request.setLoading?.(true); axiosInstance .delete(endpoint, options) .then(response => { request.setLoading?.(false); request.onSuccess?.(response.data); }) .catch((error: Error | AxiosError) => { request.setLoading?.(false); if (request.showError) toast.error(extractErrorMessage(error)); request.onError?.(error); }); } export function AxiosPatch({ endpoint, request, options }: IAxiosRequest) { request.setLoading?.(true); axiosInstance .patch(endpoint, request.data, options) .then(response => { request.setLoading?.(false); request.onSuccess?.(response.data); return response.data; }) .catch((error: Error | AxiosError) => { request.setLoading?.(false); if (request.showError) toast.error(extractErrorMessage(error)); request.onError?.(error); }); }