added transferTicket.tsx component

This commit is contained in:
ayomaska18
2024-10-26 12:55:15 +01:00
parent 79792bda85
commit 4b3855bd1b
4 changed files with 72 additions and 11 deletions

View File

View File

@@ -17,6 +17,7 @@ const TransferTicket = () => {
const [isWalletConnected, setIsWalletConnected] = useState<boolean>(false); const [isWalletConnected, setIsWalletConnected] = useState<boolean>(false);
const [walletAddress, setWalletAddress] = useState<string | null>(null); const [walletAddress, setWalletAddress] = useState<string | null>(null);
const [errorMessage, setErrorMessage] = useState<string | null>(null); const [errorMessage, setErrorMessage] = useState<string | null>(null);
const [isApprovedTransfer, setIsApprovedTransfer] = useState<boolean>(false);
// Connect Wallet // Connect Wallet
const handleConnectWallet = async () => { const handleConnectWallet = async () => {
@@ -40,11 +41,9 @@ const TransferTicket = () => {
// Handle transferring the ticket // Handle transferring the ticket
const handleTransferTicket = async () => { const handleTransferTicket = async () => {
if (ticketId !== null) { if (!ticketId) {
if (ticketId < 0) { alert('Please enter a valid Ticket ID.');
alert('Please enter a valid Ticket ID.'); return;
return;
}
} }
if (!ethers.utils.isAddress(recipientAddress)) { if (!ethers.utils.isAddress(recipientAddress)) {
alert('Please enter a valid recipient address.'); alert('Please enter a valid recipient address.');
@@ -57,10 +56,16 @@ const TransferTicket = () => {
const signer = provider.getSigner(); const signer = provider.getSigner();
const contract = getContract().connect(signer); const contract = getContract().connect(signer);
// Call `transferTicket` function let tx;
const tx = await contract.transferTicket(ticketId, recipientAddress); if (isApprovedTransfer) {
const receipt = await tx.wait(); // 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); setTransactionHash(receipt.transactionHash);
console.log( console.log(
'Ticket transferred successfully, transaction hash:', 'Ticket transferred successfully, transaction hash:',
@@ -75,6 +80,40 @@ const TransferTicket = () => {
} }
}; };
// 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 ( return (
<div className="p-4"> <div className="p-4">
<h2>Transfer Ticket</h2> <h2>Transfer Ticket</h2>
@@ -103,13 +142,34 @@ const TransferTicket = () => {
className="border p-2 mb-2" className="border p-2 mb-2"
/> />
{/* Toggle for approved transfer */}
<label className="flex items-center space-x-2 mb-4">
<input
type="checkbox"
checked={isApprovedTransfer}
onChange={() => setIsApprovedTransfer(!isApprovedTransfer)}
/>
<span>Use Approved Transfer</span>
</label>
{/* Transfer Ticket Button */}
<button <button
onClick={handleTransferTicket} onClick={handleTransferTicket}
className="bg-purple-500 text-white px-4 py-2 rounded" className="bg-purple-500 text-white px-4 py-2 rounded mr-2"
> >
Transfer Ticket Transfer Ticket
</button> </button>
{/* Approve Transfer Button */}
{!isApprovedTransfer && (
<button
onClick={handleApproveTransfer}
className="bg-green-500 text-white px-4 py-2 rounded"
>
Approve Transfer
</button>
)}
{errorMessage && <p className="text-red-500 mt-2">{errorMessage}</p>} {errorMessage && <p className="text-red-500 mt-2">{errorMessage}</p>}
{transactionHash && ( {transactionHash && (
<p className="mt-4"> <p className="mt-4">

View File

@@ -159,9 +159,10 @@ contract EventManager {
require(found, "Ticket not found in sender's inventory"); require(found, "Ticket not found in sender's inventory");
// Remove ticket from holder's array // Remove ticket from holder's array
for (; i < userTickets[prevHolder].length; i++) { for (; i < userTickets[prevHolder].length-1; i++) {
userTickets[prevHolder][i] = userTickets[prevHolder][i+1]; userTickets[prevHolder][i] = userTickets[prevHolder][i+1];
} }
userTickets[prevHolder].pop();
// Add ticket to _to's array // Add ticket to _to's array
userTickets[_to].push(_ticketId); userTickets[_to].push(_ticketId);

View File

@@ -2,7 +2,7 @@ import { ethers } from 'ethers';
const FLARE_TESTNET_RPC_URL = 'https://coston2.enosys.global/ext/C/rpc'; const FLARE_TESTNET_RPC_URL = 'https://coston2.enosys.global/ext/C/rpc';
const CONTRACT_ADDRESS = '0xA171873976afaf4b1442c959C2e03b7d52656340'; const CONTRACT_ADDRESS = '0xa12B3168e8FC621493c9db2dc1Db31e75cCA00bb';
export function getFlareProvider() { export function getFlareProvider() {
const flareRpcUrl = FLARE_TESTNET_RPC_URL; const flareRpcUrl = FLARE_TESTNET_RPC_URL;