1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00
Dan J Miller d8179ff030
Connect Screen Multi Select (#8078)
* Add UI for selecting multiple accounts on the first permissions connect screen

* Make accounts list scrollable on connect screen

* Change title wording on connect screen to 'select your accounts'

* Add select all tooltip to info circle on top of connect screen account list

* Add security info footer to the first screen of the connect flow

* Apply redesigns to page 2 of connect flow

* Display number of accounts on connect flow second screen if there are multiple to connect

* Update e2e tests for connect screen multi-select changes

* Remove unused chooseAnAcount message

* Fix styling/display of redirect elements on second page of connect flow

* Assorted small fixes in permissions connect

* Remove unnecessary tiny delays in spec files

* Remove incorrect use of bem modified in choose-account

* Remove unused locale

* Use Set for managing selected accounts in choose-acount and permissions-connect componets

* Compone!

* Move connect flow header into a reusable component, and implement new header designs

* Update locales and add missing locales

* Improve permission list item design (second screen of connect flow)

* Check box component improvements

* Fixes in variables.scss

* Simplfy code in selectAll of choose-account.component

* Hide checkboxes on first pages on connect flow when there is only one account

* Allow autofill of default new account modal text with right arrow

* Disable next button on first screen of connect flow when no accounts selected

* Improve choose-account/index.scss

* Remove metamask secure graphic

* Fix connect flow redirect screen

* Fix connectToMultiple locale

* Remove locales no longer used after connect flow multiple connect updates

* Fix size of dapp icon on redirect screen of connect flow

* Clean up choose-account code

* Stop using placeholder in new-account-modal

* Remove unused styles in permission-page-container/index.scss

* Pass origin instead of site name to PermissionsConnectHeader in connect flow

* Make iconName a required prop in permissions-connect-header

* Show checkbox in cases where there is one account in the choose-account list

* Do not render select all checkbox when only 1 list item, instead of just hiding it

* Small cleanup in choose-account/index.scss
2020-04-02 06:39:53 -02:30

152 lines
5.1 KiB
JavaScript

import PropTypes from 'prop-types'
import React, { PureComponent } from 'react'
import Identicon from '../../../ui/identicon'
import IconWithFallBack from '../../../ui/icon-with-fallback'
import PermissionsConnectHeader from '../../permissions-connect-header'
import classnames from 'classnames'
export default class PermissionPageContainerContent extends PureComponent {
static propTypes = {
domainMetadata: PropTypes.object.isRequired,
selectedPermissions: PropTypes.object.isRequired,
permissionsDescriptions: PropTypes.object.isRequired,
onPermissionToggle: PropTypes.func.isRequired,
selectedIdentities: PropTypes.array,
redirect: PropTypes.bool,
permissionRejected: PropTypes.bool,
}
static defaultProps = {
redirect: null,
permissionRejected: null,
selectedIdentities: [],
}
static contextTypes = {
t: PropTypes.func,
}
renderRedirect () {
const { t } = this.context
const { permissionRejected, selectedIdentities, domainMetadata } = this.props
return (
<div className="permission-result">
{ permissionRejected ? t('cancelling') : t('connecting') }
<div className="permission-result__icons">
<IconWithFallBack icon={domainMetadata.icon} name={domainMetadata.name} />
<div className="permission-result__center-icon">
{ permissionRejected
? <span className="permission-result__reject" ><i className="fa fa-times-circle" /></span>
: <span className="permission-result__check" />
}
<img className="permission-result__broken-line" src="/images/broken-line.svg" />
</div>
<div className="permission-result__identicon-container">
<div className="permission-result__identicon-border">
<Identicon
className="permission-result__identicon"
address={selectedIdentities[0].address}
diameter={54}
/>
</div>
</div>
</div>
</div>
)
}
renderRequestedPermissions () {
const {
selectedPermissions, permissionsDescriptions, onPermissionToggle,
} = this.props
const { t } = this.context
const items = Object.keys(selectedPermissions).map((methodName) => {
// the request will almost certainly be reject by rpc-cap if this happens
if (!permissionsDescriptions[methodName]) {
console.warn(`Unknown permission requested: ${methodName}`)
}
const description = permissionsDescriptions[methodName] || methodName
// don't allow deselecting eth_accounts
const isDisabled = methodName === 'eth_accounts'
return (
<div
className="permission-approval-container__content__permission"
key={methodName}
onClick={() => {
if (!isDisabled) {
onPermissionToggle(methodName)
}
}}
>
{ selectedPermissions[methodName]
? <i title={t('permissionCheckedIconDescription')} className="fa fa-check-square" />
: <i title={t('permissionUncheckedIconDescription')} className="fa fa-square" />
}
<label>{description}</label>
</div>
)
})
return (
<div className="permission-approval-container__content__requested">
{items}
<div className="permission-approval-container__content__revoke-note">{ t('revokeInPermissions') }</div>
</div>
)
}
render () {
const { domainMetadata, redirect, permissionRejected, selectedIdentities } = this.props
const { t } = this.context
let titleArgs
if (redirect && permissionRejected) {
titleArgs = [ 'cancelledConnectionWithMetaMask' ]
} else if (redirect) {
titleArgs = [ 'connectingWithMetaMask' ]
} else if (domainMetadata.extensionId) {
titleArgs = [ 'externalExtension', [domainMetadata.extensionId] ]
} else if (selectedIdentities.length > 1) {
titleArgs = ['connectToMultiple', [ selectedIdentities.length ] ]
} else {
titleArgs = [
'connectTo', [
`${selectedIdentities[0].label} (...${selectedIdentities[0].address.slice(selectedIdentities[0].address.length - 4)})`,
],
]
}
return (
<div
className={classnames('permission-approval-container__content', {
'permission-approval-container__content--redirect': redirect,
})}
>
{ !redirect
? (
<div>
<PermissionsConnectHeader
icon={domainMetadata.icon}
iconName={domainMetadata.origin}
headerTitle={t(...titleArgs)}
headerText={ domainMetadata.extensionId
? t('thisWillAllowExternalExtension', [domainMetadata.extensionId])
: t('thisWillAllow', [domainMetadata.origin])
}
/>
<section className="permission-approval-container__permissions-container">
{ this.renderRequestedPermissions() }
</section>
</div>
)
: this.renderRedirect()
}
</div>
)
}
}