Fix: modal choose wallet. Sell in Coinbase and Glidera. Spinner

This commit is contained in:
Gustavo Maximiliano Cortez 2016-06-16 18:29:56 -03:00
parent 6d9bc56144
commit f08f30240a
No known key found for this signature in database
GPG Key ID: 15EDAD8D9F2EB1AF
13 changed files with 123 additions and 81 deletions

View File

@ -85,14 +85,13 @@
</li>
</ul>
<div class="row m20t p20t line-t" ng-show="tx.status == 'error'">
<div class="row m20t" ng-show="tx.status == 'error'">
<div class="columns">
<p class="text-center size-12 text-gray">
This action will remove the transaction.
</p>
<button class="button outline round dark-gray expand tiny"
ng-click="remove();"
ng-disabled="loading">
ng-click="remove()">
<i class="fi-x"></i>
Remove
</button>

View File

@ -11,8 +11,11 @@
</h1>
</ion-header-bar>
<ion-content class="m20t" overflow-scroll="true">
<div class="modal-content m20t">
<ion-content overflow-scroll="true">
<div class="modal-content">
<div class="box-notification text-center size-12 text-warning m10t" ng-show="error">
<i class="fi-error"></i> {{error}}
</div>
<div ng-show="type == 'SELL'">
<h4 class="title m0 oh">
<div class="left">
@ -34,7 +37,13 @@
ng-style="{'background-color':w.color}">
<i class="icon-wallet size-21"></i>
</div>
<div class="ellipsis name-wallet text-bold">{{w.name || w.id}}</div>
<div class="ellipsis name-wallet text-bold">
{{w.name || w.id}}
<span class="has-error right text-light size-12" ng-show="errorSelectedWallet[w.id]">
<i class="icon-close-circle size-14"></i>
<span class="vm">{{errorSelectedWallet[w.id]}}</span>
</span>
</div>
<div class="size-12">{{w.m}} of {{w.n}}
<span ng-show="w.network=='testnet'">[Testnet]</span>
</div>

View File

@ -94,7 +94,7 @@
</div>
<div class="input m20t">
<a href class="button black expand round"
ng-disabled=" (!amount && !fiat)"
ng-disabled=" (!amount && !fiat) || !sell.sellPrice.amount"
ng-style="{'background-color': '#2b71b1'}"
ng-click="showPriceSensitivity = true">Continue</a>
</div>
@ -124,7 +124,7 @@
</div>
<div class="columns large-6 medium-6 small-6">
<input class="button black expand round"
ng-disabled="(!amount && !fiat)"
ng-disabled="(!amount && !fiat) || !sell.sellPrice.amount"
ng-style="{'background-color': '#2b71b1'}"
type="submit" value="Confirm">
</div>

View File

@ -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) {

View File

@ -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) {

View File

@ -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') {

View File

@ -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, {

View File

@ -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() {

View File

@ -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);

View File

@ -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');
}
});
});

View File

@ -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');
}

View File

@ -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) {

View File

@ -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 = '<ion-spinner class="spinner-stable" icon="lines"></ion-spinner>' + showName;
$ionicLoading.show({
template: tmpl
});
}
} else {
root.isProcessing = false;
if (isCordova) {
window.plugins.spinnerDialog.hide();
} else {