import { ApiResponse } from './types'; const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8000/api'; class ApiClient { private getToken(): string | null { if (typeof window === 'undefined') return null; return localStorage.getItem('auth_token'); } private async request( endpoint: string, options: RequestInit = {} ): Promise> { const token = this.getToken(); const headers: Record = { 'Content-Type': 'application/json', ...(options.headers as Record), }; if (token) { headers['Authorization'] = `Bearer ${token}`; } try { const response = await fetch(`${API_BASE_URL}${endpoint}`, { ...options, headers, }); const data = await response.json(); if (!response.ok) { if (response.status === 401) { // Unauthorized - clear token and redirect to login if (typeof window !== 'undefined') { localStorage.removeItem('auth_token'); window.location.href = '/login'; } } throw new Error(data.message || 'API request failed'); } return data; } catch (error) { console.error('API Error:', error); throw error; } } async get(endpoint: string): Promise> { return this.request(endpoint, { method: 'GET' }); } async post(endpoint: string, body?: any): Promise> { return this.request(endpoint, { method: 'POST', body: body ? JSON.stringify(body) : undefined, }); } async put(endpoint: string, body?: any): Promise> { return this.request(endpoint, { method: 'PUT', body: body ? JSON.stringify(body) : undefined, }); } async delete(endpoint: string): Promise> { return this.request(endpoint, { method: 'DELETE' }); } // File upload with multipart/form-data async upload(endpoint: string, formData: FormData): Promise> { const token = this.getToken(); const headers: Record = {}; if (token) { headers['Authorization'] = `Bearer ${token}`; } try { const response = await fetch(`${API_BASE_URL}${endpoint}`, { method: 'POST', headers, body: formData, }); const data = await response.json(); if (!response.ok) { if (response.status === 401) { if (typeof window !== 'undefined') { localStorage.removeItem('auth_token'); window.location.href = '/login'; } } throw new Error(data.message || 'Upload failed'); } return data; } catch (error) { console.error('Upload Error:', error); throw error; } } } export const apiClient = new ApiClient();