import React, { useState, useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import api from '../../utils/api'; import Navbar from '../../components/Navbar'; import MemberFooter from '../../components/MemberFooter'; import { Card } from '../../components/ui/card'; import { Button } from '../../components/ui/button'; import { Dialog, DialogContent } from '../../components/ui/dialog'; import { Badge } from '../../components/ui/badge'; import { Image as ImageIcon, Calendar, MapPin, ArrowLeft, X, ChevronLeft, ChevronRight } from 'lucide-react'; import { useToast } from '../../hooks/use-toast'; import moment from 'moment'; const EventGallery = () => { const { eventId } = useParams(); const navigate = useNavigate(); const [events, setEvents] = useState([]); const [selectedEvent, setSelectedEvent] = useState(null); const [galleryImages, setGalleryImages] = useState([]); const [selectedImageIndex, setSelectedImageIndex] = useState(null); const [loading, setLoading] = useState(true); const [galleryLoading, setGalleryLoading] = useState(false); const { toast } = useToast(); useEffect(() => { fetchEventsWithGalleries(); }, []); useEffect(() => { if (eventId) { fetchEventGallery(eventId); } }, [eventId]); const fetchEventsWithGalleries = async () => { try { const response = await api.get('/members/gallery'); setEvents(response.data); // If there's an eventId in URL, find that event if (eventId) { const event = response.data.find(e => e.id === eventId); if (event) { setSelectedEvent(event); } } } catch (error) { console.error('Failed to fetch events:', error); toast({ title: "Error", description: "Failed to load event galleries. Please try again.", variant: "destructive" }); } finally { setLoading(false); } }; const fetchEventGallery = async (id) => { setGalleryLoading(true); try { const response = await api.get(`/events/${id}/gallery`); setGalleryImages(response.data); } catch (error) { console.error('Failed to fetch gallery:', error); toast({ title: "Error", description: "Failed to load gallery images. Please try again.", variant: "destructive" }); } finally { setGalleryLoading(false); } }; const handleEventClick = (event) => { setSelectedEvent(event); navigate(`/members/gallery/${event.id}`); fetchEventGallery(event.id); }; const handleBackToEvents = () => { setSelectedEvent(null); setGalleryImages([]); navigate('/members/gallery'); }; const openLightbox = (index) => { setSelectedImageIndex(index); }; const closeLightbox = () => { setSelectedImageIndex(null); }; const nextImage = () => { if (selectedImageIndex !== null) { setSelectedImageIndex((selectedImageIndex + 1) % galleryImages.length); } }; const previousImage = () => { if (selectedImageIndex !== null) { setSelectedImageIndex((selectedImageIndex - 1 + galleryImages.length) % galleryImages.length); } }; const EventCard = ({ event }) => ( handleEventClick(event)} > {/* Thumbnail */}
{event.thumbnail_url ? ( {event.title} ) : (
)}
{event.gallery_count} {event.gallery_count === 1 ? 'photo' : 'photos'}
{/* Event Info */}

{event.title}

{event.description && (

{event.description}

)}
{moment(event.start_at).format('MMMM D, YYYY')}
{event.location}
); // Event Gallery Grid View if (!selectedEvent) { return (
{/* Header */}

Event Gallery

Browse photos from past LOAF events.

{/* Events Grid */} {loading ? (

Loading galleries...

) : events.length > 0 ? (
{events.map((event) => ( ))}
) : (

No Event Galleries Yet

Event photos will appear here once admins upload them.

)}
); } // Individual Event Gallery View return (
{/* Back Button */} {/* Event Header */}

{selectedEvent.title}

{moment(selectedEvent.start_at).format('MMMM D, YYYY')}
{selectedEvent.location}
{selectedEvent.gallery_count} {selectedEvent.gallery_count === 1 ? 'photo' : 'photos'}
{/* Gallery Grid */} {galleryLoading ? (

Loading images...

) : galleryImages.length > 0 ? (
{galleryImages.map((image, index) => (
openLightbox(index)} > {image.caption
{image.caption && (

{image.caption}

)}
))}
) : (

No Photos Yet

Photos from this event will appear here once uploaded.

)}
{/* Lightbox Modal */} {selectedImageIndex !== null && galleryImages[selectedImageIndex] && (
{/* Close Button */} {/* Previous Button */} {galleryImages.length > 1 && ( )} {/* Image */}
{galleryImages[selectedImageIndex].caption {galleryImages[selectedImageIndex].caption && (

{galleryImages[selectedImageIndex].caption}

)}
{selectedImageIndex + 1} / {galleryImages.length}
{/* Next Button */} {galleryImages.length > 1 && ( )}
)}
); }; export default EventGallery;