From 7a63bfcc72ff765cc2f2ba66d046b2dce4b3138d Mon Sep 17 00:00:00 2001 From: Javier Date: Mon, 14 Nov 2016 14:52:10 -0300 Subject: [PATCH 01/15] add routes and views --- src/js/controllers/addresses.js | 6 ++++++ src/js/controllers/tab-receive.js | 6 ++++++ src/js/routes.js | 25 ++++++++++++++++++++++ www/views/addresses.html | 35 +++++++++++++++++++++++++++++++ www/views/allAddresses.html | 35 +++++++++++++++++++++++++++++++ www/views/tab-receive.html | 3 ++- 6 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 src/js/controllers/addresses.js create mode 100644 www/views/addresses.html create mode 100644 www/views/allAddresses.html diff --git a/src/js/controllers/addresses.js b/src/js/controllers/addresses.js new file mode 100644 index 000000000..1425ac50f --- /dev/null +++ b/src/js/controllers/addresses.js @@ -0,0 +1,6 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('addressesController', function($scope, $stateParams, profileService, walletService) { + $scope.wallet = profileService.getWallet($stateParams.walletId); + +}); diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index ea8b9778a..cae89c917 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -48,6 +48,12 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi }, 100); }; + $scope.showAddresses = function() { + $state.transitionTo('tabs.receive.addresses', { + walletId: $scope.wallet.credentials.walletId + }); + }; + $scope.openBackupNeededModal = function() { $ionicModal.fromTemplateUrl('views/includes/backupNeededPopup.html', { scope: $scope, diff --git a/src/js/routes.js b/src/js/routes.js index cd935dda2..e00498966 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -616,6 +616,31 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }) + /* + * + * Addresses + * + */ + + .state('tabs.receive.addresses', { + url: '/addresses/:walletId', + views: { + 'tab-receive@tabs': { + controller: 'addressesController', + templateUrl: 'views/addresses.html' + } + } + }) + .state('tabs.receive.allAddresses', { + url: '/allAddresses/:walletId', + views: { + 'tab-receive@tabs': { + controller: 'addressesController', + templateUrl: 'views/allAddresses.html' + } + } + }) + /* * * Init backup flow diff --git a/www/views/addresses.html b/www/views/addresses.html new file mode 100644 index 000000000..ad66c733b --- /dev/null +++ b/www/views/addresses.html @@ -0,0 +1,35 @@ + + + {{'Wallet Addresses' | translate}} + + + + + +
+
+ Translation Credits +
+
kinoshitajonaJapanese
+
KirvxFrench
+
saschadGerman
+
cmgustavo83Spanish
+
RussianNeuroMancerRussian
+
HostFatItalian
+
xm2hiChinese
+
Pirx1618Polish
+
mareksipCzech
+
+
+

+ We’re always looking for translation contributions! You can make corrections or help to make this app available in your native language by joining our community on Crowdin. + +

+ + Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language. + +
+
+
diff --git a/www/views/allAddresses.html b/www/views/allAddresses.html new file mode 100644 index 000000000..123925845 --- /dev/null +++ b/www/views/allAddresses.html @@ -0,0 +1,35 @@ + + + {{'All Addresses' | translate}} + + + + + +
+
+ Translation Credits +
+
kinoshitajonaJapanese
+
KirvxFrench
+
saschadGerman
+
cmgustavo83Spanish
+
RussianNeuroMancerRussian
+
HostFatItalian
+
xm2hiChinese
+
Pirx1618Polish
+
mareksipCzech
+
+
+

+ We’re always looking for translation contributions! You can make corrections or help to make this app available in your native language by joining our community on Crowdin. + +

+ + Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language. + +
+
+
diff --git a/www/views/tab-receive.html b/www/views/tab-receive.html index 31b386f28..9a2678faf 100644 --- a/www/views/tab-receive.html +++ b/www/views/tab-receive.html @@ -71,12 +71,13 @@ -
+
... {{walletAddrs[wallet.id]}} +
From 7e7fedc4029e1cd79109baee91977fd38d8a2208 Mon Sep 17 00:00:00 2001 From: Javier Date: Mon, 14 Nov 2016 16:51:11 -0300 Subject: [PATCH 02/15] add address list --- src/js/controllers/addresses.js | 33 ++++++++++++++++- src/js/services/walletService.js | 11 ++++++ www/views/addresses.html | 63 ++++++++++++++++++++------------ 3 files changed, 82 insertions(+), 25 deletions(-) diff --git a/src/js/controllers/addresses.js b/src/js/controllers/addresses.js index 1425ac50f..24129da76 100644 --- a/src/js/controllers/addresses.js +++ b/src/js/controllers/addresses.js @@ -1,6 +1,37 @@ 'use strict'; -angular.module('copayApp.controllers').controller('addressesController', function($scope, $stateParams, profileService, walletService) { +angular.module('copayApp.controllers').controller('addressesController', function($scope, $stateParams, $timeout, $ionicScrollDelegate, ongoingProcess, lodash, profileService, walletService) { + var ADDRESS_LIMIT = 5; $scope.wallet = profileService.getWallet($stateParams.walletId); + $scope.showInfo = false; + $scope.$on("$ionicView.beforeEnter", function(event, data) { + // $scope.unusedAddresses = getUnusedAddreses(); No backend support TODO + $scope.unusedAddresses = [{ + createdOn: 1479138140, + address: "0m9sad00810m0m1d2192d9u12d9", + path: 'xpub/0/1' + }]; + + ongoingProcess.set('extractingWalletInfo', true); + walletService.getMainAddresses($scope.wallet, ADDRESS_LIMIT, function(err, addresses) { + ongoingProcess.set('extractingWalletInfo', false); + $scope.addresses = lodash.map(addresses, function(addr) { + return { + createdOn: addr.createdOn, + address: addr.address, + path: addr.path.replace(/^m/g, 'xpub') + }; + }); + + console.log($scope.addresses); + }); + }); + + $scope.showInformation = function() { + $timeout(function() { + $scope.showInfo = !$scope.showInfo; + $ionicScrollDelegate.resize(); + }); + }; }); diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index 3e5da9097..f9b898b2b 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -773,6 +773,17 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim }); }; + root.getMainAddresses = function(wallet, limit, cb) { + var opts = {}; + opts.reverse = true; + if (limit) opts.limit = limit; + + wallet.getMainAddresses(opts, function(err, addresses) { + if (err) return cb(err); + return cb(null, addresses); + }); + }; + root.getAddress = function(wallet, forceNew, cb) { storageService.getLastAddress(wallet.id, function(err, addr) { if (err) return cb(err); diff --git a/www/views/addresses.html b/www/views/addresses.html index ad66c733b..a4be58d2a 100644 --- a/www/views/addresses.html +++ b/www/views/addresses.html @@ -1,4 +1,4 @@ - + {{'Wallet Addresses' | translate}} @@ -6,30 +6,45 @@ -
-
- Translation Credits -
-
kinoshitajonaJapanese
-
KirvxFrench
-
saschadGerman
-
cmgustavo83Spanish
-
RussianNeuroMancerRussian
-
HostFatItalian
-
xm2hiChinese
-
Pirx1618Polish
-
mareksipCzech
+
+
-
-

- We’re always looking for translation contributions! You can make corrections or help to make this app available in your native language by joining our community on Crowdin. - -

- - Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language. - + +
+ Each bitcoin wallet can generate billions of addresses from your 12-word backup. A new address is automatically generated and shown each time your recive a payment. Why? +
+ +
+ It's a good idea to avoid reusing addresses-this both protects your privacy and keeps your bitcoins secure against hypothetical attacks by quantum computers. Hide +
+ +
+
+ Unused Addresses + +
+ +
+
+ {{uAddr.address}} + + {{uAddr.path}} {{uAddr.createdOn * 1000 | amDateFormat:'MMMM Do YYYY, hh:mm a'}} + +
+
+ +
+ Not unused addresses available +
+ +
+ Addresses With Balance +
+ +
+ {{addr.address}} +
{{addr.balanceStr}}
+
From b676c5e37e7fe84423ba69d2cfb6c5acb7927426 Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 15 Nov 2016 17:40:44 -0300 Subject: [PATCH 03/15] show first 5 addresses with balance --- src/js/controllers/addresses.js | 31 +++++++++++++++++++++---------- src/js/services/walletService.js | 7 +++++++ www/views/addresses.html | 6 +++--- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/js/controllers/addresses.js b/src/js/controllers/addresses.js index 24129da76..303919044 100644 --- a/src/js/controllers/addresses.js +++ b/src/js/controllers/addresses.js @@ -1,11 +1,22 @@ 'use strict'; -angular.module('copayApp.controllers').controller('addressesController', function($scope, $stateParams, $timeout, $ionicScrollDelegate, ongoingProcess, lodash, profileService, walletService) { +angular.module('copayApp.controllers').controller('addressesController', function($scope, $stateParams, $timeout, $ionicScrollDelegate, configService, popupService, gettextCatalog, ongoingProcess, lodash, profileService, walletService) { var ADDRESS_LIMIT = 5; + var config; + var unitName; + var unitToSatoshi; + var satToUnit; + var unitDecimals; $scope.wallet = profileService.getWallet($stateParams.walletId); $scope.showInfo = false; $scope.$on("$ionicView.beforeEnter", function(event, data) { + config = configService.getSync().wallet.settings; + unitToSatoshi = config.unitToSatoshi; + satToUnit = 1 / unitToSatoshi; + unitName = config.unitName; + unitDecimals = config.unitDecimals; + // $scope.unusedAddresses = getUnusedAddreses(); No backend support TODO $scope.unusedAddresses = [{ createdOn: 1479138140, @@ -14,17 +25,17 @@ angular.module('copayApp.controllers').controller('addressesController', functio }]; ongoingProcess.set('extractingWalletInfo', true); - walletService.getMainAddresses($scope.wallet, ADDRESS_LIMIT, function(err, addresses) { + walletService.getBalance($scope.wallet, {}, function(err, resp) { ongoingProcess.set('extractingWalletInfo', false); - $scope.addresses = lodash.map(addresses, function(addr) { - return { - createdOn: addr.createdOn, - address: addr.address, - path: addr.path.replace(/^m/g, 'xpub') - }; - }); + if (err) { + return popupService.showAlert(gettextCatalog.getString('Error'), err); + } - console.log($scope.addresses); + $scope.addresses = lodash.slice(resp.byAddress, 0, ADDRESS_LIMIT); + lodash.each($scope.addresses, function(a) { + a.balanceStr = (a.amount * satToUnit).toFixed(unitDecimals) + ' ' + unitName; + }); + $scope.$digest(); }); }); diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index f9b898b2b..07efbb1b9 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -784,6 +784,13 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim }); }; + root.getBalance = function(wallet, opts, cb) { + opts = opts || {}; + wallet.getBalance(opts, function(err, resp) { + return cb(err, resp); + }); + }; + root.getAddress = function(wallet, forceNew, cb) { storageService.getLastAddress(wallet.id, function(err, addr) { if (err) return cb(err); diff --git a/www/views/addresses.html b/www/views/addresses.html index a4be58d2a..2e3955897 100644 --- a/www/views/addresses.html +++ b/www/views/addresses.html @@ -25,10 +25,10 @@
-
- {{uAddr.address}} +
+ {{uAddress.address}} - {{uAddr.path}} {{uAddr.createdOn * 1000 | amDateFormat:'MMMM Do YYYY, hh:mm a'}} + {{uAddress.path}} {{uAddress.createdOn * 1000 | amDateFormat:'MMMM Do YYYY, hh:mm a'}}
From fc73d4ff36417cfed20e230a44bf7b0caccbe518 Mon Sep 17 00:00:00 2001 From: Javier Date: Wed, 16 Nov 2016 10:15:13 -0300 Subject: [PATCH 04/15] add style --- src/sass/views/addresses.scss | 68 +++++++++++++++++++++++++++++++++++ src/sass/views/views.scss | 1 + www/views/addresses.html | 68 +++++++++++++++++++---------------- 3 files changed, 106 insertions(+), 31 deletions(-) create mode 100644 src/sass/views/addresses.scss diff --git a/src/sass/views/addresses.scss b/src/sass/views/addresses.scss new file mode 100644 index 000000000..441c3e413 --- /dev/null +++ b/src/sass/views/addresses.scss @@ -0,0 +1,68 @@ +#addresses { + .addr { + &-explanation, &-button-group { + padding: 0 1rem; + margin: 1rem 0; + } + &-heading { + font-size: 17px; + color: $dark-gray; + margin: 1rem 0; + } + &-description { + text-align: center; + font-size: 15px; + color: $mid-gray; + margin: 1rem 0; + } + &-description-disabled { + color: cadetblue; + text-decoration: none; + } + &-balance { + margin-top: 4px; + color: #5DD263; + } + &-path { + margin-top: 4px; + color: #B8B8B8; + } + .addr-title, .addr-value { + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + + a { + font-weight: bold; + } + + .addr-list { + .item { + color: $dark-gray; + padding-top: 1.3rem; + padding-bottom: 1.3rem; + + &.has-addr-value { + padding-top: .65rem; + padding-bottom: .65rem; + } + + &.item-divider { + color: $mid-gray; + padding-bottom: .5rem; + font-size: .9rem; + } + + .icon { + color: $light-gray; + } + } + + .item-note { + color: $light-gray; + } + } +} diff --git a/src/sass/views/views.scss b/src/sass/views/views.scss index f67826f61..d6e41d122 100644 --- a/src/sass/views/views.scss +++ b/src/sass/views/views.scss @@ -15,6 +15,7 @@ @import "bitpayCardIntro"; @import "bitpayCardPreferences"; @import "address-book"; +@import "addresses"; @import "wallet-backup-phrase"; @import "zero-state"; @import "onboarding/onboarding"; diff --git a/www/views/addresses.html b/www/views/addresses.html index 2e3955897..9b4a4c715 100644 --- a/www/views/addresses.html +++ b/www/views/addresses.html @@ -1,4 +1,4 @@ - + {{'Wallet Addresses' | translate}} @@ -6,44 +6,50 @@ -
- -
- -
- Each bitcoin wallet can generate billions of addresses from your 12-word backup. A new address is automatically generated and shown each time your recive a payment. Why? -
- -
- It's a good idea to avoid reusing addresses-this both protects your privacy and keeps your bitcoins secure against hypothetical attacks by quantum computers. Hide -
- -
-
- Unused Addresses - +
+
+
-
-
- {{uAddress.address}} - - {{uAddress.path}} {{uAddress.createdOn * 1000 | amDateFormat:'MMMM Do YYYY, hh:mm a'}} - +
+
+ Each bitcoin wallet can generate billions of addresses from your 12-word backup. A new address is automatically generated and shown each time your recive a payment. Why?
-
- Not unused addresses available +
+
+ It's a good idea to avoid reusing addresses-this both protects your privacy and keeps your bitcoins secure against hypothetical attacks by quantum computers. Hide +
-
- Addresses With Balance -
+
+
+ Unused Addresses + +
-
- {{addr.address}} -
{{addr.balanceStr}}
+
+
+ {{uAddress.address}} +
+ {{uAddress.path}} {{uAddress.createdOn * 1000 | amDateFormat:'MMMM Do YYYY, hh:mm a'}} +
+
+
+ +
+ Not unused addresses available +
+ +
+ Addresses With Balance +
+ +
+ {{addr.address}} +
{{addr.balanceStr}}
+
From e3746bfaec5dd583fac8225816de393d1af0af9a Mon Sep 17 00:00:00 2001 From: Javier Date: Wed, 16 Nov 2016 15:23:26 -0300 Subject: [PATCH 05/15] used/unused addresses list --- src/js/controllers/addresses.js | 50 ++++++++++++++++++++++---------- src/js/services/walletService.js | 5 ++-- src/sass/views/addresses.scss | 27 ++++++++++------- www/views/addresses.html | 21 +++++++++----- 4 files changed, 67 insertions(+), 36 deletions(-) diff --git a/src/js/controllers/addresses.js b/src/js/controllers/addresses.js index 303919044..251388134 100644 --- a/src/js/controllers/addresses.js +++ b/src/js/controllers/addresses.js @@ -1,7 +1,8 @@ 'use strict'; angular.module('copayApp.controllers').controller('addressesController', function($scope, $stateParams, $timeout, $ionicScrollDelegate, configService, popupService, gettextCatalog, ongoingProcess, lodash, profileService, walletService) { - var ADDRESS_LIMIT = 5; + var UNUSED_ADDRESS_LIMIT = 5; + var BALANCE_ADDRESS_LIMIT = 5; var config; var unitName; var unitToSatoshi; @@ -16,28 +17,47 @@ angular.module('copayApp.controllers').controller('addressesController', functio satToUnit = 1 / unitToSatoshi; unitName = config.unitName; unitDecimals = config.unitDecimals; + init(); + }); - // $scope.unusedAddresses = getUnusedAddreses(); No backend support TODO - $scope.unusedAddresses = [{ - createdOn: 1479138140, - address: "0m9sad00810m0m1d2192d9u12d9", - path: 'xpub/0/1' - }]; - + function init() { ongoingProcess.set('extractingWalletInfo', true); - walletService.getBalance($scope.wallet, {}, function(err, resp) { - ongoingProcess.set('extractingWalletInfo', false); + walletService.getMainAddresses($scope.wallet, {}, function(err, addresses) { if (err) { + ongoingProcess.set('extractingWalletInfo', false); return popupService.showAlert(gettextCatalog.getString('Error'), err); } - $scope.addresses = lodash.slice(resp.byAddress, 0, ADDRESS_LIMIT); - lodash.each($scope.addresses, function(a) { - a.balanceStr = (a.amount * satToUnit).toFixed(unitDecimals) + ' ' + unitName; + $scope.allAddresses = addresses; + + walletService.getBalance($scope.wallet, {}, function(err, resp) { + ongoingProcess.set('extractingWalletInfo', false); + if (err) { + return popupService.showAlert(gettextCatalog.getString('Error'), err); + } + + var withBalance = resp.byAddress; + var idx = lodash.indexBy(withBalance, 'address'); + var noBalance = lodash.reject($scope.allAddresses, function(x) { + return idx[x.address]; + }); + lodash.each(noBalance, function(n) { + n.path = n.path.replace(/^m/g, 'xpub'); + }); + $scope.unused = lodash.slice(noBalance, 0, UNUSED_ADDRESS_LIMIT); + $scope.withBalance = lodash.slice(withBalance, 0, BALANCE_ADDRESS_LIMIT); + + lodash.each($scope.withBalance, function(a) { + a.balanceStr = (a.amount * satToUnit).toFixed(unitDecimals) + ' ' + unitName; + }); + + $scope.viewAll = { + value: noBalance.length > UNUSED_ADDRESS_LIMIT || withBalance.length > BALANCE_ADDRESS_LIMIT + }; + $scope.$digest(); }); - $scope.$digest(); }); - }); + }; $scope.showInformation = function() { $timeout(function() { diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index 07efbb1b9..83e83a6a5 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -773,10 +773,9 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim }); }; - root.getMainAddresses = function(wallet, limit, cb) { - var opts = {}; + root.getMainAddresses = function(wallet, opts, cb) { + opts = opts || {}; opts.reverse = true; - if (limit) opts.limit = limit; wallet.getMainAddresses(opts, function(err, addresses) { if (err) return cb(err); diff --git a/src/sass/views/addresses.scss b/src/sass/views/addresses.scss index 441c3e413..130c66c36 100644 --- a/src/sass/views/addresses.scss +++ b/src/sass/views/addresses.scss @@ -14,6 +14,11 @@ font-size: 15px; color: $mid-gray; margin: 1rem 0; + a { + font-weight: bold; + cursor: pointer; + cursor: hand; + } } &-description-disabled { color: cadetblue; @@ -35,32 +40,34 @@ } } - a { - font-weight: bold; - } - .addr-list { .item { color: $dark-gray; padding-top: 1.3rem; padding-bottom: 1.3rem; - &.has-addr-value { padding-top: .65rem; padding-bottom: .65rem; } - &.item-divider { color: $mid-gray; padding-bottom: .5rem; font-size: .9rem; } - - .icon { - color: $light-gray; + &.view-all { + margin: 20px 0px 20px 0px; + cursor: pointer; + cursor: hand; + i { + font-size: 35px; + margin-right: 5px; + color: #434CBE; + } + a { + font-weight: bold; + } } } - .item-note { color: $light-gray; } diff --git a/www/views/addresses.html b/www/views/addresses.html index 9b4a4c715..8aba73dab 100644 --- a/www/views/addresses.html +++ b/www/views/addresses.html @@ -29,16 +29,16 @@
-
-
- {{uAddress.address}} +
+
+ {{u.address}}
- {{uAddress.path}} {{uAddress.createdOn * 1000 | amDateFormat:'MMMM Do YYYY, hh:mm a'}} + {{u.path}} {{u.createdOn * 1000 | amDateFormat:'MMMM Do YYYY, hh:mm a'}}
-
+
Not unused addresses available
@@ -46,9 +46,14 @@ Addresses With Balance
-
- {{addr.address}} -
{{addr.balanceStr}}
+
+ {{w.address}} +
{{w.balanceStr}}
+
+ +
From 3e156e71298a116111557b4a03de2887ddac11aa Mon Sep 17 00:00:00 2001 From: Javier Date: Wed, 16 Nov 2016 16:11:36 -0300 Subject: [PATCH 06/15] load all addresses --- src/js/controllers/addresses.js | 49 ++++++++++++++++++++------------- www/views/addresses.html | 10 +++---- www/views/allAddresses.html | 36 ++++++++---------------- 3 files changed, 47 insertions(+), 48 deletions(-) diff --git a/src/js/controllers/addresses.js b/src/js/controllers/addresses.js index 251388134..34b446dad 100644 --- a/src/js/controllers/addresses.js +++ b/src/js/controllers/addresses.js @@ -8,17 +8,10 @@ angular.module('copayApp.controllers').controller('addressesController', functio var unitToSatoshi; var satToUnit; var unitDecimals; - $scope.wallet = profileService.getWallet($stateParams.walletId); + var withBalance; + var noBalance; $scope.showInfo = false; - - $scope.$on("$ionicView.beforeEnter", function(event, data) { - config = configService.getSync().wallet.settings; - unitToSatoshi = config.unitToSatoshi; - satToUnit = 1 / unitToSatoshi; - unitName = config.unitName; - unitDecimals = config.unitDecimals; - init(); - }); + $scope.wallet = profileService.getWallet($stateParams.walletId); function init() { ongoingProcess.set('extractingWalletInfo', true); @@ -28,7 +21,7 @@ angular.module('copayApp.controllers').controller('addressesController', functio return popupService.showAlert(gettextCatalog.getString('Error'), err); } - $scope.allAddresses = addresses; + var allAddresses = addresses; walletService.getBalance($scope.wallet, {}, function(err, resp) { ongoingProcess.set('extractingWalletInfo', false); @@ -36,33 +29,51 @@ angular.module('copayApp.controllers').controller('addressesController', functio return popupService.showAlert(gettextCatalog.getString('Error'), err); } - var withBalance = resp.byAddress; + withBalance = resp.byAddress; var idx = lodash.indexBy(withBalance, 'address'); - var noBalance = lodash.reject($scope.allAddresses, function(x) { + noBalance = lodash.reject(allAddresses, function(x) { return idx[x.address]; }); - lodash.each(noBalance, function(n) { - n.path = n.path.replace(/^m/g, 'xpub'); - }); - $scope.unused = lodash.slice(noBalance, 0, UNUSED_ADDRESS_LIMIT); - $scope.withBalance = lodash.slice(withBalance, 0, BALANCE_ADDRESS_LIMIT); - lodash.each($scope.withBalance, function(a) { + processPaths(noBalance); + processPaths(withBalance); + + $scope.latestUnused = lodash.slice(noBalance, 0, UNUSED_ADDRESS_LIMIT); + $scope.latestWithBalance = lodash.slice(withBalance, 0, BALANCE_ADDRESS_LIMIT); + + lodash.each(withBalance, function(a) { a.balanceStr = (a.amount * satToUnit).toFixed(unitDecimals) + ' ' + unitName; }); $scope.viewAll = { value: noBalance.length > UNUSED_ADDRESS_LIMIT || withBalance.length > BALANCE_ADDRESS_LIMIT }; + $scope.allAddresses = noBalance.concat(withBalance); $scope.$digest(); }); }); }; + function processPaths(list) { + lodash.each(list, function(n) { + n.path = n.path.replace(/^m/g, 'xpub'); + }); + }; + $scope.showInformation = function() { $timeout(function() { $scope.showInfo = !$scope.showInfo; $ionicScrollDelegate.resize(); }); }; + + $scope.$on("$ionicView.beforeEnter", function(event, data) { + config = configService.getSync().wallet.settings; + unitToSatoshi = config.unitToSatoshi; + satToUnit = 1 / unitToSatoshi; + unitName = config.unitName; + unitDecimals = config.unitDecimals; + + if (!$scope.allAddresses || $scope.allAddresses.length < 0) init(); + }); }); diff --git a/www/views/addresses.html b/www/views/addresses.html index 8aba73dab..5f89ad7a8 100644 --- a/www/views/addresses.html +++ b/www/views/addresses.html @@ -29,8 +29,8 @@
-
-
+
+
{{u.address}}
{{u.path}} {{u.createdOn * 1000 | amDateFormat:'MMMM Do YYYY, hh:mm a'}} @@ -38,7 +38,7 @@
-
+
Not unused addresses available
@@ -46,13 +46,13 @@ Addresses With Balance
-
+
{{w.address}}
{{w.balanceStr}}
diff --git a/www/views/allAddresses.html b/www/views/allAddresses.html index 123925845..f7aef99f3 100644 --- a/www/views/allAddresses.html +++ b/www/views/allAddresses.html @@ -1,4 +1,4 @@ - + {{'All Addresses' | translate}} @@ -6,30 +6,18 @@ -
-
- Translation Credits +
+
+ +
+ {{a.address}} +
+ {{a.path}} {{a.createdOn * 1000 | amDateFormat:'MMMM Do YYYY, hh:mm a'}} +
+
{{a.balanceStr}}
-
kinoshitajonaJapanese
-
KirvxFrench
-
saschadGerman
-
cmgustavo83Spanish
-
RussianNeuroMancerRussian
-
HostFatItalian
-
xm2hiChinese
-
Pirx1618Polish
-
mareksipCzech
-
-
-

- We’re always looking for translation contributions! You can make corrections or help to make this app available in your native language by joining our community on Crowdin. - -

- - Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language. - + +
From 3068f41a6697b83859d8f36784a20eebf72066c2 Mon Sep 17 00:00:00 2001 From: Javier Date: Thu, 17 Nov 2016 09:49:29 -0300 Subject: [PATCH 07/15] add navigation --- src/js/controllers/addresses.js | 8 +++++++- src/sass/views/addresses.scss | 9 +++++++-- www/views/addresses.html | 4 ++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/js/controllers/addresses.js b/src/js/controllers/addresses.js index 34b446dad..26f683e76 100644 --- a/src/js/controllers/addresses.js +++ b/src/js/controllers/addresses.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('addressesController', function($scope, $stateParams, $timeout, $ionicScrollDelegate, configService, popupService, gettextCatalog, ongoingProcess, lodash, profileService, walletService) { +angular.module('copayApp.controllers').controller('addressesController', function($scope, $stateParams, $state, $timeout, $ionicScrollDelegate, configService, popupService, gettextCatalog, ongoingProcess, lodash, profileService, walletService) { var UNUSED_ADDRESS_LIMIT = 5; var BALANCE_ADDRESS_LIMIT = 5; var config; @@ -60,6 +60,12 @@ angular.module('copayApp.controllers').controller('addressesController', functio }); }; + $scope.viewAllAddresses = function() { + $state.go('tabs.receive.allAddresses', { + walletId: $scope.wallet.id + }); + }; + $scope.showInformation = function() { $timeout(function() { $scope.showInfo = !$scope.showInfo; diff --git a/src/sass/views/addresses.scss b/src/sass/views/addresses.scss index 130c66c36..00af459d0 100644 --- a/src/sass/views/addresses.scss +++ b/src/sass/views/addresses.scss @@ -61,12 +61,17 @@ i { font-size: 35px; margin-right: 5px; - color: #434CBE; + color: #647ce8; } - a { + span { + color: #647ce8; font-weight: bold; } } + i { + font-size: 35px; + margin-right: 5px; + } } .item-note { color: $light-gray; diff --git a/www/views/addresses.html b/www/views/addresses.html index 5f89ad7a8..b80a1a686 100644 --- a/www/views/addresses.html +++ b/www/views/addresses.html @@ -51,8 +51,8 @@
{{w.balanceStr}}
-
- View All Addresses +
+ View All Addresses
From 576f02d691a7e878a213a41b8620aa2f586fa527 Mon Sep 17 00:00:00 2001 From: Javier Date: Thu, 17 Nov 2016 11:20:06 -0300 Subject: [PATCH 08/15] generate new address --- src/js/controllers/addresses.js | 44 ++++++++++++++++++++++++------- src/js/services/onGoingProcess.js | 2 ++ src/sass/views/addresses.scss | 2 +- www/views/addresses.html | 18 +++++++------ 4 files changed, 47 insertions(+), 19 deletions(-) diff --git a/src/js/controllers/addresses.js b/src/js/controllers/addresses.js index 26f683e76..c063e172e 100644 --- a/src/js/controllers/addresses.js +++ b/src/js/controllers/addresses.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('addressesController', function($scope, $stateParams, $state, $timeout, $ionicScrollDelegate, configService, popupService, gettextCatalog, ongoingProcess, lodash, profileService, walletService) { +angular.module('copayApp.controllers').controller('addressesController', function($scope, $stateParams, $state, $timeout, $ionicScrollDelegate, configService, popupService, gettextCatalog, ongoingProcess, lodash, profileService, walletService, bwcError) { var UNUSED_ADDRESS_LIMIT = 5; var BALANCE_ADDRESS_LIMIT = 5; var config; @@ -9,36 +9,35 @@ angular.module('copayApp.controllers').controller('addressesController', functio var satToUnit; var unitDecimals; var withBalance; - var noBalance; $scope.showInfo = false; $scope.wallet = profileService.getWallet($stateParams.walletId); function init() { - ongoingProcess.set('extractingWalletInfo', true); + ongoingProcess.set('gettingAddresses', true); walletService.getMainAddresses($scope.wallet, {}, function(err, addresses) { if (err) { - ongoingProcess.set('extractingWalletInfo', false); + ongoingProcess.set('gettingAddresses', false); return popupService.showAlert(gettextCatalog.getString('Error'), err); } var allAddresses = addresses; walletService.getBalance($scope.wallet, {}, function(err, resp) { - ongoingProcess.set('extractingWalletInfo', false); + ongoingProcess.set('gettingAddresses', false); if (err) { return popupService.showAlert(gettextCatalog.getString('Error'), err); } withBalance = resp.byAddress; var idx = lodash.indexBy(withBalance, 'address'); - noBalance = lodash.reject(allAddresses, function(x) { + $scope.noBalance = lodash.reject(allAddresses, function(x) { return idx[x.address]; }); - processPaths(noBalance); + processPaths($scope.noBalance); processPaths(withBalance); - $scope.latestUnused = lodash.slice(noBalance, 0, UNUSED_ADDRESS_LIMIT); + $scope.latestUnused = lodash.slice($scope.noBalance, 0, UNUSED_ADDRESS_LIMIT); $scope.latestWithBalance = lodash.slice(withBalance, 0, BALANCE_ADDRESS_LIMIT); lodash.each(withBalance, function(a) { @@ -46,9 +45,9 @@ angular.module('copayApp.controllers').controller('addressesController', functio }); $scope.viewAll = { - value: noBalance.length > UNUSED_ADDRESS_LIMIT || withBalance.length > BALANCE_ADDRESS_LIMIT + value: $scope.noBalance.length > UNUSED_ADDRESS_LIMIT || withBalance.length > BALANCE_ADDRESS_LIMIT }; - $scope.allAddresses = noBalance.concat(withBalance); + $scope.allAddresses = $scope.noBalance.concat(withBalance); $scope.$digest(); }); }); @@ -60,6 +59,31 @@ angular.module('copayApp.controllers').controller('addressesController', functio }); }; + $scope.newAddress = function() { + ongoingProcess.set('generatingNewAddress', true); + walletService.getAddress($scope.wallet, true, function(err, addr) { + if (err) { + ongoingProcess.set('generatingNewAddress', false); + return popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err)); + } + + walletService.getMainAddresses($scope.wallet, { + limit: 1 + }, function(err, _addr) { + ongoingProcess.set('generatingNewAddress', false); + if (err) return popupService.showAlert(gettextCatalog.getString('Error'), err); + if (addr != _addr[0].address) return popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('New address could not be generated. Please try again.')); + + $scope.viewAll = { + value: [_addr[0]].concat($scope.latestUnused).length > UNUSED_ADDRESS_LIMIT + }; + $scope.noBalance.concat(_addr[0]); + $scope.latestUnused = lodash.slice($scope.noBalance, 0, UNUSED_ADDRESS_LIMIT); + $scope.$digest(); + }); + }); + }; + $scope.viewAllAddresses = function() { $state.go('tabs.receive.allAddresses', { walletId: $scope.wallet.id diff --git a/src/js/services/onGoingProcess.js b/src/js/services/onGoingProcess.js index acede937d..02e007861 100644 --- a/src/js/services/onGoingProcess.js +++ b/src/js/services/onGoingProcess.js @@ -34,6 +34,8 @@ angular.module('copayApp.services').factory('ongoingProcess', function($log, $ti 'validatingWords': gettext('Validating recovery phrase...'), 'loadingTxInfo': gettext('Loading transaction info...'), 'sendingFeedback': gettext('Sending feedback...'), + 'generatingNewAddress': gettext('Generating new address...'), + 'gettingAddresses': gettext('Getting addresses...'), }; root.clear = function() { diff --git a/src/sass/views/addresses.scss b/src/sass/views/addresses.scss index 00af459d0..ac82961f4 100644 --- a/src/sass/views/addresses.scss +++ b/src/sass/views/addresses.scss @@ -70,7 +70,7 @@ } i { font-size: 35px; - margin-right: 5px; + margin-right: 2px; } } .item-note { diff --git a/www/views/addresses.html b/www/views/addresses.html index b80a1a686..da3df420e 100644 --- a/www/views/addresses.html +++ b/www/views/addresses.html @@ -24,8 +24,8 @@
-
- Unused Addresses +
+ Unused Addresses ({{noBalance.length}})
@@ -42,13 +42,15 @@ Not unused addresses available
-
- Addresses With Balance -
+
+
+ Addresses With Balance +
-
- {{w.address}} -
{{w.balanceStr}}
+
+ {{w.address}} +
{{w.balanceStr}}
+
From 84a49cd239524649cecdc7921c3921eb9f9728b8 Mon Sep 17 00:00:00 2001 From: Javier Date: Thu, 17 Nov 2016 11:58:02 -0300 Subject: [PATCH 09/15] fix refresh list --- src/js/controllers/addresses.js | 8 ++++---- www/views/addresses.html | 4 ---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/js/controllers/addresses.js b/src/js/controllers/addresses.js index c063e172e..4a95c4618 100644 --- a/src/js/controllers/addresses.js +++ b/src/js/controllers/addresses.js @@ -74,11 +74,11 @@ angular.module('copayApp.controllers').controller('addressesController', functio if (err) return popupService.showAlert(gettextCatalog.getString('Error'), err); if (addr != _addr[0].address) return popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('New address could not be generated. Please try again.')); - $scope.viewAll = { - value: [_addr[0]].concat($scope.latestUnused).length > UNUSED_ADDRESS_LIMIT - }; - $scope.noBalance.concat(_addr[0]); + $scope.noBalance = [_addr[0]].concat($scope.noBalance); $scope.latestUnused = lodash.slice($scope.noBalance, 0, UNUSED_ADDRESS_LIMIT); + $scope.viewAll = { + value: $scope.noBalance.length > UNUSED_ADDRESS_LIMIT + }; $scope.$digest(); }); }); diff --git a/www/views/addresses.html b/www/views/addresses.html index da3df420e..e38e7f1b3 100644 --- a/www/views/addresses.html +++ b/www/views/addresses.html @@ -38,10 +38,6 @@
-
- Not unused addresses available -
-
Addresses With Balance From eed409b097968d06b9690e5b6faa9a22646879c9 Mon Sep 17 00:00:00 2001 From: Javier Date: Thu, 17 Nov 2016 13:17:28 -0300 Subject: [PATCH 10/15] gap reached message --- src/js/controllers/addresses.js | 18 ++++++++++++++++-- src/sass/views/addresses.scss | 17 +++++++++++++++++ www/views/addresses.html | 12 +++++++++--- 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/js/controllers/addresses.js b/src/js/controllers/addresses.js index 4a95c4618..5b08ac0cd 100644 --- a/src/js/controllers/addresses.js +++ b/src/js/controllers/addresses.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('addressesController', function($scope, $stateParams, $state, $timeout, $ionicScrollDelegate, configService, popupService, gettextCatalog, ongoingProcess, lodash, profileService, walletService, bwcError) { +angular.module('copayApp.controllers').controller('addressesController', function($scope, $stateParams, $state, $timeout, $ionicScrollDelegate, configService, popupService, gettextCatalog, ongoingProcess, lodash, profileService, walletService) { var UNUSED_ADDRESS_LIMIT = 5; var BALANCE_ADDRESS_LIMIT = 5; var config; @@ -10,6 +10,7 @@ angular.module('copayApp.controllers').controller('addressesController', functio var unitDecimals; var withBalance; $scope.showInfo = false; + $scope.showMore = false; $scope.wallet = profileService.getWallet($stateParams.walletId); function init() { @@ -60,11 +61,17 @@ angular.module('copayApp.controllers').controller('addressesController', functio }; $scope.newAddress = function() { + if ($scope.gapReached) return; + ongoingProcess.set('generatingNewAddress', true); walletService.getAddress($scope.wallet, true, function(err, addr) { if (err) { ongoingProcess.set('generatingNewAddress', false); - return popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err)); + $scope.gapReached = true; + $timeout(function() { + $scope.$digest(); + }); + return; } walletService.getMainAddresses($scope.wallet, { @@ -97,6 +104,13 @@ angular.module('copayApp.controllers').controller('addressesController', functio }); }; + $scope.readMore = function() { + $timeout(function() { + $scope.showMore = !$scope.showMore; + $ionicScrollDelegate.resize(); + }); + }; + $scope.$on("$ionicView.beforeEnter", function(event, data) { config = configService.getSync().wallet.settings; unitToSatoshi = config.unitToSatoshi; diff --git a/src/sass/views/addresses.scss b/src/sass/views/addresses.scss index ac82961f4..4e3ed9106 100644 --- a/src/sass/views/addresses.scss +++ b/src/sass/views/addresses.scss @@ -73,6 +73,23 @@ margin-right: 2px; } } + .box-error { + padding: 25px; + background-color: #E65555; + color: #F4F4F4; + h5 { + margin: 5px; + color: #F4F4F4; + text-align: center; + font-weight: bold; + } + a { + font-weight: bold; + color: #F4F4F4; + cursor: pointer; + cursor: hand; + } + } .item-note { color: $light-gray; } diff --git a/www/views/addresses.html b/www/views/addresses.html index e38e7f1b3..81a3ebaf0 100644 --- a/www/views/addresses.html +++ b/www/views/addresses.html @@ -6,19 +6,19 @@ -
+
-
+
Each bitcoin wallet can generate billions of addresses from your 12-word backup. A new address is automatically generated and shown each time your recive a payment. Why?
-
+
It's a good idea to avoid reusing addresses-this both protects your privacy and keeps your bitcoins secure against hypothetical attacks by quantum computers. Hide
@@ -30,6 +30,12 @@
+
+
Unused Addresses Limit
+

The maximum number of consecutive unused addresses (20) has been reached. When one of your unused addresses receives a payment, a new address will be generated and shown in your Receive tab. Read more

+

The restore process will stop when 20 addresses are generated in a row which contain no funds. To safely generate more addresses, make a payment to one of the unused addresses which has already been generated. Read less

+
+
{{u.address}}
From b564be7275d9231c2705f30985c467edd7d3af66 Mon Sep 17 00:00:00 2001 From: Javier Date: Thu, 17 Nov 2016 13:30:52 -0300 Subject: [PATCH 11/15] remove next address button - add copy to clipboard - load list after transition --- src/js/controllers/addresses.js | 2 +- src/js/services/walletService.js | 4 +--- src/sass/views/addresses.scss | 25 ++++++++++--------------- src/sass/views/tab-receive.scss | 2 ++ www/views/addresses.html | 6 +++--- www/views/allAddresses.html | 2 +- www/views/tab-receive.html | 8 +------- 7 files changed, 19 insertions(+), 30 deletions(-) diff --git a/src/js/controllers/addresses.js b/src/js/controllers/addresses.js index 5b08ac0cd..e347d816a 100644 --- a/src/js/controllers/addresses.js +++ b/src/js/controllers/addresses.js @@ -111,7 +111,7 @@ angular.module('copayApp.controllers').controller('addressesController', functio }); }; - $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.$on("$ionicView.afterEnter", function(event, data) { config = configService.getSync().wallet.settings; unitToSatoshi = config.unitToSatoshi; satToUnit = 1 / unitToSatoshi; diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index 83e83a6a5..b00722c76 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -776,10 +776,8 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim root.getMainAddresses = function(wallet, opts, cb) { opts = opts || {}; opts.reverse = true; - wallet.getMainAddresses(opts, function(err, addresses) { - if (err) return cb(err); - return cb(null, addresses); + return cb(err, addresses); }); }; diff --git a/src/sass/views/addresses.scss b/src/sass/views/addresses.scss index 4e3ed9106..a900f41b9 100644 --- a/src/sass/views/addresses.scss +++ b/src/sass/views/addresses.scss @@ -4,11 +4,6 @@ padding: 0 1rem; margin: 1rem 0; } - &-heading { - font-size: 17px; - color: $dark-gray; - margin: 1rem 0; - } &-description { text-align: center; font-size: 15px; @@ -20,10 +15,6 @@ cursor: hand; } } - &-description-disabled { - color: cadetblue; - text-decoration: none; - } &-balance { margin-top: 4px; color: #5DD263; @@ -32,15 +23,19 @@ margin-top: 4px; color: #B8B8B8; } - .addr-title, .addr-value { - display: block; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } } .addr-list { + .big-icon-svg { + padding: 0 7px; + border-radius: 50%; + width: 40px; + height: 40px; + box-shadow: none; + background-repeat: no-repeat; + background-clip: padding-box; + background-size: 103%; + } .item { color: $dark-gray; padding-top: 1.3rem; diff --git a/src/sass/views/tab-receive.scss b/src/sass/views/tab-receive.scss index 6743b1363..ead483f40 100644 --- a/src/sass/views/tab-receive.scss +++ b/src/sass/views/tab-receive.scss @@ -86,6 +86,8 @@ .bit-address { font-size: .8rem; // left:10%; + cursor: pointer; + cursor: hand; position: absolute; transition: all .15s ease; width:100%; diff --git a/www/views/addresses.html b/www/views/addresses.html index 81a3ebaf0..7756ff947 100644 --- a/www/views/addresses.html +++ b/www/views/addresses.html @@ -8,7 +8,7 @@
- +
@@ -36,7 +36,7 @@

The restore process will stop when 20 addresses are generated in a row which contain no funds. To safely generate more addresses, make a payment to one of the unused addresses which has already been generated. Read less

-
+
{{u.address}}
{{u.path}} {{u.createdOn * 1000 | amDateFormat:'MMMM Do YYYY, hh:mm a'}} @@ -49,7 +49,7 @@ Addresses With Balance
-
+
{{w.address}}
{{w.balanceStr}}
diff --git a/www/views/allAddresses.html b/www/views/allAddresses.html index f7aef99f3..4d3fece56 100644 --- a/www/views/allAddresses.html +++ b/www/views/allAddresses.html @@ -9,7 +9,7 @@
-
+
{{a.address}}
{{a.path}} {{a.createdOn * 1000 | amDateFormat:'MMMM Do YYYY, hh:mm a'}} diff --git a/www/views/tab-receive.html b/www/views/tab-receive.html index 9a2678faf..c88b7746c 100644 --- a/www/views/tab-receive.html +++ b/www/views/tab-receive.html @@ -64,19 +64,13 @@ Share
-
-
- - Next Address -
-
... - {{walletAddrs[wallet.id]}} + {{walletAddrs[wallet.id]}}
From 5980248f0360bd0ea0ce31b6d7c68139e532c7fc Mon Sep 17 00:00:00 2001 From: Javier Date: Thu, 17 Nov 2016 16:01:14 -0300 Subject: [PATCH 12/15] fix icon --- src/sass/views/addresses.scss | 17 +++++++---------- www/views/addresses.html | 10 ++++++---- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/sass/views/addresses.scss b/src/sass/views/addresses.scss index a900f41b9..5401945f7 100644 --- a/src/sass/views/addresses.scss +++ b/src/sass/views/addresses.scss @@ -25,17 +25,14 @@ } } - .addr-list { - .big-icon-svg { - padding: 0 7px; - border-radius: 50%; - width: 40px; - height: 40px; - box-shadow: none; - background-repeat: no-repeat; - background-clip: padding-box; - background-size: 103%; + .banner-icon { + margin-top: 25px; + i { + box-shadow: $hovering-box-shadow; } + } + + .addr-list { .item { color: $dark-gray; padding-top: 1.3rem; diff --git a/www/views/addresses.html b/www/views/addresses.html index 7756ff947..dc3dd9e2a 100644 --- a/www/views/addresses.html +++ b/www/views/addresses.html @@ -6,11 +6,13 @@ -
-
- -
+ +
Each bitcoin wallet can generate billions of addresses from your 12-word backup. A new address is automatically generated and shown each time your recive a payment. Why? From 439300743d4be8abed877e35312eb0e4e2e0140b Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 18 Nov 2016 11:24:39 -0300 Subject: [PATCH 13/15] remove duplicated addresses information --- src/js/controllers/preferencesInformation.js | 35 +++----------------- www/views/preferencesInformation.html | 27 --------------- 2 files changed, 4 insertions(+), 58 deletions(-) diff --git a/src/js/controllers/preferencesInformation.js b/src/js/controllers/preferencesInformation.js index 2f2da8b00..ac649c56b 100644 --- a/src/js/controllers/preferencesInformation.js +++ b/src/js/controllers/preferencesInformation.js @@ -1,11 +1,10 @@ 'use strict'; angular.module('copayApp.controllers').controller('preferencesInformation', - function($scope, $log, $timeout, $ionicHistory, $ionicScrollDelegate, platformInfo, gettextCatalog, lodash, profileService, configService, $stateParams, walletService, $state) { + function($scope, $log, $timeout, $ionicHistory, platformInfo, lodash, profileService, configService, $stateParams, walletService, $state) { var base = 'xpub'; var wallet = profileService.getWallet($stateParams.walletId); var walletId = wallet.id; - var config = configService.getSync(); var b = 1; $scope.isCordova = platformInfo.isCordova; @@ -25,9 +24,7 @@ angular.module('copayApp.controllers').controller('preferencesInformation', }; $timeout(function() { - wallet.getMainAddresses({ - doNotVerify: true - }, function(err, addrs) { + walletService.getMainAddresses(wallet, {}, function(err, addrs) { if (err) { $log.warn(err); return; @@ -52,9 +49,9 @@ angular.module('copayApp.controllers').controller('preferencesInformation', $timeout(function() { $scope.$apply(); - }, 1000); + }); }); - }, 100); + }); }; $scope.saveBlack = function() { @@ -95,29 +92,5 @@ angular.module('copayApp.controllers').controller('preferencesInformation', $scope.M = c.m; $scope.N = c.n; $scope.pubKeys = lodash.pluck(c.publicKeyRing, 'xPubKey'); - $scope.addrs = null; - - wallet.getMainAddresses({ - doNotVerify: true - }, function(err, addrs) { - if (err) { - $log.warn(err); - return; - }; - var last10 = [], - i = 0, - e = addrs.pop(); - while (i++ < 10 && e) { - e.path = base + e.path.substring(1); - last10.push(e); - e = addrs.pop(); - } - $scope.addrs = last10; - $timeout(function() { - $ionicScrollDelegate.resize(); - $scope.$apply(); - }, 10); - }); }); - }); diff --git a/www/views/preferencesInformation.html b/www/views/preferencesInformation.html index 5871585c5..5795790a2 100644 --- a/www/views/preferencesInformation.html +++ b/www/views/preferencesInformation.html @@ -80,38 +80,11 @@
Copayer {{$index}} - Copayer {{$index}} {{pk}} ({{basePath}})
-
-
- Latest Wallet Addresses -
-
-
- Only “main” addresses are shown below. This excludes “change” address. -
-
-
- {{a.address}} - {{a.path}} · {{a.createdOn *1000 | amDateFormat:'MMMM Do YYYY, h:mm a' }} -
-
-
- Please note: due to resource constraints, this list of addresses is not verified locally. A compromised BWS node could return addresses which are not controlled by this wallet. -
-
- - -
-
Balance By Address From de65f88b9ec83a621541443daffacf33d20a3e8d Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 18 Nov 2016 15:29:53 -0300 Subject: [PATCH 14/15] add popover menu to share/scan addresses --- src/js/controllers/addresses.js | 78 +++++++++++++++++++- src/js/controllers/preferencesInformation.js | 60 ++------------- src/js/services/onGoingProcess.js | 1 + src/sass/views/includes/menu-popover.scss | 12 +++ src/sass/views/tab-receive.scss | 1 - src/sass/views/views.scss | 1 + www/views/addresses.html | 7 +- www/views/allAddresses.html | 5 ++ www/views/includes/menu-popover.html | 9 +++ www/views/tab-receive.html | 2 +- 10 files changed, 117 insertions(+), 59 deletions(-) create mode 100644 src/sass/views/includes/menu-popover.scss create mode 100644 www/views/includes/menu-popover.html diff --git a/src/js/controllers/addresses.js b/src/js/controllers/addresses.js index e347d816a..9b31e431f 100644 --- a/src/js/controllers/addresses.js +++ b/src/js/controllers/addresses.js @@ -1,8 +1,9 @@ 'use strict'; -angular.module('copayApp.controllers').controller('addressesController', function($scope, $stateParams, $state, $timeout, $ionicScrollDelegate, configService, popupService, gettextCatalog, ongoingProcess, lodash, profileService, walletService) { +angular.module('copayApp.controllers').controller('addressesController', function($scope, $stateParams, $state, $timeout, $ionicHistory, $ionicPopover, $ionicScrollDelegate, configService, popupService, gettextCatalog, ongoingProcess, lodash, profileService, walletService, platformInfo) { var UNUSED_ADDRESS_LIMIT = 5; var BALANCE_ADDRESS_LIMIT = 5; + var MENU_ITEM_HEIGHT = 55; var config; var unitName; var unitToSatoshi; @@ -11,6 +12,8 @@ angular.module('copayApp.controllers').controller('addressesController', functio var withBalance; $scope.showInfo = false; $scope.showMore = false; + $scope.allAddressesView = false; + $scope.isCordova = platformInfo.isCordova; $scope.wallet = profileService.getWallet($stateParams.walletId); function init() { @@ -111,6 +114,79 @@ angular.module('copayApp.controllers').controller('addressesController', functio }); }; + $scope.showMenu = function(allAddresses, $event) { + var scanObj = { + text: gettextCatalog.getString('Scan addresses for funds'), + action: scan, + }; + + var sendAddressesObj = { + text: gettextCatalog.getString('Send addresses by email'), + action: sendByEmail, + } + + $scope.items = allAddresses ? [sendAddressesObj] : [scanObj]; + $scope.height = $scope.items.length * MENU_ITEM_HEIGHT; + + $ionicPopover.fromTemplateUrl('views/includes/menu-popover.html', { + scope: $scope + }).then(function(popover) { + $scope.menu = popover; + $scope.menu.show($event); + }); + }; + + var scan = function() { + walletService.startScan($scope.wallet); + $scope.menu.hide(); + $ionicHistory.clearHistory(); + $state.go('tabs.home'); + }; + + var sendByEmail = function() { + function formatDate(ts) { + var dateObj = new Date(ts * 1000); + if (!dateObj) { + $log.debug('Error formating a date'); + return 'DateError'; + } + if (!dateObj.toJSON()) { + return ''; + } + return dateObj.toJSON(); + }; + + ongoingProcess.set('sendingByEmail', true); + $timeout(function() { + var body = 'Copay Wallet "' + $scope.walletName + '" Addresses\n Only Main Addresses are shown.\n\n'; + body += "\n"; + body += $scope.allAddresses.map(function(v) { + return ('* ' + v.address + ' ' + 'xpub' + v.path.substring(1) + ' ' + formatDate(v.createdOn)); + }).join("\n"); + ongoingProcess.set('sendingByEmail', false); + + window.plugins.socialsharing.shareViaEmail( + body, + 'Copay Addresses', + null, // TO: must be null or an array + null, // CC: must be null or an array + null, // BCC: must be null or an array + null, // FILES: can be null, a string, or an array + function() {}, + function() {} + ); + + $scope.menu.hide(); + }); + }; + + $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.allAddressesView = data.stateName == 'tabs.receive.allAddresses' ? true : false; + $timeout(function() { + $scope.$apply(); + }); + }); + $scope.$on("$ionicView.afterEnter", function(event, data) { config = configService.getSync().wallet.settings; unitToSatoshi = config.unitToSatoshi; diff --git a/src/js/controllers/preferencesInformation.js b/src/js/controllers/preferencesInformation.js index ac649c56b..983b9cef8 100644 --- a/src/js/controllers/preferencesInformation.js +++ b/src/js/controllers/preferencesInformation.js @@ -1,59 +1,15 @@ 'use strict'; angular.module('copayApp.controllers').controller('preferencesInformation', - function($scope, $log, $timeout, $ionicHistory, platformInfo, lodash, profileService, configService, $stateParams, walletService, $state) { - var base = 'xpub'; + function($scope, $log, $ionicHistory, platformInfo, lodash, profileService, configService, $stateParams, $state) { var wallet = profileService.getWallet($stateParams.walletId); var walletId = wallet.id; var config = configService.getSync(); - var b = 1; + var colorCounter = 1; + var BLACK_WALLET_COLOR = '#202020'; $scope.isCordova = platformInfo.isCordova; config.colorFor = config.colorFor || {}; - $scope.sendAddrs = function() { - function formatDate(ts) { - var dateObj = new Date(ts * 1000); - if (!dateObj) { - $log.debug('Error formating a date'); - return 'DateError'; - } - if (!dateObj.toJSON()) { - return ''; - } - return dateObj.toJSON(); - }; - - $timeout(function() { - walletService.getMainAddresses(wallet, {}, function(err, addrs) { - if (err) { - $log.warn(err); - return; - }; - - var body = 'Copay Wallet "' + $scope.walletName + '" Addresses\n Only Main Addresses are shown.\n\n'; - body += "\n"; - body += addrs.map(function(v) { - return ('* ' + v.address + ' ' + base + v.path.substring(1) + ' ' + formatDate(v.createdOn)); - }).join("\n"); - - window.plugins.socialsharing.shareViaEmail( - body, - 'Copay Addresses', - null, // TO: must be null or an array - null, // CC: must be null or an array - null, // BCC: must be null or an array - null, // FILES: can be null, a string, or an array - function() {}, - function() {} - ); - - $timeout(function() { - $scope.$apply(); - }); - }); - }); - }; - $scope.saveBlack = function() { function save(color) { var opts = { @@ -68,14 +24,8 @@ angular.module('copayApp.controllers').controller('preferencesInformation', }); }; - if (b != 5) return b++; - save('#202020'); - }; - - $scope.scan = function() { - walletService.startScan(wallet); - $ionicHistory.removeBackView(); - $state.go('tabs.home'); + if (colorCounter != 5) return colorCounter++; + save(BLACK_WALLET_COLOR); }; $scope.$on("$ionicView.enter", function(event, data) { diff --git a/src/js/services/onGoingProcess.js b/src/js/services/onGoingProcess.js index 02e007861..0d6977173 100644 --- a/src/js/services/onGoingProcess.js +++ b/src/js/services/onGoingProcess.js @@ -36,6 +36,7 @@ angular.module('copayApp.services').factory('ongoingProcess', function($log, $ti 'sendingFeedback': gettext('Sending feedback...'), 'generatingNewAddress': gettext('Generating new address...'), 'gettingAddresses': gettext('Getting addresses...'), + 'sendingByEmail': gettext('Preparing addresses...'), }; root.clear = function() { diff --git a/src/sass/views/includes/menu-popover.scss b/src/sass/views/includes/menu-popover.scss new file mode 100644 index 000000000..93139b42d --- /dev/null +++ b/src/sass/views/includes/menu-popover.scss @@ -0,0 +1,12 @@ +#menu-popover { + border-radius: 5px; + .list { + .item { + cursor: pointer; + cursor: hand; + &:hover { + background-color: #E4E2E2; + } + } + } +} diff --git a/src/sass/views/tab-receive.scss b/src/sass/views/tab-receive.scss index ead483f40..a9e8cc300 100644 --- a/src/sass/views/tab-receive.scss +++ b/src/sass/views/tab-receive.scss @@ -115,7 +115,6 @@ .item { padding-top: 5px; padding-bottom: 5px; - display: inline-block; font-size: .7rem; @media(min-width:350px){ font-size:.9rem; diff --git a/src/sass/views/views.scss b/src/sass/views/views.scss index d6e41d122..08bcddf5e 100644 --- a/src/sass/views/views.scss +++ b/src/sass/views/views.scss @@ -27,6 +27,7 @@ @import "export"; @import "import"; @import "join"; +@import "includes/menu-popover"; @import "includes/walletActivity"; @import "includes/wallets"; @import "includes/modals/modals"; diff --git a/www/views/addresses.html b/www/views/addresses.html index dc3dd9e2a..ff070b946 100644 --- a/www/views/addresses.html +++ b/www/views/addresses.html @@ -3,10 +3,15 @@ {{'Wallet Addresses' | translate}} + + + -