import PropTypes from 'prop-types'; import React, { Component } from 'react'; import { getAccountLink } from '@metamask/etherscan-link'; import Button from '../../../components/ui/button'; import Checkbox from '../../../components/ui/check-box'; import Dropdown from '../../../components/ui/dropdown'; import { getURLHostName } from '../../../helpers/utils/util'; import { HardwareDeviceNames } from '../../../../shared/constants/hardware-wallets'; import { MetaMetricsEventCategory } from '../../../../shared/constants/metametrics'; class AccountList extends Component { state = { pathValue: null, }; goToNextPage = () => { // If we have < 5 accounts, it's restricted by BIP-44 if (this.props.accounts.length === 5) { this.props.getPage(this.props.device, 1, this.props.selectedPath); } else { this.props.onAccountRestriction(); } }; goToPreviousPage = () => { this.props.getPage(this.props.device, -1, this.props.selectedPath); }; setPath(pathValue) { this.setState({ pathValue }); } isFirstPage() { return this.props.accounts[0]?.index === 0; } renderHdPathSelector() { const { device, selectedPath, hdPaths, onPathChange } = this.props; const { pathValue } = this.state; return (

{this.context.t('selectHdPath')}

{this.context.t('selectPathHelp')}

{ this.setPath(value); onPathChange(value); }} />
); } capitalizeDevice(device) { return device.slice(0, 1).toUpperCase() + device.slice(1); } renderHeader() { const { device } = this.props; const shouldShowHDPaths = [ HardwareDeviceNames.ledger, HardwareDeviceNames.lattice, HardwareDeviceNames.trezor, ].includes(device.toLowerCase()); return (

{this.context.t('selectAnAccount')}

{shouldShowHDPaths ? this.renderHdPathSelector() : null}

{this.context.t('selectAnAccount')}

); } renderAccounts() { const { accounts, connectedAccounts, rpcPrefs, chainId } = this.props; return (
{accounts.map((account, idx) => { const accountAlreadyConnected = connectedAccounts.includes( account.address.toLowerCase(), ); const value = account.index; const checked = this.props.selectedAccounts.includes(account.index) || accountAlreadyConnected; return (
{ this.props.onAccountChange(value); }} />
{ const accountLink = getAccountLink( account.address, chainId, rpcPrefs, ); this.context.trackEvent({ category: MetaMetricsEventCategory.Accounts, event: 'Clicked Block Explorer Link', properties: { actions: 'Hardware Connect', link_type: 'Account Tracker', block_explorer_domain: getURLHostName(accountLink), }, }); global.platform.openTab({ url: accountLink, }); }} target="_blank" rel="noopener noreferrer" title={this.context.t('etherscanView')} >
); })}
); } renderPagination() { return (
); } renderButtons() { const disabled = this.props.selectedAccounts.length === 0; const buttonProps = {}; if (disabled) { buttonProps.disabled = true; } return (
); } renderForgetDevice() { return (
{this.context.t('forgetDevice')}
); } render() { return (
{this.renderHeader()} {this.renderAccounts()} {this.renderPagination()} {this.renderButtons()} {this.renderForgetDevice()}
); } } AccountList.propTypes = { onPathChange: PropTypes.func.isRequired, selectedPath: PropTypes.string.isRequired, device: PropTypes.string.isRequired, accounts: PropTypes.array.isRequired, connectedAccounts: PropTypes.array.isRequired, onAccountChange: PropTypes.func.isRequired, onForgetDevice: PropTypes.func.isRequired, getPage: PropTypes.func.isRequired, chainId: PropTypes.string, rpcPrefs: PropTypes.object, selectedAccounts: PropTypes.array.isRequired, onUnlockAccounts: PropTypes.func, onCancel: PropTypes.func, onAccountRestriction: PropTypes.func, hdPaths: PropTypes.array.isRequired, }; AccountList.contextTypes = { t: PropTypes.func, trackEvent: PropTypes.func, }; export default AccountList;