diff --git a/src/js/controllers/amount.js b/src/js/controllers/amount.js index 5b67912c6..128badeae 100644 --- a/src/js/controllers/amount.js +++ b/src/js/controllers/amount.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('amountController', function($scope, $filter, $timeout, $ionicScrollDelegate, $ionicHistory, gettextCatalog, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, txFormatService, ongoingProcess, popupService, bwcError, payproService, profileService, bitcore, amazonService, nodeWebkitService) { +angular.module('copayApp.controllers').controller('amountController', function($scope, $filter, $timeout, $ionicModal, $ionicScrollDelegate, $ionicHistory, storageService, walletService, gettextCatalog, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, txFormatService, ongoingProcess, popupService, bwcError, payproService, profileService, bitcore, amazonService, nodeWebkitService) { var _id; var unitToSatoshi; @@ -30,6 +30,8 @@ angular.module('copayApp.controllers').controller('amountController', function($ $scope.$on("$ionicView.beforeEnter", function(event, data) { + initCurrencies(); + if (data.stateParams.shapeshiftOrderId && data.stateParams.shapeshiftOrderId.length > 0) { $scope.minShapeshiftAmount = parseFloat(data.stateParams.minShapeshiftAmount); $scope.maxShapeshiftAmount = parseFloat(data.stateParams.maxShapeshiftAmount); @@ -345,6 +347,20 @@ angular.module('copayApp.controllers').controller('amountController', function($ checkFontSize(); navigator.vibrate(50); }; + + + $scope.openPopup = function() { + $ionicModal.fromTemplateUrl('views/modals/altCurrency.html', { + scope: $scope + }).then(function(modal) { + $scope.altCurrencyModal = modal; + $scope.altCurrencyModal.show(); + }); + }; + + $scope.close = function() { + $scope.altCurrencyModal.hide(); + }; $scope.processAmount = function() { var formatedValue = format($scope.amountModel.amount); @@ -496,4 +512,108 @@ angular.module('copayApp.controllers').controller('amountController', function($ } }; + + + // Currency + + var next = 10; + var completeAlternativeList = []; + + var popularCurrencyList = [ + {isoCode: 'USD', order: 0}, + {isoCode: 'EUR', order: 1}, + {isoCode: 'JPY', order: 2}, + {isoCode: 'GBP', order: 3}, + {isoCode: 'AUD', order: 4}, + {isoCode: 'CAD', order: 5}, + {isoCode: 'CHF', order: 6}, + {isoCode: 'CNY', order: 7}, + {isoCode: 'KRW', order: 8}, + {isoCode: 'HKD', order: 9}, + ] + + function initCurrencies() { + var unusedCurrencyList = [{ + isoCode: 'LTL' + }, { + isoCode: 'BTC' + }, { + isoCode: 'BCC' + }, { + isoCode: 'BCH_BTC' + }, { + isoCode: 'BCH' + }]; + rateService.whenAvailable(function() { + + $scope.listComplete = false; + + var idx = lodash.indexBy(unusedCurrencyList, 'isoCode'); + var idx2 = lodash.indexBy($scope.lastUsedAltCurrencyList, 'isoCode'); + var idx3 = lodash.indexBy(popularCurrencyList, 'isoCode'); + var alternatives = rateService.listAlternatives(true); + + lodash.each(alternatives, function(c) { + if (idx3[c.isoCode]) { + idx3[c.isoCode].name = c.name; + } + if (!idx[c.isoCode] && !idx2[c.isoCode] && !idx3[c.isoCode]) { + completeAlternativeList.push(c); + } + }); + + $scope.altCurrencyList = completeAlternativeList.slice(0, 10); + $scope.lastUsedPopularList = lodash.unique(lodash.union($scope.lastUsedAltCurrencyList, popularCurrencyList), 'isoCode'); + + $timeout(function() { + $scope.$apply(); + }); + }); + } + + $scope.loadMore = function() { + $timeout(function() { + $scope.altCurrencyList = completeAlternativeList.slice(0, next); + next += 10; + $scope.listComplete = $scope.altCurrencyList.length >= completeAlternativeList.length; + $scope.$broadcast('scroll.infiniteScrollComplete'); + }, 100); + }; + + $scope.findCurrency = function(search) { + if (!search) init(); + $scope.altCurrencyList = lodash.filter(completeAlternativeList, function(item) { + var val = item.name + var val2 = item.isoCode; + return lodash.includes(val.toLowerCase(), search.toLowerCase()) || lodash.includes(val2.toLowerCase(), search.toLowerCase()); + }); + $timeout(function() { + $scope.$apply(); + }); + }; + + $scope.save = function(newAltCurrency) { + var opts = { + wallet: { + settings: { + alternativeName: newAltCurrency.name, + alternativeIsoCode: newAltCurrency.isoCode, + } + } + }; + + configService.set(opts, function(err) { + if (err) $log.warn(err); + walletService.updateRemotePreferences(profileService.getWallets()); + var altUnitIndex = lodash.findIndex(availableUnits, { + isFiat: true + }); + availableUnits[altUnitIndex].id = newAltCurrency.isoCode; + availableUnits[altUnitIndex].name = newAltCurrency.isoCode; + availableUnits[altUnitIndex].shortName = newAltCurrency.isoCode; + fiatCode = newAltCurrency.isoCode; + updateUnitUI(); + $scope.close(); + }); + }; }); diff --git a/src/js/controllers/modals/altCurrency.js b/src/js/controllers/modals/altCurrency.js new file mode 100644 index 000000000..1629b35e9 --- /dev/null +++ b/src/js/controllers/modals/altCurrency.js @@ -0,0 +1,119 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('altCurrencyController', + function($scope, $log, $timeout, $ionicHistory, $ionicModal, configService, rateService, lodash, profileService, walletService, storageService, $ionicNavBarDelegate) { + + $scope.close = function () { + $ionicModal.close(); + }; + + var next = 10; + var completeAlternativeList = []; + + var popularCurrencyList = [ + {isoCode: 'USD', order: 0}, + {isoCode: 'EUR', order: 1}, + {isoCode: 'JPY', order: 2}, + {isoCode: 'GBP', order: 3}, + {isoCode: 'AUD', order: 4}, + {isoCode: 'CAD', order: 5}, + {isoCode: 'CHF', order: 6}, + {isoCode: 'CNY', order: 7}, + {isoCode: 'KRW', order: 8}, + {isoCode: 'HKD', order: 9}, + ] + + function initCurrencies() { + var unusedCurrencyList = [{ + isoCode: 'LTL' + }, { + isoCode: 'BTC' + }, { + isoCode: 'BCC' + }, { + isoCode: 'BCH_BTC' + }, { + isoCode: 'BCH' + }]; + rateService.whenAvailable(function() { + + $scope.listComplete = false; + + var idx = lodash.indexBy(unusedCurrencyList, 'isoCode'); + var idx2 = lodash.indexBy($scope.lastUsedAltCurrencyList, 'isoCode'); + var idx3 = lodash.indexBy(popularCurrencyList, 'isoCode'); + var alternatives = rateService.listAlternatives(true); + + lodash.each(alternatives, function(c) { + if (idx3[c.isoCode]) { + idx3[c.isoCode].name = c.name; + } + if (!idx[c.isoCode] && !idx2[c.isoCode] && !idx3[c.isoCode]) { + completeAlternativeList.push(c); + } + }); + + $scope.altCurrencyList = completeAlternativeList.slice(0, 10); + $scope.lastUsedPopularList = lodash.unique(lodash.union($scope.lastUsedAltCurrencyList, popularCurrencyList), 'isoCode'); + + $timeout(function() { + $scope.$apply(); + }); + }); + } + + $scope.loadMore = function() { + $timeout(function() { + $scope.altCurrencyList = completeAlternativeList.slice(0, next); + next += 10; + $scope.listComplete = $scope.altCurrencyList.length >= completeAlternativeList.length; + $scope.$broadcast('scroll.infiniteScrollComplete'); + }, 100); + }; + + $scope.findCurrency = function(search) { + if (!search) initCurrencies(); + $scope.altCurrencyList = lodash.filter(completeAlternativeList, function(item) { + var val = item.name + var val2 = item.isoCode; + return lodash.includes(val.toLowerCase(), search.toLowerCase()) || lodash.includes(val2.toLowerCase(), search.toLowerCase()); + }); + $timeout(function() { + $scope.$apply(); + }); + }; + + $scope.save = function(newAltCurrency) { + var opts = { + wallet: { + settings: { + alternativeName: newAltCurrency.name, + alternativeIsoCode: newAltCurrency.isoCode, + } + } + }; + + configService.set(opts, function(err) { + if (err) $log.warn(err); + saveLastUsed(newAltCurrency); + walletService.updateRemotePreferences(profileService.getWallets()); + }); + }; + + function saveLastUsed(newAltCurrency) { + $scope.lastUsedAltCurrencyList.unshift(newAltCurrency); + $scope.lastUsedAltCurrencyList = lodash.uniq($scope.lastUsedAltCurrencyList, 'isoCode'); + $scope.lastUsedAltCurrencyList = $scope.lastUsedAltCurrencyList.slice(0, 3); + storageService.setLastCurrencyUsed(JSON.stringify($scope.lastUsedAltCurrencyList), function() {}); + }; + + $scope.$on("$ionicView.beforeEnter", function(event, data) { + var config = configService.getSync(); + $scope.currentCurrency = config.wallet.settings.alternativeIsoCode; + + storageService.getLastCurrencyUsed(function(err, lastUsedAltCurrency) { + $scope.lastUsedAltCurrencyList = lastUsedAltCurrency ? JSON.parse(lastUsedAltCurrency) : []; + initCurrencies(); + }); + }); + }); diff --git a/www/views/amount.html b/www/views/amount.html index 994c112cf..f704d6a1c 100644 --- a/www/views/amount.html +++ b/www/views/amount.html @@ -5,9 +5,9 @@ - + -
+
@@ -33,7 +33,7 @@ Send max amount -
-
-
+
+
7
@@ -77,7 +77,7 @@ class="button button-full button-primary no-margin" ng-disabled="!allowSend" ng-click="finish()" - style="order: 2" + style="position: absolute; bottom: 0;" translate> Next diff --git a/www/views/modals/altCurrency.html b/www/views/modals/altCurrency.html new file mode 100644 index 000000000..39010d0c4 --- /dev/null +++ b/www/views/modals/altCurrency.html @@ -0,0 +1,34 @@ + + +
+ {{'Alternative Currency'|translate}} +
+ +
+ +
+ +
+
+ {{lastUsedAltCurrency.name}} {{lastUsedAltCurrency.isoCode}} + +
+
+
{{altCurrency.name}} {{altCurrency.isoCode}} +
+
+ + +
+