import { useState, useEffect } from 'react'; import { useUser } from '@clerk/clerk-react'; import { EventForm, EventList, EventFilters, EventDetailModal } from '@/components/event'; import type { EventFilterState } from '@/components/event'; import { eventService } from '@/services/eventService'; import type { CleanupEvent } from '@/types'; export function EventsPage() { const { isSignedIn, user } = useUser(); const [events, setEvents] = useState([]); const [filteredEvents, setFilteredEvents] = useState([]); const [filters, setFilters] = useState({ status: 'all', }); const [showCreateForm, setShowCreateForm] = useState(false); const [selectedEvent, setSelectedEvent] = useState(null); const [isRegistered, setIsRegistered] = useState(false); const [isOrganizer, setIsOrganizer] = useState(false); const [isLoading, setIsLoading] = useState(true); const [isSubmitting, setIsSubmitting] = useState(false); const [error, setError] = useState(null); // Load events useEffect(() => { loadEvents(); }, []); // Apply filters useEffect(() => { applyFilters(); }, [events, filters]); // Check registration status and organizer status when event is selected useEffect(() => { if (selectedEvent && isSignedIn) { checkRegistrationStatus(selectedEvent.id); // Check if current user is the organizer by comparing Clerk IDs setIsOrganizer(user?.id === selectedEvent.organizerClerkId); } else { setIsOrganizer(false); } }, [selectedEvent, isSignedIn, user]); const loadEvents = async () => { try { setIsLoading(true); setError(null); const data = await eventService.getEvents(); setEvents(data); } catch (err) { setError('Failed to load events. Please try again.'); console.error('Error loading events:', err); } finally { setIsLoading(false); } }; const applyFilters = () => { let filtered = [...events]; // Filter by status if (filters.status !== 'all') { filtered = filtered.filter(event => event.status === filters.status); } // Filter by date range if (filters.startDate) { const startDate = new Date(filters.startDate); filtered = filtered.filter(event => new Date(event.scheduledDate) >= startDate); } if (filters.endDate) { const endDate = new Date(filters.endDate); endDate.setHours(23, 59, 59, 999); filtered = filtered.filter(event => new Date(event.scheduledDate) <= endDate); } // Sort by date (upcoming first, then by date) filtered.sort((a, b) => { const dateA = new Date(a.scheduledDate).getTime(); const dateB = new Date(b.scheduledDate).getTime(); return dateA - dateB; }); setFilteredEvents(filtered); }; const checkRegistrationStatus = async (eventId: string) => { try { const registered = await eventService.isUserRegistered(eventId); setIsRegistered(registered); } catch (err) { console.error('Error checking registration status:', err); setIsRegistered(false); } }; const handleCreateEvent = async (formData: any) => { if (!isSignedIn) { setError('You must be signed in to create an event'); return; } try { setIsSubmitting(true); setError(null); // Combine date and time const scheduledDateTime = new Date(`${formData.scheduledDate}T${formData.scheduledTime}`); const eventData = { title: formData.title, description: formData.description, latitude: formData.latitude, longitude: formData.longitude, locationName: formData.locationName, scheduledDate: scheduledDateTime, duration: formData.duration, }; await eventService.createEvent(eventData); setShowCreateForm(false); await loadEvents(); } catch (err: any) { setError(err.message || 'Failed to create event. Please try again.'); console.error('Error creating event:', err); } finally { setIsSubmitting(false); } }; const handleRegister = async (eventId: string) => { if (!isSignedIn) { setError('You must be signed in to register for events'); return; } try { setIsSubmitting(true); setError(null); await eventService.registerForEvent(eventId); setIsRegistered(true); await loadEvents(); } catch (err: any) { setError(err.message || 'Failed to register for event. Please try again.'); console.error('Error registering for event:', err); } finally { setIsSubmitting(false); } }; const handleUnregister = async () => { if (!selectedEvent) return; try { setIsSubmitting(true); setError(null); await eventService.unregisterFromEvent(selectedEvent.id); setIsRegistered(false); await loadEvents(); } catch (err: any) { setError(err.message || 'Failed to unregister from event. Please try again.'); console.error('Error unregistering from event:', err); } finally { setIsSubmitting(false); } }; const handleCompleteEvent = async (data: { litterCollected: number; photos: string[] }) => { if (!selectedEvent) return; try { setIsSubmitting(true); setError(null); await eventService.completeEvent(selectedEvent.id, data); setSelectedEvent(null); await loadEvents(); } catch (err: any) { setError(err.message || 'Failed to complete event. Please try again.'); console.error('Error completing event:', err); } finally { setIsSubmitting(false); } }; const handleCancelEvent = async () => { if (!selectedEvent) return; if (!confirm('Are you sure you want to cancel this event? This action cannot be undone.')) { return; } try { setIsSubmitting(true); setError(null); await eventService.updateEvent(selectedEvent.id, { status: 'cancelled' }); setSelectedEvent(null); await loadEvents(); } catch (err: any) { setError(err.message || 'Failed to cancel event. Please try again.'); console.error('Error cancelling event:', err); } finally { setIsSubmitting(false); } }; return (
{/* Header */}

Clean-up Events

Join community cleanup events or organize your own

{isSignedIn && !showCreateForm && ( )}
{/* Error Message */} {error && (

{error}

)} {/* Create Event Form */} {showCreateForm && (

Create New Event

setShowCreateForm(false)} isSubmitting={isSubmitting} />
)} {/* Filters */} {!showCreateForm && ( )} {/* Event List */} {!showCreateForm && ( )} {/* Event Detail Modal */} {selectedEvent && ( setSelectedEvent(null)} onRegister={() => handleRegister(selectedEvent.id)} onUnregister={handleUnregister} onComplete={handleCompleteEvent} onCancel={isOrganizer ? handleCancelEvent : undefined} isLoading={isSubmitting} /> )}
); }