- 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();