import axios from 'axios'; import getCookie from './cookie.utils'; import config from '../config/config'; const getApiClinet = (options = {}) => { return axios.create({ headers: { 'Content-Type': 'application/json', 'get-over-post': true, 'session-header': config.token, }, ...(options || {}), }); }; export enum REQUEST_METHOD { GET = 1, POST, DELETE, PUT, PATCH, } export interface CallApiParams { url: string; data: any | null; method: REQUEST_METHOD; headers?: any | null; } const callApi = async (props: CallApiParams) => { if (!props.url) throw new Error('No url was provided'); if (!props.method) throw new Error('No method was provided, should be one of GET, POST, PUT, DELETE, PATCH'); const mergedOptions = { headers: { 'Content-Type': 'application/json', Accept: 'application/json', ...props.headers, }, }; const apiUrl = config.HOST_URL + props.url; try { let response = null; switch (props.method) { case REQUEST_METHOD.POST: { response = await getApiClinet().post(apiUrl, props.data, mergedOptions); break; } case REQUEST_METHOD.PUT: { response = await getApiClinet().put(apiUrl, props.data, mergedOptions); break; } case REQUEST_METHOD.PATCH: { response = await getApiClinet().patch(apiUrl, props.data, mergedOptions); break; } case REQUEST_METHOD.DELETE: { response = await getApiClinet().delete(apiUrl); break; } default: { response = await getApiClinet().get(apiUrl, { ...mergedOptions, params: props.data }); } } return { resp: response.data, statusCode: response.status, err: null, }; } catch (error: any) { return { resp: error.response?.data, statusCode: error.response?.status, err: error, canceled: error.message.toLowerCase() === 'canceled', }; } }; export default callApi;