refactor preferences

This commit is contained in:
Matias Alejo Garcia 2016-06-06 18:26:45 -03:00
commit 1e2555dad9
No known key found for this signature in database
GPG key ID: 02470DB551277AB3
15 changed files with 222 additions and 200 deletions

View file

@ -1,7 +1,7 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('buyCoinbaseController', angular.module('copayApp.controllers').controller('buyCoinbaseController',
function($scope, $modal, $log, $timeout, lodash, profileService, coinbaseService, animationService, bwsError, addressService, walletService) { function($scope, $modal, $log, $timeout, lodash, profileService, coinbaseService, animationService, bwsError, addressService) {
window.ignoreMobilePause = true; window.ignoreMobilePause = true;
var self = this; var self = this;
@ -72,7 +72,7 @@ angular.module('copayApp.controllers').controller('buyCoinbaseController',
$scope.selectWallet = function(walletId, walletName) { $scope.selectWallet = function(walletId, walletName) {
var client = profileService.getClient(walletId); var client = profileService.getClient(walletId);
walletService.isReady(client, function(err) { profileService.isReady(client, function(err) {
if (err) { if (err) {
self.error = {errors: [{ message: err }]}; self.error = {errors: [{ message: err }]};
$modalInstance.dismiss('cancel'); $modalInstance.dismiss('cancel');

View file

@ -1,7 +1,7 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('buyGlideraController', angular.module('copayApp.controllers').controller('buyGlideraController',
function($scope, $timeout, $modal, profileService, addressService, glideraService, bwsError, lodash, animationService, walletService) { function($scope, $timeout, $modal, profileService, addressService, glideraService, bwsError, lodash, animationService) {
var self = this; var self = this;
this.show2faCodeInput = null; this.show2faCodeInput = null;
@ -51,7 +51,7 @@ angular.module('copayApp.controllers').controller('buyGlideraController',
$scope.selectWallet = function(walletId, walletName) { $scope.selectWallet = function(walletId, walletName) {
var client = profileService.getClient(walletId); var client = profileService.getClient(walletId);
walletService.isReady(client, function(err) { profileService.isReady(client, function(err) {
if (err) { if (err) {
self.error = err; self.error = err;
$modalInstance.dismiss('cancel'); $modalInstance.dismiss('cancel');

View file

@ -1,6 +1,6 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('indexController', function($rootScope, $scope, $log, $filter, $timeout, $ionicSideMenuDelegate, $ionicScrollDelegate, $ionicPopup, latestReleaseService, feeService, bwcService, pushNotificationsService, lodash, go, profileService, configService, rateService, storageService, addressService, gettext, gettextCatalog, amMoment, addonManager, bwsError, txFormatService, uxLanguage, glideraService, coinbaseService, platformInfo, addressbookService, walletService) { angular.module('copayApp.controllers').controller('indexController', function($rootScope, $scope, $log, $filter, $timeout, $ionicSideMenuDelegate, $ionicScrollDelegate, $ionicPopup, latestReleaseService, feeService, bwcService, pushNotificationsService, lodash, go, profileService, configService, rateService, storageService, addressService, gettext, gettextCatalog, amMoment, addonManager, bwsError, txFormatService, uxLanguage, glideraService, coinbaseService, platformInfo, addressbookService) {
var self = this; var self = this;
var SOFT_CONFIRMATION_LIMIT = 12; var SOFT_CONFIRMATION_LIMIT = 12;
var errors = bwcService.getErrors(); var errors = bwcService.getErrors();
@ -184,7 +184,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r
} }
} }
walletService.isBackupNeeded(fc, function(needsBackup) { profileService.needsBackup(fc, function(needsBackup) {
self.needsBackup = needsBackup; self.needsBackup = needsBackup;
self.openWallet(function() { self.openWallet(function() {
if (!self.isComplete) { if (!self.isComplete) {
@ -268,50 +268,6 @@ angular.module('copayApp.controllers').controller('indexController', function($r
}; };
self._updateRemotePreferencesFor = function(clients, prefs, cb) {
var client = clients.shift();
if (!client)
return cb();
$log.debug('Saving remote preferences', client.credentials.walletName, prefs);
client.savePreferences(prefs, function(err) {
// we ignore errors here
if (err) $log.warn(err);
self._updateRemotePreferencesFor(clients, prefs, cb);
});
};
// TODO: should not be in index.js
self.updateRemotePreferences = function(opts, cb) {
var clients;
var prefs = opts.preferences || {};
// Update this JIC.
var config = configService.getSync().wallet.settings;
//prefs.email (may come from arguments)
prefs.language = self.defaultLanguageIsoCode;
prefs.unit = config.unitCode;
if (opts.client) {
clients = [opts.client];
} else {
clients = lodash.values(profileService.walletClients);
};
self._updateRemotePreferencesFor(clients, prefs, function(err) {
if (err) return cb(err);
lodash.each(clients, function(c) {
c.preferences = lodash.assign(prefs, c.preferences);
});
return cb();
});
};
var _walletStatusHash = function(walletStatus) { var _walletStatusHash = function(walletStatus) {
var bal; var bal;
@ -323,6 +279,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r
return bal; return bal;
}; };
// TODO move this to wallet service
self.updateAll = function(opts, initStatusHash, tries) { self.updateAll = function(opts, initStatusHash, tries) {
$scope.$broadcast('scroll.refreshComplete'); $scope.$broadcast('scroll.refreshComplete');
tries = tries || 0; tries = tries || 0;
@ -1091,14 +1048,6 @@ angular.module('copayApp.controllers').controller('indexController', function($r
}); });
}; };
self.setUxLanguage = function(cb) {
uxLanguage.update(function(lang) {
var userLang = lang;
self.defaultLanguageIsoCode = userLang;
self.defaultLanguageName = uxLanguage.getName(userLang);
if (cb) return cb();
});
};
self.initGlidera = function(accessToken) { self.initGlidera = function(accessToken) {
self.glideraEnabled = configService.getSync().glidera.enabled; self.glideraEnabled = configService.getSync().glidera.enabled;
@ -1509,24 +1458,6 @@ angular.module('copayApp.controllers').controller('indexController', function($r
self.updateAll(); self.updateAll();
}); });
$rootScope.$on('Local/ProfileBound', function() {
storageService.getRemotePrefsStoredFlag(function(err, val) {
if (err || val) return;
self.updateRemotePreferences({}, function() {
$log.debug('Remote preferences saved');
storageService.setRemotePrefsStoredFlag(function() {});
});
});
});
$rootScope.$on('Local/LanguageSettingUpdated', function() {
self.setUxLanguage(function() {
self.updateRemotePreferences({}, function() {
$log.debug('Remote preferences saved')
});
});
});
$rootScope.$on('Local/GlideraUpdated', function(event, accessToken) { $rootScope.$on('Local/GlideraUpdated', function(event, accessToken) {
self.initGlidera(accessToken); self.initGlidera(accessToken);
}); });
@ -1553,18 +1484,6 @@ angular.module('copayApp.controllers').controller('indexController', function($r
self.updateAll({ self.updateAll({
triggerTxUpdate: true, triggerTxUpdate: true,
}); });
self.updateRemotePreferences({}, function() {
$log.debug('Remote preferences saved')
});
});
$rootScope.$on('Local/EmailSettingUpdated', function(event, client, email, cb) {
self.updateRemotePreferences({
client: client,
preferences: {
email: email || null
},
}, cb);
}); });
$rootScope.$on('Local/WalletCompleted', function(event, walletId) { $rootScope.$on('Local/WalletCompleted', function(event, walletId) {
@ -1576,17 +1495,6 @@ angular.module('copayApp.controllers').controller('indexController', function($r
} }
}); });
lodash.each(['Local/ProfileCreated', 'Local/WalletListUpdated'], function(eventName) {
$rootScope.$on(eventName, function(event, client) {
self.updateRemotePreferences({
client: client
}, function() {
$log.debug('Remote preferences saved');
});
});
});
self.debouncedUpdate = lodash.throttle(function() { self.debouncedUpdate = lodash.throttle(function() {
self.updateAll({ self.updateAll({
quiet: true quiet: true
@ -1740,14 +1648,13 @@ angular.module('copayApp.controllers').controller('indexController', function($r
}); });
$rootScope.$on('Local/NoWallets', function(event) { $rootScope.$on('Local/NoWallets', function(event) {
$log.debug('Event: NoWallets');
$timeout(function() { $timeout(function() {
self.hasProfile = true; self.hasProfile = true;
self.noFocusedWallet = true; self.noFocusedWallet = true;
self.isComplete = null; self.isComplete = null;
self.walletName = null; self.walletName = null;
self.setUxLanguage(); uxLanguage.update();
profileService.isDisclaimerAccepted(function(v) { profileService.isDisclaimerAccepted(function(v) {
if (v) { if (v) {
go.path('import'); go.path('import');
@ -1757,7 +1664,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r
}); });
$rootScope.$on('Local/NewFocusedWallet', function() { $rootScope.$on('Local/NewFocusedWallet', function() {
self.setUxLanguage(); uxLanguage.update();
self.setFocusedWallet(); self.setFocusedWallet();
self.updateHistory(); self.updateHistory();
storageService.getCleanAndScanAddresses(function(err, walletId) { storageService.getCleanAndScanAddresses(function(err, walletId) {
@ -1866,6 +1773,10 @@ angular.module('copayApp.controllers').controller('indexController', function($r
}); });
$rootScope.$on('Local/EmailUpdated', function(event, email) {
self.preferences.email = email
});
lodash.each(['NewCopayer', 'CopayerUpdated'], function(eventName) { lodash.each(['NewCopayer', 'CopayerUpdated'], function(eventName) {
$rootScope.$on(eventName, function() { $rootScope.$on(eventName, function() {
// Re try to open wallet (will triggers) // Re try to open wallet (will triggers)

View file

@ -1,6 +1,6 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('addressbookController', function($rootScope, $scope, $timeout, profileService, walletService, addressService, addressbookService) { angular.module('copayApp.controllers').controller('addressbookController', function($rootScope, $scope, $timeout, profileService, addressService, addressbookService) {
var self = $scope.self; var self = $scope.self;
var fc = profileService.focusedClient; var fc = profileService.focusedClient;
@ -118,7 +118,7 @@ angular.module('copayApp.controllers').controller('addressbookController', funct
var client = profileService.getClient(walletId); var client = profileService.getClient(walletId);
$scope.errorSelectedWallet = {}; $scope.errorSelectedWallet = {};
walletService.isReady(client, function(err) { profileService.isReady(client, function(err) {
if (err) $scope.errorSelectedWallet[walletId] = err; if (err) $scope.errorSelectedWallet[walletId] = err;
else { else {
$scope.gettingAddress = true; $scope.gettingAddress = true;

View file

@ -3,15 +3,20 @@
angular.module('copayApp.controllers').controller('preferencesController', angular.module('copayApp.controllers').controller('preferencesController',
function($scope, $rootScope, $timeout, $log, configService, profileService, fingerprintService, walletService) { function($scope, $rootScope, $timeout, $log, configService, profileService, fingerprintService, walletService) {
var fc = profileService.focusedClient; var self = this;
var fc;
var config = configService.getSync(); var config = configService.getSync();
$scope.deleted = false;
if (fc.credentials && !fc.credentials.mnemonicEncrypted && !fc.credentials.mnemonic) { var disableFocusListener = $rootScope.$on('Local/NewFocusedWalletReady', function() {
$scope.deleted = true; self.init();
} });
$scope.$on('$destroy', function() {
disableFocusListener();
});
this.init = function() { this.init = function() {
fc = profileService.focusedClient;
if (fc) { if (fc) {
$scope.encryptEnabled = walletService.isEncrypted(fc); $scope.encryptEnabled = walletService.isEncrypted(fc);
this.externalSource = fc.getPrivKeyExternalSourceName() == 'ledger' ? "Ledger" : null; this.externalSource = fc.getPrivKeyExternalSourceName() == 'ledger' ? "Ledger" : null;
@ -21,38 +26,69 @@ angular.module('copayApp.controllers').controller('preferencesController',
this.touchidAvailable = fingerprintService.isAvailable(); this.touchidAvailable = fingerprintService.isAvailable();
$scope.touchidEnabled = config.touchIdFor ? config.touchIdFor[fc.credentials.walletId] : null; $scope.touchidEnabled = config.touchIdFor ? config.touchIdFor[fc.credentials.walletId] : null;
$scope.deleted = false;
if (fc.credentials && !fc.credentials.mnemonicEncrypted && !fc.credentials.mnemonic) {
$scope.deleted = true;
}
}; };
var handleEncryptedWallet = function(client, cb) { var handleEncryptedWallet = function(cb) {
$rootScope.$emit('Local/NeedsPassword', false, function(err, password) { $rootScope.$emit('Local/NeedsPassword', false, function(err, password) {
if (err) return cb(err); if (err) return cb(err);
return cb(walletService.unlock(client, password)); return cb(walletService.unlock(fc, password));
}); });
}; };
$scope.encryptChange = function() { $scope.encryptChange = function() {
var self = this;
if (!fc) return; if (!fc) return;
var val = $scope.encryptEnabled; var val = $scope.encryptEnabled;
var setPrivateKeyEncryption = function(password, cb) {
$log.debug('Encrypting private key for', fc.credentials.walletName);
fc.setPrivateKeyEncryption(password);
fc.lock();
profileService.updateCredentials(fc.export(), function() {
$log.debug('Wallet encrypted');
return cb();
});
};
var disablePrivateKeyEncryption = function(cb) {
$log.debug('Disabling private key encryption for', fc.credentials.walletName);
try {
fc.disablePrivateKeyEncryption();
} catch (e) {
return cb(e);
}
profileService.updateCredentials(fc.export(), function() {
$log.debug('Wallet encryption disabled');
return cb();
});
};
if (val && !walletService.isEncrypted(fc)) { if (val && !walletService.isEncrypted(fc)) {
$rootScope.$emit('Local/NeedsPassword', true, function(err, password) { $rootScope.$emit('Local/NeedsPassword', true, function(err, password) {
if (err || !password) { if (err || !password) {
$scope.encryptEnabled = false; $scope.encryptEnabled = false;
return; return;
} }
profileService.setPrivateKeyEncryptionFC(password, function() { setPrivateKeyEncryption(password, function() {
$rootScope.$emit('Local/NewEncryptionSetting'); $rootScope.$emit('Local/NewEncryptionSetting');
$scope.encryptEnabled = true; $scope.encryptEnabled = true;
}); });
}); });
} else { } else {
if (!val && walletService.isEncrypted(fc)) { if (!val && walletService.isEncrypted(fc)) {
handleEncryptedWallet(fc, function(err) { handleEncryptedWallet(function(err) {
if (err) { if (err) {
$scope.encryptEnabled = true; $scope.encryptEnabled = true;
return; return;
} }
profileService.disablePrivateKeyEncryptionFC(function(err) { disablePrivateKeyEncryption(function(err) {
$rootScope.$emit('Local/NewEncryptionSetting'); $rootScope.$emit('Local/NewEncryptionSetting');
if (err) { if (err) {
$scope.encryptEnabled = true; $scope.encryptEnabled = true;

View file

@ -1,7 +1,7 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('preferencesAltCurrencyController', angular.module('copayApp.controllers').controller('preferencesAltCurrencyController',
function($scope, $timeout, $log, configService, rateService, lodash, go) { function($scope, $timeout, $log, configService, rateService, lodash, go, profileService, walletService) {
this.hideAdv = true; this.hideAdv = true;
this.hidePriv = true; this.hidePriv = true;
this.hideSecret = true; this.hideSecret = true;
@ -51,6 +51,9 @@ angular.module('copayApp.controllers').controller('preferencesAltCurrencyControl
if (err) $log.warn(err); if (err) $log.warn(err);
go.preferencesGlobal(); go.preferencesGlobal();
$scope.$emit('Local/UnitSettingUpdated'); $scope.$emit('Local/UnitSettingUpdated');
walletService.updateRemotePreferences(profileService.walletClients, {}, function() {
$log.debug('Remote preferences saved')
});
$timeout(function() { $timeout(function() {
$scope.$apply(); $scope.$apply();
}, 100); }, 100);

View file

@ -13,7 +13,7 @@ angular.module('copayApp.controllers').controller('preferencesDeleteWordsControl
confirmDialog.show(msg, function(ok) { confirmDialog.show(msg, function(ok) {
if (ok) { if (ok) {
fc.clearMnemonic(); fc.clearMnemonic();
profileService.updateCredentialsFC(function() { profileService.updateCredentials(fc.export(), function() {
notification.success(successMsg); notification.success(successMsg);
go.walletHome(); go.walletHome();
}); });

View file

@ -1,14 +1,22 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('preferencesEmailController', angular.module('copayApp.controllers').controller('preferencesEmailController',
function($scope, go, profileService, gettext, $log) { function($rootScope, go, profileService, gettext, $log, walletService) {
this.save = function(form) { this.save = function(form) {
var self = this; var self = this;
this.error = null; this.error = null;
var fc = profileService.focusedClient; var fc = profileService.focusedClient;
this.saving = true; this.saving = true;
$scope.$emit('Local/EmailSettingUpdated', fc,self.email, function() { var email = self.email || '';
walletService.updateRemotePreferences(fc, {
email: email,
}, function(err) {
if (!err)
$rootScope.$emit('Local/EmailUpdated', email);
self.saving = false; self.saving = false;
go.path('preferences'); go.path('preferences');
}); });

View file

@ -1,7 +1,7 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('preferencesLanguageController', angular.module('copayApp.controllers').controller('preferencesLanguageController',
function($scope, $log, $timeout, configService, uxLanguage, go) { function($scope, $log, $timeout, configService, profileService, uxLanguage, walletService, go) {
this.availableLanguages = uxLanguage.getLanguages(); this.availableLanguages = uxLanguage.getLanguages();
this.currentLanguage = uxLanguage.getCurrentLanguage(); this.currentLanguage = uxLanguage.getCurrentLanguage();
@ -19,10 +19,18 @@ angular.module('copayApp.controllers').controller('preferencesLanguageController
configService.set(opts, function(err) { configService.set(opts, function(err) {
if (err) $log.warn(err); if (err) $log.warn(err);
go.preferencesGlobal(); go.preferencesGlobal();
$scope.$emit('Local/LanguageSettingUpdated');
$timeout(function() {
$scope.$apply(); uxLanguage.update(function() {
}, 100); $timeout(function() {
$scope.$apply();
}, 100);
walletService.updateRemotePreferences(profileService.getClients(), {},
function() {
$log.debug('Remote preferences saved')
});
});
}); });
}; };
}); });

View file

@ -1,7 +1,7 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('preferencesUnitController', angular.module('copayApp.controllers').controller('preferencesUnitController',
function($scope, $timeout, $log, configService, go) { function($scope, $timeout, $log, configService, go, walletService, profileService) {
var config = configService.getSync(); var config = configService.getSync();
this.unitName = config.wallet.settings.unitName; this.unitName = config.wallet.settings.unitName;
this.unitOpts = [ this.unitOpts = [
@ -54,6 +54,9 @@ angular.module('copayApp.controllers').controller('preferencesUnitController',
if (err) $log.warn(err); if (err) $log.warn(err);
go.preferencesGlobal(); go.preferencesGlobal();
$scope.$emit('Local/UnitSettingUpdated'); $scope.$emit('Local/UnitSettingUpdated');
walletService.updateRemotePreferences(profileService.getClients(), {}, function() {
$log.debug('Remote preferences saved')
});
$timeout(function() { $timeout(function() {
$scope.$apply(); $scope.$apply();
}, 100); }, 100);

View file

@ -27,7 +27,7 @@ Profile.fromObj = function(obj) {
x.credentials = obj.credentials; x.credentials = obj.credentials;
x.disclaimerAccepted = obj.disclaimerAccepted; x.disclaimerAccepted = obj.disclaimerAccepted;
x.checked = obj.checked || {}; x.checked = obj.checked || {};
x.checkedUA = null; x.checkedUA = obj.checkedUA || {};
if (x.credentials[0] && typeof x.credentials[0] != 'object') if (x.credentials[0] && typeof x.credentials[0] != 'object')
throw ("credentials should be an object"); throw ("credentials should be an object");
@ -40,6 +40,7 @@ Profile.fromString = function(str) {
}; };
Profile.prototype.toObj = function() { Profile.prototype.toObj = function() {
delete this.dirty;
return JSON.stringify(this); return JSON.stringify(this);
}; };
@ -53,7 +54,7 @@ Profile.prototype.hasWallet = function(walletId) {
}; };
Profile.prototype.isChecked = function(ua, walletId) { Profile.prototype.isChecked = function(ua, walletId) {
return this.checkedUA == ua && this.checked[walletId]; return !!(this.checkedUA == ua && this.checked[walletId]);
}; };
Profile.prototype.setChecked = function(ua, walletId) { Profile.prototype.setChecked = function(ua, walletId) {
@ -62,6 +63,7 @@ Profile.prototype.setChecked = function(ua, walletId) {
this.checked = {}; this.checked = {};
} }
this.checked[walletId] = true; this.checked[walletId] = true;
this.dirty = true;
}; };
@ -70,6 +72,20 @@ Profile.prototype.addWallet = function(credentials) {
return false; return false;
this.credentials.push(credentials); this.credentials.push(credentials);
this.dirty = true;
return true;
};
Profile.prototype.updateWallet = function(credentials) {
if (!this.hasWallet(credentials.walletId))
return false;
this.credentials = this.credentials.filter(function(c) {
return c.walletId != walletId;
});
this.addWallet(credentials);
this.dirty = true;
return true; return true;
}; };
@ -81,5 +97,6 @@ Profile.prototype.deleteWallet = function(walletId) {
return c.walletId != walletId; return c.walletId != walletId;
}); });
this.dirty = true;
return true; return true;
}; };

View file

@ -632,6 +632,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
throw new Error(err); // TODO throw new Error(err); // TODO
} }
} else { } else {
profileService.storeProfileIfDirty();
$log.debug('Profile loaded ... Starting UX.'); $log.debug('Profile loaded ... Starting UX.');
$state.transitionTo(toState.name || toState, toParams); $state.transitionTo(toState.name || toState, toParams);
} }

View file

@ -1,6 +1,6 @@
'use strict'; 'use strict';
angular.module('copayApp.services') angular.module('copayApp.services')
.factory('profileService', function profileServiceFactory($rootScope, $timeout, $filter, $log, sjcl, lodash, storageService, bwcService, configService, notificationService, pushNotificationsService, gettext, gettextCatalog, bwsError, uxLanguage, bitcore, platformInfo) { .factory('profileService', function profileServiceFactory($rootScope, $timeout, $filter, $log, sjcl, lodash, storageService, bwcService, configService, notificationService, pushNotificationsService, gettext, gettextCatalog, bwsError, uxLanguage, bitcore, platformInfo, walletService) {
var isChromeApp = platformInfo.isChromeApp; var isChromeApp = platformInfo.isChromeApp;
@ -67,8 +67,7 @@ angular.module('copayApp.services')
var opts = opts || {}; var opts = opts || {};
var walletId = client.credentials.walletId; var walletId = client.credentials.walletId;
if ((root.walletClients[walletId] && root.walletClients[walletId].started) if ((root.walletClients[walletId] && root.walletClients[walletId].started) || opts.force) {
|| opts.force) {
return false; return false;
} }
@ -81,7 +80,6 @@ angular.module('copayApp.services')
storageService.clearLastAddress(walletId, function() {}); storageService.clearLastAddress(walletId, function() {});
} }
client.removeAllListeners(); client.removeAllListeners();
client.on('report', function(n) { client.on('report', function(n) {
$log.info('BWC Report:' + n); $log.info('BWC Report:' + n);
@ -102,7 +100,7 @@ angular.module('copayApp.services')
client.on('walletCompleted', function() { client.on('walletCompleted', function() {
$log.debug('Wallet completed'); $log.debug('Wallet completed');
root.updateCredentialsFC(function() { root.updateCredentials(client.export(), function() {
$rootScope.$emit('Local/WalletCompleted', walletId); $rootScope.$emit('Local/WalletCompleted', walletId);
}); });
}); });
@ -165,7 +163,6 @@ angular.module('copayApp.services')
storageService.getFocusedWalletId(function(err, focusedWalletId) { storageService.getFocusedWalletId(function(err, focusedWalletId) {
if (err) return cb(err); if (err) return cb(err);
root._setFocus(focusedWalletId, function() { root._setFocus(focusedWalletId, function() {
$rootScope.$emit('Local/ProfileBound');
if (usePushNotifications) if (usePushNotifications)
root.pushNotificationsInit(); root.pushNotificationsInit();
root.isDisclaimerAccepted(function(val) { root.isDisclaimerAccepted(function(val) {
@ -433,6 +430,7 @@ angular.module('copayApp.services')
}); });
} }
// Adds and bind a new client to the profile
root.addAndBindWalletClient = function(client, opts, cb) { root.addAndBindWalletClient = function(client, opts, cb) {
var walletId = client.credentials.walletId var walletId = client.credentials.walletId
@ -443,12 +441,14 @@ angular.module('copayApp.services')
$rootScope.$emit('Local/WalletListUpdated', client); $rootScope.$emit('Local/WalletListUpdated', client);
var saveBwsUrl = function(cb) { var saveBwsUrl = function(cb) {
if (!opts.bwsurl) return cb();
var config = configService.getSync();
var defaults = configService.getDefaults(); var defaults = configService.getDefaults();
var bwsFor = {}; var bwsFor = {};
bwsFor[walletId] = opts.bwsurl || defaults.bws.url; bwsFor[walletId] = opts.bwsurl || defaults.bws.url;
// Dont save the default
if (bwsFor[walletId] == defaults.bws.url)
return cb();
configService.set({ configService.set({
bwsFor: bwsFor, bwsFor: bwsFor,
}, function(err) { }, function(err) {
@ -467,11 +467,16 @@ angular.module('copayApp.services')
storageService.setCleanAndScanAddresses(walletId, cb); storageService.setCleanAndScanAddresses(walletId, cb);
}; };
walletService.updateRemotePreferences(client, {}, function() {
$log.debug('Remote preferences saved for:' + walletId)
});
saveBwsUrl(function() { saveBwsUrl(function() {
handleImportedClient(function() { handleImportedClient(function() {
root.setAndStoreFocus(walletId, function() { root.setAndStoreFocus(walletId, function() {
storageService.storeProfile(root.profile, function(err) { storageService.storeProfile(root.profile, function(err) {
var config = configService.getSync();
if (config.pushNotifications.enabled) if (config.pushNotifications.enabled)
pushNotificationsService.enableNotifications(root.walletClients); pushNotificationsService.enableNotifications(root.walletClients);
return cb(err, walletId); return cb(err, walletId);
@ -482,6 +487,17 @@ angular.module('copayApp.services')
}); });
}; };
root.storeProfileIfDirty = function(cb) {
if (root.profile.dirty) {
storageService.storeProfile(root.profile, function(err) {
$log.debug('Saved modified Profile');
if (cb) return cb(err);
});
} else {
if (cb) return cb();
};
};
root.importWallet = function(str, opts, cb) { root.importWallet = function(str, opts, cb) {
var walletClient = bwcService.getClient(null, opts); var walletClient = bwcService.getClient(null, opts);
@ -642,44 +658,34 @@ angular.module('copayApp.services')
}); });
}; };
// TODO root.updateCredentials = function(credentials, cb) {
root.updateCredentialsFC = function(cb) { root.profile.updateWallet(credentials);
var fc = root.focusedClient;
var newCredentials = lodash.reject(root.profile.credentials, {
walletId: fc.credentials.walletId
});
newCredentials.push(JSON.parse(fc.export()));
root.profile.credentials = newCredentials;
storageService.storeProfileThrottled(root.profile, cb); storageService.storeProfileThrottled(root.profile, cb);
}; };
root.getClients = function() {
return lodash.values(root.walletClients);
};
root.setPrivateKeyEncryptionFC = function(password, cb) { root.needsBackup = function(client, cb) {
var fc = root.focusedClient;
$log.debug('Encrypting private key for', fc.credentials.walletName);
fc.setPrivateKeyEncryption(password); if (!walletService.needsBackup(client))
fc.lock(); return cb(false);
root.updateCredentialsFC(function() {
$log.debug('Wallet encrypted'); storageService.getBackupFlag(client.credentials.walletId, function(err, val) {
return cb(); if (err) $log.error(err);
if (val) return cb(false);
return cb(true);
}); });
}; };
root.isReady = function(client, cb) {
if (!client.isComplete())
return cb('WALLET_NOT_COMPLETE');
root.disablePrivateKeyEncryptionFC = function(cb) { root.needsBackup(client, function(needsBackup) {
var fc = root.focusedClient; if (needsBackup)
$log.debug('Disabling private key encryption for', fc.credentials.walletName); return cb('WALLET_NEEDS_BACKUP');
try {
fc.disablePrivateKeyEncryption();
} catch (e) {
return cb(e);
}
root.updateCredentialsFC(function() {
$log.debug('Wallet encryption disabled');
return cb(); return cb();
}); });
}; };

View file

@ -3,6 +3,8 @@ angular.module('copayApp.services')
.factory('uxLanguage', function languageService($log, lodash, gettextCatalog, amMoment, configService) { .factory('uxLanguage', function languageService($log, lodash, gettextCatalog, amMoment, configService) {
var root = {}; var root = {};
root.currentLanguage = null;
root.availableLanguages = [{ root.availableLanguages = [{
name: 'English', name: 'English',
isoCode: 'en', isoCode: 'en',
@ -33,7 +35,6 @@ angular.module('copayApp.services')
isoCode: 'ru', isoCode: 'ru',
}]; }];
root.currentLanguage = null;
root._detect = function(cb) { root._detect = function(cb) {
@ -99,20 +100,20 @@ angular.module('copayApp.services')
var userLang = configService.getSync().wallet.settings.defaultLanguage; var userLang = configService.getSync().wallet.settings.defaultLanguage;
if (!userLang) { if (!userLang) {
root._detect(function(lang) { root._detect(function(lang) {
userLang = lang; userLang = lang;
if (userLang != root.currentLanguage) { if (userLang != root.currentLanguage) {
root._set(lang); root._set(lang);
} }
return cb(userLang); if (cb) return cb(userLang);
}); });
} else { } else {
if (userLang != root.currentLanguage) { if (userLang != root.currentLanguage) {
root._set(userLang); root._set(userLang);
} }
return cb(userLang);
if (cb) return cb(userLang);
} }
}; };

View file

@ -1,6 +1,9 @@
'use strict'; 'use strict';
angular.module('copayApp.services').factory('walletService', function($log, lodash, trezor, ledger, storageService) { // DO NOT INCLUDE STORAGE HERE \/ \/
angular.module('copayApp.services').factory('walletService', function($log, lodash, trezor, ledger, storageService, configService, uxLanguage) {
// DO NOT INCLUDE STORAGE HERE ^^
var root = {}; var root = {};
var _signWithLedger = function(client, txp, cb) { var _signWithLedger = function(client, txp, cb) {
@ -31,27 +34,14 @@ angular.module('copayApp.services').factory('walletService', function($log, loda
}); });
}; };
root.isBackupNeeded = function(client, cb) { root.needsBackup = function(client) {
if (client.isPrivKeyExternal()) return cb(false); if (client.isPrivKeyExternal()) return false;
if (!client.credentials.mnemonic) return cb(false); if (!client.credentials.mnemonic) return false;
if (client.credentials.network == 'testnet') return cb(false); if (client.credentials.network == 'testnet') return false;
storageService.getBackupFlag(client.credentials.walletId, function(err, val) { return true;
if (err) $log.error(err);
if (val) return cb(false);
return cb(true);
});
}; };
root.isReady = function(client, cb) {
if(!client.isComplete())
return cb('WALLET_NOT_COMPLETE');
root.isBackupNeeded(client, function(needsBackup) {
if (needsBackup)
return cb('WALLET_NEEDS_BACKUP');
return cb();
});
};
root.isEncrypted = function(client) { root.isEncrypted = function(client) {
if (lodash.isEmpty(client)) return; if (lodash.isEmpty(client)) return;
@ -121,7 +111,9 @@ angular.module('copayApp.services').factory('walletService', function($log, loda
if (lodash.isEmpty(txp) || lodash.isEmpty(client)) if (lodash.isEmpty(txp) || lodash.isEmpty(client))
return cb('MISSING_PARAMETER'); return cb('MISSING_PARAMETER');
client.publishTxProposal({txp: txp}, function(err, publishedTx) { client.publishTxProposal({
txp: txp
}, function(err, publishedTx) {
if (err) return cb(err); if (err) return cb(err);
else { else {
$log.debug('Transaction published'); $log.debug('Transaction published');
@ -197,5 +189,41 @@ angular.module('copayApp.services').factory('walletService', function($log, loda
}); });
}; };
root.updateRemotePreferences = function(clients, prefs, cb) {
prefs = prefs || {};
if (!lodash.isArray(clients))
clients = [clients];
function updateRemotePreferencesFor(clients, prefs, cb) {
var client = clients.shift();
if (!client) return cb();
$log.debug('Saving remote preferences', client.credentials.walletName, prefs);
client.savePreferences(prefs, function(err) {
// we ignore errors here
if (err) $log.warn(err);
updateRemotePreferencesFor(clients, prefs, cb);
});
};
// Update this JIC.
var config = configService.getSync().wallet.settings;
//prefs.email (may come from arguments)
prefs.language = uxLanguage.getCurrentLanguage();;
prefs.unit = config.unitCode;
updateRemotePreferencesFor(clients, prefs, function(err) {
if (err) return cb(err);
lodash.each(clients, function(c) {
c.preferences = lodash.assign(prefs, c.preferences);
});
return cb();
});
};
return root; return root;
}); });