Wallet/src/js/controllers/buyCoinbase.js

243 lines
7.7 KiB
JavaScript
Raw Normal View History

2017-01-11 19:38:05 -03:00
'use strict';
angular.module('copayApp.controllers').controller('buyCoinbaseController', function($scope, $log, $state, $timeout, $ionicHistory, $ionicScrollDelegate, $ionicConfig, lodash, coinbaseService, popupService, profileService, ongoingProcess, walletService, txFormatService) {
2017-01-11 19:38:05 -03:00
var amount;
var currency;
2017-01-12 23:49:55 -03:00
var showErrorAndBack = function(err) {
$scope.sendStatus = '';
2017-01-11 19:38:05 -03:00
$log.error(err);
2017-01-12 23:49:55 -03:00
err = err.errors ? err.errors[0].message : err;
popupService.showAlert('Error', err, function() {
2017-01-11 19:38:05 -03:00
$ionicHistory.goBack();
});
};
2017-01-12 23:49:55 -03:00
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 == 'buyingBitcoin' && !isOn) {
$scope.sendStatus = 'success';
$timeout(function() {
$scope.$digest();
}, 100);
} else if (showName) {
$scope.sendStatus = showName;
}
};
$scope.$on("$ionicView.beforeLeave", function(event, data) {
$ionicConfig.views.swipeBackEnabled(true);
});
$scope.$on("$ionicView.enter", function(event, data) {
$ionicConfig.views.swipeBackEnabled(false);
});
2017-01-11 19:38:05 -03:00
$scope.$on("$ionicView.beforeEnter", function(event, data) {
$scope.isFiat = data.stateParams.currency != 'bits' && data.stateParams.currency != 'BTC' ? true : false;
var parsedAmount = txFormatService.parseAmount(
data.stateParams.amount,
data.stateParams.currency);
2017-02-06 16:03:32 -03:00
amount = parsedAmount.amount;
currency = parsedAmount.currency;
$scope.amountUnitStr = parsedAmount.amountUnitStr;
2017-01-11 19:38:05 -03:00
$scope.network = coinbaseService.getNetwork();
$scope.wallets = profileService.getWallets({
onlyComplete: true,
network: $scope.network
});
if (lodash.isEmpty($scope.wallets)) {
showErrorAndBack('No wallets available');
return;
}
2017-01-11 19:38:05 -03:00
$scope.wallet = $scope.wallets[0]; // Default first wallet
ongoingProcess.set('connectingCoinbase', true);
coinbaseService.init(function(err, res) {
if (err) {
ongoingProcess.set('connectingCoinbase', false);
2017-01-12 23:49:55 -03:00
showErrorAndBack(err);
2017-01-11 19:38:05 -03:00
return;
}
var accessToken = res.accessToken;
coinbaseService.buyPrice(accessToken, coinbaseService.getAvailableCurrency(), function(err, b) {
$scope.buyPrice = b.data || null;
});
2017-01-11 19:38:05 -03:00
$scope.paymentMethods = [];
$scope.selectedPaymentMethodId = { value : null };
coinbaseService.getPaymentMethods(accessToken, function(err, p) {
if (err) {
ongoingProcess.set('connectingCoinbase', false);
2017-01-12 23:49:55 -03:00
showErrorAndBack(err);
2017-01-11 19:38:05 -03:00
return;
}
2017-01-12 23:49:55 -03:00
var hasPrimary;
var pm;
for(var i = 0; i < p.data.length; i++) {
pm = p.data[i];
2017-01-11 19:38:05 -03:00
if (pm.allow_buy) {
$scope.paymentMethods.push(pm);
}
if (pm.allow_buy && pm.primary_buy) {
2017-01-12 23:49:55 -03:00
hasPrimary = true;
2017-01-11 19:38:05 -03:00
$scope.selectedPaymentMethodId.value = pm.id;
}
2017-01-12 23:49:55 -03:00
}
if (lodash.isEmpty($scope.paymentMethods)) {
ongoingProcess.set('connectingCoinbase', false);
showErrorAndBack('No payment method available to buy');
return;
}
if (!hasPrimary) $scope.selectedPaymentMethodId.value = $scope.paymentMethods[0].id;
$scope.buyRequest();
2017-01-11 19:38:05 -03:00
});
});
});
$scope.buyRequest = function() {
ongoingProcess.set('connectingCoinbase', true);
coinbaseService.init(function(err, res) {
if (err) {
ongoingProcess.set('connectingCoinbase', false);
2017-01-12 23:49:55 -03:00
showErrorAndBack(err);
2017-01-11 19:38:05 -03:00
return;
}
var accessToken = res.accessToken;
var accountId = res.accountId;
var dataSrc = {
amount: amount,
currency: currency,
2017-01-12 23:49:55 -03:00
payment_method: $scope.selectedPaymentMethodId.value,
quote: true
2017-01-11 19:38:05 -03:00
};
coinbaseService.buyRequest(accessToken, accountId, dataSrc, function(err, data) {
ongoingProcess.set('connectingCoinbase', false);
if (err) {
2017-01-12 23:49:55 -03:00
showErrorAndBack(err);
2017-01-11 19:38:05 -03:00
return;
}
$scope.buyRequestInfo = data.data;
2017-01-12 23:49:55 -03:00
$timeout(function() {
$scope.$apply();
}, 100);
2017-01-11 19:38:05 -03:00
});
});
};
$scope.buyConfirm = function() {
var message = 'Buy bitcoin for ' + amount + ' ' + currency;
var okText = 'Confirm';
var cancelText = 'Cancel';
popupService.showConfirm(null, message, okText, cancelText, function(ok) {
if (!ok) return;
2017-01-12 23:49:55 -03:00
ongoingProcess.set('buyingBitcoin', true, statusChangeHandler);
2017-01-11 19:38:05 -03:00
coinbaseService.init(function(err, res) {
if (err) {
2017-01-12 23:49:55 -03:00
ongoingProcess.set('buyingBitcoin', false, statusChangeHandler);
showError(err);
2017-01-11 19:38:05 -03:00
return;
}
var accessToken = res.accessToken;
var accountId = res.accountId;
2017-01-12 23:49:55 -03:00
var dataSrc = {
amount: amount,
currency: currency,
payment_method: $scope.selectedPaymentMethodId.value,
commit: true
};
coinbaseService.buyRequest(accessToken, accountId, dataSrc, function(err, b) {
2017-01-11 19:38:05 -03:00
if (err) {
2017-01-12 23:49:55 -03:00
ongoingProcess.set('buyingBitcoin', false, statusChangeHandler);
showError(err);
2017-01-11 19:38:05 -03:00
return;
}
var processBuyTx = function (tx) {
if (!tx) {
ongoingProcess.set('buyingBitcoin', false, statusChangeHandler);
showError('Transaction not found');
return;
}
2017-01-11 19:38:05 -03:00
coinbaseService.getTransaction(accessToken, accountId, tx.id, function(err, updatedTx) {
if (err) {
2017-01-12 23:49:55 -03:00
ongoingProcess.set('buyingBitcoin', false, statusChangeHandler);
showError(err);
2017-01-11 19:38:05 -03:00
return;
}
walletService.getAddress($scope.wallet, false, function(err, walletAddr) {
if (err) {
2017-01-12 23:49:55 -03:00
ongoingProcess.set('buyingBitcoin', false, statusChangeHandler);
showError(err);
2017-01-11 19:38:05 -03:00
return;
}
updatedTx.data['toAddr'] = walletAddr;
updatedTx.data['status'] = 'pending'; // Forcing "pending" status to process later
$log.debug('Saving transaction to process later...');
coinbaseService.savePendingTransaction(updatedTx.data, {}, function(err) {
2017-01-12 23:49:55 -03:00
ongoingProcess.set('buyingBitcoin', false, statusChangeHandler);
2017-01-11 19:38:05 -03:00
if (err) $log.debug(err);
});
});
});
};
$timeout(function() {
var tx = b.data ? b.data.transaction : null;
if (tx) {
processBuyTx(tx);
}
else {
coinbaseService.getBuyOrder(accessToken, accountId, b.data.id, function (err, buyResp) {
if (err) {
ongoingProcess.set('buyingBitcoin', false, statusChangeHandler);
showError(err);
return;
}
var tx = buyResp.data ? buyResp.data.transaction : null;
processBuyTx(tx);
});
}
}, 8000);
2017-01-11 19:38:05 -03:00
});
});
});
};
$scope.showWalletSelector = function() {
2017-01-12 20:29:34 -03:00
$scope.walletSelectorTitle = 'Receive in';
2017-01-11 19:38:05 -03:00
$scope.showWallets = true;
};
$scope.onWalletSelect = function(wallet) {
$scope.wallet = wallet;
};
$scope.goBackHome = function() {
2017-01-12 23:49:55 -03:00
$scope.sendStatus = '';
2017-01-11 19:38:05 -03:00
$ionicHistory.nextViewOptions({
disableAnimate: true,
historyRoot: true
});
$ionicHistory.clearHistory();
$state.go('tabs.home').then(function() {
$state.transitionTo('tabs.buyandsell.coinbase');
});
};
});