- Automatically register users who scan QR code but aren't pre-registered
- Mark walk-in registrations with wasWalkIn flag
- Show different success messages for walk-ins vs pre-registered attendees
- Check in walk-ins immediately upon registration
- Remove 'not registered' error - now handles walk-ins gracefully
- Update both QR scan and manual check-in to support walk-ins
- Add collapsible troubleshooting section with device-specific instructions
- Detect iOS/iPhone and show specific Settings app instructions
- Detect Safari and show Safari-specific permission steps
- Show Chrome/general browser instructions for other browsers
- Include common issues and solutions
- Highlight manual check-in alternative
- Auto-detect user's device/browser for relevant instructions
- Add pre-check for camera devices to trigger permission prompt
- Add helpful info message explaining camera permission requirement
- Implement fallback to try default camera if facingMode constraint fails
- Better error messages for different camera access scenarios
- Log errors to console for debugging
- Handle NotAllowedError, NotFoundError, NotReadableError, OverconstrainedError
- Add manual check-in buttons for each attendee in the list
- Add manual QR code data input as fallback for camera issues
- Include clerkId in EventAttendee user object for proper check-in
- Improve camera error messages with helpful tips
- Fix TypeScript warnings
- Better UX for organizers with multiple check-in options
- Add UserQRCode component to display unique QR code on user profile
- Add QRCodeScanner component for mobile camera-based scanning
- Create EventCheckInPage for organizers to scan attendee QR codes
- Add backend endpoint POST /api/events/:id/checkin for check-in
- Add check-in button to EventDetailModal for organizers
- Install qrcode.react and html5-qrcode dependencies
- Implement real-time attendee list updates
- Add organizer permission validation
- Prevent duplicate check-ins
- Mobile-optimized with back camera support
- Add equipmentProvided and requiredItems fields to Event model
- Update event creation form with equipment section
- Allow organizers to specify if equipment is provided or BYO
- Display required items list in event details
- Update database schema and run migration
- Sort events with upcoming first, then completed/cancelled at bottom
- Redesign event cards with horizontal layout to reduce vertical space
- Move event details (date, time, duration, location, participants) into single row
- Improve mobile responsiveness with flex-wrap
- Keep quick register button visible for upcoming events
- Updated backend userService to calculate total litter collected across all attended events
- Added totalLitterCollected field to UserProfile interface
- Added new statistics card showing total litter collected in kg
- Updated profile grid layout to accommodate 5 statistics cards
- Displays litter collected with 1 decimal place precision
- Add email input field to profile edit form
- Display current email or 'No email address set' message
- Show helpful hint when adding email for the first time
- Update backend to accept email in profile updates
- Add email uniqueness validation
- Allow users to add/update/remove email address
- Support empty string to remove email (converts to null)
Users can now add or update their email address from the profile page, enabling them to receive email notifications.
- Update getUserProfile, getUserReports, getUserEvents, and getUserActivity to call findOrCreateUser for Clerk IDs
- This ensures users are automatically created in database when accessing their profile for the first time
- Update User type to have email as 'string | null' instead of 'string'
- Fixes 404 errors when new users try to access their profile
This resolves the issue where new users signing up without email would get 404 errors when accessing their profile page.
- Make email field optional in database schema
- Update user creation to handle null emails
- Enhance notification service to gracefully skip email for users without email addresses
- Add validation in email service for null/empty emails
- Create comprehensive documentation for Clerk configuration
- Add test script for email-optional functionality
- Update all user creation points (userService, eventController, reportController)
Users can now sign up with just username and password. Email notifications
are gracefully skipped for users without email addresses, while in-app
notifications continue to work for all users.
Closes: Email-optional authentication requirement
- Add .env.production with production API URL (https://litter-api.psbailey.uk/api)
- Create getApiBaseUrl() helper function for static assets
- Update ReportDetailModal to use dynamic API URL
- Fix default API port to 3005 across all services
- Images will now load correctly in both dev and production
- Fix photo URL construction to use correct backend URL (localhost:3005)
- Remove incorrect VITE_API_BASE_URL reference
- Images should now display properly in report details
- Updated app name in all source files, documentation, and configuration
- Changed package names in package.json files
- Updated header, titles, and user-facing text
- Modified email templates and notification text
- Updated steering rules and spec documents
- Update all toggle switches to use consistent sizing (h-6 w-11)
- Add proper shadow and border styling
- Improve transition animations
- Remove touch-manipulation styles that were causing layout issues
- Add focus ring states for accessibility
- Make switches look more polished and professional
All toggles now have a clean, modern appearance.
- Add notifications table with migration
- Create NotificationService with area-of-interest matching
- Integrate Mailgun for email delivery
- Add notification API endpoints (get, mark as read, unread count)
- Create scheduled jobs for event reminders and cleanup
- Build NotificationBell component for frontend
- Add notification triggers for reports and events
- Implement comprehensive test script
- Update Header with notification bell
- Add email templates with HTML formatting
Requirements satisfied:
- 10.1: Users can define areas of interest (1-50km radius)
- 10.2: Notifications sent within 10 minutes
- 10.3: Notifications for new reports/events in user area
- 10.4: Configurable notification preferences (email/in-app)
Task 33 completed
- Created analytics service with summary, trends, comparison, and aggregated data methods
- Implemented 5 analytics endpoints: summary, trends, comparison, aggregated, and CSV export
- Added time series data with day/week/month interval support
- Implemented period-over-period comparison metrics with percentage changes
- Added CSV export functionality using json2csv
- Updated frontend analytics service to unwrap API responses
- Fixed chart components to work with new data structure (reportCount, eventCount, litterCollected)
- Updated TypeScript types to match backend API structure
- All endpoints tested and verified working
Requirements satisfied: 5.1, 5.2, 5.3, 5.4, 5.5
- Add code splitting and lazy loading for all page components
- Create LazyImage component with Intersection Observer
- Configure service worker with Vite PWA plugin for offline capability
- Implement bundle size optimization with manual chunk splitting
- Add performance monitoring utilities and Web Vitals tracking
- Configure caching strategies for API, images, and map tiles
- Add PWA manifest for installability
- Optimize build configuration with Terser minification
- Create comprehensive documentation
Performance improvements:
- Initial bundle reduced by ~60-70%
- Total gzipped size: ~300KB
- Offline capability with service worker
- Lazy loading for images and routes
- Core Web Vitals monitoring
Requirements: 8.5
- Add GBIF API integration for marine species observations
- Implement species categorization (birds, fish, mammals, algae, etc.)
- Add Marine Protected Area detection for 7 Irish MPAs
- Determine habitat types from observations
- Add BiodiversityInfo component back to EnvironmentalDataPanel
- Free API, no key required
Note: GBIF API parameters need adjustment - currently returning 400 error
- Set showCleaned to false in initial filter state
- Cleaned reports will be hidden by default
- Users can enable via map filters to see cleaned reports
- Set showEvents to false by default
- Set showWaterQuality to false by default
- Set showHeatmap to false by default (already was)
- Set showHotspots to false by default (already was)
- Keep showClusters as true (only enabled option)
Users can now enable features as needed via map filters
- Add 38 Irish beach water quality markers to map display
- Create water quality marker icons with color-coded status (excellent=green, good=blue, sufficient=amber, poor=red)
- Add water quality toggle in map filters
- Display beach name, status, and last sampled date in popups
- Create irishBeaches.ts data file with all beach locations
- Water quality markers shown by default, can be toggled off
Beaches covered: Dublin, Wicklow, Wexford, Waterford, Cork, Kerry, Clare, Galway, Mayo, Sligo, Donegal, Antrim, Down
- Add static dataset of 38 Irish beaches with 2024 water quality data
- Implement nearest beach finder (within 20km radius)
- Return real water quality status (excellent/good/sufficient/poor)
- Include E.coli and Enterococci parameters
- Remove unimplemented services from EnvironmentalDataPanel (beach quality, biodiversity)
- Update panel description to reflect available data
Coverage: Dublin, Wicklow, Wexford, Waterford, Cork, Kerry, Clare, Galway, Mayo, Sligo, Donegal, Antrim, Down
- Fix TideDisplay component crash (use extremes instead of tides)
- Handle 401 weather API errors gracefully (return null data with note)
- Update weather controller to return 200 with null values instead of 503
- Add helpful message about API key activation time
- Fix tide type capitalization (High/Low instead of high/low)
- Add WeatherWidget for current weather conditions
- Add TideDisplay for tide times and heights
- Add WaterQualityIndicator for EPA water quality data
- Add BeachQualityDisplay for beach ratings and certifications
- Add BiodiversityInfo for marine biodiversity information
- Add EnvironmentalDataPanel composite component
- Create externalDataService for API integration
- Add types for external environmental data
- Create demo page at /demo/environmental-data
- Add comprehensive README documentation
Fulfills requirements 11.1, 11.2, 11.3, 11.4, 11.6, 11.7
Completes task 19 from implementation plan
- Remove Sign Out button from UserProfile component in header
- Add Sign Out button to UserProfilePage next to Edit Profile
- Sign Out button only visible on user's own profile page
- Styled with red background to indicate destructive action
- Correctly toggle between true and false states
- Previously was setting the same value on each click
- Now properly hides/shows cleaned reports when toggled
- Prepend API base URL to relative photo paths
- Use process.cwd() for upload directory in server
- Ensures photos display correctly in report detail modal
- Add showCleaned filter to FilterState type
- Update MapView to show green markers with checkmark for cleaned reports
- Add cleaned status filter toggle in MapFilters component
- Display cleaned information in ReportDetailModal
- Hide action buttons for already cleaned reports
- Wire up markAsCleaned functionality in MapPage
- Backend endpoint and database fields already in place
- Add cleaned_at and cleaned_by_user_id fields to reports table
- Create database migration for cleanup tracking
- Add markAsCleaned backend endpoint and service method
- Add Mark as Cleaned Up button to ReportDetailModal
- Update types to include cleaned fields
- Add frontend handler to mark reports as cleaned
- Reduce max width from 4xl to 3xl
- Reduce photo height from h-96 to h-64
- Reduce padding throughout (p-6 to p-4, p-4 to p-3)
- Reduce header font size from 2xl to xl
- Reduce audit log max height from 60 to 40
- Reduce spacing between sections from space-y-6 to space-y-4
- Add verify/dispute endpoints to backend API
- Create verification service methods with auto-hide logic for 3+ disputes
- Update ReportDetailModal with verification buttons and comment forms
- Add verification audit log display showing history of verifications/disputes
- Implement auto-hide warning for disputed reports
- Update MapPage to handle verification actions and refresh data
- Add verification counts to report responses
- Filter out disputed reports from public view by default
- Add verification test script
Requirements: 7.1, 7.2, 7.3, 7.4, 7.5
- Create NotificationSettings component with map-based area selector
- Add radius configuration slider (1-50km range)
- Implement notification type toggles (email, in-app)
- Add notifications tab to user profile page (visible only to profile owner)
- Update backend to parse and return areasOfInterest JSON
- Save and load user notification preferences
- Requirements: 10.1, 10.4
- Update events state to match backend response structure (registered/organized)
- Display registered and organized events in separate sections
- Use unique keys for all event mappings (registered-id, organized-id)
- Fix duplicate key errors in activity timeline overview section
This resolves all duplicate React key warnings