philips-software/cogito

View on GitHub
workspaces/cogito-ethereum/source/getWeb3.js

Summary

Maintainability
A
1 hr
Test Coverage
A
100%
import Web3 from 'web3'

const getProviderURL = () => {
  if (process.env.NODE_ENV === 'production') {
    return process.env.REACT_APP_WEB3_PROVIDER_URL_PRODUCTION
  }

  return process.env.REACT_APP_WEB3_PROVIDER_URL || 'ws://localhost:8545'
}

const useLocalWeb3Provider = () => {
  const provider = new Web3.providers.WebsocketProvider(getProviderURL())
  return new Web3(provider)
}

const resolveWeb3 = (resolve) => {
  let { web3 } = window || /* istanbul ignore next: cumbersone to test as window is read-only */ {}
  const alreadyInjected = typeof web3 !== 'undefined' // i.e. Mist/Metamask

  if (alreadyInjected) {
    console.log('Injected web3 detected.')
    web3 = new Web3(web3.currentProvider)
  } else {
    console.log('No web3 instance injected, using Local web3.')
    web3 = useLocalWeb3Provider()
  }

  resolve(web3)
}

const getWeb3 = () =>
  new Promise((resolve) => {
    if (process.env.REACT_APP_USE_INJECTED_WEB3 === 'YES') {
      console.log('will try to use injected web3 if possible')
      /* istanbul ignore else  */
      if (document.readyState === 'complete') {
        resolveWeb3(resolve)
      } else {
        window.addEventListener(`load`, () => {
          resolveWeb3(resolve)
        })
      }
    } else {
      console.log('will not use injected web3 even if it is there')
      resolve(useLocalWeb3Provider())
    }
  })

export { getWeb3 }