1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-10-26 05:13:37 +02:00
metamask-extension/ui/app/pages/permissions-connect/choose-account/choose-account.component.js
Dan J Miller d1e078b8de
Connect flow via popup (#8269)
* Connect screen popup redesign

* Open permission request in notification instead of tab

* Remove no longer user locales

* Update permissions unit test mock to accout for change of opts passed to permissions controller

* Lint fix

* Inline broken line svg in permission-page-container-content.component.js for faster loading

* Add back button to second screen on connect flow

* Add xOfY locale and use for the page count in the connect flow

* Lint fix for svgs permission-page-container-content.component.js

* Fix rebase error

* Lint fix

* Clean up styles on the connect-screen-into-popup branch

* Use closeCurrentWindow to close window on cancel when in full screen connect flow

* Handle errors in rejectPermissionsRequest

* Full screen styles for connect flow

* Lint fixed in permissions-connect and actions.js

* Redirect screen now shows metamask icon instead of users identicon

* Fix subtitle spacing in permissions-connect-header'

* Use window.close instead of closeCurrentWindow() in cancelPermissionsRequest

* Use permissions-connect-header__subtitle in permissions-connect-header.component
2020-04-07 16:08:15 -02:30

216 lines
7.3 KiB
JavaScript

import PropTypes from 'prop-types'
import React, { Component } from 'react'
import classnames from 'classnames'
import Identicon from '../../../components/ui/identicon'
import Button from '../../../components/ui/button'
import CheckBox from '../../../components/ui/check-box'
import Tooltip from '../../../components/ui/tooltip-v2'
import { PRIMARY } from '../../../helpers/constants/common'
import UserPreferencedCurrencyDisplay from '../../../components/app/user-preferenced-currency-display'
import PermissionsConnectHeader from '../../../components/app/permissions-connect-header'
import PermissionsConnectFooter from '../../../components/app/permissions-connect-footer'
export default class ChooseAccount extends Component {
static propTypes = {
accounts: PropTypes.arrayOf(PropTypes.shape({
address: PropTypes.string,
addressLabel: PropTypes.string,
lastConnectedDate: PropTypes.string,
balance: PropTypes.string,
})).isRequired,
selectAccounts: PropTypes.func.isRequired,
selectNewAccountViaModal: PropTypes.func.isRequired,
nativeCurrency: PropTypes.string.isRequired,
addressLastConnectedMap: PropTypes.object,
cancelPermissionsRequest: PropTypes.func.isRequired,
permissionsRequestId: PropTypes.string.isRequired,
selectedAccountAddresses: PropTypes.object.isRequired,
targetDomainMetadata: PropTypes.object,
}
state = {
selectedAccounts: this.props.selectedAccountAddresses,
}
static defaultProps = {
addressLastConnectedMap: {},
}
static contextTypes = {
t: PropTypes.func,
}
handleAccountClick (address) {
const { selectedAccounts } = this.state
const newSelectedAccounts = new Set(selectedAccounts)
if (newSelectedAccounts.has(address)) {
newSelectedAccounts.delete(address)
} else {
newSelectedAccounts.add(address)
}
this.setState({ selectedAccounts: newSelectedAccounts })
}
selectAll () {
const { accounts } = this.props
const newSelectedAccounts = new Set(accounts.map((account) => account.address))
this.setState({ selectedAccounts: newSelectedAccounts })
}
deselectAll () {
this.setState({ selectedAccounts: new Set() })
}
allAreSelected () {
const { accounts } = this.props
const { selectedAccounts } = this.state
return accounts.every(({ address }) => selectedAccounts.has(address))
}
renderAccountsList = () => {
const { accounts, nativeCurrency, addressLastConnectedMap } = this.props
const { selectedAccounts } = this.state
return (
<div className="permissions-connect-choose-account__accounts-list">
{
accounts.map((account, index) => {
const { address, addressLabel, balance } = account
return (
<div
key={`permissions-connect-choose-account-${index}`}
onClick={ () => this.handleAccountClick(address) }
className="permissions-connect-choose-account__account"
>
<div className="permissions-connect-choose-account__account-info-wrapper">
<CheckBox
className="permissions-connect-choose-account__list-check-box"
checked={ selectedAccounts.has(address) }
/>
<Identicon
diameter={34}
address={address}
/>
<div className="permissions-connect-choose-account__account__info">
<div className="permissions-connect-choose-account__account__label">{ addressLabel }</div>
<UserPreferencedCurrencyDisplay
className="permissions-connect-choose-account__account__balance"
type={PRIMARY}
value={balance}
style={{ color: '#6A737D' }}
suffix={nativeCurrency}
hideLabel
/>
</div>
</div>
{ addressLastConnectedMap[address]
? (
<div className="permissions-connect-choose-account__account__last-connected">
<span>{ this.context.t('lastConnected') }</span>
{ addressLastConnectedMap[address] }
</div>
)
: null
}
</div>
)
})
}
</div>
)
}
renderAccountsListHeader () {
const { t } = this.context
const { selectNewAccountViaModal, accounts } = this.props
return (
<div
className={classnames({
'permissions-connect-choose-account__accounts-list-header--one-item': accounts.length === 1,
'permissions-connect-choose-account__accounts-list-header--two-items': accounts.length > 1,
})}
>
{ accounts.length > 1
? (
<div className="permissions-connect-choose-account__select-all">
<CheckBox
className="permissions-connect-choose-account__header-check-box"
checked={this.allAreSelected()}
onClick={() => (this.allAreSelected() ? this.deselectAll() : this.selectAll())}
/>
<div className="permissions-connect-choose-account__text-grey">{ this.context.t('selectAll') }</div>
<Tooltip
position="bottom"
html={(
<div style={{ width: 200, padding: 4 }}>
{t('selectingAllWillAllow')}
</div>
)}
>
<i className="fa fa-info-circle" />
</Tooltip>
</div>
)
: null
}
<div
className="permissions-connect-choose-account__text-blue"
onClick={() => selectNewAccountViaModal(this.handleAccountClick.bind(this))}
>
{ this.context.t('newAccount') }
</div>
</div>
)
}
render () {
const {
selectAccounts,
permissionsRequestId,
cancelPermissionsRequest,
targetDomainMetadata,
accounts,
} = this.props
const { selectedAccounts } = this.state
const { t } = this.context
return (
<div className="permissions-connect-choose-account">
<PermissionsConnectHeader
icon={targetDomainMetadata.icon}
iconName={targetDomainMetadata.origin}
headerTitle={t('connectWithMetaMask')}
headerText={accounts.length > 0
? t('chooseAccountsToUse')
: t('connectAccountOrCreate')
}
/>
{ this.renderAccountsListHeader() }
{ this.renderAccountsList() }
<div className="permissions-connect-choose-account__footer-container">
<PermissionsConnectFooter />
<div className="permissions-connect-choose-account__bottom-buttons">
<Button
onClick={ () => cancelPermissionsRequest(permissionsRequestId) }
type="default"
>
{ t('cancel') }
</Button>
<Button
onClick={ () => selectAccounts(selectedAccounts) }
type="primary"
disabled={ selectedAccounts.size === 0 }
>
{ t('next') }
</Button>
</div>
</div>
</div>
)
}
}