diff --git a/public/index.html b/public/index.html index 88cbd56cb..1c3633722 100644 --- a/public/index.html +++ b/public/index.html @@ -24,8 +24,8 @@
-
+
+
+
+ +
+
+
+ + {{index.showAlert.msg|translate}} +
+
+ OK +
+
+
diff --git a/public/views/walletHome.html b/public/views/walletHome.html index 02d459b87..d2a69224f 100644 --- a/public/views/walletHome.html +++ b/public/views/walletHome.html @@ -76,7 +76,7 @@
- Could not update Wallet + {{index.updateError|translate}}
diff --git a/src/css/main.css b/src/css/main.css index 3de53f411..00bc52152 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -1119,6 +1119,17 @@ input.ng-invalid-match, input.ng-invalid-match:focus { padding: 0.6rem 0.8rem !important; } +.alertModal { + background: #FFFFFF; + box-shadow: 0px 0px 6px 0px rgba(0,0,0,0.50); + border-radius: 5px; + position: absolute; + width: 90%; + left: 5%; + top: 15%; + z-index: 1100; +} + .passModal { background: #FFFFFF; box-shadow: 0px 0px 6px 0px rgba(0,0,0,0.50); diff --git a/src/js/controllers/create.js b/src/js/controllers/create.js index c696d487b..8ac67f68a 100644 --- a/src/js/controllers/create.js +++ b/src/js/controllers/create.js @@ -63,6 +63,9 @@ angular.module('copayApp.controllers').controller('createController', if (err) { $log.debug(err); self.error = err; + $timeout(function() { + $rootScope.$apply(); + }); } else { go.walletHome(); diff --git a/src/js/controllers/index.js b/src/js/controllers/index.js index 0963c7a7d..4ee500d03 100644 --- a/src/js/controllers/index.js +++ b/src/js/controllers/index.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('indexController', function($rootScope, $scope, $log, $filter, $timeout, lodash, go, profileService, configService, isCordova, rateService, storageService, addressService, gettextCatalog, gettext, amMoment, nodeWebkit, addonManager, feeService, isChromeApp) { +angular.module('copayApp.controllers').controller('indexController', function($rootScope, $scope, $log, $filter, $timeout, lodash, go, profileService, configService, isCordova, rateService, storageService, addressService, gettextCatalog, gettext, amMoment, nodeWebkit, addonManager, feeService, isChromeApp, bwsError) { var self = this; self.isCordova = isCordova; self.onGoingProcess = {}; @@ -243,7 +243,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r self.updateError = false; return fc.getStatus(function(err, ret) { if (err) { - self.updateError = true; + self.updateError = bwsError.msg(err, gettext('Could not update Wallet')); } else { if (!opts.quiet) self.setOngoingProcess('scanning', ret.wallet.scanning); @@ -319,12 +319,12 @@ angular.module('copayApp.controllers').controller('indexController', function($r self.setSendMax = function() { // Set Send max - if (self.currentFeeLevel && self.totalBytesToSendMax) { + if (self.currentFeeLevel && self.totalBytesToSendMax) { feeService.getCurrentFeeValue(self.currentFeeLevel, function(err, feePerKb) { // KB to send max if (self.totalBytesToSendMax) { - var feeToSendMaxSat = parseInt(((self.totalBytesToSendMax * feePerKb ) / 1000.).toFixed(0)); + var feeToSendMaxSat = parseInt(((self.totalBytesToSendMax * feePerKb) / 1000.).toFixed(0)); self.availableMaxBalance = strip((self.availableBalanceSat - feeToSendMaxSat) * self.satToUnit); self.feeToSendMaxStr = profileService.formatAmount(feeToSendMaxSat) + ' ' + self.unitName; } else { @@ -360,8 +360,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r fc.getBalance(function(err, balance) { self.setOngoingProcess('updatingBalance', false); if (err) { - $log.debug('Wallet Balance ERROR:', err); - $scope.$emit('Local/ClientError', err); + self.handleError(err); return; } $log.debug('Wallet Balance:', balance); @@ -378,8 +377,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r fc.getTxProposals({}, function(err, txps) { self.setOngoingProcess('updatingPendingTxps', false); if (err) { - $log.debug('Wallet PendingTxps ERROR:', err); - $scope.$emit('Local/ClientError', err); + self.handleError(err); } else { $log.debug('Wallet PendingTxps:', txps); self.setPendingTxps(txps); @@ -392,7 +390,6 @@ angular.module('copayApp.controllers').controller('indexController', function($r self.updateTxHistory = function(skip) { var fc = profileService.focusedClient; if (!fc.isComplete()) return; - if (!skip) { self.txHistory = []; } @@ -401,6 +398,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r self.txHistoryError = false; self.updatingTxHistory = true; self.txHistoryPaging = false; + $timeout(function() { fc.getTxHistory({ skip: self.skipHistory, @@ -410,8 +408,10 @@ angular.module('copayApp.controllers').controller('indexController', function($r if (err) { $log.debug('TxHistory ERROR:', err); // We do not should errors here, since history is usually - // fetched AFTER others requests. - //self.handleError(err); + // fetched AFTER others requests (if skip=0) + if (skip) + self.handleError(err); + self.txHistoryError = true; } else { $log.debug('Wallet Transaction History:', txs); @@ -423,14 +423,20 @@ angular.module('copayApp.controllers').controller('indexController', function($r }); }; + // This handles errors from BWS/index with are nomally + // trigger from async events (like updates) self.handleError = function(err) { $log.warn('Client ERROR:', err); if (err.code === 'NOT_AUTHORIZED') { - $scope.$emit('Local/NotAuthorized'); + self.notAuthorized = true; + go.walletHome(); } else if (err.code === 'NOT_FOUND') { - $scope.$emit('Local/BWSNotFound'); + self.showErrorPopup(gettext('Could not access Wallet Service: Not found')); } else { + var msg = "" $scope.$emit('Local/ClientError', (err.error ? err.error : err)); + var msg = bwsError.msg(err, gettext('Error at Wallet Service')); + self.showErrorPopup(msg); } }; self.openWallet = function() { @@ -478,7 +484,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r if (tx.outputs.length === 1 && !tx.outputs[0].message) { tx.showSingle = true; tx.toAddress = tx.outputs[0].toAddress; // txproposal - tx.address = tx.outputs[0].address; // txhistory + tx.address = tx.outputs[0].address; // txhistory } } }; @@ -718,7 +724,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r getHistory(null, function(err, txs) { self.setOngoingProcess('generatingCSV', false); if (err) { - $log.debug('TxHistory ERROR:', err); + self.handleError(err); } else { $log.debug('Wallet Transaction History:', txs); @@ -745,11 +751,11 @@ angular.module('copayApp.controllers').controller('indexController', function($r _note += ' Moved:' + (it.amount * satToBtc).toFixed(8) dataString = formatDate(it.time * 1000) + ',' + formatString(it.addressTo) + ',' + _note + ',' + _amount + ',BTC,,,,'; - csvContent += dataString + "\n"; + csvContent += dataString + "\n"; if (it.fees && (it.action == 'moved' || it.action == 'sent')) { var _fee = (it.fees * satToBtc).toFixed(8) - csvContent += formatDate(it.time * 1000) + ',Bitcoin Network Fees,, -' + _fee + ',BTC,,,,' + "\n"; + csvContent += formatDate(it.time * 1000) + ',Bitcoin Network Fees,, -' + _fee + ',BTC,,,,' + "\n"; } }); @@ -768,35 +774,21 @@ angular.module('copayApp.controllers').controller('indexController', function($r }); }; - self.clientError = function(err) { - if (isCordova) { - navigator.notification.confirm( - err, - function() {}, - 'Wallet Server Error', ['OK'] - ); - } else { - if (!isChromeApp) { - alert(err); - } - } + self.showErrorPopup = function (msg, cb) { + $log.warn('Showing err popup:' + msg); + self.showAlert = { + msg: msg, + close: function(err) { + self.showAlert = null; + if (cb) return cb(err); + }, + }; + $timeout(function() { + $rootScope.$apply(); + }); + }; - self.deviceError = function(err) { - if (isCordova) { - navigator.notification.confirm( - err, - function() {}, - 'Device Error', ['OK'] - ); - } else { - if (!isChromeApp) { - alert(err); - } - } - }; - - self.recreate = function(cb) { var fc = profileService.focusedClient; self.setOngoingProcess('recreating', true); @@ -960,6 +952,9 @@ angular.module('copayApp.controllers').controller('indexController', function($r trailing: true }); + self.debouncedUpdateHistory = lodash.throttle(function() { + self.updateTxHistory(); + }, 60000); $rootScope.$on('Local/Resume', function(event) { $log.debug('### Resume event'); @@ -969,41 +964,12 @@ angular.module('copayApp.controllers').controller('indexController', function($r $rootScope.$on('Local/BackupDone', function(event) { self.needsBackup = false; storageService.setBackupFlag(self.walletId, function(err) { - if (err) $rootScope.$emit('Local/DeviceError', err) + if (err) root.showErrorPopup(err); }); }); - $rootScope.$on('Local/NotAuthorized', function(event) { - self.notAuthorized = true; - $rootScope.$apply(); - }); - - $rootScope.$on('Local/BWSNotFound', function(event) { - self.clientError('Could not access Wallet Service: Not found'); - $rootScope.$apply(); - }); - $rootScope.$on('Local/DeviceError', function(event, err) { - self.deviceError(err); - $rootScope.$apply(); - }); - - $rootScope.$on('Local/ClientError', function(event, err) { - if (err.code && err.code === 'NOT_AUTHORIZED') { - // Show not error, just redirect to home (where the recreate option is shown) - go.walletHome(); - } else if (err && err.cors == 'rejected') { - $log.debug('CORS error:', err); - } else if (err.code === 'ETIMEDOUT' || err.code === 'CONNECTION_ERROR') { - $log.debug('Time out:', err); - } else { - var msg = 'Error at Wallet Service: '; - if (err.message) msg = msg + err.message; - else if (err.error) msg = msg + err.error; - else msg = msg + (lodash.isObject(err) ? JSON.stringify(err) : err); - self.clientError(msg); - } - $rootScope.$apply(); + root.showErrorPopup(err); }); $rootScope.$on('Local/WalletImported', function(event, walletId) { @@ -1023,6 +989,20 @@ angular.module('copayApp.controllers').controller('indexController', function($r }); }); + + $rootScope.$on('NewBlock', function() { + if (self.pendingAmount) { + self.updateAll(); + } + + if (self.network == 'testnet') { + self.debouncedUpdateHistory(); + } else { + self.updateTxHistory(); + } + }); + + $rootScope.$on('NewOutgoingTx', function() { self.updateAll({ walletStatus: null, @@ -1088,6 +1068,10 @@ angular.module('copayApp.controllers').controller('indexController', function($r self.setTab(tab, reset); }); + $rootScope.$on('Local/ShowAlert', function(event, msg, cb) { + self.showErrorPopup(msg,cb); + }); + $rootScope.$on('Local/NeedsPassword', function(event, isSetup, cb) { self.askPassword = { isSetup: isSetup, diff --git a/src/js/controllers/join.js b/src/js/controllers/join.js index 948cfe176..1ca442f8c 100644 --- a/src/js/controllers/join.js +++ b/src/js/controllers/join.js @@ -153,7 +153,7 @@ angular.module('copayApp.controllers').controller('joinController', }, function(err) { if (err) { self.loading = false; - self.error = gettext('Could not join wallet: ') + (err.message ? err.message : err); + self.error = err; $rootScope.$apply(); return } diff --git a/src/js/controllers/walletHome.js b/src/js/controllers/walletHome.js index ff1d59536..24507e51c 100644 --- a/src/js/controllers/walletHome.js +++ b/src/js/controllers/walletHome.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('walletHomeController', function($scope, $rootScope, $timeout, $filter, $modal, $log, notification, txStatus, isCordova, profileService, lodash, configService, rateService, storageService, bitcore, isChromeApp, gettext, gettextCatalog, nodeWebkit, addressService, feeService) { +angular.module('copayApp.controllers').controller('walletHomeController', function($scope, $rootScope, $timeout, $filter, $modal, $log, notification, txStatus, isCordova, profileService, lodash, configService, rateService, storageService, bitcore, isChromeApp, gettext, gettextCatalog, nodeWebkit, addressService, feeService, bwsError) { var self = this; $rootScope.hideMenuBar = false; @@ -94,24 +94,6 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi var cancel_msg = gettextCatalog.getString('Cancel'); var confirm_msg = gettextCatalog.getString('Confirm'); - // walletHome - - - var parseError = function(err) { - if (!err) return; - - if (err.message) { - // TODO : this is not used anymore? - if (err.message.indexOf('CORS') >= 0) { - err.message = gettext('Could not connect wallet service. Check your Internet connection and your wallet service configuration.'); - } - - if (err.message.indexOf('TIMEDOUT') >= 0) { - err.message = gettext('Wallet service timed out. Check your Internet connection and your wallet service configuration.'); - } - } - }; - $scope.openCopayersModal = function(copayers, copayerId) { var fc = profileService.focusedClient; @@ -152,13 +134,14 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi }); addressService.getAddress(walletId, false, function(err, addr) { $scope.gettingAddress = false; - if (!err || addr) - $modalInstance.close(addr); - else { - parseError(err); + + if (err) { self.error = err; $modalInstance.dismiss('cancel'); + return; } + + $modalInstance.close(addr); }); }; }; @@ -192,7 +175,7 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi $scope.alternativeAmountStr = tx.alternativeAmountStr; $scope.copayers = copayers $scope.copayerId = fc.credentials.copayerId; - $scope.canSign= fc.canSign(); + $scope.canSign = fc.canSign(); $scope.loading = null; $scope.color = fc.backgroundColor; refreshUntilItChanges = false; @@ -247,8 +230,7 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi if (fc.isPrivKeyEncrypted()) { profileService.unlockFC(function(err) { if (err) { - parseError(err); - $scope.error = err; + $scope.error = bwsError.msg(err); return; } return $scope.sign(txp); @@ -265,8 +247,7 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi self.setOngoingProcess(); if (err) { $scope.loading = false; - parseError(err); - $scope.error = err.message || gettext('Could not accept payment. Check your Internet connection and try again'); + $scope.error = bwsError.msg(err, gettext('Could not accept payment')); $scope.$digest(); } else { //if txp has required signatures then broadcast it @@ -278,8 +259,7 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi self.setOngoingProcess(); $scope.loading = false; if (err) { - parseError(err); - $scope.error = gettext('Could not broadcast payment. Check your Internet connection and try again'); + $scope.error = bwsError.msg(err, gettext('Could not broadcast payment')); $scope.$digest(); } else { $log.debug('Transaction signed and broadcasted') @@ -308,8 +288,7 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi self.setOngoingProcess(); $scope.loading = false; if (err) { - parseError(err); - $scope.error = err.message || gettext('Could not reject payment. Check your Internet connection and try again'); + $scope.error = bwsError.msg(err, gettext('Could not reject payment')); $scope.$digest(); } else { $modalInstance.close(txpr); @@ -330,8 +309,7 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi // Hacky: request tries to parse an empty response if (err && !(err.message && err.message.match(/Unexpected/))) { - parseError(err); - $scope.error = err.message || gettext('Could not delete payment proposal. Check your Internet connection and try again'); + $scope.error = bwsError.msg(err, gettext('Could not delete payment proposal')); $scope.$digest(); return; } @@ -349,8 +327,7 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi self.setOngoingProcess(); $scope.loading = false; if (err) { - parseError(err); - $scope.error = err.message || gettext('Could not broadcast payment. Check your Internet connection and try again'); + $scope.error = bwsError.msg(err, gettext('Could not broadcast payment')); $scope.$digest(); } else { @@ -421,13 +398,12 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi self.generatingAddress = false; if (err) { - parseError(err); - self.addrError = err.message || gettext('Could not create address. Check your Internet connection and try again'); + self.addrError = err; + } else { + if (addr) + self.addr[fc.credentials.walletId] = addr; } - if (addr) - self.addr[fc.credentials.walletId] = addr; - $scope.$digest(); }); }); @@ -678,16 +654,10 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi this.setSendError = function(err) { var fc = profileService.focusedClient; - $log.warn(err); - parseError(err); - var errMessage = + var prefix = fc.credentials.m > 1 ? gettext('Could not create payment proposal') : gettext('Could not send payment'); - //This are abnormal situations, but still err message will not be translated - //(the should) we should switch using err.code and use proper gettext messages - errMessage = errMessage + '. ' + (err.message ? err.message : gettext('Check your Internet connection and try again')); - - this.error = errMessage; + this.error = bwsError.msg(err, prefix); $timeout(function() { $scope.$digest(); @@ -721,7 +691,7 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi this.submitForm = function() { var fc = profileService.focusedClient; var unitToSat = this.unitToSatoshi; - + if (isCordova && this.isWindowsPhoneApp) { this.hideAddress = false; this.hideAmount = false; @@ -752,7 +722,7 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi feeService.getCurrentFeeValue(self.currentSendFeeLevel, function(err, feePerKb) { if (err) $log.debug(err); -console.log('[walletHome.js.757:amount:]',amount, feePerKb); //TODO + console.log('[walletHome.js.757:amount:]', amount, feePerKb); //TODO fc.sendTxProposal({ toAddress: address, amount: amount, @@ -802,8 +772,7 @@ console.log('[walletHome.js.757:amount:]',amount, feePerKb); //TODO profileService.lockFC(); self.setOngoingProcess(); if (err) { - $log.debug('Sign error:', err); - err.message = gettext('The payment was created but could not be signed. Please try again from home screen.') + (err.message ? ' ' + err.message : ''); + err.message = bwsError.msg(err, gettext('The payment was created but could not be signed. Please try again from home screen')); return cb(err); } @@ -812,7 +781,7 @@ console.log('[walletHome.js.757:amount:]',amount, feePerKb); //TODO fc.broadcastTxProposal(signedTx, function(err, btx, memo) { self.setOngoingProcess(); if (err) { - err.message = gettext('The payment was signed but could not be broadcasted. Please try again from home screen.') + (err.message ? ' ' + err.message : ''); + err.message = bwsError.msg(err, gettext('The payment was signed but could not be broadcasted. Please try again from home screen')); return cb(err); } if (memo) @@ -1077,7 +1046,7 @@ console.log('[walletHome.js.757:amount:]',amount, feePerKb); //TODO }; this.confirmDialog = function(msg, cb) { - if (isCordova) { + if (isCordova) { navigator.notification.confirm( msg, function(buttonIndex) { @@ -1105,11 +1074,11 @@ console.log('[walletHome.js.757:amount:]',amount, feePerKb); //TODO fee: feeStr }); - this.confirmDialog(msg, function(confirmed){ - if (confirmed) + this.confirmDialog(msg, function(confirmed) { + if (confirmed) self._doSendAll(amount); }); - }; + }; /* Start setup */ diff --git a/src/js/services/addressService.js b/src/js/services/addressService.js index 39978f94a..b0432d00a 100644 --- a/src/js/services/addressService.js +++ b/src/js/services/addressService.js @@ -1,7 +1,7 @@ 'use strict'; 'use strict'; angular.module('copayApp.services') - .factory('addressService', function(storageService, profileService, $log, $timeout, lodash) { + .factory('addressService', function(storageService, profileService, $log, $timeout, lodash, bwsError, gettext) { var root = {}; @@ -34,8 +34,7 @@ angular.module('copayApp.services') root._createAddress(walletId, cb); }, 5000); } - $log.debug('Creating address ERROR:', err); - return cb(err); + return bwsError.cb(err, gettext('Could not create address'), cb); } return cb(null, addr.address); }); diff --git a/src/js/services/bwsError.js b/src/js/services/bwsError.js new file mode 100644 index 000000000..3dec7ccc4 --- /dev/null +++ b/src/js/services/bwsError.js @@ -0,0 +1,100 @@ +'use strict'; +angular.module('copayApp.services') + .factory('bwsError', function bwcErrorService($log, gettext) { + var root = {}; + + root.msg = function(err, prefix) { + var body = ''; + prefix = prefix || ''; + + if (err && err.code) { + switch(err.code) { + case 'CONNECTION_ERROR': + body = gettext('Network connection error'); + break; + case 'NOT_FOUND': + body = gettext('Wallet service not found'); + break; + case 'BAD_SIGNATURES': + body = gettext('Signatures rejected by server'); + break; + case 'COPAYER_DATA_MISMATCH': + body = gettext('Copayer data mismatch'); + break; + case 'COPAYER_IN_WALLET': + body = gettext('Copayer already in this wallet'); + break; + case 'COPAYER_REGISTERED': + body = gettext('Copayer already registered'); + break; + case 'COPAYER_VOTED': + body = gettext('Copayer already voted on this spend proposal'); + break; + case 'DUST_AMOUNT': + body = gettext('Amount below dust threshold'); + break; + case 'INCORRECT_ADDRESS_NETWORK': + body = gettext('Incorrect address network'); + break; + case 'INSUFFICIENT_FUNDS': + body = gettext('Insufficient funds'); + break; + case 'INSUFFICIENT_FUNDS_FOR_FEE': + body = gettext('Insufficient funds for fee'); + break; + case 'INVALID_ADDRESS': + body = gettext('Invalid address'); + break; + case 'LOCKED_FUNDS': + body = gettext('Funds are locked by pending spend proposals'); + break; + case 'NOT_AUTHORIZED': + body = gettext('Not authorized'); + break; + case 'TX_ALREADY_BROADCASTED': + body = gettext('Transaction already broadcasted'); + break; + case 'TX_CANNOT_CREATE': + body = gettext('Locktime in effect. Please wait to create a new spend proposal'); + break; + case 'TX_CANNOT_REMOVE': + body = gettext('Locktime in effect. Please wait to remove this spend proposal'); + break; + case 'TX_NOT_ACCEPTED': + body = gettext('Spend proposal is not accepted'); + break; + case 'TX_NOT_FOUND': + body = gettext('Spend proposal not found'); + break; + case 'TX_NOT_PENDING': + body = gettext('The spend proposal is not pending'); + break; + case 'UPGRADE_NEEDED': + body = gettext('Please upgrade Copay to perform this action'); + break; + case 'WALLET_ALREADY_EXISTS': + body = gettext('Wallet already exists'); + break; + case 'WALLET_FULL': + body = gettext('Wallet is full'); + break; + case 'WALLET_NOT_COMPLETE': + body = gettext('Wallet is not complete'); + break; + case 'WALLET_NOT_FOUND': + body = gettext('Wallet not found'); + break; + } + } + + var msg = prefix + ( body ? ': ' + body : ''); + $log.warn("BWC ERROR:" + msg); + return msg; + }; + + root.cb = function (err,prefix, cb) { + return cb(root.msg(err, prefix)) + }; + + return root; + }); diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index e16408c45..d3bb65c1f 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -1,6 +1,6 @@ 'use strict'; angular.module('copayApp.services') - .factory('profileService', function profileServiceFactory($rootScope, $location, $timeout, $filter, $log, lodash, storageService, bwcService, configService, notificationService, isChromeApp, isCordova, gettext, nodeWebkit) { + .factory('profileService', function profileServiceFactory($rootScope, $location, $timeout, $filter, $log, lodash, storageService, bwcService, configService, notificationService, isChromeApp, isCordova, gettext, nodeWebkit, bwsError) { var root = {}; @@ -11,7 +11,6 @@ angular.module('copayApp.services') root.getUtils = function() { return bwcService.getUtils(); }; - root.formatAmount = function(amount) { var config = configService.getSync().wallet.settings; if (config.unitCode == 'sat') return amount; @@ -176,7 +175,7 @@ angular.module('copayApp.services') walletClient.createWallet('Personal Wallet', 'me', 1, 1, { network: 'livenet' }, function(err) { - if (err) return cb(gettext('Error creating wallet. Check your internet connection')); + if (err) return bwsError.cb(err, gettext('Error creating wallet'), cb); var p = Profile.create({ credentials: [JSON.parse(walletClient.export())], }); @@ -198,7 +197,7 @@ angular.module('copayApp.services') walletClient.createWallet(opts.name, opts.myName || 'me', opts.m, opts.n, { network: opts.networkName }, function(err, secret) { - if (err) return cb(gettext('Error creating wallet')); + if (err) return bwsError.cb(err, gettext('Error creating wallet'), cb); root.profile.credentials.push(JSON.parse(walletClient.export())); root.setWalletClients(); @@ -221,8 +220,23 @@ angular.module('copayApp.services') return cb(gettext('Could not join using the specified extended private key')); } } + + + try { + var walletData = this.getUtils().fromSecret(opts.secret); + + // check if exist + if (lodash.find(root.profile.credentials, { + 'walletId': walletData.walletId + })) { + return cb(gettext('Cannot join the same wallet more that once')); + } + } catch (ex) { + return cb(gettext('Bad wallet invitation')); + } + walletClient.joinWallet(opts.secret, opts.myName || 'me', function(err) { - if (err) return cb(err); + if (err) return bwsError.cb(err, gettext('Could not join wallet'), cb); root.profile.credentials.push(JSON.parse(walletClient.export())); root.setWalletClients();