import axios, { AxiosInstance, AxiosRequestConfig } from 'axios'; const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; class ApiClient { private client: AxiosInstance; constructor() { this.client = axios.create({ baseURL: API_URL, headers: { 'Content-Type': 'application/json', }, }); this.client.interceptors.request.use((config) => { const token = typeof window !== 'undefined' ? localStorage.getItem('auth_token') : null; if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }); this.client.interceptors.response.use( (response) => response, (error) => { if (error.response?.status === 401) { if (typeof window !== 'undefined') { localStorage.removeItem('auth_token'); window.location.href = '/login'; } } return Promise.reject(error); } ); } async get(url: string, config?: AxiosRequestConfig): Promise { const response = await this.client.get<{ success: boolean; data: T }>(url, config); return response.data.data; } async post(url: string, data?: any, config?: AxiosRequestConfig): Promise { const response = await this.client.post<{ success: boolean; data: T }>(url, data, config); return response.data.data; } async put(url: string, data?: any, config?: AxiosRequestConfig): Promise { const response = await this.client.put<{ success: boolean; data: T }>(url, data, config); return response.data.data; } async patch(url: string, data?: any, config?: AxiosRequestConfig): Promise { const response = await this.client.patch<{ success: boolean; data: T }>(url, data, config); return response.data.data; } async delete(url: string, config?: AxiosRequestConfig): Promise { const response = await this.client.delete<{ success: boolean; data: T }>(url, config); return response.data.data; } } export const apiClient = new ApiClient();