92 lines
2.4 KiB
TypeScript

import axios, { AxiosInstance, AxiosRequestConfig, AxiosError } from 'axios';
import config from 'react-native-config';
import AsyncStorage from '@react-native-async-storage/async-storage';
import {Store} from '@reduxjs/toolkit';
const axiosInstance: AxiosInstance = axios.create({
timeout: 15000,
headers: {
'Content-Type': 'application/json',
authtoken: config.AUTH_TOKEN,
},
});
axiosInstance.interceptors.request.use(
async request => {
// Dynamically set baseURL from AsyncStorage on every request
const storedBaseUrl = await AsyncStorage.getItem('base_url');
if (storedBaseUrl) {
request.baseURL = storedBaseUrl;
}
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<T>(url: string, config?: AxiosRequestConfig): Promise<T> {
const response = await axiosInstance.get<T>(url, config);
return response.data;
},
async post<T>(
url: string,
body?: unknown,
config?: AxiosRequestConfig,
): Promise<T> {
const response = await axiosInstance.post<T>(url, body, config);
return response.data;
},
async put<T>(
url: string,
body?: unknown,
config?: AxiosRequestConfig,
): Promise<T> {
const response = await axiosInstance.put<T>(url, body, config);
return response.data;
},
async patch<T>(
url: string,
body?: unknown,
config?: AxiosRequestConfig,
): Promise<T> {
const response = await axiosInstance.patch<T>(url, body, config);
return response.data;
},
async delete<T>(url: string, config?: AxiosRequestConfig): Promise<T> {
const response = await axiosInstance.delete<T>(url, config);
return response.data;
},
};
export { axiosInstance };