diff --git a/.husky/pre-commit b/.husky/pre-commit
index 72c4429..9cbfef9 100644
--- a/.husky/pre-commit
+++ b/.husky/pre-commit
@@ -1 +1,2 @@
-npm test
+#!/usr/bin/env sh
+npx lint-staged && npm run build
\ No newline at end of file
diff --git a/app/events/[...eventId]/page.tsx b/app/events/[...eventId]/page.tsx
index 2a44b8f..b671ccf 100644
--- a/app/events/[...eventId]/page.tsx
+++ b/app/events/[...eventId]/page.tsx
@@ -16,15 +16,17 @@ const ListingPage: React.FC = () => {
if (eventId) {
const details = await fetchEventDetails({
eventID: Number(eventId),
- toast: ({ title, variant }: any) => {alert(title);}});
- console.log(details)
+ toast: ({ title, variant }: any) => {
+ alert(title);
+ },
+ });
+ console.log(details);
setEventDetails(details);
}
};
getEventDetails().catch((err) => {
setEventNotFound(true);
- console.log(eventNotFound);
});
}, [eventId]);
@@ -50,13 +52,15 @@ const ListingPage: React.FC = () => {
- {eventNotFound ?
Event not found
:
- (eventDetails ? (
-
- ) : (
-
Loading...
- ))
- }
+ {eventNotFound ? (
+
+ Event not found
+
+ ) : eventDetails ? (
+
+ ) : (
+
Loading...
+ )}
diff --git a/app/profile/page.tsx b/app/profile/page.tsx
index 7289dce..1d0c8d1 100644
--- a/app/profile/page.tsx
+++ b/app/profile/page.tsx
@@ -1,63 +1,179 @@
'use client';
-import React, { useEffect, useState } from 'react';
+
+import React, { useState, useEffect } from 'react';
+import { ethers } from 'ethers';
import Header from '../../components/custom/header';
import Footer from '../../components/custom/footer';
-import Profile from '@/components/custom/Profile';
-import PreviousTickets from '@/components/PreviousTickets';
+import { Button } from '@/components/ui/button';
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from '@/components/ui/card';
+import EventManagerABI from '../../contracts/EventManagerABI.json';
-const ProfilePage: React.FC = () => {
+const RPC_URL = process.env.NEXT_PUBLIC_RPC_URL;
+const CONTRACT_ADDRESS = process.env.NEXT_PUBLIC_CONTRACT_ADDRESS;
+
+if (!RPC_URL || !CONTRACT_ADDRESS) {
+ console.error(
+ 'Missing environment variables. Please check your .env.local file.'
+ );
+}
+
+export default function ProfilePage() {
const [isClient, setIsClient] = useState(false);
- const [isAuth, setAuth] = useState(false);
+ const [userTickets, setUserTickets] = useState
([]);
+ const [userAddress, setUserAddress] = useState('');
+ const [loading, setLoading] = useState(false);
+ const [error, setError] = useState('');
+ const [networkName, setNetworkName] = useState('');
useEffect(() => {
- // This ensures the component renders only on the client side
setIsClient(true);
+ checkNetwork();
}, []);
- useEffect(() => {});
+ const checkNetwork = async () => {
+ if (typeof window.ethereum !== 'undefined') {
+ try {
+ const provider = new ethers.providers.Web3Provider(window.ethereum);
+ const network = await provider.getNetwork();
+ console.log('Network:', network);
+ setNetworkName(network.name);
+ } catch (error) {
+ console.error('Failed to get network:', error);
+ }
+ }
+ };
+
+ const connectWallet = async () => {
+ setLoading(true);
+ setError('');
+ if (typeof window.ethereum !== 'undefined') {
+ try {
+ await window.ethereum.request({ method: 'eth_requestAccounts' });
+ const provider = new ethers.providers.Web3Provider(window.ethereum);
+ const signer = provider.getSigner();
+ const address = await signer.getAddress();
+ setUserAddress(address);
+ await fetchUserTickets(address);
+ } catch (error) {
+ console.error('Failed to connect wallet:', error);
+ setError('Failed to connect wallet. Please try again.');
+ }
+ } else {
+ setError('Please install MetaMask!');
+ }
+ setLoading(false);
+ };
+
+ const fetchUserTickets = async (address: string) => {
+ if (!RPC_URL || !CONTRACT_ADDRESS) {
+ setError('Missing configuration. Please contact support.');
+ return;
+ }
+
+ try {
+ const provider = new ethers.providers.JsonRpcProvider(RPC_URL);
+ const contract = new ethers.Contract(
+ CONTRACT_ADDRESS,
+ EventManagerABI,
+ provider
+ );
+
+ console.log('Fetching tickets for address:', address);
+
+ const tickets = await contract.getUserTickets(address);
+ console.log('Raw tickets data:', tickets);
+
+ if (Array.isArray(tickets)) {
+ const ticketNumbers = tickets.map((ticket: ethers.BigNumber) =>
+ ticket.toNumber()
+ );
+ console.log('Processed ticket numbers:', ticketNumbers);
+ setUserTickets(ticketNumbers);
+ } else {
+ console.error('Unexpected response from getUserTickets:', tickets);
+ setError('Unexpected response from contract. Please try again.');
+ }
+ } catch (error) {
+ console.error('Failed to fetch user tickets:', error);
+ setError(`Failed to fetch user tickets: ${(error as Error).message}`);
+ }
+ };
return (
- <>
-
-
-
-
- {/* Video Background */}
- {isClient && (
-
+
+
+
+
+ {isClient && (
+
+ )}
+
+
+
+
+
Your Profile
+ {userAddress ? (
+
Connected Address: {userAddress}
+ ) : (
+
Not connected
+ )}
+
Current Network: {networkName}
+
+ {error && (
+
+ {error}
+
)}
- {/* Dark Overlay for Enhanced Readability */}
-
+
+
+ Your Tickets
+
+ Here are the tickets associated with your wallet
+
+
+
+ {loading ? (
+ Loading...
+ ) : userTickets.length > 0 ? (
+
+ {userTickets.map((ticketId) => (
+ -
+ Ticket ID: {ticketId}
+
+ ))}
+
+ ) : (
+ You don't have any tickets yet.
+ )}
+
+
-
-
-
- {/* Render PreviousTickets component with appropriate props */}
-
-
+
-
- >
+
+
);
-};
-
-export default ProfilePage;
+}
diff --git a/env b/env
deleted file mode 100644
index 6beaef3..0000000
--- a/env
+++ /dev/null
@@ -1,2 +0,0 @@
-NEXT_PUBLIC_RPC_URL=https://coston2.enosys.global/ext/C/rpc
-NEXT_PUBLIC_CONTRACT_ADDRESS=0xe84032D41216B21153f4Ab0d98EA396f777fc957
diff --git a/lib/fetchEventDetails.ts b/lib/fetchEventDetails.ts
index 4c08c3c..7244cb5 100644
--- a/lib/fetchEventDetails.ts
+++ b/lib/fetchEventDetails.ts
@@ -58,8 +58,8 @@ export const fetchEventDetails = async ({
capacity: eventData.capacity.toNumber(),
ticketsSold: eventData.ticketsSold.toNumber(),
imageUrl: eventImages,
- host: eventData.eventHost
- }
+ host: eventData.eventHost,
+ };
} catch (error) {
console.error('Error in createEvent:', error);
// if (error instanceof Error) {
diff --git a/lib/fetchEvents.ts b/lib/fetchEvents.ts
index bc9e03f..40915ec 100644
--- a/lib/fetchEvents.ts
+++ b/lib/fetchEvents.ts
@@ -1,53 +1,53 @@
-import { ethers } from "ethers";
-import { getContract } from "./ethers";
+import { ethers } from 'ethers';
+import { getContract } from './ethers';
interface Event {
- eventId: number;
- name: string;
- description: string;
- location: string;
- capacity: number;
- ticketsSold: number;
- ticketPrice: number;
- eventStartDate: number;
- eventEndDate: number;
- images: string[];
- eventHost: string;
+ eventId: number;
+ name: string;
+ description: string;
+ location: string;
+ capacity: number;
+ ticketsSold: number;
+ ticketPrice: number;
+ eventStartDate: number;
+ eventEndDate: number;
+ images: string[];
+ eventHost: string;
}
export const fetchEvents: () => Promise
= async () => {
- try {
- console.log('Starting events call');
- if (typeof window.ethereum === 'undefined') {
- console.error('Ethereum provider not found');
- return;
- }
-
- console.log('Connecting to contract');
- const contract = getContract();
- 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: event.ticketPrice.toNumber() / 100,
- eventStartDate: event.eventStartDate.toNumber(),
- eventEndDate: event.eventEndDate.toNumber(),
- images: images,
- eventHost: event.eventHost,
- });
- }
-
- return eventsData;
- } catch (error) {
- console.error('Failed to fetch events:', error);
+ try {
+ console.log('Starting events call');
+ if (typeof window.ethereum === 'undefined') {
+ console.error('Ethereum provider not found');
+ return;
}
-}
\ No newline at end of file
+
+ console.log('Connecting to contract');
+ const contract = getContract();
+ 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: event.ticketPrice.toNumber() / 100,
+ eventStartDate: event.eventStartDate.toNumber(),
+ eventEndDate: event.eventEndDate.toNumber(),
+ images: images,
+ eventHost: event.eventHost,
+ });
+ }
+
+ return eventsData;
+ } catch (error) {
+ console.error('Failed to fetch events:', error);
+ }
+};