// services/eventService.ts export interface Event { id: number; title: string; description: string; date: string; subtitle: string; mainImage: string; galleryImages: string[]; price?: number; location?: string; } export interface ApiEvent { id: number; title: string; description: string; date: string; subtitle?: string; imageUrl?: string; galleryImages?: string[]; price?: number; location?: string; // Add other fields that your Spring Boot API returns } class EventService { private apiBaseUrl = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8080'; async getAllEvents(): Promise { try { const response = await fetch(`${this.apiBaseUrl}/api/events`); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const apiEvents: ApiEvent[] = await response.json(); return this.transformApiEventsToEvents(apiEvents); } catch (error) { console.error('Error fetching events:', error); return this.getFallbackEvents(); // Return fallback data if API fails } } async getEventById(id: number): Promise { try { const response = await fetch(`${this.apiBaseUrl}/api/events/${id}`); if (!response.ok) { if (response.status === 404) { return null; } throw new Error(`HTTP error! status: ${response.status}`); } const apiEvent: ApiEvent = await response.json(); return this.transformApiEventToEvent(apiEvent); } catch (error) { console.error(`Error fetching event ${id}:`, error); return null; } } private transformApiEventsToEvents(apiEvents: ApiEvent[]): Event[] { return apiEvents.map(apiEvent => this.transformApiEventToEvent(apiEvent)); } private transformApiEventToEvent(apiEvent: ApiEvent): Event { return { id: apiEvent.id, title: apiEvent.title, description: apiEvent.description, date: this.formatDate(apiEvent.date), subtitle: apiEvent.subtitle || 'More details coming soon', mainImage: apiEvent.imageUrl || this.getDefaultMainImage(), galleryImages: apiEvent.galleryImages || this.getDefaultGalleryImages(), price: apiEvent.price, location: apiEvent.location }; } private formatDate(dateString: string): string { try { const date = new Date(dateString); return date.toLocaleDateString('en-GB', { day: 'numeric', month: 'long', year: 'numeric' }); } catch (error) { return dateString; // Return original if parsing fails } } private getDefaultMainImage(): string { const defaultImages = [ 'https://images.unsplash.com/photo-1559757148-5c350d0d3c56?w=400&h=200&fit=crop', 'https://images.unsplash.com/photo-1559757175-0eb30cd8c063?w=400&h=200&fit=crop', 'https://images.unsplash.com/photo-1573496359142-b8d87734a5a2?w=400&h=200&fit=crop', 'https://images.unsplash.com/photo-1576091160550-2173dba999ef?w=400&h=200&fit=crop' ]; return defaultImages[Math.floor(Math.random() * defaultImages.length)]; } private getDefaultGalleryImages(): string[] { return [ 'https://images.unsplash.com/photo-1551601651-2a8555f1a136?w=200&h=100&fit=crop', 'https://images.unsplash.com/photo-1582750433449-648ed127bb54?w=200&h=100&fit=crop', 'https://images.unsplash.com/photo-1638202993928-7267aad84c31?w=200&h=100&fit=crop', 'https://images.unsplash.com/photo-1576091160550-2173dba999ef?w=200&h=100&fit=crop' ]; } private getFallbackEvents(): Event[] { // Return the original hardcoded events as fallback return [ { id: 1, date: '28 September 2025', title: 'Advanced Cardiac Surgery Symposium', description: 'Cutting-edge techniques in minimally invasive cardiac procedures', subtitle: 'Learn from world-renowned cardiac surgeons about the latest innovations', mainImage: 'https://images.unsplash.com/photo-1559757148-5c350d0d3c56?w=400&h=200&fit=crop', galleryImages: [ 'https://images.unsplash.com/photo-1551601651-2a8555f1a136?w=200&h=100&fit=crop', 'https://images.unsplash.com/photo-1582750433449-648ed127bb54?w=200&h=100&fit=crop', 'https://images.unsplash.com/photo-1638202993928-7267aad84c31?w=200&h=100&fit=crop', 'https://images.unsplash.com/photo-1551601651-2a8555f1a136?w=200&h=100&fit=crop' ] }, { id: 2, date: '2 October 2025', title: 'Pediatric Immunization Update Conference', description: 'Latest developments in childhood vaccination protocols', subtitle: 'Comprehensive review of new vaccine guidelines and safety data', mainImage: 'https://images.unsplash.com/photo-1559757175-0eb30cd8c063?w=400&h=200&fit=crop', galleryImages: [ 'https://images.unsplash.com/photo-1584362917165-526a968579e8?w=200&h=100&fit=crop', 'https://images.unsplash.com/photo-1612349317150-e413f6a5b16d?w=200&h=100&fit=crop', 'https://images.unsplash.com/photo-1581056771107-24ca5f033842?w=200&h=100&fit=crop', 'https://images.unsplash.com/photo-1576091160550-2173dba999ef?w=200&h=100&fit=crop' ] }, { id: 3, date: '8 October 2025', title: 'Mental Health in Healthcare Workers', description: 'Addressing burnout and psychological well-being in medical practice', subtitle: 'Strategies for maintaining mental health in high-pressure environments', mainImage: 'https://images.unsplash.com/photo-1573496359142-b8d87734a5a2?w=400&h=200&fit=crop', galleryImages: [ 'https://images.unsplash.com/photo-1582719508461-905c673771fd?w=200&h=100&fit=crop', 'https://images.unsplash.com/photo-1559757148-5c350d0d3c56?w=200&h=100&fit=crop', 'https://images.unsplash.com/photo-1576091160550-2173dba999ef?w=200&h=100&fit=crop', 'https://images.unsplash.com/photo-1582750433449-648ed127bb54?w=200&h=100&fit=crop' ] } ]; } } export const eventService = new EventService();