Refactor BalanceComponent to jsx (#6048)
parent
0ad7797076
commit
fe780fb3d4
@ -1,138 +0,0 @@ |
||||
const Component = require('react').Component |
||||
const h = require('react-hyperscript') |
||||
const PropTypes = require('prop-types') |
||||
const inherits = require('util').inherits |
||||
const exportAsFile = require('../util').exportAsFile |
||||
const copyToClipboard = require('copy-to-clipboard') |
||||
const actions = require('../actions') |
||||
const ethUtil = require('ethereumjs-util') |
||||
const connect = require('react-redux').connect |
||||
|
||||
ExportAccountView.contextTypes = { |
||||
t: PropTypes.func, |
||||
} |
||||
|
||||
module.exports = connect(mapStateToProps)(ExportAccountView) |
||||
|
||||
|
||||
inherits(ExportAccountView, Component) |
||||
function ExportAccountView () { |
||||
Component.call(this) |
||||
} |
||||
|
||||
function mapStateToProps (state) { |
||||
return { |
||||
warning: state.appState.warning, |
||||
} |
||||
} |
||||
|
||||
ExportAccountView.prototype.render = function () { |
||||
const state = this.props |
||||
const accountDetail = state.accountDetail |
||||
const nickname = state.identities[state.address].name |
||||
|
||||
if (!accountDetail) return h('div') |
||||
const accountExport = accountDetail.accountExport |
||||
|
||||
const notExporting = accountExport === 'none' |
||||
const exportRequested = accountExport === 'requested' |
||||
const accountExported = accountExport === 'completed' |
||||
|
||||
if (notExporting) return h('div') |
||||
|
||||
if (exportRequested) { |
||||
const warning = this.context.t('exportPrivateKeyWarning') |
||||
return ( |
||||
h('div', { |
||||
style: { |
||||
display: 'inline-block', |
||||
textAlign: 'center', |
||||
}, |
||||
}, |
||||
[ |
||||
h('div', { |
||||
key: 'exporting', |
||||
style: { |
||||
margin: '0 20px', |
||||
}, |
||||
}, [ |
||||
h('p.error', warning), |
||||
h('input#exportAccount.sizing-input', { |
||||
type: 'password', |
||||
placeholder: this.context.t('confirmPassword').toLowerCase(), |
||||
onKeyPress: this.onExportKeyPress.bind(this), |
||||
style: { |
||||
position: 'relative', |
||||
top: '1.5px', |
||||
marginBottom: '7px', |
||||
}, |
||||
}), |
||||
]), |
||||
h('div', { |
||||
key: 'buttons', |
||||
style: { |
||||
margin: '0 20px', |
||||
}, |
||||
}, |
||||
[ |
||||
h('button', { |
||||
onClick: () => this.onExportKeyPress({ key: 'Enter', preventDefault: () => {} }), |
||||
style: { |
||||
marginRight: '10px', |
||||
}, |
||||
}, this.context.t('submit')), |
||||
h('button', { |
||||
onClick: () => this.props.dispatch(actions.backToAccountDetail(this.props.address)), |
||||
}, this.context.t('cancel')), |
||||
]), |
||||
(this.props.warning) && ( |
||||
h('span.error', { |
||||
style: { |
||||
margin: '20px', |
||||
}, |
||||
}, this.props.warning.split('-')) |
||||
), |
||||
]) |
||||
) |
||||
} |
||||
|
||||
if (accountExported) { |
||||
const plainKey = ethUtil.stripHexPrefix(accountDetail.privateKey) |
||||
|
||||
return h('div.privateKey', { |
||||
style: { |
||||
margin: '0 20px', |
||||
}, |
||||
}, [ |
||||
h('label', this.context.t('copyPrivateKey') + ':'), |
||||
h('p.error.cursor-pointer', { |
||||
style: { |
||||
textOverflow: 'ellipsis', |
||||
overflow: 'hidden', |
||||
webkitUserSelect: 'text', |
||||
maxWidth: '275px', |
||||
}, |
||||
onClick: function (event) { |
||||
copyToClipboard(ethUtil.stripHexPrefix(accountDetail.privateKey)) |
||||
}, |
||||
}, plainKey), |
||||
h('button', { |
||||
onClick: () => this.props.dispatch(actions.backToAccountDetail(this.props.address)), |
||||
}, this.context.t('done')), |
||||
h('button', { |
||||
style: { |
||||
marginLeft: '10px', |
||||
}, |
||||
onClick: () => exportAsFile(`MetaMask ${nickname} Private Key`, plainKey), |
||||
}, this.context.t('saveAsFile')), |
||||
]) |
||||
} |
||||
} |
||||
|
||||
ExportAccountView.prototype.onExportKeyPress = function (event) { |
||||
if (event.key !== 'Enter') return |
||||
event.preventDefault() |
||||
|
||||
const input = document.getElementById('exportAccount').value |
||||
this.props.dispatch(actions.exportAccount(input, this.props.address)) |
||||
} |
@ -1,111 +0,0 @@ |
||||
const Component = require('react').Component |
||||
const connect = require('react-redux').connect |
||||
const h = require('react-hyperscript') |
||||
const inherits = require('util').inherits |
||||
import TokenBalance from './token-balance' |
||||
import Identicon from './identicon' |
||||
import UserPreferencedCurrencyDisplay from './user-preferenced-currency-display' |
||||
import { PRIMARY, SECONDARY } from '../constants/common' |
||||
const { getNativeCurrency, getAssetImages, conversionRateSelector, getCurrentCurrency, getMetaMaskAccounts } = require('../selectors') |
||||
|
||||
const { formatBalance } = require('../util') |
||||
|
||||
module.exports = connect(mapStateToProps)(BalanceComponent) |
||||
|
||||
function mapStateToProps (state) { |
||||
const accounts = getMetaMaskAccounts(state) |
||||
const network = state.metamask.network |
||||
const selectedAddress = state.metamask.selectedAddress || Object.keys(accounts)[0] |
||||
const account = accounts[selectedAddress] |
||||
|
||||
return { |
||||
account, |
||||
network, |
||||
nativeCurrency: getNativeCurrency(state), |
||||
conversionRate: conversionRateSelector(state), |
||||
currentCurrency: getCurrentCurrency(state), |
||||
assetImages: getAssetImages(state), |
||||
} |
||||
} |
||||
|
||||
inherits(BalanceComponent, Component) |
||||
function BalanceComponent () { |
||||
Component.call(this) |
||||
} |
||||
|
||||
BalanceComponent.prototype.render = function () { |
||||
const props = this.props |
||||
const { token, network, assetImages } = props |
||||
const address = token && token.address |
||||
const image = assetImages && address ? assetImages[token.address] : undefined |
||||
|
||||
return h('div.balance-container', {}, [ |
||||
|
||||
// TODO: balance icon needs to be passed in
|
||||
// h('img.balance-icon', {
|
||||
// src: '../images/eth_logo.svg',
|
||||
// style: {},
|
||||
// }),
|
||||
h(Identicon, { |
||||
diameter: 50, |
||||
address, |
||||
network, |
||||
image, |
||||
}), |
||||
|
||||
token ? this.renderTokenBalance() : this.renderBalance(), |
||||
]) |
||||
} |
||||
|
||||
BalanceComponent.prototype.renderTokenBalance = function () { |
||||
const { token } = this.props |
||||
|
||||
return h('div.flex-column.balance-display', [ |
||||
h('div.token-amount', [ h(TokenBalance, { token }) ]), |
||||
]) |
||||
} |
||||
|
||||
BalanceComponent.prototype.renderBalance = function () { |
||||
const props = this.props |
||||
const { account, nativeCurrency } = props |
||||
const balanceValue = account && account.balance |
||||
const needsParse = 'needsParse' in props ? props.needsParse : true |
||||
const formattedBalance = balanceValue ? formatBalance(balanceValue, 6, needsParse, nativeCurrency) : '...' |
||||
const showFiat = 'showFiat' in props ? props.showFiat : true |
||||
|
||||
if (formattedBalance === 'None' || formattedBalance === '...') { |
||||
return h('div.flex-column.balance-display', {}, [ |
||||
h('div.token-amount', { |
||||
style: {}, |
||||
}, formattedBalance), |
||||
]) |
||||
} |
||||
|
||||
return h('div.flex-column.balance-display', {}, [ |
||||
h(UserPreferencedCurrencyDisplay, { |
||||
className: 'token-amount', |
||||
value: balanceValue, |
||||
type: PRIMARY, |
||||
ethNumberOfDecimals: 4, |
||||
}), |
||||
|
||||
showFiat && h(UserPreferencedCurrencyDisplay, { |
||||
value: balanceValue, |
||||
type: SECONDARY, |
||||
ethNumberOfDecimals: 4, |
||||
}), |
||||
]) |
||||
} |
||||
|
||||
BalanceComponent.prototype.getFiatDisplayNumber = function (formattedBalance, conversionRate) { |
||||
if (formattedBalance === 'None') return formattedBalance |
||||
if (conversionRate === 0) return 'N/A' |
||||
|
||||
const splitBalance = formattedBalance.split(' ') |
||||
|
||||
const convertedNumber = (Number(splitBalance[0]) * conversionRate) |
||||
const wholePart = Math.floor(convertedNumber) |
||||
const decimalPart = convertedNumber - wholePart |
||||
|
||||
return wholePart + Number(decimalPart.toPrecision(2)) |
||||
} |
@ -0,0 +1,92 @@ |
||||
import React, { PureComponent } from 'react' |
||||
import PropTypes from 'prop-types' |
||||
import TokenBalance from '../token-balance' |
||||
import Identicon from '../identicon' |
||||
import UserPreferencedCurrencyDisplay from '../user-preferenced-currency-display' |
||||
import { PRIMARY, SECONDARY } from '../../constants/common' |
||||
import { formatBalance } from '../../util' |
||||
|
||||
export default class Balance extends PureComponent { |
||||
static propTypes = { |
||||
account: PropTypes.object, |
||||
assetImages: PropTypes.object, |
||||
nativeCurrency: PropTypes.string, |
||||
needsParse: PropTypes.bool, |
||||
network: PropTypes.string, |
||||
showFiat: PropTypes.bool, |
||||
token: PropTypes.object, |
||||
} |
||||
|
||||
static defaultProps = { |
||||
needsParse: true, |
||||
showFiat: true, |
||||
} |
||||
|
||||
renderBalance () { |
||||
const { account, nativeCurrency, needsParse, showFiat } = this.props |
||||
const balanceValue = account && account.balance |
||||
const formattedBalance = balanceValue |
||||
? formatBalance(balanceValue, 6, needsParse, nativeCurrency) |
||||
: '...' |
||||
|
||||
if (formattedBalance === 'None' || formattedBalance === '...') { |
||||
return ( |
||||
<div className="flex-column balance-display"> |
||||
<div className="token-amount"> |
||||
{ formattedBalance } |
||||
</div> |
||||
</div> |
||||
) |
||||
} |
||||
|
||||
return ( |
||||
<div className="flex-column balance-display"> |
||||
<UserPreferencedCurrencyDisplay |
||||
className="token-amount" |
||||
value={balanceValue} |
||||
type={PRIMARY} |
||||
ethNumberOfDecimals={4} |
||||
/> |
||||
{ |
||||
showFiat && ( |
||||
<UserPreferencedCurrencyDisplay |
||||
value={balanceValue} |
||||
type={SECONDARY} |
||||
ethNumberOfDecimals={4} |
||||
/> |
||||
) |
||||
} |
||||
</div> |
||||
) |
||||
} |
||||
|
||||
renderTokenBalance () { |
||||
const { token } = this.props |
||||
|
||||
return ( |
||||
<div className="flex-column balance-display"> |
||||
<div className="token-amount"> |
||||
<TokenBalance token={token} /> |
||||
</div> |
||||
</div> |
||||
) |
||||
} |
||||
|
||||
render () { |
||||
const { token, network, assetImages } = this.props |
||||
const address = token && token.address |
||||
const image = assetImages && address ? assetImages[token.address] : undefined |
||||
|
||||
return ( |
||||
<div className="balance-container"> |
||||
<Identicon |
||||
diameter={50} |
||||
address={address} |
||||
network={network} |
||||
image={image} |
||||
/> |
||||
{ token ? this.renderTokenBalance() : this.renderBalance() } |
||||
</div> |
||||
) |
||||
} |
||||
} |
@ -0,0 +1,27 @@ |
||||
import { connect } from 'react-redux' |
||||
import Balance from './balance.component' |
||||
import { |
||||
getNativeCurrency, |
||||
getAssetImages, |
||||
conversionRateSelector, |
||||
getCurrentCurrency, |
||||
getMetaMaskAccounts, |
||||
} from '../../selectors' |
||||
|
||||
const mapStateToProps = state => { |
||||
const accounts = getMetaMaskAccounts(state) |
||||
const network = state.metamask.network |
||||
const selectedAddress = state.metamask.selectedAddress || Object.keys(accounts)[0] |
||||
const account = accounts[selectedAddress] |
||||
|
||||
return { |
||||
account, |
||||
network, |
||||
nativeCurrency: getNativeCurrency(state), |
||||
conversionRate: conversionRateSelector(state), |
||||
currentCurrency: getCurrentCurrency(state), |
||||
assetImages: getAssetImages(state), |
||||
} |
||||
} |
||||
|
||||
export default connect(mapStateToProps)(Balance) |
@ -0,0 +1 @@ |
||||
export { default } from './balance.container' |
Loading…
Reference in new issue