From 67e2cb1d6c84329c9cdc8000941acc4413514984 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Fri, 11 Sep 2015 13:11:41 -0300 Subject: [PATCH 1/2] Moves Glidera link to sidebar --- public/views/buyGlidera.html | 19 ++++- public/views/glidera.html | 4 +- public/views/includes/sidebar.html | 10 +++ public/views/preferences.html | 8 ++ public/views/sellGlidera.html | 18 ++++- public/views/walletHome.html | 7 -- src/js/controllers/buyGlidera.js | 121 +++++++++++++++++++++-------- src/js/controllers/glidera.js | 2 +- src/js/controllers/glideraUri.js | 2 +- src/js/controllers/index.js | 29 +++---- src/js/controllers/preferences.js | 30 +++++++ src/js/controllers/sellGlidera.js | 66 +++++++++++++++- src/js/services/configService.js | 9 +++ 13 files changed, 263 insertions(+), 62 deletions(-) diff --git a/public/views/buyGlidera.html b/public/views/buyGlidera.html index b3ce3de30..ea6e15673 100644 --- a/public/views/buyGlidera.html +++ b/public/views/buyGlidera.html @@ -47,8 +47,24 @@
+
+ +
+ +
+ + + + +
+
+
+ ng-disabled="index.glideraLimits.transactDisabledPendingFirstTransaction || !buy.buyPrice.qty || + !buy.selectedWalletAddr || buy.loading">
diff --git a/public/views/glidera.html b/public/views/glidera.html index d19250c7a..d18959b1c 100644 --- a/public/views/glidera.html +++ b/public/views/glidera.html @@ -61,7 +61,7 @@

You can buy and sell Bitcoin with a US bank account directly in Copay.

Connect your Glidera account to get started
-
+
Testnet wallets only work with Glidera Sandbox Accounts
@@ -113,7 +113,7 @@ || (!index.glideraStatus.userBankAccountIsSetup && index.glideraStatus.bankAccountState != 'VERIFIED'))"> Your Glidera account is not ready to transact. Please, verify it at Glidera.io
diff --git a/public/views/includes/sidebar.html b/public/views/includes/sidebar.html index fe2ceab1b..687219492 100644 --- a/public/views/includes/sidebar.html +++ b/public/views/includes/sidebar.html @@ -25,5 +25,15 @@
Create, join or import
+
  • + + + +
    + Buy & Sell Bitcoin +
    +
    Glidera
    +
    +
  • diff --git a/public/views/preferences.html b/public/views/preferences.html index bf7db5528..56c1eaca9 100644 --- a/public/views/preferences.html +++ b/public/views/preferences.html @@ -95,6 +95,14 @@ {{preferences.bwsurl}} +
  • + Enable Glidera Service + +
  • +
  • + Glidera Sandbox + +
  • About Copay diff --git a/public/views/sellGlidera.html b/public/views/sellGlidera.html index 2e9a8f973..980f8ea27 100644 --- a/public/views/sellGlidera.html +++ b/public/views/sellGlidera.html @@ -49,6 +49,21 @@
    + +
    + +
    + + + + +
    +
    +
    + ng-disabled="index.glideraLimits.transactDisabledPendingFirstTransaction || !sell.sellPrice.qty || + !sell.selectedWalletId || sell.loading">
    diff --git a/public/views/walletHome.html b/public/views/walletHome.html index c921fcacb..047936eeb 100644 --- a/public/views/walletHome.html +++ b/public/views/walletHome.html @@ -112,13 +112,6 @@ ng-style="{'background-color':index.backgroundColor}">{{ (index.alias || index.walletName) | limitTo: 1}}
    - - - - Glidera - - Preferences diff --git a/src/js/controllers/buyGlidera.js b/src/js/controllers/buyGlidera.js index 2aaf7cbe7..c3ffbfbcf 100644 --- a/src/js/controllers/buyGlidera.js +++ b/src/js/controllers/buyGlidera.js @@ -1,14 +1,81 @@ 'use strict'; angular.module('copayApp.controllers').controller('buyGlideraController', - function($scope, $timeout, profileService, addressService, glideraService, gettext, gettextCatalog, bwsError) { + function($scope, $timeout, $modal, profileService, addressService, glideraService, gettext, gettextCatalog, bwsError, lodash, isChromeApp) { - this.addr = {}; + var self = this; this.show2faCodeInput = null; this.error = null; this.success = null; this.loading = null; + // DISABLE ANIMATION ON CHROMEAPP + if (isChromeApp) { + var animatedSlideUp = 'full'; + } else { + var animatedSlideUp = 'full animated slideInUp'; + } + + this.otherWallets = function(testnet) { + var network = testnet ? 'testnet' : 'livenet'; + return lodash.filter(profileService.getWallets(network), function(w) { + return w.network == network; + }); + }; + + $scope.openWalletsModal = function(wallets) { + self.error = null; + self.selectedWalletId = null; + self.selectedWalletName = null; + self.selectedWalletAddr = null; + var ModalInstanceCtrl = function($scope, $modalInstance) { + $scope.wallets = wallets; + $scope.cancel = function() { + $modalInstance.dismiss('cancel'); + }; + + $scope.selectWallet = function(walletId, walletName) { + if (!profileService.getClient(walletId).isComplete()) { + self.error = bwsError.msg({'code': 'WALLET_NOT_COMPLETE'}, gettextCatalog.getString('Could not choose the wallet')); + $modalInstance.dismiss('cancel'); + return; + } + addressService.getAddress(walletId, false, function(err, walletAddr) { + if (err) { + self.error = bwsError.cb(err, gettext('Could not create address')); + $modalInstance.dismiss('cancel'); + return; + } + $modalInstance.close({ + 'walletId': walletId, + 'walletName': walletName, + 'walletAddr': walletAddr + }); + }); + }; + }; + + var modalInstance = $modal.open({ + templateUrl: 'views/modals/wallets.html', + windowClass: animatedSlideUp, + controller: ModalInstanceCtrl, + }); + + modalInstance.result.finally(function() { + var m = angular.element(document.getElementsByClassName('reveal-modal')); + m.addClass('slideOutDown'); + }); + + modalInstance.result.then(function(obj) { + $timeout(function() { + self.selectedWalletId = obj.walletId; + self.selectedWalletName = obj.walletName; + self.selectedWalletAddr = obj.walletAddr; + $scope.$apply(); + }, 100); + }); + }; + this.getBuyPrice = function(token, price) { var self = this; this.error = null; @@ -46,38 +113,28 @@ angular.module('copayApp.controllers').controller('buyGlideraController', }; this.sendRequest = function(token, permissions, twoFaCode) { - var fc = profileService.focusedClient; - if (!fc) return; var self = this; self.error = null; - addressService.getAddress(fc.credentials.walletId, null, function(err, addr) { - if (!addr) { - self.error = bwsError.msg(err); - $scope.$apply(); - } - else { - self.loading = gettext('Buying bitcoin...'); - var data = { - destinationAddress: addr, - qty: self.buyPrice.qty, - priceUuid: self.buyPrice.priceUuid, - useCurrentPrice: false, - ip: null - }; - $timeout(function() { - glideraService.buy(token, twoFaCode, data, function(err, data) { - self.loading = null; - if (err) { - self.error = err; - } - else { - self.success = data; - $scope.$emit('Local/GlideraTx'); - } - }); - }, 100); - } - }); + self.loading = gettext('Buying bitcoin...'); + var data = { + destinationAddress: self.selectedWalletAddr, + qty: self.buyPrice.qty, + priceUuid: self.buyPrice.priceUuid, + useCurrentPrice: false, + ip: null + }; + $timeout(function() { + glideraService.buy(token, twoFaCode, data, function(err, data) { + self.loading = null; + if (err) { + self.error = err; + } + else { + self.success = data; + $scope.$emit('Local/GlideraTx'); + } + }); + }, 100); }; }); diff --git a/src/js/controllers/glidera.js b/src/js/controllers/glidera.js index 4d54c61cb..2d6c4dbce 100644 --- a/src/js/controllers/glidera.js +++ b/src/js/controllers/glidera.js @@ -25,7 +25,7 @@ angular.module('copayApp.controllers').controller('glideraController', } else if (data && data.access_token) { storageService.setGlideraToken(fc.credentials.network, data.access_token, function() { - $scope.$emit('Local/GlideraTokenUpdated', data.access_token); + $scope.$emit('Local/GlideraUpdated', data.access_token); $timeout(function() { $scope.$apply(); }, 100); diff --git a/src/js/controllers/glideraUri.js b/src/js/controllers/glideraUri.js index 56e031d03..97d21ef6b 100644 --- a/src/js/controllers/glideraUri.js +++ b/src/js/controllers/glideraUri.js @@ -18,7 +18,7 @@ angular.module('copayApp.controllers').controller('glideraUriController', } else if (data && data.access_token) { storageService.setGlideraToken(fc.credentials.network, data.access_token, function() { - $scope.$emit('Local/GlideraTokenUpdated', data.access_token); + $scope.$emit('Local/GlideraUpdated', data.access_token); $timeout(function() { go.path('glidera'); $scope.$apply(); diff --git a/src/js/controllers/index.js b/src/js/controllers/index.js index b0fe9e6fe..819271a9d 100644 --- a/src/js/controllers/index.js +++ b/src/js/controllers/index.js @@ -113,13 +113,6 @@ angular.module('copayApp.controllers').controller('indexController', function($r self.pendingTxProposalsCountForUs = null; self.setSpendUnconfirmed(); - self.glideraToken = null; - self.glideraError = null; - self.glideraPermissions = null; - self.glideraEmail = null; - self.glideraPersonalInfo = null; - self.glideraTxs = null; - $timeout(function() { self.hasProfile = true; self.noFocusedWallet = false; @@ -312,7 +305,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r self.setBalance(walletStatus.balance); self.otherWallets = lodash.filter(profileService.getWallets(self.network), function(w) { return w.id != self.walletId; - });; + }); // Notify external addons or plugins $rootScope.$emit('Local/BalanceUpdated', walletStatus.balance); @@ -393,7 +386,6 @@ angular.module('copayApp.controllers').controller('indexController', function($r self.setOngoingProcess('updatingPendingTxps', true); $log.debug('Updating PendingTxps'); fc.getTxProposals({}, function(err, txps) { -console.log('[index.js:395]',txps); //TODO self.setOngoingProcess('updatingPendingTxps', false); if (err) { self.handleError(err); @@ -838,16 +830,27 @@ console.log('[index.js:395]',txps); //TODO }; self.initGlidera = function(accessToken) { - if (self.isShared) return; + self.glideraEnabled = configService.getSync().glidera.enabled; + self.glideraTestnet = configService.getSync().glidera.testnet; + var network = self.glideraTestnet ? 'testnet' : 'livenet'; + + self.glideraToken = null; + self.glideraError = null; + self.glideraPermissions = null; + self.glideraEmail = null; + self.glideraPersonalInfo = null; + self.glideraTxs = null; self.glideraStatus = null; - glideraService.setCredentials(self.network); + if (!self.glideraEnabled || self.isShared) return; + + glideraService.setCredentials(network); var getToken = function(cb) { if (accessToken) { cb(null, accessToken); } else { - storageService.getGlideraToken(self.network, cb); + storageService.getGlideraToken(network, cb); } }; @@ -959,7 +962,7 @@ console.log('[index.js:395]',txps); //TODO }); }); - $rootScope.$on('Local/GlideraTokenUpdated', function(event, accessToken) { + $rootScope.$on('Local/GlideraUpdated', function(event, accessToken) { self.initGlidera(accessToken); }); diff --git a/src/js/controllers/preferences.js b/src/js/controllers/preferences.js index 468b74841..c26db89e3 100644 --- a/src/js/controllers/preferences.js +++ b/src/js/controllers/preferences.js @@ -10,6 +10,8 @@ angular.module('copayApp.controllers').controller('preferencesController', isoCode: config.wallet.settings.alternativeIsoCode }; $scope.spendUnconfirmed = config.wallet.spendUnconfirmed; + $scope.glideraEnabled = config.glidera.enabled; + $scope.glideraTestnet = config.glidera.testnet; var fc = profileService.focusedClient; if (fc) $scope.encrypt = fc.hasPrivKeyEncrypted(); @@ -61,8 +63,36 @@ angular.module('copayApp.controllers').controller('preferencesController', } }); + var unwatchGlideraEnabled = $scope.$watch('glideraEnabled', function(newVal, oldVal) { + if (newVal == oldVal) return; + var opts = { + glidera: { + enabled: newVal + } + }; + configService.set(opts, function(err) { + $rootScope.$emit('Local/GlideraUpdated'); + if (err) $log.debug(err); + }); + }); + + var unwatchGlideraTestnet = $scope.$watch('glideraTestnet', function(newVal, oldVal) { + if (newVal == oldVal) return; + var opts = { + glidera: { + testnet: newVal + } + }; + configService.set(opts, function(err) { + $rootScope.$emit('Local/GlideraUpdated'); + if (err) $log.debug(err); + }); + }); + $scope.$on('$destroy', function() { unwatch(); unwatchSpendUnconfirmed(); + unwatchGlideraEnabled(); + unwatchGlideraTestnet(); }); }); diff --git a/src/js/controllers/sellGlidera.js b/src/js/controllers/sellGlidera.js index 4d6622055..e3f6c7e07 100644 --- a/src/js/controllers/sellGlidera.js +++ b/src/js/controllers/sellGlidera.js @@ -1,8 +1,9 @@ 'use strict'; angular.module('copayApp.controllers').controller('sellGlideraController', - function($scope, $timeout, $log, gettext, gettextCatalog, configService, profileService, addressService, feeService, glideraService, bwsError) { + function($scope, $timeout, $log, $modal, gettext, gettextCatalog, configService, profileService, addressService, feeService, glideraService, bwsError, lodash, isChromeApp) { + var self = this; var config = configService.getSync(); this.data = {}; this.show2faCodeInput = null; @@ -11,6 +12,65 @@ angular.module('copayApp.controllers').controller('sellGlideraController', this.loading = null; this.currentSpendUnconfirmed = config.wallet.spendUnconfirmed; this.currentFeeLevel = config.wallet.settings.feeLevel || 'normal'; + var fc; + + // DISABLE ANIMATION ON CHROMEAPP + if (isChromeApp) { + var animatedSlideUp = 'full'; + } else { + var animatedSlideUp = 'full animated slideInUp'; + } + + this.otherWallets = function(testnet) { + var network = testnet ? 'testnet' : 'livenet'; + return lodash.filter(profileService.getWallets(network), function(w) { + return w.network == network && w.m == 1; + }); + }; + + $scope.openWalletsModal = function(wallets) { + self.error = null; + self.selectedWalletId = null; + self.selectedWalletName = null; + var ModalInstanceCtrl = function($scope, $modalInstance) { + $scope.wallets = wallets; + $scope.cancel = function() { + $modalInstance.dismiss('cancel'); + }; + + $scope.selectWallet = function(walletId, walletName) { + if (!profileService.getClient(walletId).isComplete()) { + self.error = bwsError.msg({'code': 'WALLET_NOT_COMPLETE'}, gettextCatalog.getString('Could not choose the wallet')); + $modalInstance.dismiss('cancel'); + return; + } + $modalInstance.close({ + 'walletId': walletId, + 'walletName': walletName, + }); + }; + }; + + var modalInstance = $modal.open({ + templateUrl: 'views/modals/wallets.html', + windowClass: animatedSlideUp, + controller: ModalInstanceCtrl, + }); + + modalInstance.result.finally(function() { + var m = angular.element(document.getElementsByClassName('reveal-modal')); + m.addClass('slideOutDown'); + }); + + modalInstance.result.then(function(obj) { + $timeout(function() { + self.selectedWalletId = obj.walletId; + self.selectedWalletName = obj.walletName; + fc = profileService.getClient(obj.walletId); + $scope.$apply(); + }, 100); + }); + }; this.getSellPrice = function(token, price) { var self = this; @@ -50,7 +110,6 @@ angular.module('copayApp.controllers').controller('sellGlideraController', this.createTx = function(token, permissions, twoFaCode) { var self = this; - var fc = profileService.focusedClient; self.error = null; this.loading = gettext('Selling Bitcoin...'); @@ -58,7 +117,7 @@ angular.module('copayApp.controllers').controller('sellGlideraController', addressService.getAddress(fc.credentials.walletId, null, function(err, refundAddress) { if (!refundAddress) { self.loading = null; - self.error = bwsError.msg(err); + self.error = bwsError.msg(err, gettext('Could not create address')); return; } glideraService.getSellAddress(token, function(error, sellAddress) { @@ -139,7 +198,6 @@ angular.module('copayApp.controllers').controller('sellGlideraController', var _signTx = function(txp, cb) { var self = this; - var fc = profileService.focusedClient; fc.signTxProposal(txp, function(err, signedTx) { profileService.lockFC(); if (err) { diff --git a/src/js/services/configService.js b/src/js/services/configService.js index 07bdf38eb..427e31325 100644 --- a/src/js/services/configService.js +++ b/src/js/services/configService.js @@ -32,6 +32,12 @@ angular.module('copayApp.services').factory('configService', function(storageSer } }, + // External services + glidera: { + enabled: true, + testnet: false + }, + rates: { url: 'https://insight.bitpay.com:443/api/rates', }, @@ -63,6 +69,9 @@ angular.module('copayApp.services').factory('configService', function(storageSer if (!configCache.wallet.settings.unitCode) { configCache.wallet.settings.unitCode = defaultConfig.wallet.settings.unitCode; } + if (!configCache.glidera) { + configCache.glidera = defaultConfig.glidera; + } } else { configCache = lodash.clone(defaultConfig); From 62b001369f144dca2c9fea00cff6a5747842e6ed Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Fri, 11 Sep 2015 13:15:16 -0300 Subject: [PATCH 2/2] Title --- public/views/glidera.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/views/glidera.html b/public/views/glidera.html index d18959b1c..218125c07 100644 --- a/public/views/glidera.html +++ b/public/views/glidera.html @@ -2,7 +2,7 @@
    + ng-init="titleSection='Buy & Sell Bitcoin'; closeToHome = true">