TransactionContext.jsx
unknown
javascript
4 years ago
3.6 kB
15
Indexable
import React, { useEffect, useState } from 'react';
import { ethers } from 'ethers';
import { contractABI, contractAddress } from '../utils/constants';
export const TransactionContext = React.createContext();
const { ethereum } = window;
const getEthereumContract = () => {
const provider = new ethers.providers.Web3Provider(ethereum);
const signer = provider.getSigner();
const transactionContract = new ethers.Contract(
contractAddress,
contractABI,
signer
);
return transactionContract;
};
export const TransactionProvider = ({ children }) => {
const [currentAccount, setCurrentAccount] = useState('');
const [formData, setFormData] = useState({
addressTo: '',
amount: '',
keyword: '',
message: '',
});
const [isLoading, setIsLoading] = useState(false);
const [transactionCount, setTransactionCount] = useState(
localStorage.getItem('transactionCount')
);
const handleChange = (e, name) => {
setFormData((prevState) => ({ ...prevState, [name]: e.target.value }));
};
const checkIfWalletIsConnect = async () => {
try {
if (!ethereum) return alert('Please install MetaMask.');
const accounts = await ethereum.request({ method: 'eth_accounts' });
console.log(accounts);
if (accounts.length) {
setCurrentAccount(accounts[0]);
// getAllTransactions();
} else {
console.log('No accounts found');
}
} catch (error) {
throw new Error('No ethereum object');
}
};
const connectWallet = async () => {
try {
if (!ethereum) return alert('Please install MetaMask.');
const accounts = await ethereum.request({
method: 'eth_requestAccounts',
});
setCurrentAccount(accounts[0]); // sets first account as current account
window.location.reload();
} catch (error) {
console.log(error);
throw new Error('No ethereum object');
}
};
const sendTransaction = async () => {
try {
if (!ethereum) return alert('Please install metamask');
const { addressTo, amount, keyword, message } = formData;
const transactionContract = getEthereumContract();
const parsedAmount = ethers.utils.parseEther(amount);
// Send the transaction
await ethereum.request({
method: 'eth_sendTransaction',
params: [
{
from: currentAccount,
to: addressTo,
gas: '0x5208', //21000 Gwei
value: parsedAmount._hex,
},
],
});
// Function to store the above taken tx
const transactionHash = await transactionContract.addToBlockchain(
addressTo,
parsedAmount,
message,
keyword
);
setisLoading(true);
console.log(`Loading - ${transactionHash.hash}`);
await transactionHash.wait();
setisLoading(false);
console.log(`Success - ${transactionHash.hash}`);
const transactionCount = await transactionContract.getTransactionCount();
setTransactionCount(transactionCount.toNumber());
window.location.reload();
//get the data from the form
} catch (error) {
console.log(error);
throw new Error('No ethereum object');
}
};
useEffect(() => {
checkIfWalletIsConnect();
}, []);
return (
<TransactionContext.Provider
value={{
connectWallet,
currentAccount,
formData,
setFormData,
handleChange,
sendTransaction,
}}
>
{children}
</TransactionContext.Provider>
);
};
Editor is loading...