Wallet/src/js/controllers/sellGlidera.js
Gustavo Maximiliano Cortez a5a80684eb
Fix rateService. Add usd rates
2017-08-31 11:58:13 -03:00

255 lines
8.5 KiB
JavaScript

'use strict';
angular.module('copayApp.controllers').controller('sellGlideraController', function($scope, $log, $state, $timeout, $ionicHistory, $ionicConfig, lodash, glideraService, popupService, profileService, ongoingProcess, walletService, configService, platformInfo, txFormatService) {
var coin = 'btc';
var amount;
var currency;
$scope.isCordova = platformInfo.isCordova;
var showErrorAndBack = function(err) {
$scope.sendStatus = '';
$log.error(err);
err = err.errors ? err.errors[0].message : err;
popupService.showAlert('Error', err, function() {
$ionicHistory.goBack();
});
};
var showError = function(err) {
$scope.sendStatus = '';
$log.error(err);
err = err.errors ? err.errors[0].message : err;
popupService.showAlert('Error', err);
};
var statusChangeHandler = function (processName, showName, isOn) {
$log.debug('statusChangeHandler: ', processName, showName, isOn);
if ( processName == 'sellingBitcoin' && !isOn) {
$scope.sendStatus = 'success';
$timeout(function() {
$scope.$digest();
}, 100);
} else if (showName) {
$scope.sendStatus = showName;
}
};
var processPaymentInfo = function() {
ongoingProcess.set('connectingGlidera', true);
glideraService.init(function(err, data) {
if (err) {
ongoingProcess.set('connectingGlidera', false);
showErrorAndBack(err);
return;
}
$scope.token = data.token;
var price = {};
if ($scope.isFiat) {
price['fiat'] = amount;
} else {
price['qty'] = amount;
}
glideraService.sellPrice($scope.token, price, function(err, sell) {
ongoingProcess.set('connectingGlidera', false);
if (err) {
showErrorAndBack(err);
return;
}
$scope.sellInfo = sell;
});
});
};
$scope.$on("$ionicView.beforeLeave", function(event, data) {
$ionicConfig.views.swipeBackEnabled(true);
});
$scope.$on("$ionicView.enter", function(event, data) {
$ionicConfig.views.swipeBackEnabled(false);
});
$scope.$on("$ionicView.beforeEnter", function(event, data) {
$scope.isFiat = data.stateParams.currency != 'BTC' ? true : false;
amount = data.stateParams.amount;
currency = data.stateParams.currency;
$scope.network = glideraService.getNetwork();
$scope.wallets = profileService.getWallets({
m: 1, // Only 1-signature wallet
onlyComplete: true,
network: $scope.network,
hasFunds: true,
coin: coin
});
if (lodash.isEmpty($scope.wallets)) {
showErrorAndBack('Insufficient funds');
return;
}
$scope.onWalletSelect($scope.wallets[0]); // Default first wallet
});
var ask2FaCode = function(mode, cb) {
if (mode != 'NONE') {
// SHOW PROMPT
var title = 'Please, enter the code below';
var message;
if (mode == 'PIN') {
message = 'You have enabled PIN based two-factor authentication.';
} else if (mode == 'AUTHENTICATOR') {
message = 'Use an authenticator app (Authy or Google Authenticator).';
} else {
message = 'A SMS containing a confirmation code was sent to your phone.';
}
popupService.showPrompt(title, message, null, function(twoFaCode) {
if (typeof twoFaCode == 'undefined') return cb();
return cb(twoFaCode);
});
} else {
return cb();
}
};
$scope.sellConfirm = function() {
var message = 'Sell bitcoin for ' + amount + ' ' + currency;
var okText = 'Confirm';
var cancelText = 'Cancel';
popupService.showConfirm(null, message, okText, cancelText, function(ok) {
if (!ok) return;
ongoingProcess.set('sellingBitcoin', true, statusChangeHandler);
glideraService.get2faCode($scope.token, function(err, tfa) {
if (err) {
ongoingProcess.set('sellingBitcoin', false, statusChangeHandler);
showError(err);
return;
}
ask2FaCode(tfa.mode, function(twoFaCode) {
if (tfa.mode != 'NONE' && lodash.isEmpty(twoFaCode)) {
ongoingProcess.set('sellingBitcoin', false, statusChangeHandler);
showError('No code entered');
return;
}
var outputs = [];
var config = configService.getSync();
var configWallet = config.wallet;
var walletSettings = configWallet.settings;
walletService.getAddress($scope.wallet, null, function(err, refundAddress) {
if (!refundAddress) {
ongoingProcess.set('sellingBitcoin', false, statusChangeHandler);
showError('Could not create address');
return;
}
glideraService.getSellAddress($scope.token, function(err, sellAddress) {
if (!sellAddress || err) {
ongoingProcess.set('sellingBitcoin', false, statusChangeHandler);
showError(err);
return;
}
var amount = parseInt(($scope.sellInfo.qty * 100000000).toFixed(0));
var comment = 'Glidera transaction';
outputs.push({
'toAddress': sellAddress,
'amount': amount,
'message': comment
});
var txp = {
toAddress: sellAddress,
amount: amount,
outputs: outputs,
message: comment,
payProUrl: null,
excludeUnconfirmedUtxos: configWallet.spendUnconfirmed ? false : true,
feeLevel: walletSettings.feeLevel || 'normal',
customData: {
'glideraToken': $scope.token
}
};
walletService.createTx($scope.wallet, txp, function(err, createdTxp) {
if (err) {
ongoingProcess.set('sellingBitcoin', false, statusChangeHandler);
showError(err);
return;
}
walletService.prepare($scope.wallet, function(err, password) {
if (err) {
ongoingProcess.set('sellingBitcoin', false, statusChangeHandler);
showError(err);
return;
}
walletService.publishTx($scope.wallet, createdTxp, function(err, publishedTxp) {
if (err) {
ongoingProcess.set('sellingBitcoin', false, statusChangeHandler);
showError(err);
return;
}
walletService.signTx($scope.wallet, publishedTxp, password, function(err, signedTxp) {
if (err) {
ongoingProcess.set('sellingBitcoin', false, statusChangeHandler);
showError(err);
walletService.removeTx($scope.wallet, signedTxp, function(err) {
if (err) $log.debug(err);
});
return;
}
var rawTx = signedTxp.raw;
var data = {
refundAddress: refundAddress,
signedTransaction: rawTx,
priceUuid: $scope.sellInfo.priceUuid,
useCurrentPrice: $scope.sellInfo.priceUuid ? false : true,
ip: null
};
glideraService.sell($scope.token, twoFaCode, data, function(err, data) {
ongoingProcess.set('sellingBitcoin', false, statusChangeHandler);
if (err) return showError(err);
$log.info(data);
});
});
});
});
});
});
});
});
});
});
};
$scope.showWalletSelector = function() {
$scope.walletSelectorTitle = 'Sell From';
$scope.showWallets = true;
};
$scope.onWalletSelect = function(wallet) {
$scope.wallet = wallet;
var parsedAmount = txFormatService.parseAmount(
coin,
amount,
currency);
amount = parsedAmount.amount;
currency = parsedAmount.currency;
$scope.amountUnitStr = parsedAmount.amountUnitStr;
processPaymentInfo();
};
$scope.goBackHome = function() {
$scope.sendStatus = '';
$ionicHistory.nextViewOptions({
disableAnimate: true,
historyRoot: true
});
$ionicHistory.clearHistory();
$state.go('tabs.home').then(function() {
$state.transitionTo('tabs.buyandsell.glidera');
});
};
});