mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
Refactor new-account.js
(#7312)
* Start refactor * Use import syntax * Add create-account.component * Continue refactor * Add new line * Start using JSX and make tabs a bit more DRY * 👋 bye-bye hyperscript * These can be disabled when active * Start JSX in new account component * 👋 bye-bye hyperscript * Move newAccountNumber into container * Validate newAccountNumber prop
This commit is contained in:
parent
95618d2cdb
commit
7181779576
@ -50,6 +50,7 @@
|
|||||||
color: $curious-blue;
|
color: $curious-blue;
|
||||||
border-bottom: 3px solid $curious-blue;
|
border-bottom: 3px solid $curious-blue;
|
||||||
cursor: initial;
|
cursor: initial;
|
||||||
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
79
ui/app/pages/create-account/create-account.component.js
Normal file
79
ui/app/pages/create-account/create-account.component.js
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
import React, { Component } from 'react'
|
||||||
|
import { Switch, Route, matchPath } from 'react-router-dom'
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
|
import classnames from 'classnames'
|
||||||
|
import NewAccountCreateForm from './new-account.container'
|
||||||
|
import NewAccountImportForm from './import-account'
|
||||||
|
import ConnectHardwareForm from './connect-hardware'
|
||||||
|
import {
|
||||||
|
NEW_ACCOUNT_ROUTE,
|
||||||
|
IMPORT_ACCOUNT_ROUTE,
|
||||||
|
CONNECT_HARDWARE_ROUTE,
|
||||||
|
} from '../../helpers/constants/routes'
|
||||||
|
|
||||||
|
export default class CreateAccountPage extends Component {
|
||||||
|
renderTabs () {
|
||||||
|
const { history, location: { pathname }} = this.props
|
||||||
|
const getClassNames = path => classnames('new-account__tabs__tab', {
|
||||||
|
'new-account__tabs__selected': matchPath(pathname, {
|
||||||
|
path,
|
||||||
|
exact: true,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="new-account__tabs">
|
||||||
|
<div className={getClassNames(NEW_ACCOUNT_ROUTE)} onClick={() => history.push(NEW_ACCOUNT_ROUTE)}>{
|
||||||
|
this.context.t('create')
|
||||||
|
}</div>
|
||||||
|
<div className={getClassNames(IMPORT_ACCOUNT_ROUTE)} onClick={() => history.push(IMPORT_ACCOUNT_ROUTE)}>{
|
||||||
|
this.context.t('import')
|
||||||
|
}</div>
|
||||||
|
<div className={getClassNames(CONNECT_HARDWARE_ROUTE)} onClick={() => history.push(CONNECT_HARDWARE_ROUTE)}>{
|
||||||
|
this.context.t('connect')
|
||||||
|
}</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
render () {
|
||||||
|
return (
|
||||||
|
<div className="new-account">
|
||||||
|
<div className="new-account__header">
|
||||||
|
<div className={`new-account__header ${this.context.t('newAccount')}`}>
|
||||||
|
{this.renderTabs()}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="new-account__form">
|
||||||
|
<Switch>
|
||||||
|
<Route
|
||||||
|
exact={true}
|
||||||
|
path={NEW_ACCOUNT_ROUTE}
|
||||||
|
component={NewAccountCreateForm}
|
||||||
|
/>
|
||||||
|
<Route
|
||||||
|
exact={true}
|
||||||
|
path={IMPORT_ACCOUNT_ROUTE}
|
||||||
|
component={NewAccountImportForm}
|
||||||
|
/>
|
||||||
|
<Route
|
||||||
|
exact={true}
|
||||||
|
path={CONNECT_HARDWARE_ROUTE}
|
||||||
|
component={ConnectHardwareForm}
|
||||||
|
/>
|
||||||
|
</Switch>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CreateAccountPage.propTypes = {
|
||||||
|
location: PropTypes.object,
|
||||||
|
history: PropTypes.object,
|
||||||
|
t: PropTypes.func,
|
||||||
|
}
|
||||||
|
|
||||||
|
CreateAccountPage.contextTypes = {
|
||||||
|
t: PropTypes.func,
|
||||||
|
}
|
20
ui/app/pages/create-account/create-account.container.js
Normal file
20
ui/app/pages/create-account/create-account.container.js
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import { connect } from 'react-redux'
|
||||||
|
import actions from '../../store/actions'
|
||||||
|
import { getCurrentViewContext } from '../../selectors/selectors'
|
||||||
|
import CreateAccountPage from './create-account.component'
|
||||||
|
|
||||||
|
const mapStateToProps = state => ({
|
||||||
|
displayedForm: getCurrentViewContext(state),
|
||||||
|
})
|
||||||
|
|
||||||
|
const mapDispatchToProps = dispatch => ({
|
||||||
|
displayForm: form => dispatch(actions.setNewAccountForm(form)),
|
||||||
|
showQrView: (selected, identity) => dispatch(actions.showQrView(selected, identity)),
|
||||||
|
showExportPrivateKeyModal: () => {
|
||||||
|
dispatch(actions.showModal({ name: 'EXPORT_PRIVATE_KEY' }))
|
||||||
|
},
|
||||||
|
hideModal: () => dispatch(actions.hideModal()),
|
||||||
|
setAccountLabel: (address, label) => dispatch(actions.setAccountLabel(address, label)),
|
||||||
|
})
|
||||||
|
|
||||||
|
export default connect(mapStateToProps, mapDispatchToProps)(CreateAccountPage)
|
@ -1,113 +1 @@
|
|||||||
const Component = require('react').Component
|
export { default } from './create-account.container'
|
||||||
const { Switch, Route, matchPath } = require('react-router-dom')
|
|
||||||
const PropTypes = require('prop-types')
|
|
||||||
const h = require('react-hyperscript')
|
|
||||||
const connect = require('react-redux').connect
|
|
||||||
const actions = require('../../store/actions')
|
|
||||||
const { getCurrentViewContext } = require('../../selectors/selectors')
|
|
||||||
const classnames = require('classnames')
|
|
||||||
const NewAccountCreateForm = require('./new-account')
|
|
||||||
const NewAccountImportForm = require('./import-account')
|
|
||||||
const ConnectHardwareForm = require('./connect-hardware')
|
|
||||||
const {
|
|
||||||
NEW_ACCOUNT_ROUTE,
|
|
||||||
IMPORT_ACCOUNT_ROUTE,
|
|
||||||
CONNECT_HARDWARE_ROUTE,
|
|
||||||
} = require('../../helpers/constants/routes')
|
|
||||||
|
|
||||||
class CreateAccountPage extends Component {
|
|
||||||
renderTabs () {
|
|
||||||
const { history, location } = this.props
|
|
||||||
|
|
||||||
return h('div.new-account__tabs', [
|
|
||||||
h('div.new-account__tabs__tab', {
|
|
||||||
className: classnames('new-account__tabs__tab', {
|
|
||||||
'new-account__tabs__selected': matchPath(location.pathname, {
|
|
||||||
path: NEW_ACCOUNT_ROUTE, exact: true,
|
|
||||||
}),
|
|
||||||
}),
|
|
||||||
onClick: () => history.push(NEW_ACCOUNT_ROUTE),
|
|
||||||
}, [
|
|
||||||
this.context.t('create'),
|
|
||||||
]),
|
|
||||||
|
|
||||||
h('div.new-account__tabs__tab', {
|
|
||||||
className: classnames('new-account__tabs__tab', {
|
|
||||||
'new-account__tabs__selected': matchPath(location.pathname, {
|
|
||||||
path: IMPORT_ACCOUNT_ROUTE, exact: true,
|
|
||||||
}),
|
|
||||||
}),
|
|
||||||
onClick: () => history.push(IMPORT_ACCOUNT_ROUTE),
|
|
||||||
}, [
|
|
||||||
this.context.t('import'),
|
|
||||||
]),
|
|
||||||
h(
|
|
||||||
'div.new-account__tabs__tab',
|
|
||||||
{
|
|
||||||
className: classnames('new-account__tabs__tab', {
|
|
||||||
'new-account__tabs__selected': matchPath(location.pathname, {
|
|
||||||
path: CONNECT_HARDWARE_ROUTE,
|
|
||||||
exact: true,
|
|
||||||
}),
|
|
||||||
}),
|
|
||||||
onClick: () => history.push(CONNECT_HARDWARE_ROUTE),
|
|
||||||
},
|
|
||||||
this.context.t('connect')
|
|
||||||
),
|
|
||||||
])
|
|
||||||
}
|
|
||||||
|
|
||||||
render () {
|
|
||||||
return h('div.new-account', {}, [
|
|
||||||
h('div.new-account__header', [
|
|
||||||
h('div.new-account__title', this.context.t('newAccount')),
|
|
||||||
this.renderTabs(),
|
|
||||||
]),
|
|
||||||
h('div.new-account__form', [
|
|
||||||
h(Switch, [
|
|
||||||
h(Route, {
|
|
||||||
exact: true,
|
|
||||||
path: NEW_ACCOUNT_ROUTE,
|
|
||||||
component: NewAccountCreateForm,
|
|
||||||
}),
|
|
||||||
h(Route, {
|
|
||||||
exact: true,
|
|
||||||
path: IMPORT_ACCOUNT_ROUTE,
|
|
||||||
component: NewAccountImportForm,
|
|
||||||
}),
|
|
||||||
h(Route, {
|
|
||||||
exact: true,
|
|
||||||
path: CONNECT_HARDWARE_ROUTE,
|
|
||||||
component: ConnectHardwareForm,
|
|
||||||
}),
|
|
||||||
]),
|
|
||||||
]),
|
|
||||||
])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CreateAccountPage.propTypes = {
|
|
||||||
location: PropTypes.object,
|
|
||||||
history: PropTypes.object,
|
|
||||||
t: PropTypes.func,
|
|
||||||
}
|
|
||||||
|
|
||||||
CreateAccountPage.contextTypes = {
|
|
||||||
t: PropTypes.func,
|
|
||||||
}
|
|
||||||
|
|
||||||
const mapStateToProps = state => ({
|
|
||||||
displayedForm: getCurrentViewContext(state),
|
|
||||||
})
|
|
||||||
|
|
||||||
const mapDispatchToProps = dispatch => ({
|
|
||||||
displayForm: form => dispatch(actions.setNewAccountForm(form)),
|
|
||||||
showQrView: (selected, identity) => dispatch(actions.showQrView(selected, identity)),
|
|
||||||
showExportPrivateKeyModal: () => {
|
|
||||||
dispatch(actions.showModal({ name: 'EXPORT_PRIVATE_KEY' }))
|
|
||||||
},
|
|
||||||
hideModal: () => dispatch(actions.hideModal()),
|
|
||||||
setAccountLabel: (address, label) => dispatch(actions.setAccountLabel(address, label)),
|
|
||||||
})
|
|
||||||
|
|
||||||
module.exports = connect(mapStateToProps, mapDispatchToProps)(CreateAccountPage)
|
|
||||||
|
91
ui/app/pages/create-account/new-account.component.js
Normal file
91
ui/app/pages/create-account/new-account.component.js
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
import React, { Component } from 'react'
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
|
import { DEFAULT_ROUTE } from '../../helpers/constants/routes'
|
||||||
|
import Button from '../../components/ui/button'
|
||||||
|
|
||||||
|
export default class NewAccountCreateForm extends Component {
|
||||||
|
constructor (props, context) {
|
||||||
|
super(props)
|
||||||
|
const { newAccountNumber = 0 } = props
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
newAccountName: '',
|
||||||
|
defaultAccountName: context.t('newAccountNumberName', [newAccountNumber]),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
render () {
|
||||||
|
const { newAccountName, defaultAccountName } = this.state
|
||||||
|
const { history, createAccount } = this.props
|
||||||
|
const createClick = _ => {
|
||||||
|
createAccount(newAccountName || defaultAccountName)
|
||||||
|
.then(() => {
|
||||||
|
this.context.metricsEvent({
|
||||||
|
eventOpts: {
|
||||||
|
category: 'Accounts',
|
||||||
|
action: 'Add New Account',
|
||||||
|
name: 'Added New Account',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
history.push(DEFAULT_ROUTE)
|
||||||
|
})
|
||||||
|
.catch((e) => {
|
||||||
|
this.context.metricsEvent({
|
||||||
|
eventOpts: {
|
||||||
|
category: 'Accounts',
|
||||||
|
action: 'Add New Account',
|
||||||
|
name: 'Error',
|
||||||
|
},
|
||||||
|
customVariables: {
|
||||||
|
errorMessage: e.message,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="new-account-create-form">
|
||||||
|
<div className="new-account-create-form__input-label">
|
||||||
|
{this.context.t('accountName')}
|
||||||
|
</div>
|
||||||
|
<div className="new-account-create-form__input-wrapper">
|
||||||
|
<input className="new-account-create-form__input"
|
||||||
|
value={newAccountName}
|
||||||
|
placeholder={defaultAccountName}
|
||||||
|
onChange={event => this.setState({ newAccountName: event.target.value })}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="new-account-create-form__buttons">
|
||||||
|
<Button
|
||||||
|
type="default"
|
||||||
|
large={true}
|
||||||
|
className="new-account-create-form__button"
|
||||||
|
onClick={() => history.push(DEFAULT_ROUTE)}
|
||||||
|
>{this.context.t('cancel')}</Button>
|
||||||
|
<Button
|
||||||
|
type="secondary"
|
||||||
|
large={true}
|
||||||
|
className="new-account-create-form__button"
|
||||||
|
onClick={createClick}
|
||||||
|
>{this.context.t('create')}</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NewAccountCreateForm.propTypes = {
|
||||||
|
hideModal: PropTypes.func,
|
||||||
|
showImportPage: PropTypes.func,
|
||||||
|
showConnectPage: PropTypes.func,
|
||||||
|
createAccount: PropTypes.func,
|
||||||
|
numberOfExistingAccounts: PropTypes.number,
|
||||||
|
newAccountNumber: PropTypes.number,
|
||||||
|
history: PropTypes.object,
|
||||||
|
t: PropTypes.func,
|
||||||
|
}
|
||||||
|
|
||||||
|
NewAccountCreateForm.contextTypes = {
|
||||||
|
t: PropTypes.func,
|
||||||
|
metricsEvent: PropTypes.func,
|
||||||
|
}
|
35
ui/app/pages/create-account/new-account.container.js
Normal file
35
ui/app/pages/create-account/new-account.container.js
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
import { connect } from 'react-redux'
|
||||||
|
import actions from '../../store/actions'
|
||||||
|
import NewAccountCreateForm from './new-account.component'
|
||||||
|
|
||||||
|
const mapStateToProps = state => {
|
||||||
|
const { metamask: { network, selectedAddress, identities = {} } } = state
|
||||||
|
const numberOfExistingAccounts = Object.keys(identities).length
|
||||||
|
const newAccountNumber = numberOfExistingAccounts + 1
|
||||||
|
|
||||||
|
return {
|
||||||
|
network,
|
||||||
|
address: selectedAddress,
|
||||||
|
numberOfExistingAccounts,
|
||||||
|
newAccountNumber,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const mapDispatchToProps = dispatch => {
|
||||||
|
return {
|
||||||
|
toCoinbase: address => dispatch(actions.buyEth({ network: '1', address, amount: 0 })),
|
||||||
|
hideModal: () => dispatch(actions.hideModal()),
|
||||||
|
createAccount: newAccountName => {
|
||||||
|
return dispatch(actions.addNewAccount())
|
||||||
|
.then(newAccountAddress => {
|
||||||
|
if (newAccountName) {
|
||||||
|
dispatch(actions.setAccountLabel(newAccountAddress, newAccountName))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
showImportPage: () => dispatch(actions.showImportPage()),
|
||||||
|
showConnectPage: () => dispatch(actions.showConnectPage()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default connect(mapStateToProps, mapDispatchToProps)(NewAccountCreateForm)
|
@ -1,130 +0,0 @@
|
|||||||
const { Component } = require('react')
|
|
||||||
const PropTypes = require('prop-types')
|
|
||||||
const h = require('react-hyperscript')
|
|
||||||
const connect = require('react-redux').connect
|
|
||||||
const actions = require('../../store/actions')
|
|
||||||
const { DEFAULT_ROUTE } = require('../../helpers/constants/routes')
|
|
||||||
import Button from '../../components/ui/button'
|
|
||||||
|
|
||||||
class NewAccountCreateForm extends Component {
|
|
||||||
constructor (props, context) {
|
|
||||||
super(props)
|
|
||||||
|
|
||||||
const { numberOfExistingAccounts = 0 } = props
|
|
||||||
const newAccountNumber = numberOfExistingAccounts + 1
|
|
||||||
|
|
||||||
this.state = {
|
|
||||||
newAccountName: '',
|
|
||||||
defaultAccountName: context.t('newAccountNumberName', [newAccountNumber]),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
render () {
|
|
||||||
const { newAccountName, defaultAccountName } = this.state
|
|
||||||
const { history, createAccount } = this.props
|
|
||||||
|
|
||||||
return h('div.new-account-create-form', [
|
|
||||||
|
|
||||||
h('div.new-account-create-form__input-label', {}, [
|
|
||||||
this.context.t('accountName'),
|
|
||||||
]),
|
|
||||||
|
|
||||||
h('div.new-account-create-form__input-wrapper', {}, [
|
|
||||||
h('input.new-account-create-form__input', {
|
|
||||||
value: newAccountName,
|
|
||||||
placeholder: defaultAccountName,
|
|
||||||
onChange: event => this.setState({ newAccountName: event.target.value }),
|
|
||||||
}, []),
|
|
||||||
]),
|
|
||||||
|
|
||||||
h('div.new-account-create-form__buttons', {}, [
|
|
||||||
|
|
||||||
h(Button, {
|
|
||||||
type: 'default',
|
|
||||||
large: true,
|
|
||||||
className: 'new-account-create-form__button',
|
|
||||||
onClick: () => history.push(DEFAULT_ROUTE),
|
|
||||||
}, [this.context.t('cancel')]),
|
|
||||||
|
|
||||||
h(Button, {
|
|
||||||
type: 'secondary',
|
|
||||||
large: true,
|
|
||||||
className: 'new-account-create-form__button',
|
|
||||||
onClick: () => {
|
|
||||||
createAccount(newAccountName || defaultAccountName)
|
|
||||||
.then(() => {
|
|
||||||
this.context.metricsEvent({
|
|
||||||
eventOpts: {
|
|
||||||
category: 'Accounts',
|
|
||||||
action: 'Add New Account',
|
|
||||||
name: 'Added New Account',
|
|
||||||
},
|
|
||||||
})
|
|
||||||
history.push(DEFAULT_ROUTE)
|
|
||||||
})
|
|
||||||
.catch((e) => {
|
|
||||||
this.context.metricsEvent({
|
|
||||||
eventOpts: {
|
|
||||||
category: 'Accounts',
|
|
||||||
action: 'Add New Account',
|
|
||||||
name: 'Error',
|
|
||||||
},
|
|
||||||
customVariables: {
|
|
||||||
errorMessage: e.message,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
})
|
|
||||||
},
|
|
||||||
}, [this.context.t('create')]),
|
|
||||||
|
|
||||||
]),
|
|
||||||
|
|
||||||
])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NewAccountCreateForm.propTypes = {
|
|
||||||
hideModal: PropTypes.func,
|
|
||||||
showImportPage: PropTypes.func,
|
|
||||||
showConnectPage: PropTypes.func,
|
|
||||||
createAccount: PropTypes.func,
|
|
||||||
numberOfExistingAccounts: PropTypes.number,
|
|
||||||
history: PropTypes.object,
|
|
||||||
t: PropTypes.func,
|
|
||||||
}
|
|
||||||
|
|
||||||
const mapStateToProps = state => {
|
|
||||||
const { metamask: { network, selectedAddress, identities = {} } } = state
|
|
||||||
const numberOfExistingAccounts = Object.keys(identities).length
|
|
||||||
|
|
||||||
return {
|
|
||||||
network,
|
|
||||||
address: selectedAddress,
|
|
||||||
numberOfExistingAccounts,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const mapDispatchToProps = dispatch => {
|
|
||||||
return {
|
|
||||||
toCoinbase: address => dispatch(actions.buyEth({ network: '1', address, amount: 0 })),
|
|
||||||
hideModal: () => dispatch(actions.hideModal()),
|
|
||||||
createAccount: newAccountName => {
|
|
||||||
return dispatch(actions.addNewAccount())
|
|
||||||
.then(newAccountAddress => {
|
|
||||||
if (newAccountName) {
|
|
||||||
dispatch(actions.setAccountLabel(newAccountAddress, newAccountName))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
showImportPage: () => dispatch(actions.showImportPage()),
|
|
||||||
showConnectPage: () => dispatch(actions.showConnectPage()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NewAccountCreateForm.contextTypes = {
|
|
||||||
t: PropTypes.func,
|
|
||||||
metricsEvent: PropTypes.func,
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = connect(mapStateToProps, mapDispatchToProps)(NewAccountCreateForm)
|
|
||||||
|
|
@ -31,7 +31,7 @@ const MobileSyncPage = require('../mobile-sync')
|
|||||||
const AddTokenPage = require('../add-token')
|
const AddTokenPage = require('../add-token')
|
||||||
const ConfirmAddTokenPage = require('../confirm-add-token')
|
const ConfirmAddTokenPage = require('../confirm-add-token')
|
||||||
const ConfirmAddSuggestedTokenPage = require('../confirm-add-suggested-token')
|
const ConfirmAddSuggestedTokenPage = require('../confirm-add-suggested-token')
|
||||||
const CreateAccountPage = require('../create-account')
|
import CreateAccountPage from '../create-account'
|
||||||
|
|
||||||
const Loading = require('../../components/ui/loading-screen')
|
const Loading = require('../../components/ui/loading-screen')
|
||||||
const LoadingNetwork = require('../../components/app/loading-network-screen').default
|
const LoadingNetwork = require('../../components/app/loading-network-screen').default
|
||||||
|
Loading…
Reference in New Issue
Block a user