aboutsummaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authorkumavis <kumavis@users.noreply.github.com>2016-05-21 07:54:00 +0800
committerkumavis <kumavis@users.noreply.github.com>2016-05-21 07:54:00 +0800
commit27790b38a95e219b7663852150b82387cedb58e2 (patch)
tree4c71d9f923b5119f12bea5865c921789303699cf /ui
parentda6e965b66434f4ca0151c4e40ba88a3865814ef (diff)
parent8efd30ad7af4350108dc418571e16e74aa069375 (diff)
downloadtangerine-wallet-browser-27790b38a95e219b7663852150b82387cedb58e2.tar.gz
tangerine-wallet-browser-27790b38a95e219b7663852150b82387cedb58e2.tar.zst
tangerine-wallet-browser-27790b38a95e219b7663852150b82387cedb58e2.zip
Merge pull request #201 from MetaMask/AccountCrud
Add ability to nickname accounts
Diffstat (limited to 'ui')
-rw-r--r--ui/app/account-detail.js40
-rw-r--r--ui/app/accounts.js13
-rw-r--r--ui/app/actions.js18
-rw-r--r--ui/app/components/editable-label.js52
-rw-r--r--ui/app/css/index.css14
-rw-r--r--ui/app/css/lib.css8
-rw-r--r--ui/app/reducers/metamask.js8
7 files changed, 122 insertions, 31 deletions
diff --git a/ui/app/account-detail.js b/ui/app/account-detail.js
index c708580c4..bae44ec85 100644
--- a/ui/app/account-detail.js
+++ b/ui/app/account-detail.js
@@ -8,12 +8,12 @@ const actions = require('./actions')
const addressSummary = require('./util').addressSummary
const ReactCSSTransitionGroup = require('react-addons-css-transition-group')
-const AccountPanel = require('./components/account-panel')
const Identicon = require('./components/identicon')
const EtherBalance = require('./components/eth-balance')
const transactionList = require('./components/transaction-list')
const ExportAccountView = require('./components/account-export')
const ethUtil = require('ethereumjs-util')
+const EditableLabel = require('./components/editable-label')
module.exports = connect(mapStateToProps)(AccountDetailScreen)
@@ -34,12 +34,12 @@ function AccountDetailScreen() {
}
AccountDetailScreen.prototype.render = function() {
- var state = this.props
- var selected = state.address || Object.keys(state.accounts)[0]
- var identity = state.identities[selected]
- var account = state.accounts[selected]
- var accountDetail = state.accountDetail
- var transactions = state.transactions
+ var props = this.props
+ var selected = props.address || Object.keys(props.accounts)[0]
+ var identity = props.identities[selected]
+ var account = props.accounts[selected]
+ var accountDetail = props.accountDetail
+ var transactions = props.transactions
return (
@@ -78,16 +78,28 @@ AccountDetailScreen.prototype.render = function() {
h('i.fa.fa-users.fa-lg.cursor-pointer.color-orange', {
onClick: this.navigateToAccounts.bind(this),
}),
-
]),
- // account label
- h('h2.font-medium.color-forest.flex-center', {
+ h('.flex-center', {
style: {
- paddingTop: 8,
- marginBottom: 32,
- },
- }, identity && identity.name),
+ height: '62px',
+ paddingTop: '8px',
+ }
+ }, [
+ h(EditableLabel, {
+ textValue: identity ? identity.name : '',
+ state: {
+ isEditingLabel: false,
+ },
+ saveText: (text) => {
+ props.dispatch(actions.saveAccountLabel(selected, text))
+ },
+ }, [
+
+ // What is shown when not editing:
+ h('h2.font-medium.color-forest', identity && identity.name)
+ ]),
+ ]),
// address and getter actions
h('.flex-row.flex-space-between', {
diff --git a/ui/app/accounts.js b/ui/app/accounts.js
index 45594f3c0..dbf4ee0fa 100644
--- a/ui/app/accounts.js
+++ b/ui/app/accounts.js
@@ -39,6 +39,7 @@ AccountsScreen.prototype.render = function() {
onSelect: this.onSelect.bind(this),
onShowDetail: this.onShowDetail.bind(this),
revealAccount: this.onRevealAccount.bind(this),
+ goHome: this.goHome.bind(this),
}
return (
@@ -47,9 +48,7 @@ AccountsScreen.prototype.render = function() {
// subtitle and nav
h('.section-title.flex-center', [
h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', {
- onClick: (event) => {
- state.dispatch(actions.goHome())
- }
+ onClick: actions.goHome,
}),
h('h2.page-subtitle', 'Select Account'),
]),
@@ -112,13 +111,13 @@ AccountsScreen.prototype.render = function() {
isSelected: false,
isFauceting: isFauceting,
})
+ const selectedClass = isSelected ? '.selected' : ''
return (
- h('.accounts-list-option.flex-row.flex-space-between.pointer.hover-white', {
+ h(`.accounts-list-option.flex-row.flex-space-between.pointer.hover-white${selectedClass}`, {
key: `account-panel-${identity.address}`,
style: {
flex: '1 0 auto',
- background: isSelected ? 'white' : 'none',
},
onClick: (event) => actions.onShowDetail(identity.address, event),
}, [
@@ -177,3 +176,7 @@ AccountsScreen.prototype.onShowDetail = function(address, event){
AccountsScreen.prototype.onRevealAccount = function() {
this.props.dispatch(actions.revealAccount())
}
+
+AccountsScreen.prototype.goHome = function() {
+ this.props.dispatch(actions.goHome())
+}
diff --git a/ui/app/actions.js b/ui/app/actions.js
index 5d6f503e2..9ff05c460 100644
--- a/ui/app/actions.js
+++ b/ui/app/actions.js
@@ -59,6 +59,8 @@ var actions = {
exportAccount: exportAccount,
SHOW_PRIVATE_KEY: 'SHOW_PRIVATE_KEY',
showPrivateKey: showPrivateKey,
+ SAVE_ACCOUNT_LABEL: 'SAVE_ACCOUNT_LABEL',
+ saveAccountLabel: saveAccountLabel,
// tx conf screen
COMPLETED_TX: 'COMPLETED_TX',
TRANSACTION_ERROR: 'TRANSACTION_ERROR',
@@ -481,6 +483,22 @@ function showPrivateKey(key) {
}
}
+function saveAccountLabel(account, label) {
+ return (dispatch) => {
+ dispatch(this.showLoadingIndication())
+ _accountManager.saveAccountLabel(account, label, (err) => {
+ dispatch(this.hideLoadingIndication())
+ if (err) {
+ return dispatch(this.showWarning(err.message))
+ }
+ dispatch({
+ type: this.SAVE_ACCOUNT_LABEL,
+ value: { account, label },
+ })
+ })
+ }
+}
+
function showSendPage() {
return {
type: this.SHOW_SEND_PAGE,
diff --git a/ui/app/components/editable-label.js b/ui/app/components/editable-label.js
new file mode 100644
index 000000000..20e24a9c7
--- /dev/null
+++ b/ui/app/components/editable-label.js
@@ -0,0 +1,52 @@
+const Component = require('react').Component
+const h = require('react-hyperscript')
+const inherits = require('util').inherits
+const findDOMNode = require('react-dom').findDOMNode
+
+module.exports = EditableLabel
+
+
+inherits(EditableLabel, Component)
+function EditableLabel() {
+ Component.call(this)
+}
+
+EditableLabel.prototype.render = function() {
+ const props = this.props
+ let state = this.state
+
+ if (state && state.isEditingLabel) {
+
+ return h('div.editable-label', [
+ h('input', {
+ defaultValue: props.textValue,
+ onKeyPress:(event) => {
+ this.saveIfEnter(event)
+ },
+ }),
+ h('button', {
+ onClick:() => this.saveText(),
+ }, 'Save')
+ ])
+
+ } else {
+ return h('div', {
+ onClick:(event) => {
+ this.setState({ isEditingLabel: true })
+ },
+ }, this.props.children)
+ }
+}
+
+EditableLabel.prototype.saveIfEnter = function(event) {
+ if (event.key === 'Enter') {
+ this.saveText()
+ }
+}
+
+EditableLabel.prototype.saveText = function() {
+ var container = findDOMNode(this)
+ var text = container.querySelector('.editable-label input').value
+ this.props.saveText(text)
+ this.setState({ isEditingLabel: false, textLabel: text })
+}
diff --git a/ui/app/css/index.css b/ui/app/css/index.css
index 060ddce91..d6d1f91ac 100644
--- a/ui/app/css/index.css
+++ b/ui/app/css/index.css
@@ -274,10 +274,6 @@ input.large-input {
height: 120px;
}
-.accounts-list-option:hover {
- transform: scale(1.1);
-}
-
.accounts-list-option .identicon-wrapper {
width: 100px;
}
@@ -334,9 +330,6 @@ input.large-input {
border-bottom: 1px solid #B1B1B1;
cursor: pointer;
}
-.identity-section .identity-panel:hover {
- background: #F9F9F9;
-}
.identity-section .identity-panel.selected {
background: white;
@@ -347,6 +340,11 @@ input.large-input {
border-color: orange;
}
+.identity-section .accounts-list-option:hover,
+.identity-section .accounts-list-option.selected {
+ background:white;
+}
+
/* account detail screen */
.account-detail-section {
@@ -393,4 +391,4 @@ input.large-input {
.ether-balance-label {
color: #ABA9AA;
-} \ No newline at end of file
+}
diff --git a/ui/app/css/lib.css b/ui/app/css/lib.css
index 97ff02c46..d9719b1e3 100644
--- a/ui/app/css/lib.css
+++ b/ui/app/css/lib.css
@@ -107,10 +107,6 @@
user-select: none;
}
-.hover-white:hover {
- background: white;
-}
-
.pointer {
cursor: pointer;
}
@@ -166,3 +162,7 @@ hr.horizontal-line {
margin: 1em 0;
padding: 0;
}
+
+.hover-white:hover {
+ background: white;
+}
diff --git a/ui/app/reducers/metamask.js b/ui/app/reducers/metamask.js
index 8628e84d2..a45327189 100644
--- a/ui/app/reducers/metamask.js
+++ b/ui/app/reducers/metamask.js
@@ -95,6 +95,14 @@ function reduceMetamask(state, action) {
delete newState.seedWords
return newState
+ case actions.SAVE_ACCOUNT_LABEL:
+ const account = action.value.account
+ const name = action.value.label
+ var id = {}
+ id[account] = extend(metamaskState.identities[account], { name })
+ var identities = extend(metamaskState.identities, id)
+ return extend(metamaskState, { identities })
+
default:
return metamaskState