const API_BASE_URL = "http://localhost:8080/api"; export interface ApiError { message: string; } const getAuthToken = (): string | null => localStorage.getItem("token"); const getHeaders = (includeContentType = false): HeadersInit => { const token = getAuthToken(); const headers: HeadersInit = {}; if (token) { headers.Authorization = `Bearer ${token}`; } if (includeContentType) { headers["Content-Type"] = "application/json"; } return headers; }; const handleResponse = async (response: Response): Promise => { if (!response.ok) { const error: ApiError = await response.json().catch(() => ({ message: "An error occurred", })); throw new Error(error.message); } if (response.status === 204) { return null as T; } return response.json(); }; export const apiClient = { get: async (endpoint: string): Promise => { const response = await fetch(`${API_BASE_URL}${endpoint}`, { headers: getHeaders(), }); return handleResponse(response); }, post: async (endpoint: string, data?: unknown): Promise => { const response = await fetch(`${API_BASE_URL}${endpoint}`, { method: "POST", headers: getHeaders(!!data), body: data ? JSON.stringify(data) : undefined, }); return handleResponse(response); }, put: async (endpoint: string, data?: unknown): Promise => { const response = await fetch(`${API_BASE_URL}${endpoint}`, { method: "PUT", headers: getHeaders(!!data), body: data ? JSON.stringify(data) : undefined, }); return handleResponse(response); }, delete: async (endpoint: string): Promise => { const response = await fetch(`${API_BASE_URL}${endpoint}`, { method: "DELETE", headers: getHeaders(), }); return handleResponse(response); }, };