diff --git a/src/App.css b/src/App.css index 74b5e05345..a60f767e6f 100644 --- a/src/App.css +++ b/src/App.css @@ -36,3 +36,7 @@ transform: rotate(360deg); } } + +#disconnectbtn, #accounts-container { + display: none; +} \ No newline at end of file diff --git a/src/App.js b/src/App.js index 695b12889a..2fc4b30e36 100644 --- a/src/App.js +++ b/src/App.js @@ -7,8 +7,22 @@ function App() { const openModal = () => { p.onConnect() } + + const disconnect = () => { + p.onDisconnect() + } + + const showButtons = (connected = true) =>{ + document.getElementById("disconnectbtn").style.display = document.getElementById("accounts-container").style.display = connected? 'block':'none'; + document.getElementById("connectbtn").style.display = connected? 'none':'block'; + } + p.internalEvents.on('accountsChanged', (accounts) => { - document.getElementById('accounts').innerHTML = JSON.stringify(accounts) + document.getElementById('accounts').innerHTML = "" + for(const account of accounts){ + document.getElementById('accounts').innerHTML += `
  • ${account}
  • ` + } + showButtons(accounts.length > 0) }) p.internalEvents.on('chainChanged', (chain) => { @@ -18,14 +32,18 @@ function App() { p.internalEvents.on('disconnect', (chain) => { document.getElementById('accounts').innerHTML = '' document.getElementById('chain').innerHTML = '' + showButtons(false) }) return (
    -
    - +
    + + +
    +
    +


      +
      -
      -
      ); } diff --git a/src/RemixClient.js b/src/RemixClient.js index e13aeb14a6..f6e8f8416c 100644 --- a/src/RemixClient.js +++ b/src/RemixClient.js @@ -1,5 +1,9 @@ -import { PluginClient } from '@remixproject/plugin'; -import { createClient } from '@remixproject/plugin-iframe'; +import { + PluginClient +} from '@remixproject/plugin'; +import { + createClient +} from '@remixproject/plugin-webview'; import WalletConnectProvider from "@walletconnect/web3-provider"; import Torus from "@toruslabs/torus-embed"; import Authereum from "authereum"; @@ -11,143 +15,180 @@ import EventManager from "events" export class RemixClient extends PluginClient { - constructor() { - super(); - this.methods = ["sendAsync"]; - this.internalEvents = new EventManager() - createClient(this); - this.onload() + constructor() { + super(); + this.methods = ["sendAsync"]; + this.internalEvents = new EventManager() + createClient(this); + this.onload() - this.web3Modal = new Web3Modal({ - providerOptions: this.getProviderOptions() // required - }); - } + this.web3Modal = new Web3Modal({ + providerOptions: this.getProviderOptions() // required + }); + } - async init() { - const currentTheme = await this.call('theme', 'currentTheme') - console.log('theme', currentTheme) - this.web3Modal.updateTheme(currentTheme.quality) + async init() { + const currentTheme = await this.call('theme', 'currentTheme') + console.log('theme', currentTheme) + this.web3Modal.updateTheme(currentTheme.quality) - this.on('theme', 'themeChanged', (theme) => { - this.web3Modal.updateTheme(theme.quality) - console.log('theme', theme) - }) + this.on('theme', 'themeChanged', (theme) => { + this.web3Modal.updateTheme(theme.quality) + console.log('theme', theme) + }) + } + + /** + * Connect wallet button pressed. + */ + async onConnect() { + + console.log("Opening a dialog", this.web3Modal); + try { + this.provider = await this.web3Modal.connect(); + } catch (e) { + console.log("Could not get a wallet connection", e); + return; } - /** - * Connect wallet button pressed. - */ - async onConnect() { - - console.log("Opening a dialog", this.web3Modal); - try { - this.provider = await this.web3Modal.connect(); - } catch(e) { - console.log("Could not get a wallet connection", e); - return; - } + this.internalEvents.emit('accountsChanged', this.provider.accounts || []) + this.internalEvents.emit('chainChanged', await this.detectNetwork(this.provider.chainId)) - this.internalEvents.emit('accountsChanged', this.provider.accounts || []) - this.internalEvents.emit('chainChanged', this.provider.chainId) + // Subscribe to accounts change + this.provider.on("accountsChanged", (accounts) => { + this.internalEvents.emit('accountsChanged', accounts || []) + }); + + // Subscribe to chainId change + this.provider.on("chainChanged", async (chainId) => { + this.internalEvents.emit('chainChanged', await this.detectNetwork(chainId)) + }); + + // Subscribe to networkId change + this.provider.on("networkChanged", (networkId) => { + this.internalEvents.emit('networkChanged', networkId) + }); + + // Subscribe to networkId change + this.provider.on("disconnect", () => { + this.internalEvents.emit('disconnect') + }); + } - // Subscribe to accounts change - this.provider.on("accountsChanged", (accounts) => { - this.internalEvents.emit('accountsChanged', accounts || []) - }); + async detectNetwork(id) { - // Subscribe to chainId change - this.provider.on("chainChanged", (chainId) => { - this.internalEvents.emit('chainChanged', chainId) - }); + let networkName = null; - // Subscribe to networkId change - this.provider.on("networkChanged", (networkId) => { - this.internalEvents.emit('networkChanged', networkId) - }); + // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md + if (id === 1) networkName = "Main"; + else if (id === 2) networkName = "Morden (deprecated)"; + else if (id === 3) networkName = "Ropsten"; + else if (id === 4) networkName = "Rinkeby"; + else if (id === 5) networkName = "Goerli"; + else if (id === 42) networkName = "Kovan"; + else networkName = "Custom"; + return networkName - // Subscribe to networkId change - this.provider.on("disconnect", () => { - this.internalEvents.emit('disconnect') - }); + } + + /** + * Disconnect wallet button pressed. + */ + async onDisconnect() { + + // TODO: Which providers have close method? + if (this.provider && this.provider.close) { + await this.provider.close(); + + // If the cached provider is not cleared, + // WalletConnect will default to the existing session + // and does not allow to re-scan the QR code with a new wallet. + // Depending on your use case you may want or want not his behavir. + await this.web3Modal.clearCachedProvider(); + this.provider = null; + } else { + this.internalEvents.emit('disconnect') } - getProviderOptions () { - const providerOptions = { - walletconnect: { - package: WalletConnectProvider, - options: { - infuraId: '83d4d660ce3546299cbe048ed95b6fad' - } - }, - torus: { - package: Torus, // required - options: {} - }, - authereum: { - package: Authereum - }, - burnerconnect: { - package: BurnerConnectProvider, // required - options: { - defaultNetwork: "100" - } - }, - mewconnect: { - package: MewConnect, // required - options: { - infuraId: "83d4d660ce3546299cbe048ed95b6fad" // required - } - } - /*, - fortmatic: { - package: Fortmatic, - options: { - key: process.env.REACT_APP_FORTMATIC_KEY - } - }, - authereum: { - package: Authereum - }, - portis: { - package: Portis, // required - options: { - id: "PORTIS_ID" // required - } - }, - squarelink: { - package: Squarelink, // required - options: { - id: "SQUARELINK_ID" // required - } - }, - arkane: { - package: Arkane, // required - options: { - clientId: "ARKANE_CLIENT_ID" // required - } - }, - dcentwallet: { - package: DcentProvider, // required - options: { - rpcUrl: "INSERT_RPC_URL" // required - } - }*/ - }; - return providerOptions; - }; + } - sendAsync = (data) => { - return new Promise((resolve, reject) => { - if (this.provider) { - this.provider.sendAsync(data, (error, message) => { - // console.log('in plugin', data, error, message) - if (error) return reject(error) - resolve(message) - }) - } else { - return reject('Provider not loaded') - } + getProviderOptions() { + const providerOptions = { + walletconnect: { + package: WalletConnectProvider, + options: { + infuraId: '83d4d660ce3546299cbe048ed95b6fad', + } + }, + torus: { + package: Torus, // required + options: {} + }, + authereum: { + package: Authereum + }, + burnerconnect: { + package: BurnerConnectProvider, // required + options: { + defaultNetwork: "100" + } + }, + mewconnect: { + package: MewConnect, // required + options: { + infuraId: "83d4d660ce3546299cbe048ed95b6fad" // required + } + } + /*, + fortmatic: { + package: Fortmatic, + options: { + key: process.env.REACT_APP_FORTMATIC_KEY + } + }, + authereum: { + package: Authereum + }, + portis: { + package: Portis, // required + options: { + id: "PORTIS_ID" // required + } + }, + squarelink: { + package: Squarelink, // required + options: { + id: "SQUARELINK_ID" // required + } + }, + arkane: { + package: Arkane, // required + options: { + clientId: "ARKANE_CLIENT_ID" // required + } + }, + dcentwallet: { + package: DcentProvider, // required + options: { + rpcUrl: "INSERT_RPC_URL" // required + } + }*/ + }; + return providerOptions; + }; + + sendAsync = (data) => { + return new Promise((resolve, reject) => { + if (this.provider) { + this.provider.sendAsync(data, (error, message) => { + // console.log('in plugin', data, error, message) + if (error) return reject(error) + resolve(message) }) - } + } else { + return reject('Provider not loaded') + } + }) } +} \ No newline at end of file