import axios, { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'; interface ApiService { get(url: string, config?: AxiosRequestConfig): Promise; post(url: string, data?: any, config?: AxiosRequestConfig): Promise; put(url: string, data?: any, config?: AxiosRequestConfig): Promise; delete(url: string, config?: AxiosRequestConfig): Promise; } type RequestOptions = { transformRequest?: AxiosRequestConfig['transformRequest']; transformResponse?: (response: T, config: AxiosRequestConfig) => T; } class HttpService implements ApiService { private axiosInstance: AxiosInstance; private options?: RequestOptions; constructor(baseURL: string, options?: RequestOptions) { this.axiosInstance = axios.create({ baseURL, timeout: 5000, // Set your desired timeout value }); this.options = options; } get(url: string, config?: AxiosRequestConfig): Promise { return this.request({ url, method: 'GET', ...config }) } post(url: string, data?: any, config?: AxiosRequestConfig): Promise { return this.request({ url, method: 'POST', data, ...config }) } put(url: string, data?: any, config?: AxiosRequestConfig): Promise { return this.request({ url, method: 'PUT', data, ...config }) } delete(url: string, config?: AxiosRequestConfig): Promise { return this.request({ url, method: 'DELETE', ...config }) } request(config: AxiosRequestConfig): Promise { config.headers = { ...config.headers, Authorization: localStorage.getItem('token') || '', } const { transformResponse } = this.options || {}; return new Promise((resolve, reject) => { this.axiosInstance .request(config) .then((response: AxiosResponse) => { if (transformResponse) { try { const res = transformResponse(response.data, config); resolve(res); } catch (e) { reject(e); } } resolve(response.data); }) .catch((e: Error | AxiosError) => { reject(e); }) }) } } export default HttpService;