'use strict'; angular.module('copayApp.controllers').controller('buyCoinbaseController', function($scope, $log, $ionicModal, $timeout, lodash, profileService, coinbaseService, addressService, ongoingProcess) { var self = this; this.init = function(testnet) { self.allWallets = profileService.getWallets(testnet ? 'testnet' : 'livenet'); var client = profileService.focusedClient; if (client) { $timeout(function() { self.selectedWalletId = client.credentials.walletId; self.selectedWalletName = client.credentials.walletName; $scope.$apply(); }, 100); } }; this.getPaymentMethods = function(token) { coinbaseService.getPaymentMethods(token, function(err, p) { if (err) { self.error = err; return; } self.paymentMethods = []; lodash.each(p.data, function(pm) { if (pm.allow_buy) { self.paymentMethods.push(pm); } if (pm.allow_buy && pm.primary_buy) { $scope.selectedPaymentMethod = pm; } }); }); }; this.getPrice = function(token) { var currency = 'USD'; coinbaseService.buyPrice(token, currency, function(err, b) { if (err) return; self.buyPrice = b.data || null; }); }; $scope.openWalletsModal = function(wallets) { self.error = null; $scope.type = 'BUY'; $scope.wallets = wallets; $scope.noColor = true; $scope.self = self; $ionicModal.fromTemplateUrl('views/modals/wallets.html', { scope: $scope, animation: 'slide-in-up' }).then(function(modal) { $scope.walletsModal = modal; $scope.walletsModal.show(); }); $scope.$on('walletSelected', function(ev, walletId) { $timeout(function() { var client = profileService.getClient(walletId); self.selectedWalletId = walletId; self.selectedWalletName = client.credentials.walletName; $scope.$apply(); }, 100); $scope.walletsModal.hide(); }); }; this.buyRequest = function(token, account) { self.error = null; var accountId = account.id; var amount = $scope.amount ? $scope.amount : $scope.fiat; var currency = $scope.amount ? 'BTC' : 'USD'; if (!amount) return; var dataSrc = { amount: amount, currency: currency, payment_method: $scope.selectedPaymentMethod.id || null }; ongoingProcess.set('Sending request...', true); coinbaseService.buyRequest(token, accountId, dataSrc, function(err, data) { ongoingProcess.set('Sending request...', false); if (err) { self.error = err; return; } self.buyInfo = data.data; }); }; this.confirmBuy = function(token, account, buy) { self.error = null; var accountId = account.id; var buyId = buy.id; ongoingProcess.set('Buying Bitcoin...', true); coinbaseService.buyCommit(token, accountId, buyId, function(err, b) { ongoingProcess.set('Buying Bitcoin...', false); if (err) { self.error = err; return; } else { var tx = b.data.transaction; if (!tx) return; ongoingProcess.set('Fetching transaction...', true); coinbaseService.getTransaction(token, accountId, tx.id, function(err, updatedTx) { ongoingProcess.set('Fetching transaction...', false); if (err) $log.debug(err); addressService.getAddress(self.selectedWalletId, false, function(err, addr) { if (err) { self.error = { errors: [{ message: 'Could not create address' }] }; return; } updatedTx.data['toAddr'] = addr; coinbaseService.savePendingTransaction(updatedTx.data, {}, function(err) { if (err) $log.debug(err); if (updatedTx.data.status == 'completed') { self.sendToCopay(token, account, updatedTx.data); } else { self.success = updatedTx.data; $timeout(function() { $scope.$emit('Local/CoinbaseTx'); }, 1000); } }); }); }); } }); }; this.sendToCopay = function(token, account, tx) { self.error = null; var accountId = account.id; ongoingProcess.set('Sending funds to Copay...', true); var data = { to: tx.toAddr, amount: tx.amount.amount, currency: tx.amount.currency, description: 'Copay Wallet: ' + self.selectedWalletName }; coinbaseService.sendTo(token, accountId, data, function(err, res) { ongoingProcess.set('Sending funds to Copay...', false); if (err) { self.error = err; } else { self.receiveInfo = res.data; if (!res.data.id) return; coinbaseService.getTransaction(token, accountId, res.data.id, function(err, sendTx) { coinbaseService.savePendingTransaction(tx, { remove: true }, function(err) { coinbaseService.savePendingTransaction(sendTx.data, {}, function(err) { $timeout(function() { $scope.$emit('Local/CoinbaseTx'); }, 1000); }); }); }); } }); }; });