85 lines
2.1 KiB
TypeScript
85 lines
2.1 KiB
TypeScript
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<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 };
|