'use client'; import React, { Suspense, useEffect, useState } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import Header from '../../components/custom/header'; import Footer from '../../components/custom/footer'; import { ethers } from 'ethers'; import { getContract } from '@/lib/ethers'; export const dynamic = 'force-dynamic'; interface Event { eventId: number; name: string; description: string; location: string; capacity: number; ticketsSold: number; ticketPrice: number; eventStartDate: number; eventEndDate: number; images: string[]; eventHost: string; } const EventsPage: React.FC = () => { const router = useRouter(); const searchParams = useSearchParams(); const initialQuery = searchParams?.get('q') || ''; const sortRef = React.useRef(null); const filterRef = React.useRef(null); const [events, setEvents] = useState([]); const [filteredEvents, setFilteredEvents] = useState([]); const [searchQuery, setSearchQuery] = useState(initialQuery); const [hoveredEventId, setHoveredEventId] = useState(null); const [sortOption, setSortOption] = useState(''); const [filterOptions, setFilterOptions] = useState([]); const [selectedHost, setSelectedHost] = useState(''); const [showSortMenu, setShowSortMenu] = useState(false); const [showFilterMenu, setShowFilterMenu] = useState(false); useEffect(() => { const fetchEvents = async () => { try { const provider = new ethers.providers.Web3Provider(window.ethereum!); const contract = getContract().connect(provider); const eventCount = await contract.eventCounter(); const eventsData: Event[] = []; for (let i = 0; i < eventCount; i++) { const event = await contract.events(i); const images = await contract.getEventImages(i); eventsData.push({ eventId: i, name: event.name, description: event.description, location: event.location, capacity: event.capacity.toNumber(), ticketsSold: event.ticketsSold.toNumber(), ticketPrice: parseFloat( ethers.utils.formatEther(event.ticketPrice) ), eventStartDate: event.eventStartDate.toNumber(), eventEndDate: event.eventEndDate.toNumber(), images: images, eventHost: event.eventHost, }); } setEvents(eventsData); setFilteredEvents(eventsData); if (initialQuery) { setFilteredEvents( eventsData.filter((event) => ['name', 'description', 'location', 'eventHost'].some((key) => event[key as keyof Event] .toString() .toLowerCase() .includes(initialQuery.toLowerCase()) ) ) ); } } catch (error) { console.error('Failed to fetch events:', error); } }; fetchEvents(); }, [initialQuery]); useEffect(() => { let filtered = events.filter((event) => ['name', 'description', 'location', 'eventHost'].some((key) => event[key as keyof Event] .toString() .toLowerCase() .includes(searchQuery.toLowerCase()) ) ); if (filterOptions.includes('limited')) { filtered = filtered.filter( (event) => event.ticketsSold / event.capacity >= 0.9 ); } if (filterOptions.includes('future')) { const now = Math.floor(Date.now() / 1000); filtered = filtered.filter((event) => event.eventStartDate > now); } if (filterOptions.includes('past')) { const now = Math.floor(Date.now() / 1000); filtered = filtered.filter((event) => event.eventEndDate < now); } if (selectedHost) { filtered = filtered.filter((event) => event.eventHost === selectedHost); } if (sortOption === 'price-asc') { filtered = filtered.sort((a, b) => a.ticketPrice - b.ticketPrice); } else if (sortOption === 'price-desc') { filtered = filtered.sort((a, b) => b.ticketPrice - a.ticketPrice); } else if (sortOption === 'date-asc') { filtered = filtered.sort((a, b) => a.eventStartDate - b.eventStartDate); } else if (sortOption === 'date-desc') { filtered = filtered.sort((a, b) => b.eventStartDate - a.eventStartDate); } setFilteredEvents(filtered); }, [searchQuery, sortOption, filterOptions, selectedHost, events]); const handleClickOutside = (event: MouseEvent) => { if (sortRef.current && !sortRef.current.contains(event.target as Node)) { setShowSortMenu(false); } if ( filterRef.current && !filterRef.current.contains(event.target as Node) ) { setShowFilterMenu(false); } }; useEffect(() => { document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, []); const handleEventClick = (eventId: number) => { router.push(`/events/${eventId}`); }; return ( Loading...

}>
Loading...

}> setSearchQuery(e.target.value)} className="search-bar mt-4 p-2 border border-gray-300 rounded w-full max-w-md" />
{showSortMenu && (
)}
{showFilterMenu && (
)}

Available Events

{filteredEvents.map((event) => ( ))}
); }; export default EventsPage;