1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00

Make notices confirmation configurable

- Confirm button will now dismiss the lost accounts array.
This commit is contained in:
Dan Finlay 2016-12-20 13:53:14 -08:00
parent 674b268982
commit 931ae5f64a
6 changed files with 72 additions and 15 deletions

View File

@ -114,7 +114,6 @@ module.exports = class KeyringController extends EventEmitter {
conversionDate: this.configManager.getConversionDate(), conversionDate: this.configManager.getConversionDate(),
keyringTypes: this.keyringTypes.map(krt => krt.type), keyringTypes: this.keyringTypes.map(krt => krt.type),
identities: this.identities, identities: this.identities,
lostAccounts: this.configManager.getLostAccounts(),
} }
} }

View File

@ -52,7 +52,9 @@ module.exports = class MetamaskController {
this.ethStore.getState(), this.ethStore.getState(),
this.configManager.getConfig(), this.configManager.getConfig(),
this.keyringController.getState(), this.keyringController.getState(),
this.noticeController.getState() this.noticeController.getState(), {
lostAccounts: this.configManager.getLostAccounts(),
}
) )
} }
@ -71,6 +73,7 @@ module.exports = class MetamaskController {
setTOSHash: this.setTOSHash.bind(this), setTOSHash: this.setTOSHash.bind(this),
checkTOSChange: this.checkTOSChange.bind(this), checkTOSChange: this.checkTOSChange.bind(this),
setGasMultiplier: this.setGasMultiplier.bind(this), setGasMultiplier: this.setGasMultiplier.bind(this),
markAccountsFound: this.markAccountsFound.bind(this),
// forward directly to keyringController // forward directly to keyringController
createNewVaultAndKeychain: nodeify(keyringController.createNewVaultAndKeychain).bind(keyringController), createNewVaultAndKeychain: nodeify(keyringController.createNewVaultAndKeychain).bind(keyringController),
@ -410,4 +413,16 @@ module.exports = class MetamaskController {
getStateNetwork () { getStateNetwork () {
return this.state.network return this.state.network
} }
markAccountsFound(cb) {
this.configManager.setLostAccounts([])
this.keyringController.getAccounts()
.then((accounts) => {
return this.keyringController.setSelectedAccount(accounts[0])
})
.then(() => {
this.sendUpdate()
cb(null, this.getState())
})
}
} }

View File

@ -20,6 +20,7 @@ var actions = {
showNotice: showNotice, showNotice: showNotice,
CLEAR_NOTICES: 'CLEAR_NOTICES', CLEAR_NOTICES: 'CLEAR_NOTICES',
clearNotices: clearNotices, clearNotices: clearNotices,
markAccountsFound,
// intialize screen // intialize screen
AGREE_TO_DISCLAIMER: 'AGREE_TO_DISCLAIMER', AGREE_TO_DISCLAIMER: 'AGREE_TO_DISCLAIMER',
agreeToDisclaimer: agreeToDisclaimer, agreeToDisclaimer: agreeToDisclaimer,
@ -591,6 +592,17 @@ function clearNotices () {
} }
} }
function markAccountsFound() {
return (dispatch) => {
dispatch(this.showLoadingIndication())
background.markAccountsFound((err, newState) => {
dispatch(this.hideLoadingIndication())
if (err) return dispatch(this.showWarning(err.message))
dispatch(actions.updateMetamaskState(newState))
})
}
}
// //
// config // config
// //

View File

@ -17,6 +17,7 @@ const SendTransactionScreen = require('./send')
const ConfirmTxScreen = require('./conf-tx') const ConfirmTxScreen = require('./conf-tx')
// notice // notice
const NoticeScreen = require('./notice') const NoticeScreen = require('./notice')
const lostAccountsNotice = require('../lib/lost-accounts-notice')
// other views // other views
const ConfigScreen = require('./config') const ConfigScreen = require('./config')
const InfoScreen = require('./info') const InfoScreen = require('./info')
@ -55,6 +56,8 @@ function mapStateToProps (state) {
network: state.metamask.network, network: state.metamask.network,
provider: state.metamask.provider, provider: state.metamask.provider,
forgottenPassword: state.appState.forgottenPassword, forgottenPassword: state.appState.forgottenPassword,
lastUnreadNotice: state.metamask.lastUnreadNotice,
lostAccounts: state.metamask.lostAccounts,
} }
} }
@ -366,8 +369,19 @@ App.prototype.renderPrimary = function () {
} }
} }
// notices
if (!props.noActiveNotices) { if (!props.noActiveNotices) {
return h(NoticeScreen, {key: 'NoticeScreen'}) return h(NoticeScreen, {
notice: props.lastUnreadNotice,
key: 'NoticeScreen',
onConfirm: () => props.dispatch(actions.markNoticeRead(notice)),
})
} else if (props.lostAccounts && props.lostAccounts.length > 0) {
return h(NoticeScreen, {
notice: lostAccountsNotice(props.lostAccounts),
key: 'LostAccountsNotice',
onConfirm: () => props.dispatch(actions.markAccountsFound()),
})
} }
// show current view // show current view

View File

@ -7,13 +7,7 @@ const actions = require('./actions')
const linker = require('extension-link-enabler') const linker = require('extension-link-enabler')
const findDOMNode = require('react-dom').findDOMNode const findDOMNode = require('react-dom').findDOMNode
module.exports = connect(mapStateToProps)(Notice) module.exports = Notice
function mapStateToProps (state) {
return {
lastUnreadNotice: state.metamask.lastUnreadNotice,
}
}
inherits(Notice, Component) inherits(Notice, Component)
function Notice () { function Notice () {
@ -21,9 +15,8 @@ function Notice () {
} }
Notice.prototype.render = function () { Notice.prototype.render = function () {
const props = this.props const { notice, onConfirm } = this.props
const title = props.lastUnreadNotice.title const { title, date, body } = notice
const date = props.lastUnreadNotice.date
return ( return (
h('.flex-column.flex-center.flex-grow', [ h('.flex-column.flex-center.flex-grow', [
@ -59,6 +52,7 @@ Notice.prototype.render = function () {
.markdown { .markdown {
overflow-x: hidden; overflow-x: hidden;
} }
.markdown h1, .markdown h2, .markdown h3 { .markdown h1, .markdown h2, .markdown h3 {
margin: 10px 0; margin: 10px 0;
font-weight: bold; font-weight: bold;
@ -92,13 +86,13 @@ Notice.prototype.render = function () {
}, },
}, [ }, [
h(ReactMarkdown, { h(ReactMarkdown, {
source: props.lastUnreadNotice.body, source: body,
skipHtml: true, skipHtml: true,
}), }),
]), ]),
h('button', { h('button', {
onClick: () => props.dispatch(actions.markNoticeRead(props.lastUnreadNotice)), onClick: onConfirm,
style: { style: {
marginTop: '18px', marginTop: '18px',
}, },

View File

@ -0,0 +1,23 @@
const summary = require('../app/util').addressSummary
module.exports = function (lostAccounts) {
return {
date: new Date().toDateString(),
title: 'Account Problem Caught',
body: `MetaMask has fixed a bug where some accounts were previously mis-generated. This was a rare issue, but you were affected!
We have successfully imported the accounts that were mis-generated, but they will no longer be recovered with your normal seed phrase.
We have marked the affected accounts as "Loose", and recommend you transfer ether and tokens away from those accounts, or export & back them up elsewhere.
Your affected accounts are:
${lostAccounts.map(acct => ` - ${summary(acct)}`).join('\n')}
These accounts have been marked as "Loose" so they will be easy to recognize in the account list.
For more information, please read [our blog post.][1]
[1]: https://medium.com/metamask/metamask-3-migration-guide-914b79533cdd#.7d8ktj4h3
`
}
}