import { API_BASE_URL } from '../config/api'; class ApiService { constructor() { this.baseURL = API_BASE_URL; this.isAvailable = true; } async request(endpoint, options = {}) { try { const response = await fetch(`${this.baseURL}${endpoint}`, { ...options, headers: { 'Content-Type': 'application/json', ...options.headers, }, }); this.isAvailable = true; if (!response.ok) { const error = await response.json(); throw new Error(error.message || 'Request failed'); } if (response.status === 204) { return null; } return await response.json(); } catch (error) { if (error.name === 'TypeError' || error.message.includes('fetch')) { this.isAvailable = false; } throw error; } } // Posts endpoints async getPosts() { return this.request('/api/posts'); } async createPost(data) { return this.request('/api/posts', { method: 'POST', body: JSON.stringify(data), }); } async getPostById(postId) { return this.request(`/api/posts/${postId}`); } async updatePost(postId, data) { return this.request(`/api/posts/${postId}`, { method: 'PATCH', body: JSON.stringify(data), }); } async deletePost(postId) { return this.request(`/api/posts/${postId}`, { method: 'DELETE', }); } // Comments endpoints async getCommentsByPostId(postId) { return this.request(`/api/posts/${postId}/comments`); } async createComment(postId, data) { return this.request(`/api/posts/${postId}/comments`, { method: 'POST', body: JSON.stringify(data), }); } async getCommentById(postId, commentId) { return this.request(`/api/posts/${postId}/comments/${commentId}`); } async updateComment(postId, commentId, data) { return this.request(`/api/posts/${postId}/comments/${commentId}`, { method: 'PATCH', body: JSON.stringify(data), }); } async deleteComment(postId, commentId) { return this.request(`/api/posts/${postId}/comments/${commentId}`, { method: 'DELETE', }); } // Likes endpoints async likePost(postId, data) { return this.request(`/api/posts/${postId}/likes`, { method: 'POST', body: JSON.stringify(data), }); } async unlikePost(postId, data) { return this.request(`/api/posts/${postId}/likes`, { method: 'DELETE', body: JSON.stringify(data), }); } getAvailability() { return this.isAvailable; } } export const apiService = new ApiService();