'use client'; import React, { useEffect, useState, useRef } from 'react'; import Header from '../../components/custom/header'; import Footer from '../../components/custom/footer'; // Define the Event interface including new fields interface Event { EventID: number; name: string; date: string; // Should ideally be a Date object for better handling location: string; ticketPrice: number; // Changed to number for sorting description: string; capacity: number; ticketsSold: number; imageUrl: string; host: string; // New field for host } // Dummy function to fetch events const fetchEvents = (): Event[] => { return [ { EventID: 1, name: 'Rock Concert', date: '2023-12-01', location: 'New York City', ticketPrice: 99, description: 'An exhilarating rock concert featuring famous bands.', capacity: 5000, ticketsSold: 4500, imageUrl: 'https://via.placeholder.com/150', host: 'Music Mania', }, { EventID: 2, name: 'Art Expo', date: '2023-11-15', location: 'San Francisco', ticketPrice: 55, description: 'A showcase of modern art from around the world.', capacity: 300, ticketsSold: 260, imageUrl: 'https://via.placeholder.com/150', host: 'Art Lovers', }, { EventID: 3, name: 'Tech Summit 2023', date: '2023-12-10', location: 'Chicago', ticketPrice: 250, description: 'The leading tech summit with top industry speakers.', capacity: 2000, ticketsSold: 1800, imageUrl: 'https://via.placeholder.com/150', host: 'Tech Alliance', }, ]; }; const TicketListing: React.FC = () => { const [events, setEvents] = useState([]); const [filteredEvents, setFilteredEvents] = useState([]); const [searchQuery, setSearchQuery] = useState(''); const [hoveredEventId, setHoveredEventId] = useState(null); const [sortOption, setSortOption] = useState(''); // Track sorting option const [filterOptions, setFilterOptions] = useState([]); // Track applied filters const [selectedHost, setSelectedHost] = useState(''); // For host filtering const [showSortMenu, setShowSortMenu] = useState(false); const [showFilterMenu, setShowFilterMenu] = useState(false); const sortRef = useRef(null); const filterRef = useRef(null); useEffect(() => { const eventsData = fetchEvents(); setEvents(eventsData); setFilteredEvents(eventsData); }, []); useEffect(() => { let filtered = events.filter((event) => ['name', 'date', 'location', 'description', 'host'].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 = new Date(); filtered = filtered.filter((event) => new Date(event.date) > now); } if (filterOptions.includes('past')) { const now = new Date(); filtered = filtered.filter((event) => new Date(event.date) < now); } if (selectedHost) { filtered = filtered.filter((event) => event.host === 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) => new Date(a.date).getTime() - new Date(b.date).getTime() ); } else if (sortOption === 'date-desc') { filtered = filtered.sort( (a, b) => new Date(b.date).getTime() - new Date(a.date).getTime() ); } 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); }; }, []); return (
setSearchQuery(e.target.value)} className="search-bar mt-4 p-2 border border-gray-300 rounded w-full max-w-md" />
{/* Sort Button and Dropdown */}
{showSortMenu && (
)}
{/* Filter Button and Dropdown */}
{showFilterMenu && (
{/* Filter by Host */}
)}

Available Events

{filteredEvents.map((event) => (
setHoveredEventId(event.EventID)} onMouseLeave={() => setHoveredEventId(null)} > {event.name}

{event.name}

{event.date}

{event.location}

${event.ticketPrice.toFixed(2)}

Host: {event.host}

{event.ticketsSold / event.capacity >= 0.9 && (
Limited Tickets Remaining!
)}
{hoveredEventId === event.EventID && (

{event.description}

)}
))}
); }; export default TicketListing;