Merge pull request #41 from Ayush272002/add_profile

fetch profile data from the smart contract
This commit is contained in:
Ayush Acharjya
2024-10-27 04:08:53 +00:00
committed by GitHub

View File

@@ -1,65 +1,28 @@
'use client'; 'use client';
import React, { Suspense, useEffect, useState } from 'react'; import React, { Suspense, useEffect, useState } from 'react';
import { useRouter, useSearchParams } from 'next/navigation'; import { useRouter, useSearchParams } from 'next/navigation';
import Header from '../../components/custom/header'; import Header from '../../components/custom/header';
import Footer from '../../components/custom/footer'; import Footer from '../../components/custom/footer';
import { ethers } from 'ethers';
import { getContract } from '@/lib/ethers';
export const dynamic = 'force-dynamic'; export const dynamic = 'force-dynamic';
interface Event { interface Event {
EventID: number; eventId: number;
name: string; name: string;
date: string;
location: string;
ticketPrice: number;
description: string; description: string;
location: string;
capacity: number; capacity: number;
ticketsSold: number; ticketsSold: number;
imageUrl: string; ticketPrice: number;
host: string; eventStartDate: number;
eventEndDate: number;
images: string[];
eventHost: string;
} }
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 EventsPage: React.FC = () => { const EventsPage: React.FC = () => {
const router = useRouter(); const router = useRouter();
const searchParams = useSearchParams(); const searchParams = useSearchParams();
@@ -77,27 +40,59 @@ const EventsPage: React.FC = () => {
const [showFilterMenu, setShowFilterMenu] = useState<boolean>(false); const [showFilterMenu, setShowFilterMenu] = useState<boolean>(false);
useEffect(() => { useEffect(() => {
const eventsData = fetchEvents(); const fetchEvents = async () => {
setEvents(eventsData); try {
setFilteredEvents(eventsData); const provider = new ethers.providers.Web3Provider(window.ethereum!);
const contract = getContract().connect(provider);
const eventCount = await contract.eventCounter();
const eventsData: Event[] = [];
if (initialQuery) { for (let i = 0; i < eventCount; i++) {
setFilteredEvents( const event = await contract.events(i);
eventsData.filter((event) => const images = await contract.getEventImages(i);
['name', 'date', 'location', 'description', 'host'].some((key) => eventsData.push({
event[key as keyof Event] eventId: i,
.toString() name: event.name,
.toLowerCase() description: event.description,
.includes(initialQuery.toLowerCase()) 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]); }, [initialQuery]);
useEffect(() => { useEffect(() => {
let filtered = events.filter((event) => let filtered = events.filter((event) =>
['name', 'date', 'location', 'description', 'host'].some((key) => ['name', 'description', 'location', 'eventHost'].some((key) =>
event[key as keyof Event] event[key as keyof Event]
.toString() .toString()
.toLowerCase() .toLowerCase()
@@ -112,17 +107,17 @@ const EventsPage: React.FC = () => {
} }
if (filterOptions.includes('future')) { if (filterOptions.includes('future')) {
const now = new Date(); const now = Math.floor(Date.now() / 1000);
filtered = filtered.filter((event) => new Date(event.date) > now); filtered = filtered.filter((event) => event.eventStartDate > now);
} }
if (filterOptions.includes('past')) { if (filterOptions.includes('past')) {
const now = new Date(); const now = Math.floor(Date.now() / 1000);
filtered = filtered.filter((event) => new Date(event.date) < now); filtered = filtered.filter((event) => event.eventEndDate < now);
} }
if (selectedHost) { if (selectedHost) {
filtered = filtered.filter((event) => event.host === selectedHost); filtered = filtered.filter((event) => event.eventHost === selectedHost);
} }
if (sortOption === 'price-asc') { if (sortOption === 'price-asc') {
@@ -130,13 +125,9 @@ const EventsPage: React.FC = () => {
} else if (sortOption === 'price-desc') { } else if (sortOption === 'price-desc') {
filtered = filtered.sort((a, b) => b.ticketPrice - a.ticketPrice); filtered = filtered.sort((a, b) => b.ticketPrice - a.ticketPrice);
} else if (sortOption === 'date-asc') { } else if (sortOption === 'date-asc') {
filtered = filtered.sort( filtered = filtered.sort((a, b) => a.eventStartDate - b.eventStartDate);
(a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()
);
} else if (sortOption === 'date-desc') { } else if (sortOption === 'date-desc') {
filtered = filtered.sort( filtered = filtered.sort((a, b) => b.eventStartDate - a.eventStartDate);
(a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()
);
} }
setFilteredEvents(filtered); setFilteredEvents(filtered);
@@ -161,8 +152,8 @@ const EventsPage: React.FC = () => {
}; };
}, []); }, []);
const handleEventClick = (eventID: number) => { const handleEventClick = (eventId: number) => {
router.push(`/events/${eventID}`); router.push(`/events/${eventId}`);
}; };
return ( return (
@@ -280,25 +271,29 @@ const EventsPage: React.FC = () => {
<div className="grid grid-cols-1 gap-6"> <div className="grid grid-cols-1 gap-6">
{filteredEvents.map((event) => ( {filteredEvents.map((event) => (
<button <button
key={event.EventID} key={event.eventId}
className="relative flex bg-white p-4 rounded-lg shadow-lg text-left" className="relative flex bg-white p-4 rounded-lg shadow-lg text-left"
onClick={() => handleEventClick(event.EventID)} onClick={() => handleEventClick(event.eventId)}
onMouseEnter={() => setHoveredEventId(event.EventID)} onMouseEnter={() => setHoveredEventId(event.eventId)}
onMouseLeave={() => setHoveredEventId(null)} onMouseLeave={() => setHoveredEventId(null)}
> >
<img <img
src={event.imageUrl} src={event.images[0] || '/placeholder.svg'}
alt={event.name} alt={event.name}
className="w-1/4 rounded-lg" className="w-1/4 rounded-lg"
/> />
<div className="ml-4 relative"> <div className="ml-4 relative">
<h3 className="text-xl font-bold">{event.name}</h3> <h3 className="text-xl font-bold">{event.name}</h3>
<p className="text-gray-600">{event.date}</p> <p className="text-gray-600">
{new Date(
event.eventStartDate * 1000
).toLocaleDateString()}
</p>
<p className="text-gray-600">{event.location}</p> <p className="text-gray-600">{event.location}</p>
<p className="text-gray-800 font-semibold"> <p className="text-gray-800 font-semibold">
${event.ticketPrice.toFixed(2)} ${event.ticketPrice} FLR
</p> </p>
<p className="text-gray-600">Host: {event.host}</p> <p className="text-gray-600">Host: {event.eventHost}</p>
</div> </div>
</button> </button>
))} ))}