2018-09-10 09:55:26 -07:00
|
|
|
import Web3 from 'web3';
|
|
|
|
|
2018-09-11 09:16:57 -07:00
|
|
|
interface Web3Window extends Window {
|
|
|
|
web3?: Web3;
|
|
|
|
}
|
|
|
|
|
|
|
|
const resolveWeb3 = (resolve: (web3: Web3) => void, reject: (err: Error) => void) => {
|
2018-09-11 10:18:57 -07:00
|
|
|
if (typeof window === 'undefined') {
|
|
|
|
return reject(new Error('No global window variable'));
|
|
|
|
}
|
|
|
|
|
|
|
|
let { web3 } = window as Web3Window;
|
2018-09-10 09:55:26 -07:00
|
|
|
const localProvider = `http://localhost:8545`;
|
|
|
|
|
|
|
|
// To test what it's like to not have web3, uncomment the reject. Otherwise
|
|
|
|
// localProvider will always kick in.
|
|
|
|
// return reject(new Error('No web3 instance available'));
|
|
|
|
|
2018-10-19 15:03:37 -07:00
|
|
|
if (typeof web3 !== 'undefined') {
|
2018-09-10 09:55:26 -07:00
|
|
|
console.info(`Injected web3 detected.`);
|
|
|
|
web3 = new Web3(web3.currentProvider);
|
|
|
|
} else if (process.env.NODE_ENV !== 'production') {
|
|
|
|
console.info(`No web3 instance injected, using Local web3.`);
|
|
|
|
const provider = new Web3.providers.HttpProvider(localProvider);
|
|
|
|
web3 = new Web3(provider);
|
|
|
|
} else {
|
|
|
|
return reject(new Error('No web3 instance available'));
|
|
|
|
}
|
|
|
|
|
|
|
|
resolve(web3);
|
|
|
|
};
|
|
|
|
|
|
|
|
export default () =>
|
|
|
|
new Promise((resolve, reject) => {
|
|
|
|
// Wait for loading completion to avoid race conditions with web3 injection timing.
|
|
|
|
window.addEventListener(`load`, () => {
|
|
|
|
resolveWeb3(resolve, reject);
|
|
|
|
});
|
|
|
|
// If document has loaded already, try to get Web3 immediately.
|
|
|
|
if (document.readyState === `complete`) {
|
|
|
|
resolveWeb3(resolve, reject);
|
|
|
|
}
|
|
|
|
});
|