From 1323ad48db12a98509c2f7d7e8f2664fb71086e2 Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Sat, 27 Jun 2015 13:22:56 -0300 Subject: [PATCH] refactor address management --- public/views/walletHome.html | 2 +- src/js/controllers/index.js | 27 ++++------- src/js/controllers/walletHome.js | 62 +++++++++---------------- src/js/services/addressService.js | 75 +++++++++++++++++++++++++++++++ src/js/services/profileService.js | 5 +++ 5 files changed, 110 insertions(+), 61 deletions(-) create mode 100644 src/js/services/addressService.js diff --git a/public/views/walletHome.html b/public/views/walletHome.html index 11f66f4a9..037f68fca 100644 --- a/public/views/walletHome.html +++ b/public/views/walletHome.html @@ -258,7 +258,7 @@
- diff --git a/src/js/controllers/index.js b/src/js/controllers/index.js index 6e25753b6..635b4f0fa 100644 --- a/src/js/controllers/index.js +++ b/src/js/controllers/index.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('indexController', function($rootScope, $scope, $log, $filter, $timeout, lodash, go, profileService, configService, isCordova, rateService, storageService, gettextCatalog, gettext, amMoment) { +angular.module('copayApp.controllers').controller('indexController', function($rootScope, $scope, $log, $filter, $timeout, lodash, go, profileService, configService, isCordova, rateService, storageService, addressService, gettextCatalog, gettext, amMoment) { var self = this; self.isCordova = isCordova; @@ -464,7 +464,12 @@ angular.module('copayApp.controllers').controller('indexController', function($r self.alternativeIsoCode = config.alternativeIsoCode; // Check address - self.checkLastAddress(balance.byAddress); + addressService.isUsed(self.walletId, balance.byAddress, function(err, used){ + if (used) { + $log.debug('Address used. Creating new'); + $rootScope.$emit('Local/NeedNewAddress'); + } + }); rateService.whenAvailable(function() { @@ -488,20 +493,6 @@ angular.module('copayApp.controllers').controller('indexController', function($r } }; - self.checkLastAddress = function(byAddress, cb) { - storageService.getLastAddress(self.walletId, function(err, addr) { - var used = lodash.find(byAddress, { - address: addr - }); - if (used) { - $log.debug('Address ' + addr + ' was used. Cleaning Cache.') - storageService.clearLastAddress(self.walletId, function(err) { - $rootScope.$emit('Local/NeedNewAddress', err); - if (cb) return cb(); - }); - }; - }); - }; self.clientError = function(err) { if (isCordova) { @@ -729,7 +720,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r $rootScope.$on('Local/WalletImported', function(event, walletId) { self.needsBackup = false; storageService.setBackupFlag(walletId, function() { - storageService.clearLastAddress(walletId, function(err) { + addressService.expireAddress(walletId, function(err) { self.startScan(walletId); }); }); @@ -792,7 +783,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r if (val) { $log.debug('Clear last address cache and Scan'); lodash.each(lodash.keys(profileService.walletClients), function(walletId) { - storageService.clearLastAddress(walletId, function(err) { + addressService.expireAddress(walletId, function(err) { self.startScan(walletId); }); }); diff --git a/src/js/controllers/walletHome.js b/src/js/controllers/walletHome.js index 8c9347733..f2e1e29a9 100644 --- a/src/js/controllers/walletHome.js +++ b/src/js/controllers/walletHome.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('walletHomeController', function($scope, $rootScope, $timeout, $filter, $modal, $log, notification, txStatus, isCordova, profileService, lodash, configService, rateService, storageService, bitcore, isChromeApp, gettext, gettextCatalog, nodeWebkit) { +angular.module('copayApp.controllers').controller('walletHomeController', function($scope, $rootScope, $timeout, $filter, $modal, $log, notification, txStatus, isCordova, profileService, lodash, configService, rateService, storageService, bitcore, isChromeApp, gettext, gettextCatalog, nodeWebkit, addressService) { var self = this; $rootScope.hideMenuBar = false; @@ -38,7 +38,7 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi }); var disableAddrListener = $rootScope.$on('Local/NeedNewAddress', function() { - self.setNewAddress(); + self.setAddress(true); }); var disableFocusListener = $rootScope.$on('Local/NewFocusedWallet', function() { @@ -90,6 +90,8 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi var parseError = function(err) { + if (!err) return; + if (err.message) { // TODO : this is not used anymore? if (err.message.indexOf('CORS') >= 0) { @@ -361,56 +363,31 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi }; - // Receive - this.setNewAddress = function() { - var fc = profileService.focusedClient; - self.generatingAddress = true; - self.addrError = null; - fc.createAddress(function(err, addr) { - self.generatingAddress = false; - if (err) { - if (err.error && err.error.match(/locked/gi)) { - $log.debug(err.error); - $timeout(function() { - self.setNewAddress(); - }, 5000); - } else { - $log.debug('Creating address ERROR:', err); - parseError(err); - self.addrError = err.message || gettext('Could not create address. Check you connection and try again'); - $scope.$digest(); - } - return; - } - self.addrError = null; - self.addr[fc.credentials.walletId] = addr.address; - storageService.storeLastAddress(fc.credentials.walletId, addr.address, function() { - - self.generatingAddress = false; - $scope.$digest(); - }); - }); - }; - - this.setAddress = function() { + this.setAddress = function(forceNew) { self.addrError = null; var fc = profileService.focusedClient; if (!fc) return; - if (self.addr[fc.credentials.walletId]) { + // Address already set? + if (!forceNew && self.addr[fc.credentials.walletId]) { return; } - + self.generatingAddress = true; $timeout(function() { - storageService.getLastAddress(fc.credentials.walletId, function(err, addr) { - if (addr) { - self.addr[fc.credentials.walletId] = addr; - $scope.$digest(); - } else { - self.setNewAddress(); + addressService.getAddress(fc.credentials.walletId, forceNew, function(err,addr){ + self.generatingAddress = false; + + if (err) { + parseError(err); + self.addrError = err.message || gettext('Could not create address. Check you connection and try again'); } + + if (addr) + self.addr[fc.credentials.walletId] = addr; + + $scope.$digest(); }); }); }; @@ -1050,6 +1027,7 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi } } + /* Start setup */ this.bindTouchDown(); this.setAddress(); diff --git a/src/js/services/addressService.js b/src/js/services/addressService.js new file mode 100644 index 000000000..975961214 --- /dev/null +++ b/src/js/services/addressService.js @@ -0,0 +1,75 @@ +'use strict'; +'use strict'; +angular.module('copayApp.services') + .factory('addressService', function(storageService, profileService, $log, $timeout, lodash) { + var root = {}; + + + root.expireAddress = function(walletId,cb) { + $log.debug('Cleaning Address ' + addr ); + storageService.clearLastAddress(walletId, function(err) { + return cb(err); + }); + }; + + root.isUsed = function(walletId, byAddress, cb) { + storageService.getLastAddress(walletId, function(err, addr) { + var used = lodash.find(byAddress, { + address: addr + }); + return cb(null, used); + }); + }; + + root._createAddress = function(walletId, cb) { + var client = profileService.getClient(walletId); + + $log.debug('Creating address for wallet:', walletId); + + client.createAddress(function(err, addr) { + if (err) { + if (err.error && err.error.match(/locked/gi)) { + $log.debug(err.error); + return $timeout(function() { + root._createAddress(walletId, cb); + }, 5000); + } + $log.debug('Creating address ERROR:', err); + return cb(err); + } + return cb(null, addr.address); + }); + }; + + root.getAddress = function(walletId, forceNew, cb) { + + var firstStep; + if (forceNew) { + firstStep = storageService.clearLastAddress; + } else { + firstStep = function(walletId, cb) { + return cb(); + }; + } + + firstStep(walletId, function(err) { + if (err) return cb(err); + + storageService.getLastAddress(walletId, function(err, addr) { + if (err) return cb(err); + + if (addr) return cb(null, addr); + + root._createAddress(walletId, function(err, addr) { + if (err) return cb(err); + storageService.storeLastAddress(walletId, addr, function() { + if (err) return cb(err); + return cb(null, addr); + }); + }); + }); + }); + }; + + return root; + }); diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index 28c5477e7..956dc76ee 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -233,6 +233,11 @@ angular.module('copayApp.services') }) }; + + root.getClient = function(walletId) { + return root.walletClients[walletId]; + }; + root.deleteWalletFC = function(opts, cb) { var fc = root.focusedClient; $log.debug('Deleting Wallet:', fc.credentials.walletName);