import React from 'react'; import { connect } from 'react-redux'; import { toChecksumAddress } from 'ethereumjs-util'; import { CopyToClipboard } from 'react-copy-to-clipboard'; import { Identicon, UnitDisplay, Address, NewTabLink } from 'components/ui'; import { IWallet, Balance, TrezorWallet, LedgerWallet } from 'libs/wallet'; import translate from 'translations'; import Spinner from 'components/ui/Spinner'; import { getNetworkConfig, getOffline } from 'selectors/config'; import { AppState } from 'reducers'; import { NetworkConfig } from 'types/network'; import { TSetAccountBalance, setAccountBalance } from 'actions/wallet'; import './AccountInfo.scss'; interface OwnProps { wallet: IWallet; } interface StateProps { balance: Balance; network: NetworkConfig; isOffline: boolean; } interface State { showLongBalance: boolean; address: string; confirmAddr: boolean; copied: boolean; } interface DispatchProps { setAccountBalance: TSetAccountBalance; } type Props = OwnProps & StateProps & DispatchProps; class AccountInfo extends React.Component { public state = { showLongBalance: false, address: '', confirmAddr: false, copied: false }; public setAddressFromWallet() { const address = this.props.wallet.getAddressString(); if (address !== this.state.address) { this.setState({ address }); } } public componentDidMount() { this.setAddressFromWallet(); } public componentDidUpdate() { this.setAddressFromWallet(); } public toggleConfirmAddr = () => { this.setState(state => { return { confirmAddr: !state.confirmAddr }; }); }; public toggleShowLongBalance = (e: React.FormEvent) => { e.preventDefault(); this.setState(state => { return { showLongBalance: !state.showLongBalance }; }); }; public onCopy = () => { this.setState(state => { return { copied: !state.copied }; }); setTimeout(() => { this.setState({ copied: false }); }, 2000); }; public render() { const { network, balance, isOffline } = this.props; const { address, showLongBalance, confirmAddr } = this.state; let blockExplorer; let tokenExplorer; if (!network.isCustom) { // this is kind of ugly but its the result of typeguards, maybe we can find a cleaner solution later on such as just dedicating it to a selector blockExplorer = network.blockExplorer; tokenExplorer = network.tokenExplorer; } const wallet = this.props.wallet as LedgerWallet | TrezorWallet; return (
{translate('SIDEBAR_ACCOUNTADDR')}
{this.state.copied ? 'copied!' : 'copy address'}
{typeof wallet.displayAddress === 'function' && (
{ this.toggleConfirmAddr(); wallet .displayAddress() .then(() => this.toggleConfirmAddr()) .catch(e => { this.toggleConfirmAddr(); throw new Error(e); }); }} > {confirmAddr ? null : translate('SIDEBAR_DISPLAY_ADDR', { $wallet: wallet.getWalletType() })} {confirmAddr ? ( Confirm address on {wallet.getWalletType()} ) : null}
)}
{translate('SIDEBAR_ACCOUNTBAL')}
  • {balance.wei && ( {balance.isPending ? ( ) : ( !isOffline && ( ) )} )}
{(!!blockExplorer || !!tokenExplorer) && (
{translate('SIDEBAR_TRANSHISTORY')}
    {!!blockExplorer && (
  • {`${network.name} (${blockExplorer.origin})`}
  • )} {!!tokenExplorer && (
  • {`Tokens (${tokenExplorer.name})`}
  • )}
)}
); } } function mapStateToProps(state: AppState): StateProps { return { balance: state.wallet.balance, network: getNetworkConfig(state), isOffline: getOffline(state) }; } const mapDispatchToProps: DispatchProps = { setAccountBalance }; export default connect(mapStateToProps, mapDispatchToProps)(AccountInfo);