This action will remove the transaction.
diff --git a/public/views/modals/wallets.html b/public/views/modals/wallets.html
index fb33340e6..7ae41f8a3 100644
--- a/public/views/modals/wallets.html
+++ b/public/views/modals/wallets.html
@@ -11,8 +11,11 @@
-
-
+
+
+
+ {{error}}
+
@@ -34,7 +37,13 @@
ng-style="{'background-color':w.color}">
- {{w.name || w.id}}
+
+ {{w.name || w.id}}
+
+
+ {{errorSelectedWallet[w.id]}}
+
+
{{w.m}} of {{w.n}}
[Testnet]
diff --git a/public/views/sellCoinbase.html b/public/views/sellCoinbase.html
index 916aa8aee..cb1c860d4 100644
--- a/public/views/sellCoinbase.html
+++ b/public/views/sellCoinbase.html
@@ -94,7 +94,7 @@
@@ -124,7 +124,7 @@
diff --git a/src/js/controllers/buyCoinbase.js b/src/js/controllers/buyCoinbase.js
index 48115b4d7..32521ef93 100644
--- a/src/js/controllers/buyCoinbase.js
+++ b/src/js/controllers/buyCoinbase.js
@@ -5,7 +5,7 @@ angular.module('copayApp.controllers').controller('buyCoinbaseController',
var self = this;
this.init = function(testnet) {
- self.allWallets = profileService.getWallets(testnet ? 'testnet' : 'livenet', 1)
+ self.allWallets = profileService.getWallets(testnet ? 'testnet' : 'livenet');
var client = profileService.focusedClient;
if (client) {
@@ -45,8 +45,6 @@ angular.module('copayApp.controllers').controller('buyCoinbaseController',
$scope.openWalletsModal = function(wallets) {
self.error = null;
- self.selectedWalletId = null;
- self.selectedWalletName = null;
$scope.type = 'BUY';
$scope.wallets = wallets;
@@ -60,6 +58,15 @@ angular.module('copayApp.controllers').controller('buyCoinbaseController',
$scope.walletsModal = modal;
$scope.walletsModal.show();
});
+
+ $scope.$on('walletSelected', function(ev, obj) {
+ $timeout(function() {
+ self.selectedWalletId = obj.walletId;
+ self.selectedWalletName = obj.walletName;
+ $scope.$apply();
+ }, 100);
+ $scope.walletsModal.hide();
+ });
};
this.buyRequest = function(token, account) {
diff --git a/src/js/controllers/buyGlidera.js b/src/js/controllers/buyGlidera.js
index 9a365ee28..e0c4d5be7 100644
--- a/src/js/controllers/buyGlidera.js
+++ b/src/js/controllers/buyGlidera.js
@@ -9,7 +9,7 @@ angular.module('copayApp.controllers').controller('buyGlideraController',
this.success = null;
this.init = function(testnet) {
- self.allWallets = profileService.getWallets(testnet ? 'testnet' : 'livenet', 1)
+ self.allWallets = profileService.getWallets(testnet ? 'testnet' : 'livenet');
var client = profileService.focusedClient;
if (client) {
@@ -23,8 +23,6 @@ angular.module('copayApp.controllers').controller('buyGlideraController',
$scope.openWalletsModal = function(wallets) {
self.error = null;
- self.selectedWalletId = null;
- self.selectedWalletName = null;
$scope.type = 'BUY';
$scope.wallets = wallets;
@@ -38,6 +36,15 @@ angular.module('copayApp.controllers').controller('buyGlideraController',
$scope.walletsModal = modal;
$scope.walletsModal.show();
});
+
+ $scope.$on('walletSelected', function(ev, obj) {
+ $timeout(function() {
+ self.selectedWalletId = obj.walletId;
+ self.selectedWalletName = obj.walletName;
+ $scope.$apply();
+ }, 100);
+ $scope.walletsModal.hide();
+ });
};
this.getBuyPrice = function(token, price) {
diff --git a/src/js/controllers/index.js b/src/js/controllers/index.js
index 87b4dc3de..806e55855 100644
--- a/src/js/controllers/index.js
+++ b/src/js/controllers/index.js
@@ -1060,9 +1060,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r
getToken(function(err, accessToken) {
if (err || !accessToken) return;
else {
- ongoingProcess.set('connectingGlidera', true);
glideraService.getAccessTokenPermissions(accessToken, function(err, p) {
- ongoingProcess.set('connectingGlidera', false);
if (err) {
self.glideraError = err;
} else {
@@ -1093,24 +1091,18 @@ angular.module('copayApp.controllers').controller('indexController', function($r
});
if (permissions.transaction_history) {
- ongoingProcess.set('Fetching Glidera Transactions', true);
glideraService.getTransactions(accessToken, function(err, data) {
- ongoingProcess.set('Fetching Glidera Transactions', false);
self.glideraTxs = data;
});
}
if (permissions.view_email_address && opts.fullUpdate) {
- ongoingProcess.set('connectingGlidera', true);
glideraService.getEmail(accessToken, function(err, data) {
- ongoingProcess.set('connectingGlidera', false);
self.glideraEmail = data.email;
});
}
if (permissions.personal_info && opts.fullUpdate) {
- ongoingProcess.set('connectingGlidera', true);
glideraService.getPersonalInfo(accessToken, function(err, data) {
- ongoingProcess.set('connectingGlidera', false);
self.glideraPersonalInfo = data;
});
}
@@ -1145,9 +1137,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r
getToken(function(err, accessToken) {
if (err || !accessToken) return;
else {
- ongoingProcess.set('Getting primary account...', true);
coinbaseService.getAccounts(accessToken, function(err, a) {
- ongoingProcess.set('Getting primary account...', false);
if (err) {
self.coinbaseError = err;
if (err.errors[0] && err.errors[0].id == 'expired_token') {
diff --git a/src/js/controllers/modals/coinbaseTxDetails.js b/src/js/controllers/modals/coinbaseTxDetails.js
index 37385cbb6..feebfd47d 100644
--- a/src/js/controllers/modals/coinbaseTxDetails.js
+++ b/src/js/controllers/modals/coinbaseTxDetails.js
@@ -1,6 +1,6 @@
'use strict';
-angular.module('copayApp.controllers').controller('coinbaseTxDetailsController', function($scope, coinbaseService) {
+angular.module('copayApp.controllers').controller('coinbaseTxDetailsController', function($scope, $rootScope, coinbaseService) {
$scope.remove = function() {
coinbaseService.savePendingTransaction($scope.tx, {
diff --git a/src/js/controllers/modals/wallets.js b/src/js/controllers/modals/wallets.js
index 8c47bc6cd..f08581f2b 100644
--- a/src/js/controllers/modals/wallets.js
+++ b/src/js/controllers/modals/wallets.js
@@ -2,25 +2,24 @@
angular.module('copayApp.controllers').controller('walletsController', function($scope, bwsError, profileService) {
- var self = $scope.self;
-
$scope.selectWallet = function(walletId, walletName) {
- if (!profileService.getClient(walletId).isComplete()) {
- self.error = bwsError.msg({
- 'code': 'WALLET_NOT_COMPLETE'
- }, 'Could not choose the wallet');
- self.error = {
- errors: [{
- message: 'The Wallet could not be selected'
- }]
- };
- $scope.cancel();
- return;
- }
- self.selectedWalletId = walletId;
- self.selectedWalletName = walletName;
- self.fc = profileService.getClient(self.selectedWalletId);
- $scope.cancel();
+
+ var client = profileService.getClient(walletId);
+ $scope.errorSelectedWallet = {};
+
+ profileService.isReady(client, function(err) {
+ if (err) {
+ $scope.errorSelectedWallet[walletId] = bwsError.msg(err);
+ return;
+ }
+
+ var obj = {
+ 'walletId': walletId,
+ 'walletName': walletName,
+ 'client': profileService.getClient(walletId)
+ }
+ $scope.$emit('walletSelected', obj);
+ });
};
$scope.cancel = function() {
diff --git a/src/js/controllers/sellCoinbase.js b/src/js/controllers/sellCoinbase.js
index a9023c620..4055b1725 100644
--- a/src/js/controllers/sellCoinbase.js
+++ b/src/js/controllers/sellCoinbase.js
@@ -1,7 +1,7 @@
'use strict';
angular.module('copayApp.controllers').controller('sellCoinbaseController',
- function($rootScope, $scope, $modal, $log, $timeout, $ionicModal, lodash, profileService, coinbaseService, bwsError, configService, walletService, fingerprintService, ongoingProcess) {
+ function($rootScope, $scope, $modal, $log, $timeout, $ionicModal, lodash, profileService, coinbaseService, bwsError, configService, walletService, fingerprintService, ongoingProcess, go) {
var self = this;
var client;
@@ -42,7 +42,7 @@ angular.module('copayApp.controllers').controller('sellCoinbaseController',
self.allWallets = profileService.getWallets(testnet ? 'testnet' : 'livenet', 1);
client = profileService.focusedClient;
- if (client) {
+ if (client && client.credentials.m == 1) {
$timeout(function() {
self.selectedWalletId = client.credentials.walletId;
self.selectedWalletName = client.credentials.walletName;
@@ -79,8 +79,6 @@ angular.module('copayApp.controllers').controller('sellCoinbaseController',
$scope.openWalletsModal = function(wallets) {
self.error = null;
- self.selectedWalletId = null;
- self.selectedWalletName = null;
$scope.type = 'SELL';
$scope.wallets = wallets;
@@ -94,6 +92,16 @@ angular.module('copayApp.controllers').controller('sellCoinbaseController',
$scope.walletsModal = modal;
$scope.walletsModal.show();
});
+
+ $scope.$on('walletSelected', function(ev, obj) {
+ $timeout(function() {
+ self.selectedWalletId = obj.walletId;
+ self.selectedWalletName = obj.walletName;
+ client = obj.client;
+ $scope.$apply();
+ }, 100);
+ $scope.walletsModal.hide();
+ });
};
this.depositFunds = function(token, account) {
@@ -205,6 +213,7 @@ angular.module('copayApp.controllers').controller('sellCoinbaseController',
$scope.$emit('Local/NeedsConfirmation', createdTxp, function(accept) {
if (accept) {
self.confirmTx(createdTxp, function(err, tx) {
+ ongoingProcess.clear();
if (err) {
self.error = {
errors: [{
@@ -221,14 +230,14 @@ angular.module('copayApp.controllers').controller('sellCoinbaseController',
}
lodash.each(ctxs.data, function(ctx) {
if (ctx.type == 'send' && ctx.from) {
+ ongoingProcess.clear();
if (ctx.status == 'completed') {
self.sellRequest(token, account, ctx);
} else {
// Save to localstorage
- ongoingProcess.clear();
ctx['price_sensitivity'] = $scope.selectedPriceSensitivity;
- ctx['sell_price_amount'] = self.sellPrice.amount;
- ctx['sell_price_currency'] = self.sellPrice.currency;
+ ctx['sell_price_amount'] = self.sellPrice ? self.sellPrice.amount : '';
+ ctx['sell_price_currency'] = self.sellPrice ? self.sellPrice.currency : 'USD';
ctx['description'] = 'Copay Wallet: ' + client.credentials.walletName;
coinbaseService.savePendingTransaction(ctx, null, function(err) {
if (err) $log.debug(err);
@@ -243,6 +252,8 @@ angular.module('copayApp.controllers').controller('sellCoinbaseController',
});
});
});
+ } else {
+ go.path('coinbase');
}
});
});
@@ -292,8 +303,8 @@ angular.module('copayApp.controllers').controller('sellCoinbaseController',
}
walletService.broadcastTx(client, signedTxp, function(err, broadcastedTxp) {
- ongoingProcess.set('Sending Bitcoin to Coinbase...', false);
if (err) {
+ ongoingProcess.set('Sending Bitcoin to Coinbase...', false);
$log.debug(err);
walletService.removeTx(client, broadcastedTxp, function(err) {
if (err) $log.debug(err);
diff --git a/src/js/controllers/sellGlidera.js b/src/js/controllers/sellGlidera.js
index 8e203a18f..fb8a106df 100644
--- a/src/js/controllers/sellGlidera.js
+++ b/src/js/controllers/sellGlidera.js
@@ -1,7 +1,7 @@
'use strict';
angular.module('copayApp.controllers').controller('sellGlideraController',
- function($rootScope, $scope, $timeout, $ionicModal, $log, $modal, configService, profileService, addressService, feeService, glideraService, bwsError, lodash, walletService, fingerprintService, ongoingProcess) {
+ function($rootScope, $scope, $timeout, $ionicModal, $log, $modal, configService, profileService, addressService, feeService, glideraService, bwsError, lodash, walletService, fingerprintService, ongoingProcess, go) {
var self = this;
var config = configService.getSync();
@@ -20,10 +20,10 @@ angular.module('copayApp.controllers').controller('sellGlideraController',
};
this.init = function(testnet) {
- self.allWallets = profileService.getWallets(testnet ? 'testnet' : 'livenet', 1)
+ self.allWallets = profileService.getWallets(testnet ? 'testnet' : 'livenet', 1);
client = profileService.focusedClient;
- if (client) {
+ if (client && client.credentials.m == 1) {
$timeout(function() {
self.selectedWalletId = client.credentials.walletId;
self.selectedWalletName = client.credentials.walletName;
@@ -32,12 +32,10 @@ angular.module('copayApp.controllers').controller('sellGlideraController',
}
};
-
+
$scope.openWalletsModal = function(wallets) {
self.error = null;
- self.selectedWalletId = null;
- self.selectedWalletName = null;
$scope.type = 'SELL';
$scope.wallets = wallets;
@@ -51,6 +49,16 @@ angular.module('copayApp.controllers').controller('sellGlideraController',
$scope.walletsModal = modal;
$scope.walletsModal.show();
});
+
+ $scope.$on('walletSelected', function(ev, obj) {
+ $timeout(function() {
+ self.selectedWalletId = obj.walletId;
+ self.selectedWalletName = obj.walletName;
+ client = obj.client;
+ $scope.$apply();
+ }, 100);
+ $scope.walletsModal.hide();
+ });
};
this.getSellPrice = function(token, price) {
@@ -196,6 +204,8 @@ angular.module('copayApp.controllers').controller('sellGlideraController',
});
});
});
+ } else {
+ go.path('glidera');
}
});
});
diff --git a/src/js/controllers/walletHome.js b/src/js/controllers/walletHome.js
index 3d10eef89..683d17068 100644
--- a/src/js/controllers/walletHome.js
+++ b/src/js/controllers/walletHome.js
@@ -36,7 +36,7 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi
$rootScope.$emit('Local/SetTab', 'send');
var form = $scope.sendForm;
- if (form.address.$invalid && !ongoingProcess.get('fetchingPayPro')) {
+ if (form.address.$invalid && !ongoingProcess.isProcessing) {
self.resetForm();
self.error = gettext('Could not recognize a valid Bitcoin QR Code');
}
diff --git a/src/js/services/coinbaseService.js b/src/js/services/coinbaseService.js
index 3827c6651..1af0a8a16 100644
--- a/src/js/services/coinbaseService.js
+++ b/src/js/services/coinbaseService.js
@@ -41,9 +41,9 @@ angular.module('copayApp.services').factory('coinbaseService', function($http, $
};
root.getOauthCodeUrl = function() {
- return credentials.HOST
- + '/oauth/authorize?response_type=code&client_id='
- + credentials.CLIENT_ID
+ return credentials.HOST
+ + '/oauth/authorize?response_type=code&client_id='
+ + credentials.CLIENT_ID
+ '&redirect_uri='
+ credentials.REDIRECT_URI
+ '&state=SECURE_RANDOM&scope='
@@ -59,7 +59,7 @@ angular.module('copayApp.services').factory('coinbaseService', function($http, $
'Content-Type': 'application/json',
'Accept': 'application/json'
},
- data: {
+ data: {
grant_type : 'authorization_code',
code: code,
client_id : credentials.CLIENT_ID,
@@ -70,7 +70,7 @@ angular.module('copayApp.services').factory('coinbaseService', function($http, $
$http(req).then(function(data) {
$log.info('Coinbase Authorization Access Token: SUCCESS');
- return cb(null, data.data);
+ return cb(null, data.data);
}, function(data) {
$log.error('Coinbase Authorization Access Token: ERROR ' + data.statusText);
return cb(data.data);
@@ -85,18 +85,18 @@ angular.module('copayApp.services').factory('coinbaseService', function($http, $
'Content-Type': 'application/json',
'Accept': 'application/json'
},
- data: {
+ data: {
grant_type : 'refresh_token',
client_id : credentials.CLIENT_ID,
client_secret: credentials.CLIENT_SECRET,
redirect_uri: credentials.REDIRECT_URI,
- refresh_token: refreshToken
+ refresh_token: refreshToken
}
};
$http(req).then(function(data) {
$log.info('Coinbase Refresh Access Token: SUCCESS');
- return cb(null, data.data);
+ return cb(null, data.data);
}, function(data) {
$log.error('Coinbase Refresh Access Token: ERROR ' + data.statusText);
return cb(data.data);
@@ -195,17 +195,17 @@ angular.module('copayApp.services').factory('coinbaseService', function($http, $
root.sellPrice = function(token, currency, cb) {
$http(_get('/prices/sell?currency=' + currency, token)).then(function(data) {
$log.info('Coinbase Sell Price: SUCCESS');
- return cb(null, data.data);
+ return cb(null, data.data);
}, function(data) {
$log.error('Coinbase Sell Price: ERROR ' + data.statusText);
return cb(data.data);
});
- };
+ };
root.buyPrice = function(token, currency, cb) {
$http(_get('/prices/buy?currency=' + currency, token)).then(function(data) {
$log.info('Coinbase Buy Price: SUCCESS');
- return cb(null, data.data);
+ return cb(null, data.data);
}, function(data) {
$log.error('Coinbase Buy Price: ERROR ' + data.statusText);
return cb(data.data);
@@ -215,7 +215,7 @@ angular.module('copayApp.services').factory('coinbaseService', function($http, $
root.getPaymentMethods = function(token, cb) {
$http(_get('/payment-methods', token)).then(function(data) {
$log.info('Coinbase Get Payment Methods: SUCCESS');
- return cb(null, data.data);
+ return cb(null, data.data);
}, function(data) {
$log.error('Coinbase Get Payment Methods: ERROR ' + data.statusText);
return cb(data.data);
@@ -225,7 +225,7 @@ angular.module('copayApp.services').factory('coinbaseService', function($http, $
root.getPaymentMethod = function(token, paymentMethodId, cb) {
$http(_get('/payment-methods/' + paymentMethodId, token)).then(function(data) {
$log.info('Coinbase Get Payment Method: SUCCESS');
- return cb(null, data.data);
+ return cb(null, data.data);
}, function(data) {
$log.error('Coinbase Get Payment Method: ERROR ' + data.statusText);
return cb(data.data);
@@ -243,7 +243,7 @@ angular.module('copayApp.services').factory('coinbaseService', function($http, $
},
data: data
};
- };
+ };
root.sellRequest = function(token, accountId, data, cb) {
var data = {
@@ -254,7 +254,7 @@ angular.module('copayApp.services').factory('coinbaseService', function($http, $
};
$http(_post('/accounts/' + accountId + '/sells', token, data)).then(function(data) {
$log.info('Coinbase Sell Request: SUCCESS');
- return cb(null, data.data);
+ return cb(null, data.data);
}, function(data) {
$log.error('Coinbase Sell Request: ERROR ' + data.statusText);
return cb(data.data);
@@ -264,12 +264,12 @@ angular.module('copayApp.services').factory('coinbaseService', function($http, $
root.sellCommit = function(token, accountId, sellId, cb) {
$http(_post('/accounts/' + accountId + '/sells/' + sellId + '/commit', token)).then(function(data) {
$log.info('Coinbase Sell Commit: SUCCESS');
- return cb(null, data.data);
+ return cb(null, data.data);
}, function(data) {
$log.error('Coinbase Sell Commit: ERROR ' + data.statusText);
return cb(data.data);
});
- };
+ };
root.buyRequest = function(token, accountId, data, cb) {
var data = {
@@ -280,7 +280,7 @@ angular.module('copayApp.services').factory('coinbaseService', function($http, $
};
$http(_post('/accounts/' + accountId + '/buys', token, data)).then(function(data) {
$log.info('Coinbase Buy Request: SUCCESS');
- return cb(null, data.data);
+ return cb(null, data.data);
}, function(data) {
$log.error('Coinbase Buy Request: ERROR ' + data.statusText);
return cb(data.data);
@@ -290,7 +290,7 @@ angular.module('copayApp.services').factory('coinbaseService', function($http, $
root.buyCommit = function(token, accountId, buyId, cb) {
$http(_post('/accounts/' + accountId + '/buys/' + buyId + '/commit', token)).then(function(data) {
$log.info('Coinbase Buy Commit: SUCCESS');
- return cb(null, data.data);
+ return cb(null, data.data);
}, function(data) {
$log.error('Coinbase Buy Commit: ERROR ' + data.statusText);
return cb(data.data);
@@ -303,7 +303,7 @@ angular.module('copayApp.services').factory('coinbaseService', function($http, $
};
$http(_post('/accounts/' + accountId + '/addresses', token, data)).then(function(data) {
$log.info('Coinbase Create Address: SUCCESS');
- return cb(null, data.data);
+ return cb(null, data.data);
}, function(data) {
$log.error('Coinbase Create Address: ERROR ' + data.statusText);
return cb(data.data);
@@ -320,7 +320,7 @@ angular.module('copayApp.services').factory('coinbaseService', function($http, $
};
$http(_post('/accounts/' + accountId + '/transactions', token, data)).then(function(data) {
$log.info('Coinbase Create Address: SUCCESS');
- return cb(null, data.data);
+ return cb(null, data.data);
}, function(data) {
$log.error('Coinbase Create Address: ERROR ' + data.statusText);
return cb(data.data);
@@ -328,7 +328,7 @@ angular.module('copayApp.services').factory('coinbaseService', function($http, $
};
// Pending transactions
-
+
root.savePendingTransaction = function(ctx, opts, cb) {
var network = configService.getSync().coinbase.testnet ? 'testnet' : 'livenet';
storageService.getCoinbaseTxs(network, function(err, oldTxs) {
diff --git a/src/js/services/onGoingProcess.js b/src/js/services/onGoingProcess.js
index d7fe002ba..66b9bbff0 100644
--- a/src/js/services/onGoingProcess.js
+++ b/src/js/services/onGoingProcess.js
@@ -30,8 +30,16 @@ angular.module('copayApp.services').factory('ongoingProcess', function($log, $ti
'deletingWallet': gettext('Deleting Wallet...'),
};
+ root.isProcessing = false;
+
root.clear = function() {
ongoingProcess = {};
+ root.isProcessing = false;
+ if (isCordova) {
+ window.plugins.spinnerDialog.hide();
+ } else {
+ $ionicLoading.hide();
+ }
};
root.get = function(processName) {
@@ -55,16 +63,18 @@ angular.module('copayApp.services').factory('ongoingProcess', function($log, $ti
var showName = $filter('translate')(processNames[name] || name);
if (root.onGoingProcessName) {
+ root.isProcessing = true;
if (isCordova) {
window.plugins.spinnerDialog.show(null, showName, true);
} else {
-
+
var tmpl = '' + showName;
$ionicLoading.show({
template: tmpl
});
}
} else {
+ root.isProcessing = false;
if (isCordova) {
window.plugins.spinnerDialog.hide();
} else {