0

So basically when i try to fill the form and exchange between two accounts , nothing happens and when i check the console sometimes there's no error appearing and sometimes there's this one "Uncaught TypeError: Cannot destructure property 'connectWallet' of 'useContext(...)' as it is undefined." , and there's no data being destructered and sent to the browser , it's empty enter image description here

and it triggers "no accounts found"

this is the console after and click "send" enter image description here

this is my code: TransactionContext.jsx :

    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 checkIfWalletIsConnected = async () => {
        try{
            if(!ethereum) return alert("please install metamask");
        const accounts = await ethereum.request({method: 'eth_accounts'});

        if(accounts.length) {
            setCurrentAccount(accounts[0]);
        }
        else {
            console.log('no accounts found');
        }
        }
        catch (error) {
            console.log(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]);}
        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 parseAmount = ethers.utils.parseEther(amount);

        await ethereum.request({
            method: 'eth_sendTransaction',
            params: [{
                from: currentAccount,
                to: addressTo,
                gas: '0x5208',
                value: parseAmount._hex,

            }]
        });

        const transactionHash = await transactionContract.addToBlockChain(addressTo, parseAmount, message, keyword);
        setIsLoading(true);
        console.log('Loading - ${transactionHash.has}');
        await transactionHash.wait();
        setIsLoading(false);
        console.log('success - ${transactionHash.has}');
        
        const transactionCount = await transactionContract.getTransactionCount();
        setTransactionCount(transactionCount.toNumber());
    
    }
        catch(error) {
            console.log(error);
            throw new Error("No ethereum object.")
        }
    }


    useEffect( () => {
        checkIfWalletIsConnected();
    }, []);



    return (
        <TransactionContext.Provider value={{connectWallet, currentAccount, formData, setFormData, handleChange, sendTransaction}}>
            {children}

        </TransactionContext.Provider>
    );
}

Welcome.jsx

    import {AiFillPlayCircle} from 'react-icons/ai';
import {SiEthereum} from 'react-icons/si';
import {BsInfoCircle} from 'react-icons/bs';
import {Loader} from './';
import { TransactionContext } from '../context/TransactionContext';
import React, {useContext} from 'react';





const commonStyles = "min-h-[70px] sm:px-0 px-2 sm:min-w-[120px] flex justify-center items-center border-[0.5px] border-gray-400 text-sm font-light text-white";

const Input = ({placeholder, name, type, value, handleChange}) => (
  <input 
  placeholder={placeholder}
  type={type}
  step="0.0001"
  value={value}
  onChange={(e) => handleChange(e, name)}
  className="my-2 w-full rounded-sm p-2 outline-none bg-transparent text-white border-none text-sm white-glassmorphism" />

);

const Welcome = () => {

  const {connectWallet, currentAccount, formData, sendTransaction, handleChange} = useContext(TransactionContext);
  



  const handleSubmit = (e) => {

    const { addressTo, amount, keyword, message } = formData;
    e.preventDefault();

    if(!addressTo || !amount || !keyword || !message) return;
    sendTransaction();

  };


    return (
      <div className="flex w-full justify-center items-center">
        <div className="flex mf:flex-row flex-col items-start justify-between md:p-20 py-12 px-4">
          <div className="flex flex-1 justify-start flex-col mf:mr-10 ">
            <h1 className="text-3xl sm:text-5xl text-white text-gradient py-1">
              Send Crypto <br/> across the world
            </h1>
            <p className="text-left mt-5 text-white font-light md:w-9/12 w-11/12 text-base">
              Explore the universe of crypto trade cryptocurrencies smoothly and securely on Krypto 
            </p>
            {!currentAccount && (<button type="button" onClick={connectWallet}
            className="flex flex-row justify-center items-center my-5 bg-[#2952e3] p-3 rounded-full cursor-pointer hover:bg-[2546bd]">
              <p className="text-white text-base font-semibold" >Connect Your Wallet </p>

            </button>)}

            <div className="grid sm:grid-cols-3 grid-cols-2 w-full mt-10">
              <div className={`rounded-tl-2xl ${commonStyles}`}>
                Reliability
              </div>
              <div className={commonStyles}>
                Security
              </div>
              <div className={`rounded-tr-2xl ${commonStyles}`}>
                Ethereum
              </div>
              <div className={`rounded-bl-2xl ${commonStyles}`}>
                Web 3.0
              </div>
              <div className={commonStyles}>
                Low fees
              </div>
              <div className={`rounded-br-2xl ${commonStyles}`}>
                Blockchain
              </div>
            </div>
          </div >

          <div className="flex flex-col flex-1 items-center justify-start w-full mf:mt-0 mt-10">
            <div className="p-3 justify-end items-start flex-col rounded-xl h-40 sm:w-72 w-full my-5 eth-card white-glassmorphism">
              <div className="flex justify-between flex-col w-full h-full">
                <div className="flex justify-between items-start">
                  <div className="w-10 h-10 rounded-full border-2 border-white flex justify-center items-center">
                    <SiEthereum fontSize={21} color="#fff"/>
                  </div>
                  <BsInfoCircle fontSize={17} color="fff"/>
                </div>
                <div>
                  <p className="text-white font-light text-sm ">
                    Address
                  </p>
                  <p className="text-white font-semibold text-lg mt-1 ">
                    Ethereum
                  </p>
                </div>
              </div>
            </div>

            <div className="p-5 sm:w-96 w-full flex flex-col justify-start items-center blue-glassmorphism">
              <Input placeholder="Address to" name="addressTo" type="text" handleChange={handleChange} />
              <Input placeholder="Amount of (ETH) " name="amount" type="number" handleChange={handleChange} />
              <Input placeholder="Keyword (Gif)" name="Keyword" type="text" handleChange={handleChange} />
              <Input placeholder="Enter message" name="message" type="text" handleChange={handleChange} />
              <div className ="h-[1px] w-full bg-gray-400 my-2"/>
              {false ? (
                <Loader/>
              ) : (
                <button
                type="button" onClick={handleSubmit}
                className="text-white w-full mt-2 border-[1px] p-2 border-[#3d4f7c] rounded-full cursor-pointer">

                  Send

                </button>
              )}
            
            </div>
            
          </div>
        </div>
      </div>
    );
  }
  export default Welcome;

Main.jsx

import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'
import './index.css'
import {TransactionProvider} from './context/TransactionContext';

ReactDOM.render(
  <TransactionProvider>

  <React.StrictMode>
    <App />
  </React.StrictMode>
  </TransactionProvider>,

  document.getElementById('root')
)
Raed.n
  • 1
  • 1

0 Answers0