import { useAuthStore } from '../stores/authStore'; const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; class ApiClient { private baseUrl: string; constructor(baseUrl: string) { this.baseUrl = baseUrl; } private getAuthHeader(): Record { const tokens = useAuthStore.getState().tokens; return tokens?.accessToken ? { Authorization: `Bearer ${tokens.accessToken}` } : {}; } async request(endpoint: string, config: { method?: string; body?: any } = {}): Promise { const { method = 'GET', body } = config; const response = await fetch(`${this.baseUrl}${endpoint}`, { method, headers: { 'Content-Type': 'application/json', ...this.getAuthHeader() }, body: body ? JSON.stringify(body) : undefined, }); const data = await response.json(); if (!response.ok) throw new Error(data.error?.message || 'Request failed'); return data.data as T; } get(e: string) { return this.request(e); } post(e: string, b?: any) { return this.request(e, { method: 'POST', body: b }); } patch(e: string, b?: any) { return this.request(e, { method: 'PATCH', body: b }); } delete(e: string) { return this.request(e, { method: 'DELETE' }); } } export const api = new ApiClient(API_URL); export const authApi = { register: (data: any) => api.post('/api/auth/register', data), login: (data: any) => api.post('/api/auth/login', data), me: () => api.get('/api/auth/me'), }; export const roomsApi = { list: () => api.get('/api/rooms'), create: (data: any) => api.post('/api/rooms', data), get: (id: string) => api.get(`/api/rooms/${id}`), join: (inviteCode: string) => api.post('/api/rooms/join', { inviteCode }), }; export const aiApi = { action: (data: any) => api.post('/api/ai/action', data), }; export const snippetsApi = { list: () => api.get('/api/snippets'), create: (data: any) => api.post('/api/snippets', data), delete: (id: string) => api.delete(`/api/snippets/${id}`), };