fixing changes

This commit is contained in:
ashprit
2024-10-27 00:55:00 +01:00
12 changed files with 206 additions and 117 deletions

View File

@@ -9,43 +9,63 @@ import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import { Separator } from '@/components/ui/separator';
import ImageCarousel from './ImageCarousel';
import TicketButton from './TicketButton';
import { buyHandler } from '@/lib/buyHandler';
import { useToast } from '@/hooks/use-toast';
import NumberPicker from './TicketButton';
const EventDescription = ({ eventId }: { eventId: string }) => {
interface EventDescriptionProps {
eventDetails: {
EventID: number;
name: string;
date: string;
location: string;
ticketPrice: number;
description: string;
capacity: number;
ticketsSold: number;
imageUrl: string[];
host: string;
};
}
const EventDescription: React.FC<EventDescriptionProps> = ({
eventDetails,
}) => {
const { toast } = useToast();
const handleBuyNow = () => {
buyHandler(Number(eventId), toast);
buyHandler(eventDetails.EventID, toast);
};
return (
<Card className="pt-10 pb-16 px-6 bg-gradient-to-r from-blue-50 to-gray-50 rounded-xl shadow-lg max-w-4xl mx-auto">
<CardHeader className="flex flex-col items-start space-y-4">
<h1 className="text-3xl font-semibold text-gray-800">TicketTitle</h1>
<h1 className="text-3xl font-semibold text-gray-800">
{eventDetails.name}
</h1>
<Badge
variant="outline"
className="text-blue-600 bg-blue-100 px-3 py-1 rounded-full"
>
Price: $99
Price: ${eventDetails.ticketPrice}
</Badge>
</CardHeader>
<CardContent className="flex flex-col md:flex-row items-start space-y-8 md:space-y-0 md:space-x-10">
<div className="md:w-1/2 flex justify-center">
<ImageCarousel />
<ImageCarousel images={eventDetails.imageUrl} />
</div>
<div className="md:w-1/2 text-gray-700">
<Separator className="my-4" />
<p className="leading-relaxed">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem
ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Lorem ipsum
dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
</p>
<p className="leading-relaxed">{eventDetails.description}</p>
<Separator className="my-4" />
<p>Location: {eventDetails.location}</p>
<p>Date: {eventDetails.date}</p>
<p>Host: {eventDetails.host}</p>
{eventDetails.ticketsSold / eventDetails.capacity >= 0.9 && (
<div className="mt-2 p-2 bg-yellow-300 text-black rounded">
Limited Tickets Remaining!
</div>
)}
</div>
</CardContent>
@@ -58,7 +78,9 @@ const EventDescription = ({ eventId }: { eventId: string }) => {
Buy now Using MetaMask
</Button>
<div className="relative md:left-5">
<TicketButton />
<NumberPicker
max={eventDetails.capacity - eventDetails.ticketsSold}
/>
</div>
</CardFooter>
</Card>

View File

@@ -1,5 +1,4 @@
import * as React from 'react';
import { Card, CardContent } from '@/components/ui/card';
import {
Carousel,
@@ -9,17 +8,25 @@ import {
CarouselPrevious,
} from '@/components/ui/carousel';
export default function ImageCarousel() {
interface ImageCarouselProps {
images: string[];
}
const ImageCarousel: React.FC<ImageCarouselProps> = ({ images }) => {
return (
<Carousel className="w-full max-w-xs">
<CarouselContent>
{/* map your images here from the page */}
{Array.from({ length: 5 }).map((_, index) => (
{/* Map over the images array to create CarouselItems */}
{images.map((imageUrl, index) => (
<CarouselItem key={index}>
<div className="p-1">
<Card>
<CardContent className="flex aspect-square items-center justify-center p-6">
<span className="text-4xl font-semibold">{index + 1}</span>
<img
src={imageUrl}
alt={`Event image ${index + 1}`}
className="w-full h-full object-cover rounded-lg"
/>
</CardContent>
</Card>
</div>
@@ -30,4 +37,6 @@ export default function ImageCarousel() {
<CarouselNext />
</Carousel>
);
}
};
export default ImageCarousel;

View File

@@ -62,6 +62,16 @@ const Header = () => {
</a>
</Link>
</li>
<li>
<Link href="/host" legacyBehavior>
<a
className="text-white hover:text-light-purple hover:text-opacity-75 transition-colors duration-300"
style={{ textShadow: '1px 1px 2px rgba(0, 0, 0, 0.5)' }}
>
Host Event
</a>
</Link>
</li>
<li>
<Link href="/contact" legacyBehavior>
<a

View File

@@ -1,7 +1,7 @@
'use client';
import React, { useEffect, useState } from 'react';
import { useSDK, MetaMaskProvider } from '@metamask/sdk-react';
import { WalletIcon } from 'lucide-react';
import { Button } from '@/components/ui/button';
import {
Popover,
@@ -9,54 +9,87 @@ import {
PopoverTrigger,
} from '@/components/ui/popover';
function WalletIcon(props: React.SVGProps<SVGSVGElement>) {
return (
<svg
{...props}
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
>
<path d="M21 12V7H5a2 2 0 0 1 0-4h14v4" />
<path d="M3 5v14a2 2 0 0 0 2 2h16v-5" />
<path d="M18 12a2 2 0 0 0 0 4h4v-4Z" />
</svg>
);
}
function formatAddress(address: string | undefined): string {
if (!address) return '';
return `${address.slice(0, 6)}...${address.slice(-4)}`;
declare global {
interface Window {
ethereum?: {
isMetaMask?: boolean;
request: (request: {
method: string;
params?: Array<unknown>; // Use `unknown` instead of `any`
}) => Promise<unknown>; // Specify a more accurate return type if possible
};
}
}
function MetaMaskConnect() {
const { sdk, connected, connecting, account } = useSDK();
const [isConnected, setIsConnected] = useState(false);
const [isConnected, setIsConnected] = useState<boolean>(false);
const [account, setAccount] = useState<string | null>(null);
// Initial check on load
useEffect(() => {
setIsConnected(connected);
}, [connected]);
const checkConnection = async () => {
if (typeof window !== 'undefined' && window.ethereum) {
try {
// Check if there are any accounts already connected
const accounts = (await window.ethereum.request({
method: 'eth_accounts',
})) as string[];
if (accounts && accounts.length > 0) {
setIsConnected(true);
setAccount(accounts[0]);
localStorage.setItem('isConnected', JSON.stringify(true));
localStorage.setItem('account', accounts[0]);
} else {
// No connected accounts found; check `localStorage`
const storedIsConnected = JSON.parse(
localStorage.getItem('isConnected') || 'false'
);
const storedAccount = localStorage.getItem('account') || null;
setIsConnected(storedIsConnected);
setAccount(storedAccount);
}
} catch (error) {
console.error('Error checking MetaMask connection:', error);
}
}
};
checkConnection();
}, []);
// Update localStorage whenever connection state changes
useEffect(() => {
if (typeof window !== 'undefined') {
localStorage.setItem('isConnected', JSON.stringify(isConnected));
localStorage.setItem('account', account || '');
}
}, [isConnected, account]);
const connect = async () => {
try {
await sdk?.connect();
setIsConnected(true);
} catch (err) {
console.warn(`No accounts found`, err);
const accounts = (await window.ethereum?.request({
method: 'eth_requestAccounts',
})) as string[];
if (accounts && accounts.length > 0) {
setIsConnected(true);
setAccount(accounts[0]);
localStorage.setItem('isConnected', JSON.stringify(true));
localStorage.setItem('account', accounts[0]);
}
} catch (error) {
console.error('MetaMask connection failed:', error);
}
};
const disconnect = () => {
if (sdk) {
sdk.terminate();
setIsConnected(false);
}
const disconnect = async () => {
setIsConnected(false);
setAccount(null);
localStorage.setItem('isConnected', JSON.stringify(false));
localStorage.removeItem('account');
await window.ethereum?.request({
method: 'wallet_revokePermissions',
params: [{ eth_accounts: {} }],
});
};
return (
@@ -65,7 +98,7 @@ function MetaMaskConnect() {
<Popover>
<PopoverTrigger asChild>
<Button variant="link" className="text-white">
{formatAddress(account)}
{account && `${account.slice(0, 6)}...${account.slice(-4)}`}
</Button>
</PopoverTrigger>
<PopoverContent className="w-44">
@@ -80,7 +113,6 @@ function MetaMaskConnect() {
</Popover>
) : (
<Button
disabled={connecting}
onClick={connect}
className="bg-light-purple bg-opacity-75 hover:bg-purple border-0 hover:border-0"
>
@@ -91,18 +123,4 @@ function MetaMaskConnect() {
);
}
export default function MetaMaskConnectWrapper() {
return (
<MetaMaskProvider
debug={false}
sdkOptions={{
dappMetadata: {
name: 'My dApp',
url: typeof window !== 'undefined' ? window.location.href : '',
},
}}
>
<MetaMaskConnect />
</MetaMaskProvider>
);
}
export default MetaMaskConnect;