Search code examples
reactjsethereumweb3js

Integrating web3 from Metamask in React


I am new to ReactJS. Seem to be having trouble integrating web3 from Metamask in React. Metamask version: web3@1.0.0-beta.34

import Web3 from 'web3'

let web3;

window.addEventListener('load', function () {
    if (typeof window.web3 !== 'undefined') {        
        web3 = new Web3(window.web3.currentProvider);
    } else {
        // No web 3 provider
        console.log("Please install Metamask");
    }    
});

export default web3;

Getting the following error:

window is not defined
ReferenceError: window is not defined
at Object../lib/getWeb3.js (lib/getWeb3.js:5:0)


Solution

  • window is not defined on Server, only in client's browser, hence you can't use MetaMask server-side. However, you can connect to INFURA when you want to use web3 in your React component server-side or without MetaMask support.

    The simplest way is to use react-web3-provider component.

    Add the Web3Provider to your root React component:

    import Web3Provider from 'react-web3-provider';
    
    ReactDOM.render(
        <Web3Provider
            defaultWeb3Provider="https://mainnet.infura.io/YOUR_API_KEY"
            loading="Loading..."
        >
            <App />
        </Web3Provider>
    )
    

    Then in component where you want to use Web3:

    import { withWeb3 } from 'react-web3-provider';
    
    class MyComponent {
        render() {
            const { web3 } = this.props;
    
            web3.eth.getAccounts(console.log);
    
            // Version 1.0.0-beta.35
            return "Web3 version: {web3.version}";
        }
    }
    
    export default withWeb3(MyComponent);