From 821669db2c6ef9657b6f4bed6d14a298f1b7a84b Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Tue, 18 Jul 2017 01:42:17 -0300 Subject: [PATCH 1/5] Refactor: custom fee on confirm view --- src/sass/views/views.scss | 1 + www/views/modals/chooseFeeLevel.html | 90 +++++++++++++++++++--------- 2 files changed, 64 insertions(+), 27 deletions(-) diff --git a/src/sass/views/views.scss b/src/sass/views/views.scss index 7a8058339..cbae9b19f 100644 --- a/src/sass/views/views.scss +++ b/src/sass/views/views.scss @@ -34,6 +34,7 @@ @import "includes/walletActivity"; @import "includes/wallets"; @import "includes/modals/modals"; +@import "includes/modals/choose-fee-level"; @import "includes/clickToAccept"; @import "includes/incomingDataMenu"; @import "includes/slideToAccept"; diff --git a/www/views/modals/chooseFeeLevel.html b/www/views/modals/chooseFeeLevel.html index b2877c979..da4e2193e 100644 --- a/www/views/modals/chooseFeeLevel.html +++ b/www/views/modals/chooseFeeLevel.html @@ -1,41 +1,77 @@ - +
{{'Bitcoin Network Fee Policy'|translate}}
-
- -
-
-
- Average confirmation time: - {{avgConfirmationTime | amDurationFormat: 'minute'}} - Could not be estimated - ... + +
+ Testnet +
+
+
+
+ + {{avgConfirmationTime | amDurationFormat: 'minute'}} + + ...
-
- Current fee rate for this policy: - {{feePerSatByte}} satoshis/byte - ... + Average confirmation time +
+
+
+
+ + {{feePerSatByte}} sat/byte + + ... +
+ Current fee rate for this policy +
+
+
+ +
+
+ + + Your fee is lower than recommended. + + + You could not set a fee higher than 1000 satoshis/byte. + +   +
- [{{network}}]
-
- - {{level|translate}} - -
-
- - Your fee is lower than recommended super economy fee ({{getMinimumRecommeded()}} satoshis/byte). The transaction may never get confirmed. -
-
- - You could not set a fee higher than 1000 satoshis/byte. + +
+
+ From d1834c3e902c2709abe479ee95c2ea2f2147bf9f Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Tue, 18 Jul 2017 01:42:52 -0300 Subject: [PATCH 2/5] Adds new files --- src/js/controllers/modals/feeLevels.js | 108 ++++++++++++++++++ .../includes/modals/choose-fee-level.scss | 43 +++++++ 2 files changed, 151 insertions(+) create mode 100644 src/js/controllers/modals/feeLevels.js create mode 100644 src/sass/views/includes/modals/choose-fee-level.scss diff --git a/src/js/controllers/modals/feeLevels.js b/src/js/controllers/modals/feeLevels.js new file mode 100644 index 000000000..5ee92fe33 --- /dev/null +++ b/src/js/controllers/modals/feeLevels.js @@ -0,0 +1,108 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('feeLevelsController', function($scope, $timeout, $log, lodash, gettextCatalog, configService, feeService, ongoingProcess, popupService) { + + var MAX_RECOMMENDED_FEE = 1000; + + var showErrorAndClose = function(title, msg) { + title = title || gettextCatalog.getString('Error'); + $log.error(msg); + popupService.showAlert(title, msg, function() { + $scope.chooseFeeLevelModal.hide(); + }); + + }; + + var getMinRecommended = function() { + var value = lodash.find($scope.feeLevels[$scope.network], { + level: 'superEconomy' + }); + return parseInt((value.feePerKB / 1000).toFixed()); + }; + + var getMaxRecommended = function() { + return MAX_RECOMMENDED_FEE; + }; + + $scope.ok = function() { + $scope.customFeePerKB = $scope.customFeePerKB ? ($scope.customSatPerByte.value * 1000).toFixed() : null; + $scope.hideModal($scope.feeLevel, $scope.customFeePerKB); + }; + + $scope.setFeesRecommended = function() { + $scope.maxFeeRecommended = getMaxRecommended(); + $scope.minFeeRecommended = getMinRecommended(); + }; + + $scope.checkFees = function(feePerSatByte) { + if (parseInt(feePerSatByte) < $scope.minFeeRecommended) $scope.showMinWarning = true; + else $scope.showMinWarning = false; + + if (parseInt(feePerSatByte) > $scope.maxFeeRecommended) $scope.showMaxWarning = true; + else $scope.showMaxWarning = false; + }; + + $scope.updateFeeRate = function() { + var value = lodash.find($scope.feeLevels[$scope.network], { + level: $scope.feeLevel + }); + + // If no custom fee + if (value) { + $scope.customFeePerKB = null; + $scope.feePerSatByte = (value.feePerKB / 1000).toFixed(); + $scope.avgConfirmationTime = value.nbBlocks * 10; + } else { + $scope.avgConfirmationTime = null; + $scope.customSatPerByte = { value: parseInt($scope.feePerSatByte) }; + $scope.customFeePerKB = ($scope.feePerSatByte * 1000).toFixed(); + } + + // Warnings + $scope.setFeesRecommended(); + $scope.checkFees($scope.feePerSatByte); + + $timeout(function() { + $scope.$apply(); + }); + }; + + $scope.$watch( + "selectedFee.value", + function ( newValue, oldValue ) { + if (newValue != oldValue) { + $log.debug('New fee level: ' + newValue); + $scope.feeLevel = $scope.selectedFee.value; + $scope.updateFeeRate(); + } + } + ); + + // From parent controller + // $scope.network + // $scope.feeLevel + // + // IF usingCustomFee + // $scope.customFeePerKB + // $scope.feePerSatByte + + if (lodash.isEmpty($scope.feeLevel)) showErrorAndClose(null, gettextCatalog.getString('Fee level is not defined') ); + $scope.selectedFee = { value: $scope.feeLevel }; + + $scope.feeOpts = feeService.feeOpts; + $scope.loadingFee = true; + feeService.getFeeLevels(function(err, levels) { + $scope.loadingFee = false; + if (err || lodash.isEmpty(levels)) { + showErrorAndClose(null, err); + return; + } + if (lodash.isEmpty(levels)) { + showErrorAndClose(null, gettextCatalog.getString('Could not get fee levels')); + return; + } + $scope.feeLevels = levels; + $scope.updateFeeRate(); + }); + +}); diff --git a/src/sass/views/includes/modals/choose-fee-level.scss b/src/sass/views/includes/modals/choose-fee-level.scss new file mode 100644 index 000000000..cd5eb05af --- /dev/null +++ b/src/sass/views/includes/modals/choose-fee-level.scss @@ -0,0 +1,43 @@ +#choose-fee-level { + @extend .deflash-blue; + .selected-fee-level { + text-align: center; + background: #f2f2f2; + font-size: 11px; + height: 120px; + padding-top: 25px; + .row { + padding: 0; + } + .separator { + border-left: 1px solid #d9d9df; + height: 75%; + } + .value { + font-size: 20px; + margin-bottom: 10px; + } + .rate .list { + margin-bottom: 0; + } + .unit { + color: #9c9c9c; + background: #f2f2f2; + height: 50px; + position: absolute; + right: 0; + padding: 12px 10px 0 10px; + } + } + .warning-fee { + color: $v-warning-color; + font-size: 12px; + text-align: left; + } + .box-notification { + margin: 0; + padding: 1px; + text-align: center; + } + +} From b635a496d7f61f08bc7eb5b4f2d5364ba053e1bb Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Tue, 18 Jul 2017 10:06:57 -0300 Subject: [PATCH 3/5] Fix input styling --- src/sass/views/includes/modals/choose-fee-level.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sass/views/includes/modals/choose-fee-level.scss b/src/sass/views/includes/modals/choose-fee-level.scss index cd5eb05af..c906e5f64 100644 --- a/src/sass/views/includes/modals/choose-fee-level.scss +++ b/src/sass/views/includes/modals/choose-fee-level.scss @@ -23,10 +23,10 @@ .unit { color: #9c9c9c; background: #f2f2f2; - height: 50px; position: absolute; right: 0; - padding: 12px 10px 0 10px; + top: 0; + padding: 15px 10px 12px 10px; } } .warning-fee { From f413857a9778b747b61f651b8ecd8e06ae161e36 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Tue, 18 Jul 2017 11:45:30 -0300 Subject: [PATCH 4/5] UI fixes --- src/js/controllers/confirm.js | 2 +- src/js/controllers/modals/feeLevels.js | 9 +++-- .../includes/modals/choose-fee-level.scss | 38 ++++++++++++++----- www/views/modals/chooseFeeLevel.html | 19 ++++++---- 4 files changed, 48 insertions(+), 20 deletions(-) diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 1f354fd4d..eff5aa4b2 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -570,7 +570,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( if (usingCustomFee) { scope.customFeePerKB = tx.feeRate; - scope.feePerSatByte = (tx.feeRate / 1000).toFixed(); + scope.feePerSatByte = tx.feeRate / 1000; } $ionicModal.fromTemplateUrl('views/modals/chooseFeeLevel.html', { diff --git a/src/js/controllers/modals/feeLevels.js b/src/js/controllers/modals/feeLevels.js index 5ee92fe33..75c1deaed 100644 --- a/src/js/controllers/modals/feeLevels.js +++ b/src/js/controllers/modals/feeLevels.js @@ -35,10 +35,13 @@ angular.module('copayApp.controllers').controller('feeLevelsController', functio }; $scope.checkFees = function(feePerSatByte) { - if (parseInt(feePerSatByte) < $scope.minFeeRecommended) $scope.showMinWarning = true; + if (Number(feePerSatByte) == 0) $scope.showError = true; + else $scope.showError = false; + + if (Number(feePerSatByte) < $scope.minFeeRecommended) $scope.showMinWarning = true; else $scope.showMinWarning = false; - if (parseInt(feePerSatByte) > $scope.maxFeeRecommended) $scope.showMaxWarning = true; + if (Number(feePerSatByte) > $scope.maxFeeRecommended) $scope.showMaxWarning = true; else $scope.showMaxWarning = false; }; @@ -54,7 +57,7 @@ angular.module('copayApp.controllers').controller('feeLevelsController', functio $scope.avgConfirmationTime = value.nbBlocks * 10; } else { $scope.avgConfirmationTime = null; - $scope.customSatPerByte = { value: parseInt($scope.feePerSatByte) }; + $scope.customSatPerByte = { value: Number($scope.feePerSatByte) }; $scope.customFeePerKB = ($scope.feePerSatByte * 1000).toFixed(); } diff --git a/src/sass/views/includes/modals/choose-fee-level.scss b/src/sass/views/includes/modals/choose-fee-level.scss index c906e5f64..c37e9b505 100644 --- a/src/sass/views/includes/modals/choose-fee-level.scss +++ b/src/sass/views/includes/modals/choose-fee-level.scss @@ -2,7 +2,7 @@ @extend .deflash-blue; .selected-fee-level { text-align: center; - background: #f2f2f2; + background: #f9f9f9; font-size: 11px; height: 120px; padding-top: 25px; @@ -20,19 +20,39 @@ .rate .list { margin-bottom: 0; } - .unit { - color: #9c9c9c; - background: #f2f2f2; - position: absolute; - right: 0; - top: 0; - padding: 15px 10px 12px 10px; + + .item-input { + input[type="number"] { + text-align: right; + padding-right: 90px; + } + .unit { + color: #9c9c9c; + background: #f2f2f2; + position: absolute; + right: 0; + top: 0; + padding: 15px 10px 12px 10px; + } } } .warning-fee { + padding: 5px 10px; color: $v-warning-color; font-size: 12px; - text-align: left; + text-align: center; + i { + margin-right: 8px; + } + } + .error-fee { + padding: 5px 10px; + color: $v-error-color; + font-size: 12px; + text-align: center; + i { + margin-right: 8px; + } } .box-notification { margin: 0; diff --git a/www/views/modals/chooseFeeLevel.html b/www/views/modals/chooseFeeLevel.html index da4e2193e..40822a491 100644 --- a/www/views/modals/chooseFeeLevel.html +++ b/www/views/modals/chooseFeeLevel.html @@ -4,9 +4,7 @@ {{'Bitcoin Network Fee Policy'|translate}}
@@ -41,6 +39,8 @@ sat/byte
-
- +
+ + + Zero value for fee are not allowed. + +
+
+ Your fee is lower than recommended. - You could not set a fee higher than 1000 satoshis/byte. + You should not set a fee higher than 1000 satoshis/byte. -  
From 3cac9a30bc36e24291f02ad8f5ab608e5390e117 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Tue, 18 Jul 2017 12:36:32 -0300 Subject: [PATCH 5/5] Set min max allowed valued --- src/js/controllers/modals/feeLevels.js | 21 +++++++++++++++------ www/views/modals/chooseFeeLevel.html | 8 ++++---- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/js/controllers/modals/feeLevels.js b/src/js/controllers/modals/feeLevels.js index 75c1deaed..9006fcd01 100644 --- a/src/js/controllers/modals/feeLevels.js +++ b/src/js/controllers/modals/feeLevels.js @@ -2,7 +2,9 @@ angular.module('copayApp.controllers').controller('feeLevelsController', function($scope, $timeout, $log, lodash, gettextCatalog, configService, feeService, ongoingProcess, popupService) { - var MAX_RECOMMENDED_FEE = 1000; + var FEE_MULTIPLIER = 10; + var FEE_MIN = 0; + var FEE_MAX = 1000000; var showErrorAndClose = function(title, msg) { title = title || gettextCatalog.getString('Error'); @@ -21,7 +23,10 @@ angular.module('copayApp.controllers').controller('feeLevelsController', functio }; var getMaxRecommended = function() { - return MAX_RECOMMENDED_FEE; + var value = lodash.find($scope.feeLevels[$scope.network], { + level: 'urgent' + }); + return parseInt((value.feePerKB / 1000).toFixed()); }; $scope.ok = function() { @@ -30,18 +35,22 @@ angular.module('copayApp.controllers').controller('feeLevelsController', functio }; $scope.setFeesRecommended = function() { - $scope.maxFeeRecommended = getMaxRecommended(); + $scope.minFeeAllowed = FEE_MIN; + $scope.maxFeeAllowed = FEE_MAX; + $scope.maxFeeRecommended = getMaxRecommended() * FEE_MULTIPLIER; $scope.minFeeRecommended = getMinRecommended(); }; $scope.checkFees = function(feePerSatByte) { - if (Number(feePerSatByte) == 0) $scope.showError = true; + var fee = Number(feePerSatByte); + + if (fee <= $scope.minFeeAllowed) $scope.showError = true; else $scope.showError = false; - if (Number(feePerSatByte) < $scope.minFeeRecommended) $scope.showMinWarning = true; + if (fee > $scope.minFeeAllowed && fee < $scope.minFeeRecommended) $scope.showMinWarning = true; else $scope.showMinWarning = false; - if (Number(feePerSatByte) > $scope.maxFeeRecommended) $scope.showMaxWarning = true; + if (fee < $scope.maxFeeAllowed && fee > $scope.maxFeeRecommended) $scope.showMaxWarning = true; else $scope.showMaxWarning = false; }; diff --git a/www/views/modals/chooseFeeLevel.html b/www/views/modals/chooseFeeLevel.html index 40822a491..851cb3096 100644 --- a/www/views/modals/chooseFeeLevel.html +++ b/www/views/modals/chooseFeeLevel.html @@ -39,8 +39,8 @@ - Zero value for fee are not allowed. + Transactions without fee are not supported.
@@ -61,7 +61,7 @@ Your fee is lower than recommended. - You should not set a fee higher than 1000 satoshis/byte. + You should not set a fee higher than {{maxFeeRecommended}} satoshis/byte.