import type { LoginRequest, RegisterRequest, AuthResponse, RegisterResponse } from '../types/auth'; import type { User } from '../types/user'; const API_URL = import.meta.env.VITE_API_URL || ''; class ApiClient { private async request(input: RequestInfo, init?: RequestInit): Promise { const token = localStorage.getItem('token'); const headers = new Headers(init?.headers); if (token) { headers.set('Authorization', `Bearer ${token}`); } const response = await fetch(`${API_URL}${input}`, { ...init, headers, }); // Handle 401 Unauthorized - clear token and redirect to login if (response.status === 401) { localStorage.removeItem('token'); window.location.href = '/login'; throw new Error('Unauthorized'); } if (!response.ok) { const errorData = await response.json().catch(() => ({})); // Handle both { error: "message" } and { message: "..." } formats const errorMessage = errorData.error || errorData.message || `Error ${response.status}`; throw new Error(errorMessage); } return response.json(); } async login(data: LoginRequest): Promise { return this.request('/api/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), }); } async register(data: RegisterRequest): Promise { return this.request('/api/auth/register', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), }); } async getUsers(): Promise { return this.request('/api/users', { method: 'GET', }); } } export const apiClient = new ApiClient();