diff --git a/config.js b/config.js index 5c658ea68..959cb3707 100644 --- a/config.js +++ b/config.js @@ -7,6 +7,8 @@ var defaultConfig = { // DEFAULT unit: Bit unitName: 'bits', unitToSatoshi: 100, + alternativeName: 'US Dollar', + alternativeIsoCode: 'USD', // wallet limits limits: { diff --git a/js/controllers/send.js b/js/controllers/send.js index 7fd8bebd8..713bb8b40 100644 --- a/js/controllers/send.js +++ b/js/controllers/send.js @@ -12,10 +12,9 @@ angular.module('copayApp.controllers').controller('SendController', $scope.unitToBtc = config.unitToSatoshi / bitcore.util.COIN; $scope.minAmount = config.limits.minAmountSatoshi * satToUnit; $scope.minAlternativeAmount = config.limits.minAmountSatoshi * satToAlternative; -// Mockup - $rootScope.alternativeName = 'Dollars'; - $rootScope.alternativeIsoCode = 'USD'; - config.unitDecimals = 2; + + this.alternativeName = config.alternativeName; + this.alternativeIsoCode = config.alternativeIsoCode; this.rateService = rateService; $scope._amount = 0; @@ -40,7 +39,7 @@ angular.module('copayApp.controllers').controller('SendController', this._alternative = newValue; if (typeof(newValue) === 'number') { this._amount = -(-( - rateService.fromFiat(newValue, $rootScope.alternativeIsoCode) * satToUnit + rateService.fromFiat(newValue, config.alternativeIsoCode) * satToUnit ).toFixed(config.unitDecimals)); } }, @@ -56,7 +55,7 @@ angular.module('copayApp.controllers').controller('SendController', this._amount = newValue; if (newValue) { this._alternative = -(-( - rateService.toFiat(newValue * config.unitToSatoshi, $rootScope.alternativeIsoCode) + rateService.toFiat(newValue * config.unitToSatoshi, config.alternativeIsoCode) ).toFixed(2)); } }, diff --git a/js/controllers/settings.js b/js/controllers/settings.js index 49f716519..af943edb9 100644 --- a/js/controllers/settings.js +++ b/js/controllers/settings.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('SettingsController', function($scope, $rootScope, $window, $location, controllerUtils) { +angular.module('copayApp.controllers').controller('SettingsController', function($scope, $rootScope, $window, $location, controllerUtils, rateService) { controllerUtils.redirIfLogged(); $scope.title = 'Settings'; @@ -14,27 +14,51 @@ angular.module('copayApp.controllers').controller('SettingsController', function $scope.unitOpts = [{ name: 'Satoshis (100,000,000 satoshis = 1BTC)', shortName: 'SAT', - value: 1 + value: 1, + decimals: 0 }, { name: 'bits (1,000,000 bits = 1BTC)', shortName: 'bits', - value: 100 + value: 100, + decimals: 2 }, { name: 'mBTC (1,000 mBTC = 1BTC)', shortName: 'mBTC', - value: 100000 + value: 100000, + decimals: 5 }, { name: 'BTC', shortName: 'BTC', - value: 100000000 + value: 100000000, + decimals: 8 }]; + $scope.selectedAlternative = { + name: 'US Dollar', + isoCode: 'USD' + }; + $scope.alternativeOpts = rateService.alternatives; + + rateService.whenAvailable(function() { + $scope.alternativeOpts = rateService.listAlternatives(); + for (var ii in $scope.alternativeOpts) { + if (config.alternativeIsoCode === $scope.alternativeOpts[ii].isoCode) { + $scope.selectedAlternative = $scope.alternativeOpts[ii]; + } + } + }); + for (var ii in $scope.unitOpts) { if (config.unitName === $scope.unitOpts[ii].shortName) { $scope.selectedUnit = $scope.unitOpts[ii]; break; } } + for (var ii in $scope.alternativeOpts) { + if (config.alternativeIsoCode === $scope.alternativeOpts[ii].isoCode) { + $scope.selectedAlternative = $scope.alternativeOpts[ii]; + } + } $scope.changeNetwork = function() { $scope.insightHost = $scope.networkName !== 'testnet' ? 'test-insight.bitpay.com' : 'insight.bitpay.com'; @@ -68,7 +92,11 @@ angular.module('copayApp.controllers').controller('SettingsController', function disableVideo: $scope.disableVideo, unitName: $scope.selectedUnit.shortName, unitToSatoshi: $scope.selectedUnit.value, - version: copay.version, + unitDecimals: $scope.selectedUnit.decimals, + alternativeName: $scope.selectedAlternative.name, + alternativeIsoCode: $scope.selectedAlternative.isoCode, + + version: copay.version })); // Go home reloading the application diff --git a/js/services/rate.js b/js/services/rate.js index 84809cc30..6aa56c356 100644 --- a/js/services/rate.js +++ b/js/services/rate.js @@ -1,28 +1,51 @@ 'use strict'; -var RateService = function($http) { +var request = require('request'); + +var RateService = function() { this.isAvailable = false; this.SAT_TO_BTC = 1 / 1e8; + this.queued = []; + this.alternatives = []; var that = this; var backoff = 5; var retrieve = function() { - $http({method: 'GET', url: 'https://bitpay.com/api/rates'}). - success(function(data, status, headers, config) { + request.get({ + url:'https://bitpay.com/api/rates', + json: true + }, function(err, response, listOfCurrencies) { + if (err) { + backoff *= 1.5; + setTimeout(retrieve, backoff * 1000); + return; + } var rates = {}; - data.forEach(function(element) { + listOfCurrencies.forEach(function(element) { rates[element.code] = element.rate; + that.alternatives.push({ + name: element.name, + isoCode: element.code, + rate: element.rate + }); }); that.isAvailable = true; that.rates = rates; - }). - error(function(data, status, headers, config) { - backoff *= 1.5; - setTimeout(retrieve, backoff * 1000); + that.queued.forEach(function(callback) { + setTimeout(callback, 0); + }); }); }; retrieve(); }; +RateService.prototype.whenAvailable = function(callback) { + if (this.isAvailable) { + setTimeout(callback, 0); + } else { + this.queued.push(callback); + } +}; + RateService.prototype.toFiat = function(satoshis, code) { if (!this.isAvailable) { return 0; @@ -37,4 +60,19 @@ RateService.prototype.fromFiat = function(amount, code) { return amount / this.rates[code] / this.SAT_TO_BTC; }; +RateService.prototype.listAlternatives = function() { + if (!this.isAvailable) { + return []; + } + + var alts = []; + this.alternatives.forEach(function(element) { + alts.push({ + name: element.name, + isoCode: element.isoCode + }); + }); + return alts; +}; + angular.module('copayApp.services').service('rateService', RateService); diff --git a/views/send.html b/views/send.html index c58a71683..118558936 100644 --- a/views/send.html +++ b/views/send.html @@ -85,7 +85,7 @@