mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
watch token on old ui
This commit is contained in:
parent
1f8a808a00
commit
00d1f6fec5
@ -50,6 +50,10 @@ AccountDetailScreen.prototype.render = function () {
|
|||||||
var account = props.accounts[selected]
|
var account = props.accounts[selected]
|
||||||
const { network, conversionRate, currentCurrency } = props
|
const { network, conversionRate, currentCurrency } = props
|
||||||
|
|
||||||
|
if (Object.keys(props.suggestedTokens).length > 0) {
|
||||||
|
this.props.dispatch(actions.showAddSuggestedTokenPage())
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
||||||
h('.account-detail-section.full-flex-height', [
|
h('.account-detail-section.full-flex-height', [
|
||||||
|
@ -0,0 +1,193 @@
|
|||||||
|
const inherits = require('util').inherits
|
||||||
|
const Component = require('react').Component
|
||||||
|
const h = require('react-hyperscript')
|
||||||
|
const connect = require('react-redux').connect
|
||||||
|
const actions = require('../../ui/app/actions')
|
||||||
|
const Tooltip = require('./components/tooltip.js')
|
||||||
|
const ethUtil = require('ethereumjs-util')
|
||||||
|
|
||||||
|
module.exports = connect(mapStateToProps)(AddSuggestedTokenScreen)
|
||||||
|
|
||||||
|
function mapStateToProps (state) {
|
||||||
|
return {
|
||||||
|
identities: state.metamask.identities,
|
||||||
|
suggestedTokens: state.metamask.suggestedTokens,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inherits(AddSuggestedTokenScreen, Component)
|
||||||
|
function AddSuggestedTokenScreen () {
|
||||||
|
this.state = {
|
||||||
|
warning: null,
|
||||||
|
}
|
||||||
|
Component.call(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
AddSuggestedTokenScreen.prototype.render = function () {
|
||||||
|
const state = this.state
|
||||||
|
const props = this.props
|
||||||
|
const { warning } = state
|
||||||
|
const key = Object.keys(props.suggestedTokens)[0]
|
||||||
|
const { address, symbol, decimals } = props.suggestedTokens[key]
|
||||||
|
|
||||||
|
return (
|
||||||
|
h('.flex-column.flex-grow', [
|
||||||
|
|
||||||
|
// subtitle and nav
|
||||||
|
h('.section-title.flex-row.flex-center', [
|
||||||
|
h('h2.page-subtitle', 'Add Suggested Token'),
|
||||||
|
]),
|
||||||
|
|
||||||
|
h('.error', {
|
||||||
|
style: {
|
||||||
|
display: warning ? 'block' : 'none',
|
||||||
|
padding: '0 20px',
|
||||||
|
textAlign: 'center',
|
||||||
|
},
|
||||||
|
}, warning),
|
||||||
|
|
||||||
|
// conf view
|
||||||
|
h('.flex-column.flex-justify-center.flex-grow.select-none', [
|
||||||
|
h('.flex-space-around', {
|
||||||
|
style: {
|
||||||
|
padding: '20px',
|
||||||
|
},
|
||||||
|
}, [
|
||||||
|
|
||||||
|
h('div', [
|
||||||
|
h(Tooltip, {
|
||||||
|
position: 'top',
|
||||||
|
title: 'The contract of the actual token contract. Click for more info.',
|
||||||
|
}, [
|
||||||
|
h('a', {
|
||||||
|
style: { fontWeight: 'bold', paddingRight: '10px'},
|
||||||
|
href: 'https://support.metamask.io/kb/article/24-what-is-a-token-contract-address',
|
||||||
|
target: '_blank',
|
||||||
|
}, [
|
||||||
|
h('span', 'Token Contract Address '),
|
||||||
|
h('i.fa.fa-question-circle'),
|
||||||
|
]),
|
||||||
|
]),
|
||||||
|
]),
|
||||||
|
|
||||||
|
h('section.flex-row.flex-center', [
|
||||||
|
h('p#token-address', {
|
||||||
|
name: 'address',
|
||||||
|
style: {
|
||||||
|
width: 'inherit',
|
||||||
|
flex: '1 0 auto',
|
||||||
|
height: '30px',
|
||||||
|
margin: '8px',
|
||||||
|
},
|
||||||
|
}, address),
|
||||||
|
]),
|
||||||
|
|
||||||
|
h('div', [
|
||||||
|
h('span', {
|
||||||
|
style: { fontWeight: 'bold', paddingRight: '10px'},
|
||||||
|
}, 'Token Symbol'),
|
||||||
|
]),
|
||||||
|
|
||||||
|
h('div', { style: {display: 'flex'} }, [
|
||||||
|
h('p#token_symbol', {
|
||||||
|
style: {
|
||||||
|
width: 'inherit',
|
||||||
|
flex: '1 0 auto',
|
||||||
|
height: '30px',
|
||||||
|
margin: '8px',
|
||||||
|
},
|
||||||
|
}, symbol),
|
||||||
|
]),
|
||||||
|
|
||||||
|
h('div', [
|
||||||
|
h('span', {
|
||||||
|
style: { fontWeight: 'bold', paddingRight: '10px'},
|
||||||
|
}, 'Decimals of Precision'),
|
||||||
|
]),
|
||||||
|
|
||||||
|
h('div', { style: {display: 'flex'} }, [
|
||||||
|
h('p#token_decimals', {
|
||||||
|
type: 'number',
|
||||||
|
style: {
|
||||||
|
width: 'inherit',
|
||||||
|
flex: '1 0 auto',
|
||||||
|
height: '30px',
|
||||||
|
margin: '8px',
|
||||||
|
},
|
||||||
|
}, decimals),
|
||||||
|
]),
|
||||||
|
|
||||||
|
h('button', {
|
||||||
|
style: {
|
||||||
|
alignSelf: 'center',
|
||||||
|
margin: '8px',
|
||||||
|
},
|
||||||
|
onClick: (event) => {
|
||||||
|
this.props.dispatch(actions.removeSuggestedTokens())
|
||||||
|
},
|
||||||
|
}, 'Cancel'),
|
||||||
|
|
||||||
|
h('button', {
|
||||||
|
style: {
|
||||||
|
alignSelf: 'center',
|
||||||
|
margin: '8px',
|
||||||
|
},
|
||||||
|
onClick: (event) => {
|
||||||
|
const valid = this.validateInputs({ address, symbol, decimals })
|
||||||
|
if (!valid) return
|
||||||
|
|
||||||
|
this.props.dispatch(actions.addToken(address.trim(), symbol.trim(), decimals))
|
||||||
|
.then(() => {
|
||||||
|
this.props.dispatch(actions.removeSuggestedTokens())
|
||||||
|
})
|
||||||
|
},
|
||||||
|
}, 'Add'),
|
||||||
|
]),
|
||||||
|
]),
|
||||||
|
])
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
AddSuggestedTokenScreen.prototype.componentWillMount = function () {
|
||||||
|
if (typeof global.ethereumProvider === 'undefined') return
|
||||||
|
}
|
||||||
|
|
||||||
|
AddSuggestedTokenScreen.prototype.validateInputs = function (opts) {
|
||||||
|
let msg = ''
|
||||||
|
const identitiesList = Object.keys(this.props.identities)
|
||||||
|
const { address, symbol, decimals } = opts
|
||||||
|
const standardAddress = ethUtil.addHexPrefix(address).toLowerCase()
|
||||||
|
|
||||||
|
const validAddress = ethUtil.isValidAddress(address)
|
||||||
|
if (!validAddress) {
|
||||||
|
msg += 'Address is invalid.'
|
||||||
|
}
|
||||||
|
|
||||||
|
const validDecimals = decimals >= 0 && decimals < 36
|
||||||
|
if (!validDecimals) {
|
||||||
|
msg += 'Decimals must be at least 0, and not over 36. '
|
||||||
|
}
|
||||||
|
|
||||||
|
const symbolLen = symbol.trim().length
|
||||||
|
const validSymbol = symbolLen > 0 && symbolLen < 10
|
||||||
|
if (!validSymbol) {
|
||||||
|
msg += 'Symbol must be between 0 and 10 characters.'
|
||||||
|
}
|
||||||
|
|
||||||
|
const ownAddress = identitiesList.includes(standardAddress)
|
||||||
|
if (ownAddress) {
|
||||||
|
msg = 'Personal address detected. Input the token contract address.'
|
||||||
|
}
|
||||||
|
|
||||||
|
const isValid = validAddress && validDecimals && !ownAddress
|
||||||
|
|
||||||
|
if (!isValid) {
|
||||||
|
this.setState({
|
||||||
|
warning: msg,
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
this.setState({ warning: null })
|
||||||
|
}
|
||||||
|
|
||||||
|
return isValid
|
||||||
|
}
|
@ -22,6 +22,7 @@ const generateLostAccountsNotice = require('../lib/lost-accounts-notice')
|
|||||||
// other views
|
// other views
|
||||||
const ConfigScreen = require('./config')
|
const ConfigScreen = require('./config')
|
||||||
const AddTokenScreen = require('./add-token')
|
const AddTokenScreen = require('./add-token')
|
||||||
|
const AddSuggestedTokenScreen = require('./add-suggested-token')
|
||||||
const Import = require('./accounts/import')
|
const Import = require('./accounts/import')
|
||||||
const InfoScreen = require('./info')
|
const InfoScreen = require('./info')
|
||||||
const Loading = require('./components/loading')
|
const Loading = require('./components/loading')
|
||||||
@ -77,6 +78,7 @@ function mapStateToProps (state) {
|
|||||||
lostAccounts: state.metamask.lostAccounts,
|
lostAccounts: state.metamask.lostAccounts,
|
||||||
frequentRpcList: state.metamask.frequentRpcList || [],
|
frequentRpcList: state.metamask.frequentRpcList || [],
|
||||||
featureFlags,
|
featureFlags,
|
||||||
|
suggestedTokens: state.metamask.suggestedTokens,
|
||||||
|
|
||||||
// state needed to get account dropdown temporarily rendering from app bar
|
// state needed to get account dropdown temporarily rendering from app bar
|
||||||
identities,
|
identities,
|
||||||
@ -554,6 +556,10 @@ App.prototype.renderPrimary = function () {
|
|||||||
log.debug('rendering add-token screen from unlock screen.')
|
log.debug('rendering add-token screen from unlock screen.')
|
||||||
return h(AddTokenScreen, {key: 'add-token'})
|
return h(AddTokenScreen, {key: 'add-token'})
|
||||||
|
|
||||||
|
case 'add-suggested-token':
|
||||||
|
log.debug('rendering add-token screen from unlock screen.')
|
||||||
|
return h(AddSuggestedTokenScreen, {key: 'add-suggested-token'})
|
||||||
|
|
||||||
case 'config':
|
case 'config':
|
||||||
log.debug('rendering config screen')
|
log.debug('rendering config screen')
|
||||||
return h(ConfigScreen, {key: 'config'})
|
return h(ConfigScreen, {key: 'config'})
|
||||||
|
@ -221,7 +221,9 @@ var actions = {
|
|||||||
SET_PROVIDER_TYPE: 'SET_PROVIDER_TYPE',
|
SET_PROVIDER_TYPE: 'SET_PROVIDER_TYPE',
|
||||||
showConfigPage,
|
showConfigPage,
|
||||||
SHOW_ADD_TOKEN_PAGE: 'SHOW_ADD_TOKEN_PAGE',
|
SHOW_ADD_TOKEN_PAGE: 'SHOW_ADD_TOKEN_PAGE',
|
||||||
|
SHOW_ADD_SUGGESTED_TOKEN_PAGE: 'SHOW_ADD_SUGGESTED_TOKEN_PAGE',
|
||||||
showAddTokenPage,
|
showAddTokenPage,
|
||||||
|
showAddSuggestedTokenPage,
|
||||||
addToken,
|
addToken,
|
||||||
addTokens,
|
addTokens,
|
||||||
removeToken,
|
removeToken,
|
||||||
@ -1559,6 +1561,13 @@ function showAddTokenPage (transitionForward = true) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function showAddSuggestedTokenPage (transitionForward = true) {
|
||||||
|
return {
|
||||||
|
type: actions.SHOW_ADD_SUGGESTED_TOKEN_PAGE,
|
||||||
|
value: transitionForward,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function addToken (address, symbol, decimals) {
|
function addToken (address, symbol, decimals) {
|
||||||
return (dispatch) => {
|
return (dispatch) => {
|
||||||
dispatch(actions.showLoadingIndication())
|
dispatch(actions.showLoadingIndication())
|
||||||
|
@ -196,6 +196,15 @@ function reduceApp (state, action) {
|
|||||||
transForward: action.value,
|
transForward: action.value,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
case actions.SHOW_ADD_SUGGESTED_TOKEN_PAGE:
|
||||||
|
return extend(appState, {
|
||||||
|
currentView: {
|
||||||
|
name: 'add-suggested-token',
|
||||||
|
context: appState.currentView.context,
|
||||||
|
},
|
||||||
|
transForward: action.value,
|
||||||
|
})
|
||||||
|
|
||||||
case actions.SHOW_IMPORT_PAGE:
|
case actions.SHOW_IMPORT_PAGE:
|
||||||
return extend(appState, {
|
return extend(appState, {
|
||||||
currentView: {
|
currentView: {
|
||||||
|
Loading…
Reference in New Issue
Block a user