import React, {useContext} from 'react'; import {EventData} from 'xstate'; import './wallet.scss'; import {Button, Box, Flex, Icon, Text, MetaMaskButton, Flash, Heading} from 'rimble-ui'; import ConnectionBanner from '@rimble/connection-banner'; import RimbleUtils from '@rimble/utils'; import {WorkflowState} from '../workflows/ethereum-enable'; import {WindowContext} from './window-context'; import {CHAIN_NETWORK_ID} from '../config'; import {track} from '../segment-analytics'; interface Props { current: WorkflowState; send: (event: any, payload?: EventData | undefined) => WorkflowState; } export const EnableEthereum = (props: Props) => { const {current: currentState, send: _send} = props; const send = (event: 'USER_APPROVES_ENABLE' | 'USER_REJECTS_ENABLE') => () => { track(event, {enabledAddress: currentState.context.enabledAddress}); _send(event); }; const targetNetwork = Number(CHAIN_NETWORK_ID); const window = useContext(WindowContext); const chainId = window?.ethereum?.chainId; const currentNetwork = chainId && Number(chainId); const metaMaskButton = (disabled, message) => ( {message} ); const NoNetwork = () => (
Install the MetaMask browser extension to use our blockchain features in your current browser Install MetaMask
); const WrongNetwork = () => (
Switch to the {RimbleUtils.getEthNetworkNameById(targetNetwork)} network in MetaMask To use our blockchain features, you need to be on the{' '} {RimbleUtils.getEthNetworkNameById(targetNetwork)} network. You are currently on{' '} {RimbleUtils.getEthNetworkNameById(currentNetwork)}.
); const NotWeb3Browser = () => (
Your browser does not support our blockchain features {RimbleUtils.isMobileDevice() ? ( Try a mobile wallet browser like Status, Coinbase wallet or Cipher ) : ( Switch to either Brave, FireFox, Opera, or Chrome to continue )}
); const button = () => { switch (currentState.value.toString()) { case 'explainToUser': case 'retry': return metaMaskButton(false, 'Connect with MetaMask'); case 'enabling': return metaMaskButton(true, 'Connecting..'); case 'done': return metaMaskButton(true, 'Connected!'); case 'failure': return metaMaskButton(true, 'Connection failed :('); default: return ''; } }; const connectionBanner = ( {{ notWeb3CapableBrowserMessage: , noNetworkAvailableMessage: , onWrongNetworkMessage: }} ); const prompt = ( Connect to Blockchain This app uses state channels. It order to continue you need to connect to the blockchain.
{button()}
Cancel
); // need currentNetwork to be defined, and equal to the targetNetwork return currentNetwork === targetNetwork ? ( prompt ) : (
{connectionBanner}
); };