diff --git a/src/js/controllers/preferencesPriceDisplay.js b/src/js/controllers/preferencesPriceDisplay.js new file mode 100644 index 000000000..0f37c9f6c --- /dev/null +++ b/src/js/controllers/preferencesPriceDisplay.js @@ -0,0 +1,42 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('preferencesPriceDisplayController', function($scope, $q, $timeout, configService, $ionicNavBarDelegate) { + + $scope.save = function(priceDisplay) { + + if ($scope.noSave) return; + + var opts = { + wallet: { + settings: { + priceDisplay: priceDisplay + } + } + }; + + configService.set(opts, function(err) { + if (err) $log.debug(err); + $timeout(function() { + $scope.$apply(); + }); + }); + }; + + $scope.$on("$ionicView.enter", function(event, data) { + $ionicNavBarDelegate.showBar(true); + }); + + $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.init(); + }); + + $scope.init = function () { + configService.whenAvailable(function(config) { + $scope.selectedPriceDisplay = config.wallet.settings.priceDisplay; + + $timeout(function() { + $scope.$apply(); + }); + }); + }; +}); diff --git a/src/js/controllers/tab-home.js b/src/js/controllers/tab-home.js index c5699ee0c..28736972f 100644 --- a/src/js/controllers/tab-home.js +++ b/src/js/controllers/tab-home.js @@ -116,6 +116,7 @@ angular.module('copayApp.controllers').controller('tabHomeController', }); configService.whenAvailable(function(config) { + $scope.selectedPriceDisplay = config.wallet.settings.priceDisplay; $scope.recentTransactionsEnabled = config.recentTransactions.enabled; if ($scope.recentTransactionsEnabled) getNotifications(); diff --git a/src/js/controllers/tab-settings.js b/src/js/controllers/tab-settings.js index 7c380d27f..6cfc80def 100644 --- a/src/js/controllers/tab-settings.js +++ b/src/js/controllers/tab-settings.js @@ -16,6 +16,8 @@ angular.module('copayApp.controllers').controller('tabSettingsController', funct isoCode: config.wallet.settings.alternativeIsoCode }; + $scope.selectedPriceDisplay = config.wallet.settings.priceDisplay; + // TODO move this to a generic service bitpayAccountService.getAccounts(function(err, data) { if (err) $log.error(err); diff --git a/src/js/controllers/walletDetails.js b/src/js/controllers/walletDetails.js index 009c7a80d..c724dde9a 100644 --- a/src/js/controllers/walletDetails.js +++ b/src/js/controllers/walletDetails.js @@ -367,6 +367,15 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun }); $scope.$on("$ionicView.beforeEnter", function(event, data) { + + configService.whenAvailable(function (config) { + $scope.selectedPriceDisplay = config.wallet.settings.priceDisplay; + + $timeout(function () { + $scope.apply(); + }); + }); + $scope.walletId = data.stateParams.walletId; $scope.wallet = profileService.getWallet($scope.walletId); if (!$scope.wallet) return; diff --git a/src/js/routes.js b/src/js/routes.js index 4aff2e459..337363fcc 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -413,6 +413,15 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } } }) + .state('tabs.priceDisplay', { + url: '/priceDisplay', + views: { + 'tab-settings@tabs': { + controller: 'preferencesPriceDisplayController', + templateUrl: 'views/preferencesPriceDisplay.html' + } + } + }) .state('tabs.about', { url: '/about', views: { @@ -1199,11 +1208,46 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }); }) - .run(function($rootScope, $state, $location, $log, $timeout, startupService, ionicToast, fingerprintService, $ionicHistory, $ionicPlatform, $window, appConfigService, lodash, platformInfo, profileService, uxLanguage, gettextCatalog, openURLService, storageService, scannerService, configService, emailService, /* plugins START HERE => */ buydotbitcoindotcomService, glideraService, amazonService, bitpayCardService, applicationService, mercadoLibreService) { + .run(function($rootScope, $state, $location, $log, $timeout, startupService, ionicToast, fingerprintService, $ionicHistory, $ionicPlatform, $window, appConfigService, lodash, platformInfo, profileService, uxLanguage, gettextCatalog, openURLService, storageService, scannerService, configService, emailService, /* plugins START HERE => */ buydotbitcoindotcomService, glideraService, amazonService, bitpayCardService, applicationService, mercadoLibreService, rateService) { + + $ionicPlatform.ready(function() { + + // Init language + uxLanguage.init(function (lang) { - uxLanguage.init(); + // Try to load the profile + profileService.loadAndBindProfile(function(err) { + + // If err, first time so I define the currency rate by language + if (err) { + var rateCode = uxLanguage.getRateCode(lang); - $ionicPlatform.ready(function() { + rateService.whenAvailable(function() { + var alternatives = rateService.listAlternatives(true); + + var newAltCurrency = lodash.find(alternatives, { + 'isoCode': rateCode + }); + + configService.whenAvailable(function(config) { + var opts = { + wallet: { + settings: { + alternativeName: newAltCurrency.name, + alternativeIsoCode: newAltCurrency.isoCode, + } + } + }; + configService.set(opts, function(err) { + if (err) $log.warn(err); + }); + }); + $log.debug('Setting default currency : ' + newAltCurrency); + }); + }; + }); + }); + if (screen.width < 768 && platformInfo.isCordova) screen.lockOrientation('portrait'); @@ -1278,6 +1322,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr $log.debug('No profile... redirecting'); $state.go('onboarding.tour'); } else if (err.message && err.message.match('NONAGREEDDISCLAIMER')) { + $scope.setRateByLanguage(); if (lodash.isEmpty(profileService.getWallets())) { $log.debug('No wallets and no disclaimer... redirecting'); $state.go('onboarding.tour'); diff --git a/src/js/services/configService.js b/src/js/services/configService.js index 17f556ce3..b7072372d 100644 --- a/src/js/services/configService.js +++ b/src/js/services/configService.js @@ -69,6 +69,7 @@ angular.module('copayApp.services').factory('configService', function(storageSer unitCode: 'btc', alternativeName: 'US Dollar', alternativeIsoCode: 'USD', + priceDisplay: 'fiat', // 'fiat' || 'crypto' } }, @@ -181,6 +182,11 @@ angular.module('copayApp.services').factory('configService', function(storageSer configCache.wallet.settings.unitCode = defaultConfig.wallet.settings.unitCode; } + // If display is not configure, take the default value + if (!configCache.wallet.settings.priceDisplay) { + configCache.wallet.settings.display = defaultConfig.wallet.settings.priceDisplay; + } + // Convert tarascash wallet to new style cash wallet if (configCache.bwsbcc && configCache.bwsbcc.url && configCache.bwsbcc.url.indexOf('bwsbcc') >= 0) { configCache.bwsbcc = defaultConfig.bwscash.url; diff --git a/src/js/services/openURL.js b/src/js/services/openURL.js index b03f4b16a..0f4d6c666 100644 --- a/src/js/services/openURL.js +++ b/src/js/services/openURL.js @@ -6,12 +6,6 @@ angular.module('copayApp.services').factory('openURLService', function($rootScop var handleOpenURL = function(args) { $log.info('Handling Open URL: ' + JSON.stringify(args)); - // Stop it from caching the first view as one to return when the app opens - $ionicHistory.nextViewOptions({ - historyRoot: true, - disableBack: false, - disableAnimation: true - }); var url = args.url; if (!url) { diff --git a/src/js/services/uxLanguage.js b/src/js/services/uxLanguage.js index 314995616..ef64b7158 100644 --- a/src/js/services/uxLanguage.js +++ b/src/js/services/uxLanguage.js @@ -8,41 +8,53 @@ angular.module('copayApp.services') root.availableLanguages = [{ name: 'English', isoCode: 'en', + rateCode: 'USD' }, { name: 'Español', isoCode: 'es', + rateCode: 'EUR' }, { name: 'Français', isoCode: 'fr', + rateCode: 'EUR' }, { name: 'Italiano', isoCode: 'it', + rateCode: 'EUR' }, { name: 'Nederlands', isoCode: 'nl', + rateCode: 'EUR' }, { name: 'Polski', isoCode: 'pl', + rateCode: 'EUR' }, { name: 'Deutsch', isoCode: 'de', + rateCode: 'EUR' }, { name: '日本語', isoCode: 'ja', useIdeograms: true, + rateCode: 'JPY' }, { name: '中文(简体)', isoCode: 'zh', useIdeograms: true, + rateCode: 'CNY' }, { name: 'Pусский', isoCode: 'ru', + rateCode: 'RUB' }, { name: 'Português', isoCode: 'pt', + rateCode: 'EUR' }, { name: '한국어', - isoCode: 'ko' + isoCode: 'ko', + rateCode: 'KRW' }]; // }, { @@ -105,18 +117,19 @@ angular.module('copayApp.services') return root.availableLanguages; }; - root.init = function(cb) { + root.init = function(cb, cbSuccess) { configService.whenAvailable(function(config) { var userLang = config.wallet.settings.defaultLanguage; if (userLang && userLang != root.currentLanguage) { root._set(userLang); + if (cb) return cb(userLang); } else { root._detect(function(lang) { root._set(lang); + if (cb) return cb(lang); }); } - if (cb) return cb(); }); }; @@ -126,5 +139,11 @@ angular.module('copayApp.services') }), 'name'); }; + root.getRateCode = function(lang) { + return lodash.result(lodash.find(root.availableLanguages, { + 'isoCode': lang + }), 'rateCode'); + }; + return root; }); diff --git a/www/css/bitcoin.com.css b/www/css/bitcoin.com.css index ce73da50e..9b69005c4 100644 --- a/www/css/bitcoin.com.css +++ b/www/css/bitcoin.com.css @@ -28,6 +28,10 @@ body { font-family:'ProximaNova' !important; } +.capitalize { + text-transform: capitalize; +} + .textlogo { color: #FFF; font-size: 20px; diff --git a/www/views/includes/walletList.html b/www/views/includes/walletList.html index 102daffcb..f7a061740 100644 --- a/www/views/includes/walletList.html +++ b/www/views/includes/walletList.html @@ -7,7 +7,8 @@ Incomplete - {{wallet.status.totalBalanceStr ? wallet.status.totalBalanceStr : ( wallet.cachedBalance ? wallet.cachedBalance + (wallet.cachedBalanceUpdatedOn ? ' · ' + ( wallet.cachedBalanceUpdatedOn * 1000 | amTimeAgo) : '') : '' ) }} + {{wallet.status.totalBalanceStr ? wallet.status.totalBalanceStr : ( wallet.cachedBalance ? wallet.cachedBalance + (wallet.cachedBalanceUpdatedOn ? ' · ' + ( wallet.cachedBalanceUpdatedOn * 1000 | amTimeAgo) : '') : '' ) }} + {{wallet.status.totalBalanceAlternative ? wallet.status.totalBalanceAlternative : ( wallet.cachedBalance ? wallet.cachedBalance + (wallet.cachedBalanceUpdatedOn ? ' · ' + ( wallet.cachedBalanceUpdatedOn * 1000 | amTimeAgo) : '') : '' ) }} {{wallet.status.alternativeIsoCode}} Scanning funds... [Balance Hidden] diff --git a/www/views/preferencesPriceDisplay.html b/www/views/preferencesPriceDisplay.html new file mode 100644 index 000000000..a4c12d273 --- /dev/null +++ b/www/views/preferencesPriceDisplay.html @@ -0,0 +1,19 @@ + + + + {{'Price display'|translate}} + + + + + + + + fiat + + + cryptocurrency + + + + diff --git a/www/views/tab-settings.html b/www/views/tab-settings.html index 0c6004c3a..1105937d4 100644 --- a/www/views/tab-settings.html +++ b/www/views/tab-settings.html @@ -55,7 +55,7 @@ {{currentLanguageName|translate}} - + @@ -67,6 +67,17 @@ + + + + + + {{'Price Display' | translate}} + + {{selectedPriceDisplay}} + + + diff --git a/www/views/walletDetails.html b/www/views/walletDetails.html index fc5f8c8bb..64bdc090e 100644 --- a/www/views/walletDetails.html +++ b/www/views/walletDetails.html @@ -30,7 +30,21 @@ + {{status.totalBalanceAlternative}} {{status.alternativeIsoCode}} + + {{status.totalBalanceStr}} + + + +