From 041b5493dc43c9f8b69dc5a1dde4b319638618a7 Mon Sep 17 00:00:00 2001
From: Dan Finlay <dan@danfinlay.com>
Date: Fri, 13 May 2016 01:13:14 -0700
Subject: Streamlined some transition logic

Fixes #122

Had used multiple actions for some transitions, which would lead to brief intermediary states.

Now making a few actions much more explicit about what they route to, so there is less intermediary logic, and we can transition confidently to the correct view.
---
 app/scripts/lib/idStore.js                     |  4 ++--
 test/unit/actions/restore_vault_test.js        |  8 +++++++-
 test/unit/actions/set_selected_account_test.js | 21 +++++++++++++++++++++
 ui/app/account-detail.js                       |  4 ++--
 ui/app/actions.js                              | 24 +++++++++++++-----------
 ui/app/reducers/metamask.js                    |  8 +++++++-
 6 files changed, 52 insertions(+), 17 deletions(-)

diff --git a/app/scripts/lib/idStore.js b/app/scripts/lib/idStore.js
index b8d825d8b..6d3d0c0aa 100644
--- a/app/scripts/lib/idStore.js
+++ b/app/scripts/lib/idStore.js
@@ -105,14 +105,14 @@ IdentityStore.prototype.getSelectedAddress = function(){
   return configManager.getSelectedAccount()
 }
 
-IdentityStore.prototype.setSelectedAddress = function(address){
+IdentityStore.prototype.setSelectedAddress = function(address, cb){
   if (!address) {
     var addresses = this._getAddresses()
     address = addresses[0]
   }
 
   configManager.setSelectedAccount(address)
-  this._didUpdate()
+  if (cb) return cb(null, address)
 }
 
 IdentityStore.prototype.getNetwork = function(tries) {
diff --git a/test/unit/actions/restore_vault_test.js b/test/unit/actions/restore_vault_test.js
index 5675028b1..609f5429e 100644
--- a/test/unit/actions/restore_vault_test.js
+++ b/test/unit/actions/restore_vault_test.js
@@ -21,7 +21,13 @@ describe('#recoverFromSeed(password, seed)', function() {
 
   // stub out account manager
   actions._setAccountManager({
-    recoverFromSeed(pw, seed, cb) { cb(null, [{}, {}]) },
+    recoverFromSeed(pw, seed, cb) {
+      cb(null, {
+        identities: {
+          foo: 'bar'
+        }
+      })
+    },
   })
 
   it('sets metamask.isUnlocked to true', function() {
diff --git a/test/unit/actions/set_selected_account_test.js b/test/unit/actions/set_selected_account_test.js
index 0487bc5f0..69eb11e47 100644
--- a/test/unit/actions/set_selected_account_test.js
+++ b/test/unit/actions/set_selected_account_test.js
@@ -26,3 +26,24 @@ describe('SET_SELECTED_ACCOUNT', function() {
     assert.equal(resultingState.appState.activeAddress, action.value)
   });
 });
+
+describe('SHOW_ACCOUNT_DETAIL', function() {
+  it('updates metamask state', function() {
+    var initialState = {
+      metamask: {
+        selectedAccount: 'foo'
+      }
+    }
+    freeze(initialState)
+
+    const action = {
+      type: actions.SHOW_ACCOUNT_DETAIL,
+      value: 'bar',
+    }
+    freeze(action)
+
+    var resultingState = reducers(initialState, action)
+    assert.equal(resultingState.metamask.selectedAccount, action.value)
+    assert.equal(resultingState.metamask.selectedAddress, action.value)
+  })
+})
diff --git a/ui/app/account-detail.js b/ui/app/account-detail.js
index a71e85da8..5c33c3421 100644
--- a/ui/app/account-detail.js
+++ b/ui/app/account-detail.js
@@ -62,7 +62,7 @@ AccountDetailScreen.prototype.render = function() {
         h('.identicon-wrapper.flex-column.flex-center.select-none', [
           h(Identicon, {
             diameter: 62,
-            address: account.address
+            address: selected,
           }),
         ]),
 
@@ -90,7 +90,7 @@ AccountDetailScreen.prototype.render = function() {
           style: {
             'line-height': 16,
           },
-        }, addressSummary(account.address)),
+        }, addressSummary(selected)),
 
         h('i.fa.fa-download.fa-md.cursor-pointer.color-orange', {
           onClick: () => this.requestAccountExport(account.address),
diff --git a/ui/app/actions.js b/ui/app/actions.js
index 45af35e67..f489eede7 100644
--- a/ui/app/actions.js
+++ b/ui/app/actions.js
@@ -114,7 +114,7 @@ function tryUnlockMetamask(password) {
       if (err) {
         dispatch(this.unlockFailed())
       } else {
-        dispatch(this.unlockMetamask())
+        dispatch(this.unlockMetamask(selectedAccount))
       }
     })
   }
@@ -133,12 +133,12 @@ function recoverFromSeed(password, seed) {
   return (dispatch) => {
     // dispatch(this.createNewVaultInProgress())
     dispatch(this.showLoadingIndication())
-    _accountManager.recoverFromSeed(password, seed, (err, selectedAccount) => {
+    _accountManager.recoverFromSeed(password, seed, (err, metamaskState) => {
       dispatch(this.hideLoadingIndication())
       if (err) return dispatch(this.displayWarning(err.message))
 
-      dispatch(this.goHome())
-      dispatch(this.unlockMetamask())
+      var account = Object.keys(metamaskState.identities)[0]
+      dispatch(this.unlockMetamask(account))
    })
   }
 }
@@ -271,9 +271,10 @@ function unlockFailed() {
   }
 }
 
-function unlockMetamask() {
+function unlockMetamask(account) {
   return {
     type: this.UNLOCK_METAMASK,
+    value: account,
   }
 }
 
@@ -297,11 +298,13 @@ function lockMetamask() {
 
 function showAccountDetail(address) {
   return (dispatch) => {
-    _accountManager.setSelectedAddress(address)
-
-    dispatch({
-      type: this.SHOW_ACCOUNT_DETAIL,
-      value: address,
+    dispatch(this.showLoadingIndication())
+    _accountManager.setSelectedAddress(address, (err, address) => {
+      dispatch(this.hideLoadingIndication())
+      dispatch({
+        type: this.SHOW_ACCOUNT_DETAIL,
+        value: address,
+      })
     })
   }
 }
@@ -323,7 +326,6 @@ function confirmSeedWords() {
   return (dispatch) => {
     dispatch(this.showLoadingIndication())
     _accountManager.clearSeedWordCache((err, account) => {
-      dispatch(this.clearSeedWordCache(account))
       console.log('Seed word cache cleared. ' + account)
       dispatch(this.showAccountDetail(account))
     })
diff --git a/ui/app/reducers/metamask.js b/ui/app/reducers/metamask.js
index 8bf5c8aae..8628e84d2 100644
--- a/ui/app/reducers/metamask.js
+++ b/ui/app/reducers/metamask.js
@@ -29,6 +29,7 @@ function reduceMetamask(state, action) {
     return extend(metamaskState, {
       isUnlocked: true,
       isInitialized: true,
+      selectedAccount: action.value,
     })
 
   case actions.LOCK_METAMASK:
@@ -85,9 +86,14 @@ function reduceMetamask(state, action) {
     return newState
 
   case actions.SHOW_ACCOUNT_DETAIL:
-    return extend(metamaskState, {
+    const newState = extend(metamaskState, {
+      isUnlocked: true,
+      isInitialized: true,
       selectedAccount: action.value,
+      selectedAddress: action.value,
     })
+    delete newState.seedWords
+    return newState
 
   default:
     return metamaskState
-- 
cgit