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}
);
};