+
+ send to my wallets
+
+
+
diff --git a/src/css/mobile.css b/src/css/mobile.css
index 352972395..165843b02 100644
--- a/src/css/mobile.css
+++ b/src/css/mobile.css
@@ -285,7 +285,7 @@ a.missing-copayers {
background-color: #122232;
}
-.sidebar .avatar-wallet, .payment-uri .avatar-wallet {
+.sidebar .avatar-wallet, .payment-uri .avatar-wallet, .modal-content .avatar-wallet {
background-color: #2C3E50;
color: #fff;
font-size: 20px;
diff --git a/src/js/controllers/index.js b/src/js/controllers/index.js
index f6ec8aea5..39e9ce28d 100644
--- a/src/js/controllers/index.js
+++ b/src/js/controllers/index.js
@@ -1,6 +1,6 @@
'use strict';
-angular.module('copayApp.controllers').controller('indexController', function($rootScope, $scope, $log, $filter, $timeout, lodash, go, profileService, configService, isCordova, rateService, storageService, gettextCatalog, gettext, amMoment) {
+angular.module('copayApp.controllers').controller('indexController', function($rootScope, $scope, $log, $filter, $timeout, lodash, go, profileService, configService, isCordova, rateService, storageService, addressService, gettextCatalog, gettext, amMoment) {
var self = this;
self.isCordova = isCordova;
@@ -237,6 +237,9 @@ angular.module('copayApp.controllers').controller('indexController', function($r
self.copayers = walletStatus.wallet.copayers;
self.preferences = walletStatus.preferences;
self.setBalance(walletStatus.balance);
+ self.otherWallets = lodash.filter(profileService.getWallets(self.network), function(w) {
+ return w.id != self.walletId;
+ });;
$rootScope.$apply();
});
});
@@ -463,7 +466,12 @@ angular.module('copayApp.controllers').controller('indexController', function($r
self.alternativeIsoCode = config.alternativeIsoCode;
// Check address
- self.checkLastAddress(balance.byAddress);
+ addressService.isUsed(self.walletId, balance.byAddress, function(err, used){
+ if (used) {
+ $log.debug('Address used. Creating new');
+ $rootScope.$emit('Local/NeedNewAddress');
+ }
+ });
rateService.whenAvailable(function() {
@@ -487,20 +495,6 @@ angular.module('copayApp.controllers').controller('indexController', function($r
}
};
- self.checkLastAddress = function(byAddress, cb) {
- storageService.getLastAddress(self.walletId, function(err, addr) {
- var used = lodash.find(byAddress, {
- address: addr
- });
- if (used) {
- $log.debug('Address ' + addr + ' was used. Cleaning Cache.')
- storageService.clearLastAddress(self.walletId, function(err) {
- $rootScope.$emit('Local/NeedNewAddress', err);
- if (cb) return cb();
- });
- };
- });
- };
self.clientError = function(err) {
if (isCordova) {
@@ -728,7 +722,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r
$rootScope.$on('Local/WalletImported', function(event, walletId) {
self.needsBackup = false;
storageService.setBackupFlag(walletId, function() {
- storageService.clearLastAddress(walletId, function(err) {
+ addressService.expireAddress(walletId, function(err) {
self.startScan(walletId);
});
});
@@ -791,7 +785,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r
if (val) {
$log.debug('Clear last address cache and Scan');
lodash.each(lodash.keys(profileService.walletClients), function(walletId) {
- storageService.clearLastAddress(walletId, function(err) {
+ addressService.expireAddress(walletId, function(err) {
self.startScan(walletId);
});
});
diff --git a/src/js/controllers/paymentUri.js b/src/js/controllers/paymentUri.js
index 831c5c791..9d88f35eb 100644
--- a/src/js/controllers/paymentUri.js
+++ b/src/js/controllers/paymentUri.js
@@ -38,24 +38,7 @@ angular.module('copayApp.controllers').controller('paymentUriController',
};
this.getWallets = function(network) {
- if (!profileService.profile) return;
- var config = configService.getSync();
- config.colorFor = config.colorFor || {};
- config.aliasFor = config.aliasFor || {};
- var ret = lodash.map(profileService.profile.credentials, function(c) {
- return {
- m: c.m,
- n: c.n,
- name: config.aliasFor[c.walletId] || c.walletName,
- id: c.walletId,
- network: c.network,
- color: config.colorFor[c.walletId] || '#2C3E50'
- };
- });
- ret = lodash.filter(ret, function(w) {
- return (w.network == network);
- });
- return lodash.sortBy(ret, 'name');
+ return profileService.getWallets(network);
};
this.selectWallet = function(wid) {
diff --git a/src/js/controllers/walletHome.js b/src/js/controllers/walletHome.js
index 3c7e0206e..86aa52c4f 100644
--- a/src/js/controllers/walletHome.js
+++ b/src/js/controllers/walletHome.js
@@ -1,6 +1,6 @@
'use strict';
-angular.module('copayApp.controllers').controller('walletHomeController', function($scope, $rootScope, $timeout, $filter, $modal, $log, notification, txStatus, isCordova, profileService, lodash, configService, rateService, storageService, bitcore, isChromeApp, gettext, gettextCatalog, nodeWebkit) {
+angular.module('copayApp.controllers').controller('walletHomeController', function($scope, $rootScope, $timeout, $filter, $modal, $log, notification, txStatus, isCordova, profileService, lodash, configService, rateService, storageService, bitcore, isChromeApp, gettext, gettextCatalog, nodeWebkit, addressService) {
var self = this;
$rootScope.hideMenuBar = false;
@@ -38,7 +38,7 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi
});
var disableAddrListener = $rootScope.$on('Local/NeedNewAddress', function() {
- self.setNewAddress();
+ self.setAddress(true);
});
var disableFocusListener = $rootScope.$on('Local/NewFocusedWallet', function() {
@@ -90,6 +90,8 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi
var parseError = function(err) {
+ if (!err) return;
+
if (err.message) {
// TODO : this is not used anymore?
if (err.message.indexOf('CORS') >= 0) {
@@ -125,6 +127,52 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi
});
};
+
+ $scope.openWalletsModal = function(wallets) {
+
+ var ModalInstanceCtrl = function($scope, $modalInstance) {
+ $scope.wallets = wallets;
+ $scope.cancel = function() {
+ $modalInstance.dismiss('cancel');
+ };
+
+ $scope.selectWallet = function(walletId, walletName) {
+ $scope.gettingAddress=true;
+ $scope.selectedWalletName=walletName;
+ $timeout(function(){
+ $scope.$apply();
+ });
+ addressService.getAddress(walletId, false, function(err,addr) {
+ $scope.gettingAddress=false;
+ if (!err || addr)
+ $modalInstance.close(addr);
+ else {
+ parseError(err);
+ self.error = err;
+ $modalInstance.dismiss('cancel');
+ }
+ });
+ };
+ };
+
+ var modalInstance = $modal.open({
+ templateUrl: 'views/modals/wallets.html',
+ windowClass: 'full animated slideInUp',
+ controller: ModalInstanceCtrl,
+ });
+
+ modalInstance.result.finally(function() {
+ var m = angular.element(document.getElementsByClassName('reveal-modal'));
+ m.addClass('slideOutDown');
+ });
+
+ modalInstance.result.then(function(addr) {
+ if (addr) {
+ self.setForm(addr);
+ }
+ });
+ };
+
this.openTxpModal = function(tx, copayers) {
var fc = profileService.focusedClient;
var refreshUntilItChanges = false;
@@ -339,56 +387,31 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi
};
- // Receive
- this.setNewAddress = function() {
- var fc = profileService.focusedClient;
- self.generatingAddress = true;
- self.addrError = null;
- fc.createAddress(function(err, addr) {
- self.generatingAddress = false;
- if (err) {
- if (err.error && err.error.match(/locked/gi)) {
- $log.debug(err.error);
- $timeout(function() {
- self.setNewAddress();
- }, 5000);
- } else {
- $log.debug('Creating address ERROR:', err);
- parseError(err);
- self.addrError = err.message || gettext('Could not create address. Check you connection and try again');
- $scope.$digest();
- }
- return;
- }
- self.addrError = null;
- self.addr[fc.credentials.walletId] = addr.address;
- storageService.storeLastAddress(fc.credentials.walletId, addr.address, function() {
-
- self.generatingAddress = false;
- $scope.$digest();
- });
- });
- };
-
- this.setAddress = function() {
+ this.setAddress = function(forceNew) {
self.addrError = null;
var fc = profileService.focusedClient;
if (!fc)
return;
- if (self.addr[fc.credentials.walletId]) {
+ // Address already set?
+ if (!forceNew && self.addr[fc.credentials.walletId]) {
return;
}
-
+ self.generatingAddress = true;
$timeout(function() {
- storageService.getLastAddress(fc.credentials.walletId, function(err, addr) {
- if (addr) {
- self.addr[fc.credentials.walletId] = addr;
- $scope.$digest();
- } else {
- self.setNewAddress();
+ addressService.getAddress(fc.credentials.walletId, forceNew, function(err,addr){
+ self.generatingAddress = false;
+
+ if (err) {
+ parseError(err);
+ self.addrError = err.message || gettext('Could not create address. Check you connection and try again');
}
+
+ if (addr)
+ self.addr[fc.credentials.walletId] = addr;
+
+ $scope.$digest();
});
});
};
@@ -1028,6 +1051,7 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi
}
}
+ /* Start setup */
this.bindTouchDown();
this.setAddress();
diff --git a/src/js/init.js b/src/js/init.js
index a0070e3f7..75e113534 100644
--- a/src/js/init.js
+++ b/src/js/init.js
@@ -6,6 +6,15 @@ angular.element(document).ready(function() {
var startAngular = function() {
angular.bootstrap(document, ['copayApp']);
};
+
+ var handleBitcoinURI = function(url) {
+ if (!url) return;
+ setTimeout(function() {
+ window.location = '#/uri-payment/' + url;
+ }, 1000);
+ };
+
+
/* Cordova specific Init */
if (window.cordova !== undefined) {
@@ -37,8 +46,7 @@ angular.element(document).ready(function() {
var loc = window.location;
if (loc.toString().match(/index\.html#\/$/)) {
navigator.app.exitApp();
- }
- else {
+ } else {
window.location = '#/cordova/walletHome';
}
}, false);
@@ -53,13 +61,6 @@ angular.element(document).ready(function() {
navigator.splashscreen.hide();
}, 2000);
- function handleBitcoinURI(url) {
- if (!url) return;
- setTimeout(function() {
- window.location = '#/uri-payment/' + url;
- }, 1000);
- }
-
window.plugins.webintent.getUri(handleBitcoinURI);
window.plugins.webintent.onNewIntent(handleBitcoinURI);
window.handleOpenURL = handleBitcoinURI;
@@ -67,6 +68,13 @@ angular.element(document).ready(function() {
startAngular();
}, false);
} else {
+
+ try {
+ window.handleOpenURL = handleBitcoinURI;
+ window.plugins.webintent.getUri(handleBitcoinURI);
+ window.plugins.webintent.onNewIntent(handleBitcoinURI);
+ } catch (e) {}
+
startAngular();
}
diff --git a/src/js/services/addressService.js b/src/js/services/addressService.js
new file mode 100644
index 000000000..975961214
--- /dev/null
+++ b/src/js/services/addressService.js
@@ -0,0 +1,75 @@
+'use strict';
+'use strict';
+angular.module('copayApp.services')
+ .factory('addressService', function(storageService, profileService, $log, $timeout, lodash) {
+ var root = {};
+
+
+ root.expireAddress = function(walletId,cb) {
+ $log.debug('Cleaning Address ' + addr );
+ storageService.clearLastAddress(walletId, function(err) {
+ return cb(err);
+ });
+ };
+
+ root.isUsed = function(walletId, byAddress, cb) {
+ storageService.getLastAddress(walletId, function(err, addr) {
+ var used = lodash.find(byAddress, {
+ address: addr
+ });
+ return cb(null, used);
+ });
+ };
+
+ root._createAddress = function(walletId, cb) {
+ var client = profileService.getClient(walletId);
+
+ $log.debug('Creating address for wallet:', walletId);
+
+ client.createAddress(function(err, addr) {
+ if (err) {
+ if (err.error && err.error.match(/locked/gi)) {
+ $log.debug(err.error);
+ return $timeout(function() {
+ root._createAddress(walletId, cb);
+ }, 5000);
+ }
+ $log.debug('Creating address ERROR:', err);
+ return cb(err);
+ }
+ return cb(null, addr.address);
+ });
+ };
+
+ root.getAddress = function(walletId, forceNew, cb) {
+
+ var firstStep;
+ if (forceNew) {
+ firstStep = storageService.clearLastAddress;
+ } else {
+ firstStep = function(walletId, cb) {
+ return cb();
+ };
+ }
+
+ firstStep(walletId, function(err) {
+ if (err) return cb(err);
+
+ storageService.getLastAddress(walletId, function(err, addr) {
+ if (err) return cb(err);
+
+ if (addr) return cb(null, addr);
+
+ root._createAddress(walletId, function(err, addr) {
+ if (err) return cb(err);
+ storageService.storeLastAddress(walletId, addr, function() {
+ if (err) return cb(err);
+ return cb(null, addr);
+ });
+ });
+ });
+ });
+ };
+
+ return root;
+ });
diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js
index d237bf47a..956dc76ee 100644
--- a/src/js/services/profileService.js
+++ b/src/js/services/profileService.js
@@ -233,6 +233,11 @@ angular.module('copayApp.services')
})
};
+
+ root.getClient = function(walletId) {
+ return root.walletClients[walletId];
+ };
+
root.deleteWalletFC = function(opts, cb) {
var fc = root.focusedClient;
$log.debug('Deleting Wallet:', fc.credentials.walletName);
@@ -396,5 +401,29 @@ angular.module('copayApp.services')
});
};
+ root.getWallets = function(network) {
+ if (!root.profile) return [];
+
+ var config = configService.getSync();
+ config.colorFor = config.colorFor || {};
+ config.aliasFor = config.aliasFor || {};
+ var ret = lodash.map(root.profile.credentials, function(c) {
+ return {
+ m: c.m,
+ n: c.n,
+ name: config.aliasFor[c.walletId] || c.walletName,
+ id: c.walletId,
+ network: c.network,
+ color: config.colorFor[c.walletId] || '#2C3E50'
+ };
+ });
+ ret = lodash.filter(ret, function(w) {
+ return (w.network == network);
+ });
+ return lodash.sortBy(ret, 'name');
+ };
+
+
+
return root;
});