From f4b29d9298146a878b71c142ec3b1d03612af8dc Mon Sep 17 00:00:00 2001 From: Javier Date: Thu, 3 Nov 2016 17:53:32 -0300 Subject: [PATCH 01/19] send max button - show wallet selector --- src/js/controllers/amount.js | 46 +++++++++++++++++++++++++++----- src/js/services/walletService.js | 7 +++++ src/sass/views/amount.scss | 4 +++ www/views/amount.html | 6 +++++ 4 files changed, 57 insertions(+), 6 deletions(-) diff --git a/src/js/controllers/amount.js b/src/js/controllers/amount.js index 93bab7a0c..a6fcdd8c3 100644 --- a/src/js/controllers/amount.js +++ b/src/js/controllers/amount.js @@ -1,7 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('amountController', function($rootScope, $scope, $filter, $timeout, $ionicScrollDelegate, gettextCatalog, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, txFormatService, ongoingProcess, bitpayCardService, popupService, bwcError, payproService, amazonService, profileService) { - +angular.module('copayApp.controllers').controller('amountController', function($rootScope, $scope, $filter, $timeout, $ionicScrollDelegate, gettextCatalog, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, txFormatService, ongoingProcess, bitpayCardService, popupService, bwcError, payproService, amazonService, profileService, bitcore, walletService, feeService) { var unitToSatoshi; var satToUnit; var unitDecimals; @@ -15,7 +14,6 @@ angular.module('copayApp.controllers').controller('amountController', function($ }); $scope.$on("$ionicView.beforeEnter", function(event, data) { - $scope.isGiftCard = data.stateParams.isGiftCard; $scope.isWallet = data.stateParams.isWallet; $scope.cardId = data.stateParams.cardId; @@ -24,6 +22,10 @@ angular.module('copayApp.controllers').controller('amountController', function($ $scope.toEmail = data.stateParams.toEmail; $scope.showAlternativeAmount = !!$scope.cardId || !!$scope.isGiftCard; $scope.toColor = data.stateParams.toColor; + var network = (new bitcore.Address($scope.toAddress)).network.name; + $scope.wallets = profileService.getWallets({ + network: network + }); $scope.customAmount = data.stateParams.customAmount; @@ -80,6 +82,40 @@ angular.module('copayApp.controllers').controller('amountController', function($ }, 10); }); + $scope.getSendMaxInfo = function(wallet) { + feeService.getCurrentFeeValue(function(err, fee) { + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), err.message); + return; + } + console.log(fee); + var config = configService.getSync(); + + ongoingProcess.set('retrivingInputs', true); + walletService.getSendMaxInfo(wallet, { + feePerKb: feePerKb, + excludeUnconfirmedUtxos: !config.wallet.spendUnconfirmed, + returnInputs: true, + }, function(err, resp) { + ongoingProcess.set('retrivingInputs', false); + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), err); + return; + } + + console.log(err, resp); + if (resp.amount == 0) { + popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Not enough funds for fee')); + return; + } + }); + }); + }; + + $scope.showWalletSelector = function() { + $scope.showWallets = true; + }; + $scope.toggleAlternative = function() { $scope.showAlternativeAmount = !$scope.showAlternativeAmount; @@ -124,7 +160,6 @@ angular.module('copayApp.controllers').controller('amountController', function($ function isExpression(val) { var regex = /^\.?\d+(\.?\d+)?([\/\-\+\*x]\d?\.?\d+)+$/; - return regex.test(val); }; @@ -137,7 +172,6 @@ angular.module('copayApp.controllers').controller('amountController', function($ $scope.resetAmount = function() { $scope.amount = $scope.alternativeResult = $scope.amountResult = $scope.globalResult = ''; $scope.allowSend = false; - checkFontSize(); }; @@ -251,7 +285,7 @@ angular.module('copayApp.controllers').controller('amountController', function($ onlyComplete: true, network: 'livenet', })[0].id; - } catch(err) { + } catch (err) { ongoingProcess.set('Preparing transaction...', false); popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('No wallet found!')); return; diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index b00722c76..01c8f849e 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -1083,6 +1083,13 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim return type; }; + root.getSendMaxInfo = function(wallet, opts, cb) { + opts = opts || {}; + wallet.getSendMaxInfo(opts, function(err, res) { + if (err) return cb(err); + return cb(null, res); + }); + }; return root; }); diff --git a/src/sass/views/amount.scss b/src/sass/views/amount.scss index 7c4c1681e..9751f747d 100644 --- a/src/sass/views/amount.scss +++ b/src/sass/views/amount.scss @@ -54,6 +54,10 @@ color: $dark-gray; font-weight: bold; } + .send-max { + float: right; + padding-top: 10px; + } } .amount { display: flex; diff --git a/www/views/amount.html b/www/views/amount.html index 6892406a7..8ba5f03ba 100644 --- a/www/views/amount.html +++ b/www/views/amount.html @@ -93,4 +93,10 @@ + + From 9092ee73dd61b83a6a5d5b185168809f74eb7e5d Mon Sep 17 00:00:00 2001 From: Javier Date: Thu, 3 Nov 2016 18:27:59 -0300 Subject: [PATCH 02/19] fix fee service --- src/js/controllers/amount.js | 6 +++--- src/js/services/feeService.js | 28 ++++++++++++++-------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/js/controllers/amount.js b/src/js/controllers/amount.js index a6fcdd8c3..6efbd0c6b 100644 --- a/src/js/controllers/amount.js +++ b/src/js/controllers/amount.js @@ -22,9 +22,9 @@ angular.module('copayApp.controllers').controller('amountController', function($ $scope.toEmail = data.stateParams.toEmail; $scope.showAlternativeAmount = !!$scope.cardId || !!$scope.isGiftCard; $scope.toColor = data.stateParams.toColor; - var network = (new bitcore.Address($scope.toAddress)).network.name; + $scope.network = (new bitcore.Address($scope.toAddress)).network.name; $scope.wallets = profileService.getWallets({ - network: network + network: $scope.network }); $scope.customAmount = data.stateParams.customAmount; @@ -83,7 +83,7 @@ angular.module('copayApp.controllers').controller('amountController', function($ }); $scope.getSendMaxInfo = function(wallet) { - feeService.getCurrentFeeValue(function(err, fee) { + feeService.getCurrentFeeValue($scope.network, function(err, fee) { if (err) { popupService.showAlert(gettextCatalog.getString('Error'), err.message); return; diff --git a/src/js/services/feeService.js b/src/js/services/feeService.js index be1a57160..1d673129f 100644 --- a/src/js/services/feeService.js +++ b/src/js/services/feeService.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.services').factory('feeService', function($log, $stateParams, bwcService, walletService, configService, gettext, lodash, txFormatService) { +angular.module('copayApp.services').factory('feeService', function($log, $stateParams, bwcService, walletService, configService, gettext, lodash, txFormatService, profileService, gettextCatalog) { var root = {}; // Constant fee options to translate @@ -15,45 +15,45 @@ angular.module('copayApp.services').factory('feeService', function($log, $stateP return configService.getSync().wallet.settings.feeLevel || 'normal'; }; - root.getCurrentFeeValue = function(wallet, cb) { + root.getCurrentFeeValue = function(network, cb) { + network = network || 'livenet'; var feeLevel = root.getCurrentFeeLevel(); - wallet.getFeeLevels(wallet.credentials.network, function(err, levels) { - if (err) - return cb({ - message: 'Could not get dynamic fee' - }); + root.getFeeLevels(function(err, levels) { + if (err) return cb(err); - var feeLevelValue = lodash.find(levels, { + var feeLevelValue = lodash.find(levels[network], { level: feeLevel }); - if (!feeLevelValue || feeLevelValue.feePerKB == null) + + if (!feeLevelValue || !feeLevelValue.feePerKB) return cb({ - message: 'Could not get dynamic fee for level: ' + feeLevel + message: gettextCatalog.getString('Could not get dynamic fee for level: ') + feeLevel }); var fee = feeLevelValue.feePerKB; $log.debug('Dynamic fee: ' + feeLevel + ' ' + fee + ' SAT'); + return cb(null, fee); }); }; root.getFeeLevels = function(cb) { var walletClient = bwcService.getClient(); - var unitName = configService.getSync().wallet.settings.unitName; walletClient.getFeeLevels('livenet', function(errLivenet, levelsLivenet) { walletClient.getFeeLevels('testnet', function(errTestnet, levelsTestnet) { - if (errLivenet || errTestnet) $log.debug('Could not get dynamic fee'); - else { + if (errLivenet || errTestnet) { + return cb(gettextCatalog.getString('Could not get dynamic fee')); + } else { for (var i = 0; i < 4; i++) { levelsLivenet[i]['feePerKBUnit'] = txFormatService.formatAmount(levelsLivenet[i].feePerKB) + ' ' + unitName; levelsTestnet[i]['feePerKBUnit'] = txFormatService.formatAmount(levelsTestnet[i].feePerKB) + ' ' + unitName; } } - return cb({ + return cb(null, { 'livenet': levelsLivenet, 'testnet': levelsTestnet }); From d65f3ed92a4ae2e8cad71b6dc60de553904ccea8 Mon Sep 17 00:00:00 2001 From: Javier Date: Thu, 3 Nov 2016 18:31:43 -0300 Subject: [PATCH 03/19] fix fee settings --- src/js/controllers/preferencesFee.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/js/controllers/preferencesFee.js b/src/js/controllers/preferencesFee.js index f1a041438..d01f25262 100644 --- a/src/js/controllers/preferencesFee.js +++ b/src/js/controllers/preferencesFee.js @@ -1,10 +1,14 @@ 'use strict'; -angular.module('copayApp.controllers').controller('preferencesFeeController', function($scope, $timeout, $ionicHistory, gettextCatalog, configService, feeService, ongoingProcess) { +angular.module('copayApp.controllers').controller('preferencesFeeController', function($scope, $timeout, $ionicHistory, gettextCatalog, configService, feeService, ongoingProcess, popupService) { ongoingProcess.set('gettingFeeLevels', true); - feeService.getFeeLevels(function(levels) { + feeService.getFeeLevels(function(err, levels) { ongoingProcess.set('gettingFeeLevels', false); + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), err); + return; + } $scope.feeLevels = levels; $scope.$apply(); }); From 9204f131ceeda70785cd3e67fd94c884ec358d9a Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 8 Nov 2016 11:27:47 -0300 Subject: [PATCH 04/19] fix fee value - add confirmation popup --- src/js/controllers/amount.js | 40 ++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/src/js/controllers/amount.js b/src/js/controllers/amount.js index 6efbd0c6b..faa745891 100644 --- a/src/js/controllers/amount.js +++ b/src/js/controllers/amount.js @@ -5,7 +5,6 @@ angular.module('copayApp.controllers').controller('amountController', function($ var satToUnit; var unitDecimals; var satToBtc; - var self = $scope.self; var SMALL_FONT_SIZE_LIMIT = 10; var LENGTH_EXPRESSION_LIMIT = 19; @@ -83,17 +82,19 @@ angular.module('copayApp.controllers').controller('amountController', function($ }); $scope.getSendMaxInfo = function(wallet) { + ongoingProcess.set('gettingFeeLevels', true); feeService.getCurrentFeeValue($scope.network, function(err, fee) { + ongoingProcess.set('gettingFeeLevels', false); if (err) { popupService.showAlert(gettextCatalog.getString('Error'), err.message); return; } - console.log(fee); + var config = configService.getSync(); ongoingProcess.set('retrivingInputs', true); walletService.getSendMaxInfo(wallet, { - feePerKb: feePerKb, + feePerKb: fee, excludeUnconfirmedUtxos: !config.wallet.spendUnconfirmed, returnInputs: true, }, function(err, resp) { @@ -103,11 +104,42 @@ angular.module('copayApp.controllers').controller('amountController', function($ return; } - console.log(err, resp); if (resp.amount == 0) { popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Not enough funds for fee')); return; } + + var msg = gettextCatalog.getString("{{fee}} will be deducted for bitcoin networking fees", { + fee: txFormatService.formatAmount(resp.fee) + ' ' + $scope.unitName + }); + var warningMsg = verifyExcludedUtxos(); + + if (!lodash.isEmpty(warningMsg)) + msg += '. \n' + warningMsg; + + popupService.showConfirm(null, msg, 'Ok', gettextCatalog.getString('Cancel'), function(result) { + if (!result) return; + var amount = (resp.amount * satToUnit).toFixed(0); + + $scope.amount = amount; + processAmount(amount); + }); + + function verifyExcludedUtxos() { + var warningMsg = []; + if (resp.utxosBelowFee > 0) { + warningMsg.push(gettextCatalog.getString("A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided.", { + amountBelowFeeStr: txFormatService.formatAmount(resp.amountBelowFee) + ' ' + $scope.unitName + })); + } + + if (resp.utxosAboveMaxSize > 0) { + warningMsg.push(gettextCatalog.getString("A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded", { + amountAboveMaxSizeStr: txFormatService.formatAmount(resp.amountAboveMaxSize) + ' ' + $scope.unitName + })); + } + return warningMsg.join('\n'); + }; }); }); }; From e8e26b4de8af11e4dbb02e4c5c87c77f4e8e8ff5 Mon Sep 17 00:00:00 2001 From: Javier Date: Mon, 21 Nov 2016 12:00:18 -0300 Subject: [PATCH 05/19] replace scan icon --- src/sass/views/tab-send.scss | 15 +++++++-------- www/views/tab-send.html | 13 ++++++++++--- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/sass/views/tab-send.scss b/src/sass/views/tab-send.scss index 4821d2570..73b66ad3a 100644 --- a/src/sass/views/tab-send.scss +++ b/src/sass/views/tab-send.scss @@ -1,14 +1,13 @@ #tab-send { @extend .deflash-blue; - .qr-scan-icon a { - z-index: 10; - display: block; - position: absolute; - top: 55px; - right: 0; - padding: 0 10px; - font-size: 24px; + input { + width: 100%; + } + .qr-scan-icon { cursor: pointer; + cursor: hand; + border-left: 1px solid rgb(228, 228, 228); + padding-left: 10px; } .qr-icon { line-height: 45px; diff --git a/www/views/tab-send.html b/www/views/tab-send.html index c4751bdf9..2b999cfd3 100644 --- a/www/views/tab-send.html +++ b/www/views/tab-send.html @@ -18,19 +18,26 @@ -
+
Recipient
-
+ + +
+ + +
+
Contacts From 16876691491302bfd8e1196a056edba330c60cd3 Mon Sep 17 00:00:00 2001 From: Javier Date: Wed, 23 Nov 2016 11:23:19 -0300 Subject: [PATCH 06/19] set send max --- src/js/controllers/amount.js | 81 ++----- src/js/controllers/confirm.js | 212 +++++++++++++------ src/js/directives/sendMaxSelector.js | 26 +++ src/js/routes.js | 2 +- src/js/services/onGoingProcess.js | 2 +- src/js/services/walletService.js | 24 +-- src/sass/views/includes/sendMaxSelector.scss | 21 ++ src/sass/views/views.scss | 1 + www/views/amount.html | 16 +- www/views/confirm.html | 25 +-- www/views/includes/sendMaxSelector.html | 12 ++ 11 files changed, 250 insertions(+), 172 deletions(-) create mode 100644 src/js/directives/sendMaxSelector.js create mode 100644 src/sass/views/includes/sendMaxSelector.scss create mode 100644 www/views/includes/sendMaxSelector.html diff --git a/src/js/controllers/amount.js b/src/js/controllers/amount.js index faa745891..b2b5e54ae 100644 --- a/src/js/controllers/amount.js +++ b/src/js/controllers/amount.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('amountController', function($rootScope, $scope, $filter, $timeout, $ionicScrollDelegate, gettextCatalog, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, txFormatService, ongoingProcess, bitpayCardService, popupService, bwcError, payproService, amazonService, profileService, bitcore, walletService, feeService) { +angular.module('copayApp.controllers').controller('amountController', function($scope, $filter, $timeout, $ionicScrollDelegate, gettextCatalog, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, txFormatService, ongoingProcess, bitpayCardService, popupService, bwcError, payproService, profileService, bitcore, amazonService) { var unitToSatoshi; var satToUnit; var unitDecimals; @@ -53,8 +53,7 @@ angular.module('copayApp.controllers').controller('amountController', function($ $timeout(function() { $scope.$apply(); - }, 10); - + }); }); var config = configService.getSync().wallet.settings; @@ -78,74 +77,22 @@ angular.module('copayApp.controllers').controller('amountController', function($ $timeout(function() { $ionicScrollDelegate.resize(); - }, 10); + }); }); - $scope.getSendMaxInfo = function(wallet) { - ongoingProcess.set('gettingFeeLevels', true); - feeService.getCurrentFeeValue($scope.network, function(err, fee) { - ongoingProcess.set('gettingFeeLevels', false); - if (err) { - popupService.showAlert(gettextCatalog.getString('Error'), err.message); - return; - } - - var config = configService.getSync(); - - ongoingProcess.set('retrivingInputs', true); - walletService.getSendMaxInfo(wallet, { - feePerKb: fee, - excludeUnconfirmedUtxos: !config.wallet.spendUnconfirmed, - returnInputs: true, - }, function(err, resp) { - ongoingProcess.set('retrivingInputs', false); - if (err) { - popupService.showAlert(gettextCatalog.getString('Error'), err); - return; - } - - if (resp.amount == 0) { - popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Not enough funds for fee')); - return; - } - - var msg = gettextCatalog.getString("{{fee}} will be deducted for bitcoin networking fees", { - fee: txFormatService.formatAmount(resp.fee) + ' ' + $scope.unitName - }); - var warningMsg = verifyExcludedUtxos(); - - if (!lodash.isEmpty(warningMsg)) - msg += '. \n' + warningMsg; - - popupService.showConfirm(null, msg, 'Ok', gettextCatalog.getString('Cancel'), function(result) { - if (!result) return; - var amount = (resp.amount * satToUnit).toFixed(0); - - $scope.amount = amount; - processAmount(amount); - }); - - function verifyExcludedUtxos() { - var warningMsg = []; - if (resp.utxosBelowFee > 0) { - warningMsg.push(gettextCatalog.getString("A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided.", { - amountBelowFeeStr: txFormatService.formatAmount(resp.amountBelowFee) + ' ' + $scope.unitName - })); - } - - if (resp.utxosAboveMaxSize > 0) { - warningMsg.push(gettextCatalog.getString("A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded", { - amountAboveMaxSizeStr: txFormatService.formatAmount(resp.amountAboveMaxSize) + ' ' + $scope.unitName - })); - } - return warningMsg.join('\n'); - }; - }); - }); + $scope.showSendMaxSelector = function() { + $scope.sendMax = true; }; - $scope.showWalletSelector = function() { - $scope.showWallets = true; + $scope.setSendMax = function() { + $state.transitionTo('tabs.send.confirm', { + isWallet: $scope.isWallet, + toAmount: null, + toAddress: $scope.toAddress, + toName: $scope.toName, + toEmail: $scope.toEmail, + useSendMax: true, + }); }; $scope.toggleAlternative = function() { diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 4919263d8..6ccdb9981 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -1,7 +1,9 @@ 'use strict'; -angular.module('copayApp.controllers').controller('confirmController', function($rootScope, $scope, $interval, $filter, $timeout, $ionicScrollDelegate, gettextCatalog, walletService, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, profileService, bitcore, gettext, txFormatService, ongoingProcess, $ionicModal, popupService, $ionicHistory, $ionicConfig, payproService, amazonService) { +angular.module('copayApp.controllers').controller('confirmController', function($rootScope, $scope, $interval, $filter, $timeout, $ionicScrollDelegate, gettextCatalog, walletService, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, profileService, bitcore, gettext, txFormatService, ongoingProcess, $ionicModal, popupService, $ionicHistory, $ionicConfig, payproService, feeService, amazonService) { var cachedTxp = {}; + var amountStr; + var toAmount; var isChromeApp = platformInfo.isChromeApp; var countDown = null; var giftCardAmountUSD; @@ -12,7 +14,6 @@ angular.module('copayApp.controllers').controller('confirmController', function( $ionicConfig.views.swipeBackEnabled(false); $scope.$on("$ionicView.beforeEnter", function(event, data) { - // Amazon.com Gift Card parameters $scope.isGiftCard = data.stateParams.isGiftCard; giftCardAmountUSD = data.stateParams.giftCardAmountUSD; @@ -20,102 +21,175 @@ angular.module('copayApp.controllers').controller('confirmController', function( giftCardInvoiceTime = data.stateParams.giftCardInvoiceTime; giftCardUUID = data.stateParams.giftCardUUID; + toAmount = data.stateParams.toAmount; $scope.isWallet = data.stateParams.isWallet; $scope.cardId = data.stateParams.cardId; - $scope.toAmount = data.stateParams.toAmount; $scope.toAddress = data.stateParams.toAddress; $scope.toName = data.stateParams.toName; $scope.toEmail = data.stateParams.toEmail; $scope.description = data.stateParams.description; $scope.paypro = data.stateParams.paypro; + $scope.useSendMax = data.stateParams.useSendMax; + $scope.insuffientFunds = false; + $scope.noMatchingWallet = false; $scope.paymentExpired = { value: false }; $scope.remainingTimeStr = { value: null }; - initConfirm(); - }); - - var initConfirm = function() { - // TODO (URL , etc) - if (!$scope.toAddress || !$scope.toAmount) { - $log.error('Bad params at amount'); - throw ('bad params'); - } var config = configService.getSync().wallet; $scope.feeLevel = config.settings && config.settings.feeLevel ? config.settings.feeLevel : 'normal'; - $scope.toAmount = parseInt($scope.toAmount); - $scope.amountStr = txFormatService.formatAmountStr($scope.toAmount); - $scope.displayAmount = getDisplayAmount($scope.amountStr); - $scope.displayUnit = getDisplayUnit($scope.amountStr); + $scope.network = (new bitcore.Address($scope.toAddress)).network.name; - var networkName = (new bitcore.Address($scope.toAddress)).network.name; - $scope.network = networkName; - - $scope.insuffientFunds = false; - $scope.noMatchingWallet = false; - - var wallets = profileService.getWallets({ + $scope.wallets = profileService.getWallets({ onlyComplete: true, - network: networkName, + network: $scope.network, n: $scope.isGiftCard ? true : false }); - if (!wallets || !wallets.length) { + if (!$scope.wallets || !$scope.wallets.length) { $scope.noMatchingWallet = true; + } else { + $scope.wallet = $scope.wallets[0]; } + if (!$scope.useSendMax) initConfirm(); + else $scope.getSendMaxInfo(); + }); + + var initConfirm = function() { + toAmount = parseInt(toAmount); + amountStr = txFormatService.formatAmountStr(toAmount); + $scope.displayAmount = getDisplayAmount(amountStr); + $scope.displayUnit = getDisplayUnit(amountStr); + var filteredWallets = []; var index = 0; var enoughFunds = false; - lodash.each(wallets, function(w) { + lodash.each($scope.wallets, function(w) { walletService.getStatus(w, {}, function(err, status) { if (err || !status) { $log.error(err); } else { w.status = status; if (!status.availableBalanceSat) $log.debug('No balance available in: ' + w.name); - if (status.availableBalanceSat > $scope.toAmount) { + if (status.availableBalanceSat > toAmount) { filteredWallets.push(w); enoughFunds = true; } } - if (++index == wallets.length) { + if (++index == $scope.wallets.length) { if (!lodash.isEmpty(filteredWallets)) { $scope.wallets = lodash.clone(filteredWallets); setWallet($scope.wallets[0]); } else { - - if (!enoughFunds) - $scope.insuffientFunds = true; - + if (!enoughFunds) $scope.insuffientFunds = true; $log.warn('No wallet available to make the payment'); - $timeout(function() { - $scope.$apply(); - }); } } }); }); - txFormatService.formatAlternativeStr($scope.toAmount, function(v) { + txFormatService.formatAlternativeStr(toAmount, function(v) { $scope.alternativeAmountStr = v; }); - if($scope.paypro) { - _paymentTimeControl($scope.paypro.expires); - } + if ($scope.paypro) _paymentTimeControl($scope.paypro.expires); $timeout(function() { $scope.$apply(); }); }; + $scope.getSendMaxInfo = function() { + ongoingProcess.set('gettingFeeLevels', true); + feeService.getCurrentFeeValue($scope.network, function(err, feePerKb) { + ongoingProcess.set('gettingFeeLevels', false); + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), err.message); + return; + } + + var config = configService.getSync().wallet; + var unitName = config.settings.unitName; + var unitToSatoshi = config.settings.unitToSatoshi; + var satToUnit = 1 / unitToSatoshi; + var unitDecimals = config.settings.unitDecimals; + + ongoingProcess.set('retrievingInputs', true); + walletService.getSendMaxInfo($scope.wallet, { + feePerKb: feePerKb, + excludeUnconfirmedUtxos: !config.spendUnconfirmed, + returnInputs: true, + }, function(err, resp) { + ongoingProcess.set('retrievingInputs', false); + if (err) { + $scope.insuffientFunds = true; + popupService.showAlert(gettextCatalog.getString('Error'), err); + return; + } + + if (resp.amount == 0) { + $scope.insuffientFunds = true; + popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Not enough funds for fee')); + return; + } + + $scope.sendMaxInfo = { + sendMax: true, + inputs: resp.inputs, + fee: resp.fee, + feePerKb: feePerKb, + }; + toAmount = parseFloat((resp.amount * satToUnit).toFixed(unitDecimals)); + + var msg = gettextCatalog.getString("{{fee}} will be deducted for bitcoin networking fees", { + fee: txFormatService.formatAmount(resp.fee) + ' ' + unitName + }); + var warningMsg = verifyExcludedUtxos(); + + if (!lodash.isEmpty(warningMsg)) + msg += '. \n' + warningMsg; + + popupService.showConfirm(null, msg, 'Ok', gettextCatalog.getString('Cancel'), function(result) { + if (!result) return; + + var amount = txFormatService.formatAmount(resp.amount, true); + $scope.displayAmount = amount; + $scope.displayUnit = unitName; + $scope.fee = txFormatService.formatAmount($scope.sendMaxInfo.fee) + ' ' + unitName; + + createTx($scope.wallet, true, function(err, txp) { + if (err) return; + cachedTxp[$scope.wallet.id] = txp; + apply(txp); + }); + }); + + function verifyExcludedUtxos() { + var warningMsg = []; + if (resp.utxosBelowFee > 0) { + warningMsg.push(gettextCatalog.getString("A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided.", { + amountBelowFeeStr: txFormatService.formatAmount(resp.amountBelowFee) + ' ' + unitName + })); + } + + if (resp.utxosAboveMaxSize > 0) { + warningMsg.push(gettextCatalog.getString("A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded", { + amountAboveMaxSizeStr: txFormatService.formatAmount(resp.amountAboveMaxSize) + ' ' + unitName + })); + } + return warningMsg.join('\n'); + }; + }); + }); + }; + $scope.$on('accepted', function(event) { $scope.approve(); }); @@ -134,10 +208,10 @@ angular.module('copayApp.controllers').controller('confirmController', function( }; $scope.onWalletSelect = function(wallet) { - setWallet(wallet); + if (!$scope.useSendMax) setWallet(wallet); + else $scope.getSendMaxInfo(); }; - $scope.showDescriptionPopup = function() { var message = gettextCatalog.getString('Add description'); var opts = { @@ -154,11 +228,11 @@ angular.module('copayApp.controllers').controller('confirmController', function( function getDisplayAmount(amountStr) { return amountStr.split(' ')[0]; - } + }; function getDisplayUnit(amountStr) { return amountStr.split(' ')[1]; - } + }; function _paymentTimeControl(expirationTime) { $scope.paymentExpired.value = false; @@ -180,7 +254,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( var m = Math.floor(totalSecs / 60); var s = totalSecs % 60; $scope.remainingTimeStr.value = ('0' + m).slice(-2) + ":" + ('0' + s).slice(-2); - } + }; function setExpiredValues() { $scope.paymentExpired.value = true; @@ -189,8 +263,8 @@ angular.module('copayApp.controllers').controller('confirmController', function( $timeout(function() { $scope.$apply(); }); - } - } + }; + }; function setWallet(wallet, delayed) { var stop; @@ -200,7 +274,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( $timeout(function() { $ionicScrollDelegate.resize(); $scope.$apply(); - }, 10); + }); if (stop) { $timeout.cancel(stop); @@ -218,7 +292,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( }); }, delayed ? 2000 : 1); } - } + }; var setSendError = function(msg) { $scope.sendStatus = ''; @@ -232,17 +306,16 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.fee = txFormatService.formatAmountStr(txp.fee); $scope.txp = txp; $scope.$apply(); - } + }; var createTx = function(wallet, dryRun, cb) { var config = configService.getSync().wallet; var currentSpendUnconfirmed = config.spendUnconfirmed; - var outputs = []; - var paypro = $scope.paypro; var toAddress = $scope.toAddress; - var toAmount = $scope.toAmount; var description = $scope.description; + var unitToSatoshi = config.settings.unitToSatoshi; + var unitDecimals = config.settings.unitDecimals; // ToDo: use a credential's (or fc's) function for this if (description && !wallet.credentials.sharedEncryptingKey) { @@ -257,28 +330,29 @@ angular.module('copayApp.controllers').controller('confirmController', function( return setSendError(msg); } - outputs.push({ - 'toAddress': toAddress, - 'amount': toAmount, - 'message': description - }); - var txp = {}; + var amount; + if ($scope.useSendMax) amount = parseFloat((toAmount * unitToSatoshi)); + else amount = toAmount; - // TODO - if (!lodash.isEmpty($scope.sendMaxInfo)) { - txp.sendMax = true; + txp.outputs = [{ + 'toAddress': toAddress, + 'amount': amount, + 'message': description + }]; + + if ($scope.sendMaxInfo) { txp.inputs = $scope.sendMaxInfo.inputs; - txp.fee = $scope.sendMaxInfo.fee; - } + txp.feePerKb = $scope.sendMaxInfo.feePerKb; + } else + txp.feeLevel = config.settings && config.settings.feeLevel ? config.settings.feeLevel : 'normal'; - txp.outputs = outputs; txp.message = description; - if(paypro) { + + if (paypro) { txp.payProUrl = paypro.url; } - txp.excludeUnconfirmedUtxos = config.spendUnconfirmed ? false : true; - txp.feeLevel = config.settings && config.settings.feeLevel ? config.settings.feeLevel : 'normal'; + txp.excludeUnconfirmedUtxos = !currentSpendUnconfirmed; txp.dryRun = dryRun; walletService.createTx(wallet, txp, function(err, ctxp) { @@ -334,7 +408,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( var isCordova = $scope.isCordova; var bigAmount = parseFloat(txFormatService.formatToUSD(txp.amount)) > 20; var message = gettextCatalog.getString('Sending {{amountStr}} from your {{name}} wallet', { - amountStr: $scope.amountStr, + amountStr: amountStr, name: wallet.name }); var okText = gettextCatalog.getString('Confirm'); @@ -375,7 +449,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( } else if (showName) { $scope.sendStatus = showName; } - } + }; $scope.statusChangeHandler = statusChangeHandler; diff --git a/src/js/directives/sendMaxSelector.js b/src/js/directives/sendMaxSelector.js new file mode 100644 index 000000000..8cb7f397d --- /dev/null +++ b/src/js/directives/sendMaxSelector.js @@ -0,0 +1,26 @@ +'use strict'; + +angular.module('copayApp.directives') + .directive('sendMaxSelector', function($timeout) { + return { + restrict: 'E', + templateUrl: 'views/includes/sendMaxSelector.html', + transclude: true, + scope: { + show: '=sendMaxSelectorShow', + wallet: '=sendMaxSelectorWallet', + onSelect: '=sendMaxSelectorOnSelect' + }, + link: function(scope, element, attrs) { + scope.hide = function() { + scope.show = false; + }; + scope.setSendMax = function() { + $timeout(function() { + scope.hide(); + }, 100); + scope.onSelect(); + }; + } + }; + }); diff --git a/src/js/routes.js b/src/js/routes.js index d86d0c8ab..4ef27d0a8 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -286,7 +286,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }) .state('tabs.send.confirm', { - url: '/confirm/:isWallet/:toAddress/:toName/:toAmount/:toEmail/:description', + url: '/confirm/:isWallet/:toAddress/:toName/:toAmount/:toEmail/:description/:useSendMax', views: { 'tab-send@tabs': { controller: 'confirmController', diff --git a/src/js/services/onGoingProcess.js b/src/js/services/onGoingProcess.js index 0d6977173..cdcb501d7 100644 --- a/src/js/services/onGoingProcess.js +++ b/src/js/services/onGoingProcess.js @@ -25,7 +25,7 @@ angular.module('copayApp.services').factory('ongoingProcess', function($log, $ti 'recreating': gettext('Recreating Wallet...'), 'rejectTx': gettext('Rejecting payment proposal'), 'removeTx': gettext('Deleting payment proposal'), - 'retrivingInputs': gettext('Retrieving inputs information'), + 'retrievingInputs': gettext('Retrieving inputs information'), 'scanning': gettext('Scanning Wallet funds...'), 'sendingTx': gettext('Sending transaction'), 'signingTx': gettext('Signing transaction'), diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index 01c8f849e..773c8542e 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -562,20 +562,13 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim if (lodash.isEmpty(txp) || lodash.isEmpty(wallet)) return cb('MISSING_PARAMETER'); - if (txp.sendMax) { - wallet.createTxProposal(txp, function(err, createdTxp) { - if (err) return cb(err); - else return cb(null, createdTxp); - }); - } else { - wallet.createTxProposal(txp, function(err, createdTxp) { - if (err) return cb(err); - else { - $log.debug('Transaction created'); - return cb(null, createdTxp); - } - }); - } + wallet.createTxProposal(txp, function(err, createdTxp) { + if (err) return cb(err); + else { + $log.debug('Transaction created'); + return cb(null, createdTxp); + } + }); }; root.publishTx = function(wallet, txp, cb) { @@ -1086,8 +1079,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim root.getSendMaxInfo = function(wallet, opts, cb) { opts = opts || {}; wallet.getSendMaxInfo(opts, function(err, res) { - if (err) return cb(err); - return cb(null, res); + return cb(err, res); }); }; diff --git a/src/sass/views/includes/sendMaxSelector.scss b/src/sass/views/includes/sendMaxSelector.scss new file mode 100644 index 000000000..6463fdb93 --- /dev/null +++ b/src/sass/views/includes/sendMaxSelector.scss @@ -0,0 +1,21 @@ +send-max-selector { + + .bp-action-sheet__sheet { + padding-left: 2rem; + padding-right: .75rem; + } + + .max-selector { + a.item { + border: none; + padding-top: 20px; + padding-bottom: 20px; + span { + &.item-note { + color: #3A3A3A; + font-family: "Roboto-Light"; + } + } + } + } +} diff --git a/src/sass/views/views.scss b/src/sass/views/views.scss index 1e88f8af0..af863d518 100644 --- a/src/sass/views/views.scss +++ b/src/sass/views/views.scss @@ -38,6 +38,7 @@ @import "includes/tx-details"; @import "includes/txp-details"; @import "includes/tx-status"; +@import "includes/sendMaxSelector"; @import "includes/walletSelector"; @import "integrations/coinbase"; @import "integrations/glidera"; diff --git a/www/views/amount.html b/www/views/amount.html index 8ba5f03ba..24df99096 100644 --- a/www/views/amount.html +++ b/www/views/amount.html @@ -5,6 +5,11 @@ + + + @@ -93,10 +98,9 @@
- - + + diff --git a/www/views/confirm.html b/www/views/confirm.html index 85d9006d4..3eaa5b5c3 100644 --- a/www/views/confirm.html +++ b/www/views/confirm.html @@ -12,10 +12,11 @@
- Sending + Sending + Sending maximum amount
-
{{displayAmount}} {{displayUnit}}
+
{{displayAmount || '...'}} {{displayUnit}}
{{alternativeAmountStr}}
@@ -49,12 +50,6 @@ Multiple recipients -->
-
- No wallets available -
-
- Insufficient funds -
From
@@ -65,30 +60,36 @@
- + Add Memo {{description}} -
+
Fee: {{feeLevel}} {{fee || '...'}}
+
+ No wallets available +
+
+ Insufficient funds +
Click to pay Slide to pay diff --git a/www/views/includes/sendMaxSelector.html b/www/views/includes/sendMaxSelector.html new file mode 100644 index 000000000..29241b5b1 --- /dev/null +++ b/www/views/includes/sendMaxSelector.html @@ -0,0 +1,12 @@ + +
Shortcuts
+ + + Send max amount + {{wallet.status.availableBalanceStr}} + + +
+ Cancel +
+
From 4c42c724111e3920f801f9c55f6599e3bf37edd4 Mon Sep 17 00:00:00 2001 From: Javier Date: Thu, 24 Nov 2016 16:17:01 -0300 Subject: [PATCH 07/19] use new scan icon --- src/js/controllers/confirm.js | 4 ++++ src/sass/views/tab-send.scss | 22 +++++++++++++++++++--- www/img/scan-ico.svg | 24 ++++++++++++++++++++++++ www/views/tab-send.html | 6 +++--- 4 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 www/img/scan-ico.svg diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 6ccdb9981..7dc98407e 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -146,7 +146,11 @@ angular.module('copayApp.controllers').controller('confirmController', function( fee: resp.fee, feePerKb: feePerKb, }; + toAmount = parseFloat((resp.amount * satToUnit).toFixed(unitDecimals)); + txFormatService.formatAlternativeStr(resp.amount, function(v) { + $scope.alternativeAmountStr = v; + }); var msg = gettextCatalog.getString("{{fee}} will be deducted for bitcoin networking fees", { fee: txFormatService.formatAmount(resp.fee) + ' ' + unitName diff --git a/src/sass/views/tab-send.scss b/src/sass/views/tab-send.scss index 73b66ad3a..92042b2c9 100644 --- a/src/sass/views/tab-send.scss +++ b/src/sass/views/tab-send.scss @@ -1,7 +1,23 @@ #tab-send { @extend .deflash-blue; - input { - width: 100%; + .input { + input { + width: 100%; + height: auto; + } + &.item { + height: 55px; + } + i { + &.left { + padding-left: 15px; + } + &.qr { + cursor: pointer; + cursor: hand; + padding-right: 5px; + } + } } .qr-scan-icon { cursor: pointer; @@ -10,7 +26,7 @@ padding-left: 10px; } .qr-icon { - line-height: 45px; + line-height: 20px; } .zero-state-cta { padding-bottom: 3vh; diff --git a/www/img/scan-ico.svg b/www/img/scan-ico.svg new file mode 100644 index 000000000..5d13c91fe --- /dev/null +++ b/www/img/scan-ico.svg @@ -0,0 +1,24 @@ + + + + scan-ico + Created with Sketch. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/www/views/tab-send.html b/www/views/tab-send.html index 2b999cfd3..45d7c86de 100644 --- a/www/views/tab-send.html +++ b/www/views/tab-send.html @@ -32,10 +32,10 @@
--> -
- +
+ - +
From a25292fb559dd7a8eaf9c29c97be5f1bc57a7af2 Mon Sep 17 00:00:00 2001 From: Javier Date: Thu, 24 Nov 2016 16:26:15 -0300 Subject: [PATCH 08/19] fix apply --- src/js/controllers/confirm.js | 14 ++++++++------ www/views/tab-send.html | 11 ----------- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 7dc98407e..4309c8668 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -275,11 +275,6 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.wallet = wallet; $scope.fee = $scope.txp = null; - $timeout(function() { - $ionicScrollDelegate.resize(); - $scope.$apply(); - }); - if (stop) { $timeout.cancel(stop); stop = null; @@ -296,6 +291,11 @@ angular.module('copayApp.controllers').controller('confirmController', function( }); }, delayed ? 2000 : 1); } + + $timeout(function() { + $ionicScrollDelegate.resize(); + $scope.$apply(); + }); }; var setSendError = function(msg) { @@ -309,7 +309,9 @@ angular.module('copayApp.controllers').controller('confirmController', function( function apply(txp) { $scope.fee = txFormatService.formatAmountStr(txp.fee); $scope.txp = txp; - $scope.$apply(); + $timeout(function() { + $scope.$apply(); + }); }; var createTx = function(wallet, dryRun, cb) { diff --git a/www/views/tab-send.html b/www/views/tab-send.html index 45d7c86de..805eb616d 100644 --- a/www/views/tab-send.html +++ b/www/views/tab-send.html @@ -20,17 +20,6 @@
Recipient
-
From 80f79c4becdf10c0e438f4a8a6f78fc3b80ca82f Mon Sep 17 00:00:00 2001 From: Javier Date: Thu, 24 Nov 2016 16:38:01 -0300 Subject: [PATCH 09/19] fix set wallet --- src/js/controllers/confirm.js | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 4309c8668..9aec11cf7 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -197,23 +197,26 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.$on('accepted', function(event) { $scope.approve(); }); - - $scope.$on('Wallet/Changed', function(event, wallet) { - if (lodash.isEmpty(wallet)) { - $log.debug('No wallet provided'); - return; - } - $log.debug('Wallet changed: ' + wallet.name); - setWallet(wallet, true); - }); + // + // $scope.$on('Wallet/Changed', function(event, wallet) { + // if (lodash.isEmpty(wallet)) { + // $log.debug('No wallet provided'); + // return; + // } + // $log.debug('Wallet changed: ' + wallet.name); + // setWallet(wallet, true); + // }); $scope.showWalletSelector = function() { $scope.showWallets = true; }; $scope.onWalletSelect = function(wallet) { - if (!$scope.useSendMax) setWallet(wallet); - else $scope.getSendMaxInfo(); + if ($scope.useSendMax) { + $scope.wallet = wallet; + $scope.getSendMaxInfo(); + } else + setWallet(wallet); }; $scope.showDescriptionPopup = function() { @@ -295,7 +298,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( $timeout(function() { $ionicScrollDelegate.resize(); $scope.$apply(); - }); + }, 10); }; var setSendError = function(msg) { From ac15e99b42371bb9d7c35c25d2b67f96ba9cee5d Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 25 Nov 2016 09:42:25 -0300 Subject: [PATCH 10/19] remove unused event --- src/js/controllers/confirm.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 9aec11cf7..d87fc1336 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -197,15 +197,6 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.$on('accepted', function(event) { $scope.approve(); }); - // - // $scope.$on('Wallet/Changed', function(event, wallet) { - // if (lodash.isEmpty(wallet)) { - // $log.debug('No wallet provided'); - // return; - // } - // $log.debug('Wallet changed: ' + wallet.name); - // setWallet(wallet, true); - // }); $scope.showWalletSelector = function() { $scope.showWallets = true; From b30a371a68e8563f7df36d608ba71b65957cd649 Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 25 Nov 2016 10:02:56 -0300 Subject: [PATCH 11/19] ref - use alert instead confirm --- src/js/controllers/amount.js | 4 ---- src/js/controllers/confirm.js | 17 +++++++---------- src/js/services/feeService.js | 2 +- src/sass/views/amount.scss | 4 ---- 4 files changed, 8 insertions(+), 19 deletions(-) diff --git a/src/js/controllers/amount.js b/src/js/controllers/amount.js index b2b5e54ae..47faec030 100644 --- a/src/js/controllers/amount.js +++ b/src/js/controllers/amount.js @@ -21,10 +21,6 @@ angular.module('copayApp.controllers').controller('amountController', function($ $scope.toEmail = data.stateParams.toEmail; $scope.showAlternativeAmount = !!$scope.cardId || !!$scope.isGiftCard; $scope.toColor = data.stateParams.toColor; - $scope.network = (new bitcore.Address($scope.toAddress)).network.name; - $scope.wallets = profileService.getWallets({ - network: $scope.network - }); $scope.customAmount = data.stateParams.customAmount; diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index d87fc1336..3010cbfe4 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -147,11 +147,6 @@ angular.module('copayApp.controllers').controller('confirmController', function( feePerKb: feePerKb, }; - toAmount = parseFloat((resp.amount * satToUnit).toFixed(unitDecimals)); - txFormatService.formatAlternativeStr(resp.amount, function(v) { - $scope.alternativeAmountStr = v; - }); - var msg = gettextCatalog.getString("{{fee}} will be deducted for bitcoin networking fees", { fee: txFormatService.formatAmount(resp.fee) + ' ' + unitName }); @@ -160,13 +155,14 @@ angular.module('copayApp.controllers').controller('confirmController', function( if (!lodash.isEmpty(warningMsg)) msg += '. \n' + warningMsg; - popupService.showConfirm(null, msg, 'Ok', gettextCatalog.getString('Cancel'), function(result) { - if (!result) return; - - var amount = txFormatService.formatAmount(resp.amount, true); - $scope.displayAmount = amount; + popupService.showAlert(null, msg, function() { + $scope.displayAmount = txFormatService.formatAmount(resp.amount, true); $scope.displayUnit = unitName; $scope.fee = txFormatService.formatAmount($scope.sendMaxInfo.fee) + ' ' + unitName; + toAmount = parseFloat((resp.amount * satToUnit).toFixed(unitDecimals)); + txFormatService.formatAlternativeStr(resp.amount, function(v) { + $scope.alternativeAmountStr = v; + }); createTx($scope.wallet, true, function(err, txp) { if (err) return; @@ -374,6 +370,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( }; $scope.approve = function(onSendStatusChange) { + if (!toAmount) return; if ($scope.paypro && $scope.paymentExpired.value) { popupService.showAlert(null, gettextCatalog.getString('This bitcoin payment request has expired.')); diff --git a/src/js/services/feeService.js b/src/js/services/feeService.js index 1d673129f..e2ee38bc1 100644 --- a/src/js/services/feeService.js +++ b/src/js/services/feeService.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.services').factory('feeService', function($log, $stateParams, bwcService, walletService, configService, gettext, lodash, txFormatService, profileService, gettextCatalog) { +angular.module('copayApp.services').factory('feeService', function($log, $stateParams, bwcService, walletService, configService, gettext, lodash, txFormatService, gettextCatalog) { var root = {}; // Constant fee options to translate diff --git a/src/sass/views/amount.scss b/src/sass/views/amount.scss index 9751f747d..7c4c1681e 100644 --- a/src/sass/views/amount.scss +++ b/src/sass/views/amount.scss @@ -54,10 +54,6 @@ color: $dark-gray; font-weight: bold; } - .send-max { - float: right; - padding-top: 10px; - } } .amount { display: flex; From b61f0785bf443e7c5b675cbde35febe09d68be23 Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 25 Nov 2016 11:51:34 -0300 Subject: [PATCH 12/19] fix feeService param --- src/js/controllers/paperWallet.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/controllers/paperWallet.js b/src/js/controllers/paperWallet.js index 32e584e8b..5d9be8376 100644 --- a/src/js/controllers/paperWallet.js +++ b/src/js/controllers/paperWallet.js @@ -60,7 +60,7 @@ angular.module('copayApp.controllers').controller('paperWalletController', $scope.wallet.buildTxFromPrivateKey($scope.privateKey, destinationAddress, null, function(err, testTx) { if (err) return cb(err); var rawTxLength = testTx.serialize().length; - feeService.getCurrentFeeValue($scope.wallet, function(err, feePerKB) { + feeService.getCurrentFeeValue('livenet', function(err, feePerKB) { var opts = {}; opts.fee = Math.round((feePerKB * rawTxLength) / 2000); $scope.wallet.buildTxFromPrivateKey($scope.privateKey, destinationAddress, opts, function(err, tx) { From a7b2dc24af568758358c6f6d1f1019bdd506de35 Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 25 Nov 2016 15:12:55 -0300 Subject: [PATCH 13/19] replace selector for menu popover --- src/js/controllers/amount.js | 26 ++++++++++++++++---- src/js/directives/sendMaxSelector.js | 26 -------------------- src/sass/views/includes/sendMaxSelector.scss | 21 ---------------- www/views/amount.html | 7 +----- www/views/includes/sendMaxSelector.html | 12 --------- 5 files changed, 22 insertions(+), 70 deletions(-) delete mode 100644 src/js/directives/sendMaxSelector.js delete mode 100644 src/sass/views/includes/sendMaxSelector.scss delete mode 100644 www/views/includes/sendMaxSelector.html diff --git a/src/js/controllers/amount.js b/src/js/controllers/amount.js index 47faec030..f4f8d9d72 100644 --- a/src/js/controllers/amount.js +++ b/src/js/controllers/amount.js @@ -1,12 +1,13 @@ 'use strict'; -angular.module('copayApp.controllers').controller('amountController', function($scope, $filter, $timeout, $ionicScrollDelegate, gettextCatalog, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, txFormatService, ongoingProcess, bitpayCardService, popupService, bwcError, payproService, profileService, bitcore, amazonService) { +angular.module('copayApp.controllers').controller('amountController', function($scope, $filter, $timeout, $ionicScrollDelegate, $ionicHistory, $ionicPopover, gettextCatalog, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, txFormatService, ongoingProcess, bitpayCardService, popupService, bwcError, payproService, profileService, bitcore, amazonService) { var unitToSatoshi; var satToUnit; var unitDecimals; var satToBtc; var SMALL_FONT_SIZE_LIMIT = 10; var LENGTH_EXPRESSION_LIMIT = 19; + var MENU_ITEM_HEIGHT = 55; $scope.$on('$ionicView.leave', function() { angular.element($window).off('keydown'); @@ -14,6 +15,7 @@ angular.module('copayApp.controllers').controller('amountController', function($ $scope.$on("$ionicView.beforeEnter", function(event, data) { $scope.isGiftCard = data.stateParams.isGiftCard; + $scope.showMenu = $ionicHistory.backView().stateName == 'tabs.send'; $scope.isWallet = data.stateParams.isWallet; $scope.cardId = data.stateParams.cardId; $scope.toAddress = data.stateParams.toAddress; @@ -73,14 +75,28 @@ angular.module('copayApp.controllers').controller('amountController', function($ $timeout(function() { $ionicScrollDelegate.resize(); - }); + }, 10); }); - $scope.showSendMaxSelector = function() { - $scope.sendMax = true; + $scope.showSendMaxMenu = function($event) { + var sendMaxObj = { + text: gettextCatalog.getString('Send max amount'), + action: setSendMax, + }; + + $scope.items = [sendMaxObj]; + $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); + }); }; - $scope.setSendMax = function() { + function setSendMax() { + $scope.menu.hide(); $state.transitionTo('tabs.send.confirm', { isWallet: $scope.isWallet, toAmount: null, diff --git a/src/js/directives/sendMaxSelector.js b/src/js/directives/sendMaxSelector.js deleted file mode 100644 index 8cb7f397d..000000000 --- a/src/js/directives/sendMaxSelector.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict'; - -angular.module('copayApp.directives') - .directive('sendMaxSelector', function($timeout) { - return { - restrict: 'E', - templateUrl: 'views/includes/sendMaxSelector.html', - transclude: true, - scope: { - show: '=sendMaxSelectorShow', - wallet: '=sendMaxSelectorWallet', - onSelect: '=sendMaxSelectorOnSelect' - }, - link: function(scope, element, attrs) { - scope.hide = function() { - scope.show = false; - }; - scope.setSendMax = function() { - $timeout(function() { - scope.hide(); - }, 100); - scope.onSelect(); - }; - } - }; - }); diff --git a/src/sass/views/includes/sendMaxSelector.scss b/src/sass/views/includes/sendMaxSelector.scss deleted file mode 100644 index 6463fdb93..000000000 --- a/src/sass/views/includes/sendMaxSelector.scss +++ /dev/null @@ -1,21 +0,0 @@ -send-max-selector { - - .bp-action-sheet__sheet { - padding-left: 2rem; - padding-right: .75rem; - } - - .max-selector { - a.item { - border: none; - padding-top: 20px; - padding-bottom: 20px; - span { - &.item-note { - color: #3A3A3A; - font-family: "Roboto-Light"; - } - } - } - } -} diff --git a/www/views/amount.html b/www/views/amount.html index 24df99096..cfdfb9373 100644 --- a/www/views/amount.html +++ b/www/views/amount.html @@ -6,7 +6,7 @@ - @@ -98,9 +98,4 @@
- - diff --git a/www/views/includes/sendMaxSelector.html b/www/views/includes/sendMaxSelector.html deleted file mode 100644 index 29241b5b1..000000000 --- a/www/views/includes/sendMaxSelector.html +++ /dev/null @@ -1,12 +0,0 @@ - -
Shortcuts
- - - Send max amount - {{wallet.status.availableBalanceStr}} - - -
- Cancel -
-
From f23b0e136d09bfe52fc86f0b71b5a0198da8c487 Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 25 Nov 2016 15:24:02 -0300 Subject: [PATCH 14/19] display wallet selector if use send max --- src/js/controllers/confirm.js | 8 +++++--- www/views/confirm.html | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 3010cbfe4..ea749a3d0 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -22,6 +22,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( giftCardUUID = data.stateParams.giftCardUUID; toAmount = data.stateParams.toAmount; + $scope.useSendMax = data.stateParams.useSendMax; $scope.isWallet = data.stateParams.isWallet; $scope.cardId = data.stateParams.cardId; $scope.toAddress = data.stateParams.toAddress; @@ -29,7 +30,6 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.toEmail = data.stateParams.toEmail; $scope.description = data.stateParams.description; $scope.paypro = data.stateParams.paypro; - $scope.useSendMax = data.stateParams.useSendMax; $scope.insuffientFunds = false; $scope.noMatchingWallet = false; $scope.paymentExpired = { @@ -56,8 +56,8 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.wallet = $scope.wallets[0]; } - if (!$scope.useSendMax) initConfirm(); - else $scope.getSendMaxInfo(); + if ($scope.useSendMax) $scope.showWalletSelector(); + else initConfirm(); }); var initConfirm = function() { @@ -107,6 +107,8 @@ angular.module('copayApp.controllers').controller('confirmController', function( }; $scope.getSendMaxInfo = function() { + $scope.displayAmount = $scope.displayUnit = $scope.fee = $scope.alternativeAmountStr = null; + ongoingProcess.set('gettingFeeLevels', true); feeService.getCurrentFeeValue($scope.network, function(err, feePerKb) { ongoingProcess.set('gettingFeeLevels', false); diff --git a/www/views/confirm.html b/www/views/confirm.html index 3eaa5b5c3..046e23626 100644 --- a/www/views/confirm.html +++ b/www/views/confirm.html @@ -17,7 +17,7 @@
{{displayAmount || '...'}} {{displayUnit}}
-
{{alternativeAmountStr}}
+
{{alternativeAmountStr || '...'}}
From 3d4f216b41a957e8c6b8ed10d4f200d996d12dbb Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 25 Nov 2016 15:59:44 -0300 Subject: [PATCH 15/19] use cached values --- src/js/controllers/confirm.js | 41 ++++++++++++++++++++++++----------- src/sass/views/views.scss | 1 - 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index ea749a3d0..5894d44cd 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -10,6 +10,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( var giftCardAccessKey; var giftCardInvoiceTime; var giftCardUUID; + var cachedSendMax = {}; $scope.isCordova = platformInfo.isCordova; $ionicConfig.views.swipeBackEnabled(false); @@ -22,7 +23,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( giftCardUUID = data.stateParams.giftCardUUID; toAmount = data.stateParams.toAmount; - $scope.useSendMax = data.stateParams.useSendMax; + $scope.useSendMax = data.stateParams.useSendMax == 'true' ? true : false; $scope.isWallet = data.stateParams.isWallet; $scope.cardId = data.stateParams.cardId; $scope.toAddress = data.stateParams.toAddress; @@ -116,12 +117,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( popupService.showAlert(gettextCatalog.getString('Error'), err.message); return; } - var config = configService.getSync().wallet; - var unitName = config.settings.unitName; - var unitToSatoshi = config.settings.unitToSatoshi; - var satToUnit = 1 / unitToSatoshi; - var unitDecimals = config.settings.unitDecimals; ongoingProcess.set('retrievingInputs', true); walletService.getSendMaxInfo($scope.wallet, { @@ -144,11 +140,15 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.sendMaxInfo = { sendMax: true, + amount: resp.amount, inputs: resp.inputs, fee: resp.fee, feePerKb: feePerKb, }; + cachedSendMax[$scope.wallet.id] = $scope.sendMaxInfo; + var unitName = config.settings.unitName; + var msg = gettextCatalog.getString("{{fee}} will be deducted for bitcoin networking fees", { fee: txFormatService.formatAmount(resp.fee) + ' ' + unitName }); @@ -158,13 +158,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( msg += '. \n' + warningMsg; popupService.showAlert(null, msg, function() { - $scope.displayAmount = txFormatService.formatAmount(resp.amount, true); - $scope.displayUnit = unitName; - $scope.fee = txFormatService.formatAmount($scope.sendMaxInfo.fee) + ' ' + unitName; - toAmount = parseFloat((resp.amount * satToUnit).toFixed(unitDecimals)); - txFormatService.formatAlternativeStr(resp.amount, function(v) { - $scope.alternativeAmountStr = v; - }); + setSendMaxValues(resp); createTx($scope.wallet, true, function(err, txp) { if (err) return; @@ -192,6 +186,22 @@ angular.module('copayApp.controllers').controller('confirmController', function( }); }; + function setSendMaxValues(data) { + var config = configService.getSync().wallet; + var unitName = config.settings.unitName; + var unitToSatoshi = config.settings.unitToSatoshi; + var satToUnit = 1 / unitToSatoshi; + var unitDecimals = config.settings.unitDecimals; + + $scope.displayAmount = txFormatService.formatAmount(data.amount, true); + $scope.displayUnit = unitName; + $scope.fee = txFormatService.formatAmount(data.fee) + ' ' + unitName; + toAmount = parseFloat((data.amount * satToUnit).toFixed(unitDecimals)); + txFormatService.formatAlternativeStr(data.amount, function(v) { + $scope.alternativeAmountStr = v; + }); + }; + $scope.$on('accepted', function(event) { $scope.approve(); }); @@ -203,6 +213,11 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.onWalletSelect = function(wallet) { if ($scope.useSendMax) { $scope.wallet = wallet; + if (cachedSendMax[wallet.id]) { + $log.debug('Send max cached for wallet:', wallet.id); + setSendMaxValues(cachedSendMax[wallet.id]); + return; + } $scope.getSendMaxInfo(); } else setWallet(wallet); diff --git a/src/sass/views/views.scss b/src/sass/views/views.scss index af863d518..1e88f8af0 100644 --- a/src/sass/views/views.scss +++ b/src/sass/views/views.scss @@ -38,7 +38,6 @@ @import "includes/tx-details"; @import "includes/txp-details"; @import "includes/tx-status"; -@import "includes/sendMaxSelector"; @import "includes/walletSelector"; @import "integrations/coinbase"; @import "integrations/glidera"; From 9784c95e723e7f98ce1887517734a6185b8bba8c Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 25 Nov 2016 17:05:35 -0300 Subject: [PATCH 16/19] fix typos - filter wallets in first process --- src/js/controllers/confirm.js | 40 ++++++++++++++++++++--------------- www/views/confirm.html | 14 ++++++------ 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 5894d44cd..518b12bc4 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -31,7 +31,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.toEmail = data.stateParams.toEmail; $scope.description = data.stateParams.description; $scope.paypro = data.stateParams.paypro; - $scope.insuffientFunds = false; + $scope.insufficientFunds = false; $scope.noMatchingWallet = false; $scope.paymentExpired = { value: false @@ -42,9 +42,14 @@ angular.module('copayApp.controllers').controller('confirmController', function( var config = configService.getSync().wallet; $scope.feeLevel = config.settings && config.settings.feeLevel ? config.settings.feeLevel : 'normal'; - $scope.network = (new bitcore.Address($scope.toAddress)).network.name; + setwallets(); + if ($scope.useSendMax) $scope.showWalletSelector(); + else initConfirm(); + }); + + function setwallets() { $scope.wallets = profileService.getWallets({ onlyComplete: true, network: $scope.network, @@ -57,16 +62,6 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.wallet = $scope.wallets[0]; } - if ($scope.useSendMax) $scope.showWalletSelector(); - else initConfirm(); - }); - - var initConfirm = function() { - toAmount = parseInt(toAmount); - amountStr = txFormatService.formatAmountStr(toAmount); - $scope.displayAmount = getDisplayAmount(amountStr); - $scope.displayUnit = getDisplayUnit(amountStr); - var filteredWallets = []; var index = 0; var enoughFunds = false; @@ -87,14 +82,24 @@ angular.module('copayApp.controllers').controller('confirmController', function( if (++index == $scope.wallets.length) { if (!lodash.isEmpty(filteredWallets)) { $scope.wallets = lodash.clone(filteredWallets); - setWallet($scope.wallets[0]); + if (!$scope.useSendMax) setWallet($scope.wallets[0]); } else { - if (!enoughFunds) $scope.insuffientFunds = true; + if (!enoughFunds) $scope.insufficientFunds = true; $log.warn('No wallet available to make the payment'); } } }); }); + $timeout(function() { + $scope.$apply(); + }); + }; + + var initConfirm = function() { + toAmount = parseInt(toAmount); + amountStr = txFormatService.formatAmountStr(toAmount); + $scope.displayAmount = getDisplayAmount(amountStr); + $scope.displayUnit = getDisplayUnit(amountStr); txFormatService.formatAlternativeStr(toAmount, function(v) { $scope.alternativeAmountStr = v; @@ -127,13 +132,13 @@ angular.module('copayApp.controllers').controller('confirmController', function( }, function(err, resp) { ongoingProcess.set('retrievingInputs', false); if (err) { - $scope.insuffientFunds = true; + $scope.insufficientFunds = true; popupService.showAlert(gettextCatalog.getString('Error'), err); return; } if (resp.amount == 0) { - $scope.insuffientFunds = true; + $scope.insufficientFunds = true; popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Not enough funds for fee')); return; } @@ -207,6 +212,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( }); $scope.showWalletSelector = function() { + if ($scope.insufficientFunds || $scope.noMatchingWallet) return; $scope.showWallets = true; }; @@ -387,7 +393,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( }; $scope.approve = function(onSendStatusChange) { - if (!toAmount) return; + if (!toAmount || $scope.insufficientFunds || $scope.noMatchingWallet) return; if ($scope.paypro && $scope.paymentExpired.value) { popupService.showAlert(null, gettextCatalog.getString('This bitcoin payment request has expired.')); diff --git a/www/views/confirm.html b/www/views/confirm.html index 046e23626..40ab3aa15 100644 --- a/www/views/confirm.html +++ b/www/views/confirm.html @@ -7,7 +7,7 @@ - +
@@ -50,7 +50,7 @@ Multiple recipients -->
- + From
@@ -60,14 +60,14 @@
- + Add Memo {{description}} -
+
Fee: {{feeLevel}} {{fee || '...'}} @@ -76,7 +76,7 @@
No wallets available
-
+
Insufficient funds
@@ -84,12 +84,12 @@ Click to pay Slide to pay From e82cc38c8d3e440bed66850936b0847b30a3de07 Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 29 Nov 2016 11:05:55 -0300 Subject: [PATCH 17/19] fix wallet selector - use fee instead of feePerKb --- src/js/controllers/confirm.js | 37 ++++++++++++++++++++--------------- www/views/confirm.html | 2 +- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 518b12bc4..5fa3392a0 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -23,6 +23,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( giftCardUUID = data.stateParams.giftCardUUID; toAmount = data.stateParams.toAmount; + cachedSendMax = {}; $scope.useSendMax = data.stateParams.useSendMax == 'true' ? true : false; $scope.isWallet = data.stateParams.isWallet; $scope.cardId = data.stateParams.cardId; @@ -44,9 +45,6 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.feeLevel = config.settings && config.settings.feeLevel ? config.settings.feeLevel : 'normal'; $scope.network = (new bitcore.Address($scope.toAddress)).network.name; setwallets(); - - if ($scope.useSendMax) $scope.showWalletSelector(); - else initConfirm(); }); function setwallets() { @@ -56,11 +54,8 @@ angular.module('copayApp.controllers').controller('confirmController', function( n: $scope.isGiftCard ? true : false }); - if (!$scope.wallets || !$scope.wallets.length) { + if (!$scope.wallets || !$scope.wallets.length) $scope.noMatchingWallet = true; - } else { - $scope.wallet = $scope.wallets[0]; - } var filteredWallets = []; var index = 0; @@ -82,17 +77,18 @@ angular.module('copayApp.controllers').controller('confirmController', function( if (++index == $scope.wallets.length) { if (!lodash.isEmpty(filteredWallets)) { $scope.wallets = lodash.clone(filteredWallets); - if (!$scope.useSendMax) setWallet($scope.wallets[0]); + if ($scope.useSendMax) $scope.showWalletSelector(); + else initConfirm(); } else { if (!enoughFunds) $scope.insufficientFunds = true; $log.warn('No wallet available to make the payment'); } + $timeout(function() { + $scope.$apply(); + }); } }); }); - $timeout(function() { - $scope.$apply(); - }); }; var initConfirm = function() { @@ -107,13 +103,18 @@ angular.module('copayApp.controllers').controller('confirmController', function( if ($scope.paypro) _paymentTimeControl($scope.paypro.expires); + $scope.showWalletSelector(); $timeout(function() { $scope.$apply(); }); }; + function resetValues() { + $scope.displayAmount = $scope.displayUnit = $scope.fee = $scope.alternativeAmountStr = $scope.insufficientFunds = $scope.noMatchingWallet = null; + }; + $scope.getSendMaxInfo = function() { - $scope.displayAmount = $scope.displayUnit = $scope.fee = $scope.alternativeAmountStr = null; + resetValues(); ongoingProcess.set('gettingFeeLevels', true); feeService.getCurrentFeeValue($scope.network, function(err, feePerKb) { @@ -192,6 +193,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( }; function setSendMaxValues(data) { + resetValues(); var config = configService.getSync().wallet; var unitName = config.settings.unitName; var unitToSatoshi = config.settings.unitToSatoshi; @@ -205,6 +207,9 @@ angular.module('copayApp.controllers').controller('confirmController', function( txFormatService.formatAlternativeStr(data.amount, function(v) { $scope.alternativeAmountStr = v; }); + $timeout(function() { + $scope.$apply(); + }); }; $scope.$on('accepted', function(event) { @@ -212,7 +217,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( }); $scope.showWalletSelector = function() { - if ($scope.insufficientFunds || $scope.noMatchingWallet) return; + if (!$scope.useSendMax && ($scope.insufficientFunds || $scope.noMatchingWallet)) return; $scope.showWallets = true; }; @@ -239,7 +244,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( if (typeof res != 'undefined') $scope.description = res; $timeout(function() { $scope.$apply(); - }, 100); + }); }); }; @@ -316,7 +321,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( $timeout(function() { $scope.$apply(); }); - popupService.showAlert(gettextCatalog.getString('Error at confirm:'), msg); + popupService.showAlert(gettextCatalog.getString('Error at confirm'), msg); }; function apply(txp) { @@ -362,7 +367,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( if ($scope.sendMaxInfo) { txp.inputs = $scope.sendMaxInfo.inputs; - txp.feePerKb = $scope.sendMaxInfo.feePerKb; + txp.fee = $scope.sendMaxInfo.fee; } else txp.feeLevel = config.settings && config.settings.feeLevel ? config.settings.feeLevel : 'normal'; diff --git a/www/views/confirm.html b/www/views/confirm.html index 40ab3aa15..e107a1833 100644 --- a/www/views/confirm.html +++ b/www/views/confirm.html @@ -50,7 +50,7 @@ Multiple recipients -->
- + From
From 88b2ed63ffe810c22d34b9acfdddf9141968b9a4 Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 29 Nov 2016 12:02:10 -0300 Subject: [PATCH 18/19] use correct format amount str --- src/js/controllers/confirm.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 5fa3392a0..4d5e3029e 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -153,10 +153,9 @@ angular.module('copayApp.controllers').controller('confirmController', function( }; cachedSendMax[$scope.wallet.id] = $scope.sendMaxInfo; - var unitName = config.settings.unitName; var msg = gettextCatalog.getString("{{fee}} will be deducted for bitcoin networking fees", { - fee: txFormatService.formatAmount(resp.fee) + ' ' + unitName + fee: txFormatService.formatAmountStr(resp.fee) }); var warningMsg = verifyExcludedUtxos(); @@ -177,13 +176,13 @@ angular.module('copayApp.controllers').controller('confirmController', function( var warningMsg = []; if (resp.utxosBelowFee > 0) { warningMsg.push(gettextCatalog.getString("A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided.", { - amountBelowFeeStr: txFormatService.formatAmount(resp.amountBelowFee) + ' ' + unitName + amountBelowFeeStr: txFormatService.formatAmountStr(resp.amountBelowFee) })); } if (resp.utxosAboveMaxSize > 0) { warningMsg.push(gettextCatalog.getString("A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded", { - amountAboveMaxSizeStr: txFormatService.formatAmount(resp.amountAboveMaxSize) + ' ' + unitName + amountAboveMaxSizeStr: txFormatService.formatAmountStr(resp.amountAboveMaxSize) })); } return warningMsg.join('\n'); @@ -202,7 +201,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.displayAmount = txFormatService.formatAmount(data.amount, true); $scope.displayUnit = unitName; - $scope.fee = txFormatService.formatAmount(data.fee) + ' ' + unitName; + $scope.fee = txFormatService.formatAmountStr(data.fee); toAmount = parseFloat((data.amount * satToUnit).toFixed(unitDecimals)); txFormatService.formatAlternativeStr(data.amount, function(v) { $scope.alternativeAmountStr = v; From 7e26f5b6e9ae9dd8f9ccb98640c2b5559b4fadfd Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 29 Nov 2016 14:28:43 -0300 Subject: [PATCH 19/19] refactor --- src/js/controllers/confirm.js | 51 ++++++++++++++++++++--------------- src/js/services/feeService.js | 7 +++-- www/views/confirm.html | 2 +- 3 files changed, 36 insertions(+), 24 deletions(-) diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 4d5e3029e..37e542291 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -2,7 +2,6 @@ angular.module('copayApp.controllers').controller('confirmController', function($rootScope, $scope, $interval, $filter, $timeout, $ionicScrollDelegate, gettextCatalog, walletService, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, profileService, bitcore, gettext, txFormatService, ongoingProcess, $ionicModal, popupService, $ionicHistory, $ionicConfig, payproService, feeService, amazonService) { var cachedTxp = {}; - var amountStr; var toAmount; var isChromeApp = platformInfo.isChromeApp; var countDown = null; @@ -44,6 +43,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( var config = configService.getSync().wallet; $scope.feeLevel = config.settings && config.settings.feeLevel ? config.settings.feeLevel : 'normal'; $scope.network = (new bitcore.Address($scope.toAddress)).network.name; + resetValues(); setwallets(); }); @@ -54,8 +54,16 @@ angular.module('copayApp.controllers').controller('confirmController', function( n: $scope.isGiftCard ? true : false }); - if (!$scope.wallets || !$scope.wallets.length) + if (!$scope.wallets || !$scope.wallets.length) { $scope.noMatchingWallet = true; + if ($scope.paypro) { + displayValues(); + } + $timeout(function() { + $scope.$apply(); + }); + return; + } var filteredWallets = []; var index = 0; @@ -92,23 +100,26 @@ angular.module('copayApp.controllers').controller('confirmController', function( }; var initConfirm = function() { - toAmount = parseInt(toAmount); - amountStr = txFormatService.formatAmountStr(toAmount); - $scope.displayAmount = getDisplayAmount(amountStr); - $scope.displayUnit = getDisplayUnit(amountStr); - - txFormatService.formatAlternativeStr(toAmount, function(v) { - $scope.alternativeAmountStr = v; - }); - if ($scope.paypro) _paymentTimeControl($scope.paypro.expires); + displayValues(); $scope.showWalletSelector(); + $timeout(function() { $scope.$apply(); }); }; + function displayValues() { + toAmount = parseInt(toAmount); + $scope.amountStr = txFormatService.formatAmountStr(toAmount); + $scope.displayAmount = getDisplayAmount($scope.amountStr); + $scope.displayUnit = getDisplayUnit($scope.amountStr); + txFormatService.formatAlternativeStr(toAmount, function(v) { + $scope.alternativeAmountStr = v; + }); + }; + function resetValues() { $scope.displayAmount = $scope.displayUnit = $scope.fee = $scope.alternativeAmountStr = $scope.insufficientFunds = $scope.noMatchingWallet = null; }; @@ -133,7 +144,6 @@ angular.module('copayApp.controllers').controller('confirmController', function( }, function(err, resp) { ongoingProcess.set('retrievingInputs', false); if (err) { - $scope.insufficientFunds = true; popupService.showAlert(gettextCatalog.getString('Error'), err); return; } @@ -154,13 +164,13 @@ angular.module('copayApp.controllers').controller('confirmController', function( cachedSendMax[$scope.wallet.id] = $scope.sendMaxInfo; - var msg = gettextCatalog.getString("{{fee}} will be deducted for bitcoin networking fees", { + var msg = gettextCatalog.getString("{{fee}} will be deducted for bitcoin networking fees.", { fee: txFormatService.formatAmountStr(resp.fee) }); var warningMsg = verifyExcludedUtxos(); if (!lodash.isEmpty(warningMsg)) - msg += '. \n' + warningMsg; + msg += '\n' + warningMsg; popupService.showAlert(null, msg, function() { setSendMaxValues(resp); @@ -181,7 +191,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( } if (resp.utxosAboveMaxSize > 0) { - warningMsg.push(gettextCatalog.getString("A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded", { + warningMsg.push(gettextCatalog.getString("A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded.", { amountAboveMaxSizeStr: txFormatService.formatAmountStr(resp.amountAboveMaxSize) })); } @@ -248,11 +258,11 @@ angular.module('copayApp.controllers').controller('confirmController', function( }; function getDisplayAmount(amountStr) { - return amountStr.split(' ')[0]; + return $scope.amountStr.split(' ')[0]; }; function getDisplayUnit(amountStr) { - return amountStr.split(' ')[1]; + return $scope.amountStr.split(' ')[1]; }; function _paymentTimeControl(expirationTime) { @@ -355,7 +365,8 @@ angular.module('copayApp.controllers').controller('confirmController', function( var txp = {}; var amount; - if ($scope.useSendMax) amount = parseFloat((toAmount * unitToSatoshi)); + + if ($scope.useSendMax) amount = parseFloat((toAmount * unitToSatoshi).toFixed(0)); else amount = toAmount; txp.outputs = [{ @@ -397,8 +408,6 @@ angular.module('copayApp.controllers').controller('confirmController', function( }; $scope.approve = function(onSendStatusChange) { - if (!toAmount || $scope.insufficientFunds || $scope.noMatchingWallet) return; - if ($scope.paypro && $scope.paymentExpired.value) { popupService.showAlert(null, gettextCatalog.getString('This bitcoin payment request has expired.')); $scope.sendStatus = ''; @@ -432,7 +441,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( var isCordova = $scope.isCordova; var bigAmount = parseFloat(txFormatService.formatToUSD(txp.amount)) > 20; var message = gettextCatalog.getString('Sending {{amountStr}} from your {{name}} wallet', { - amountStr: amountStr, + amountStr: $scope.amountStr, name: wallet.name }); var okText = gettextCatalog.getString('Confirm'); diff --git a/src/js/services/feeService.js b/src/js/services/feeService.js index e2ee38bc1..6a9691ebc 100644 --- a/src/js/services/feeService.js +++ b/src/js/services/feeService.js @@ -26,10 +26,13 @@ angular.module('copayApp.services').factory('feeService', function($log, $stateP level: feeLevel }); - if (!feeLevelValue || !feeLevelValue.feePerKB) + if (!feeLevelValue || !feeLevelValue.feePerKB) { return cb({ - message: gettextCatalog.getString('Could not get dynamic fee for level: ') + feeLevel + message: gettextCatalog.getString("Could not get dynamic fee for level: {{feeLevel}}", { + feeLevel: feeLevel + }) }); + } var fee = feeLevelValue.feePerKB; $log.debug('Dynamic fee: ' + feeLevel + ' ' + fee + ' SAT'); diff --git a/www/views/confirm.html b/www/views/confirm.html index e107a1833..5f5ebae63 100644 --- a/www/views/confirm.html +++ b/www/views/confirm.html @@ -13,7 +13,7 @@
Sending - Sending maximum amount + Sending maximum amount
{{displayAmount || '...'}} {{displayUnit}}