From ae0db5d02fd9a04197f492d766bc6101eea3924b Mon Sep 17 00:00:00 2001 From: Shay Patel Date: Sun, 27 Oct 2024 04:49:54 +0000 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=8E=AB=20Add=20event=20details=20on?= =?UTF-8?q?=20event=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/events/[...eventId]/page.tsx | 28 +++++--------------------- components/custom/EventDescription.tsx | 10 ++++----- 2 files changed, 10 insertions(+), 28 deletions(-) diff --git a/app/events/[...eventId]/page.tsx b/app/events/[...eventId]/page.tsx index 81c98b9..d97c7c4 100644 --- a/app/events/[...eventId]/page.tsx +++ b/app/events/[...eventId]/page.tsx @@ -4,37 +4,19 @@ import { useParams } from 'next/navigation'; import Header from '../../../components/custom/header'; import Footer from '../../../components/custom/footer'; import EventDescription from '../../../components/custom/EventDescription'; +import { fetchEventDetails } from '@/lib/fetchEventDetails'; const ListingPage: React.FC = () => { const { eventId } = useParams(); const [eventDetails, setEventDetails] = useState(null); useEffect(() => { - const fetchEventDetails = async (id: number) => { - alert(`Fetching details for event ID: ${id}`); - // Dummy Response - const details = { - EventID: id, - name: 'Example Event Name', - date: '2023-12-01', - location: 'Example Location', - ticketPrice: 100, - description: 'Detailed description of the event.', - capacity: 300, - ticketsSold: 295, - imageUrl: [ - 'https://via.placeholder.com/150', - 'https://via.placeholder.com/150', - ], - host: 'Example Host', - tickets: [1, 2, 3, 4], - }; - return details; - }; - const getEventDetails = async () => { if (eventId) { - const details = await fetchEventDetails(Number(eventId)); + const details = await fetchEventDetails({ + eventID: Number(eventId), + toast: ({ title, variant }: any) => {alert(title);}}); + console.log(details) setEventDetails(details); } }; diff --git a/components/custom/EventDescription.tsx b/components/custom/EventDescription.tsx index 974790d..f7e1daf 100644 --- a/components/custom/EventDescription.tsx +++ b/components/custom/EventDescription.tsx @@ -48,21 +48,21 @@ const EventDescription: React.FC = ({ variant="outline" className="text-blue-600 bg-blue-100 px-3 py-1 rounded-full" > - Price: ${eventDetails.ticketPrice} + Price: ${eventDetails.ticketPrice.toFixed(2)}
- +

{eventDetails.description}

-

Location: {eventDetails.location}

-

Date: {eventDetails.date}

-

Host: {eventDetails.host}

+

Location:
{eventDetails.location}


+

Date:
{eventDetails.date}


+

Host:
{eventDetails.host}

{eventDetails.ticketsSold / eventDetails.capacity >= 0.9 && (
Limited Tickets Remaining! From dbdc61fd678d1696c9a6a4e61c1fa19225b20aab Mon Sep 17 00:00:00 2001 From: Shay Patel Date: Sun, 27 Oct 2024 04:59:30 +0000 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=92=AC=20Add=20'event=20not=20found'?= =?UTF-8?q?=20message?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/events/[...eventId]/page.tsx | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/app/events/[...eventId]/page.tsx b/app/events/[...eventId]/page.tsx index d97c7c4..2a44b8f 100644 --- a/app/events/[...eventId]/page.tsx +++ b/app/events/[...eventId]/page.tsx @@ -9,6 +9,7 @@ import { fetchEventDetails } from '@/lib/fetchEventDetails'; const ListingPage: React.FC = () => { const { eventId } = useParams(); const [eventDetails, setEventDetails] = useState(null); + const [eventNotFound, setEventNotFound] = useState(false); useEffect(() => { const getEventDetails = async () => { @@ -21,7 +22,10 @@ const ListingPage: React.FC = () => { } }; - getEventDetails(); + getEventDetails().catch((err) => { + setEventNotFound(true); + console.log(eventNotFound); + }); }, [eventId]); return ( @@ -46,11 +50,13 @@ const ListingPage: React.FC = () => {
- {eventDetails ? ( - - ) : ( -

Loading...

- )} + {eventNotFound ?

Event not found

: + (eventDetails ? ( + + ) : ( +

Loading...

+ )) + }
From be6b2b68bf054ac7f7374ccb675f4702a1a2404f Mon Sep 17 00:00:00 2001 From: Shay Patel Date: Sun, 27 Oct 2024 05:02:53 +0000 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=98=A4=20Add=20fetchEventDetails=20sc?= =?UTF-8?q?ript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/fetchEventDetails.ts | 78 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 lib/fetchEventDetails.ts diff --git a/lib/fetchEventDetails.ts b/lib/fetchEventDetails.ts new file mode 100644 index 0000000..4fe42d2 --- /dev/null +++ b/lib/fetchEventDetails.ts @@ -0,0 +1,78 @@ +import { ethers } from 'ethers'; +import { getContract } from './ethers'; + +interface GetEventDetailsProps { + eventID: number; + toast: ToastFunction; +} + +type ToastFunction = (options: { + title: string; + variant?: 'default' | 'destructive' | null | undefined; +}) => void; + +declare global { + interface Window { + ethereumProvider?: ethers.providers.ExternalProvider & { + isMetaMask?: boolean; + request?: (method: string, params?: unknown[]) => Promise; + }; + } +} + +export const fetchEventDetails = async ({ + eventID, + toast, +}: GetEventDetailsProps) => { + try { + console.log('Starting events call'); + if (typeof window.ethereum === 'undefined') { + console.error('Ethereum provider not found'); + toast({ + title: 'Please install MetaMask or another Ethereum wallet', + variant: 'destructive', + }); + return; + } + + console.log('Connecting to Ethereum provider'); + const provider = new ethers.providers.Web3Provider(window.ethereum); + const contract = getContract(); + + console.log('Requesting data'); + const eventData = await contract.callStatic.events(eventID); + const eventImages = await contract.callStatic.getEventImages(eventID); + console.log(eventData); + + // toast({ + // title: `Data fetched successfully!`, + // }); + + return { + EventID: eventID, + name: eventData.name, + date: eventData.eventStartDate.toNumber(), + location: eventData.location, + ticketPrice: eventData.ticketPrice.div(ethers.BigNumber.from("1000000000000000000")).toNumber() / 100, + description: eventData.description, + capacity: eventData.capacity.toNumber(), + ticketsSold: eventData.ticketsSold.toNumber(), + imageUrl: eventImages, + host: eventData.eventHost + } + } catch (error) { + console.error('Error in createEvent:', error); + // if (error instanceof Error) { + // toast({ + // title: `Transaction failed: ${error.message}`, + // variant: 'destructive', + // }); + // } else { + // toast({ + // title: 'Transaction failed. Please try again.', + // variant: 'destructive', + // }); + // } + throw error; + } +};