import { StorageEnum } from '@/types'; import { setItem } from '@/utils/storage'; import axios, { AxiosError, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig, } from 'axios'; import Cookies from 'js-cookie'; const token = Cookies.get('token') || ''; const axiosInstance = axios.create({ baseURL: 'https://pumpup-api.devstree.in/api/v1', timeout: 50000, headers: { 'Content-Type': 'application/json;charset=utf-8' }, }); // Define a general API response structure interface ApiResponse { statusCode: number; error: boolean; message?: string; data: T; } axiosInstance.interceptors.request.use( (config: InternalAxiosRequestConfig) => { config.headers.Authorization = `Bearer ${token}`; if (config.data instanceof FormData) { config.headers['Content-Type'] = 'multipart/form-data'; } else if (config.data) { config.headers['Content-Type'] = 'application/json;charset=utf-8'; } return config; }, (error: AxiosError) => Promise.reject(error) ); axiosInstance.interceptors.response.use( (res: AxiosResponse>) => { if (!res.data) throw new Error('Error in response'); const { statusCode, error } = res.data; const hasSuccess = (statusCode === 200 || statusCode === 201) && error === false; if (hasSuccess) { // The data is already intact, no need to reassign return res; } throw new Error(res.data.message || 'Unknown API error'); }, (error: AxiosError) => { const status = error.response?.status; if (status === 401) { setItem(StorageEnum.TOKEN, null); window.localStorage.clear(); Cookies.remove('token'); } return Promise.reject(error); } ); class Instance { get(config: AxiosRequestConfig): Promise> { return this.request>({ ...config, method: 'GET' }); } post(config: AxiosRequestConfig): Promise> { return this.request>({ ...config, method: 'POST' }); } put(config: AxiosRequestConfig): Promise> { return this.request>({ ...config, method: 'PUT' }); } patch(config: AxiosRequestConfig): Promise> { return this.request>({ ...config, method: 'PATCH' }); } delete(config: AxiosRequestConfig): Promise> { return this.request>({ ...config, method: 'DELETE' }); } request(config: AxiosRequestConfig): Promise { return axiosInstance.request(config).then((res) => res.data); } } export default new Instance();