diff options
-rw-r--r-- | CHANGELOG.md | 5 | ||||
-rw-r--r-- | app/scripts/lib/idStore.js | 5 | ||||
-rw-r--r-- | circle.yml | 1 | ||||
-rw-r--r-- | ui/app/actions.js | 18 | ||||
-rw-r--r-- | ui/app/app.js | 89 | ||||
-rw-r--r-- | ui/app/first-time/init-menu.js | 2 | ||||
-rw-r--r-- | ui/app/reducers/app.js | 21 | ||||
-rw-r--r-- | ui/app/unlock.js | 79 |
8 files changed, 176 insertions, 44 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index ce68838f3..a62ef00aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## Current Master +- Add a back button and and functionality to unlock screen so +that you can recover your vault from seed or create a new one +if you forget your password. - Changed transaction approval from notifications system to popup system. - Forms now retain their values even when closing the popup and reopening it. @@ -29,7 +32,7 @@ ## 2.8.0 2016-08-15 - Integrate ShapeShift -- Add a for for Coinbase to specify amount to buy +- Add a form for Coinbase to specify amount to buy - Fix various typos. - Make dapp-metamask connection more reliable - Remove Ethereum Classic from provider menu. diff --git a/app/scripts/lib/idStore.js b/app/scripts/lib/idStore.js index 7ac71e409..0f36a520b 100644 --- a/app/scripts/lib/idStore.js +++ b/app/scripts/lib/idStore.js @@ -45,7 +45,11 @@ function IdentityStore (opts = {}) { IdentityStore.prototype.createNewVault = function (password, entropy, cb) { delete this._keyStore + var serializedKeystore = this.configManager.getWallet() + if (serializedKeystore) { + this.configManager.setData({}) + } this._createIdmgmt(password, null, entropy, (err) => { if (err) return cb(err) @@ -437,6 +441,7 @@ IdentityStore.prototype.tryPassword = function (password, cb) { IdentityStore.prototype._createIdmgmt = function (password, seed, entropy, cb) { const configManager = this.configManager + var keyStore = null LightwalletKeyStore.deriveKeyFromPassword(password, (err, derivedKey) => { if (err) return cb(err) diff --git a/circle.yml b/circle.yml index a9dd98f0d..15c9a17e9 100644 --- a/circle.yml +++ b/circle.yml @@ -4,6 +4,7 @@ machine: dependencies: pre: - "npm i -g testem" + - "npm i -g mocha" override: - sudo apt-get install libxss1 libappindicator1 libindicator7 lsb-base - curl -L -o google-chrome.deb https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb diff --git a/ui/app/actions.js b/ui/app/actions.js index c6c932296..c92138f68 100644 --- a/ui/app/actions.js +++ b/ui/app/actions.js @@ -137,6 +137,12 @@ var actions = { getQr: getQr, reshowQrCode: reshowQrCode, SHOW_QR_VIEW: 'SHOW_QR_VIEW', +// FORGOT PASSWORD: + BACK_TO_INIT_MENU: 'BACK_TO_INIT_MENU', + goBackToInitView: goBackToInitView, + RECOVERY_IN_PROGRESS: 'RECOVERY_IN_PROGRESS', + BACK_TO_UNLOCK_VIEW: 'BACK_TO_UNLOCK_VIEW', + backToUnlockView: backToUnlockView, } module.exports = actions @@ -370,6 +376,12 @@ function showNewVaultSeed (seed) { } } +function backToUnlockView () { + return { + type: actions.BACK_TO_UNLOCK_VIEW, + } +} + // // unlock screen // @@ -498,6 +510,12 @@ function showConfigPage (transitionForward = true) { } } +function goBackToInitView () { + return { + type: actions.BACK_TO_INIT_MENU, + } +} + // // config // diff --git a/ui/app/app.js b/ui/app/app.js index 53ab7dd00..6dbfbb86b 100644 --- a/ui/app/app.js +++ b/ui/app/app.js @@ -51,6 +51,7 @@ function mapStateToProps (state) { menuOpen: state.appState.menuOpen, network: state.metamask.network, provider: state.metamask.provider, + forgottenPassword: state.appState.forgottenPassword, } } @@ -89,6 +90,7 @@ App.prototype.render = function () { transitionLeaveTimeout: 300, }, [ this.renderPrimary(), + this.renderBackToInitButton(), ]), ]), ]) @@ -299,6 +301,91 @@ App.prototype.renderDropdown = function () { ]) } +App.prototype.renderBackToInitButton = function () { + var props = this.props + var button = null + var backButton = function (style, justArrow = false) { + return ( + h('.flex-row', { + key: 'leftArrow', + transForward: false, + style: style, + onClick: () => props.dispatch(actions.goBackToInitView()), + }, [ + h('i.fa.fa-arrow-left.cursor-pointer'), + justArrow ? null : h('div.cursor-pointer', { + style: { + marginLeft: '3px', + }, + onClick: () => props.dispatch(actions.goBackToInitView()), + }, 'BACK'), + ]) + ) + } + if (!props.isUnlocked) { + if (props.currentView.name === 'InitMenu') { + button = props.forgottenPassword ? h('.flex-row', { + key: 'rightArrow', + style: { + position: 'absolute', + bottom: '10px', + right: '15px', + fontSize: '21px', + fontFamily: 'Montserrat Light', + color: '#7F8082', + width: '77.578px', + alignItems: 'flex-end', + }, + }, [ + h('div.cursor-pointer', { + style: { + marginRight: '3px', + }, + onClick: () => props.dispatch(actions.backToUnlockView()), + }, 'LOGIN'), + h('i.fa.fa-arrow-right.cursor-pointer'), + ]) : null + } else if (props.isInitialized) { + var style + switch (props.currentView.name) { + case 'createVault': + style = { + position: 'absolute', + top: '41px', + left: '80px', + fontSize: '21px', + fontFamily: 'Montserrat Bold', + color: 'rgb(174, 174, 174)', + } + return backButton(style, true) + case 'restoreVault': + style = { + position: 'absolute', + top: '41px', + left: '70px', + fontSize: '21px', + fontFamily: 'Montserrat Bold', + color: 'rgb(174, 174, 174)', + } + return backButton(style, true) + default: + style = { + position: 'absolute', + bottom: '10px', + left: '15px', + fontSize: '21px', + fontFamily: 'Montserrat Light', + color: '#7F8082', + width: '71.969px', + alignItems: 'flex-end', + } + return backButton(style) + } + } + } + return button +} + App.prototype.renderPrimary = function () { var props = this.props @@ -311,7 +398,7 @@ App.prototype.renderPrimary = function () { } // show initialize screen - if (!props.isInitialized) { + if (!props.isInitialized || props.forgottenPassword) { // show current view switch (props.currentView.name) { diff --git a/ui/app/first-time/init-menu.js b/ui/app/first-time/init-menu.js index e63c30fc5..94a9d3df6 100644 --- a/ui/app/first-time/init-menu.js +++ b/ui/app/first-time/init-menu.js @@ -73,9 +73,7 @@ InitializeMenuScreen.prototype.renderMenu = function () { margin: 12, }, }, 'Restore Existing Vault'), - ]) - ) } diff --git a/ui/app/reducers/app.js b/ui/app/reducers/app.js index da2c6e371..bad11113a 100644 --- a/ui/app/reducers/app.js +++ b/ui/app/reducers/app.js @@ -124,6 +124,7 @@ function reduceApp (state, action) { case actions.UNLOCK_METAMASK: return extend(appState, { + forgottenPassword: appState.forgottenPassword ? !appState.forgottenPassword : null, detailView: {}, transForward: true, isLoading: false, @@ -137,6 +138,25 @@ function reduceApp (state, action) { warning: null, }) + case actions.BACK_TO_INIT_MENU: + return extend(appState, { + warning: null, + transForward: false, + forgottenPassword: true, + currentView: { + name: 'InitMenu', + }, + }) + + case actions.BACK_TO_UNLOCK_VIEW: + return extend(appState, { + warning: null, + transForward: true, + forgottenPassword: !appState.forgottenPassword, + currentView: { + name: 'UnlockScreen', + }, + }) // reveal seed words case actions.REVEAL_SEED_CONFIRMATION: @@ -171,6 +191,7 @@ function reduceApp (state, action) { case actions.SHOW_ACCOUNT_DETAIL: return extend(appState, { + forgottenPassword: appState.forgottenPassword ? !appState.forgottenPassword : null, currentView: { name: 'accountDetail', context: action.value, diff --git a/ui/app/unlock.js b/ui/app/unlock.js index 7cc1699c3..b82e46d02 100644 --- a/ui/app/unlock.js +++ b/ui/app/unlock.js @@ -26,47 +26,46 @@ UnlockScreen.prototype.render = function () { const state = this.props const warning = state.warning return ( - - h('.unlock-screen.flex-column.flex-center.flex-grow', [ - - h(Mascot, { - animationEventEmitter: this.animationEventEmitter, - }), - - h('h1', { - style: { - fontSize: '1.4em', - textTransform: 'uppercase', - color: '#7F8082', - }, - }, 'MetaMask'), - - h('input.large-input', { - type: 'password', - id: 'password-box', - placeholder: 'enter password', - style: { - - }, - onKeyPress: this.onKeyPress.bind(this), - onInput: this.inputChanged.bind(this), - }), - - h('.error', { - style: { - display: warning ? 'block' : 'none', - }, - }, warning), - - h('button.primary.cursor-pointer', { - onClick: this.onSubmit.bind(this), - style: { - margin: 10, - }, - }, 'Unlock'), - + h('.flex-column.hey-im-here', [ + h('.unlock-screen.flex-column.flex-center.flex-grow', [ + + h(Mascot, { + animationEventEmitter: this.animationEventEmitter, + }), + + h('h1', { + style: { + fontSize: '1.4em', + textTransform: 'uppercase', + color: '#7F8082', + }, + }, 'MetaMask'), + + h('input.large-input', { + type: 'password', + id: 'password-box', + placeholder: 'enter password', + style: { + + }, + onKeyPress: this.onKeyPress.bind(this), + onInput: this.inputChanged.bind(this), + }), + + h('.error', { + style: { + display: warning ? 'block' : 'none', + }, + }, warning), + + h('button.primary.cursor-pointer', { + onClick: this.onSubmit.bind(this), + style: { + margin: 10, + }, + }, 'Unlock'), + ]), ]) - ) } |