mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-22 17:33:23 +01:00
ui - redesign - trans group + + account detail + tx list fixes
This commit is contained in:
parent
82db0afb30
commit
46f1ab8b48
@ -42,85 +42,99 @@ AccountDetailScreen.prototype.render = function() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
||||||
h('.account-detail-section.flex-column.flex-grow', {
|
h('.account-detail-section.flex-column.flex-grow', [
|
||||||
style: {
|
|
||||||
width: 330,
|
|
||||||
marginTop: 28,
|
|
||||||
},
|
|
||||||
}, [
|
|
||||||
|
|
||||||
h('.flex-row.flex-space-between', [
|
// identicon, label, balance, etc
|
||||||
|
h('.account-data-subsection.flex-column.flex-grow', {
|
||||||
// invisible placeholder for later
|
|
||||||
h('i.fa.fa-users.fa-lg.color-orange', {
|
|
||||||
style: {
|
|
||||||
visibility: 'hidden',
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
|
|
||||||
// large identicon
|
|
||||||
h('.identicon-wrapper.flex-column.flex-center.select-none', [
|
|
||||||
h(Identicon, {
|
|
||||||
diameter: 62,
|
|
||||||
address: selected,
|
|
||||||
}),
|
|
||||||
]),
|
|
||||||
|
|
||||||
// small accounts nav
|
|
||||||
h('i.fa.fa-users.fa-lg.cursor-pointer.color-orange', {
|
|
||||||
onClick: this.navigateToAccounts.bind(this),
|
|
||||||
}),
|
|
||||||
|
|
||||||
]),
|
|
||||||
|
|
||||||
h('h2.font-medium.color-forest.flex-center', {
|
|
||||||
style: {
|
style: {
|
||||||
paddingTop: 8,
|
margin: '0 20px',
|
||||||
marginBottom: 32,
|
|
||||||
},
|
|
||||||
}, identity && identity.name),
|
|
||||||
|
|
||||||
h('.flex-row.flex-space-between', {
|
|
||||||
style: {
|
|
||||||
marginBottom: 16,
|
|
||||||
},
|
},
|
||||||
}, [
|
}, [
|
||||||
|
|
||||||
h('div', {
|
// header - identicon + nav
|
||||||
|
h('.flex-row.flex-space-between', {
|
||||||
style: {
|
style: {
|
||||||
lineHeight: '16px',
|
marginTop: 28,
|
||||||
},
|
},
|
||||||
}, addressSummary(selected)),
|
}, [
|
||||||
|
|
||||||
h('i.fa.fa-download.fa-md.cursor-pointer.color-orange', {
|
// invisible placeholder for later
|
||||||
onClick: () => this.requestAccountExport(account.address),
|
h('i.fa.fa-users.fa-lg.color-orange', {
|
||||||
}),
|
style: {
|
||||||
|
visibility: 'hidden',
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
|
||||||
h('i.fa.fa-qrcode.fa-md.cursor-disabled.color-orange', {
|
// large identicon
|
||||||
onClick: () => console.warn('QRCode not implented...'),
|
h('.identicon-wrapper.flex-column.flex-center.select-none', [
|
||||||
}),
|
h(Identicon, {
|
||||||
|
diameter: 62,
|
||||||
|
address: selected,
|
||||||
|
}),
|
||||||
|
]),
|
||||||
|
|
||||||
h('i.fa.fa-clipboard.fa-md.cursor-pointer.color-orange', {
|
// small accounts nav
|
||||||
onClick: () => copyToClipboard(account.address),
|
h('i.fa.fa-users.fa-lg.cursor-pointer.color-orange', {
|
||||||
}),
|
onClick: this.navigateToAccounts.bind(this),
|
||||||
|
}),
|
||||||
]),
|
|
||||||
|
|
||||||
h('.flex-row.flex-space-between', [
|
|
||||||
|
|
||||||
h('div', {
|
|
||||||
style: {
|
|
||||||
lineHeight: '50px',
|
|
||||||
},
|
|
||||||
}, formatBalance(account.balance)),
|
|
||||||
|
|
||||||
h('button', {
|
|
||||||
onClick: () => this.props.dispatch(actions.showSendPage()),
|
|
||||||
}, 'SEND ETH'),
|
|
||||||
|
|
||||||
|
]),
|
||||||
|
|
||||||
|
// account label
|
||||||
|
h('h2.font-medium.color-forest.flex-center', {
|
||||||
|
style: {
|
||||||
|
paddingTop: 8,
|
||||||
|
marginBottom: 32,
|
||||||
|
},
|
||||||
|
}, identity && identity.name),
|
||||||
|
|
||||||
|
// address and getter actions
|
||||||
|
h('.flex-row.flex-space-between', {
|
||||||
|
style: {
|
||||||
|
marginBottom: 16,
|
||||||
|
},
|
||||||
|
}, [
|
||||||
|
|
||||||
|
h('div', {
|
||||||
|
style: {
|
||||||
|
lineHeight: '16px',
|
||||||
|
},
|
||||||
|
}, addressSummary(selected)),
|
||||||
|
|
||||||
|
h('i.fa.fa-download.fa-md.cursor-pointer.color-orange', {
|
||||||
|
onClick: () => this.requestAccountExport(account.address),
|
||||||
|
}),
|
||||||
|
|
||||||
|
h('i.fa.fa-qrcode.fa-md.cursor-disabled.color-orange', {
|
||||||
|
onClick: () => console.warn('QRCode not implented...'),
|
||||||
|
}),
|
||||||
|
|
||||||
|
h('i.fa.fa-clipboard.fa-md.cursor-pointer.color-orange', {
|
||||||
|
onClick: () => copyToClipboard(account.address),
|
||||||
|
}),
|
||||||
|
|
||||||
|
]),
|
||||||
|
|
||||||
|
// balance + send
|
||||||
|
h('.flex-row.flex-space-between', [
|
||||||
|
|
||||||
|
h('div', {
|
||||||
|
style: {
|
||||||
|
lineHeight: '50px',
|
||||||
|
},
|
||||||
|
}, formatBalance(account && account.balance)),
|
||||||
|
|
||||||
|
h('button', {
|
||||||
|
onClick: () => this.props.dispatch(actions.showSendPage()),
|
||||||
|
}, 'SEND ETH'),
|
||||||
|
|
||||||
|
]),
|
||||||
|
|
||||||
]),
|
]),
|
||||||
|
|
||||||
|
// subview (tx history, pk export confirm)
|
||||||
h(ReactCSSTransitionGroup, {
|
h(ReactCSSTransitionGroup, {
|
||||||
|
className: 'css-transition-group',
|
||||||
transitionName: 'main',
|
transitionName: 'main',
|
||||||
transitionEnterTimeout: 300,
|
transitionEnterTimeout: 300,
|
||||||
transitionLeaveTimeout: 300,
|
transitionLeaveTimeout: 300,
|
||||||
@ -155,15 +169,17 @@ AccountDetailScreen.prototype.transactionList = function() {
|
|||||||
var state = this.props
|
var state = this.props
|
||||||
var transactions = state.transactions
|
var transactions = state.transactions
|
||||||
|
|
||||||
return transactionList(transactions
|
var txsToRender = transactions
|
||||||
// only transactions that have a hash
|
// only transactions that are from the current address
|
||||||
.filter(tx => tx.hash)
|
.filter(tx => tx.txParams.from === state.address)
|
||||||
// only transactions that are from the current address
|
// only transactions that are on the current network
|
||||||
.filter(tx => tx.txParams.from === state.address)
|
.filter(tx => tx.txParams.metamaskNetworkId === state.networkVersion)
|
||||||
// only transactions that are on the current network
|
// only transactions that have a hash
|
||||||
.filter(tx => tx.txParams.metamaskNetworkId === state.networkVersion)
|
.filter(tx => tx.hash)
|
||||||
// sort by recency
|
// sort by recency
|
||||||
.sort((a, b) => b.time - a.time), state.networkVersion)
|
.sort((a, b) => b.time - a.time)
|
||||||
|
|
||||||
|
return transactionList(txsToRender, state.networkVersion)
|
||||||
}
|
}
|
||||||
|
|
||||||
AccountDetailScreen.prototype.navigateToAccounts = function(event){
|
AccountDetailScreen.prototype.navigateToAccounts = function(event){
|
||||||
|
@ -104,7 +104,8 @@ App.prototype.render = function() {
|
|||||||
}
|
}
|
||||||
}, [
|
}, [
|
||||||
h(ReactCSSTransitionGroup, {
|
h(ReactCSSTransitionGroup, {
|
||||||
transitionName: "main",
|
className: 'css-transition-group',
|
||||||
|
transitionName: 'main',
|
||||||
transitionEnterTimeout: 300,
|
transitionEnterTimeout: 300,
|
||||||
transitionLeaveTimeout: 300,
|
transitionLeaveTimeout: 300,
|
||||||
}, [
|
}, [
|
||||||
|
@ -18,12 +18,15 @@ Panel.prototype.render = function() {
|
|||||||
var identity = state.identity || {}
|
var identity = state.identity || {}
|
||||||
var account = state.account || {}
|
var account = state.account || {}
|
||||||
var isFauceting = state.isFauceting
|
var isFauceting = state.isFauceting
|
||||||
|
var style = {
|
||||||
|
flex: '1 0 auto',
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state.onClick) style.cursor = 'pointer'
|
||||||
|
|
||||||
return (
|
return (
|
||||||
h('.identity-panel.flex-row.flex-space-between', {
|
h('.identity-panel.flex-row.flex-space-between', {
|
||||||
style: {
|
style,
|
||||||
flex: '1 0 auto',
|
|
||||||
},
|
|
||||||
onClick: state.onClick,
|
onClick: state.onClick,
|
||||||
}, [
|
}, [
|
||||||
|
|
||||||
@ -42,7 +45,7 @@ Panel.prototype.render = function() {
|
|||||||
return h('.flex-row.flex-space-between', {
|
return h('.flex-row.flex-space-between', {
|
||||||
key: '' + Math.round(Math.random() * 1000000),
|
key: '' + Math.round(Math.random() * 1000000),
|
||||||
}, [
|
}, [
|
||||||
h('label.font-small', attr.key),
|
h('label.font-small.no-select', attr.key),
|
||||||
h('span.font-small', attr.value),
|
h('span.font-small', attr.value),
|
||||||
])
|
])
|
||||||
}),
|
}),
|
||||||
|
@ -5,50 +5,62 @@ const explorerLink = require('../../lib/explorer-link')
|
|||||||
const Panel = require('./panel')
|
const Panel = require('./panel')
|
||||||
|
|
||||||
module.exports = function(transactions, network) {
|
module.exports = function(transactions, network) {
|
||||||
return h('section', [
|
return (
|
||||||
|
|
||||||
h('.current-domain-panel.flex-center.font-small', [
|
h('section.transaction-list', [
|
||||||
h('span', 'Transactions'),
|
|
||||||
]),
|
|
||||||
|
|
||||||
h('.tx-list', {
|
h('h3.flex-center.text-transform-uppercase', {
|
||||||
|
style: {
|
||||||
|
background: '#EBEBEB',
|
||||||
|
},
|
||||||
|
}, [
|
||||||
|
'Transactions',
|
||||||
|
]),
|
||||||
|
|
||||||
|
h('.tx-list', {
|
||||||
style: {
|
style: {
|
||||||
overflowY: 'auto',
|
overflowY: 'auto',
|
||||||
height: '180px',
|
height: '204px',
|
||||||
|
margin: '0 20px',
|
||||||
textAlign: 'center',
|
textAlign: 'center',
|
||||||
},
|
},
|
||||||
},
|
}, (
|
||||||
|
|
||||||
[
|
transactions.length ?
|
||||||
|
transactions.map(renderTransaction)
|
||||||
transactions.map((transaction) => {
|
:
|
||||||
|
[h('.flex-center', {
|
||||||
var panelOpts = {
|
|
||||||
key: `tx-${transaction.hash}`,
|
|
||||||
identiconKey: transaction.txParams.to,
|
|
||||||
style: {
|
style: {
|
||||||
cursor: 'pointer',
|
height: '100%',
|
||||||
},
|
},
|
||||||
onClick: (event) => {
|
}, 'No transaction history...')]
|
||||||
var url = explorerLink(transaction.hash, parseInt(network))
|
|
||||||
chrome.tabs.create({ url });
|
|
||||||
},
|
|
||||||
attributes: [
|
|
||||||
{
|
|
||||||
key: 'TO',
|
|
||||||
value: addressSummary(transaction.txParams.to),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: 'VALUE',
|
|
||||||
value: formatBalance(transaction.txParams.value),
|
|
||||||
},
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
return h(Panel, panelOpts)
|
))
|
||||||
})
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
])
|
])
|
||||||
|
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function renderTransaction(transaction){
|
||||||
|
var panelOpts = {
|
||||||
|
key: `tx-${transaction.hash}`,
|
||||||
|
identiconKey: transaction.txParams.to,
|
||||||
|
onClick: (event) => {
|
||||||
|
var url = explorerLink(transaction.hash, parseInt(network))
|
||||||
|
chrome.tabs.create({ url })
|
||||||
|
},
|
||||||
|
attributes: [
|
||||||
|
{
|
||||||
|
key: 'TO',
|
||||||
|
value: addressSummary(transaction.txParams.to),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'VALUE',
|
||||||
|
value: formatBalance(transaction.txParams.value),
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
return h(Panel, panelOpts)
|
||||||
|
}
|
@ -77,7 +77,8 @@ ConfirmTxScreen.prototype.render = function() {
|
|||||||
warningIfExists(state.warning),
|
warningIfExists(state.warning),
|
||||||
|
|
||||||
h(ReactCSSTransitionGroup, {
|
h(ReactCSSTransitionGroup, {
|
||||||
transitionName: "main",
|
className: 'css-transition-group',
|
||||||
|
transitionName: 'main',
|
||||||
transitionEnterTimeout: 300,
|
transitionEnterTimeout: 300,
|
||||||
transitionLeaveTimeout: 300,
|
transitionLeaveTimeout: 300,
|
||||||
}, [
|
}, [
|
||||||
|
@ -327,7 +327,7 @@ app sections
|
|||||||
/* account detail screen */
|
/* account detail screen */
|
||||||
|
|
||||||
.account-detail-section {
|
.account-detail-section {
|
||||||
margin: 0 20px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* tx confirm */
|
/* tx confirm */
|
||||||
|
@ -100,7 +100,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.select-none {
|
.select-none {
|
||||||
cursor: default;
|
cursor: inherit;
|
||||||
-moz-user-select: none;
|
-moz-user-select: none;
|
||||||
-webkit-user-select: none;
|
-webkit-user-select: none;
|
||||||
-ms-user-select: none;
|
-ms-user-select: none;
|
||||||
@ -139,6 +139,10 @@
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.text-transform-uppercase {
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
.font-small {
|
.font-small {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,8 @@ LoadingIndicator.prototype.render = function() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
h(ReactCSSTransitionGroup, {
|
h(ReactCSSTransitionGroup, {
|
||||||
transitionName: "loader",
|
className: 'css-transition-group',
|
||||||
|
transitionName: 'loader',
|
||||||
transitionEnterTimeout: 150,
|
transitionEnterTimeout: 150,
|
||||||
transitionLeaveTimeout: 150,
|
transitionLeaveTimeout: 150,
|
||||||
}, [
|
}, [
|
||||||
|
Loading…
Reference in New Issue
Block a user