TransactionContext.jsx
unknown
javascript
3 years ago
3.6 kB
10
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...