diff --git a/src/services/api.ts b/src/services/api.ts
index d3ffa63..179dc28 100644
--- a/src/services/api.ts
+++ b/src/services/api.ts
@@ -46,11 +46,24 @@ export class ApiClient {
});
if (!response.ok) {
- const error: ApiError = await response.json();
+ let error: ApiError;
+ try {
+ error = await response.json();
+ } catch {
+ // If response is not JSON, create a generic error
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
+ }
throw new Error(error.message || 'An error occurred');
}
- return response.json();
+ // Handle empty responses (like DELETE)
+ const contentType = response.headers.get('content-type');
+ if (contentType && contentType.includes('application/json')) {
+ return response.json();
+ }
+
+ // For non-JSON responses, return empty object
+ return {} as T;
}
async get(endpoint: string, options?: RequestInit): Promise {
diff --git a/src/services/eventService.ts b/src/services/eventService.ts
index 2c048c7..437a596 100644
--- a/src/services/eventService.ts
+++ b/src/services/eventService.ts
@@ -101,7 +101,43 @@ export const eventService = {
},
// Complete event
- async completeEvent(eventId: string, data: { litterCollected: number; photos?: string[] }): Promise {
- return apiClient.post(`/events/${eventId}/complete`, data);
+ async completeEvent(
+ eventId: string,
+ data: {
+ litterCollected: number;
+ photos?: string[];
+ attendees?: Array<{
+ userId: string;
+ attended: boolean;
+ litterCollected?: number;
+ contributionNote?: string;
+ }>;
+ }
+ ): Promise {
+ try {
+ // If attendees data is provided, update them first
+ if (data.attendees && data.attendees.length > 0) {
+ console.log('Updating attendees:', data.attendees);
+ await apiClient.post(`/events/${eventId}/attendees/bulk`, {
+ attendees: data.attendees,
+ });
+ console.log('Attendees updated successfully');
+ }
+
+ // Then complete the event
+ console.log('Completing event with data:', {
+ litterCollected: data.litterCollected,
+ photos: data.photos,
+ });
+ const result = await apiClient.post(`/events/${eventId}/complete`, {
+ litterCollected: data.litterCollected,
+ photos: data.photos,
+ });
+ console.log('Event completed successfully:', result);
+ return result;
+ } catch (error) {
+ console.error('Error in completeEvent:', error);
+ throw error;
+ }
},
};
diff --git a/src/services/userService.ts b/src/services/userService.ts
index 8ef1ea2..3cb511f 100644
--- a/src/services/userService.ts
+++ b/src/services/userService.ts
@@ -5,6 +5,7 @@ import type { User, Report, CleanupEvent } from '@/types';
export interface UserProfile extends User {
reportCount: number;
eventCount: number;
+ totalLitterCollected: number;
notificationEmail: boolean;
notificationInApp: boolean;
areasOfInterest: Array<{
diff --git a/src/types/index.ts b/src/types/index.ts
index 72d732e..63539d1 100644
--- a/src/types/index.ts
+++ b/src/types/index.ts
@@ -66,6 +66,23 @@ export interface CleanupEvent {
updatedAt: Date;
}
+export interface EventAttendee {
+ id: string;
+ userId: string;
+ eventId: string;
+ registeredAt: Date;
+ attended: boolean;
+ litterCollected?: number;
+ contributionNote?: string;
+ user: {
+ id: string;
+ username: string;
+ firstName?: string;
+ lastName?: string;
+ avatarUrl?: string;
+ };
+}
+
export interface EnvironmentalConcern {
id: string;
reportId: string;