mirror of
https://github.com/0xShay/ticketchain.git
synced 2026-01-11 13:13:25 +00:00
Merge pull request #41 from Ayush272002/add_profile
fetch profile data from the smart contract
This commit is contained in:
@@ -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>
|
||||||
))}
|
))}
|
||||||
|
|||||||
Reference in New Issue
Block a user