import { API_URL } from '../constants'; // Get auth token from localStorage (persistent across sessions) const getAuthToken = (): string | null => { return localStorage.getItem('auditly_auth_token'); }; // Make authenticated API call export const makeAuthenticatedRequest = async ( endpoint: string, options: RequestInit = {}, orgId?: string ): Promise => { const token = getAuthToken(); if (!token) { throw new Error('No authentication token found. Please log in again.'); } const headers = new Headers(options.headers); headers.set('Authorization', `Bearer ${token}`); headers.set('Content-Type', 'application/json'); // Add orgId to request body if provided and it's a POST/PUT request let body = options.body; if (orgId && (options.method === 'POST' || options.method === 'PUT')) { if (typeof body === 'string') { try { const parsedBody = JSON.parse(body); parsedBody.orgId = orgId; body = JSON.stringify(parsedBody); } catch (e) { // If body isn't JSON, create a new object body = JSON.stringify({ orgId, data: body }); } } else if (body instanceof FormData) { body.append('orgId', orgId); } else if (body && typeof body === 'object') { body = JSON.stringify({ orgId, ...body }); } else { body = JSON.stringify({ orgId }); } } const url = endpoint.startsWith('http') ? endpoint : `${API_URL}${endpoint}`; // Add timeout to prevent hanging forever const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), 30000); // 30 second timeout try { const response = await fetch(url, { ...options, headers, body, signal: controller.signal, }); clearTimeout(timeoutId); return response; } catch (error) { clearTimeout(timeoutId); if (error.name === 'AbortError') { throw new Error('Request timeout: The server took too long to respond'); } throw error; } }; // Convenience methods for different HTTP verbs export const apiGet = (endpoint: string, orgId?: string) => makeAuthenticatedRequest(endpoint, { method: 'GET' }, orgId); export const apiPost = (endpoint: string, data: any = {}, orgId?: string) => { console.log('apiPost called with:', { endpoint, data, orgId, hasToken: !!getAuthToken() }); return makeAuthenticatedRequest(endpoint, { method: 'POST', body: JSON.stringify(data) }, orgId); }; export const apiPut = (endpoint: string, data: any = {}, orgId?: string) => makeAuthenticatedRequest(endpoint, { method: 'PUT', body: JSON.stringify(data) }, orgId); export const apiDelete = (endpoint: string, orgId?: string) => makeAuthenticatedRequest(endpoint, { method: 'DELETE' }, orgId);