aboutsummaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authorDan <danjm.com@gmail.com>2018-06-07 03:10:43 +0800
committerDan <danjm.com@gmail.com>2018-06-07 03:10:43 +0800
commitae55e8a3c122a3f6d91e28153124bfb6a13ded84 (patch)
treeb23043409b2877bce4096d411f3c3273a610b146 /ui
parentaee9247faab984734d2f0278baaf768e2a7926d2 (diff)
parent1fb408f62eb081311937420bb42da6c835510590 (diff)
downloadtangerine-wallet-browser-ae55e8a3c122a3f6d91e28153124bfb6a13ded84.tar
tangerine-wallet-browser-ae55e8a3c122a3f6d91e28153124bfb6a13ded84.tar.gz
tangerine-wallet-browser-ae55e8a3c122a3f6d91e28153124bfb6a13ded84.tar.bz2
tangerine-wallet-browser-ae55e8a3c122a3f6d91e28153124bfb6a13ded84.tar.lz
tangerine-wallet-browser-ae55e8a3c122a3f6d91e28153124bfb6a13ded84.tar.xz
tangerine-wallet-browser-ae55e8a3c122a3f6d91e28153124bfb6a13ded84.tar.zst
tangerine-wallet-browser-ae55e8a3c122a3f6d91e28153124bfb6a13ded84.zip
Merge branch 'develop' into i3725-refactor-send-component-
Diffstat (limited to 'ui')
-rw-r--r--ui/app/actions.js10
-rw-r--r--ui/app/app.js7
-rw-r--r--ui/app/components/account-menu/index.js7
-rw-r--r--ui/app/components/pages/add-token/add-token.component.js6
-rw-r--r--ui/app/components/pages/create-account/import-account/json.js24
-rw-r--r--ui/app/components/pages/create-account/import-account/private-key.js25
-rw-r--r--ui/app/components/pages/create-account/index.js15
-rw-r--r--ui/app/components/pages/settings/index.js9
-rw-r--r--ui/app/components/pages/unlock-page/unlock-page.component.js2
-rw-r--r--ui/app/components/wallet-view.js12
-rw-r--r--ui/app/reducers.js7
-rw-r--r--ui/app/reducers/identities.js15
-rw-r--r--ui/app/welcome-screen.js14
13 files changed, 90 insertions, 63 deletions
diff --git a/ui/app/actions.js b/ui/app/actions.js
index 465b3d5fe..1edf692b6 100644
--- a/ui/app/actions.js
+++ b/ui/app/actions.js
@@ -558,10 +558,12 @@ function importNewAccount (strategy, args) {
}
dispatch(actions.hideLoadingIndication())
dispatch(actions.updateMetamaskState(newState))
- dispatch({
- type: actions.SHOW_ACCOUNT_DETAIL,
- value: newState.selectedAddress,
- })
+ if (newState.selectedAddress) {
+ dispatch({
+ type: actions.SHOW_ACCOUNT_DETAIL,
+ value: newState.selectedAddress,
+ })
+ }
return newState
}
}
diff --git a/ui/app/app.js b/ui/app/app.js
index 09f7fdef4..ec2329463 100644
--- a/ui/app/app.js
+++ b/ui/app/app.js
@@ -99,7 +99,7 @@ class App extends Component {
} = this.props
const isLoadingNetwork = network === 'loading' && currentView.name !== 'config'
const loadMessage = loadingMessage || isLoadingNetwork ?
- this.getConnectingLabel() : null
+ this.getConnectingLabel(loadingMessage) : null
log.debug('Main ui render function')
return (
@@ -210,7 +210,10 @@ class App extends Component {
}
}
- getConnectingLabel = function () {
+ getConnectingLabel = function (loadingMessage) {
+ if (loadingMessage) {
+ return loadingMessage
+ }
const { provider } = this.props
const providerName = provider.type
diff --git a/ui/app/components/account-menu/index.js b/ui/app/components/account-menu/index.js
index 7638995ea..f34631ca8 100644
--- a/ui/app/components/account-menu/index.js
+++ b/ui/app/components/account-menu/index.js
@@ -135,11 +135,12 @@ AccountMenu.prototype.renderAccounts = function () {
showAccountDetail,
} = this.props
- return Object.keys(identities).map((key, index) => {
- const identity = identities[key]
+ const accountOrder = keyrings.reduce((list, keyring) => list.concat(keyring.accounts), [])
+ return accountOrder.map((address) => {
+ const identity = identities[address]
const isSelected = identity.address === selectedAddress
- const balanceValue = accounts[key] ? accounts[key].balance : ''
+ const balanceValue = accounts[address] ? accounts[address].balance : ''
const formattedBalance = balanceValue ? formatBalance(balanceValue, 6) : '...'
const simpleAddress = identity.address.substring(2).toLowerCase()
diff --git a/ui/app/components/pages/add-token/add-token.component.js b/ui/app/components/pages/add-token/add-token.component.js
index 1f4b37b53..bcb93d401 100644
--- a/ui/app/components/pages/add-token/add-token.component.js
+++ b/ui/app/components/pages/add-token/add-token.component.js
@@ -231,7 +231,7 @@ class AddToken extends Component {
<div className="add-token__custom-token-form">
<TextField
id="custom-address"
- label="Token Address"
+ label={this.context.t('tokenAddress')}
type="text"
value={customAddress}
onChange={e => this.handleCustomAddressChange(e.target.value)}
@@ -241,7 +241,7 @@ class AddToken extends Component {
/>
<TextField
id="custom-symbol"
- label="Token Symbol"
+ label={this.context.t('tokenSymbol')}
type="text"
value={customSymbol}
onChange={e => this.handleCustomSymbolChange(e.target.value)}
@@ -252,7 +252,7 @@ class AddToken extends Component {
/>
<TextField
id="custom-decimals"
- label="Decimals of Precision"
+ label={this.context.t('decimal')}
type="number"
value={customDecimals}
onChange={e => this.handleCustomDecimalsChange(e.target.value)}
diff --git a/ui/app/components/pages/create-account/import-account/json.js b/ui/app/components/pages/create-account/import-account/json.js
index 0164417ec..1dc2ba534 100644
--- a/ui/app/components/pages/create-account/import-account/json.js
+++ b/ui/app/components/pages/create-account/import-account/json.js
@@ -82,18 +82,19 @@ class JsonImportSubview extends Component {
}
createNewKeychain () {
+ const { firstAddress, displayWarning, importNewJsonAccount, setSelectedAddress } = this.props
const state = this.state
if (!state) {
const message = this.context.t('validFileImport')
- return this.props.displayWarning(message)
+ return displayWarning(message)
}
const { fileContents } = state
if (!fileContents) {
const message = this.context.t('needImportFile')
- return this.props.displayWarning(message)
+ return displayWarning(message)
}
const passwordInput = document.getElementById('json-password-box')
@@ -101,12 +102,19 @@ class JsonImportSubview extends Component {
if (!password) {
const message = this.context.t('needImportPassword')
- return this.props.displayWarning(message)
+ return displayWarning(message)
}
- this.props.importNewJsonAccount([ fileContents, password ])
- // JS runtime requires caught rejections but failures are handled by Redux
- .catch()
+ importNewJsonAccount([ fileContents, password ])
+ .then(({ selectedAddress }) => {
+ if (selectedAddress) {
+ history.push(DEFAULT_ROUTE)
+ } else {
+ displayWarning('Error importing account.')
+ setSelectedAddress(firstAddress)
+ }
+ })
+ .catch(err => displayWarning(err))
}
}
@@ -114,14 +122,17 @@ JsonImportSubview.propTypes = {
error: PropTypes.string,
goHome: PropTypes.func,
displayWarning: PropTypes.func,
+ firstAddress: PropTypes.string,
importNewJsonAccount: PropTypes.func,
history: PropTypes.object,
+ setSelectedAddress: PropTypes.func,
t: PropTypes.func,
}
const mapStateToProps = state => {
return {
error: state.appState.warning,
+ firstAddress: Object.keys(state.metamask.accounts)[0],
}
}
@@ -130,6 +141,7 @@ const mapDispatchToProps = dispatch => {
goHome: () => dispatch(actions.goHome()),
displayWarning: warning => dispatch(actions.displayWarning(warning)),
importNewJsonAccount: options => dispatch(actions.importNewAccount('JSON File', options)),
+ setSelectedAddress: (address) => dispatch(actions.setSelectedAddress(address)),
}
}
diff --git a/ui/app/components/pages/create-account/import-account/private-key.js b/ui/app/components/pages/create-account/import-account/private-key.js
index e55a47a3c..5df3777da 100644
--- a/ui/app/components/pages/create-account/import-account/private-key.js
+++ b/ui/app/components/pages/create-account/import-account/private-key.js
@@ -21,6 +21,7 @@ module.exports = compose(
function mapStateToProps (state) {
return {
error: state.appState.warning,
+ firstAddress: Object.keys(state.metamask.accounts)[0],
}
}
@@ -29,7 +30,8 @@ function mapDispatchToProps (dispatch) {
importNewAccount: (strategy, [ privateKey ]) => {
return dispatch(actions.importNewAccount(strategy, [ privateKey ]))
},
- displayWarning: () => dispatch(actions.displayWarning(null)),
+ displayWarning: (message) => dispatch(actions.displayWarning(message || null)),
+ setSelectedAddress: (address) => dispatch(actions.setSelectedAddress(address)),
}
}
@@ -40,7 +42,7 @@ function PrivateKeyImportView () {
}
PrivateKeyImportView.prototype.render = function () {
- const { error } = this.props
+ const { error, displayWarning } = this.props
return (
h('div.new-account-import-form__private-key', [
@@ -60,7 +62,10 @@ PrivateKeyImportView.prototype.render = function () {
h('div.new-account-import-form__buttons', {}, [
h('button.btn-default.btn--large.new-account-create-form__button', {
- onClick: () => this.props.history.push(DEFAULT_ROUTE),
+ onClick: () => {
+ displayWarning(null)
+ this.props.history.push(DEFAULT_ROUTE)
+ },
}, [
this.context.t('cancel'),
]),
@@ -88,10 +93,16 @@ PrivateKeyImportView.prototype.createKeyringOnEnter = function (event) {
PrivateKeyImportView.prototype.createNewKeychain = function () {
const input = document.getElementById('private-key-box')
const privateKey = input.value
- const { importNewAccount, history } = this.props
+ const { importNewAccount, history, displayWarning, setSelectedAddress, firstAddress } = this.props
importNewAccount('Private Key', [ privateKey ])
- // JS runtime requires caught rejections but failures are handled by Redux
- .catch()
- .then(() => history.push(DEFAULT_ROUTE))
+ .then(({ selectedAddress }) => {
+ if (selectedAddress) {
+ history.push(DEFAULT_ROUTE)
+ } else {
+ displayWarning('Error importing account.')
+ setSelectedAddress(firstAddress)
+ }
+ })
+ .catch(err => displayWarning(err))
}
diff --git a/ui/app/components/pages/create-account/index.js b/ui/app/components/pages/create-account/index.js
index 475261253..6e3b93742 100644
--- a/ui/app/components/pages/create-account/index.js
+++ b/ui/app/components/pages/create-account/index.js
@@ -22,7 +22,9 @@ class CreateAccountPage extends Component {
}),
}),
onClick: () => history.push(NEW_ACCOUNT_ROUTE),
- }, 'Create'),
+ }, [
+ this.context.t('create'),
+ ]),
h('div.new-account__tabs__tab', {
className: classnames('new-account__tabs__tab', {
@@ -31,14 +33,16 @@ class CreateAccountPage extends Component {
}),
}),
onClick: () => history.push(IMPORT_ACCOUNT_ROUTE),
- }, 'Import'),
+ }, [
+ this.context.t('import'),
+ ]),
])
}
render () {
return h('div.new-account', {}, [
h('div.new-account__header', [
- h('div.new-account__title', 'New Account'),
+ h('div.new-account__title', this.context.t('newAccount') ),
this.renderTabs(),
]),
h('div.new-account__form', [
@@ -62,6 +66,11 @@ class CreateAccountPage extends Component {
CreateAccountPage.propTypes = {
location: PropTypes.object,
history: PropTypes.object,
+ t: PropTypes.func,
+}
+
+CreateAccountPage.contextTypes = {
+ t: PropTypes.func,
}
const mapStateToProps = state => ({
diff --git a/ui/app/components/pages/settings/index.js b/ui/app/components/pages/settings/index.js
index 384ae4b41..aee17e0e8 100644
--- a/ui/app/components/pages/settings/index.js
+++ b/ui/app/components/pages/settings/index.js
@@ -14,8 +14,8 @@ class Config extends Component {
return h('div.settings__tabs', [
h(TabBar, {
tabs: [
- { content: 'Settings', key: SETTINGS_ROUTE },
- { content: 'Info', key: INFO_ROUTE },
+ { content: this.context.t('settings'), key: SETTINGS_ROUTE },
+ { content: this.context.t('info'), key: INFO_ROUTE },
],
isActive: key => matchPath(location.pathname, { path: key, exact: true }),
onSelect: key => history.push(key),
@@ -54,6 +54,11 @@ class Config extends Component {
Config.propTypes = {
location: PropTypes.object,
history: PropTypes.object,
+ t: PropTypes.func,
+}
+
+Config.contextTypes = {
+ t: PropTypes.func,
}
module.exports = Config
diff --git a/ui/app/components/pages/unlock-page/unlock-page.component.js b/ui/app/components/pages/unlock-page/unlock-page.component.js
index 8bc3897da..a1d3f9181 100644
--- a/ui/app/components/pages/unlock-page/unlock-page.component.js
+++ b/ui/app/components/pages/unlock-page/unlock-page.component.js
@@ -120,7 +120,7 @@ class UnlockPage extends Component {
>
<TextField
id="password"
- label="Password"
+ label={this.context.t('password')}
type="password"
value={this.state.password}
onChange={event => this.handleInputChange(event)}
diff --git a/ui/app/components/wallet-view.js b/ui/app/components/wallet-view.js
index 3b29dacac..da142fad8 100644
--- a/ui/app/components/wallet-view.js
+++ b/ui/app/components/wallet-view.js
@@ -36,7 +36,6 @@ function mapStateToProps (state) {
tokens: state.metamask.tokens,
keyrings: state.metamask.keyrings,
selectedAddress: selectors.getSelectedAddress(state),
- selectedIdentity: selectors.getSelectedIdentity(state),
selectedAccount: selectors.getSelectedAccount(state),
selectedTokenAddress: state.metamask.selectedTokenAddress,
}
@@ -99,21 +98,24 @@ WalletView.prototype.render = function () {
const {
responsiveDisplayClassname,
selectedAddress,
- selectedIdentity,
keyrings,
showAccountDetailModal,
sidebarOpen,
hideSidebar,
history,
+ identities,
} = this.props
// temporary logs + fake extra wallets
// console.log('walletview, selectedAccount:', selectedAccount)
const checksummedAddress = checksumAddress(selectedAddress)
+ if (!selectedAddress) {
+ throw new Error('selectedAddress should not be ' + String(selectedAddress))
+ }
+
const keyring = keyrings.find((kr) => {
- return kr.accounts.includes(selectedAddress) ||
- kr.accounts.includes(selectedIdentity.address)
+ return kr.accounts.includes(selectedAddress)
})
const type = keyring.type
@@ -145,7 +147,7 @@ WalletView.prototype.render = function () {
h('span.account-name', {
style: {},
}, [
- selectedIdentity.name,
+ identities[selectedAddress].name,
]),
h('button.btn-clear.wallet-view__details-button.allcaps', this.context.t('details')),
diff --git a/ui/app/reducers.js b/ui/app/reducers.js
index d0d364da9..0b158a778 100644
--- a/ui/app/reducers.js
+++ b/ui/app/reducers.js
@@ -4,7 +4,6 @@ const copyToClipboard = require('copy-to-clipboard')
//
// Sub-Reducers take in the complete state and return their sub-state
//
-const reduceIdentities = require('./reducers/identities')
const reduceMetamask = require('./reducers/metamask')
const reduceApp = require('./reducers/app')
const reduceLocale = require('./reducers/locale')
@@ -23,12 +22,6 @@ function rootReducer (state, action) {
}
//
- // Identities
- //
-
- state.identities = reduceIdentities(state, action)
-
- //
// MetaMask
//
diff --git a/ui/app/reducers/identities.js b/ui/app/reducers/identities.js
deleted file mode 100644
index 341a404e7..000000000
--- a/ui/app/reducers/identities.js
+++ /dev/null
@@ -1,15 +0,0 @@
-const extend = require('xtend')
-
-module.exports = reduceIdentities
-
-function reduceIdentities (state, action) {
- // clone + defaults
- var idState = extend({
-
- }, state.identities)
-
- switch (action.type) {
- default:
- return idState
- }
-}
diff --git a/ui/app/welcome-screen.js b/ui/app/welcome-screen.js
index 2fa244d9f..63512cd50 100644
--- a/ui/app/welcome-screen.js
+++ b/ui/app/welcome-screen.js
@@ -14,6 +14,11 @@ class WelcomeScreen extends Component {
closeWelcomeScreen: PropTypes.func.isRequired,
welcomeScreenSeen: PropTypes.bool,
history: PropTypes.object,
+ t: PropTypes.func,
+ }
+
+ static contextTypes = {
+ t: PropTypes.func,
}
constructor (props) {
@@ -45,16 +50,15 @@ class WelcomeScreen extends Component {
height: '225',
}),
- h('div.welcome-screen__info__header', 'Welcome to MetaMask Beta'),
+ h('div.welcome-screen__info__header', this.context.t('welcomeBeta')),
- h('div.welcome-screen__info__copy', 'MetaMask is a secure identity vault for Ethereum.'),
+ h('div.welcome-screen__info__copy', this.context.t('metamaskDescription')),
- h('div.welcome-screen__info__copy', `It allows you to hold ether & tokens,
- and serves as your bridge to decentralized applications.`),
+ h('div.welcome-screen__info__copy', this.context.t('holdEther')),
h('button.welcome-screen__button', {
onClick: this.initiateAccountCreation,
- }, 'Continue'),
+ }, this.context.t('continue')),
]),