mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 01:39:44 +01:00
Merge branch 'master' into i18n-translator-redux
This commit is contained in:
commit
4f0881e41b
@ -1,5 +1,5 @@
|
||||
# MetaMask Browser Extension
|
||||
[![Build Status](https://circleci.com/gh/MetaMask/metamask-extension.svg?style=shield&circle-token=a1ddcf3cd38e29267f254c9c59d556d513e3a1fd)](https://circleci.com/gh/MetaMask/metamask-extension) [![Coverage Status](https://coveralls.io/repos/github/MetaMask/metamask-extension/badge.svg?branch=master)](https://coveralls.io/github/MetaMask/metamask-extension?branch=master) [![Greenkeeper badge](https://badges.greenkeeper.io/MetaMask/metamask-extension.svg)](https://greenkeeper.io/) [![Stories in Ready](https://badge.waffle.io/MetaMask/metamask-extension.png?label=in%20progress&title=waffle.io)](http://waffle.io/MetaMask/metamask-extension)
|
||||
[![Build Status](https://circleci.com/gh/MetaMask/metamask-extension.svg?style=shield&circle-token=a1ddcf3cd38e29267f254c9c59d556d513e3a1fd)](https://circleci.com/gh/MetaMask/metamask-extension) [![Coverage Status](https://coveralls.io/repos/github/MetaMask/metamask-extension/badge.svg?branch=master)](https://coveralls.io/github/MetaMask/metamask-extension?branch=master) [![Greenkeeper badge](https://badges.greenkeeper.io/MetaMask/metamask-extension.svg)](https://greenkeeper.io/) [![Stories in Ready](https://badge.waffle.io/MetaMask/metamask-extension.png?label=in%20progress&title=waffle.io)](https://waffle.io/MetaMask/metamask-extension)
|
||||
|
||||
|
||||
## Support
|
||||
|
@ -1,4 +1,4 @@
|
||||
const Raven = require('../vendor/raven.min.js')
|
||||
const Raven = require('raven-js')
|
||||
const METAMASK_DEBUG = 'GULP_METAMASK_DEBUG'
|
||||
const PROD = 'https://3567c198f8a8412082d32655da2961d0@sentry.io/273505'
|
||||
const DEV = 'https://f59f3dd640d2429d9d0e2445a87ea8e1@sentry.io/273496'
|
||||
@ -18,9 +18,35 @@ function setupRaven(opts) {
|
||||
ravenTarget = PROD
|
||||
}
|
||||
|
||||
Raven.config(ravenTarget, {
|
||||
const client = Raven.config(ravenTarget, {
|
||||
release,
|
||||
}).install()
|
||||
transport: function(opts) {
|
||||
// modify report urls
|
||||
const report = opts.data
|
||||
rewriteReportUrls(report)
|
||||
// make request normally
|
||||
client._makeRequest(opts)
|
||||
},
|
||||
})
|
||||
client.install()
|
||||
|
||||
return Raven
|
||||
}
|
||||
|
||||
function rewriteReportUrls(report) {
|
||||
// update request url
|
||||
report.request.url = toMetamaskUrl(report.request.url)
|
||||
// update exception stack trace
|
||||
report.exception.values.forEach(item => {
|
||||
item.stacktrace.frames.forEach(frame => {
|
||||
frame.filename = toMetamaskUrl(frame.filename)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function toMetamaskUrl(origUrl) {
|
||||
const filePath = origUrl.split(location.origin)[1]
|
||||
if (!filePath) return origUrl
|
||||
const metamaskUrl = `metamask${filePath}`
|
||||
return metamaskUrl
|
||||
}
|
||||
|
3
app/scripts/vendor/raven.min.js
vendored
3
app/scripts/vendor/raven.min.js
vendored
File diff suppressed because one or more lines are too long
@ -339,7 +339,7 @@ function generateBundler(opts, performBundle) {
|
||||
const browserifyOpts = assign({}, watchify.args, {
|
||||
entries: ['./app/scripts/'+opts.filename],
|
||||
plugin: 'browserify-derequire',
|
||||
debug: debug,
|
||||
debug: true,
|
||||
fullPaths: debug,
|
||||
})
|
||||
|
||||
@ -405,13 +405,13 @@ function bundleTask(opts) {
|
||||
.pipe(buffer())
|
||||
// sourcemaps
|
||||
// loads map from browserify file
|
||||
.pipe(gulpif(debug, sourcemaps.init({ loadMaps: true })))
|
||||
.pipe(sourcemaps.init({ loadMaps: true }))
|
||||
// Minification
|
||||
.pipe(gulpif(opts.isBuild, uglify({
|
||||
mangle: { reserved: [ 'MetamaskInpageProvider' ] },
|
||||
})))
|
||||
// writes .map file
|
||||
.pipe(gulpif(debug, sourcemaps.write('./')))
|
||||
.pipe(sourcemaps.write(debug ? './' : '../../sourcemaps'))
|
||||
// write completed bundles
|
||||
.pipe(gulp.dest('./dist/firefox/scripts'))
|
||||
.pipe(gulp.dest('./dist/chrome/scripts'))
|
||||
|
68
package-lock.json
generated
68
package-lock.json
generated
@ -182,6 +182,48 @@
|
||||
"through2": "2.0.3"
|
||||
}
|
||||
},
|
||||
"@sentry/cli": {
|
||||
"version": "1.30.3",
|
||||
"resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-1.30.3.tgz",
|
||||
"integrity": "sha1-AtD3eBwe5eG+WkMSoyX76LGzcjE=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"https-proxy-agent": "2.2.0",
|
||||
"node-fetch": "1.7.3",
|
||||
"progress": "2.0.0",
|
||||
"proxy-from-env": "1.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"agent-base": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz",
|
||||
"integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"es6-promisify": "5.0.0"
|
||||
}
|
||||
},
|
||||
"debug": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
|
||||
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"https-proxy-agent": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.0.tgz",
|
||||
"integrity": "sha512-uUWcfXHvy/dwfM9bqa6AozvAjS32dZSTUYd/4SEpYKRg6LEcPLshksnQYRudM9AyNvUARMfAg5TLjUDyX/K4vA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"agent-base": "4.2.0",
|
||||
"debug": "3.1.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "8.5.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-8.5.5.tgz",
|
||||
@ -4932,6 +4974,21 @@
|
||||
"event-emitter": "0.3.5"
|
||||
}
|
||||
},
|
||||
"es6-promise": {
|
||||
"version": "4.2.4",
|
||||
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
|
||||
"integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==",
|
||||
"dev": true
|
||||
},
|
||||
"es6-promisify": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
|
||||
"integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"es6-promise": "4.2.4"
|
||||
}
|
||||
},
|
||||
"es6-set": {
|
||||
"version": "0.1.5",
|
||||
"resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
|
||||
@ -16914,6 +16971,12 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"proxy-from-env": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
|
||||
"integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=",
|
||||
"dev": true
|
||||
},
|
||||
"prr": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
|
||||
@ -17237,6 +17300,11 @@
|
||||
"eve-raphael": "0.5.0"
|
||||
}
|
||||
},
|
||||
"raven-js": {
|
||||
"version": "3.24.0",
|
||||
"resolved": "https://registry.npmjs.org/raven-js/-/raven-js-3.24.0.tgz",
|
||||
"integrity": "sha512-+/ygcWib8PXAE7Xq53j1tYxCgkzFyp9z05LYAKp2PA9KwO4Ek74q1tkGwZyPWI/FoXOgas6jNtQ7O3tdPif6uA=="
|
||||
},
|
||||
"raw-body": {
|
||||
"version": "2.3.2",
|
||||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
|
||||
|
11
package.json
11
package.json
@ -12,7 +12,7 @@
|
||||
"mascara": "gulp build && cross-env METAMASK_DEBUG=true node ./mascara/example/server",
|
||||
"dist": "npm run dist:clear && npm install && gulp dist",
|
||||
"dist:clear": "rm -rf node_modules/eth-contract-metadata && rm -rf node_modules/eth-phishing-detect",
|
||||
"test": "npm run lint && npm run test:coverage && npm run test:integration",
|
||||
"test": "npm run test:unit && npm run test:integration && npm run lint",
|
||||
"test:unit": "cross-env METAMASK_ENV=test mocha --exit --require babel-core/register --require test/helper.js --recursive \"test/unit/**/*.js\"",
|
||||
"test:single": "cross-env METAMASK_ENV=test mocha --require test/helper.js",
|
||||
"test:integration": "npm run test:integration:build && npm run test:flat && npm run test:mascara",
|
||||
@ -29,6 +29,13 @@
|
||||
"test:mascara:build:ui": "browserify mascara/test/test-ui.js -o dist/mascara/ui.js",
|
||||
"test:mascara:build:background": "browserify mascara/src/background.js -o dist/mascara/background.js",
|
||||
"test:mascara:build:tests": "browserify test/integration/lib/first-time.js -o dist/mascara/tests.js",
|
||||
"sentry": "export RELEASE=`cat app/manifest.json| jq -r .version` && npm run sentry:release && npm run sentry:upload",
|
||||
"sentry:release": "npm run sentry:release:new && npm run sentry:release:clean",
|
||||
"sentry:release:new": "sentry-cli releases --org 'metamask' --project 'metamask' new $RELEASE",
|
||||
"sentry:release:clean": "sentry-cli releases --org 'metamask' --project 'metamask' files $RELEASE delete --all",
|
||||
"sentry:upload": "npm run sentry:upload:source && npm run sentry:upload:maps",
|
||||
"sentry:upload:source": "for FILEPATH in ./dist/chrome/scripts/*.js; do [ -e $FILEPATH ] || continue; export FILE=`basename $FILEPATH` && echo uploading $FILE && sentry-cli releases --org 'metamask' --project 'metamask' files $RELEASE upload $FILEPATH metamask/scripts/$FILE; done;",
|
||||
"sentry:upload:maps": "sentry-cli releases --org 'metamask' --project 'metamask' files $RELEASE upload-sourcemaps ./dist/sourcemaps/ --url-prefix 'sourcemaps' --rewrite",
|
||||
"lint": "gulp lint",
|
||||
"lint:fix": "gulp lint:fix",
|
||||
"disc": "gulp disc --debug",
|
||||
@ -145,6 +152,7 @@
|
||||
"pumpify": "^1.3.4",
|
||||
"qrcode-npm": "0.0.3",
|
||||
"ramda": "^0.24.1",
|
||||
"raven-js": "^3.24.0",
|
||||
"react": "^15.6.2",
|
||||
"react-addons-css-transition-group": "^15.6.0",
|
||||
"react-dom": "^15.6.2",
|
||||
@ -180,6 +188,7 @@
|
||||
"xtend": "^4.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@sentry/cli": "^1.30.3",
|
||||
"babel-core": "^6.24.1",
|
||||
"babel-eslint": "^8.0.0",
|
||||
"babel-plugin-transform-async-to-generator": "^6.24.1",
|
||||
|
@ -26,7 +26,7 @@ async function runAddTokenFlowTest (assert, done) {
|
||||
assert.ok($('.token-list-item').length === 0, 'no tokens added')
|
||||
|
||||
// Go to Add Token screen
|
||||
let addTokenButton = await queryAsync($, 'button.btn-clear.wallet-view__add-token-button')
|
||||
let addTokenButton = await queryAsync($, 'button.btn-primary.wallet-view__add-token-button')
|
||||
assert.ok(addTokenButton[0], 'add token button present')
|
||||
addTokenButton[0].click()
|
||||
|
||||
@ -38,14 +38,14 @@ async function runAddTokenFlowTest (assert, done) {
|
||||
assert.equal(addTokenTitle[0].textContent, 'Add Token', 'add token title is correct')
|
||||
|
||||
// Cancel Add Token
|
||||
const cancelAddTokenButton = await queryAsync($, 'button.btn-cancel.add-token__button')
|
||||
const cancelAddTokenButton = await queryAsync($, 'button.btn-secondary--lg.add-token__cancel-button')
|
||||
assert.ok(cancelAddTokenButton[0], 'cancel add token button present')
|
||||
cancelAddTokenButton.click()
|
||||
|
||||
assert.ok($('.wallet-view')[0], 'cancelled and returned to account detail wallet view')
|
||||
|
||||
// Return to Add Token Screen
|
||||
addTokenButton = await queryAsync($, 'button.btn-clear.wallet-view__add-token-button')
|
||||
addTokenButton = await queryAsync($, 'button.btn-primary.wallet-view__add-token-button')
|
||||
assert.ok(addTokenButton[0], 'add token button present')
|
||||
addTokenButton[0].click()
|
||||
|
||||
@ -68,7 +68,7 @@ async function runAddTokenFlowTest (assert, done) {
|
||||
tokenWrapper[0].click()
|
||||
|
||||
// Click Next button
|
||||
let nextButton = await queryAsync($, 'button.btn-clear.add-token__button')
|
||||
let nextButton = await queryAsync($, 'button.btn-primary--lg')
|
||||
assert.equal(nextButton[0].textContent, 'Next', 'next button rendered')
|
||||
nextButton[0].click()
|
||||
|
||||
@ -78,8 +78,8 @@ async function runAddTokenFlowTest (assert, done) {
|
||||
'Would you like to add these tokens?',
|
||||
'confirm add token rendered'
|
||||
)
|
||||
assert.ok($('button.btn-clear.add-token__button')[0], 'confirm add token button found')
|
||||
$('button.btn-clear.add-token__button')[0].click()
|
||||
assert.ok($('button.btn-primary--lg')[0], 'confirm add token button found')
|
||||
$('button.btn-primary--lg')[0].click()
|
||||
|
||||
// Verify added token image
|
||||
let heroBalance = await queryAsync($, '.hero-balance')
|
||||
@ -87,7 +87,7 @@ async function runAddTokenFlowTest (assert, done) {
|
||||
assert.ok(tokenImageUrl.indexOf(heroBalance.find('img').attr('src')) > -1, 'token added')
|
||||
|
||||
// Return to Add Token Screen
|
||||
addTokenButton = await queryAsync($, 'button.btn-clear.wallet-view__add-token-button')
|
||||
addTokenButton = await queryAsync($, 'button.btn-primary.wallet-view__add-token-button')
|
||||
assert.ok(addTokenButton[0], 'add token button present')
|
||||
addTokenButton[0].click()
|
||||
|
||||
@ -101,14 +101,14 @@ async function runAddTokenFlowTest (assert, done) {
|
||||
reactTriggerChange(customInput[0])
|
||||
|
||||
// Click Next button
|
||||
nextButton = await queryAsync($, 'button.btn-clear.add-token__button')
|
||||
nextButton = await queryAsync($, 'button.btn-primary--lg')
|
||||
assert.equal(nextButton[0].textContent, 'Next', 'next button rendered')
|
||||
nextButton[0].click()
|
||||
|
||||
// Verify symbol length error since contract address won't return symbol
|
||||
const errorMessage = await queryAsync($, '.add-token__add-custom-error-message')
|
||||
assert.ok(errorMessage[0], 'error rendered')
|
||||
$('button.btn-cancel.add-token__button')[0].click()
|
||||
$('button.btn-secondary--lg')[0].click()
|
||||
|
||||
// // Confirm Add token
|
||||
// assert.equal(
|
||||
@ -116,8 +116,8 @@ async function runAddTokenFlowTest (assert, done) {
|
||||
// 'Would you like to add these tokens?',
|
||||
// 'confirm add token rendered'
|
||||
// )
|
||||
// assert.ok($('button.btn-clear.add-token__button')[0], 'confirm add token button found')
|
||||
// $('button.btn-clear.add-token__button')[0].click()
|
||||
// assert.ok($('button.btn-primary--lg')[0], 'confirm add token button found')
|
||||
// $('button.btn-primary--lg')[0].click()
|
||||
|
||||
// // Verify added token image
|
||||
// heroBalance = await queryAsync($, '.hero-balance')
|
||||
|
@ -27,7 +27,7 @@ async function runConfirmSigRequestsTest(assert, done) {
|
||||
let confirmSigRowValue = await queryAsync($, '.request-signature__row-value')
|
||||
assert.ok(confirmSigRowValue[0].textContent.match(/^\#\sTerms\sof\sUse/))
|
||||
|
||||
let confirmSigSignButton = await queryAsync($, '.request-signature__footer__sign-button')
|
||||
let confirmSigSignButton = await queryAsync($, 'button.btn-primary--lg')
|
||||
confirmSigSignButton[0].click()
|
||||
|
||||
confirmSigHeadline = await queryAsync($, '.request-signature__headline')
|
||||
@ -39,7 +39,7 @@ async function runConfirmSigRequestsTest(assert, done) {
|
||||
confirmSigRowValue = await queryAsync($, '.request-signature__row-value')
|
||||
assert.equal(confirmSigRowValue[0].textContent, '0x879a053d4800c6354e76c7985a865d2922c82fb5b3f4577b2fe08b998954f2e0')
|
||||
|
||||
confirmSigSignButton = await queryAsync($, '.request-signature__footer__sign-button')
|
||||
confirmSigSignButton = await queryAsync($, 'button.btn-primary--lg')
|
||||
confirmSigSignButton[0].click()
|
||||
|
||||
confirmSigHeadline = await queryAsync($, '.request-signature__headline')
|
||||
@ -49,7 +49,7 @@ async function runConfirmSigRequestsTest(assert, done) {
|
||||
assert.equal(confirmSigRowValue[0].textContent, 'Hi, Alice!')
|
||||
assert.equal(confirmSigRowValue[1].textContent, '1337')
|
||||
|
||||
confirmSigSignButton = await queryAsync($, '.request-signature__footer__sign-button')
|
||||
confirmSigSignButton = await queryAsync($, 'button.btn-primary--lg')
|
||||
confirmSigSignButton[0].click()
|
||||
|
||||
const txView = await queryAsync($, '.tx-view')
|
||||
|
@ -21,13 +21,15 @@ global.ethQuery = {
|
||||
sendTransaction: () => {},
|
||||
}
|
||||
|
||||
global.ethereumProvider = {}
|
||||
|
||||
async function runSendFlowTest(assert, done) {
|
||||
console.log('*** start runSendFlowTest')
|
||||
const selectState = await queryAsync($, 'select')
|
||||
selectState.val('send new ui')
|
||||
reactTriggerChange(selectState[0])
|
||||
|
||||
const sendScreenButton = await queryAsync($, 'button.btn-clear.hero-balance-button')
|
||||
const sendScreenButton = await queryAsync($, 'button.btn-primary.hero-balance-button')
|
||||
assert.ok(sendScreenButton[1], 'send screen button present')
|
||||
sendScreenButton[1].click()
|
||||
|
||||
@ -120,7 +122,7 @@ async function runSendFlowTest(assert, done) {
|
||||
'send gas field should show customized gas total converted to USD'
|
||||
)
|
||||
|
||||
const sendButton = await queryAsync($, 'button.btn-clear.page-container__footer-button')
|
||||
const sendButton = await queryAsync($, 'button.btn-primary--lg.page-container__footer-button')
|
||||
assert.equal(sendButton[0].textContent, 'Next', 'next button rendered')
|
||||
sendButton[0].click()
|
||||
await timeout()
|
||||
@ -161,7 +163,7 @@ async function runSendFlowTest(assert, done) {
|
||||
sendAmountFieldInputInEdit.val('1.0')
|
||||
reactTriggerChange(sendAmountFieldInputInEdit[0])
|
||||
|
||||
const sendButtonInEdit = await queryAsync($, '.btn-clear.page-container__footer-button')
|
||||
const sendButtonInEdit = await queryAsync($, '.btn-primary--lg.page-container__footer-button')
|
||||
assert.equal(sendButtonInEdit[0].textContent, 'Next', 'next button in edit rendered')
|
||||
sendButtonInEdit[0].click()
|
||||
|
||||
|
@ -50,13 +50,13 @@ class JsonImportSubview extends Component {
|
||||
|
||||
h('div.new-account-create-form__buttons', {}, [
|
||||
|
||||
h('button.new-account-create-form__button-cancel', {
|
||||
h('button.btn-secondary.new-account-create-form__button', {
|
||||
onClick: () => this.props.goHome(),
|
||||
}, [
|
||||
this.props.t('cancel'),
|
||||
]),
|
||||
|
||||
h('button.new-account-create-form__button-create', {
|
||||
h('button.btn-primary.new-account-create-form__button', {
|
||||
onClick: () => this.createNewKeychain(),
|
||||
}, [
|
||||
this.props.t('import'),
|
||||
|
@ -47,13 +47,13 @@ PrivateKeyImportView.prototype.render = function () {
|
||||
|
||||
h('div.new-account-import-form__buttons', {}, [
|
||||
|
||||
h('button.new-account-create-form__button-cancel.allcaps', {
|
||||
h('button.btn-secondary--lg.new-account-create-form__button', {
|
||||
onClick: () => goHome(),
|
||||
}, [
|
||||
this.props.t('cancel'),
|
||||
]),
|
||||
|
||||
h('button.new-account-create-form__button-create.allcaps', {
|
||||
h('button.btn-primary--lg.new-account-create-form__button', {
|
||||
onClick: () => this.createNewKeychain(),
|
||||
}, [
|
||||
this.props.t('import'),
|
||||
|
@ -37,13 +37,13 @@ class NewAccountCreateForm extends Component {
|
||||
|
||||
h('div.new-account-create-form__buttons', {}, [
|
||||
|
||||
h('button.new-account-create-form__button-cancel.allcaps', {
|
||||
h('button.btn-secondary--lg.new-account-create-form__button', {
|
||||
onClick: () => this.props.goHome(),
|
||||
}, [
|
||||
this.props.t('cancel'),
|
||||
]),
|
||||
|
||||
h('button.new-account-create-form__button-create.allcaps', {
|
||||
h('button.btn-primary--lg.new-account-create-form__button', {
|
||||
onClick: () => this.props.createAccount(newAccountName || defaultAccountName),
|
||||
}, [
|
||||
this.props.t('create'),
|
||||
|
@ -702,10 +702,10 @@ function updateSendFrom (from) {
|
||||
}
|
||||
}
|
||||
|
||||
function updateSendTo (to) {
|
||||
function updateSendTo (to, nickname = '') {
|
||||
return {
|
||||
type: actions.UPDATE_SEND_TO,
|
||||
value: to,
|
||||
value: { to, nickname },
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -320,10 +320,10 @@ AddTokenScreen.prototype.renderConfirmation = function () {
|
||||
]),
|
||||
]),
|
||||
h('div.add-token__buttons', [
|
||||
h('button.btn-cancel.add-token__button', {
|
||||
h('button.btn-secondary--lg.add-token__cancel-button', {
|
||||
onClick: () => this.setState({ isShowingConfirmation: false }),
|
||||
}, this.props.t('back')),
|
||||
h('button.btn-clear.add-token__button', {
|
||||
h('button.btn-primary--lg', {
|
||||
onClick: () => addTokens(tokens).then(goHome),
|
||||
}, this.props.t('addTokens')),
|
||||
]),
|
||||
@ -370,10 +370,10 @@ AddTokenScreen.prototype.render = function () {
|
||||
]),
|
||||
]),
|
||||
h('div.add-token__buttons', [
|
||||
h('button.btn-cancel.add-token__button', {
|
||||
h('button.btn-secondary--lg.add-token__cancel-button', {
|
||||
onClick: goHome,
|
||||
}, this.props.t('cancel')),
|
||||
h('button.btn-clear.add-token__button', {
|
||||
h('button.btn-primary--lg', {
|
||||
onClick: this.onNext,
|
||||
}, this.props.t('next')),
|
||||
]),
|
||||
|
@ -301,12 +301,16 @@ CustomizeGasModal.prototype.render = function () {
|
||||
}, [this.props.t('revert')]),
|
||||
|
||||
h('div.send-v2__customize-gas__buttons', [
|
||||
h('div.send-v2__customize-gas__cancel.allcaps', {
|
||||
h('button.btn-secondary.send-v2__customize-gas__cancel', {
|
||||
onClick: this.props.hideModal,
|
||||
style: {
|
||||
marginRight: '10px',
|
||||
},
|
||||
}, [this.props.t('cancel')]),
|
||||
|
||||
h(`div.send-v2__customize-gas__save${error ? '__error' : ''}.allcaps`, {
|
||||
h('button.btn-primary.send-v2__customize-gas__save', {
|
||||
onClick: () => !error && this.save(newGasPrice, gasLimit, gasTotal),
|
||||
className: error && 'btn-primary--disabled',
|
||||
}, [this.props.t('save')]),
|
||||
]),
|
||||
|
||||
|
@ -9,7 +9,7 @@ const networkMap = require('ethjs-ens/lib/network-map.json')
|
||||
const ensRE = /.+\..+$/
|
||||
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'
|
||||
const connect = require('../metamask-connect')
|
||||
|
||||
const ToAutoComplete = require('./send/to-autocomplete')
|
||||
|
||||
module.exports = connect()(EnsInput)
|
||||
|
||||
@ -22,12 +22,14 @@ EnsInput.prototype.render = function () {
|
||||
const props = this.props
|
||||
const opts = extend(props, {
|
||||
list: 'addresses',
|
||||
onChange: () => {
|
||||
onChange: (recipient) => {
|
||||
const network = this.props.network
|
||||
const networkHasEnsSupport = getNetworkEnsSupport(network)
|
||||
|
||||
if (!networkHasEnsSupport) return
|
||||
|
||||
const recipient = document.querySelector('input[name="address"]').value
|
||||
props.onChange(recipient)
|
||||
|
||||
if (recipient.match(ensRE) === null) {
|
||||
return this.setState({
|
||||
loadingEns: false,
|
||||
@ -39,34 +41,13 @@ EnsInput.prototype.render = function () {
|
||||
this.setState({
|
||||
loadingEns: true,
|
||||
})
|
||||
this.checkName()
|
||||
this.checkName(recipient)
|
||||
},
|
||||
})
|
||||
return h('div', {
|
||||
style: { width: '100%' },
|
||||
style: { width: '100%', position: 'relative' },
|
||||
}, [
|
||||
h('input.large-input.send-screen-input', opts),
|
||||
// The address book functionality.
|
||||
h('datalist#addresses',
|
||||
[
|
||||
// Corresponds to the addresses owned.
|
||||
Object.keys(props.identities).map((key) => {
|
||||
const identity = props.identities[key]
|
||||
return h('option', {
|
||||
value: identity.address,
|
||||
label: identity.name,
|
||||
key: identity.address,
|
||||
})
|
||||
}),
|
||||
// Corresponds to previously sent-to addresses.
|
||||
props.addressBook.map((identity) => {
|
||||
return h('option', {
|
||||
value: identity.address,
|
||||
label: identity.name,
|
||||
key: identity.address,
|
||||
})
|
||||
}),
|
||||
]),
|
||||
h(ToAutoComplete, { ...opts }),
|
||||
this.ensIcon(),
|
||||
])
|
||||
}
|
||||
@ -83,8 +64,7 @@ EnsInput.prototype.componentDidMount = function () {
|
||||
}
|
||||
}
|
||||
|
||||
EnsInput.prototype.lookupEnsName = function () {
|
||||
const recipient = document.querySelector('input[name="address"]').value
|
||||
EnsInput.prototype.lookupEnsName = function (recipient) {
|
||||
const { ensResolution } = this.state
|
||||
|
||||
log.info(`ENS attempting to resolve name: ${recipient}`)
|
||||
@ -130,8 +110,8 @@ EnsInput.prototype.ensIcon = function (recipient) {
|
||||
title: hoverText,
|
||||
style: {
|
||||
position: 'absolute',
|
||||
padding: '9px',
|
||||
transform: 'translatex(-40px)',
|
||||
top: '16px',
|
||||
left: '-25px',
|
||||
},
|
||||
}, this.ensIconContents(recipient))
|
||||
}
|
||||
|
@ -62,12 +62,12 @@ AccountDetailsModal.prototype.render = function () {
|
||||
|
||||
h('div.account-modal-divider'),
|
||||
|
||||
h('button.btn-clear.account-modal__button', {
|
||||
h('button.btn-primary.account-modal__button', {
|
||||
onClick: () => global.platform.openWindow({ url: genAccountLink(address, network) }),
|
||||
}, this.props.t('etherscanView')),
|
||||
|
||||
// Holding on redesign for Export Private Key functionality
|
||||
h('button.btn-clear.account-modal__button', {
|
||||
h('button.btn-primary.account-modal__button', {
|
||||
onClick: () => showExportPrivateKeyModal(),
|
||||
}, this.props.t('exportPrivateKey')),
|
||||
|
||||
|
@ -103,7 +103,7 @@ DepositEtherModal.prototype.renderRow = function ({
|
||||
]),
|
||||
|
||||
!hideButton && h('div.deposit-ether-modal__buy-row__button', [
|
||||
h('button.deposit-ether-modal__deposit-button', {
|
||||
h('button.btn-primary--lg.deposit-ether-modal__deposit-button', {
|
||||
onClick: onButtonClick,
|
||||
}, [buttonLabel]),
|
||||
]),
|
||||
|
@ -80,14 +80,14 @@ ExportPrivateKeyModal.prototype.renderButton = function (className, onClick, lab
|
||||
ExportPrivateKeyModal.prototype.renderButtons = function (privateKey, password, address, hideModal) {
|
||||
return h('div.export-private-key-buttons', {}, [
|
||||
!privateKey && this.renderButton(
|
||||
'btn-cancel export-private-key__button export-private-key__button--cancel',
|
||||
'btn-secondary--lg export-private-key__button export-private-key__button--cancel',
|
||||
() => hideModal(),
|
||||
'Cancel'
|
||||
),
|
||||
|
||||
(privateKey
|
||||
? this.renderButton('btn-clear export-private-key__button', () => hideModal(), this.props.t('done'))
|
||||
: this.renderButton('btn-clear export-private-key__button', () => this.exportAccountAndGetPrivateKey(this.state.password, address), this.props.t('confirm'))
|
||||
? this.renderButton('btn-primary--lg export-private-key__button', () => hideModal(), this.props.t('done'))
|
||||
: this.renderButton('btn-primary--lg export-private-key__button', () => this.exportAccountAndGetPrivateKey(this.state.password, address), this.props.t('confirm'))
|
||||
),
|
||||
|
||||
])
|
||||
|
@ -69,13 +69,13 @@ function mapDispatchToProps (dispatch) {
|
||||
updateAndApproveTx: txParams => dispatch(actions.updateAndApproveTx(txParams)),
|
||||
updateTx: txData => dispatch(actions.updateTransaction(txData)),
|
||||
setSelectedAddress: address => dispatch(actions.setSelectedAddress(address)),
|
||||
addToAddressBook: address => dispatch(actions.addToAddressBook(address)),
|
||||
addToAddressBook: (address, nickname) => dispatch(actions.addToAddressBook(address, nickname)),
|
||||
updateGasTotal: newTotal => dispatch(actions.updateGasTotal(newTotal)),
|
||||
updateGasPrice: newGasPrice => dispatch(actions.updateGasPrice(newGasPrice)),
|
||||
updateGasLimit: newGasLimit => dispatch(actions.updateGasLimit(newGasLimit)),
|
||||
updateSendTokenBalance: tokenBalance => dispatch(actions.updateSendTokenBalance(tokenBalance)),
|
||||
updateSendFrom: newFrom => dispatch(actions.updateSendFrom(newFrom)),
|
||||
updateSendTo: newTo => dispatch(actions.updateSendTo(newTo)),
|
||||
updateSendTo: (newTo, nickname) => dispatch(actions.updateSendTo(newTo, nickname)),
|
||||
updateSendAmount: newAmount => dispatch(actions.updateSendAmount(newAmount)),
|
||||
updateSendMemo: newMemo => dispatch(actions.updateSendMemo(newMemo)),
|
||||
updateSendErrors: newError => dispatch(actions.updateSendErrors(newError)),
|
||||
|
@ -235,7 +235,7 @@ ShapeshiftForm.prototype.render = function () {
|
||||
|
||||
]),
|
||||
|
||||
!depositAddress && h('button.shapeshift-form__shapeshift-buy-btn', {
|
||||
!depositAddress && h('button.btn-primary--lg.shapeshift-form__shapeshift-buy-btn', {
|
||||
className: btnClass,
|
||||
disabled: !token,
|
||||
onClick: () => this.onBuyWithShapeShift(),
|
||||
|
@ -222,10 +222,10 @@ SignatureRequest.prototype.renderFooter = function () {
|
||||
}
|
||||
|
||||
return h('div.request-signature__footer', [
|
||||
h('button.request-signature__footer__cancel-button', {
|
||||
h('button.btn-secondary--lg.request-signature__footer__cancel-button', {
|
||||
onClick: cancel,
|
||||
}, this.props.t('cancel')),
|
||||
h('button.request-signature__footer__sign-button', {
|
||||
h('button.btn-primary--lg', {
|
||||
onClick: sign,
|
||||
}, this.props.t('sign')),
|
||||
])
|
||||
|
@ -68,13 +68,13 @@ TxView.prototype.renderButtons = function () {
|
||||
return !selectedToken
|
||||
? (
|
||||
h('div.flex-row.flex-center.hero-balance-buttons', [
|
||||
h('button.btn-clear.hero-balance-button.allcaps', {
|
||||
h('button.btn-primary.hero-balance-button', {
|
||||
onClick: () => showModal({
|
||||
name: 'DEPOSIT_ETHER',
|
||||
}),
|
||||
}, this.props.t('deposit')),
|
||||
|
||||
h('button.btn-clear.hero-balance-button.allcaps', {
|
||||
h('button.btn-primary.hero-balance-button', {
|
||||
style: {
|
||||
marginLeft: '0.8em',
|
||||
},
|
||||
@ -84,7 +84,7 @@ TxView.prototype.renderButtons = function () {
|
||||
)
|
||||
: (
|
||||
h('div.flex-row.flex-center.hero-balance-buttons', [
|
||||
h('button.btn-clear.hero-balance-button', {
|
||||
h('button.btn-primary.hero-balance-button', {
|
||||
onClick: showSendTokenPage,
|
||||
}, this.props.t('send')),
|
||||
])
|
||||
|
@ -167,7 +167,7 @@ WalletView.prototype.render = function () {
|
||||
|
||||
h(TokenList),
|
||||
|
||||
h('button.btn-clear.wallet-view__add-token-button', {
|
||||
h('button.btn-primary.wallet-view__add-token-button', {
|
||||
onClick: () => {
|
||||
showAddTokenPage()
|
||||
hideSidebar()
|
||||
|
@ -172,11 +172,8 @@
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
&__button {
|
||||
flex: 1 0 141px;
|
||||
margin: 0 12px;
|
||||
padding: 10px 22px;
|
||||
height: 54px;
|
||||
&__cancel-button {
|
||||
margin-right: 1.2rem;
|
||||
}
|
||||
|
||||
&__token-icons-container {
|
||||
@ -334,7 +331,7 @@
|
||||
}
|
||||
|
||||
&__buttons {
|
||||
padding: 12px 0;
|
||||
padding: 1rem;
|
||||
margin: 0;
|
||||
border-top: 1px solid $gallery;
|
||||
width: 100%;
|
||||
|
@ -2,6 +2,76 @@
|
||||
Buttons
|
||||
*/
|
||||
|
||||
.btn-primary,
|
||||
.btn-primary--lg,
|
||||
.btn-secondary,
|
||||
.btn-secondary--lg {
|
||||
background: $white;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
box-sizing: border-box;
|
||||
border-radius: 4px;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
transition: border-color .3s ease;
|
||||
padding: 0 20px;
|
||||
min-width: 140px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.btn-primary,
|
||||
.btn-primary--lg {
|
||||
color: $curious-blue;
|
||||
border: 2px solid $spindle;
|
||||
|
||||
&:active {
|
||||
background: $zumthor;
|
||||
border-color: $curious-blue;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
border-color: $curious-blue;
|
||||
}
|
||||
|
||||
&--disabled,
|
||||
&[disabled] {
|
||||
cursor: auto;
|
||||
opacity: .5;
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-secondary,
|
||||
.btn-secondary--lg {
|
||||
color: $scorpion;
|
||||
border: 2px solid $dusty-gray;
|
||||
|
||||
&:active {
|
||||
background: $gallery;
|
||||
border-color: $dusty-gray;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
border-color: $scorpion;
|
||||
}
|
||||
|
||||
&--disabled,
|
||||
&[disabled] {
|
||||
cursor: auto;
|
||||
opacity: .5;
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-primary, .btn-secondary {
|
||||
height: 44px;
|
||||
}
|
||||
|
||||
.btn-primary--lg, .btn-secondary--lg {
|
||||
height: 54px;
|
||||
}
|
||||
|
||||
.btn-green {
|
||||
background-color: #02c9b1; // TODO: reusable color in colors.css
|
||||
}
|
||||
@ -130,20 +200,6 @@ button.btn-thin {
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.btn-secondary {
|
||||
border: 1px solid #979797;
|
||||
border-radius: 2px;
|
||||
background-color: $white;
|
||||
font-size: 16px;
|
||||
line-height: 24px;
|
||||
padding: 16px 42px;
|
||||
|
||||
&[disabled] {
|
||||
background-color: $white !important;
|
||||
opacity: .5;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-tertiary {
|
||||
border: 1px solid transparent;
|
||||
border-radius: 2px;
|
||||
|
@ -103,10 +103,11 @@
|
||||
}
|
||||
|
||||
.hero-balance-button {
|
||||
min-width: initial;
|
||||
width: 6rem;
|
||||
|
||||
@media #{$sub-mid-size-breakpoint-range} {
|
||||
padding: 0.4rem;
|
||||
padding: .4rem;
|
||||
width: 4rem;
|
||||
display: flex;
|
||||
flex: 1;
|
||||
|
@ -261,7 +261,7 @@
|
||||
.account-modal__button {
|
||||
margin-top: 17px;
|
||||
padding: 10px 22px;
|
||||
width: 235px;
|
||||
width: 286px;
|
||||
}
|
||||
}
|
||||
|
||||
@ -341,9 +341,8 @@
|
||||
|
||||
.export-private-key__button {
|
||||
margin-top: 17px;
|
||||
padding: 10px 22px;
|
||||
width: 141px;
|
||||
height: 54px;
|
||||
min-width: initial;
|
||||
}
|
||||
|
||||
.export-private-key__button--cancel {
|
||||
@ -765,15 +764,7 @@
|
||||
}
|
||||
|
||||
&__deposit-button, .shapeshift-form__shapeshift-buy-btn {
|
||||
height: 54px;
|
||||
width: 257px;
|
||||
border: 1px solid $curious-blue;
|
||||
border-radius: 4px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
font-size: 16px;
|
||||
color: $curious-blue;
|
||||
background-color: $white;
|
||||
}
|
||||
|
||||
.shapeshift-form-wrapper {
|
||||
|
@ -192,29 +192,8 @@
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
&__button-cancel,
|
||||
&__button-create {
|
||||
height: 55px;
|
||||
&__button {
|
||||
width: 150px;
|
||||
border-radius: 2px;
|
||||
background-color: #FFFFFF;
|
||||
}
|
||||
|
||||
&__button-cancel {
|
||||
border: 1px solid $dusty-gray;
|
||||
color: $dusty-gray;
|
||||
font-family: Roboto;
|
||||
font-size: 16px;
|
||||
line-height: 21px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
&__button-create {
|
||||
border: 1px solid $curious-blue;
|
||||
color: $curious-blue;
|
||||
font-family: Roboto;
|
||||
font-size: 16px;
|
||||
line-height: 21px;
|
||||
text-align: center;
|
||||
min-width: initial;
|
||||
}
|
||||
}
|
@ -190,41 +190,19 @@
|
||||
width: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-evenly;
|
||||
justify-content: center;
|
||||
font-size: 22px;
|
||||
position: relative;
|
||||
flex: 0 0 auto;
|
||||
border-top: 1px solid $geyser;
|
||||
padding: 1.6rem;
|
||||
|
||||
&__cancel-button,
|
||||
&__sign-button {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex: 1 0 auto;
|
||||
font-family: Roboto;
|
||||
font-size: 16px;
|
||||
font-weight: 300;
|
||||
height: 55px;
|
||||
line-height: 32px;
|
||||
cursor: pointer;
|
||||
border-radius: 2px;
|
||||
box-shadow: none;
|
||||
max-width: 162px;
|
||||
margin: 12px;
|
||||
button {
|
||||
width: 165px;
|
||||
}
|
||||
|
||||
&__cancel-button {
|
||||
background: none;
|
||||
border: 1px solid $dusty-gray;
|
||||
margin-right: 6px;
|
||||
}
|
||||
|
||||
&__sign-button {
|
||||
background-color: $caribbean-green;
|
||||
border-width: 0;
|
||||
color: $white;
|
||||
margin-left: 6px;
|
||||
margin-right: 1.2rem;
|
||||
}
|
||||
}
|
||||
}
|
@ -782,7 +782,6 @@
|
||||
&__buttons {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
width: 181.75px;
|
||||
margin-right: 21.25px;
|
||||
}
|
||||
|
||||
@ -800,13 +799,8 @@
|
||||
}
|
||||
|
||||
&__cancel, &__save, &__save__error {
|
||||
height: 34.64px;
|
||||
width: 85.74px;
|
||||
border: 1px solid $dusty-gray;
|
||||
border-radius: 2px;
|
||||
font-family: 'DIN OT';
|
||||
font-size: 12px;
|
||||
color: $dusty-gray;
|
||||
min-width: initial;
|
||||
}
|
||||
|
||||
&__save__error {
|
||||
|
@ -130,24 +130,32 @@
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.settings__clear-button {
|
||||
font-size: 16px;
|
||||
border: 1px solid $curious-blue;
|
||||
color: $curious-blue;
|
||||
border-radius: 2px;
|
||||
padding: 18px;
|
||||
background-color: $white;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.settings__clear-button--red {
|
||||
border: 1px solid $monzo;
|
||||
.settings__button--red {
|
||||
border-color: lighten($monzo, 10%);
|
||||
color: $monzo;
|
||||
|
||||
&:active {
|
||||
background: lighten($monzo, 55%);
|
||||
border-color: $monzo;
|
||||
}
|
||||
|
||||
.settings__clear-button--orange {
|
||||
border: 1px solid rgba(247, 134, 28, 1);
|
||||
color: rgba(247, 134, 28, 1);
|
||||
&:hover {
|
||||
border-color: $monzo;
|
||||
}
|
||||
}
|
||||
|
||||
.settings__button--orange {
|
||||
border-color: lighten($ecstasy, 20%);
|
||||
color: $ecstasy;
|
||||
|
||||
&:active {
|
||||
background: lighten($ecstasy, 40%);
|
||||
border-color: $ecstasy;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
border-color: $ecstasy;
|
||||
}
|
||||
}
|
||||
|
||||
.settings__info-logo-wrapper {
|
||||
|
@ -132,7 +132,7 @@ input.large-input {
|
||||
height: 55px;
|
||||
font-size: 1rem;
|
||||
text-transform: uppercase;
|
||||
margin-right: 1rem;
|
||||
margin-right: 1.2rem;
|
||||
border-radius: 2px;
|
||||
|
||||
&:last-of-type {
|
||||
|
@ -51,6 +51,8 @@ $java: #29b6af;
|
||||
$wild-strawberry: #ff4a8d;
|
||||
$cornflower-blue: #7057ff;
|
||||
$saffron: #f6c343;
|
||||
$zumthor: #edf7ff;
|
||||
$ecstasy: #f7861c;
|
||||
|
||||
/*
|
||||
Z-Indicies
|
||||
|
@ -39,6 +39,7 @@ function reduceMetamask (state, action) {
|
||||
maxModeOn: false,
|
||||
editingTransactionId: null,
|
||||
forceGasMin: null,
|
||||
toNickname: '',
|
||||
},
|
||||
coinOptions: {},
|
||||
useBlockie: false,
|
||||
@ -239,7 +240,8 @@ function reduceMetamask (state, action) {
|
||||
return extend(metamaskState, {
|
||||
send: {
|
||||
...metamaskState.send,
|
||||
to: action.value,
|
||||
to: action.value.to,
|
||||
toNickname: action.value.nickname,
|
||||
},
|
||||
})
|
||||
|
||||
|
@ -6,7 +6,7 @@ const ethAbi = require('ethereumjs-abi')
|
||||
const ethUtil = require('ethereumjs-util')
|
||||
|
||||
const FromDropdown = require('./components/send/from-dropdown')
|
||||
const ToAutoComplete = require('./components/send/to-autocomplete')
|
||||
const EnsInput = require('./components/ens-input')
|
||||
const CurrencyDisplay = require('./components/send/currency-display')
|
||||
const MemoTextArea = require('./components/send/memo-textarea')
|
||||
const GasFeeDisplay = require('./components/send/gas-fee-display-v2')
|
||||
@ -252,7 +252,7 @@ SendTransactionScreen.prototype.renderFromRow = function () {
|
||||
])
|
||||
}
|
||||
|
||||
SendTransactionScreen.prototype.handleToChange = function (to) {
|
||||
SendTransactionScreen.prototype.handleToChange = function (to, nickname = '') {
|
||||
const {
|
||||
updateSendTo,
|
||||
updateSendErrors,
|
||||
@ -268,12 +268,12 @@ SendTransactionScreen.prototype.handleToChange = function (to) {
|
||||
toError = this.props.t('fromToSame')
|
||||
}
|
||||
|
||||
updateSendTo(to)
|
||||
updateSendTo(to, nickname)
|
||||
updateSendErrors({ to: toError })
|
||||
}
|
||||
|
||||
SendTransactionScreen.prototype.renderToRow = function () {
|
||||
const { toAccounts, errors, to } = this.props
|
||||
const { toAccounts, errors, to, network } = this.props
|
||||
|
||||
const { toDropdownOpen } = this.state
|
||||
|
||||
@ -288,7 +288,10 @@ SendTransactionScreen.prototype.renderToRow = function () {
|
||||
]),
|
||||
|
||||
h('div.send-v2__form-field', [
|
||||
h(ToAutoComplete, {
|
||||
h(EnsInput, {
|
||||
name: 'address',
|
||||
placeholder: 'Recipient Address',
|
||||
network,
|
||||
to,
|
||||
accounts: Object.entries(toAccounts).map(([key, account]) => account),
|
||||
dropdownOpen: toDropdownOpen,
|
||||
@ -509,13 +512,13 @@ SendTransactionScreen.prototype.renderFooter = function () {
|
||||
const noErrors = !amountError && toError === null
|
||||
|
||||
return h('div.page-container__footer', [
|
||||
h('button.btn-cancel.page-container__footer-button', {
|
||||
h('button.btn-secondary--lg.page-container__footer-button', {
|
||||
onClick: () => {
|
||||
clearSend()
|
||||
goHome()
|
||||
},
|
||||
}, this.props.t('cancel')),
|
||||
h('button.btn-clear.page-container__footer-button', {
|
||||
h('button.btn-primary--lg.page-container__footer-button', {
|
||||
disabled: !noErrors || !gasTotal || missingTokenBalance,
|
||||
onClick: event => this.onSubmit(event),
|
||||
}, this.props.t('next')),
|
||||
@ -537,11 +540,11 @@ SendTransactionScreen.prototype.render = function () {
|
||||
)
|
||||
}
|
||||
|
||||
SendTransactionScreen.prototype.addToAddressBookIfNew = function (newAddress) {
|
||||
SendTransactionScreen.prototype.addToAddressBookIfNew = function (newAddress, nickname = '') {
|
||||
const { toAccounts, addToAddressBook } = this.props
|
||||
if (!toAccounts.find(({ address }) => newAddress === address)) {
|
||||
// TODO: nickname, i.e. addToAddressBook(recipient, nickname)
|
||||
addToAddressBook(newAddress)
|
||||
addToAddressBook(newAddress, nickname)
|
||||
}
|
||||
}
|
||||
|
||||
@ -602,6 +605,7 @@ SendTransactionScreen.prototype.onSubmit = function (event) {
|
||||
updateTx,
|
||||
selectedToken,
|
||||
editingTransactionId,
|
||||
toNickname,
|
||||
errors: { amount: amountError, to: toError },
|
||||
} = this.props
|
||||
|
||||
@ -611,7 +615,7 @@ SendTransactionScreen.prototype.onSubmit = function (event) {
|
||||
return
|
||||
}
|
||||
|
||||
this.addToAddressBookIfNew(to)
|
||||
this.addToAddressBookIfNew(to, toNickname)
|
||||
|
||||
if (editingTransactionId) {
|
||||
const editedTx = this.getEditedTx()
|
||||
|
@ -239,7 +239,7 @@ class Settings extends Component {
|
||||
]),
|
||||
h('div.settings__content-item', [
|
||||
h('div.settings__content-item-col', [
|
||||
h('button.settings__clear-button', {
|
||||
h('button.btn-primary--lg.settings__button', {
|
||||
onClick (event) {
|
||||
window.logStateString((err, result) => {
|
||||
if (err) {
|
||||
@ -264,7 +264,7 @@ class Settings extends Component {
|
||||
h('div.settings__content-item', this.props.t('revealSeedWords')),
|
||||
h('div.settings__content-item', [
|
||||
h('div.settings__content-item-col', [
|
||||
h('button.settings__clear-button.settings__clear-button--red', {
|
||||
h('button.btn-primary--lg.settings__button--red', {
|
||||
onClick (event) {
|
||||
event.preventDefault()
|
||||
revealSeedConfirmation()
|
||||
@ -284,7 +284,7 @@ class Settings extends Component {
|
||||
h('div.settings__content-item', this.props.t('useOldUI')),
|
||||
h('div.settings__content-item', [
|
||||
h('div.settings__content-item-col', [
|
||||
h('button.settings__clear-button.settings__clear-button--orange', {
|
||||
h('button.btn-primary--lg.settings__button--orange', {
|
||||
onClick (event) {
|
||||
event.preventDefault()
|
||||
setFeatureFlagToBeta()
|
||||
@ -303,7 +303,7 @@ class Settings extends Component {
|
||||
h('div.settings__content-item', this.props.t('resetAccount')),
|
||||
h('div.settings__content-item', [
|
||||
h('div.settings__content-item-col', [
|
||||
h('button.settings__clear-button.settings__clear-button--orange', {
|
||||
h('button.btn-primary--lg.settings__button--orange', {
|
||||
onClick (event) {
|
||||
event.preventDefault()
|
||||
showResetAccountConfirmationModal()
|
||||
|
Loading…
Reference in New Issue
Block a user