Prashikshak / App /src /services /EventService.js
Abhisingh-18's picture
Initial commit: Prashikshak - disaster management training platform
9a92a42
Raw
History Blame Contribute Delete
9.92 kB
import { API_BASE_URL, NEW_AUTH_BASE_URL } from './config';
import { authService } from './AuthService';
class EventService {
constructor() {
this.useBackend = true;
}
// Create a new event
async createEvent(eventData) {
try {
console.log('📅 EventService: Creating event...', eventData);
// Use NEW_AUTH_BASE_URL which already includes /api
// Endpoint in SIH_BACKEND-main is /events/create
const response = await authService.authenticatedFetch(`${NEW_AUTH_BASE_URL}/events/create`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(eventData),
});
const data = await response.json();
if (response.ok) {
console.log('✅ Event created successfully:', data.event._id);
return { success: true, event: data.event, message: data.message };
} else {
console.error('❌ Failed to create event:', data.message);
return { success: false, error: data.message || 'Failed to create event' };
}
} catch (error) {
console.error('❌ Event creation error:', error);
return { success: false, error: error.message };
}
}
// Get trainer's events
async getMyEvents(status = '') {
try {
// Using NEW_AUTH_BASE_URL for my-events too
let url = `${NEW_AUTH_BASE_URL}/events/my-events`;
if (status) url += `?status=${status}`;
const response = await authService.authenticatedFetch(url, {
method: 'GET',
});
const data = await response.json();
if (response.ok) {
return { success: true, events: data.events };
}
return { success: false, error: data.message };
} catch (error) {
return { success: false, error: error.message };
}
}
// Search events
async searchEvents(query) {
try {
// Using NEW_AUTH_BASE_URL for search
const response = await authService.authenticatedFetch(`${NEW_AUTH_BASE_URL}/events/search?${new URLSearchParams(query)}`, {
method: 'GET',
});
const data = await response.json();
return { success: true, ...data };
} catch (error) {
return { success: false, error: error.message };
}
}
// Get event dashboard stats
async getEventDashboard() {
try {
const response = await authService.authenticatedFetch(`${NEW_AUTH_BASE_URL}/events/dashboard`, {
method: 'GET',
});
const data = await response.json();
if (response.ok) {
return { success: true, dashboard: data };
}
return { success: false, error: data.message };
} catch (error) {
return { success: false, error: error.message };
}
}
// Join Event By Code
async joinEventByCode(code) {
try {
const response = await authService.authenticatedFetch(`${NEW_AUTH_BASE_URL}/events/join/code`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ code })
});
const data = await response.json();
if (response.ok) return { success: true, event: data.event, message: data.message, waitlisted: data.waitlisted };
return { success: false, error: data.message };
} catch (error) {
return { success: false, error: error.message };
}
}
// Toggle Attendance (Trainer)
async toggleAttendance(eventId, enabled) {
try {
const response = await authService.authenticatedFetch(`${NEW_AUTH_BASE_URL}/events/${eventId}/attendance-status`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ enabled })
});
const data = await response.json();
if (response.ok) return { success: true, attendanceEnabled: data.attendanceEnabled };
return { success: false, error: data.message };
} catch (error) {
return { success: false, error: error.message };
}
}
// Mark Attendance (Trainee)
async markAttendance(eventId, metadata = {}) {
try {
const response = await authService.authenticatedFetch(`${NEW_AUTH_BASE_URL}/events/${eventId}/attendance`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(metadata)
});
const data = await response.json();
if (response.ok) return { success: true, message: data.message };
return { success: false, error: data.message };
} catch (error) {
return { success: false, error: error.message };
}
}
// Get Attendees (Trainer)
async getEventAttendees(eventId) {
try {
const response = await authService.authenticatedFetch(`${NEW_AUTH_BASE_URL}/events/${eventId}/attendees`, {
method: 'GET'
});
const data = await response.json();
if (response.ok) return { success: true, attendees: data.attendees, attendanceEnabled: data.attendanceEnabled };
return { success: false, error: data.message };
} catch (error) {
return { success: false, error: error.message };
}
}
// Get Event Days (Schedule)
async getEventDays(eventId) {
try {
const response = await authService.authenticatedFetch(`${NEW_AUTH_BASE_URL}/event-days/event/${eventId}`, {
method: 'GET'
});
const data = await response.json();
if (response.ok) return { success: true, eventDays: data.eventDays, stats: data.stats };
return { success: false, error: data.message };
} catch (error) {
return { success: false, error: error.message };
}
}
// Upload Photos for Event Day
async uploadEventDayPhotos(eventDayId, photoUri) {
try {
console.log('📸 Uploading photo for day:', eventDayId);
// Prepare file name and type
let filename = photoUri.split('/').pop();
let match = /\.(\w+)$/.exec(filename);
let type = match ? `image/${match[1]}` : `image/jpeg`;
if (type === 'image/jpg') type = 'image/jpeg';
const formData = new FormData();
formData.append('photos', {
uri: photoUri,
name: filename || `day_${eventDayId}_${Date.now()}.jpg`,
type: type
});
// Get token
const token = await authService.getAccessToken();
if (!token) return { success: false, error: 'Authentication token missing' };
// Direct fetch for multipart/form-data
const response = await fetch(`${NEW_AUTH_BASE_URL}/event-days/${eventDayId}/photos`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Accept': 'application/json',
// Explicitly letting browser/engine handle Content-Type boundary
},
body: formData
});
const text = await response.text();
let data;
try {
data = JSON.parse(text);
} catch (e) {
console.error('❌ Upload response parsing failed:', text.substring(0, 100));
return { success: false, error: `Server Error: ${response.status} ${text.substring(0, 50)}` };
}
if (response.ok) {
console.log('✅ Photo upload success');
return { success: true, eventDay: data.eventDay || data }; // handle varying response structure
}
console.error('❌ Upload failed:', data.message);
return { success: false, error: data.message || 'Upload failed' };
} catch (error) {
console.error('❌ Upload exception:', error);
return { success: false, error: error.message };
}
}
// Bulk Mark Attendance (from Local Sync)
async bulkMarkAttendance(eventDayId, userIds) {
try {
const response = await authService.authenticatedFetch(`${NEW_AUTH_BASE_URL}/event-days/${eventDayId}/attendance/bulk`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ userIds, checkInMethod: 'hotspot' })
});
const data = await response.json();
if (response.ok) return { success: true, count: data.count, message: data.message };
return { success: false, error: data.message };
} catch (error) {
return { success: false, error: error.message };
}
}
// Complete Event Day (End Day)
async completeEventDay(eventDayId) {
try {
const response = await authService.authenticatedFetch(`${NEW_AUTH_BASE_URL}/event-days/${eventDayId}/end`, {
method: 'POST',
});
const data = await response.json();
if (response.ok) return { success: true, eventDay: data.eventDay };
return { success: false, error: data.message };
} catch (error) {
return { success: false, error: error.message };
}
}
}
export const eventService = new EventService();
export default eventService;