import axios, { AxiosInstance, AxiosRequestConfig, AxiosError } from 'axios'; import AsyncStorage from '@react-native-async-storage/async-storage'; import { getAuthTokenForBaseUrl } from '@utils'; import {Store} from '@reduxjs/toolkit'; const axiosInstance: AxiosInstance = axios.create({ timeout: 15000, headers: { 'Content-Type': 'application/json', }, }); axiosInstance.interceptors.request.use( async request => { // Dynamically set baseURL and authtoken from AsyncStorage on every request const storedBaseUrl = await AsyncStorage.getItem('base_url'); if (storedBaseUrl) { request.baseURL = storedBaseUrl; const authToken = getAuthTokenForBaseUrl(storedBaseUrl); if (authToken) { request.headers.authtoken = authToken; } } 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; // Use warn instead of error to avoid triggering the RN dev overlay console.warn('[API] response error', status, data); } else { console.warn('[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 };