import axios, { AxiosInstance, AxiosRequestConfig, AxiosError } from 'axios'; import config from 'react-native-config'; import {Store} from '@reduxjs/toolkit'; const axiosInstance: AxiosInstance = axios.create({ baseURL: config.BASE_URL, timeout: 15000, headers: { 'Content-Type': 'application/json', authtoken: config.AUTH_TOKEN, }, }); axiosInstance.interceptors.request.use( request => { if (request.data instanceof FormData) { delete request.headers?.['Content-Type']; } return request; }, (error: AxiosError) => Promise.reject(error), ); axiosInstance.interceptors.response.use( response => response, (error: AxiosError) => { if (error.response) { const status = error.response.status; const data = error.response.data; console.error('[API] response error', status, data); } else { console.error('[API] network error', error.message); } return Promise.reject(error); }, ); let storeInstance: Store | null = null; export const injectStore = (_store: Store | null): void => { storeInstance = _store; }; export const api = { async get(url: string, config?: AxiosRequestConfig): Promise { const response = await axiosInstance.get(url, config); return response.data; }, async post( url: string, body?: unknown, config?: AxiosRequestConfig, ): Promise { const response = await axiosInstance.post(url, body, config); return response.data; }, async put( url: string, body?: unknown, config?: AxiosRequestConfig, ): Promise { const response = await axiosInstance.put(url, body, config); return response.data; }, async patch( url: string, body?: unknown, config?: AxiosRequestConfig, ): Promise { const response = await axiosInstance.patch(url, body, config); return response.data; }, async delete(url: string, config?: AxiosRequestConfig): Promise { const response = await axiosInstance.delete(url, config); return response.data; }, }; export { axiosInstance };