Spend proposals
-
diff --git a/src/css/mobile.css b/src/css/mobile.css
index 3bd3bf162..21404d8da 100644
--- a/src/css/mobile.css
+++ b/src/css/mobile.css
@@ -652,13 +652,13 @@ a.pin-button:active {
.animation-left.ng-enter {
-webkit-transform: translate3d(100%, 0, 0);
transform: translate3d(100%, 0, 0);
- -webkit-transition-delay: 0.1s;
+ -webkit-transition-delay: 0.05s;
opacity: 0;
}
.animation-right.ng-enter {
-webkit-transform: translate3d(-100%, 0, 0);
transform: translate3d(-100%, 0, 0);
- -webkit-transition-delay: 0.1s;
+ -webkit-transition-delay: 0.05s;
opacity: 0;
}
.animation-left.ng-enter.ng-enter-active,
@@ -672,15 +672,18 @@ a.pin-button:active {
.animation-right.ng-leave {
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
+ opacity: 0;
}
.animation-left.ng-leave.animation-left.ng-leave-active {
-webkit-transform: translate3d(-100%, 0, 0);
transform: translate3d(-100%, 0, 0);
+ -webkit-transition-delay: 0.05s;
opacity: 0;
}
.animation-right.ng-leave.animation-right.ng-leave-active {
-webkit-transform: translate3d(100%, 0, 0);
transform: translate3d(100%, 0, 0);
+ -webkit-transition-delay: 0.05s;
opacity: 0;
}
diff --git a/src/js/controllers/createProfile.js b/src/js/controllers/createProfile.js
index 514176e10..a9dc91307 100644
--- a/src/js/controllers/createProfile.js
+++ b/src/js/controllers/createProfile.js
@@ -6,24 +6,21 @@ angular.module('copayApp.controllers').controller('createProfileController', fun
if (profileService.profile)
go.walletHome();
- var pin='';
- // $rootScope.$on('pin', function(event, pin) {
- self.creatingProfile = true;
+ self.creatingProfile = true;
- $timeout(function() {
- profileService.create(pin, function(err) {
- if (err) {
- self.creatingProfile = false;
- $log.warn(err);
- self.error = err;
- $scope.$apply();
- $timeout(function() {
- go.reload();
- }, 3000);
- } else {
- go.walletHome();
- }
- });
- }, 100);
- // });
+ $timeout(function() {
+ profileService.create(function(err) {
+ if (err) {
+ self.creatingProfile = false;
+ $log.warn(err);
+ self.error = err;
+ $scope.$apply();
+ $timeout(function() {
+ go.reload();
+ }, 3000);
+ } else {
+ go.walletHome();
+ }
+ });
+ }, 100);
});
diff --git a/src/js/controllers/index.js b/src/js/controllers/index.js
index d18581154..78fc79ad4 100644
--- a/src/js/controllers/index.js
+++ b/src/js/controllers/index.js
@@ -1,17 +1,47 @@
'use strict';
-angular.module('copayApp.controllers').controller('indexController', function($rootScope, $scope, $log, $filter, $timeout, lodash, go, profileService, configService, isCordova, rateService, storageService) {
+angular.module('copayApp.controllers').controller('indexController', function($rootScope, $scope, $log, $filter, $timeout, lodash, go, profileService, configService, isCordova, rateService, storageService, gettextCatalog, amMoment) {
var self = this;
self.isCordova = isCordova;
self.onGoingProcess = {};
- self.limitHistory = 5;
-
- self.hideMenuBar = false;
+ self.limitHistory = 5;
function strip(number) {
return (parseFloat(number.toPrecision(12)));
};
+ self.menu = [{
+ 'title': 'Home',
+ 'icon': 'icon-home',
+ 'link': 'walletHome'
+ }, {
+ 'title': 'Receive',
+ 'icon': 'icon-receive',
+ 'link': 'receive'
+ }, {
+ 'title': 'Send',
+ 'icon': 'icon-paperplane',
+ 'link': 'send'
+ }, {
+ 'title': 'History',
+ 'icon': 'icon-history',
+ 'link': 'history'
+ }];
+
+ self.availableLanguages = [{
+ name: 'English',
+ isoCode: 'en',
+ }, {
+ name: 'Spanish',
+ isoCode: 'es',
+ }, {
+ name: 'Français',
+ isoCode: 'fr',
+ }, {
+ name: '日本人',
+ isoCode: 'ja',
+ }];
+
self.setOngoingProcess = function(processName, isOn) {
$log.debug('onGoingProcess', processName, isOn);
self[processName] = isOn;
@@ -193,6 +223,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r
self.openWallet = function() {
var fc = profileService.focusedClient;
self.updateColor();
+ $rootScope.$apply();
$timeout(function() {
self.setOngoingProcess('openingWallet', true);
self.updateError = false;
@@ -402,6 +433,43 @@ angular.module('copayApp.controllers').controller('indexController', function($r
});
};
+ self.setDefaultLanguage = function(setLang) {
+ var userLang
+ if (!setLang) {
+ userLang = configService.getSync().wallet.settings.defaultLanguage;
+ if (!userLang) {
+ // Auto-detect browser language
+ var androidLang;
+
+ if (navigator && navigator.userAgent && (androidLang = navigator.userAgent.match(/android.*\W(\w\w)-(\w\w)\W/i))) {
+ userLang = androidLang[1];
+ } else {
+ // works for iOS and Android 4.x
+ userLang = navigator.userLanguage || navigator.language;
+ }
+ userLang = userLang ? (userLang.split('-', 1)[0] || 'en') : 'en';
+ }
+ if (userLang != gettextCatalog.getCurrentLanguage()) {
+ $log.debug('Setting default language: ' + userLang);
+ gettextCatalog.setCurrentLanguage(userLang);
+ amMoment.changeLocale(userLang);
+ }
+ }
+ else {
+ configService.set({
+ wallet: {
+ settings: {
+ defaultLanguage: setLang
+ }
+ }
+ }, function() {
+ gettextCatalog.setCurrentLanguage(setLang);
+ amMoment.changeLocale(setLang);
+ });
+ }
+ self.defaultLanguageIsoCode = setLang || userLang;
+ self.defaultLanguageName = lodash.result(lodash.find(self.availableLanguages, { 'isoCode': self.defaultLanguageIsoCode }), 'name');
+ };
// UX event handlers
$rootScope.$on('Local/ColorUpdated', function(event) {
@@ -469,6 +537,10 @@ angular.module('copayApp.controllers').controller('indexController', function($r
});
});
+ $rootScope.$on('Local/DefaultLanguage', function(event, setLang) {
+ self.setDefaultLanguage(setLang);
+ });
+
$rootScope.$on('Animation/Disable', function(event) {
$timeout(function() {
self.swipeLeft = false;
diff --git a/src/js/controllers/menu.js b/src/js/controllers/menu.js
deleted file mode 100644
index 53e9a0525..000000000
--- a/src/js/controllers/menu.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-angular.module('copayApp.controllers').controller('menuController', function($state) {
-
- this.menu = [{
- 'title': 'Home',
- 'icon': 'icon-home',
- 'link': 'walletHome'
- }, {
- 'title': 'Receive',
- 'icon': 'icon-receive',
- 'link': 'receive'
- }, {
- 'title': 'Send',
- 'icon': 'icon-paperplane',
- 'link': 'send'
- }, {
- 'title': 'History',
- 'icon': 'icon-history',
- 'link': 'history'
- }];
-
- this.go = function(state) {
- $state.go(state);
- };
-
-});
diff --git a/src/js/controllers/pinController.js b/src/js/controllers/pinController.js
deleted file mode 100644
index f8037b859..000000000
--- a/src/js/controllers/pinController.js
+++ /dev/null
@@ -1,73 +0,0 @@
-'use strict';
-
-angular.module('copayApp.controllers').controller('pinController', function($scope, $timeout) {
- this.init = function(confirmPin, testPin) {
- this._firstpin = null;
- this.askForPin = 1;
- this.confirmPin = confirmPin;
- this.clear();
- if (testPin) {
- console.log('WARN: using test pin:', testPin);
- $timeout(function() {
- $scope.$emit('pin', testPin);
- }, 100);
- }
- };
-
- this.clear = function() {
- this.digits = [];
- this.defined = [];
- };
-
- this.press = function(digit) {
- var self = this;
- $timeout(function() {
- self._press(digit);
- }, 1);
- };
-
- this._press = function(digit) {
- var self = this;
- this.error = null;
- this.digits.push(digit);
- this.defined.push(true);
-
- if (this.digits.length == 4) {
- var pin = this.digits.join('');
-
- if (this.confirmPin) {
- if (!this._firstpin) {
- this._firstpin = pin;
- this.askForPin = 2;
- $timeout(function() {
- self.clear();
- }, 100);
- return;
- } else {
- if (pin === this._firstpin) {
- $scope.$emit('pin', pin);
- return;
- } else {
- this._firstpin = null;
- this.askForPin = 1;
- $timeout(function() {
- self.clear();
- self.error = 'Entered PINs were not equal. Try again';
- var _self = self;
- $timeout(function() {
- _self.error = null;
- }, 2000);
- }, 100);
- return;
- }
- }
- } else {
- $scope.$emit('pin', pin);
- }
- }
- };
-
- this.skip = function() {
- $scope.$emit('pin', null);
- };
-});
diff --git a/src/js/controllers/preferences.js b/src/js/controllers/preferences.js
index 636f3659d..4c05f0147 100644
--- a/src/js/controllers/preferences.js
+++ b/src/js/controllers/preferences.js
@@ -1,7 +1,7 @@
'use strict';
angular.module('copayApp.controllers').controller('preferencesController',
- function($scope, $rootScope, $filter, $timeout, $modal, $log, configService, profileService) {
+ function($scope, $rootScope, $filter, $timeout, $modal, $log, lodash, configService, profileService) {
this.error = null;
this.success = null;
@@ -12,7 +12,7 @@ angular.module('copayApp.controllers').controller('preferencesController',
this.selectedAlternative = {
name: config.wallet.settings.alternativeName,
isoCode: config.wallet.settings.alternativeIsoCode
- };
+ };
var fc = profileService.focusedClient;
$scope.encrypt = fc.hasPrivKeyEncrypted();
diff --git a/src/js/controllers/preferencesLanguage.js b/src/js/controllers/preferencesLanguage.js
new file mode 100644
index 000000000..6eedd917f
--- /dev/null
+++ b/src/js/controllers/preferencesLanguage.js
@@ -0,0 +1,12 @@
+'use strict';
+
+angular.module('copayApp.controllers').controller('preferencesLanguageController',
+ function($scope, $timeout, go) {
+
+ this.save = function(newLang) {
+ $scope.$emit('Local/DefaultLanguage', newLang);
+ $timeout(function() {
+ go.preferences();
+ }, 100);
+ };
+ });
diff --git a/src/js/controllers/receive.js b/src/js/controllers/receive.js
index fddd93ff4..bd5d47acc 100644
--- a/src/js/controllers/receive.js
+++ b/src/js/controllers/receive.js
@@ -59,31 +59,5 @@ angular.module('copayApp.controllers').controller('receiveController',
}
};
- this.openAddressModal = function(address) {
- var self = this;
- var ModalInstanceCtrl = function($scope, $modalInstance, address) {
- $scope.address = address;
- $scope.isCordova = self.isCordova;
- $scope.copyAddress = function(addr) {
- self.copyAddress(addr);
- };
-
- $scope.cancel = function() {
- $modalInstance.dismiss('cancel');
- };
- };
-
- $modal.open({
- templateUrl: 'views/modals/qr-address.html',
- windowClass: 'full',
- controller: ModalInstanceCtrl,
- resolve: {
- address: function() {
- return address;
- }
- }
- });
- };
-
}
);
diff --git a/src/js/controllers/send.js b/src/js/controllers/send.js
index ac68085af..8a38e65a5 100644
--- a/src/js/controllers/send.js
+++ b/src/js/controllers/send.js
@@ -67,7 +67,9 @@ angular.module('copayApp.controllers').controller('sendController',
this.formFocus = function(what) {
- hideMenuBar(what);
+ if (isCordova) {
+ hideMenuBar(what);
+ }
if (!this.isWindowsPhoneApp) return
if (!what) {
@@ -428,90 +430,4 @@ angular.module('copayApp.controllers').controller('sendController',
return value;
}
};
-
- this.openAddressBook = function() {
- var w = $rootScope.wallet;
- var modalInstance = $modal.open({
- templateUrl: 'views/modals/address-book.html',
- windowClass: 'full',
- controller: function($scope, $modalInstance) {
-
- $scope.showForm = null;
- $scope.addressBook = w.addressBook;
-
- $scope.hasEntry = function() {
- return _.keys($scope.addressBook).length > 0 ? true : false;
- };
-
- $scope.toggleAddressBookEntry = function(key) {
- w.toggleAddressBookEntry(key);
- };
-
- $scope.copyToSend = function(addr) {
- $modalInstance.close(addr);
- };
-
- $scope.cancel = function(form) {
- $scope.error = $scope.success = $scope.newaddress = $scope.newlabel = null;
- clearForm(form);
- $scope.toggleForm();
- };
-
- $scope.toggleForm = function() {
- $scope.showForm = !$scope.showForm;
- };
-
- var clearForm = function(form) {
- form.newaddress.$pristine = true;
- form.newaddress.$setViewValue('');
- form.newaddress.$render();
-
- form.newlabel.$pristine = true;
- form.newlabel.$setViewValue('');
- form.newlabel.$render();
- form.$setPristine();
- };
-
- // TODO change to modal
- $scope.submitAddressBook = function(form) {
- if (form.$invalid) {
- return;
- }
- $scope.blockUx = true;
- $timeout(function() {
- var errorMsg;
- var entry = {
- "address": form.newaddress.$modelValue,
- "label": form.newlabel.$modelValue
- };
- try {
- w.setAddressBook(entry.address, entry.label);
- } catch (e) {
- $log.warn(e);
- errorMsg = e.message;
- }
-
- if (errorMsg) {
- $scope.error = errorMsg;
- } else {
- clearForm(form);
- $scope.toggleForm();
- notification.success('Entry created', 'New addressbook entry created')
- }
- $scope.blockUx = false;
- $rootScope.$digest();
- }, 100);
- return;
- };
-
- $scope.close = function() {
- $modalInstance.dismiss('cancel');
- };
- },
- });
-
- modalInstance.result.then(function(addr) {
- $scope.setForm(addr);
- });
- };
});
diff --git a/src/js/controllers/walletHome.js b/src/js/controllers/walletHome.js
index dbb0aa999..2450616cb 100644
--- a/src/js/controllers/walletHome.js
+++ b/src/js/controllers/walletHome.js
@@ -194,7 +194,7 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi
};
$scope.cancel = function() {
- $modalInstance.close();
+ $modalInstance.dismiss('cancel');
};
};
diff --git a/src/js/routes.js b/src/js/routes.js
index 317adff43..831c301a7 100644
--- a/src/js/routes.js
+++ b/src/js/routes.js
@@ -254,6 +254,23 @@ angular
}
}
})
+ .state('preferencesLanguage', {
+ url: '/preferencesLanguage',
+ walletShouldBeComplete: true,
+ needProfile: true,
+ views: {
+ 'main': {
+ templateUrl: 'views/preferencesLanguage.html'
+ },
+ 'topbar': {
+ templateUrl: 'views/includes/topbar.html',
+ controller: function($scope) {
+ $scope.titleSection = 'Language';
+ $scope.goBackToState = 'preferences';
+ }
+ }
+ }
+ })
.state('preferencesUnit', {
url: '/preferencesUnit',
templateUrl: 'views/preferencesUnit.html',
@@ -418,19 +435,18 @@ angular
.run(function($rootScope, $state, $log, gettextCatalog, uriHandler, isCordova, amMoment, profileService) {
// Auto-detect browser language
- // Commented for now (default: English)
- //var userLang, androidLang;
- //
- //if (navigator && navigator.userAgent && (androidLang = navigator.userAgent.match(/android.*\W(\w\w)-(\w\w)\W/i))) {
- // userLang = androidLang[1];
- //} else {
- // // works for iOS and Android 4.x
- // userLang = navigator.userLanguage || navigator.language;
- //}
+ var userLang, androidLang;
- //userLang = userLang ? (userLang.split('-', 1)[0] || 'en') : 'en';
- //gettextCatalog.setCurrentLanguage(userLang);
- //amMoment.changeLocale(userLang);
+ if (navigator && navigator.userAgent && (androidLang = navigator.userAgent.match(/android.*\W(\w\w)-(\w\w)\W/i))) {
+ userLang = androidLang[1];
+ } else {
+ // works for iOS and Android 4.x
+ userLang = navigator.userLanguage || navigator.language;
+ }
+
+ userLang = userLang ? (userLang.split('-', 1)[0] || 'en') : 'en';
+ gettextCatalog.setCurrentLanguage(userLang);
+ amMoment.changeLocale(userLang);
// Register URI handler, not for mobileApp
if (!isCordova) {
@@ -446,6 +462,7 @@ angular
preferencesColor: 12,
backup: 12,
delete: 12,
+ preferencesLanguage: 12,
preferencesUnit: 12,
preferencesAltCurrency: 12,
preferencesBwsUrl: 12,
diff --git a/src/js/services/configService.js b/src/js/services/configService.js
index 1efdf20fa..99554e9b3 100644
--- a/src/js/services/configService.js
+++ b/src/js/services/configService.js
@@ -58,8 +58,6 @@ angular.module('copayApp.services').factory('configService', function(localStora
var configCache = null;
-
-
root.getSync = function() {
if (!configCache)
throw new Error('configService#getSync called when cache is not initialized');
diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js
index 420bce8b5..d3504db00 100644
--- a/src/js/services/profileService.js
+++ b/src/js/services/profileService.js
@@ -115,6 +115,7 @@ angular.module('copayApp.services')
configService.get(function(err) {
if (err) return cb(err);
+ $rootScope.$emit('Local/DefaultLanguage');
root.setWalletClients();
storageService.getFocusedWalletId(function(err, focusedWalletId) {
if (err) return cb(err);
@@ -136,7 +137,7 @@ angular.module('copayApp.services')
});
};
- root._createNewProfile = function(pin, cb) {
+ root._createNewProfile = function(cb) {
var walletClient = bwcService.getClient();
walletClient.createWallet('Personal Wallet', 'me', 1, 1, {
@@ -260,8 +261,8 @@ angular.module('copayApp.services')
- root.create = function(pin, cb) {
- root._createNewProfile(pin, function(err, p) {
+ root.create = function(cb) {
+ root._createNewProfile(function(err, p) {
if (err) return cb(err);
root.bindProfile(p, function(err) {
storageService.storeNewProfile(p, function(err) {
diff --git a/test/controllers/menu.test.js b/test/controllers/menu.test.js
deleted file mode 100644
index d2f6ec203..000000000
--- a/test/controllers/menu.test.js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-
-describe('menuController', function(){
- var state, scope, controller;
-
- beforeEach(angular.mock.module('copayApp.controllers'));
- beforeEach(angular.mock.module('stateMock'));
- beforeEach(angular.mock.inject(function($rootScope, $controller, $state){
- state = $state;
- scope = $rootScope.$new();
- controller = $controller('menuController', {$scope: scope});
- }));
-
- it('should have a menu variable', function(){
- expect(controller.menu).not.toBeUndefined();
- });
-});
diff --git a/test/controllers/sidebar.test.js b/test/controllers/sidebar.test.js
new file mode 100644
index 000000000..ffa7d7137
--- /dev/null
+++ b/test/controllers/sidebar.test.js
@@ -0,0 +1,11 @@
+'use strict';
+
+describe('sidebarController', function(){
+ var scope, controller;
+
+ beforeEach(angular.mock.module('copayApp.controllers'));
+
+ it('wallet selection', function(){
+ expect(true).not.toBeUndefined();
+ });
+});