'use client'; import React, { useState } from 'react'; import { ethers } from 'ethers'; import { getContract } from '@/lib/ethers'; declare global { interface Window { ethereum: ethers.providers.ExternalProvider; } } const TransferTicket = () => { const [ticketId, setTicketId] = useState(null); const [recipientAddress, setRecipientAddress] = useState(''); const [transactionHash, setTransactionHash] = useState(null); const [isWalletConnected, setIsWalletConnected] = useState(false); const [walletAddress, setWalletAddress] = useState(null); const [errorMessage, setErrorMessage] = useState(null); const [isApprovedTransfer, setIsApprovedTransfer] = useState(false); // Connect Wallet const handleConnectWallet = async () => { try { if (typeof window.ethereum !== 'undefined' && window.ethereum.request) { const accounts = await window.ethereum.request({ method: 'eth_requestAccounts', }); if (accounts.length > 0) { setIsWalletConnected(true); setWalletAddress(accounts[0]); console.log('Wallet connected:', accounts[0]); } } else { alert('Please install MetaMask or another Ethereum wallet'); } } catch (error) { console.error('Error connecting to wallet:', error); } }; // Handle transferring the ticket const handleTransferTicket = async () => { if (!ticketId) { alert('Please enter a valid Ticket ID.'); return; } if (!ethers.utils.isAddress(recipientAddress)) { alert('Please enter a valid recipient address.'); return; } try { // Get the provider and signer const provider = new ethers.providers.Web3Provider(window.ethereum); const signer = provider.getSigner(); const contract = getContract().connect(signer); let tx; if (isApprovedTransfer) { // Transfer using `transferTicketFrom` for approved users tx = await contract.transferTicketFrom(ticketId, recipientAddress); } else { // Direct transfer by the owner using `transferTicket` tx = await contract.transferTicket(ticketId, recipientAddress); } const receipt = await tx.wait(); setTransactionHash(receipt.transactionHash); console.log( 'Ticket transferred successfully, transaction hash:', receipt.transactionHash ); setErrorMessage(null); } catch (error) { setErrorMessage( 'Error transferring ticket. Please check ticket ID or recipient address.' ); console.error('Error transferring ticket:', error); } }; // Handle ticket approval for transfer const handleApproveTransfer = async () => { if (ticketId !== null) { if (ticketId < 0) { alert('Please enter a valid Ticket ID.'); return; } } if (!ethers.utils.isAddress(recipientAddress)) { alert('Please enter a valid recipient address.'); return; } try { // Get the provider and signer const provider = new ethers.providers.Web3Provider(window.ethereum); const signer = provider.getSigner(); const contract = getContract().connect(signer); // Approve recipient to transfer the ticket const tx = await contract.approveTicket(ticketId, recipientAddress, true); const receipt = await tx.wait(); console.log( 'Ticket transfer approved, transaction hash:', receipt.transactionHash ); alert(`Approved ${recipientAddress} to transfer ticket ID ${ticketId}`); } catch (error) { console.error('Error approving transfer:', error); } }; return (

Transfer Ticket

{!isWalletConnected ? ( ) : (

Connected Wallet: {walletAddress}

setTicketId(Number(e.target.value))} className="border p-2 mb-2" /> setRecipientAddress(e.target.value)} className="border p-2 mb-2" /> {/* Toggle for approved transfer */} {/* Transfer Ticket Button */} {/* Approve Transfer Button */} {!isApprovedTransfer && ( )} {errorMessage &&

{errorMessage}

} {transactionHash && (

Ticket transfer successful! Hash:{' '} {transactionHash}

)}
)}
); }; export default TransferTicket;