From d864b355133addddeaa37ff9e4e683d7b9ee0dce Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Wed, 29 Aug 2018 15:38:23 +0900 Subject: [PATCH 01/18] First enhancement in the send flow architecture --- src/js/controllers/tabsController.js | 3 +- src/js/services/send-flow-router.service.js | 52 +++++++ ...wService.js => send-flow-state.service.js} | 34 ++--- src/js/services/send-flow.service.js | 129 ++++++++++++++++++ 4 files changed, 197 insertions(+), 21 deletions(-) create mode 100644 src/js/services/send-flow-router.service.js rename src/js/services/{sendFlowService.js => send-flow-state.service.js} (80%) create mode 100644 src/js/services/send-flow.service.js diff --git a/src/js/controllers/tabsController.js b/src/js/controllers/tabsController.js index b3de6c70f..fff98936b 100644 --- a/src/js/controllers/tabsController.js +++ b/src/js/controllers/tabsController.js @@ -16,8 +16,7 @@ angular.module('copayApp.controllers').controller('tabsController', function($ro }; $scope.startFreshSend = function() { - sendFlowService.clear(); - $state.go('tabs.send'); + sendFlowService.start(); }; $scope.importInit = function() { diff --git a/src/js/services/send-flow-router.service.js b/src/js/services/send-flow-router.service.js new file mode 100644 index 000000000..ac4a63668 --- /dev/null +++ b/src/js/services/send-flow-router.service.js @@ -0,0 +1,52 @@ +'use strict'; + +(function(){ + +angular + .module('copayApp.services') + .factory('sendFlowRouterService', sendFlowRouterService); + + function sendFlowRouterService($state, $ionicHistory) { + + var router = { + // A separate state variable so we can ensure it is cleared of everything, + // even other properties added that this service does not know about. (such as "coin") + + // Functions + start: start, + goNext: goNext, + goBack: goBack, + }; + + return router; + + /** + * + */ + function start() { + $ionicHistory.clearHistory(); + $state.go('tabs.send'); + } + + /** + * + */ + function goNext(state) { + + /** + * Strategy + * Clean the history & and go to the send tab. + */ + // need to complete here + } + + function goBack() { + + /** + * Strategy + */ + $ionicHistory.goBack(); + } + }; + +})(); \ No newline at end of file diff --git a/src/js/services/sendFlowService.js b/src/js/services/send-flow-state.service.js similarity index 80% rename from src/js/services/sendFlowService.js rename to src/js/services/send-flow-state.service.js index 62989b3c5..bdca7ee91 100644 --- a/src/js/services/sendFlowService.js +++ b/src/js/services/send-flow-state.service.js @@ -4,9 +4,9 @@ angular .module('copayApp.services') - .factory('sendFlowService', sendFlowService); + .factory('sendFlowStateService', sendFlowStateService); - function sendFlowService($log) { + function sendFlowStateService() { var service = { // A separate state variable so we can ensure it is cleared of everything, @@ -23,16 +23,21 @@ angular previousStates: [], // Functions + init: init, clear: clear, - getStateClone: getStateClone, + getClone: getClone, map: map, - popState: popState, - pushState: pushState, - startSend: startSend + pop: pop, + push: push, }; return service; + function init(params) { + clear(); + map(params); + } + function clear() { console.log("sendFlow clear()"); clearCurrent(); @@ -55,7 +60,7 @@ angular /** * Handy for debugging */ - function getStateClone() { + function getClone() { var currentState = {}; Object.keys(service.state).forEach(function forCurrentParam(key) { if (typeof service.state[key] !== 'function' && key !== 'previousStates') { @@ -65,22 +70,13 @@ angular return currentState; } - /** - * Clears all previous state - */ - function startSend(params) { - console.log('startSend()'); - clear(); - map(params); - } - function map(params) { Object.keys(params).forEach(function forNewParam(key) { service.state[key] = params[key]; }); }; - function popState() { + function pop() { console.log('sendFlow pop'); if (service.previousStates.length) { var params = service.previousStates.pop(); @@ -91,9 +87,9 @@ angular } }; - function pushState(params) { + function push(params) { console.log('sendFlow push'); - var currentParams = getStateClone(); + var currentParams = getClone(); service.previousStates.push(currentParams); clearCurrent(); map(params); diff --git a/src/js/services/send-flow.service.js b/src/js/services/send-flow.service.js new file mode 100644 index 000000000..9f6cbc70b --- /dev/null +++ b/src/js/services/send-flow.service.js @@ -0,0 +1,129 @@ +'use strict'; + +(function(){ + +angular + .module('copayApp.services') + .factory('sendFlowService', sendFlowService); + + function sendFlowService( + sendFlowStateService, sendFlowRouterService + , bitcoinUriService, payproService + , popupService + ) { + + var service = { + // A separate state variable so we can ensure it is cleared of everything, + // even other properties added that this service does not know about. (such as "coin") + + // Functions + start: start, + goNext: goNext, + goBack: goBack, + getStateClone: getStateClone + }; + + return service; + + /** + * Clears all previous state + */ + async function start(params) { + console.log('start()'); + + if (params) { + if (params.data) { + var res = bitcoinUriService.parse(params.data); + + if (res.isValid) { + + // If BIP70 + if (res.url) { + var url = res.url; + var coin = res.coin || ''; + await new Promise(function (resolve) { + payproService.getPayProDetails(url, coin, function onGetPayProDetails(err, payProData) { + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), err); + } else { + // Fill in the params + var toAddr = payProData.toAddress; + var amount = payProData.amount; + var paymentUrl = payProData.url; + var expires = payProData.expires; + var time = payProData.time; + var name = payProData.domain; + + // Detect some merchant that we know + if (payProData.memo.indexOf('eGifter') > -1) { + name = 'eGifter' + } else if (paymentUrl.indexOf('https://bitpay.com') > -1) { + name = 'BitPay'; + } + + // Init thirdParty + var thirdPartyData = { + id: 'bip70', + amount: amount, + caTrusted: true, + name: name, + domain: payProData.domain, + expires: expires, + memo: payProData.memo, + network: 'livenet', + requiredFeeRate: payProData.requiredFeeRate, + selfSigned: 0, + time: time, + toAddress: toAddr, + url: paymentUrl, + verified: true + }; + + // Fill in params + params.amount = thirdPartyData.amount, + params.toAddress = thirdPartyData.toAddress, + params.coin = coin, + params.thirdParty = thirdPartyData + } + + // Resolve + resolve(); + }); + }); + } + } + } + + // Init the state if params is defined + sendFlowStateService.init(params); + console.log(params); + } + + /** + * Routing strategy to -> send-flow-router.service + */ + sendFlowRouterService.start(); + } + + function goNext(state) { + // Push the new state + sendFlowStateService.push(state); + + // Go next + sendFlowRouterService.goNext(state); + } + + function goBack() { + // Pop the current state + sendFlowStateService.pop(); + + // Go back + sendFlowRouterService.goBack(); + } + + function getStateClone () { + return sendFlowStateService.getClone(); + } + }; + +})(); \ No newline at end of file From 162fd685e5b7401946a28533ba68b5f0e503aecc Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Wed, 29 Aug 2018 17:28:07 +0900 Subject: [PATCH 02/18] second step enhancement --- src/js/controllers/amount.js | 12 ++--- src/js/controllers/review.controller.js | 4 +- src/js/controllers/tab-send.js | 31 ++++++----- .../controllers/walletSelectorController.js | 46 +++++----------- src/js/services/send-flow-router.service.js | 34 +++++++++--- src/js/services/send-flow-state.service.js | 2 +- src/js/services/send-flow.service.js | 54 ++++++++++++------- 7 files changed, 100 insertions(+), 83 deletions(-) diff --git a/src/js/controllers/amount.js b/src/js/controllers/amount.js index f796f9559..e861b36ff 100644 --- a/src/js/controllers/amount.js +++ b/src/js/controllers/amount.js @@ -68,13 +68,14 @@ function amountController(configService, $filter, gettextCatalog, $ionicHistory, function onBeforeEnter(event, data) { if (data.direction == "back") { - sendFlowService.popState(); + sendFlowService.state.pop(); } - console.log('amount onBeforeEnter after back sendflow ', sendFlowService.state); initCurrencies(); - passthroughParams = sendFlowService.getStateClone(); + passthroughParams = sendFlowService.state.getClone(); + + console.log('amount onBeforeEnter after back sendflow ', passthroughParams); vm.fromWalletId = passthroughParams.fromWalletId; vm.toWalletId = passthroughParams.toWalletId; @@ -214,7 +215,7 @@ function amountController(configService, $filter, gettextCatalog, $ionicHistory, } function goBack() { - $ionicHistory.goBack(); + sendFlowService.router.goBack(); } function paste(value) { @@ -467,11 +468,10 @@ function amountController(configService, $filter, gettextCatalog, $ionicHistory, confirmData.thirdParty = vm.thirdParty; } - sendFlowService.pushState(confirmData); if (!confirmData.fromWalletId) { $state.transitionTo('tabs.paymentRequest.confirm', confirmData); } else { - $state.transitionTo('tabs.send.review', confirmData); + sendFlowService.goNext(confirmData); $scope.useSendMax = null; } } diff --git a/src/js/controllers/review.controller.js b/src/js/controllers/review.controller.js index b377bef58..f9c43148f 100644 --- a/src/js/controllers/review.controller.js +++ b/src/js/controllers/review.controller.js @@ -80,7 +80,7 @@ function reviewController(addressbookService, bitcoinCashJsService, bitcore, bit function onBeforeEnter(event, data) { console.log('walletSelector onBeforeEnter sendflow ', sendFlowService.state); defaults = configService.getDefaults(); - sendFlowData = sendFlowService.getStateClone(); + sendFlowData = sendFlowService.state.getClone(); originWalletId = sendFlowData.fromWalletId; satoshis = parseInt(sendFlowData.amount, 10); toAddress = sendFlowData.toAddress; @@ -403,7 +403,7 @@ function reviewController(addressbookService, bitcoinCashJsService, bitcore, bit } function goBack() { - $ionicHistory.goBack(); + sendFlowService.router.goBack(); } function handleDestinationAsAddress(address, originCoin) { diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index 9ac6c35cb..bded3e03c 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -29,7 +29,7 @@ angular.module('copayApp.controllers').controller('tabSendController', function( $scope.$on("$ionicView.enter", function(event, data) { - var stateParams = sendFlowService.getStateClone(); + var stateParams = sendFlowService.state.getClone(); $scope.fromWallet = profileService.getWallet(stateParams.fromWalletId); clipboardService.readFromClipboard(function(text) { @@ -60,10 +60,13 @@ angular.module('copayApp.controllers').controller('tabSendController', function( }); $scope.findContact = function(search) { - - if (incomingData.redir(search)) { - return; - } + sendFlowService.start({ + data: search + }); + return; + //if (incomingData.redir(search)) { + //return; + //} if (!search || search.length < 1) { $scope.list = originalList; @@ -184,26 +187,26 @@ angular.module('copayApp.controllers').controller('tabSendController', function( $log.debug('Got toAddress:' + toAddress + ' | ' + item.name); - var stateParams = sendFlowService.getStateClone(); + var stateParams = sendFlowService.state.getClone(); stateParams.toAddress = toAddress, stateParams.coin = item.coin; - sendFlowService.pushState(stateParams); + sendFlowService.goNext(stateParams); - if (!stateParams.fromWalletId) { // If we have no toAddress or fromWallet + /*if (!stateParams.fromWalletId) { // If we have no toAddress or fromWallet $state.transitionTo('tabs.send.origin'); } else { $state.transitionTo('tabs.send.amount'); - } + }*/ }); }; $scope.startWalletToWalletTransfer = function() { console.log('startWalletToWalletTransfer()'); - var params = sendFlowService.getStateClone(); - sendFlowService.pushState(params); - $state.transitionTo('tabs.send.wallet-to-wallet', { - fromWalletId: sendFlowService.fromWalletId + var params = sendFlowService.state.getClone(); + sendFlowService.goNext({ + isWalletTransfer: true, + fromWalletId: params.fromWalletId }); } @@ -238,7 +241,7 @@ angular.module('copayApp.controllers').controller('tabSendController', function( }); if (data.direction == "back") { - sendFlowService.clear(); + sendFlowService.state.clear(); } }); diff --git a/src/js/controllers/walletSelectorController.js b/src/js/controllers/walletSelectorController.js index 6a5b96cbf..06e6179da 100644 --- a/src/js/controllers/walletSelectorController.js +++ b/src/js/controllers/walletSelectorController.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('walletSelectorController', function($scope, $rootScope, $state, $log, $ionicHistory, sendFlowService, configService, gettextCatalog, profileService, txFormatService) { +angular.module('copayApp.controllers').controller('walletSelectorController', function($scope, $state, sendFlowService, configService, gettextCatalog, profileService, txFormatService) { var fromWalletId = ''; var priceDisplayAsFiat = false; @@ -12,31 +12,22 @@ angular.module('copayApp.controllers').controller('walletSelectorController', fu function onBeforeEnter(event, data) { if (data.direction == "back") { - sendFlowService.popState(); + sendFlowService.state.pop(); } - console.log('walletSelector onBeforeEnter after back sendflow', sendFlowService.state); - $scope.params = sendFlowService.getStateClone(); + $scope.params = sendFlowService.state.getClone(); + + console.log('walletSelector onBeforeEnter after back sendflow', $scope.params); var config = configService.getSync().wallet.settings; priceDisplayAsFiat = config.priceDisplay === 'fiat'; unitDecimals = config.unitDecimals; unitsFromSatoshis = 1 / config.unitToSatoshi; - switch($state.current.name) { - case 'tabs.send.wallet-to-wallet': - $scope.sendFlowTitle = gettextCatalog.getString('Transfer between wallets'); - break; - case 'tabs.send.destination': - if ($scope.params.fromWalletId && !$scope.params.thirdParty) { - $scope.sendFlowTitle = gettextCatalog.getString('Transfer between wallets'); - } - break; - default: - if (!$scope.params.thirdParty) { - $scope.sendFlowTitle = gettextCatalog.getString('Send'); - } - // nop + if ($scope.params.isWalletTransfer) { + $scope.sendFlowTitle = gettextCatalog.getString('Transfer between wallets'); + } else if (!$scope.params.thirdParty) { + $scope.sendFlowTitle = gettextCatalog.getString('Send'); } $scope.coin = false; // Wallets to show (for destination screen or contacts) @@ -105,16 +96,6 @@ angular.module('copayApp.controllers').controller('walletSelectorController', fu } } - function getNextStep(params) { - if (!params.toWalletId && !params.toAddress) { // If we have no toAddress or fromWallet - return 'tabs.send.destination'; - } else if (!params.amount) { // If we have no amount - return 'tabs.send.amount'; - } else { // If we do have them - return 'tabs.send.review'; - } - } - function handleThirdPartyIfShapeshift() { console.log($scope.thirdParty, $scope.coin); if ($scope.thirdParty.id === 'shapeshift' && $scope.type === 'destination') { // Shapeshift wants to know the @@ -192,20 +173,17 @@ angular.module('copayApp.controllers').controller('walletSelectorController', fu $scope.useWallet = function(wallet) { - var params = sendFlowService.getStateClone(); + var params = sendFlowService.state.getClone(); if ($scope.type === 'origin') { // we're on the origin screen, set wallet to send from params.fromWalletId = wallet.id; } else { // we're on the destination screen, set wallet to send to params.toWalletId = wallet.id; } - sendFlowService.pushState(params); - var nextStep = getNextStep(params); - console.log('walletSelector nextStep', nextStep); - $state.transitionTo(nextStep, $scope.params); + sendFlowService.goNext(params); }; $scope.goBack = function() { - $ionicHistory.goBack(); + sendFlowService.router.goBack(); } }); \ No newline at end of file diff --git a/src/js/services/send-flow-router.service.js b/src/js/services/send-flow-router.service.js index ac4a63668..2907ca424 100644 --- a/src/js/services/send-flow-router.service.js +++ b/src/js/services/send-flow-router.service.js @@ -6,9 +6,12 @@ angular .module('copayApp.services') .factory('sendFlowRouterService', sendFlowRouterService); - function sendFlowRouterService($state, $ionicHistory) { + function sendFlowRouterService( + sendFlowStateService + , $state, $ionicHistory + ) { - var router = { + var service = { // A separate state variable so we can ensure it is cleared of everything, // even other properties added that this service does not know about. (such as "coin") @@ -18,26 +21,41 @@ angular goBack: goBack, }; - return router; + return service; /** * */ function start() { - $ionicHistory.clearHistory(); - $state.go('tabs.send'); + if ($state.current.name != 'tabs.send') { + $state.go('tabs.home').then(function () { + $ionicHistory.clearHistory(); + $state.go('tabs.send'); + goNext(); + }); + } else { + goNext(); + } } /** * */ - function goNext(state) { + function goNext() { + var state = sendFlowStateService.state; /** * Strategy - * Clean the history & and go to the send tab. */ - // need to complete here + if (!state.fromWalletId && (state.isWalletTransfer || (state.toWalletId || state.toAddress))) { + $state.transitionTo('tabs.send.origin'); + } else if (state.fromWalletId && !state.toWalletId && !state.toAddress) { + $state.transitionTo('tabs.send.destination'); + } else if (state.fromWalletId && (state.toWalletId || state.toAddress) && !state.amount) { + $state.transitionTo('tabs.send.amount'); + } else if (state.fromWalletId && (state.toWalletId || state.toAddress) && state.amount) { + $state.transitionTo('tabs.send.review'); + } } function goBack() { diff --git a/src/js/services/send-flow-state.service.js b/src/js/services/send-flow-state.service.js index bdca7ee91..f9697dcf5 100644 --- a/src/js/services/send-flow-state.service.js +++ b/src/js/services/send-flow-state.service.js @@ -35,7 +35,7 @@ angular function init(params) { clear(); - map(params); + push(params); } function clear() { diff --git a/src/js/services/send-flow.service.js b/src/js/services/send-flow.service.js index 9f6cbc70b..f31cac615 100644 --- a/src/js/services/send-flow.service.js +++ b/src/js/services/send-flow.service.js @@ -10,17 +10,19 @@ angular sendFlowStateService, sendFlowRouterService , bitcoinUriService, payproService , popupService + , $state ) { var service = { // A separate state variable so we can ensure it is cleared of everything, // even other properties added that this service does not know about. (such as "coin") + state: sendFlowStateService, + router: sendFlowRouterService, // Functions start: start, goNext: goNext, - goBack: goBack, - getStateClone: getStateClone + goBack: goBack }; return service; @@ -37,7 +39,9 @@ angular if (res.isValid) { - // If BIP70 + /** + * If BIP70 + */ if (res.url) { var url = res.url; var coin = res.coin || ''; @@ -79,14 +83,18 @@ angular verified: true }; - // Fill in params + /** + * Fill in params + */ params.amount = thirdPartyData.amount, params.toAddress = thirdPartyData.toAddress, params.coin = coin, params.thirdParty = thirdPartyData } - // Resolve + /** + * Resolve + */ resolve(); }); }); @@ -94,9 +102,10 @@ angular } } - // Init the state if params is defined + /** + * Init the state if params is defined + */ sendFlowStateService.init(params); - console.log(params); } /** @@ -106,23 +115,32 @@ angular } function goNext(state) { - // Push the new state + /** + * Save the current route before leaving + */ + state.route = $state.current.name; + + /** + * Push the new state + */ sendFlowStateService.push(state); - // Go next - sendFlowRouterService.goNext(state); + /** + * Go next + */ + sendFlowRouterService.goNext(); } function goBack() { - // Pop the current state - sendFlowStateService.pop(); + /** + * Pop the current state + */ + sendFlowStateService.pop(); - // Go back - sendFlowRouterService.goBack(); - } - - function getStateClone () { - return sendFlowStateService.getClone(); + /** + * Go back + */ + sendFlowRouterService.goBack(); } }; From 2c0432e2924774c8956d0f35a660671712140bc5 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Thu, 30 Aug 2018 16:03:51 +0900 Subject: [PATCH 03/18] 3rd step enhancement send flow --- src/js/controllers/addressbookView.js | 34 ++++----- src/js/controllers/shapeshift.js | 13 +--- src/js/controllers/tab-home.js | 3 +- src/js/controllers/tabsController.js | 1 - src/js/controllers/walletDetails.js | 8 +- src/js/services/incomingData.js | 81 +++++++-------------- src/js/services/send-flow-router.service.js | 43 +++++++---- 7 files changed, 75 insertions(+), 108 deletions(-) diff --git a/src/js/controllers/addressbookView.js b/src/js/controllers/addressbookView.js index 89c1cd924..ecbf7299a 100644 --- a/src/js/controllers/addressbookView.js +++ b/src/js/controllers/addressbookView.js @@ -21,28 +21,22 @@ angular.module('copayApp.controllers').controller('addressbookViewController', f }); $scope.sendTo = function() { - $ionicHistory.removeBackView(); - sendFlowService.clear(); - $state.go('tabs.send'); - $timeout(function() { - var to = ''; - if ($scope.addressbookEntry.coin == 'bch') { - var a = 'bitcoincash:' + $scope.addressbookEntry.address; - to = bitcoinCashJsService.readAddress(a).legacy; - } else { - to = $scope.addressbookEntry.address; - } + var to = ''; + if ($scope.addressbookEntry.coin == 'bch') { + var a = 'bitcoincash:' + $scope.addressbookEntry.address; + to = bitcoinCashJsService.readAddress(a).legacy; + } else { + to = $scope.addressbookEntry.address; + } - var stateParams = { - toAddress: to, - toName: $scope.addressbookEntry.name, - toEmail: $scope.addressbookEntry.email, - coin: $scope.addressbookEntry.coin - }; + var stateParams = { + toAddress: to, + toName: $scope.addressbookEntry.name, + toEmail: $scope.addressbookEntry.email, + coin: $scope.addressbookEntry.coin + }; - sendFlowService.pushState(stateParams); - $state.transitionTo('tabs.send.origin'); - }, 100); + sendFlowService.start(stateParams); }; $scope.remove = function(addressbookEntry) { diff --git a/src/js/controllers/shapeshift.js b/src/js/controllers/shapeshift.js index 43e0790d1..d05c98f1f 100644 --- a/src/js/controllers/shapeshift.js +++ b/src/js/controllers/shapeshift.js @@ -62,18 +62,7 @@ angular.module('copayApp.controllers').controller('shapeshiftController', functi id: 'shapeshift' } }; - - // Starting new send flow, so ensure everything is reset - sendFlowService.clear(); - $state.go('tabs.home').then(function() { - $ionicHistory.clearHistory(); - $state.go('tabs.send').then(function() { - $timeout(function () { - sendFlowService.pushState(stateParams); - $state.transitionTo('tabs.send.origin'); - }, 60); - }); - }); + sendFlowService.start(stateParams); } function showMyAddress() { diff --git a/src/js/controllers/tab-home.js b/src/js/controllers/tab-home.js index 318fcece2..229848df8 100644 --- a/src/js/controllers/tab-home.js +++ b/src/js/controllers/tab-home.js @@ -122,8 +122,7 @@ angular.module('copayApp.controllers').controller('tabHomeController', }; $scope.startFreshSend = function() { - sendFlowService.clear(); - $state.go('tabs.send'); + sendFlowService.start(); } $scope.openExternalLink = function() { diff --git a/src/js/controllers/tabsController.js b/src/js/controllers/tabsController.js index fff98936b..20a626a45 100644 --- a/src/js/controllers/tabsController.js +++ b/src/js/controllers/tabsController.js @@ -27,7 +27,6 @@ angular.module('copayApp.controllers').controller('tabsController', function($ro }; $scope.chooseScanner = function() { - sendFlowService.clear(); var isWindowsPhoneApp = platformInfo.isCordova && platformInfo.isWP; if (!isWindowsPhoneApp) { diff --git a/src/js/controllers/walletDetails.js b/src/js/controllers/walletDetails.js index ec787a5f4..a5224b70e 100644 --- a/src/js/controllers/walletDetails.js +++ b/src/js/controllers/walletDetails.js @@ -378,8 +378,6 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun }); $scope.$on("$ionicView.beforeEnter", function(event, data) { - sendFlowService.clear(); - configService.whenAvailable(function (config) { $scope.selectedPriceDisplay = config.wallet.settings.priceDisplay; @@ -477,15 +475,15 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun } $scope.goToSend = function() { - sendFlowService.startSend({ + sendFlowService.start({ fromWalletId: $scope.wallet.id }); // Go home first so that the Home tab works properly - $state.go('tabs.home').then(function () { + /*$state.go('tabs.home').then(function () { $ionicHistory.clearHistory(); $state.go('tabs.send'); - }); + });*/ }; $scope.goToReceive = function() { diff --git a/src/js/services/incomingData.js b/src/js/services/incomingData.js index b2e125e48..84bc7995d 100644 --- a/src/js/services/incomingData.js +++ b/src/js/services/incomingData.js @@ -85,69 +85,44 @@ angular.module('copayApp.services').factory('incomingData', function(bitcoinUriS } function goSend(addr, amount, message, coin, serviceId, serviceData) { - $state.go('tabs.send', {}, { - 'reload': true, - 'notify': $state.current.name == 'tabs.send' ? false : true - }); - // Timeout is required to enable the "Back" button - $timeout(function() { - var params = sendFlowService.getStateClone(); + var params = sendFlowService.state.getClone(); - if (amount) { - params.amount = amount; - } + if (amount) { + params.amount = amount; + } - if (addr) { - params.toAddress = addr; - params.displayAddress = originalAddress ? originalAddress : addr; - } + if (addr) { + params.toAddress = addr; + params.displayAddress = originalAddress ? originalAddress : addr; + } - if (coin) { - params.coin = coin; - } + if (coin) { + params.coin = coin; + } - if (noPrefixInAddress) { - params.noPrefixInAddress = noPrefixInAddress; - } + if (noPrefixInAddress) { + params.noPrefixInAddress = noPrefixInAddress; + } - if (serviceId) { - params.thirdParty = []; - params.thirdParty.id = serviceId; - params.thirdParty.data = serviceData; - sendFlowService.pushState(params); - $state.transitionTo('tabs.send.amount'); - } else { - sendFlowService.pushState(params); - $state.transitionTo('tabs.send.origin'); - } - }, 100); + if (serviceId) { + params.thirdParty = []; + params.thirdParty.id = serviceId; + params.thirdParty.data = serviceData; + } + + sendFlowService.start(params); } // data extensions for Payment Protocol with non-backwards-compatible request if (allParsed.isValid && allParsed.coin && allParsed.url && !allParsed.testnet) { var coin = allParsed.coin; data = allParsed.url; - if (allParsed.coin == 'bch') { - payproService.getPayProDetailsViaHttp(data, function onGetPayProDetailsViaHttp(err, details) { - if (err) { - var message = err.toString(); - if (typeof err.data === 'string') { - // i.e. 'This invoice is no longer accepting payments' - message = gettextCatalog.getString(err.data); - } - popupService.showAlert(gettextCatalog.getString('Error'), message) - } else { - handlePayPro(details, allParsed.coin); - } - }); - } else { - payproService.getPayProDetails(data, allParsed.coin, function onGetPayProDetails(err, details) { - if (err) { - popupService.showAlert(gettextCatalog.getString('Error'), err); - } else { - handlePayPro(details, allParsed.coin); - } - }); - } + payproService.getPayProDetails(data, allParsed.coin, function onGetPayProDetails(err, details) { + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), err); + } else { + handlePayPro(details, allParsed.coin); + } + }); return true; } diff --git a/src/js/services/send-flow-router.service.js b/src/js/services/send-flow-router.service.js index 2907ca424..3a9792b34 100644 --- a/src/js/services/send-flow-router.service.js +++ b/src/js/services/send-flow-router.service.js @@ -8,7 +8,7 @@ angular function sendFlowRouterService( sendFlowStateService - , $state, $ionicHistory + , $state, $ionicHistory, $timeout ) { var service = { @@ -30,8 +30,11 @@ angular if ($state.current.name != 'tabs.send') { $state.go('tabs.home').then(function () { $ionicHistory.clearHistory(); - $state.go('tabs.send'); - goNext(); + $state.go('tabs.send').then(function () { + $timeout(function () { + goNext(); + }, 60); + }); }); } else { goNext(); @@ -39,22 +42,32 @@ angular } /** - * + * Strategy + * https://bitcoindotcom.atlassian.net/wiki/x/BQDWKQ */ function goNext() { var state = sendFlowStateService.state; - /** - * Strategy - */ - if (!state.fromWalletId && (state.isWalletTransfer || (state.toWalletId || state.toAddress))) { - $state.transitionTo('tabs.send.origin'); - } else if (state.fromWalletId && !state.toWalletId && !state.toAddress) { - $state.transitionTo('tabs.send.destination'); - } else if (state.fromWalletId && (state.toWalletId || state.toAddress) && !state.amount) { - $state.transitionTo('tabs.send.amount'); - } else if (state.fromWalletId && (state.toWalletId || state.toAddress) && state.amount) { - $state.transitionTo('tabs.send.review'); + var needsDestination = !state.toWalletId && !state.toAddress; + var needsOrigin = !state.fromWalletId; + var needsAmount = !state.amount && !state.sendMax; + + if (needsDestination) { + if (!state.isWalletTransfer && !state.thirdParty) { + $state.go('tabs.send'); + return; + } else if (!needsOrigin) { + $state.go('tabs.send.destination'); + return; + } + } + + if (needsOrigin) { + $state.go('tabs.send.origin'); + } else if (needsAmount) { + $state.go('tabs.send.amount'); + } else { + $state.go('tabs.send.review'); } } From 421c4ca26ab9f5a7e3f48d9414f1b54e0d889deb Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Thu, 30 Aug 2018 20:46:58 +1200 Subject: [PATCH 04/18] Bugfix for displaying error message. --- src/js/services/send-flow.service.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js/services/send-flow.service.js b/src/js/services/send-flow.service.js index f31cac615..35100913c 100644 --- a/src/js/services/send-flow.service.js +++ b/src/js/services/send-flow.service.js @@ -7,7 +7,8 @@ angular .factory('sendFlowService', sendFlowService); function sendFlowService( - sendFlowStateService, sendFlowRouterService + gettextCatalog + , sendFlowStateService, sendFlowRouterService , bitcoinUriService, payproService , popupService , $state From dd59169d5f742d04d8c52ba18489a56c41546519 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Fri, 31 Aug 2018 16:09:31 +0900 Subject: [PATCH 05/18] adapt for the request specific amount. Clean comments and code, and more. --- src/js/controllers/tab-receive.js | 6 +- src/js/services/incomingData.js | 31 +--- src/js/services/send-flow-router.service.js | 28 ++-- src/js/services/send-flow.service.js | 175 +++++++++++--------- 4 files changed, 123 insertions(+), 117 deletions(-) diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index 66d1799f8..320afe320 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -18,10 +18,10 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi $scope.displayBalanceAsFiat = true; $scope.requestSpecificAmount = function() { - sendFlowService.pushState({ - toWalletId: $scope.wallet.credentials.walletId + sendFlowService.start({ + toWalletId: $scope.wallet.credentials.walletId, + isRequestAmount: true }); - $state.go('tabs.paymentRequest.amount'); }; $scope.setAddress = function(newAddr, copyAddress) { diff --git a/src/js/services/incomingData.js b/src/js/services/incomingData.js index 84bc7995d..1a7213da0 100644 --- a/src/js/services/incomingData.js +++ b/src/js/services/incomingData.js @@ -112,6 +112,7 @@ angular.module('copayApp.services').factory('incomingData', function(bitcoinUriS sendFlowService.start(params); } + // data extensions for Payment Protocol with non-backwards-compatible request if (allParsed.isValid && allParsed.coin && allParsed.url && !allParsed.testnet) { var coin = allParsed.coin; @@ -373,20 +374,12 @@ angular.module('copayApp.services').factory('incomingData', function(bitcoinUriS }; function goToAmountPage(toAddress, coin) { - $state.go('tabs.send', {}, { - 'reload': true, - 'notify': $state.current.name == 'tabs.send' ? false : true - }); - $timeout(function() { - var stateParams = { - toAddress: toAddress, - displayAddress: toAddress, - coin: coin, - noPrefix: 1 - }; - sendFlowService.pushState(stateParams); - $state.transitionTo('tabs.send.origin'); - }, 100); + var stateParams = { + toAddress: toAddress, + displayAddress: toAddress, + coin: coin, + }; + sendFlowService.start(stateParams); } function handlePayPro(payProData, coin) { @@ -447,15 +440,7 @@ angular.module('copayApp.services').factory('incomingData', function(bitcoinUriS } scannerService.pausePreview(); - $state.go('tabs.send', {}, { - 'reload': true, - 'notify': $state.current.name == 'tabs.send' ? false : true - }).then(function() { - $timeout(function() { - sendFlowService.pushState(stateParams); // Need to do more here - $state.transitionTo('tabs.send.origin'); - }); - }); + sendFlowService.start(stateParams); } return root; diff --git a/src/js/services/send-flow-router.service.js b/src/js/services/send-flow-router.service.js index 3a9792b34..d31c585f7 100644 --- a/src/js/services/send-flow-router.service.js +++ b/src/js/services/send-flow-router.service.js @@ -26,18 +26,24 @@ angular /** * */ - function start() { - if ($state.current.name != 'tabs.send') { - $state.go('tabs.home').then(function () { - $ionicHistory.clearHistory(); - $state.go('tabs.send').then(function () { - $timeout(function () { - goNext(); - }, 60); - }); - }); + function start() { + var state = sendFlowStateService.state; + + if (state.isRequestAmount) { + $state.go('tabs.paymentRequest.amount'); } else { - goNext(); + if ($state.current.name != 'tabs.send') { + $state.go('tabs.home').then(function () { + $ionicHistory.clearHistory(); + $state.go('tabs.send').then(function () { + $timeout(function () { + goNext(); + }, 60); + }); + }); + } else { + goNext(); + } } } diff --git a/src/js/services/send-flow.service.js b/src/js/services/send-flow.service.js index f31cac615..a7ad581f1 100644 --- a/src/js/services/send-flow.service.js +++ b/src/js/services/send-flow.service.js @@ -8,7 +8,7 @@ angular function sendFlowService( sendFlowStateService, sendFlowRouterService - , bitcoinUriService, payproService + , bitcoinUriService, payproService, bitcoinCashJsService , popupService , $state ) { @@ -30,88 +30,111 @@ angular /** * Clears all previous state */ - async function start(params) { + function start(params) { console.log('start()'); - if (params) { - if (params.data) { - var res = bitcoinUriService.parse(params.data); - - if (res.isValid) { + if (params && params.data) { + var res = bitcoinUriService.parse(params.data); - /** - * If BIP70 - */ - if (res.url) { - var url = res.url; - var coin = res.coin || ''; - await new Promise(function (resolve) { - payproService.getPayProDetails(url, coin, function onGetPayProDetails(err, payProData) { - if (err) { - popupService.showAlert(gettextCatalog.getString('Error'), err); - } else { - // Fill in the params - var toAddr = payProData.toAddress; - var amount = payProData.amount; - var paymentUrl = payProData.url; - var expires = payProData.expires; - var time = payProData.time; - var name = payProData.domain; - - // Detect some merchant that we know - if (payProData.memo.indexOf('eGifter') > -1) { - name = 'eGifter' - } else if (paymentUrl.indexOf('https://bitpay.com') > -1) { - name = 'BitPay'; - } + if (res.isValid) { - // Init thirdParty - var thirdPartyData = { - id: 'bip70', - amount: amount, - caTrusted: true, - name: name, - domain: payProData.domain, - expires: expires, - memo: payProData.memo, - network: 'livenet', - requiredFeeRate: payProData.requiredFeeRate, - selfSigned: 0, - time: time, - toAddress: toAddr, - url: paymentUrl, - verified: true - }; + /** + * If BIP70 + */ + if (res.url) { + var url = res.url; + var coin = res.coin || ''; + payproService.getPayProDetails(url, coin, function onGetPayProDetails(err, payProData) { + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), err); + } else { + // Fill in the params + var toAddr = payProData.toAddress; + var amount = payProData.amount; + var paymentUrl = payProData.url; + var expires = payProData.expires; + var time = payProData.time; + var name = payProData.domain; + + // Detect some merchant that we know + if (payProData.memo.indexOf('eGifter') > -1) { + name = 'eGifter' + } else if (paymentUrl.indexOf('https://bitpay.com') > -1) { + name = 'BitPay'; + } - /** - * Fill in params - */ - params.amount = thirdPartyData.amount, - params.toAddress = thirdPartyData.toAddress, - params.coin = coin, - params.thirdParty = thirdPartyData - } - - /** - * Resolve - */ - resolve(); - }); - }); + // Init thirdParty + var thirdPartyData = { + id: 'bip70', + amount: amount, + caTrusted: true, + name: name, + domain: payProData.domain, + expires: expires, + memo: payProData.memo, + network: 'livenet', + requiredFeeRate: payProData.requiredFeeRate, + selfSigned: 0, + time: time, + toAddress: toAddr, + url: paymentUrl, + verified: true + }; + + /** + * Fill in params + */ + params.amount = thirdPartyData.amount, + params.toAddress = thirdPartyData.toAddress, + params.coin = coin, + params.thirdParty = thirdPartyData + } + + /** + * Resolve + */ + _next(); + }); + } else { + if (res.coin) { + params.coin = res.coin; } + + if (res.amount) { + params.amount = res.amount; + } + + if (res.publicAddress) { + var prefix = res.testnet ? 'bchtest:' : 'bitcoincash:'; + params.displayAddress = (prefix + res.publicAddress.cashAddr) || res.publicAddress.legacy || res.publicAddress.bitpay; + params.toAddress = bitcoinCashJsService.readAddress(params.displayAddress).legacy; + } + + _next(); } + } else { + _next(); } + } else { + _next(); + } + + + // Next used for sync the async task + function _next() { /** * Init the state if params is defined */ - sendFlowStateService.init(params); + if (params) { + sendFlowStateService.init(params); + } + + /** + * Routing strategy to -> send-flow-router.service + */ + sendFlowRouterService.start(); } - - /** - * Routing strategy to -> send-flow-router.service - */ - sendFlowRouterService.start(); } function goNext(state) { @@ -121,25 +144,17 @@ angular state.route = $state.current.name; /** - * Push the new state + * Save the state and redirect the user */ sendFlowStateService.push(state); - - /** - * Go next - */ sendFlowRouterService.goNext(); } function goBack() { /** - * Pop the current state + * Remove the state on top and redirect the user */ sendFlowStateService.pop(); - - /** - * Go back - */ sendFlowRouterService.goBack(); } }; From ddd867092c6da22002f785675fb3555711803eb0 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Fri, 31 Aug 2018 18:37:04 +0900 Subject: [PATCH 06/18] Refactor incomingData --- src/js/controllers/addressbookView.js | 10 +---- src/js/directives/incomingDataMenu.js | 36 ++++++++--------- src/js/services/incomingData.js | 46 ++++++++++++++++++++-- src/js/services/send-flow-state.service.js | 10 ++++- src/js/services/send-flow.service.js | 19 +++++---- www/views/includes/incomingDataMenu.html | 24 +++++------ 6 files changed, 90 insertions(+), 55 deletions(-) diff --git a/src/js/controllers/addressbookView.js b/src/js/controllers/addressbookView.js index ecbf7299a..16df9e559 100644 --- a/src/js/controllers/addressbookView.js +++ b/src/js/controllers/addressbookView.js @@ -21,16 +21,8 @@ angular.module('copayApp.controllers').controller('addressbookViewController', f }); $scope.sendTo = function() { - var to = ''; - if ($scope.addressbookEntry.coin == 'bch') { - var a = 'bitcoincash:' + $scope.addressbookEntry.address; - to = bitcoinCashJsService.readAddress(a).legacy; - } else { - to = $scope.addressbookEntry.address; - } - var stateParams = { - toAddress: to, + data: $scope.addressbookEntry.address, toName: $scope.addressbookEntry.name, toEmail: $scope.addressbookEntry.email, coin: $scope.addressbookEntry.coin diff --git a/src/js/directives/incomingDataMenu.js b/src/js/directives/incomingDataMenu.js index 21478102b..78856e62f 100644 --- a/src/js/directives/incomingDataMenu.js +++ b/src/js/directives/incomingDataMenu.js @@ -1,23 +1,28 @@ 'use strict'; angular.module('copayApp.directives') - .directive('incomingDataMenu', function($timeout, $rootScope, $state, externalLinkService) { + .directive('incomingDataMenu', function($timeout, $rootScope, $state, externalLinkService, sendFlowService, bitcoinCashJsService) { return { restrict: 'E', templateUrl: 'views/includes/incomingDataMenu.html', link: function(scope, element, attrs) { $rootScope.$on('incomingDataMenu.showMenu', function(event, data) { $timeout(function() { - scope.data = data.data; - scope.type = data.type; - scope.showMenu = true; - scope.https = false; + scope.data = data; - if (scope.type === 'url') { - if (scope.data.indexOf('https://') === 0) { - scope.https = true; - } + if (scope.data.parsed.privateKey) { + scope.type = "privateKey"; + } else if (scope.data.parsed.url) { + scope.type = "url"; + } else if (scope.data.parsed.publicAddress) { + scope.type = "bitcoinAddress"; + var prefix = scope.data.parsed.isTestnet ? 'bchtest:' : 'bitcoincash:'; + scope.data.toAddress = (prefix + scope.data.parsed.publicAddress.cashAddr) || scope.data.parsed.publicAddress.legacy || scope.data.parsed.publicAddress.bitpay; + } else { + scope.type = "text"; } + + scope.showMenu = true; }); }); scope.hide = function() { @@ -28,18 +33,9 @@ angular.module('copayApp.directives') externalLinkService.open(url); }; scope.sendPaymentToAddress = function(bitcoinAddress) { - var noPrefixInAddress = 0; - if (bitcoinAddress.toLowerCase().indexOf('bitcoin') < 0) { - noPrefixInAddress = 1; - } scope.showMenu = false; - $state.go('tabs.send').then(function() { - $timeout(function() { - $state.transitionTo('tabs.send.amount', { - toAddress: bitcoinAddress, - noPrefix: noPrefixInAddress - }); - }, 50); + sendFlowService.start({ + data: bitcoinAddress }); }; scope.addToAddressBook = function(bitcoinAddress) { diff --git a/src/js/services/incomingData.js b/src/js/services/incomingData.js index 9d2189ab9..016e39421 100644 --- a/src/js/services/incomingData.js +++ b/src/js/services/incomingData.js @@ -8,9 +8,7 @@ angular.module('copayApp.services').factory('incomingData', function(externalLin $rootScope.$broadcast('incomingDataMenu.showMenu', data); }; - root.redir = function(data, serviceId, serviceData) { - var originalAddress = null; - var noPrefixInAddress = 0; + root.redir = function(data) { var allParsed = bitcoinUriService.parse(data); if (allParsed.isValid && allParsed.isTestnet) { @@ -19,7 +17,49 @@ angular.module('copayApp.services').factory('incomingData', function(externalLin gettextCatalog.getString('Testnet is not supported.') ); return false; + } else { + /** + * Hardcore fix, but the legacy code in the bottom needs to be removed. + * BitcoinUriService is making the job of this. + * incomingData should be an intermediate to redirect either to the sendFlow + * or to import a wallet for example. + */ + scannerService.pausePreview(); + + /** + * Strategy for the action + */ + if ( + !allParsed.isValid + || allParsed.privateKey + || (sendFlowService.state.isEmpty() && !allParsed.url && !allParsed.amount) + ) { + root.showMenu({ + original: data, + parsed: allParsed + }); + } else { + var state = sendFlowService.state.getClone(); + state.data = data; + + sendFlowService.start(state, function onError(err) { + /** + * OnError, open the menu (link not validated) + */ + root.showMenu({ + original: data, + parsed: allParsed + }); + }); + } } + + // No need to go more far + return; + + /** + * The legacy code in the bottom needs to be checked and removed if any case is forgotten. + */ if (data.toLowerCase().indexOf('bitcoin') < 0) { noPrefixInAddress = 1; diff --git a/src/js/services/send-flow-state.service.js b/src/js/services/send-flow-state.service.js index f9697dcf5..0d2912b59 100644 --- a/src/js/services/send-flow-state.service.js +++ b/src/js/services/send-flow-state.service.js @@ -29,13 +29,17 @@ angular map: map, pop: pop, push: push, + isEmpty: isEmpty }; return service; function init(params) { clear(); - push(params); + + if (params) { + push(params); + } } function clear() { @@ -94,6 +98,10 @@ angular clearCurrent(); map(params); }; + + function isEmpty() { + return service.previousStates.length == 0; + }; }; })(); \ No newline at end of file diff --git a/src/js/services/send-flow.service.js b/src/js/services/send-flow.service.js index ee7eb37a9..cac710b0c 100644 --- a/src/js/services/send-flow.service.js +++ b/src/js/services/send-flow.service.js @@ -30,7 +30,7 @@ angular /** * Clears all previous state */ - function start(params) { + function start(params, onError) { console.log('start()'); if (params && params.data) { @@ -101,11 +101,14 @@ angular } if (res.amount) { + if (res.currency) { + params.currency = res.currency; + } params.amount = res.amount; } if (res.publicAddress) { - var prefix = res.testnet ? 'bchtest:' : 'bitcoincash:'; + var prefix = res.isTestnet ? 'bchtest:' : 'bitcoincash:'; params.displayAddress = (prefix + res.publicAddress.cashAddr) || res.publicAddress.legacy || res.publicAddress.bitpay; params.toAddress = bitcoinCashJsService.readAddress(params.displayAddress).legacy; } @@ -113,7 +116,9 @@ angular _next(); } } else { - _next(); + if (onError) { + onError(); + } } } else { _next(); @@ -122,13 +127,7 @@ angular // Next used for sync the async task function _next() { - - /** - * Init the state if params is defined - */ - if (params) { - sendFlowStateService.init(params); - } + sendFlowStateService.init(params); /** * Routing strategy to -> send-flow-router.service diff --git a/www/views/includes/incomingDataMenu.html b/www/views/includes/incomingDataMenu.html index 1d66b616a..e60d7e956 100644 --- a/www/views/includes/incomingDataMenu.html +++ b/www/views/includes/incomingDataMenu.html @@ -9,21 +9,21 @@
- {{data}} + {{data.original}}
- +
Add as a contact
- +
Send payment to this address
- +
Copy to clipboard
@@ -38,11 +38,11 @@
Text
- {{data}} + {{data.original}}
-
+
Copy to clipboard
@@ -57,16 +57,16 @@
Private Key
- {{data}} + {{data.original}}
-
+
Sweep paper wallet
- +
Copy to clipboard
@@ -81,16 +81,16 @@
URL
- {{data}} + {{data.original}}
-
+
Open in web browser
- +
Copy to clipboard
From 1708eeef8243f1d670b395755be9828bc99ee52c Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Fri, 31 Aug 2018 18:48:16 +0900 Subject: [PATCH 07/18] Fix address format --- src/js/services/send-flow.service.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/services/send-flow.service.js b/src/js/services/send-flow.service.js index cac710b0c..f02feaaa1 100644 --- a/src/js/services/send-flow.service.js +++ b/src/js/services/send-flow.service.js @@ -109,8 +109,8 @@ angular if (res.publicAddress) { var prefix = res.isTestnet ? 'bchtest:' : 'bitcoincash:'; - params.displayAddress = (prefix + res.publicAddress.cashAddr) || res.publicAddress.legacy || res.publicAddress.bitpay; - params.toAddress = bitcoinCashJsService.readAddress(params.displayAddress).legacy; + params.displayAddress = res.publicAddress.cashAddr || res.publicAddress.legacy || res.publicAddress.bitpay; + params.toAddress = bitcoinCashJsService.readAddress((prefix + res.publicAddress.cashAddr) || res.publicAddress.legacy || res.publicAddress.bitpay).legacy; } _next(); From 6e52aaca2d8119f3c469e762b154e762834c4d86 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Mon, 3 Sep 2018 08:28:22 +0900 Subject: [PATCH 08/18] 1st cleaning for incomingData --- src/js/controllers/shapeshift.js | 16 -- src/js/services/incomingData.js | 415 +------------------------------ 2 files changed, 11 insertions(+), 420 deletions(-) diff --git a/src/js/controllers/shapeshift.js b/src/js/controllers/shapeshift.js index d05c98f1f..0dac21a11 100644 --- a/src/js/controllers/shapeshift.js +++ b/src/js/controllers/shapeshift.js @@ -6,22 +6,6 @@ angular.module('copayApp.controllers').controller('shapeshiftController', functi $scope.showMyAddress = showMyAddress; - function generateAddress(wallet, cb) { - if (!wallet) return; - walletService.getAddress(wallet, false, function(err, addr) { - if (err) { - popupService.showAlert(err); - } - return cb(addr); - }); - } - - function showToWallets() { - $scope.toWallets = $scope.fromWallet.coin === 'btc' ? walletsBch : walletsBtc; - $scope.onToWalletSelect($scope.toWallets[0]); - $scope.singleToWallet = $scope.toWallets.length === 1; - } - $scope.$on("$ionicView.beforeEnter", function(event, data) { walletsBtc = profileService.getWallets({coin: 'btc'}); walletsBch = profileService.getWallets({coin: 'bch'}); diff --git a/src/js/services/incomingData.js b/src/js/services/incomingData.js index 016e39421..3a0dda0a9 100644 --- a/src/js/services/incomingData.js +++ b/src/js/services/incomingData.js @@ -9,9 +9,9 @@ angular.module('copayApp.services').factory('incomingData', function(externalLin }; root.redir = function(data) { - var allParsed = bitcoinUriService.parse(data); + var parsed = bitcoinUriService.parse(data); - if (allParsed.isValid && allParsed.isTestnet) { + if (parsed.isValid && parsed.isTestnet) { popupService.showAlert( gettextCatalog.getString('Unsupported'), gettextCatalog.getString('Testnet is not supported.') @@ -30,13 +30,13 @@ angular.module('copayApp.services').factory('incomingData', function(externalLin * Strategy for the action */ if ( - !allParsed.isValid - || allParsed.privateKey - || (sendFlowService.state.isEmpty() && !allParsed.url && !allParsed.amount) + !parsed.isValid + || parsed.privateKey + || (sendFlowService.state.isEmpty() && !parsed.url && !parsed.amount) ) { root.showMenu({ original: data, - parsed: allParsed + parsed: parsed }); } else { var state = sendFlowService.state.getClone(); @@ -48,329 +48,16 @@ angular.module('copayApp.services').factory('incomingData', function(externalLin */ root.showMenu({ original: data, - parsed: allParsed + parsed: parsed }); }); } } - - // No need to go more far - return; + } /** * The legacy code in the bottom needs to be checked and removed if any case is forgotten. - */ - - if (data.toLowerCase().indexOf('bitcoin') < 0) { - noPrefixInAddress = 1; - } - - if (typeof(data) == 'string' && !(/^bitcoin(cash)?:\?r=[\w+]/).exec(data) && (data.toLowerCase().indexOf('bitcoincash:') >= 0 || data[0] == 'q' || data[0] == 'p' || data[0] == 'C' || data[0] == 'H')) { - try { - noPrefixInAddress = 0; - - if (data[0] == 'p' || data[0] == 'q') { - data = 'bitcoincash:' + data; - } - var paramString = ''; - if (data.indexOf('?') >= 0) { - paramString = data.substring(data.indexOf('?')); - data = data.substring(0, data.indexOf('?')); - } - - if (data.indexOf('BITCOINCASH:') >= 0) { - data = data.toLowerCase(); - } - originalAddress = data.replace('bitcoincash:', ''); - var legacyAddress = bitcoinCashJsService.readAddress(data).legacy; - data = 'bitcoincash:' + legacyAddress + paramString; - } catch (ex) {} - } - - $log.debug('Processing incoming data: ' + data); - - function sanitizeUri(data) { - // Fixes when a region uses comma to separate decimals - var regex = /[\?\&]amount=(\d+([\,\.]\d+)?)/i; - var match = regex.exec(data); - if (!match || match.length === 0) { - return data; - } - var value = match[0].replace(',', '.'); - var newUri = data.replace(regex, value); - - // mobile devices, uris like copay://glidera - newUri.replace('://', ':'); - - return newUri; - } - - function getParameterByName(name, url) { - if (!url) return; - name = name.replace(/[\[\]]/g, "\\$&"); - var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"), - results = regex.exec(url); - if (!results) return null; - if (!results[2]) return ''; - return decodeURIComponent(results[2].replace(/\+/g, " ")); - } - - function checkPrivateKey(privateKey) { - try { - new bitcore.PrivateKey(privateKey, 'livenet'); - } catch (err) { - return false; - } - return true; - } - - function goSend(addr, amount, message, coin, serviceId, serviceData) { - var params = sendFlowService.state.getClone(); - - if (amount) { - params.amount = amount; - } - - if (addr) { - params.toAddress = addr; - params.displayAddress = originalAddress ? originalAddress : addr; - } - - if (coin) { - params.coin = coin; - } - - if (noPrefixInAddress) { - params.noPrefixInAddress = noPrefixInAddress; - } - - if (serviceId) { - params.thirdParty = []; - params.thirdParty.id = serviceId; - params.thirdParty.data = serviceData; - } - - sendFlowService.start(params); - } - - // data extensions for Payment Protocol with non-backwards-compatible request - if (allParsed.isValid && allParsed.coin && allParsed.url && !allParsed.isTestnet) { - var coin = allParsed.coin; - data = allParsed.url; - payproService.getPayProDetails(data, allParsed.coin, function onGetPayProDetails(err, details) { - if (err) { - popupService.showAlert(gettextCatalog.getString('Error'), err); - } else { - handlePayPro(details, allParsed.coin); - } - }); - return true; - } - - data = sanitizeUri(data); - - var addr = ''; - // Bitcoin URL - if (bitcore.URI.isValid(data)) { - var coin = 'btc'; - var parsed = new bitcore.URI(data); - - var addr = parsed.address ? parsed.address.toString() : ''; - var message = parsed.message; - - var amount = parsed.amount ? parsed.amount : ''; - - if (parsed.r) { - payproService.getPayProDetails(parsed.r, coin, function(err, details) { - if (err) { - if (addr && amount) goSend(addr, amount, message, coin, serviceId, serviceData); - else popupService.showAlert(gettextCatalog.getString('Error'), err); - } else handlePayPro(details, coin); - }); - } else { - goSend(addr, amount, message, coin, serviceId, serviceData); - } - return true; - // Cash URI - } else if (allParsed.isValid && allParsed.coin === 'bch' && allParsed.publicAddress && !allParsed.isTestnet) { - var prefix = allParsed.isTestnet ? 'bchtest:' : 'bitcoincash:'; - var addrIn = allParsed.publicAddress.legacy || allParsed.publicAddress.bitpay || prefix + allParsed.publicAddress.cashAddr; - originalAddress = allParsed.publicAddress.cashAddr || allParsed.publicAddress.legacy || allParsed.publicAddress.bitpay; - - var addresses = bitcoinCashJsService.readAddress(addrIn); - if (!addresses) { - return false; - } - addr = addresses.legacy; - var message = allParsed.message; - - var amount = allParsed.amount ? allParsed.amount : ''; - - // paypro not yet supported on cash - if (allParsed.url) { - payproService.getPayProDetails(allParsed.url, allParsed.coin, function(err, details) { - if (err) { - if (addr && amount) - goSend(addr, amount, message, allParsed.coin, serviceId, serviceData); - else - popupService.showAlert(gettextCatalog.getString('Error'), err); - } - handlePayPro(details, allParsed.coin); - }); - } else { - goSend(addr, amount, message, allParsed.coin, serviceId, serviceData); - } - return true; - - // Cash URI with bitcoin (btc) address version number? - } else if (bitcore.URI.isValid(data.replace(/^bitcoincash:/,'bitcoin:'))) { - $log.debug('Handling bitcoincash URI with legacy address'); - var coin = 'bch'; - var parsed = new bitcore.URI(data.replace(/^bitcoincash:/,'bitcoin:')); - - var oldAddr = parsed.address ? parsed.address.toString() : ''; - if (!oldAddr) return false; - - var addr = ''; - - var a = bitcore.Address(oldAddr).toObject(); - addr = bitcoreCash.Address.fromObject(a).toString(); - - // Translate address - $log.debug('address transalated to:' + addr); - popupService.showConfirm( - gettextCatalog.getString('Bitcoin cash Payment'), - gettextCatalog.getString('Payment address was translated to new Bitcoin Cash address format: ' + addr), - gettextCatalog.getString('OK'), - gettextCatalog.getString('Cancel'), - function(ret) { - if (!ret) return false; - - var message = parsed.message; - var amount = parsed.amount ? parsed.amount : ''; - - // paypro not yet supported on cash - if (parsed.r) { - payproService.getPayProDetails(parsed.r, coin, function(err, details) { - if (err) { - if (addr && amount) - goSend(addr, amount, message, coin, serviceId, serviceData); - else - popupService.showAlert(gettextCatalog.getString('Error'), err); - } - handlePayPro(details, coin); - }); - } else { - goSend(addr, amount, message, coin, serviceId, serviceData); - } - } - ); - return true; - // Plain URL - } else if (allParsed.bareUrl) { - - if ($state.includes('tabs.scan')) { - root.showMenu({ - data: allParsed.bareUrl, - type: 'url' - }); - } else { - externalLinkService.open( - allParsed.bareUrl, - true, - gettextCatalog.getString('Open in web browser'), - allParsed.bareUrl - ); - } - return true; - - // Plain Address - } else if (bitcore.Address.isValid(data, 'livenet') || bitcore.Address.isValid(data, 'testnet')) { - if ($state.includes('tabs.scan')) { - root.showMenu({ - data: data, - type: 'bitcoinAddress' - }); - } else { - goToAmountPage(data); - } - } else if (bitcoreCash.Address.isValid(data, 'livenet')) { - if ($state.includes('tabs.scan')) { - root.showMenu({ - data: data, - type: 'bitcoinAddress', - coin: 'bch', - }); - } else { - goToAmountPage(data, 'bch'); - } - } else if (data && data.indexOf(appConfigService.name + '://glidera') === 0) { - var code = getParameterByName('code', data); - $ionicHistory.nextViewOptions({ - disableAnimate: true - }); - $state.go('tabs.home', {}, { - 'reload': true, - 'notify': $state.current.name == 'tabs.home' ? false : true - }).then(function() { - $ionicHistory.nextViewOptions({ - disableAnimate: true - }); - $state.transitionTo('tabs.buyandsell.glidera', { - code: code - }); - }); - return true; - - } else if (data && data.indexOf(appConfigService.name + '://coinbase') === 0) { - var code = getParameterByName('code', data); - $ionicHistory.nextViewOptions({ - disableAnimate: true - }); - $state.go('tabs.home', {}, { - 'reload': true, - 'notify': $state.current.name == 'tabs.home' ? false : true - }).then(function() { - $ionicHistory.nextViewOptions({ - disableAnimate: true - }); - $state.transitionTo('tabs.buyandsell.coinbase', { - code: code - }); - }); - return true; - - // BitPayCard Authentication - } else if (data && data.indexOf(appConfigService.name + '://') === 0) { - - // Disable BitPay Card - if (!appConfigService._enabledExtensions.debitcard) return false; - - var secret = getParameterByName('secret', data); - var email = getParameterByName('email', data); - var otp = getParameterByName('otp', data); - var reason = getParameterByName('r', data); - - $state.go('tabs.home', {}, { - 'reload': true, - 'notify': $state.current.name == 'tabs.home' ? false : true - }).then(function() { - switch (reason) { - default: - case '0': - /* For BitPay card binding */ - $state.transitionTo('tabs.bitpayCardIntro', { - secret: secret, - email: email, - otp: otp - }); - break; - } - }); - return true; - - // Join - } else if (data && data.match(/^copay:[0-9A-HJ-NP-Za-km-z]{70,80}$/)) { + * else if (data && data.match(/^copay:[0-9A-HJ-NP-Za-km-z]{70,80}$/)) { $state.go('tabs.home', {}, { 'reload': true, 'notify': $state.current.name == 'tabs.home' ? false : true @@ -403,88 +90,8 @@ angular.module('copayApp.services').factory('incomingData', function(externalLin code: data }); }); - return true; - - } else { - if ($state.includes('tabs.scan')) { - root.showMenu({ - data: data, - type: 'text' - }); - } - } - return false; - }; - - function goToAmountPage(toAddress, coin) { - var stateParams = { - toAddress: toAddress, - displayAddress: toAddress, - coin: coin, - }; - sendFlowService.start(stateParams); - } - - function handlePayPro(payProData, coin) { - - console.log('payProData', payProData); - - var toAddr = payProData.toAddress; - var amount = payProData.amount; - var paymentUrl = payProData.url; - var expires = payProData.expires; - var time = payProData.time; - - if (coin === 'bch') { - var displayAddr = payProData.outputs[0].address; - toAddr = bitcoinCashJsService.readAddress('bitcoincash:' + displayAddr).legacy; - amount = payProData.outputs[0].amount; - paymentUrl = payProData.paymentUrl; - expires = Math.floor(new Date(expires).getTime() / 1000) - time = Math.ceil(new Date(time).getTime() / 1000) - } - - var name = payProData.domain; - - if (payProData.memo.indexOf('eGifter') > -1) { - name = 'eGifter' - } else if (paymentUrl.indexOf('https://bitpay.com') > -1) { - name = 'BitPay'; - } - - var thirdPartyData = { - id: 'bip70', - amount: amount, - caTrusted: true, - name: name, - domain: payProData.domain, - expires: expires, - memo: payProData.memo, - network: 'livenet', - requiredFeeRate: payProData.requiredFeeRate, - selfSigned: 0, - time: time, - displayAddress: displayAddr, - toAddress: toAddr, - url: paymentUrl, - verified: true - }; - - var stateParams = { - amount: thirdPartyData.amount, - toAddress: thirdPartyData.toAddress, - coin: coin, - thirdParty: thirdPartyData - }; - - // fee - if (thirdPartyData.requiredFeeRate) { - stateParams.requiredFeeRate = thirdPartyData.requiredFeeRate * 1024; - } - - scannerService.pausePreview(); - sendFlowService.start(stateParams); - } + * + */ return root; }); From b4d42215d36ea7e91f10cfc7ae7ec538477410de Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Mon, 3 Sep 2018 09:08:12 +0900 Subject: [PATCH 09/18] add copay invitation in incomingData --- src/js/services/incomingData.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/js/services/incomingData.js b/src/js/services/incomingData.js index 3a0dda0a9..2afb4e7bb 100644 --- a/src/js/services/incomingData.js +++ b/src/js/services/incomingData.js @@ -29,7 +29,13 @@ angular.module('copayApp.services').factory('incomingData', function(externalLin /** * Strategy for the action */ - if ( + if (parsed.copayInvitation) { + $state.go('tabs.home').then(function() { + $state.transitionTo('tabs.add.join', { + url: data + }); + }); + } else if ( !parsed.isValid || parsed.privateKey || (sendFlowService.state.isEmpty() && !parsed.url && !parsed.amount) From 6f28f6ba2b7343d6f03cc964a35e9d4fc79df6d7 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Mon, 3 Sep 2018 13:31:58 +0900 Subject: [PATCH 10/18] redir cb --- src/js/controllers/tab-scan.js | 24 ++-- src/js/controllers/tabsController.js | 18 ++- src/js/directives/shapeshiftCoinTrader.js | 1 + src/js/services/incomingData.js | 136 +++++++++------------- src/js/services/openURL.js | 9 +- src/js/services/send-flow.service.js | 7 +- 6 files changed, 84 insertions(+), 111 deletions(-) diff --git a/src/js/controllers/tab-scan.js b/src/js/controllers/tab-scan.js index e838a8ea8..8783b7721 100644 --- a/src/js/controllers/tab-scan.js +++ b/src/js/controllers/tab-scan.js @@ -111,27 +111,17 @@ angular.module('copayApp.controllers').controller('tabScanController', function( // Sometimes (testing in Chrome, when reading QR Code) data is an object // that has a string data.result. contents = contents.result || contents; - - var parsed = bitcoinUriService.parse(contents); - var title = ''; - var msg = ''; - if (parsed.isValid) { - if (parsed.isTestnet) { - title = gettextCatalog.getString('Unsupported'); - msg = gettextCatalog.getString('Testnet is not supported.'); - popupService.showAlert(title, msg, function onAlertShown() { + incomingData.redir(contents, function onError(err) { + if (err) { + var title = gettextCatalog.getString('Scan Failed'); + popupService.showAlert(title, err.message, function onAlertShown() { scannerService.resumePreview(); }); } else { - incomingData.redir(contents); - } - } else { - title = gettextCatalog.getString('Scan Failed'); - msg = gettextCatalog.getString('Data not recognised.'); - popupService.showAlert(title, msg, function onAlertShown() { scannerService.resumePreview(); - }); - } + + } + }); } $rootScope.$on('incomingDataMenu.menuHidden', function() { diff --git a/src/js/controllers/tabsController.js b/src/js/controllers/tabsController.js index 20a626a45..4d01acbf3 100644 --- a/src/js/controllers/tabsController.js +++ b/src/js/controllers/tabsController.js @@ -3,9 +3,11 @@ angular.module('copayApp.controllers').controller('tabsController', function($rootScope, $log, $scope, $state, $stateParams, $timeout, platformInfo, incomingData, lodash, popupService, gettextCatalog, scannerService, sendFlowService) { $scope.onScan = function(data) { - if (!incomingData.redir(data)) { - popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Invalid data')); - } + incomingData.redir(data, function onError(err) { + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), err.message); + } + }); }; $scope.setScanFn = function(scanFn) { @@ -36,10 +38,14 @@ angular.module('copayApp.controllers').controller('tabsController', function($ro scannerService.useOldScanner(function(err, contents) { if (err) { - popupService.showAlert(gettextCatalog.getString('Error'), err); - return; + popupService.showAlert(gettextCatalog.getString('Error'), err.message); + } else { + incomingData.redir(contents, function onError(err) { + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), err.message); + } + }); } - incomingData.redir(contents); }); }; diff --git a/src/js/directives/shapeshiftCoinTrader.js b/src/js/directives/shapeshiftCoinTrader.js index 60cc66bdf..c7fe6c4fd 100644 --- a/src/js/directives/shapeshiftCoinTrader.js +++ b/src/js/directives/shapeshiftCoinTrader.js @@ -111,6 +111,7 @@ angular.module('copayApp.directives').directive('shapeshiftCoinTrader', function orderId: $scope.depositInfo.orderId }; + // How to handle this if (incomingData.redir(sendAddress, 'shapeshift', shapeshiftData)) { ongoingProcess.set('connectingShapeshift', false); return; diff --git a/src/js/services/incomingData.js b/src/js/services/incomingData.js index 2afb4e7bb..c2c44c063 100644 --- a/src/js/services/incomingData.js +++ b/src/js/services/incomingData.js @@ -1,5 +1,9 @@ 'use strict'; +/** + * incomingData is an intermediate to redirect either to the sendFlow + * or to import/join a wallet. + */ angular.module('copayApp.services').factory('incomingData', function(externalLinkService, bitcoinUriService, $log, $state, $timeout, $ionicHistory, bitcore, bitcoreCash, $rootScope, payproService, scannerService, sendFlowService, appConfigService, popupService, gettextCatalog, bitcoinCashJsService) { var root = {}; @@ -8,96 +12,68 @@ angular.module('copayApp.services').factory('incomingData', function(externalLin $rootScope.$broadcast('incomingDataMenu.showMenu', data); }; - root.redir = function(data) { + root.redir = function(data, cbError) { var parsed = bitcoinUriService.parse(data); - if (parsed.isValid && parsed.isTestnet) { - popupService.showAlert( - gettextCatalog.getString('Unsupported'), - gettextCatalog.getString('Testnet is not supported.') - ); - return false; - } else { - /** - * Hardcore fix, but the legacy code in the bottom needs to be removed. - * BitcoinUriService is making the job of this. - * incomingData should be an intermediate to redirect either to the sendFlow - * or to import a wallet for example. - */ - scannerService.pausePreview(); + console.log(parsed); + $log.debug(parsed); - /** - * Strategy for the action - */ - if (parsed.copayInvitation) { - $state.go('tabs.home').then(function() { - $state.transitionTo('tabs.add.join', { - url: data - }); - }); - } else if ( - !parsed.isValid - || parsed.privateKey - || (sendFlowService.state.isEmpty() && !parsed.url && !parsed.amount) - ) { - root.showMenu({ - original: data, - parsed: parsed - }); + + if (parsed.isValid) { + if (parsed.isTestnet) { + if (cbError) { + var errorMessage = gettextCatalog.getString('Testnet is not supported.'); + cbError(new Error(errorMessage)); + } } else { - var state = sendFlowService.state.getClone(); - state.data = data; - - sendFlowService.start(state, function onError(err) { - /** - * OnError, open the menu (link not validated) - */ + scannerService.pausePreview(); + + /** + * Strategy for the action + */ + if (parsed.copayInvitation) { + $state.go('tabs.home').then(function() { + $state.transitionTo('tabs.add.join', { + url: data + }); + }); + } else if (parsed.import) { + $state.go('tabs.home').then(function() { + $state.transitionTo('tabs.add.import', { + code: data + }); + }); + } else if ( + !parsed.isValid + || parsed.privateKey + || (sendFlowService.state.isEmpty() && !parsed.url && !parsed.amount) + ) { root.showMenu({ original: data, parsed: parsed }); - }); + } else { + var state = sendFlowService.state.getClone(); + state.data = data; + + sendFlowService.start(state, function onError(err) { + /** + * OnError, open the menu (link not validated) + */ + root.showMenu({ + original: data, + parsed: parsed + }); + }); + } + } + } else { + if (cbError) { + var errorMessage = gettextCatalog.getString('Data not recognised.'); + cbError(new Error(errorMessage)); } } - } - - /** - * The legacy code in the bottom needs to be checked and removed if any case is forgotten. - * else if (data && data.match(/^copay:[0-9A-HJ-NP-Za-km-z]{70,80}$/)) { - $state.go('tabs.home', {}, { - 'reload': true, - 'notify': $state.current.name == 'tabs.home' ? false : true - }).then(function() { - $state.transitionTo('tabs.add.join', { - url: data - }); - }); - return true; - - // Old join - } else if (data && data.match(/^[0-9A-HJ-NP-Za-km-z]{70,80}$/)) { - $state.go('tabs.home', {}, { - 'reload': true, - 'notify': $state.current.name == 'tabs.home' ? false : true - }).then(function() { - $state.transitionTo('tabs.add.join', { - url: data - }); - }); - return true; - } else if (data && (data.substring(0, 2) == '6P' || checkPrivateKey(data))) { - root.showMenu({ - data: data, - type: 'privateKey' - }); - } else if (data && ((data.substring(0, 2) == '1|') || (data.substring(0, 2) == '2|') || (data.substring(0, 2) == '3|'))) { - $state.go('tabs.home').then(function() { - $state.transitionTo('tabs.add.import', { - code: data - }); - }); - * - */ + }; return root; }); diff --git a/src/js/services/openURL.js b/src/js/services/openURL.js index 0f4d6c666..6f972d291 100644 --- a/src/js/services/openURL.js +++ b/src/js/services/openURL.js @@ -23,9 +23,12 @@ angular.module('copayApp.services').factory('openURLService', function($rootScop document.addEventListener('handleopenurl', handleOpenURL, false); - if (!incomingData.redir(url)) { - $log.warn('Unknown URL! : ' + url); - } + incomingData.redir(url, function onError(err) { + if (err) { + $log.warn('Unknown URL! : ' + url); + popupService.showAlert(gettextCatalog.getString('Error'), err.message); + } + }); }; var handleResume = function() { diff --git a/src/js/services/send-flow.service.js b/src/js/services/send-flow.service.js index f02feaaa1..2be375aa8 100644 --- a/src/js/services/send-flow.service.js +++ b/src/js/services/send-flow.service.js @@ -100,11 +100,8 @@ angular params.coin = res.coin; } - if (res.amount) { - if (res.currency) { - params.currency = res.currency; - } - params.amount = res.amount; + if (res.amountInSatoshis) { + params.amount = res.amountInSatoshis; } if (res.publicAddress) { From 1c2c3813171625e361155a3faad69e670f9439b5 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Mon, 3 Sep 2018 16:56:30 +1200 Subject: [PATCH 11/18] Can now scan good data after scanning bad data. --- src/js/controllers/tab-scan.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js/controllers/tab-scan.js b/src/js/controllers/tab-scan.js index 8783b7721..7fc59dd6f 100644 --- a/src/js/controllers/tab-scan.js +++ b/src/js/controllers/tab-scan.js @@ -115,7 +115,8 @@ angular.module('copayApp.controllers').controller('tabScanController', function( if (err) { var title = gettextCatalog.getString('Scan Failed'); popupService.showAlert(title, err.message, function onAlertShown() { - scannerService.resumePreview(); + // Enable another scan since we won't receive incomingDataMenu.menuHidden + activate(); }); } else { scannerService.resumePreview(); From c715fdcb41a12d3285d6fbbc6f19aa9d12f2c26f Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 4 Sep 2018 11:24:07 +0900 Subject: [PATCH 12/18] Rename incomingData to incomingDataService --- src/js/controllers/tab-scan.js | 4 +- src/js/controllers/tab-send.js | 41 +++++-------- src/js/controllers/tabsController.js | 6 +- src/js/directives/shapeshiftCoinTrader.js | 4 +- ...comingData.js => incoming-data.service.js} | 4 +- src/js/services/openURL.js | 4 +- src/js/services/send-flow-router.service.js | 16 ++---- src/js/services/send-flow-state.service.js | 45 ++++++++++++--- src/js/services/send-flow.service.js | 57 +++++++++---------- src/js/services/shapeshiftService.js | 4 +- 10 files changed, 98 insertions(+), 87 deletions(-) rename src/js/services/{incomingData.js => incoming-data.service.js} (83%) diff --git a/src/js/controllers/tab-scan.js b/src/js/controllers/tab-scan.js index 7fc59dd6f..14368ee1c 100644 --- a/src/js/controllers/tab-scan.js +++ b/src/js/controllers/tab-scan.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('tabScanController', function(bitcoinUriService, gettextCatalog, popupService, $scope, $log, $timeout, scannerService, incomingData, $state, $ionicHistory, $rootScope, $ionicNavBarDelegate) { +angular.module('copayApp.controllers').controller('tabScanController', function(gettextCatalog, popupService, $scope, $log, $timeout, scannerService, incomingDataService, $state, $ionicHistory, $rootScope, $ionicNavBarDelegate) { var scannerStates = { unauthorized: 'unauthorized', @@ -111,7 +111,7 @@ angular.module('copayApp.controllers').controller('tabScanController', function( // Sometimes (testing in Chrome, when reading QR Code) data is an object // that has a string data.result. contents = contents.result || contents; - incomingData.redir(contents, function onError(err) { + incomingDataService.redir(contents, function onError(err) { if (err) { var title = gettextCatalog.getString('Scan Failed'); popupService.showAlert(title, err.message, function onAlertShown() { diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index dfacd465a..03a9562e8 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('tabSendController', function(bitcoinUriService, $scope, $rootScope, $log, $timeout, $ionicScrollDelegate, $ionicLoading, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService, platformInfo, sendFlowService, bwcError, gettextCatalog, scannerService, configService, bitcoinCashJsService, $ionicPopup, $ionicNavBarDelegate, clipboardService) { +angular.module('copayApp.controllers').controller('tabSendController', function(bitcoinUriService, $scope, $log, $timeout, $ionicScrollDelegate, addressbookService, profileService, lodash, $state, walletService, platformInfo, sendFlowService, gettextCatalog, configService, $ionicPopup, $ionicNavBarDelegate, clipboardService, incomingDataService) { var clipboardHasAddress = false; var clipboardHasContent = false; var originalList; @@ -62,14 +62,6 @@ angular.module('copayApp.controllers').controller('tabSendController', function( }); $scope.findContact = function(search) { - sendFlowService.start({ - data: search - }); - return; - //if (incomingData.redir(search)) { - //return; - //} - if (!search || search.length < 1) { $scope.list = originalList; $timeout(function() { @@ -78,12 +70,16 @@ angular.module('copayApp.controllers').controller('tabSendController', function( return; } - var result = lodash.filter(originalList, function(item) { - var val = item.name; - return lodash.startsWith(val.toLowerCase(), search.toLowerCase()); + var params = sendFlowService.state.getClone(); + params.data = search; + sendFlowService.start(params, function onError() { + var result = lodash.filter(originalList, function(item) { + var val = item.name; + return lodash.startsWith(val.toLowerCase(), search.toLowerCase()); + }); + + $scope.list = result; }); - - $scope.list = result; }; var hasWallets = function() { @@ -190,26 +186,17 @@ angular.module('copayApp.controllers').controller('tabSendController', function( $log.debug('Got toAddress:' + toAddress + ' | ' + item.name); var stateParams = sendFlowService.state.getClone(); - stateParams.toAddress = toAddress, + stateParams.toAddress = toAddress; stateParams.coin = item.coin; - sendFlowService.goNext(stateParams); - - /*if (!stateParams.fromWalletId) { // If we have no toAddress or fromWallet - $state.transitionTo('tabs.send.origin'); - } else { - $state.transitionTo('tabs.send.amount'); - }*/ - + sendFlowService.start(stateParams); }); }; $scope.startWalletToWalletTransfer = function() { console.log('startWalletToWalletTransfer()'); var params = sendFlowService.state.getClone(); - sendFlowService.goNext({ - isWalletTransfer: true, - fromWalletId: params.fromWalletId - }); + params.isWalletTransfer = true; + sendFlowService.start(params); } // This could probably be enhanced refactoring the routes abstract states diff --git a/src/js/controllers/tabsController.js b/src/js/controllers/tabsController.js index 4d01acbf3..b78274ecb 100644 --- a/src/js/controllers/tabsController.js +++ b/src/js/controllers/tabsController.js @@ -1,9 +1,9 @@ 'use strict'; -angular.module('copayApp.controllers').controller('tabsController', function($rootScope, $log, $scope, $state, $stateParams, $timeout, platformInfo, incomingData, lodash, popupService, gettextCatalog, scannerService, sendFlowService) { +angular.module('copayApp.controllers').controller('tabsController', function($rootScope, $log, $scope, $state, $stateParams, $timeout, platformInfo, incomingDataService, lodash, popupService, gettextCatalog, scannerService, sendFlowService) { $scope.onScan = function(data) { - incomingData.redir(data, function onError(err) { + incomingDataService.redir(data, function onError(err) { if (err) { popupService.showAlert(gettextCatalog.getString('Error'), err.message); } @@ -40,7 +40,7 @@ angular.module('copayApp.controllers').controller('tabsController', function($ro if (err) { popupService.showAlert(gettextCatalog.getString('Error'), err.message); } else { - incomingData.redir(contents, function onError(err) { + incomingDataService.redir(contents, function onError(err) { if (err) { popupService.showAlert(gettextCatalog.getString('Error'), err.message); } diff --git a/src/js/directives/shapeshiftCoinTrader.js b/src/js/directives/shapeshiftCoinTrader.js index c7fe6c4fd..793f380fb 100644 --- a/src/js/directives/shapeshiftCoinTrader.js +++ b/src/js/directives/shapeshiftCoinTrader.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.directives').directive('shapeshiftCoinTrader', function($interval, shapeshiftApiService, profileService, incomingData, ongoingProcess) { +angular.module('copayApp.directives').directive('shapeshiftCoinTrader', function($interval, shapeshiftApiService, profileService, incomingDataService, ongoingProcess) { return { restrict: 'E', transclude: true, @@ -112,7 +112,7 @@ angular.module('copayApp.directives').directive('shapeshiftCoinTrader', function }; // How to handle this - if (incomingData.redir(sendAddress, 'shapeshift', shapeshiftData)) { + if (incomingDataService.redir(sendAddress, 'shapeshift', shapeshiftData)) { ongoingProcess.set('connectingShapeshift', false); return; } diff --git a/src/js/services/incomingData.js b/src/js/services/incoming-data.service.js similarity index 83% rename from src/js/services/incomingData.js rename to src/js/services/incoming-data.service.js index c2c44c063..eece6d17c 100644 --- a/src/js/services/incomingData.js +++ b/src/js/services/incoming-data.service.js @@ -1,10 +1,10 @@ 'use strict'; /** - * incomingData is an intermediate to redirect either to the sendFlow + * incomingDataService is an intermediate to redirect either to the sendFlow * or to import/join a wallet. */ -angular.module('copayApp.services').factory('incomingData', function(externalLinkService, bitcoinUriService, $log, $state, $timeout, $ionicHistory, bitcore, bitcoreCash, $rootScope, payproService, scannerService, sendFlowService, appConfigService, popupService, gettextCatalog, bitcoinCashJsService) { +angular.module('copayApp.services').factory('incomingDataService', function(bitcoinUriService, $log, $state, $rootScope, scannerService, sendFlowService, gettextCatalog) { var root = {}; diff --git a/src/js/services/openURL.js b/src/js/services/openURL.js index 6f972d291..2cf8d95a5 100644 --- a/src/js/services/openURL.js +++ b/src/js/services/openURL.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.services').factory('openURLService', function($rootScope, $ionicHistory, $document, $log, $state, platformInfo, lodash, profileService, incomingData, appConfigService) { +angular.module('copayApp.services').factory('openURLService', function($rootScope, $ionicHistory, $document, $log, $state, platformInfo, lodash, profileService, incomingDataService, appConfigService) { var root = {}; var handleOpenURL = function(args) { @@ -23,7 +23,7 @@ angular.module('copayApp.services').factory('openURLService', function($rootScop document.addEventListener('handleopenurl', handleOpenURL, false); - incomingData.redir(url, function onError(err) { + incomingDataService.redir(url, function onError(err) { if (err) { $log.warn('Unknown URL! : ' + url); popupService.showAlert(gettextCatalog.getString('Error'), err.message); diff --git a/src/js/services/send-flow-router.service.js b/src/js/services/send-flow-router.service.js index d31c585f7..883a08971 100644 --- a/src/js/services/send-flow-router.service.js +++ b/src/js/services/send-flow-router.service.js @@ -12,9 +12,6 @@ angular ) { var service = { - // A separate state variable so we can ensure it is cleared of everything, - // even other properties added that this service does not know about. (such as "coin") - // Functions start: start, goNext: goNext, @@ -24,7 +21,7 @@ angular return service; /** - * + * Start new send flow */ function start() { var state = sendFlowStateService.state; @@ -48,8 +45,8 @@ angular } /** - * Strategy - * https://bitcoindotcom.atlassian.net/wiki/x/BQDWKQ + * Go to the next page + * Routing strategy : https://bitcoindotcom.atlassian.net/wiki/x/BQDWKQ */ function goNext() { var state = sendFlowStateService.state; @@ -77,11 +74,10 @@ angular } } + /** + * Go to the previous page + */ function goBack() { - - /** - * Strategy - */ $ionicHistory.goBack(); } }; diff --git a/src/js/services/send-flow-state.service.js b/src/js/services/send-flow-state.service.js index 0d2912b59..0007ccf4c 100644 --- a/src/js/services/send-flow-state.service.js +++ b/src/js/services/send-flow-state.service.js @@ -6,11 +6,10 @@ angular .module('copayApp.services') .factory('sendFlowStateService', sendFlowStateService); - function sendFlowStateService() { + function sendFlowStateService($log) { var service = { - // A separate state variable so we can ensure it is cleared of everything, - // even other properties added that this service does not know about. (such as "coin") + // Variables state: { amount: '', displayAddress: null, @@ -34,7 +33,13 @@ angular return service; + /** + * Init state & stack + * @param {Object} params + */ function init(params) { + $log.debug("send-flow-state init()"); + clear(); if (params) { @@ -42,14 +47,22 @@ angular } } + /** + * Clear a state & stack + */ function clear() { - console.log("sendFlow clear()"); + $log.debug("send-flow-state clear()"); + clearCurrent(); service.previousStates = []; } + /** + * Clear current state only + */ function clearCurrent() { - console.log("sendFlow clearCurrent()"); + $log.debug("send-flow-state clearCurrent()"); + service.state = { amount: '', displayAddress: null, @@ -62,7 +75,7 @@ angular } /** - * Handy for debugging + * Get a clone of the current state */ function getClone() { var currentState = {}; @@ -74,14 +87,22 @@ angular return currentState; } + /** + * Fill in the current state from the params + * @param {Object} params + */ function map(params) { Object.keys(params).forEach(function forNewParam(key) { service.state[key] = params[key]; }); }; + /** + * Pop state + */ function pop() { - console.log('sendFlow pop'); + $log.debug('send-flow-state pop'); + if (service.previousStates.length) { var params = service.previousStates.pop(); clearCurrent(); @@ -91,14 +112,22 @@ angular } }; + /** + * Push state + * @param {Object} params + */ function push(params) { - console.log('sendFlow push'); + $log.debug('send-flow-state push'); + var currentParams = getClone(); service.previousStates.push(currentParams); clearCurrent(); map(params); }; + /** + * Is empty stack + */ function isEmpty() { return service.previousStates.length == 0; }; diff --git a/src/js/services/send-flow.service.js b/src/js/services/send-flow.service.js index 2be375aa8..41929319d 100644 --- a/src/js/services/send-flow.service.js +++ b/src/js/services/send-flow.service.js @@ -10,12 +10,11 @@ angular sendFlowStateService, sendFlowRouterService , bitcoinUriService, payproService, bitcoinCashJsService , popupService, gettextCatalog - , $state + , $state, $log ) { var service = { - // A separate state variable so we can ensure it is cleared of everything, - // even other properties added that this service does not know about. (such as "coin") + // Variables state: sendFlowStateService, router: sendFlowRouterService, @@ -28,19 +27,19 @@ angular return service; /** - * Clears all previous state + * Start a new send flow + * @param {Object} params + * @param {Function} onError */ function start(params, onError) { - console.log('start()'); + $log.debug('send-flow start()'); if (params && params.data) { var res = bitcoinUriService.parse(params.data); if (res.isValid) { - /** - * If BIP70 - */ + // If BIP70 (url) if (res.url) { var url = res.url; var coin = res.coin || ''; @@ -81,18 +80,14 @@ angular verified: true }; - /** - * Fill in params - */ + // Fill in params params.amount = thirdPartyData.amount, params.toAddress = thirdPartyData.toAddress, params.coin = coin, params.thirdParty = thirdPartyData } - /** - * Resolve - */ + // Resolve _next(); }); } else { @@ -107,7 +102,8 @@ angular if (res.publicAddress) { var prefix = res.isTestnet ? 'bchtest:' : 'bitcoincash:'; params.displayAddress = res.publicAddress.cashAddr || res.publicAddress.legacy || res.publicAddress.bitpay; - params.toAddress = bitcoinCashJsService.readAddress((prefix + res.publicAddress.cashAddr) || res.publicAddress.legacy || res.publicAddress.bitpay).legacy; + var formatAddress = res.publicAddress.cashAddr ? prefix + params.displayAddress : params.displayAddress; + params.toAddress = bitcoinCashJsService.readAddress(formatAddress).legacy; } _next(); @@ -126,32 +122,35 @@ angular function _next() { sendFlowStateService.init(params); - /** - * Routing strategy to -> send-flow-router.service - */ + // Routing strategy to -> send-flow-router.service sendFlowRouterService.start(); } } + /** + * Go to the next step + * @param {Object} state + */ function goNext(state) { - /** - * Save the current route before leaving - */ + $log.debug('send-flow goNext()'); + + // Save the current route before leaving state.route = $state.current.name; - /** - * Save the state and redirect the user - */ + // Save the state and redirect the user sendFlowStateService.push(state); sendFlowRouterService.goNext(); } + /** + * Go to the previous step + */ function goBack() { - /** - * Remove the state on top and redirect the user - */ - sendFlowStateService.pop(); - sendFlowRouterService.goBack(); + $log.debug('send-flow goBack()'); + + // Remove the state on top and redirect the user + sendFlowStateService.pop(); + sendFlowRouterService.goBack(); } }; diff --git a/src/js/services/shapeshiftService.js b/src/js/services/shapeshiftService.js index 1ce9672ce..b1d2f6e7d 100644 --- a/src/js/services/shapeshiftService.js +++ b/src/js/services/shapeshiftService.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.services').factory('shapeshiftService', function ($http, $interval, $log, lodash, moment, ongoingProcess, shapeshiftApiService, storageService, configService, incomingData, platformInfo, servicesService) { +angular.module('copayApp.services').factory('shapeshiftService', function ($http, $interval, $log, lodash, moment, ongoingProcess, shapeshiftApiService, storageService, configService, incomingDataService, platformInfo, servicesService) { var root = {}; root.ShiftState = 'Shift'; root.coinIn = ''; @@ -111,7 +111,7 @@ angular.module('copayApp.services').factory('shapeshiftService', function ($http toAddress: txData.deposit }; // - // if (incomingData.redir(sendAddress, 'shapeshift', shapeshiftData)) { + // if (incomingDataService.redir(sendAddress, 'shapeshift', shapeshiftData)) { ongoingProcess.set('connectingShapeshift', false); // return; // } From 8322453edfc366e0e56b4674f69cb056f410ab87 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 4 Sep 2018 11:24:25 +0900 Subject: [PATCH 13/18] clean send flow state when transaction sent --- src/js/controllers/review.controller.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/js/controllers/review.controller.js b/src/js/controllers/review.controller.js index f9c43148f..dbf14937f 100644 --- a/src/js/controllers/review.controller.js +++ b/src/js/controllers/review.controller.js @@ -766,8 +766,12 @@ function reviewController(addressbookService, bitcoinCashJsService, bitcore, bit ((processName === 'signingTx') && vm.originWallet.m > 1) || (processName == 'sendingTx' && !vm.originWallet.canSign() && !vm.originWallet.isPrivKeyExternal()) ) && !isOn) { + // Show the popup vm.sendStatus = 'success'; + // Clear the send flow service state + sendFlowService.state.clear(); + if ($state.current.name === "tabs.send.review") { // XX SP: Otherwise all open wallets on other devices play this sound if you have been in a send flow before on that device. soundService.play('misc/payment_sent.mp3'); } From 23659b0cd4e3b672d8433d7c099951aa0d505586 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 4 Sep 2018 11:35:01 +0900 Subject: [PATCH 14/18] Rename files reviewed --- src/js/controllers/{tab-home.js => tab-home.controller.js} | 0 src/js/controllers/{tab-scan.js => tab-scan.controller.js} | 0 src/js/controllers/{tab-send.js => tab-send.controller.js} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename src/js/controllers/{tab-home.js => tab-home.controller.js} (100%) rename src/js/controllers/{tab-scan.js => tab-scan.controller.js} (100%) rename src/js/controllers/{tab-send.js => tab-send.controller.js} (100%) diff --git a/src/js/controllers/tab-home.js b/src/js/controllers/tab-home.controller.js similarity index 100% rename from src/js/controllers/tab-home.js rename to src/js/controllers/tab-home.controller.js diff --git a/src/js/controllers/tab-scan.js b/src/js/controllers/tab-scan.controller.js similarity index 100% rename from src/js/controllers/tab-scan.js rename to src/js/controllers/tab-scan.controller.js diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.controller.js similarity index 100% rename from src/js/controllers/tab-send.js rename to src/js/controllers/tab-send.controller.js From cf1dc66b592ec768eb9298cc0ba182369e945bda Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 4 Sep 2018 11:56:13 +0900 Subject: [PATCH 15/18] renaming files --- ...etails.js => wallet-details.controller.js} | 27 ------------------- ...oller.js => wallet-selector.controller.js} | 0 2 files changed, 27 deletions(-) rename src/js/controllers/{walletDetails.js => wallet-details.controller.js} (95%) rename src/js/controllers/{walletSelectorController.js => wallet-selector.controller.js} (100%) diff --git a/src/js/controllers/walletDetails.js b/src/js/controllers/wallet-details.controller.js similarity index 95% rename from src/js/controllers/walletDetails.js rename to src/js/controllers/wallet-details.controller.js index a5224b70e..9d306039f 100644 --- a/src/js/controllers/walletDetails.js +++ b/src/js/controllers/wallet-details.controller.js @@ -26,27 +26,6 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun }; var setPendingTxps = function(txps) { - - /* Uncomment to test multiple outputs */ - - // var txp = { - // message: 'test multi-output', - // fee: 1000, - // createdOn: new Date() / 1000, - // outputs: [], - // wallet: $scope.wallet - // }; - // - // function addOutput(n) { - // txp.outputs.push({ - // amount: 600, - // toAddress: '2N8bhEwbKtMvR2jqMRcTCQqzHP6zXGToXcK', - // message: 'output #' + (Number(n) + 1) - // }); - // }; - // lodash.times(15, addOutput); - // txps.push(txp); - if (!txps) { $scope.txps = []; return; @@ -479,12 +458,6 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun fromWalletId: $scope.wallet.id }); - // Go home first so that the Home tab works properly - /*$state.go('tabs.home').then(function () { - $ionicHistory.clearHistory(); - $state.go('tabs.send'); - });*/ - }; $scope.goToReceive = function() { $state.go('tabs.home', { diff --git a/src/js/controllers/walletSelectorController.js b/src/js/controllers/wallet-selector.controller.js similarity index 100% rename from src/js/controllers/walletSelectorController.js rename to src/js/controllers/wallet-selector.controller.js From 547b216edd3ce152805cf57baabe3a0830368abd Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 4 Sep 2018 13:32:36 +0900 Subject: [PATCH 16/18] migrate copayApp to bitcoincom. Clean up --- src/js/services/send-flow-router.service.js | 2 +- src/js/services/send-flow-state.service.js | 2 +- src/js/services/send-flow.service.js | 18 ++++++------------ 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/js/services/send-flow-router.service.js b/src/js/services/send-flow-router.service.js index 883a08971..32aa8420b 100644 --- a/src/js/services/send-flow-router.service.js +++ b/src/js/services/send-flow-router.service.js @@ -3,7 +3,7 @@ (function(){ angular - .module('copayApp.services') + .module('bitcoincom.services') .factory('sendFlowRouterService', sendFlowRouterService); function sendFlowRouterService( diff --git a/src/js/services/send-flow-state.service.js b/src/js/services/send-flow-state.service.js index 0007ccf4c..7425b65a4 100644 --- a/src/js/services/send-flow-state.service.js +++ b/src/js/services/send-flow-state.service.js @@ -3,7 +3,7 @@ (function(){ angular - .module('copayApp.services') + .module('bitcoincom.services') .factory('sendFlowStateService', sendFlowStateService); function sendFlowStateService($log) { diff --git a/src/js/services/send-flow.service.js b/src/js/services/send-flow.service.js index 41929319d..ea8d38d68 100644 --- a/src/js/services/send-flow.service.js +++ b/src/js/services/send-flow.service.js @@ -3,7 +3,7 @@ (function(){ angular - .module('copayApp.services') + .module('bitcoincom.services') .factory('sendFlowService', sendFlowService); function sendFlowService( @@ -47,12 +47,6 @@ angular if (err) { popupService.showAlert(gettextCatalog.getString('Error'), err); } else { - // Fill in the params - var toAddr = payProData.toAddress; - var amount = payProData.amount; - var paymentUrl = payProData.url; - var expires = payProData.expires; - var time = payProData.time; var name = payProData.domain; // Detect some merchant that we know @@ -65,18 +59,18 @@ angular // Init thirdParty var thirdPartyData = { id: 'bip70', - amount: amount, + amount: payProData.amount, caTrusted: true, name: name, domain: payProData.domain, - expires: expires, + expires: payProData.expires, memo: payProData.memo, network: 'livenet', requiredFeeRate: payProData.requiredFeeRate, selfSigned: 0, - time: time, - toAddress: toAddr, - url: paymentUrl, + time: payProData.time, + toAddress: payProData.toAddress, + url: payProData.url, verified: true }; From 05d73e3e14cf55a40bd1e2adb4f7b2ef20aac588 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 4 Sep 2018 13:34:08 +0900 Subject: [PATCH 17/18] init missing variables --- src/js/services/send-flow-state.service.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/js/services/send-flow-state.service.js b/src/js/services/send-flow-state.service.js index 7425b65a4..bec2c8a3c 100644 --- a/src/js/services/send-flow-state.service.js +++ b/src/js/services/send-flow-state.service.js @@ -17,7 +17,10 @@ angular sendMax: false, thirdParty: null, toAddress: '', - toWalletId: '' + toWalletId: '', + coin: '', + isRequestAmount: false, + isWalletTransfer: false }, previousStates: [], @@ -70,7 +73,10 @@ angular sendMax: false, thirdParty: null, toAddress: '', - toWalletId: '' + toWalletId: '', + coin: '', + isRequestAmount: false, + isWalletTransfer: false } } From 2a017bc9992f01d82e19991ebaf933ff469dbeb7 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 4 Sep 2018 13:37:31 +0900 Subject: [PATCH 18/18] Remove duplicate data. --- src/js/services/send-flow.service.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/js/services/send-flow.service.js b/src/js/services/send-flow.service.js index ea8d38d68..1b02c0d34 100644 --- a/src/js/services/send-flow.service.js +++ b/src/js/services/send-flow.service.js @@ -59,7 +59,6 @@ angular // Init thirdParty var thirdPartyData = { id: 'bip70', - amount: payProData.amount, caTrusted: true, name: name, domain: payProData.domain, @@ -69,14 +68,13 @@ angular requiredFeeRate: payProData.requiredFeeRate, selfSigned: 0, time: payProData.time, - toAddress: payProData.toAddress, url: payProData.url, verified: true }; // Fill in params - params.amount = thirdPartyData.amount, - params.toAddress = thirdPartyData.toAddress, + params.amount = payProData.amount, + params.toAddress = payProData.toAddress, params.coin = coin, params.thirdParty = thirdPartyData }