From bfa7e47da5223925bcf86453a6b5ca1c9f3e5d8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Baz=C3=A1n?= Date: Tue, 16 May 2017 14:21:33 -0300 Subject: [PATCH 1/7] change fee on the confirm view --- src/js/controllers/confirm.js | 31 ++++++++++++++++-------- src/js/controllers/tab-send.js | 2 ++ src/js/routes.js | 9 +++++++ src/sass/views/confirm.scss | 6 +++++ src/sass/views/includes/txp-details.scss | 4 --- www/views/confirm.html | 17 +++++++------ 6 files changed, 48 insertions(+), 21 deletions(-) diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index ffeafc6a3..6c9934a8b 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -20,7 +20,6 @@ angular.module('copayApp.controllers').controller('confirmController', function( toAmount = data.stateParams.toAmount; cachedSendMax = {}; - $scope.showFeeFiat = false; $scope.showAddress = false; $scope.useSendMax = data.stateParams.useSendMax == 'true' ? true : false; $scope.recipientType = data.stateParams.recipientType || null; @@ -44,10 +43,17 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.feeLevel = feeService.feeOpts[feeLevel]; $scope.network = (new bitcore.Address($scope.toAddress)).network.name; resetValues(); - setwallets(); + if (!$scope.wallet) setwallets(); + else useSelectedWallet(); applyButtonText(); }); + + function useSelectedWallet() { + if (!$scope.useSendMax) displayValues(); + $scope.onWalletSelect($scope.wallet); + } + function applyButtonText(multisig) { $scope.buttonText = $scope.isCordova ? gettextCatalog.getString('Slide') + ' ' : gettextCatalog.getString('Click') + ' '; @@ -95,7 +101,6 @@ angular.module('copayApp.controllers').controller('confirmController', function( } if (++index == $scope.wallets.length) { - if (!lodash.isEmpty(filteredWallets)) { $scope.wallets = lodash.clone(filteredWallets); if ($scope.useSendMax) { @@ -133,10 +138,6 @@ angular.module('copayApp.controllers').controller('confirmController', function( }); }; - $scope.toggleFeeValue = function() { - $scope.showFeeFiat = !$scope.showFeeFiat; - }; - $scope.toggleAddress = function() { $scope.showAddress = !$scope.showAddress; }; @@ -163,8 +164,8 @@ angular.module('copayApp.controllers').controller('confirmController', function( }; function resetValues() { - $scope.displayAmount = $scope.displayUnit = $scope.fee = $scope.alternativeAmountStr = $scope.insufficientFunds = $scope.noMatchingWallet = null; - $scope.showFeeFiat = $scope.showAddress = false; + $scope.displayAmount = $scope.displayUnit = $scope.fee = $scope.feeFiat = $scope.feePercent = $scope.alternativeAmountStr = $scope.insufficientFunds = $scope.noMatchingWallet = null; + $scope.showAddress = false; }; $scope.getSendMaxInfo = function() { @@ -255,10 +256,14 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.displayAmount = getDisplayAmount($scope.amountStr); $scope.displayUnit = getDisplayUnit($scope.amountStr); $scope.fee = txFormatService.formatAmountStr(data.fee); + txFormatService.formatAlternativeStr(data.fee, function(v) { + $scope.feeFiat = v; + }); toAmount = parseFloat((data.amount * satToUnit).toFixed(unitDecimals)); txFormatService.formatAlternativeStr(data.amount, function(v) { $scope.alternativeAmountStr = v; }); + $scope.feePercent = (data.fee * 100 / (data.amount + data.fee)).toFixed(2); $timeout(function() { $scope.$apply(); }); @@ -347,7 +352,6 @@ angular.module('copayApp.controllers').controller('confirmController', function( var stop; $scope.wallet = wallet; $scope.fee = $scope.txp = null; - if (stop) { $timeout.cancel(stop); stop = null; @@ -385,6 +389,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.feeFiat = v; }); $scope.txp = txp; + $scope.feePercent = (txp.fee * 100 / (txp.amount + txp.fee)).toFixed(2); $timeout(function() { $scope.$apply(); }); @@ -576,4 +581,10 @@ angular.module('copayApp.controllers').controller('confirmController', function( if (err) return setSendError(err); }, onSendStatusChange); }; + + $scope.chooseFeeLevel = function() { + cachedTxp = {}; + $state.go('tabs.send.confirm.fee'); + }; + }); diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index 96694847f..d76b4db98 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -12,6 +12,7 @@ angular.module('copayApp.controllers').controller('tabSendController', function( $scope.wallets = profileService.getWallets({ onlyComplete: true }); + console.log($scope.wallets); $scope.hasWallets = lodash.isEmpty($scope.wallets) ? false : true; }; @@ -158,6 +159,7 @@ angular.module('copayApp.controllers').controller('tabSendController', function( return popupService.showAlert(err); } $log.debug('Got toAddress:' + addr + ' | ' + item.name); + console.log(item); return $state.transitionTo('tabs.send.amount', { recipientType: item.recipientType, toAddress: addr, diff --git a/src/js/routes.js b/src/js/routes.js index a6320d2a3..eb987a4c2 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -295,6 +295,15 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr paypro: null } }) + .state('tabs.send.confirm.fee', { + url: '/fee', + views: { + 'tab-send@tabs': { + controller: 'preferencesFeeController', + templateUrl: 'views/preferencesFee.html' + } + } + }) .state('tabs.send.addressbook', { url: '/addressbook/add/:fromSendTab/:addressbookEntry', views: { diff --git a/src/sass/views/confirm.scss b/src/sass/views/confirm.scss index 71415b71c..6d6425a6f 100644 --- a/src/sass/views/confirm.scss +++ b/src/sass/views/confirm.scss @@ -1,6 +1,12 @@ #view-confirm { background-color: #ffffff; @extend .deflash-blue; + .item-note { + float: none; + .fee-percent { + display: inline-block; + } + } .icon-amazon { background-image: url("../img/icon-amazon.svg"); } diff --git a/src/sass/views/includes/txp-details.scss b/src/sass/views/includes/txp-details.scss index 1ee5702a1..420c7ab96 100644 --- a/src/sass/views/includes/txp-details.scss +++ b/src/sass/views/includes/txp-details.scss @@ -142,10 +142,6 @@ padding: .2rem 0; margin-bottom: 5px; - ~ .bp-arrow-right { - top: 14px; - } - > i { padding: 0; position: static; diff --git a/www/views/confirm.html b/www/views/confirm.html index b5b746d1b..8b6ad0df7 100644 --- a/www/views/confirm.html +++ b/www/views/confirm.html @@ -48,7 +48,7 @@
- +
@@ -77,18 +77,21 @@
- +
+ {{'Fee' | translate}}: {{feeLevel | translate}} + {{fee || '...'}} + + {{feeFiat || '...'}} - {{feePercent}} % of the transaction + + +
+
Add Memo {{description}} -
- {{'Fee' | translate}}: {{feeLevel | translate}} - {{fee || '...'}} - {{feeFiat || '...'}} -
No wallets available
From c558b644032fe2c020f16df15bf85b18981c3bce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Baz=C3=A1n?= Date: Tue, 16 May 2017 14:36:20 -0300 Subject: [PATCH 2/7] delete unused view and wording fixes --- src/js/controllers/confirm.js | 6 ++--- src/sass/views/confirm.scss | 2 +- www/views/confirm.html | 2 +- www/views/includes/confirm-tx.html | 39 ------------------------------ 4 files changed, 5 insertions(+), 44 deletions(-) delete mode 100644 www/views/includes/confirm-tx.html diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 6c9934a8b..881da799b 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -164,7 +164,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( }; function resetValues() { - $scope.displayAmount = $scope.displayUnit = $scope.fee = $scope.feeFiat = $scope.feePercent = $scope.alternativeAmountStr = $scope.insufficientFunds = $scope.noMatchingWallet = null; + $scope.displayAmount = $scope.displayUnit = $scope.fee = $scope.feeFiat = $scope.feeRateStr = $scope.alternativeAmountStr = $scope.insufficientFunds = $scope.noMatchingWallet = null; $scope.showAddress = false; }; @@ -263,7 +263,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( txFormatService.formatAlternativeStr(data.amount, function(v) { $scope.alternativeAmountStr = v; }); - $scope.feePercent = (data.fee * 100 / (data.amount + data.fee)).toFixed(2); + $scope.feeRateStr = (data.fee / (data.amount + data.fee) * 100).toFixed(2) + '%'; $timeout(function() { $scope.$apply(); }); @@ -389,7 +389,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.feeFiat = v; }); $scope.txp = txp; - $scope.feePercent = (txp.fee * 100 / (txp.amount + txp.fee)).toFixed(2); + $scope.feeRateStr = (txp.fee / (txp.amount + txp.fee) * 100).toFixed(2) + '%'; $timeout(function() { $scope.$apply(); }); diff --git a/src/sass/views/confirm.scss b/src/sass/views/confirm.scss index 6d6425a6f..8adc61672 100644 --- a/src/sass/views/confirm.scss +++ b/src/sass/views/confirm.scss @@ -3,7 +3,7 @@ @extend .deflash-blue; .item-note { float: none; - .fee-percent { + .fee-rate { display: inline-block; } } diff --git a/www/views/confirm.html b/www/views/confirm.html index 8b6ad0df7..b9c65a312 100644 --- a/www/views/confirm.html +++ b/www/views/confirm.html @@ -81,7 +81,7 @@ {{'Fee' | translate}}: {{feeLevel | translate}} {{fee || '...'}} - {{feeFiat || '...'}} - {{feePercent}} % of the transaction + {{feeFiat || '...'}} - {{feeRateStr}} of the transaction
diff --git a/www/views/includes/confirm-tx.html b/www/views/includes/confirm-tx.html deleted file mode 100644 index 1743e399c..000000000 --- a/www/views/includes/confirm-tx.html +++ /dev/null @@ -1,39 +0,0 @@ -
- -
-
-
{{tx.amountStr}}
-
{{tx.alternativeAmountStr}}
- -
- - - - Multiple recipients - -
-
-
- Fee ({{feeLevel|translate}}): - {{tx.feeStr}} - {{feeAlternativeStr}} -
-
- {{feeRateStr}} of the transaction -
-
-
-
- -
-
- -
-
-
From 8122a8447126189e8feb20ce0c0276545f180223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Baz=C3=A1n?= Date: Tue, 16 May 2017 14:38:17 -0300 Subject: [PATCH 3/7] remove console logs --- src/js/controllers/tab-send.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index d76b4db98..96694847f 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -12,7 +12,6 @@ angular.module('copayApp.controllers').controller('tabSendController', function( $scope.wallets = profileService.getWallets({ onlyComplete: true }); - console.log($scope.wallets); $scope.hasWallets = lodash.isEmpty($scope.wallets) ? false : true; }; @@ -159,7 +158,6 @@ angular.module('copayApp.controllers').controller('tabSendController', function( return popupService.showAlert(err); } $log.debug('Got toAddress:' + addr + ' | ' + item.name); - console.log(item); return $state.transitionTo('tabs.send.amount', { recipientType: item.recipientType, toAddress: addr, From 8df8ba6ee0f2d2d9fa437cf0da453570db5c2060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Baz=C3=A1n?= Date: Tue, 16 May 2017 15:04:48 -0300 Subject: [PATCH 4/7] remove tabs from fee policy view when back view is confirm --- src/js/controllers/preferencesFee.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/js/controllers/preferencesFee.js b/src/js/controllers/preferencesFee.js index 50af5f40e..55ffe42a7 100644 --- a/src/js/controllers/preferencesFee.js +++ b/src/js/controllers/preferencesFee.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('preferencesFeeController', function($scope, $timeout, $ionicHistory, lodash, gettextCatalog, configService, feeService, ongoingProcess, popupService) { +angular.module('copayApp.controllers').controller('preferencesFeeController', function($scope, $rootScope, $timeout, $ionicHistory, lodash, gettextCatalog, configService, feeService, ongoingProcess, popupService) { $scope.save = function(newFee) { var opts = { @@ -21,7 +21,16 @@ angular.module('copayApp.controllers').controller('preferencesFeeController', fu }); }; + function hideTabs() { + $timeout(function() { + $rootScope.hideTabs = 'tabs-item-hide'; + $rootScope.$apply(); + }); + }; + $scope.$on("$ionicView.beforeEnter", function(event, data) { + + if ($ionicHistory.backView() && ($ionicHistory.backView().stateName == 'tabs.send.confirm')) hideTabs(); $scope.feeOpts = feeService.feeOpts; $scope.currentFeeLevel = feeService.getCurrentFeeLevel(); $scope.loadingFee = true; @@ -45,7 +54,7 @@ angular.module('copayApp.controllers').controller('preferencesFeeController', fu }); if (lodash.isEmpty(feeLevelValue)) { $scope.feePerKBUnit = null; - $scope.avgConfirmationTime = null; + $scope.avgConfirmationTime = null; return; } $scope.feePerKBUnit = feeLevelValue.feePerKBUnit; From e29550ea0b38548d73c595330a79483ed9fe867b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Baz=C3=A1n?= Date: Tue, 16 May 2017 15:25:22 -0300 Subject: [PATCH 5/7] fixes --- www/views/confirm.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/views/confirm.html b/www/views/confirm.html index b9c65a312..9fe71b8d2 100644 --- a/www/views/confirm.html +++ b/www/views/confirm.html @@ -78,7 +78,7 @@
- {{'Fee' | translate}}: {{feeLevel | translate}} + {{'Fee:' | translate}} {{feeLevel | translate}} {{fee || '...'}} {{feeFiat || '...'}} - {{feeRateStr}} of the transaction From f681122fd6ba84f91676604a25999075320fc862 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Baz=C3=A1n?= Date: Wed, 17 May 2017 16:37:49 -0300 Subject: [PATCH 6/7] change unit/kB for sat/Byte in fee rate --- src/js/controllers/preferencesFee.js | 4 ++-- src/js/services/feeService.js | 5 ----- www/views/preferencesFee.html | 6 +++--- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/js/controllers/preferencesFee.js b/src/js/controllers/preferencesFee.js index 55ffe42a7..94fe0d3ff 100644 --- a/src/js/controllers/preferencesFee.js +++ b/src/js/controllers/preferencesFee.js @@ -53,11 +53,11 @@ angular.module('copayApp.controllers').controller('preferencesFeeController', fu level: $scope.currentFeeLevel }); if (lodash.isEmpty(feeLevelValue)) { - $scope.feePerKBUnit = null; + $scope.feePerSatByte = null; $scope.avgConfirmationTime = null; return; } - $scope.feePerKBUnit = feeLevelValue.feePerKBUnit; + $scope.feePerSatByte = (feeLevelValue.feePerKB / 1000).toFixed(); $scope.avgConfirmationTime = feeLevelValue.nbBlocks * 10; }; }); diff --git a/src/js/services/feeService.js b/src/js/services/feeService.js index 0e4deabc7..51fc62207 100644 --- a/src/js/services/feeService.js +++ b/src/js/services/feeService.js @@ -50,12 +50,7 @@ angular.module('copayApp.services').factory('feeService', function($log, $stateP walletClient.getFeeLevels('testnet', function(errTestnet, levelsTestnet) { if (errLivenet || errTestnet) { return cb(gettextCatalog.getString('Could not get dynamic fee')); - } else { - lodash.each(lodash.union(levelsLivenet, levelsTestnet), function(level) { - level.feePerKBUnit = txFormatService.formatAmount(level.feePerKB) + ' ' + unitName; - }); } - return cb(null, { 'livenet': levelsLivenet, 'testnet': levelsTestnet diff --git a/www/views/preferencesFee.html b/www/views/preferencesFee.html index 8254f912c..0a038300c 100644 --- a/www/views/preferencesFee.html +++ b/www/views/preferencesFee.html @@ -12,13 +12,13 @@
The higher the fee, the greater the incentive a miner has to include that transaction in a block. Current fees are determined based on network load and the selected policy.
- Average confirmation time: + Average confirmation time: {{avgConfirmationTime | amDurationFormat: 'minute'}} ...
- Current fee rate for this policy: - {{feePerKBUnit}}/kiB + Current fee rate for this policy: + {{feePerSatByte}} sat/Byte ...
From 6521bbdcb45c4571e9f0839579eb99bb38477bdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Baz=C3=A1n?= Date: Fri, 19 May 2017 10:59:36 -0300 Subject: [PATCH 7/7] use new fee level only for the current transaction created --- src/js/controllers/confirm.js | 164 +++++++++++++++------------ src/js/controllers/paperWallet.js | 2 +- src/js/controllers/preferencesFee.js | 28 +++-- src/js/routes.js | 9 -- src/js/services/feeService.js | 4 +- src/js/services/onGoingProcess.js | 6 +- src/js/services/sendMax.js | 4 +- www/views/modals/chooseFeeLevel.html | 34 ++++++ www/views/preferencesFee.html | 2 +- 9 files changed, 152 insertions(+), 101 deletions(-) create mode 100644 www/views/modals/chooseFeeLevel.html diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 881da799b..d9410c2bc 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -2,6 +2,8 @@ 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, txFormatService, ongoingProcess, $ionicModal, popupService, $ionicHistory, $ionicConfig, payproService, feeService, bwcError) { var cachedTxp = {}; + var feeLevel; + var feePerKb; var toAmount; var isChromeApp = platformInfo.isChromeApp; var countDown = null; @@ -37,17 +39,23 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.remainingTimeStr = { value: null }; - - var config = configService.getSync().wallet; - var feeLevel = config.settings && config.settings.feeLevel ? config.settings.feeLevel : 'normal'; - $scope.feeLevel = feeService.feeOpts[feeLevel]; $scope.network = (new bitcore.Address($scope.toAddress)).network.name; + setFee(); resetValues(); - if (!$scope.wallet) setwallets(); - else useSelectedWallet(); + setwallets(); applyButtonText(); }); + function setFee(customFeeLevel, cb) { + feeService.getCurrentFeeValue($scope.network, customFeeLevel, function(err, feePerKb) { + var config = configService.getSync().wallet; + var configFeeLevel = (config.settings && config.settings.feeLevel) ? config.settings.feeLevel : 'normal'; + feePerKb = feePerKb; + feeLevel = customFeeLevel ? customFeeLevel : configFeeLevel; + $scope.feeLevel = feeService.feeOpts[feeLevel]; + if (cb) return cb(); + }); + } function useSelectedWallet() { if (!$scope.useSendMax) displayValues(); @@ -170,78 +178,69 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.getSendMaxInfo = function() { resetValues(); + var config = configService.getSync().wallet; - ongoingProcess.set('gettingFeeLevels', true); - feeService.getCurrentFeeValue($scope.network, function(err, feePerKb) { - ongoingProcess.set('gettingFeeLevels', false); + ongoingProcess.set('retrievingInputs', true); + walletService.getSendMaxInfo($scope.wallet, { + feePerKb: feePerKb, + excludeUnconfirmedUtxos: !config.spendUnconfirmed, + returnInputs: true, + }, function(err, resp) { + ongoingProcess.set('retrievingInputs', false); if (err) { - popupService.showAlert(gettextCatalog.getString('Error'), err.message); + popupService.showAlert(gettextCatalog.getString('Error'), err); return; } - var config = configService.getSync().wallet; - ongoingProcess.set('retrievingInputs', true); - walletService.getSendMaxInfo($scope.wallet, { + if (resp.amount == 0) { + $scope.insufficientFunds = true; + popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Not enough funds for fee')); + return; + } + + $scope.sendMaxInfo = { + sendMax: true, + amount: resp.amount, + inputs: resp.inputs, + fee: resp.fee, feePerKb: feePerKb, - excludeUnconfirmedUtxos: !config.spendUnconfirmed, - returnInputs: true, - }, function(err, resp) { - ongoingProcess.set('retrievingInputs', false); - if (err) { - popupService.showAlert(gettextCatalog.getString('Error'), err); - return; - } + }; - if (resp.amount == 0) { - $scope.insufficientFunds = true; - popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Not enough funds for fee')); - return; - } + cachedSendMax[$scope.wallet.id] = $scope.sendMaxInfo; - $scope.sendMaxInfo = { - sendMax: true, - amount: resp.amount, - inputs: resp.inputs, - fee: resp.fee, - feePerKb: feePerKb, - }; - - cachedSendMax[$scope.wallet.id] = $scope.sendMaxInfo; - - 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; - - popupService.showAlert(null, msg, function() { - setSendMaxValues(resp); - - 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.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.formatAmountStr(resp.amountAboveMaxSize) - })); - } - return warningMsg.join('\n'); - }; + 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; + + popupService.showAlert(null, msg, function() { + setSendMaxValues(resp); + + 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.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.formatAmountStr(resp.amountAboveMaxSize) + })); + } + return warningMsg.join('\n'); + }; }); }; @@ -433,7 +432,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( txp.inputs = $scope.sendMaxInfo.inputs; txp.fee = $scope.sendMaxInfo.fee; } else - txp.feeLevel = config.settings && config.settings.feeLevel ? config.settings.feeLevel : 'normal'; + txp.feeLevel = feeLevel; txp.message = description; @@ -583,8 +582,29 @@ angular.module('copayApp.controllers').controller('confirmController', function( }; $scope.chooseFeeLevel = function() { - cachedTxp = {}; - $state.go('tabs.send.confirm.fee'); + + $scope.customFeeLevel = feeLevel; + $ionicModal.fromTemplateUrl('views/modals/chooseFeeLevel.html', { + scope: $scope, + }).then(function(modal) { + $scope.chooseFeeLevelModal = modal; + $scope.openModal(); + }); + $scope.openModal = function() { + $scope.chooseFeeLevelModal.show(); + }; + $scope.hideModal = function(customFeeLevel) { + if (customFeeLevel) { + cachedTxp = {}; + ongoingProcess.set('gettingFeeLevels', true); + setFee(customFeeLevel, function() { + ongoingProcess.set('gettingFeeLevels', false); + resetValues(); + if ($scope.wallet) useSelectedWallet(); + }) + } + $scope.chooseFeeLevelModal.hide(); + }; }; }); diff --git a/src/js/controllers/paperWallet.js b/src/js/controllers/paperWallet.js index ee613f574..542a3a97d 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('livenet', function(err, feePerKB) { + feeService.getCurrentFeeValue('livenet', null, function(err, feePerKB) { var opts = {}; opts.fee = Math.round((feePerKB * rawTxLength) / 2000); $scope.wallet.buildTxFromPrivateKey($scope.privateKey, destinationAddress, opts, function(err, tx) { diff --git a/src/js/controllers/preferencesFee.js b/src/js/controllers/preferencesFee.js index 94fe0d3ff..6ac32a1bf 100644 --- a/src/js/controllers/preferencesFee.js +++ b/src/js/controllers/preferencesFee.js @@ -1,8 +1,15 @@ 'use strict'; -angular.module('copayApp.controllers').controller('preferencesFeeController', function($scope, $rootScope, $timeout, $ionicHistory, lodash, gettextCatalog, configService, feeService, ongoingProcess, popupService) { +angular.module('copayApp.controllers').controller('preferencesFeeController', function($scope, $timeout, $ionicHistory, lodash, gettextCatalog, configService, feeService, ongoingProcess, popupService) { $scope.save = function(newFee) { + + if ($scope.customFeeLevel) { + $scope.currentFeeLevel = newFee; + updateCurrentValues(); + return; + } + var opts = { wallet: { settings: { @@ -21,18 +28,13 @@ angular.module('copayApp.controllers').controller('preferencesFeeController', fu }); }; - function hideTabs() { - $timeout(function() { - $rootScope.hideTabs = 'tabs-item-hide'; - $rootScope.$apply(); - }); - }; - $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.init(); + }); - if ($ionicHistory.backView() && ($ionicHistory.backView().stateName == 'tabs.send.confirm')) hideTabs(); + $scope.init = function() { $scope.feeOpts = feeService.feeOpts; - $scope.currentFeeLevel = feeService.getCurrentFeeLevel(); + $scope.currentFeeLevel = $scope.customFeeLevel ? $scope.customFeeLevel : feeService.getCurrentFeeLevel(); $scope.loadingFee = true; feeService.getFeeLevels(function(err, levels) { $scope.loadingFee = false; @@ -45,7 +47,7 @@ angular.module('copayApp.controllers').controller('preferencesFeeController', fu updateCurrentValues(); $scope.$apply(); }); - }); + }; var updateCurrentValues = function() { if (lodash.isEmpty($scope.feeLevels) || lodash.isEmpty($scope.currentFeeLevel)) return; @@ -60,4 +62,8 @@ angular.module('copayApp.controllers').controller('preferencesFeeController', fu $scope.feePerSatByte = (feeLevelValue.feePerKB / 1000).toFixed(); $scope.avgConfirmationTime = feeLevelValue.nbBlocks * 10; }; + + $scope.chooseNewFee = function() { + $scope.hideModal($scope.currentFeeLevel); + }; }); diff --git a/src/js/routes.js b/src/js/routes.js index eb987a4c2..a6320d2a3 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -295,15 +295,6 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr paypro: null } }) - .state('tabs.send.confirm.fee', { - url: '/fee', - views: { - 'tab-send@tabs': { - controller: 'preferencesFeeController', - templateUrl: 'views/preferencesFee.html' - } - } - }) .state('tabs.send.addressbook', { url: '/addressbook/add/:fromSendTab/:addressbookEntry', views: { diff --git a/src/js/services/feeService.js b/src/js/services/feeService.js index 51fc62207..889ffb83e 100644 --- a/src/js/services/feeService.js +++ b/src/js/services/feeService.js @@ -16,9 +16,9 @@ angular.module('copayApp.services').factory('feeService', function($log, $stateP return configService.getSync().wallet.settings.feeLevel || 'normal'; }; - root.getCurrentFeeValue = function(network, cb) { + root.getCurrentFeeValue = function(network, customFeeLevel, cb) { network = network || 'livenet'; - var feeLevel = root.getCurrentFeeLevel(); + var feeLevel = customFeeLevel || root.getCurrentFeeLevel(); root.getFeeLevels(function(err, levels) { if (err) return cb(err); diff --git a/src/js/services/onGoingProcess.js b/src/js/services/onGoingProcess.js index 763cccfbb..7a2fd1ff9 100644 --- a/src/js/services/onGoingProcess.js +++ b/src/js/services/onGoingProcess.js @@ -85,7 +85,7 @@ angular.module('copayApp.services').factory('ongoingProcess', function($log, $ti } else { var tmpl; - if (isWP) tmpl = '
' + showName +'
'; + if (isWP) tmpl = '
' + showName + '
'; else tmpl = '
' + showName + '
'; $ionicLoading.show({ template: tmpl @@ -95,8 +95,8 @@ angular.module('copayApp.services').factory('ongoingProcess', function($log, $ti if (isCordova && !isWP) { window.plugins.spinnerDialog.hide(); } else { - $ionicLoading.hide(); - } + $ionicLoading.hide(); + } } }; diff --git a/src/js/services/sendMax.js b/src/js/services/sendMax.js index 13af6024a..fa716e260 100644 --- a/src/js/services/sendMax.js +++ b/src/js/services/sendMax.js @@ -10,9 +10,9 @@ angular.module('copayApp.services').service('sendMaxService', function(feeServic * */ this.getInfo = function(wallet, cb) { - feeService.getCurrentFeeValue(wallet.credentials.network, function(err, feePerKb) { + feeService.getCurrentFeeValue(wallet.credentials.network, null, function(err, feePerKb) { if (err) return cb(err); - + var config = configService.getSync().wallet; walletService.getSendMaxInfo(wallet, { diff --git a/www/views/modals/chooseFeeLevel.html b/www/views/modals/chooseFeeLevel.html new file mode 100644 index 000000000..62dae6735 --- /dev/null +++ b/www/views/modals/chooseFeeLevel.html @@ -0,0 +1,34 @@ + + + +
+ {{'Bitcoin Network Fee Policy'|translate}} +
+
+ +
+
+
+ Average confirmation time: + {{avgConfirmationTime | amDurationFormat: 'minute'}} + ... +
+
+ Current fee rate for this policy: + {{feePerSatByte}} sat/byte + ... +
+
+
+
+ + {{level|translate}} + +
+
+ +
+
+
diff --git a/www/views/preferencesFee.html b/www/views/preferencesFee.html index 0a038300c..6effd6a43 100644 --- a/www/views/preferencesFee.html +++ b/www/views/preferencesFee.html @@ -18,7 +18,7 @@
Current fee rate for this policy: - {{feePerSatByte}} sat/Byte + {{feePerSatByte}} sat/byte ...