import axios, { AxiosInstance, AxiosRequestConfig } from 'axios'; import Cookies from 'js-cookie'; class ApiClient { private client: AxiosInstance; private baseURL: string; constructor() { this.baseURL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8000'; this.client = axios.create({ baseURL: this.baseURL, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, timeout: 10000, withCredentials: true, }); // Add request interceptor for auth token this.client.interceptors.request.use( (config) => { const token = Cookies.get('auth_token') || Cookies.get('access_token'); if (token) { config.headers.Authorization = `Bearer ${token}`; } // Add session ID if available const sessionId = sessionStorage.getItem('tracking_session_id'); if (sessionId) { config.headers['X-Session-ID'] = sessionId; } return config; }, (error) => Promise.reject(error) ); // Add response interceptor for error handling this.client.interceptors.response.use( (response) => response, (error) => { if (error.response?.status === 401) { // Handle unauthorized console.warn('Authentication required'); } console.error('API Error:', error.response?.data || error.message); return Promise.reject(error); } ); } public async post( url: string, data?: any, config?: AxiosRequestConfig ): Promise { const response = await this.client.post(url, data, config); return response.data; } public async get( url: string, config?: AxiosRequestConfig ): Promise { const response = await this.client.get(url, config); return response.data; } public async put( url: string, data?: any, config?: AxiosRequestConfig ): Promise { const response = await this.client.put(url, data, config); return response.data; } public async delete( url: string, config?: AxiosRequestConfig ): Promise { const response = await this.client.delete(url, config); return response.data; } public getBaseURL(): string { return this.baseURL; } public getClient(): AxiosInstance { return this.client; } } export const apiClient = new ApiClient();