2015-03-06 07:00:10 -08:00
|
|
|
'use strict';
|
|
|
|
|
2015-10-07 12:17:19 -07:00
|
|
|
angular.module('copayApp.controllers').controller('indexController', function($rootScope, $scope, $log, $filter, $timeout, lodash, go, profileService, configService, isCordova, rateService, storageService, addressService, gettext, gettextCatalog, amMoment, nodeWebkit, addonManager, feeService, isChromeApp, bwsError, txFormatService, uxLanguage, $state, glideraService, isMobile) {
|
2015-03-06 07:00:10 -08:00
|
|
|
var self = this;
|
|
|
|
self.isCordova = isCordova;
|
2015-09-04 17:18:20 -07:00
|
|
|
self.isChromeApp = isChromeApp;
|
2015-10-07 08:17:13 -07:00
|
|
|
self.isSafari = isMobile.Safari();
|
2015-03-06 07:00:10 -08:00
|
|
|
self.onGoingProcess = {};
|
2015-04-23 11:19:30 -07:00
|
|
|
self.limitHistory = 5;
|
2015-03-06 07:00:10 -08:00
|
|
|
|
|
|
|
function strip(number) {
|
|
|
|
return (parseFloat(number.toPrecision(12)));
|
|
|
|
};
|
|
|
|
|
2015-05-07 14:35:54 -07:00
|
|
|
self.goHome = function() {
|
|
|
|
go.walletHome();
|
|
|
|
};
|
|
|
|
|
2015-04-21 22:48:00 -07:00
|
|
|
self.menu = [{
|
2015-04-29 15:19:10 -07:00
|
|
|
'title': gettext('Home'),
|
2015-04-21 22:48:00 -07:00
|
|
|
'icon': 'icon-home',
|
2015-04-23 13:45:32 -07:00
|
|
|
'link': 'walletHome'
|
2015-04-21 22:48:00 -07:00
|
|
|
}, {
|
2015-04-29 15:19:10 -07:00
|
|
|
'title': gettext('Receive'),
|
2015-04-29 08:16:28 -07:00
|
|
|
'icon': 'icon-receive2',
|
2015-04-21 22:48:00 -07:00
|
|
|
'link': 'receive'
|
|
|
|
}, {
|
2015-04-29 15:19:10 -07:00
|
|
|
'title': gettext('Send'),
|
2015-04-21 22:48:00 -07:00
|
|
|
'icon': 'icon-paperplane',
|
|
|
|
'link': 'send'
|
|
|
|
}, {
|
2015-04-29 15:19:10 -07:00
|
|
|
'title': gettext('History'),
|
2015-04-21 22:48:00 -07:00
|
|
|
'icon': 'icon-history',
|
|
|
|
'link': 'history'
|
2015-04-23 11:19:30 -07:00
|
|
|
}];
|
2015-04-21 22:48:00 -07:00
|
|
|
|
Addon support
Addons are simple Angular modules with views, controllers, services etc. Addons can register
themselves in Copay using pluginManagerProvider. It allows them to add extra items to the bottom
menu and as well as extra tab-views:
````
addonManagerProvider.registerAddon({
menuItem: {
'title': 'Assets',
'icon': 'icon-pricetag',
'link': 'assets'
},
view: {
id: 'assets',
'class': 'assets',
template: 'colored-coins/views/assets.html'
}
});
````
Addons can consume core Copay services and listen for events to react on changes. For this very
first addon system inplementation Copay emits additional BalanceUpdated event so that interested
addons can react on new transactions (see plugin reference implementation below).
As bottom menu can accomodate only 6 items without sacrificing usability, so it was reworked to
have second layer of items. Now If menu has more than 6 items, toggle button will be added to
the menu allowing to reveal extra items in a sliding panel. Bottom menu in this case will show
only 5 items, the rest will be rendered on sliding panel.
This changes addresses issue #2949 and reference implementation of addon could be found here:
https://github.com/troggy/copay-colored-coins-plugin
2015-07-04 03:02:46 -07:00
|
|
|
self.addonViews = addonManager.addonViews();
|
|
|
|
self.menu = self.menu.concat(addonManager.addonMenuItems());
|
2015-08-31 20:52:54 -07:00
|
|
|
self.menuItemSize = self.menu.length > 5 ? 2 : 3;
|
2015-08-11 07:40:24 -07:00
|
|
|
self.txTemplateUrl = addonManager.txTemplateUrl() || 'views/includes/transaction.html';
|
Addon support
Addons are simple Angular modules with views, controllers, services etc. Addons can register
themselves in Copay using pluginManagerProvider. It allows them to add extra items to the bottom
menu and as well as extra tab-views:
````
addonManagerProvider.registerAddon({
menuItem: {
'title': 'Assets',
'icon': 'icon-pricetag',
'link': 'assets'
},
view: {
id: 'assets',
'class': 'assets',
template: 'colored-coins/views/assets.html'
}
});
````
Addons can consume core Copay services and listen for events to react on changes. For this very
first addon system inplementation Copay emits additional BalanceUpdated event so that interested
addons can react on new transactions (see plugin reference implementation below).
As bottom menu can accomodate only 6 items without sacrificing usability, so it was reworked to
have second layer of items. Now If menu has more than 6 items, toggle button will be added to
the menu allowing to reveal extra items in a sliding panel. Bottom menu in this case will show
only 5 items, the rest will be rendered on sliding panel.
This changes addresses issue #2949 and reference implementation of addon could be found here:
https://github.com/troggy/copay-colored-coins-plugin
2015-07-04 03:02:46 -07:00
|
|
|
|
2015-04-23 08:27:43 -07:00
|
|
|
self.tab = 'walletHome';
|
|
|
|
|
2015-07-30 11:26:16 -07:00
|
|
|
self.feeOpts = feeService.feeOpts;
|
|
|
|
|
2015-06-19 11:09:15 -07:00
|
|
|
self.setOngoingProcess = function(processName, isOn) {
|
2015-03-06 07:00:10 -08:00
|
|
|
$log.debug('onGoingProcess', processName, isOn);
|
|
|
|
self[processName] = isOn;
|
|
|
|
self.onGoingProcess[processName] = isOn;
|
|
|
|
|
|
|
|
var name;
|
|
|
|
self.anyOnGoingProcess = lodash.any(self.onGoingProcess, function(isOn, processName) {
|
|
|
|
if (isOn)
|
|
|
|
name = name || processName;
|
|
|
|
return isOn;
|
|
|
|
});
|
|
|
|
// The first one
|
|
|
|
self.onGoingProcessName = name;
|
2015-04-14 08:51:49 -07:00
|
|
|
$timeout(function() {
|
|
|
|
$rootScope.$apply();
|
|
|
|
});
|
2015-03-06 07:00:10 -08:00
|
|
|
};
|
|
|
|
|
|
|
|
self.setFocusedWallet = function() {
|
|
|
|
var fc = profileService.focusedClient;
|
|
|
|
if (!fc) return;
|
|
|
|
|
2015-04-15 09:39:48 -07:00
|
|
|
// Clean status
|
2015-08-11 13:45:57 -07:00
|
|
|
self.totalBalanceSat = null;
|
|
|
|
self.lockedBalanceSat = null;
|
|
|
|
self.availableBalanceSat = null;
|
2015-08-19 13:10:40 -07:00
|
|
|
self.pendingAmount = null;
|
2015-08-19 13:39:31 -07:00
|
|
|
self.spendUnconfirmed = null;
|
2015-08-11 13:45:57 -07:00
|
|
|
|
2015-05-30 19:01:45 -07:00
|
|
|
self.totalBalanceStr = null;
|
2015-08-11 13:45:57 -07:00
|
|
|
self.availableBalanceStr = null;
|
2015-05-30 19:01:45 -07:00
|
|
|
self.lockedBalanceStr = null;
|
2015-08-11 13:45:57 -07:00
|
|
|
|
2015-04-15 09:39:48 -07:00
|
|
|
self.alternativeBalanceAvailable = false;
|
|
|
|
self.totalBalanceAlternative = null;
|
2015-08-11 13:45:57 -07:00
|
|
|
|
2015-08-19 13:39:31 -07:00
|
|
|
self.currentFeeLevel = null;
|
2015-04-15 09:39:48 -07:00
|
|
|
self.notAuthorized = false;
|
|
|
|
self.txHistory = [];
|
2015-09-14 12:32:12 -07:00
|
|
|
self.balanceByAddress = null;
|
2015-04-15 09:39:48 -07:00
|
|
|
self.txHistoryPaging = false;
|
2015-04-23 22:46:29 -07:00
|
|
|
self.pendingTxProposalsCountForUs = null;
|
2015-08-11 13:45:57 -07:00
|
|
|
self.setSpendUnconfirmed();
|
|
|
|
|
2015-03-06 07:00:10 -08:00
|
|
|
$timeout(function() {
|
|
|
|
self.hasProfile = true;
|
|
|
|
self.noFocusedWallet = false;
|
|
|
|
self.onGoingProcess = {};
|
|
|
|
|
2015-04-29 08:16:28 -07:00
|
|
|
// Credentials Shortcuts
|
2015-03-06 07:00:10 -08:00
|
|
|
self.m = fc.credentials.m;
|
|
|
|
self.n = fc.credentials.n;
|
|
|
|
self.network = fc.credentials.network;
|
|
|
|
self.copayerId = fc.credentials.copayerId;
|
|
|
|
self.copayerName = fc.credentials.copayerName;
|
|
|
|
self.requiresMultipleSignatures = fc.credentials.m > 1;
|
|
|
|
self.isShared = fc.credentials.n > 1;
|
|
|
|
self.walletName = fc.credentials.walletName;
|
|
|
|
self.walletId = fc.credentials.walletId;
|
|
|
|
self.isComplete = fc.isComplete();
|
2015-07-15 18:10:59 -07:00
|
|
|
self.canSign = fc.canSign();
|
2015-09-04 06:17:59 -07:00
|
|
|
self.isPrivKeyExternal = fc.isPrivKeyExternal();
|
|
|
|
self.externalSource = fc.getPrivKeyExternalSourceName();
|
2015-03-06 07:00:10 -08:00
|
|
|
self.txps = [];
|
|
|
|
self.copayers = [];
|
2015-04-28 16:13:28 -07:00
|
|
|
self.updateColor();
|
2015-05-14 06:39:22 -07:00
|
|
|
self.updateAlias();
|
2015-09-15 05:41:42 -07:00
|
|
|
|
2015-10-05 08:20:00 -07:00
|
|
|
self.initGlidera();
|
2015-03-06 07:00:10 -08:00
|
|
|
|
2015-09-14 06:12:45 -07:00
|
|
|
if (fc.isPrivKeyExternal()) {
|
|
|
|
self.needsBackup = false;
|
2015-03-06 07:00:10 -08:00
|
|
|
self.openWallet();
|
2015-09-14 06:12:45 -07:00
|
|
|
} else {
|
|
|
|
storageService.getBackupFlag(self.walletId, function(err, val) {
|
|
|
|
self.needsBackup = self.network == 'testnet' ? false : !val;
|
|
|
|
self.openWallet();
|
|
|
|
});
|
|
|
|
}
|
2015-03-06 07:00:10 -08:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-09-10 08:17:24 -07:00
|
|
|
self.setTab = function(tab, reset, tries, switchState) {
|
2015-04-28 16:13:28 -07:00
|
|
|
tries = tries || 0;
|
2015-08-08 05:25:40 -07:00
|
|
|
|
2015-09-10 08:17:24 -07:00
|
|
|
// check if the whole menu item passed
|
|
|
|
if (typeof tab == 'object') {
|
|
|
|
if (tab.open) {
|
|
|
|
if (tab.link) {
|
|
|
|
self.tab = tab.link;
|
|
|
|
}
|
|
|
|
tab.open();
|
|
|
|
return;
|
|
|
|
} else {
|
|
|
|
return self.setTab(tab.link, reset, tries, switchState);
|
|
|
|
}
|
|
|
|
}
|
2015-04-28 16:13:28 -07:00
|
|
|
if (self.tab === tab && !reset)
|
2015-04-23 12:17:18 -07:00
|
|
|
return;
|
|
|
|
|
2015-05-04 08:23:43 -07:00
|
|
|
if (!document.getElementById('menu-' + tab) && ++tries < 5) {
|
2015-04-28 16:13:28 -07:00
|
|
|
return $timeout(function() {
|
2015-09-10 08:17:24 -07:00
|
|
|
self.setTab(tab, reset, tries, switchState);
|
2015-04-28 16:13:28 -07:00
|
|
|
}, 300);
|
|
|
|
}
|
|
|
|
|
2015-09-10 08:17:24 -07:00
|
|
|
if (!self.tab || !$state.is('walletHome'))
|
2015-04-23 12:17:18 -07:00
|
|
|
self.tab = 'walletHome';
|
|
|
|
|
2015-09-10 08:17:24 -07:00
|
|
|
var changeTab = function() {
|
|
|
|
if (document.getElementById(self.tab)) {
|
|
|
|
document.getElementById(self.tab).className = 'tab-out tab-view ' + self.tab;
|
|
|
|
var old = document.getElementById('menu-' + self.tab);
|
|
|
|
if (old) {
|
|
|
|
old.className = '';
|
|
|
|
}
|
2015-04-23 12:17:18 -07:00
|
|
|
}
|
2015-04-23 10:12:32 -07:00
|
|
|
|
2015-09-10 08:17:24 -07:00
|
|
|
if (document.getElementById(tab)) {
|
|
|
|
document.getElementById(tab).className = 'tab-in tab-view ' + tab;
|
|
|
|
var newe = document.getElementById('menu-' + tab);
|
|
|
|
if (newe) {
|
|
|
|
newe.className = 'active';
|
|
|
|
}
|
2015-04-23 14:05:31 -07:00
|
|
|
}
|
2015-09-10 08:17:24 -07:00
|
|
|
|
|
|
|
self.tab = tab;
|
|
|
|
$rootScope.$emit('Local/TabChanged', tab);
|
|
|
|
};
|
|
|
|
|
|
|
|
if (switchState && !$state.is('walletHome')) {
|
|
|
|
go.path('walletHome', function() {
|
|
|
|
changeTab();
|
|
|
|
});
|
|
|
|
return;
|
2015-09-07 07:14:09 -07:00
|
|
|
}
|
2015-04-23 10:12:32 -07:00
|
|
|
|
2015-09-10 08:17:24 -07:00
|
|
|
changeTab();
|
2015-04-23 09:12:30 -07:00
|
|
|
};
|
|
|
|
|
2015-05-19 10:10:47 -07:00
|
|
|
|
2015-06-29 17:46:34 -07:00
|
|
|
self._updateRemotePreferencesFor = function(clients, prefs, cb) {
|
|
|
|
var client = clients.shift();
|
|
|
|
|
|
|
|
if (!client)
|
|
|
|
return cb();
|
|
|
|
|
|
|
|
$log.debug('Saving remote preferences', client.credentials.walletName, prefs);
|
|
|
|
client.savePreferences(prefs, function(err) {
|
2015-06-30 14:38:45 -07:00
|
|
|
// we ignore errors here
|
|
|
|
if (err) $log.warn(err);
|
2015-06-29 17:46:34 -07:00
|
|
|
|
|
|
|
self._updateRemotePreferencesFor(clients, prefs, cb);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
self.updateRemotePreferences = function(opts, cb) {
|
|
|
|
var prefs = opts.preferences || {};
|
2015-05-19 10:10:47 -07:00
|
|
|
var fc = profileService.focusedClient;
|
2015-06-29 17:46:34 -07:00
|
|
|
|
2015-06-29 18:40:39 -07:00
|
|
|
// Update this JIC.
|
|
|
|
var config = configService.getSync().wallet.settings;
|
|
|
|
|
2015-06-29 17:46:34 -07:00
|
|
|
//prefs.email (may come from arguments)
|
|
|
|
prefs.language = self.defaultLanguageIsoCode;
|
2015-07-01 07:00:43 -07:00
|
|
|
prefs.unit = config.unitCode;
|
2015-06-29 17:46:34 -07:00
|
|
|
|
|
|
|
var clients = [];
|
|
|
|
if (opts.saveAll) {
|
|
|
|
clients = lodash.values(profileService.walletClients);
|
|
|
|
} else {
|
|
|
|
clients = [fc];
|
|
|
|
};
|
|
|
|
|
|
|
|
self._updateRemotePreferencesFor(clients, prefs, function(err) {
|
2015-06-30 14:38:45 -07:00
|
|
|
if (err) return cb(err);
|
2015-06-29 18:40:39 -07:00
|
|
|
if (!fc) return cb();
|
2015-06-29 17:46:34 -07:00
|
|
|
|
|
|
|
fc.getPreferences(function(err, preferences) {
|
|
|
|
if (err) {
|
|
|
|
return cb(err);
|
|
|
|
}
|
|
|
|
self.preferences = preferences;
|
|
|
|
return cb();
|
|
|
|
});
|
2015-05-19 10:10:47 -07:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-05-30 10:28:18 -07:00
|
|
|
var _walletStatusHash = function(walletStatus) {
|
2015-05-30 18:38:08 -07:00
|
|
|
var bal;
|
2015-05-30 10:28:18 -07:00
|
|
|
if (walletStatus) {
|
2015-05-30 18:38:08 -07:00
|
|
|
bal = walletStatus.balance.totalAmount;
|
2015-05-30 10:28:18 -07:00
|
|
|
} else {
|
2015-05-30 18:38:08 -07:00
|
|
|
bal = self.totalBalanceSat;
|
2015-05-30 10:28:18 -07:00
|
|
|
}
|
2015-05-30 18:38:08 -07:00
|
|
|
return bal;
|
2015-05-30 10:28:18 -07:00
|
|
|
};
|
2015-05-19 10:10:47 -07:00
|
|
|
|
2015-06-12 22:01:02 -07:00
|
|
|
self.updateAll = function(opts, initStatusHash, tries) {
|
2015-05-18 12:21:36 -07:00
|
|
|
tries = tries || 0;
|
2015-06-19 11:09:15 -07:00
|
|
|
opts = opts || {};
|
|
|
|
|
|
|
|
if (opts.untilItChanges && lodash.isUndefined(initStatusHash)) {
|
2015-05-30 10:28:18 -07:00
|
|
|
initStatusHash = _walletStatusHash();
|
2015-05-30 18:38:08 -07:00
|
|
|
$log.debug('Updating status until it changes. initStatusHash:' + initStatusHash)
|
2015-05-18 12:21:36 -07:00
|
|
|
}
|
2015-03-06 07:00:10 -08:00
|
|
|
var get = function(cb) {
|
2015-06-19 11:09:15 -07:00
|
|
|
if (opts.walletStatus)
|
2015-06-12 22:01:02 -07:00
|
|
|
return cb(null, opts.walletStatus);
|
2015-04-13 10:58:07 -07:00
|
|
|
else {
|
|
|
|
self.updateError = false;
|
2015-08-27 07:24:39 -07:00
|
|
|
return fc.getStatus({}, function(err, ret) {
|
2015-04-15 10:03:38 -07:00
|
|
|
if (err) {
|
2015-08-12 07:52:04 -07:00
|
|
|
self.updateError = bwsError.msg(err, gettext('Could not update Wallet'));
|
2015-04-15 10:03:38 -07:00
|
|
|
} else {
|
2015-06-19 11:09:15 -07:00
|
|
|
if (!opts.quiet)
|
|
|
|
self.setOngoingProcess('scanning', ret.wallet.scanning);
|
2015-04-15 10:03:38 -07:00
|
|
|
}
|
2015-04-13 10:58:07 -07:00
|
|
|
return cb(err, ret);
|
|
|
|
});
|
|
|
|
}
|
2015-03-06 07:00:10 -08:00
|
|
|
};
|
|
|
|
|
|
|
|
var fc = profileService.focusedClient;
|
|
|
|
if (!fc) return;
|
|
|
|
|
|
|
|
$timeout(function() {
|
2015-06-19 11:09:15 -07:00
|
|
|
|
|
|
|
if (!opts.quiet)
|
|
|
|
self.setOngoingProcess('updatingStatus', true);
|
|
|
|
|
2015-09-08 04:47:36 -07:00
|
|
|
$log.debug('Updating Status:', fc.credentials.walletName, tries);
|
2015-03-06 07:00:10 -08:00
|
|
|
get(function(err, walletStatus) {
|
2015-06-29 17:46:34 -07:00
|
|
|
var currentStatusHash = _walletStatusHash(walletStatus);
|
|
|
|
$log.debug('Status update. hash:' + currentStatusHash + ' Try:' + tries);
|
2015-06-19 11:09:15 -07:00
|
|
|
if (!err && opts.untilItChanges && initStatusHash == currentStatusHash && tries < 7) {
|
2015-05-18 12:21:36 -07:00
|
|
|
return $timeout(function() {
|
2015-05-30 18:38:08 -07:00
|
|
|
$log.debug('Retrying update... Try:' + tries)
|
2015-06-29 17:46:34 -07:00
|
|
|
return self.updateAll({
|
|
|
|
walletStatus: null,
|
2015-07-13 09:09:52 -07:00
|
|
|
untilItChanges: true,
|
|
|
|
triggerTxUpdate: opts.triggerTxUpdate,
|
2015-06-29 17:46:34 -07:00
|
|
|
}, initStatusHash, ++tries);
|
2015-05-29 08:39:17 -07:00
|
|
|
}, 1400 * tries);
|
2015-05-18 12:21:36 -07:00
|
|
|
}
|
2015-06-19 11:09:15 -07:00
|
|
|
if (!opts.quiet)
|
|
|
|
self.setOngoingProcess('updatingStatus', false);
|
|
|
|
|
2015-03-06 07:00:10 -08:00
|
|
|
if (err) {
|
|
|
|
self.handleError(err);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
$log.debug('Wallet Status:', walletStatus);
|
|
|
|
self.setPendingTxps(walletStatus.pendingTxps);
|
2015-08-11 13:11:40 -07:00
|
|
|
self.setFeesOpts();
|
2015-03-06 07:00:10 -08:00
|
|
|
|
|
|
|
// Status Shortcuts
|
|
|
|
self.walletName = walletStatus.wallet.name;
|
|
|
|
self.walletSecret = walletStatus.wallet.secret;
|
|
|
|
self.walletStatus = walletStatus.wallet.status;
|
2015-04-15 10:03:38 -07:00
|
|
|
self.walletScanStatus = walletStatus.wallet.scanStatus;
|
2015-03-06 07:00:10 -08:00
|
|
|
self.copayers = walletStatus.wallet.copayers;
|
2015-05-19 10:10:47 -07:00
|
|
|
self.preferences = walletStatus.preferences;
|
2015-03-06 07:00:10 -08:00
|
|
|
self.setBalance(walletStatus.balance);
|
2015-06-27 09:48:25 -07:00
|
|
|
self.otherWallets = lodash.filter(profileService.getWallets(self.network), function(w) {
|
|
|
|
return w.id != self.walletId;
|
2015-09-11 09:11:41 -07:00
|
|
|
});
|
2015-07-13 12:25:34 -07:00
|
|
|
|
|
|
|
// Notify external addons or plugins
|
|
|
|
$rootScope.$emit('Local/BalanceUpdated', walletStatus.balance);
|
|
|
|
|
2015-04-21 13:49:17 -07:00
|
|
|
$rootScope.$apply();
|
2015-07-06 06:40:40 -07:00
|
|
|
|
|
|
|
if (opts.triggerTxUpdate) {
|
|
|
|
$timeout(function() {
|
|
|
|
self.updateTxHistory();
|
|
|
|
}, 1);
|
|
|
|
}
|
2015-03-06 07:00:10 -08:00
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-08-03 16:39:09 -07:00
|
|
|
self.setSpendUnconfirmed = function() {
|
|
|
|
self.spendUnconfirmed = configService.getSync().wallet.spendUnconfirmed;
|
|
|
|
};
|
|
|
|
|
2015-08-11 13:11:40 -07:00
|
|
|
self.setSendMax = function() {
|
|
|
|
|
|
|
|
// Set Send max
|
2015-08-12 09:04:39 -07:00
|
|
|
if (self.currentFeeLevel && self.totalBytesToSendMax) {
|
2015-08-11 13:11:40 -07:00
|
|
|
feeService.getCurrentFeeValue(self.currentFeeLevel, function(err, feePerKb) {
|
|
|
|
|
|
|
|
// KB to send max
|
|
|
|
if (self.totalBytesToSendMax) {
|
2015-08-12 09:04:39 -07:00
|
|
|
var feeToSendMaxSat = parseInt(((self.totalBytesToSendMax * feePerKb) / 1000.).toFixed(0));
|
2015-08-13 10:54:53 -07:00
|
|
|
self.feeRateToSendMax = feePerKb;
|
2015-08-11 13:11:40 -07:00
|
|
|
self.availableMaxBalance = strip((self.availableBalanceSat - feeToSendMaxSat) * self.satToUnit);
|
|
|
|
self.feeToSendMaxStr = profileService.formatAmount(feeToSendMaxSat) + ' ' + self.unitName;
|
|
|
|
} else {
|
|
|
|
self.feeToSendMaxStr = null;
|
2015-08-13 10:54:53 -07:00
|
|
|
self.feeRateToSendMax = null;
|
2015-08-11 13:11:40 -07:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
2015-07-24 08:11:07 -07:00
|
|
|
self.setCurrentFeeLevel = function(level) {
|
2015-08-18 08:31:37 -07:00
|
|
|
self.currentFeeLevel = level || configService.getSync().wallet.settings.feeLevel || 'normal';
|
2015-08-11 13:11:40 -07:00
|
|
|
self.setSendMax();
|
2015-07-24 08:11:07 -07:00
|
|
|
};
|
|
|
|
|
2015-08-11 13:11:40 -07:00
|
|
|
|
|
|
|
self.setFeesOpts = function() {
|
2015-07-24 08:11:07 -07:00
|
|
|
var fc = profileService.focusedClient;
|
|
|
|
if (!fc) return;
|
|
|
|
$timeout(function() {
|
|
|
|
feeService.getFeeLevels(function(levels) {
|
|
|
|
self.feeLevels = levels;
|
|
|
|
$rootScope.$apply();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-03-06 07:00:10 -08:00
|
|
|
self.updateBalance = function() {
|
|
|
|
var fc = profileService.focusedClient;
|
|
|
|
$timeout(function() {
|
|
|
|
self.setOngoingProcess('updatingBalance', true);
|
|
|
|
$log.debug('Updating Balance');
|
|
|
|
fc.getBalance(function(err, balance) {
|
|
|
|
self.setOngoingProcess('updatingBalance', false);
|
|
|
|
if (err) {
|
2015-08-12 09:04:39 -07:00
|
|
|
self.handleError(err);
|
2015-03-06 07:00:10 -08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
$log.debug('Wallet Balance:', balance);
|
|
|
|
self.setBalance(balance);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
self.updatePendingTxps = function() {
|
|
|
|
var fc = profileService.focusedClient;
|
|
|
|
$timeout(function() {
|
|
|
|
self.setOngoingProcess('updatingPendingTxps', true);
|
|
|
|
$log.debug('Updating PendingTxps');
|
2015-04-18 03:08:08 -07:00
|
|
|
fc.getTxProposals({}, function(err, txps) {
|
2015-03-06 07:00:10 -08:00
|
|
|
self.setOngoingProcess('updatingPendingTxps', false);
|
|
|
|
if (err) {
|
2015-08-12 09:04:39 -07:00
|
|
|
self.handleError(err);
|
2015-03-06 07:00:10 -08:00
|
|
|
} else {
|
|
|
|
$log.debug('Wallet PendingTxps:', txps);
|
|
|
|
self.setPendingTxps(txps);
|
|
|
|
}
|
|
|
|
$rootScope.$apply();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
self.updateTxHistory = function(skip) {
|
|
|
|
var fc = profileService.focusedClient;
|
2015-09-02 13:11:59 -07:00
|
|
|
if (!fc || !fc.isComplete()) return;
|
2015-03-06 07:00:10 -08:00
|
|
|
if (!skip) {
|
|
|
|
self.txHistory = [];
|
|
|
|
}
|
|
|
|
self.skipHistory = skip || 0;
|
2015-04-23 22:42:10 -07:00
|
|
|
$log.debug('Updating Transaction History');
|
|
|
|
self.txHistoryError = false;
|
|
|
|
self.updatingTxHistory = true;
|
2015-04-23 23:01:26 -07:00
|
|
|
self.txHistoryPaging = false;
|
2015-08-12 09:04:39 -07:00
|
|
|
|
2015-03-06 07:00:10 -08:00
|
|
|
$timeout(function() {
|
|
|
|
fc.getTxHistory({
|
|
|
|
skip: self.skipHistory,
|
|
|
|
limit: self.limitHistory + 1
|
|
|
|
}, function(err, txs) {
|
2015-04-14 08:51:49 -07:00
|
|
|
self.updatingTxHistory = false;
|
2015-03-06 07:00:10 -08:00
|
|
|
if (err) {
|
|
|
|
$log.debug('TxHistory ERROR:', err);
|
2015-05-15 07:07:19 -07:00
|
|
|
// We do not should errors here, since history is usually
|
2015-08-12 09:04:39 -07:00
|
|
|
// fetched AFTER others requests (if skip=0)
|
|
|
|
if (skip)
|
|
|
|
self.handleError(err);
|
|
|
|
|
2015-04-13 10:58:07 -07:00
|
|
|
self.txHistoryError = true;
|
|
|
|
} else {
|
2015-03-06 07:00:10 -08:00
|
|
|
$log.debug('Wallet Transaction History:', txs);
|
|
|
|
self.skipHistory = self.skipHistory + self.limitHistory;
|
|
|
|
self.setTxHistory(txs);
|
|
|
|
}
|
|
|
|
$rootScope.$apply();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-09-18 09:59:18 -07:00
|
|
|
self.debouncedUpdateHistory = lodash.throttle(function() {
|
|
|
|
self.updateTxHistory();
|
|
|
|
}, 5000);
|
|
|
|
|
|
|
|
|
2015-08-12 09:04:39 -07:00
|
|
|
// This handles errors from BWS/index with are nomally
|
|
|
|
// trigger from async events (like updates)
|
2015-03-06 07:00:10 -08:00
|
|
|
self.handleError = function(err) {
|
2015-04-27 10:14:51 -07:00
|
|
|
$log.warn('Client ERROR:', err);
|
2015-08-05 06:44:29 -07:00
|
|
|
if (err.code === 'NOT_AUTHORIZED') {
|
2015-08-12 09:04:39 -07:00
|
|
|
self.notAuthorized = true;
|
|
|
|
go.walletHome();
|
2015-08-05 06:44:29 -07:00
|
|
|
} else if (err.code === 'NOT_FOUND') {
|
2015-08-12 09:04:39 -07:00
|
|
|
self.showErrorPopup(gettext('Could not access Wallet Service: Not found'));
|
2015-03-06 07:00:10 -08:00
|
|
|
} else {
|
2015-08-12 09:04:39 -07:00
|
|
|
var msg = ""
|
2015-04-27 10:18:22 -07:00
|
|
|
$scope.$emit('Local/ClientError', (err.error ? err.error : err));
|
2015-08-12 09:04:39 -07:00
|
|
|
var msg = bwsError.msg(err, gettext('Error at Wallet Service'));
|
|
|
|
self.showErrorPopup(msg);
|
2015-03-06 07:00:10 -08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
self.openWallet = function() {
|
|
|
|
var fc = profileService.focusedClient;
|
|
|
|
$timeout(function() {
|
2015-04-23 11:32:11 -07:00
|
|
|
$rootScope.$apply();
|
2015-03-06 07:00:10 -08:00
|
|
|
self.setOngoingProcess('openingWallet', true);
|
2015-04-14 12:06:04 -07:00
|
|
|
self.updateError = false;
|
2015-03-06 07:00:10 -08:00
|
|
|
fc.openWallet(function(err, walletStatus) {
|
|
|
|
self.setOngoingProcess('openingWallet', false);
|
|
|
|
if (err) {
|
2015-04-14 12:06:04 -07:00
|
|
|
self.updateError = true;
|
2015-03-06 07:00:10 -08:00
|
|
|
self.handleError(err);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
$log.debug('Wallet Opened');
|
2015-06-29 17:46:34 -07:00
|
|
|
self.updateAll(lodash.isObject(walletStatus) ? {
|
|
|
|
walletStatus: walletStatus
|
|
|
|
} : null);
|
2015-03-06 07:00:10 -08:00
|
|
|
$rootScope.$apply();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
self.setPendingTxps = function(txps) {
|
|
|
|
self.pendingTxProposalsCountForUs = 0;
|
2015-09-25 09:25:37 -07:00
|
|
|
var now = Math.floor(Date.now() / 1000);
|
|
|
|
|
2015-03-06 07:00:10 -08:00
|
|
|
lodash.each(txps, function(tx) {
|
2015-09-18 09:59:18 -07:00
|
|
|
|
2015-09-09 12:17:08 -07:00
|
|
|
tx = txFormatService.processTx(tx);
|
2015-03-06 07:00:10 -08:00
|
|
|
|
2015-09-25 09:25:37 -07:00
|
|
|
// no future transactions...
|
|
|
|
if (tx.createdOn > now)
|
|
|
|
tx.createdOn = now;
|
|
|
|
|
2015-03-06 07:00:10 -08:00
|
|
|
var action = lodash.find(tx.actions, {
|
|
|
|
copayerId: self.copayerId
|
|
|
|
});
|
|
|
|
|
|
|
|
if (!action && tx.status == 'pending') {
|
|
|
|
tx.pendingForUs = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (action && action.type == 'accept') {
|
|
|
|
tx.statusForUs = 'accepted';
|
|
|
|
} else if (action && action.type == 'reject') {
|
|
|
|
tx.statusForUs = 'rejected';
|
|
|
|
} else {
|
|
|
|
tx.statusForUs = 'pending';
|
|
|
|
}
|
|
|
|
|
2015-06-18 07:17:35 -07:00
|
|
|
if (!tx.deleteLockTime)
|
|
|
|
tx.canBeRemoved = true;
|
2015-03-06 07:00:10 -08:00
|
|
|
|
|
|
|
if (tx.creatorId != self.copayerId) {
|
|
|
|
self.pendingTxProposalsCountForUs = self.pendingTxProposalsCountForUs + 1;
|
|
|
|
}
|
2015-08-03 05:49:44 -07:00
|
|
|
addonManager.formatPendingTxp(tx);
|
2015-03-06 07:00:10 -08:00
|
|
|
});
|
|
|
|
self.txps = txps;
|
|
|
|
};
|
|
|
|
|
2015-09-18 09:59:18 -07:00
|
|
|
var SAFE_CONFIRMATIONS = 6;
|
|
|
|
|
2015-03-06 07:00:10 -08:00
|
|
|
self.setTxHistory = function(txs) {
|
2015-07-17 10:30:55 -07:00
|
|
|
var config = configService.getSync().wallet.settings;
|
2015-07-13 09:31:05 -07:00
|
|
|
var now = Math.floor(Date.now() / 1000);
|
2015-03-06 07:00:10 -08:00
|
|
|
var c = 0;
|
|
|
|
self.txHistoryPaging = txs[self.limitHistory] ? true : false;
|
2015-09-18 09:59:18 -07:00
|
|
|
self.hasUnsafeConfirmed = false;
|
2015-03-06 07:00:10 -08:00
|
|
|
lodash.each(txs, function(tx) {
|
2015-09-09 12:17:08 -07:00
|
|
|
tx = txFormatService.processTx(tx);
|
2015-07-13 09:31:05 -07:00
|
|
|
|
|
|
|
// no future transactions...
|
|
|
|
if (tx.time > now)
|
|
|
|
tx.time = now;
|
|
|
|
|
2015-09-18 09:59:18 -07:00
|
|
|
if (tx.confirmations >= SAFE_CONFIRMATIONS) {
|
|
|
|
tx.safeConfirmed = SAFE_CONFIRMATIONS + '+';
|
|
|
|
} else {
|
|
|
|
tx.safeConfirmed = false;
|
|
|
|
self.hasUnsafeConfirmed = true;
|
|
|
|
}
|
|
|
|
|
2015-03-06 07:00:10 -08:00
|
|
|
if (c < self.limitHistory) {
|
|
|
|
self.txHistory.push(tx);
|
|
|
|
c++;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-05-14 06:39:22 -07:00
|
|
|
self.updateAlias = function() {
|
|
|
|
var config = configService.getSync();
|
|
|
|
config.aliasFor = config.aliasFor || {};
|
|
|
|
self.alias = config.aliasFor[self.walletId];
|
|
|
|
var fc = profileService.focusedClient;
|
|
|
|
fc.alias = self.alias;
|
|
|
|
};
|
|
|
|
|
2015-03-06 07:00:10 -08:00
|
|
|
self.updateColor = function() {
|
|
|
|
var config = configService.getSync();
|
|
|
|
config.colorFor = config.colorFor || {};
|
2015-05-29 11:25:41 -07:00
|
|
|
self.backgroundColor = config.colorFor[self.walletId] || '#4A90E2';
|
2015-03-06 07:00:10 -08:00
|
|
|
var fc = profileService.focusedClient;
|
|
|
|
fc.backgroundColor = self.backgroundColor;
|
|
|
|
};
|
|
|
|
|
|
|
|
self.setBalance = function(balance) {
|
|
|
|
if (!balance) return;
|
|
|
|
var config = configService.getSync().wallet.settings;
|
|
|
|
var COIN = 1e8;
|
|
|
|
|
2015-08-11 13:11:40 -07:00
|
|
|
|
2015-03-06 07:00:10 -08:00
|
|
|
// Address with Balance
|
|
|
|
self.balanceByAddress = balance.byAddress;
|
|
|
|
|
|
|
|
// SAT
|
2015-08-11 13:45:57 -07:00
|
|
|
if (self.spendUnconfirmed) {
|
|
|
|
self.totalBalanceSat = balance.totalAmount;
|
|
|
|
self.lockedBalanceSat = balance.lockedAmount;
|
|
|
|
self.availableBalanceSat = balance.availableAmount;
|
|
|
|
self.pendingAmount = null;
|
|
|
|
} else {
|
|
|
|
self.totalBalanceSat = balance.totalConfirmedAmount;
|
|
|
|
self.lockedBalanceSat = balance.lockedConfirmedAmount;
|
|
|
|
self.availableBalanceSat = balance.availableConfirmedAmount;
|
|
|
|
self.pendingAmount = balance.totalAmount - balance.totalConfirmedAmount;
|
|
|
|
}
|
2015-03-06 07:00:10 -08:00
|
|
|
|
|
|
|
// Selected unit
|
|
|
|
self.unitToSatoshi = config.unitToSatoshi;
|
|
|
|
self.satToUnit = 1 / self.unitToSatoshi;
|
|
|
|
self.unitName = config.unitName;
|
|
|
|
|
|
|
|
//STR
|
|
|
|
self.totalBalanceStr = profileService.formatAmount(self.totalBalanceSat) + ' ' + self.unitName;
|
|
|
|
self.lockedBalanceStr = profileService.formatAmount(self.lockedBalanceSat) + ' ' + self.unitName;
|
|
|
|
self.availableBalanceStr = profileService.formatAmount(self.availableBalanceSat) + ' ' + self.unitName;
|
|
|
|
|
2015-08-11 13:45:57 -07:00
|
|
|
if (self.pendingAmount) {
|
|
|
|
self.pendingAmountStr = profileService.formatAmount(self.pendingAmount) + ' ' + self.unitName;
|
|
|
|
} else {
|
|
|
|
self.pendingAmountStr = null;
|
|
|
|
}
|
|
|
|
|
2015-03-06 07:00:10 -08:00
|
|
|
self.alternativeName = config.alternativeName;
|
|
|
|
self.alternativeIsoCode = config.alternativeIsoCode;
|
|
|
|
|
2015-08-11 13:11:40 -07:00
|
|
|
// Other
|
|
|
|
self.totalBytesToSendMax = balance.totalBytesToSendMax;
|
|
|
|
self.setCurrentFeeLevel();
|
|
|
|
|
2015-03-06 07:00:10 -08:00
|
|
|
// Check address
|
2015-06-29 17:46:34 -07:00
|
|
|
addressService.isUsed(self.walletId, balance.byAddress, function(err, used) {
|
|
|
|
if (used) {
|
2015-06-27 09:22:56 -07:00
|
|
|
$log.debug('Address used. Creating new');
|
|
|
|
$rootScope.$emit('Local/NeedNewAddress');
|
|
|
|
}
|
|
|
|
});
|
2015-03-06 07:00:10 -08:00
|
|
|
|
|
|
|
rateService.whenAvailable(function() {
|
|
|
|
|
2015-08-11 13:45:57 -07:00
|
|
|
var totalBalanceAlternative = rateService.toFiat(self.totalBalanceSat, self.alternativeIsoCode);
|
|
|
|
var lockedBalanceAlternative = rateService.toFiat(self.lockedBalanceSat, self.alternativeIsoCode);
|
2015-03-06 07:00:10 -08:00
|
|
|
var alternativeConversionRate = rateService.toFiat(100000000, self.alternativeIsoCode);
|
|
|
|
|
|
|
|
self.totalBalanceAlternative = $filter('noFractionNumber')(totalBalanceAlternative, 2);
|
|
|
|
self.lockedBalanceAlternative = $filter('noFractionNumber')(lockedBalanceAlternative, 2);
|
|
|
|
self.alternativeConversionRate = $filter('noFractionNumber')(alternativeConversionRate, 2);
|
|
|
|
|
|
|
|
self.alternativeBalanceAvailable = true;
|
|
|
|
self.updatingBalance = false;
|
|
|
|
|
|
|
|
self.isRateAvailable = true;
|
|
|
|
$rootScope.$apply();
|
|
|
|
});
|
|
|
|
|
|
|
|
if (!rateService.isAvailable()) {
|
|
|
|
$rootScope.$apply();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2015-07-03 11:35:34 -07:00
|
|
|
this.csvHistory = function() {
|
|
|
|
|
2015-07-07 19:56:49 -07:00
|
|
|
function saveFile(name, data) {
|
2015-07-07 09:24:18 -07:00
|
|
|
var chooser = document.querySelector(name);
|
|
|
|
chooser.addEventListener("change", function(evt) {
|
2015-07-07 19:56:49 -07:00
|
|
|
var fs = require('fs');
|
2015-07-07 09:24:18 -07:00
|
|
|
fs.writeFile(this.value, data, function(err) {
|
2015-07-07 19:56:49 -07:00
|
|
|
if (err) {
|
2015-07-14 07:16:54 -07:00
|
|
|
$log.debug(err);
|
2015-07-07 09:24:18 -07:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}, false);
|
Addon support
Addons are simple Angular modules with views, controllers, services etc. Addons can register
themselves in Copay using pluginManagerProvider. It allows them to add extra items to the bottom
menu and as well as extra tab-views:
````
addonManagerProvider.registerAddon({
menuItem: {
'title': 'Assets',
'icon': 'icon-pricetag',
'link': 'assets'
},
view: {
id: 'assets',
'class': 'assets',
template: 'colored-coins/views/assets.html'
}
});
````
Addons can consume core Copay services and listen for events to react on changes. For this very
first addon system inplementation Copay emits additional BalanceUpdated event so that interested
addons can react on new transactions (see plugin reference implementation below).
As bottom menu can accomodate only 6 items without sacrificing usability, so it was reworked to
have second layer of items. Now If menu has more than 6 items, toggle button will be added to
the menu allowing to reveal extra items in a sliding panel. Bottom menu in this case will show
only 5 items, the rest will be rendered on sliding panel.
This changes addresses issue #2949 and reference implementation of addon could be found here:
https://github.com/troggy/copay-colored-coins-plugin
2015-07-04 03:02:46 -07:00
|
|
|
chooser.click();
|
2015-07-07 09:24:18 -07:00
|
|
|
}
|
|
|
|
|
2015-07-03 11:35:34 -07:00
|
|
|
function formatDate(date) {
|
|
|
|
var dateObj = new Date(date);
|
|
|
|
if (!dateObj) {
|
2015-07-14 07:16:54 -07:00
|
|
|
$log.debug('Error formating a date');
|
2015-07-03 11:35:34 -07:00
|
|
|
return 'DateError'
|
|
|
|
}
|
|
|
|
if (!dateObj.toJSON()) {
|
|
|
|
return '';
|
|
|
|
}
|
|
|
|
|
2015-07-06 12:31:54 -07:00
|
|
|
return dateObj.toJSON();
|
2015-07-03 11:35:34 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function formatString(str) {
|
|
|
|
if (!str) return '';
|
|
|
|
|
|
|
|
if (str.indexOf('"') !== -1) {
|
|
|
|
//replace all
|
|
|
|
str = str.replace(new RegExp('"', 'g'), '\'');
|
|
|
|
}
|
|
|
|
|
|
|
|
//escaping commas
|
|
|
|
str = '\"' + str + '\"';
|
|
|
|
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
|
2015-09-04 17:18:20 -07:00
|
|
|
var step = 6;
|
|
|
|
|
2015-07-14 07:16:54 -07:00
|
|
|
function getHistory(skip, cb) {
|
|
|
|
skip = skip || 0;
|
|
|
|
fc.getTxHistory({
|
|
|
|
skip: skip,
|
2015-09-04 20:11:14 -07:00
|
|
|
limit: step,
|
2015-07-14 07:16:54 -07:00
|
|
|
}, function(err, txs) {
|
|
|
|
if (err) return cb(err);
|
|
|
|
if (txs && txs.length > 0) {
|
|
|
|
allTxs.push(txs);
|
2015-09-04 17:18:20 -07:00
|
|
|
return getHistory(skip + step, cb);
|
2015-07-17 11:51:12 -07:00
|
|
|
} else {
|
2015-07-14 07:16:54 -07:00
|
|
|
return cb(null, lodash.flatten(allTxs));
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-07-03 11:35:34 -07:00
|
|
|
if (isCordova) {
|
2015-07-14 07:16:54 -07:00
|
|
|
$log.info('Not available on mobile');
|
2015-07-03 11:35:34 -07:00
|
|
|
return;
|
|
|
|
}
|
2015-07-07 19:56:49 -07:00
|
|
|
var isNode = nodeWebkit.isDefined();
|
2015-07-03 11:35:34 -07:00
|
|
|
var fc = profileService.focusedClient;
|
|
|
|
if (!fc.isComplete()) return;
|
|
|
|
var self = this;
|
2015-07-14 07:16:54 -07:00
|
|
|
var allTxs = [];
|
2015-07-03 11:35:34 -07:00
|
|
|
$log.debug('Generating CSV from History');
|
|
|
|
self.setOngoingProcess('generatingCSV', true);
|
|
|
|
$timeout(function() {
|
2015-07-14 07:16:54 -07:00
|
|
|
getHistory(null, function(err, txs) {
|
2015-07-03 11:35:34 -07:00
|
|
|
self.setOngoingProcess('generatingCSV', false);
|
|
|
|
if (err) {
|
2015-08-12 09:04:39 -07:00
|
|
|
self.handleError(err);
|
2015-07-03 11:35:34 -07:00
|
|
|
} else {
|
|
|
|
$log.debug('Wallet Transaction History:', txs);
|
|
|
|
|
|
|
|
self.satToUnit = 1 / self.unitToSatoshi;
|
|
|
|
var data = txs;
|
2015-07-06 12:31:54 -07:00
|
|
|
var satToBtc = 1 / 100000000;
|
2015-07-17 11:51:12 -07:00
|
|
|
var filename = 'Copay-' + (self.alias || self.walletName) + '.csv';
|
2015-07-07 19:56:49 -07:00
|
|
|
var csvContent = '';
|
|
|
|
if (!isNode) csvContent = 'data:text/csv;charset=utf-8,';
|
|
|
|
csvContent += 'Date,Destination,Note,Amount,Currency,Spot Value,Total Value,Tax Type,Category\n';
|
2015-07-03 11:35:34 -07:00
|
|
|
|
2015-07-14 12:47:23 -07:00
|
|
|
var _amount, _note;
|
2015-07-07 19:56:49 -07:00
|
|
|
var dataString;
|
2015-07-03 11:35:34 -07:00
|
|
|
data.forEach(function(it, index) {
|
2015-07-17 10:43:40 -07:00
|
|
|
var amount = it.amount;
|
|
|
|
|
|
|
|
if (it.action == 'moved')
|
|
|
|
amount = 0;
|
|
|
|
|
2015-07-17 11:51:12 -07:00
|
|
|
_amount = (it.action == 'sent' ? '-' : '') + (amount * satToBtc).toFixed(8);
|
|
|
|
_note = formatString((it.message ? it.message : '') + ' TxId: ' + it.txid + ' Fee:' + (it.fees * satToBtc).toFixed(8));
|
2015-07-17 10:43:40 -07:00
|
|
|
|
|
|
|
if (it.action == 'moved')
|
2015-07-17 11:51:12 -07:00
|
|
|
_note += ' Moved:' + (it.amount * satToBtc).toFixed(8)
|
2015-07-17 10:43:40 -07:00
|
|
|
|
2015-07-14 12:47:23 -07:00
|
|
|
dataString = formatDate(it.time * 1000) + ',' + formatString(it.addressTo) + ',' + _note + ',' + _amount + ',BTC,,,,';
|
2015-08-12 09:04:39 -07:00
|
|
|
csvContent += dataString + "\n";
|
2015-07-17 11:51:12 -07:00
|
|
|
|
|
|
|
if (it.fees && (it.action == 'moved' || it.action == 'sent')) {
|
|
|
|
var _fee = (it.fees * satToBtc).toFixed(8)
|
2015-08-12 09:04:39 -07:00
|
|
|
csvContent += formatDate(it.time * 1000) + ',Bitcoin Network Fees,, -' + _fee + ',BTC,,,,' + "\n";
|
2015-07-17 11:51:12 -07:00
|
|
|
}
|
2015-07-03 11:35:34 -07:00
|
|
|
});
|
|
|
|
|
2015-07-07 19:56:49 -07:00
|
|
|
if (isNode) {
|
|
|
|
saveFile('#export_file', csvContent);
|
2015-07-17 11:51:12 -07:00
|
|
|
} else {
|
2015-07-07 09:24:18 -07:00
|
|
|
var encodedUri = encodeURI(csvContent);
|
|
|
|
var link = document.createElement("a");
|
|
|
|
link.setAttribute("href", encodedUri);
|
|
|
|
link.setAttribute("download", filename);
|
|
|
|
link.click();
|
|
|
|
}
|
2015-07-03 11:35:34 -07:00
|
|
|
}
|
|
|
|
$rootScope.$apply();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
2015-03-06 07:00:10 -08:00
|
|
|
|
2015-09-04 20:11:14 -07:00
|
|
|
self.showErrorPopup = function(msg, cb) {
|
2015-08-12 09:04:39 -07:00
|
|
|
$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();
|
|
|
|
});
|
2015-04-24 12:39:12 -07:00
|
|
|
};
|
|
|
|
|
2015-03-06 07:00:10 -08:00
|
|
|
self.recreate = function(cb) {
|
|
|
|
var fc = profileService.focusedClient;
|
|
|
|
self.setOngoingProcess('recreating', true);
|
|
|
|
fc.recreateWallet(function(err) {
|
|
|
|
self.notAuthorized = false;
|
|
|
|
self.setOngoingProcess('recreating', false);
|
|
|
|
|
2015-04-14 08:51:49 -07:00
|
|
|
if (err) {
|
2015-04-27 10:14:51 -07:00
|
|
|
self.handleError(err);
|
2015-04-14 08:51:49 -07:00
|
|
|
$rootScope.$apply();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-03-06 07:00:10 -08:00
|
|
|
profileService.setWalletClients();
|
2015-04-18 03:23:11 -07:00
|
|
|
$timeout(function() {
|
|
|
|
$rootScope.$emit('Local/WalletImported', self.walletId);
|
|
|
|
}, 100);
|
2015-03-06 07:00:10 -08:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
self.openMenu = function() {
|
|
|
|
go.swipe(true);
|
|
|
|
};
|
|
|
|
|
|
|
|
self.closeMenu = function() {
|
|
|
|
go.swipe();
|
|
|
|
};
|
|
|
|
|
2015-04-15 10:03:38 -07:00
|
|
|
self.retryScan = function() {
|
|
|
|
var self = this;
|
|
|
|
self.startScan(self.walletId);
|
|
|
|
}
|
|
|
|
|
2015-03-06 07:00:10 -08:00
|
|
|
self.startScan = function(walletId) {
|
2015-09-21 06:18:43 -07:00
|
|
|
$log.debug('Scanning wallet ' + walletId);
|
2015-03-06 07:00:10 -08:00
|
|
|
var c = profileService.walletClients[walletId];
|
2015-08-14 10:13:53 -07:00
|
|
|
if (!c.isComplete()) return;
|
2015-03-06 07:00:10 -08:00
|
|
|
|
|
|
|
if (self.walletId == walletId)
|
|
|
|
self.setOngoingProcess('scanning', true);
|
|
|
|
|
|
|
|
c.startScan({
|
|
|
|
includeCopayerBranches: true,
|
|
|
|
}, function(err) {
|
2015-06-10 07:12:41 -07:00
|
|
|
if (err && self.walletId == walletId) {
|
|
|
|
self.setOngoingProcess('scanning', false);
|
2015-04-27 10:14:51 -07:00
|
|
|
self.handleError(err);
|
2015-04-14 08:51:49 -07:00
|
|
|
$rootScope.$apply();
|
2015-03-06 07:00:10 -08:00
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-06-29 17:46:34 -07:00
|
|
|
self.setUxLanguage = function() {
|
2015-08-27 08:07:13 -07:00
|
|
|
var userLang = uxLanguage.update();
|
2015-06-29 17:46:34 -07:00
|
|
|
self.defaultLanguageIsoCode = userLang;
|
2015-08-27 08:07:13 -07:00
|
|
|
self.defaultLanguageName = uxLanguage.getName(userLang);
|
2015-04-22 14:41:30 -07:00
|
|
|
};
|
|
|
|
|
2015-09-05 10:30:02 -07:00
|
|
|
self.initGlidera = function(accessToken) {
|
2015-09-11 09:11:41 -07:00
|
|
|
self.glideraEnabled = configService.getSync().glidera.enabled;
|
2015-10-19 07:19:28 -07:00
|
|
|
// self.glideraTestnet = configService.getSync().glidera.testnet;
|
|
|
|
// var network = self.glideraTestnet ? 'testnet' : 'livenet';
|
|
|
|
// Disabled for testnet
|
2015-10-05 08:54:38 -07:00
|
|
|
self.glideraTestnet = false;
|
2015-10-05 08:20:00 -07:00
|
|
|
var network = 'livenet';
|
2015-09-11 09:11:41 -07:00
|
|
|
|
|
|
|
self.glideraToken = null;
|
|
|
|
self.glideraError = null;
|
|
|
|
self.glideraPermissions = null;
|
|
|
|
self.glideraEmail = null;
|
|
|
|
self.glideraPersonalInfo = null;
|
|
|
|
self.glideraTxs = null;
|
2015-09-08 18:39:33 -07:00
|
|
|
self.glideraStatus = null;
|
|
|
|
|
2015-10-05 11:06:53 -07:00
|
|
|
if (!self.glideraEnabled) return;
|
2015-09-11 09:11:41 -07:00
|
|
|
|
|
|
|
glideraService.setCredentials(network);
|
2015-09-05 10:30:02 -07:00
|
|
|
|
|
|
|
var getToken = function(cb) {
|
|
|
|
if (accessToken) {
|
|
|
|
cb(null, accessToken);
|
|
|
|
} else {
|
2015-09-11 09:11:41 -07:00
|
|
|
storageService.getGlideraToken(network, cb);
|
2015-09-05 10:30:02 -07:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
getToken(function(err, accessToken) {
|
|
|
|
if (err || !accessToken) return;
|
2015-09-02 12:02:40 -07:00
|
|
|
else {
|
2015-09-12 19:54:18 -07:00
|
|
|
self.glideraLoading = 'Connecting to Glidera...';
|
2015-09-07 07:14:09 -07:00
|
|
|
glideraService.getAccessTokenPermissions(accessToken, function(err, p) {
|
|
|
|
self.glideraLoading = null;
|
2015-09-05 10:30:02 -07:00
|
|
|
if (err) {
|
|
|
|
self.glideraError = err;
|
2015-09-18 09:59:18 -07:00
|
|
|
} else {
|
2015-09-07 07:14:09 -07:00
|
|
|
self.glideraToken = accessToken;
|
2015-09-05 10:30:02 -07:00
|
|
|
self.glideraPermissions = p;
|
2015-09-18 09:59:18 -07:00
|
|
|
self.updateGlidera({
|
|
|
|
fullUpdate: true
|
|
|
|
});
|
2015-09-05 10:30:02 -07:00
|
|
|
}
|
2015-09-02 12:02:40 -07:00
|
|
|
});
|
|
|
|
}
|
2015-08-28 14:23:24 -07:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-09-09 06:39:35 -07:00
|
|
|
self.updateGlidera = function(opts) {
|
|
|
|
if (!self.glideraToken || !self.glideraPermissions) return;
|
|
|
|
var accessToken = self.glideraToken;
|
|
|
|
var permissions = self.glideraPermissions;
|
|
|
|
|
|
|
|
opts = opts || {};
|
2015-09-08 08:04:27 -07:00
|
|
|
|
|
|
|
glideraService.getStatus(accessToken, function(err, data) {
|
|
|
|
self.glideraStatus = data;
|
|
|
|
});
|
2015-09-08 13:36:08 -07:00
|
|
|
|
|
|
|
glideraService.getLimits(accessToken, function(err, limits) {
|
|
|
|
self.glideraLimits = limits;
|
|
|
|
});
|
2015-09-09 06:39:35 -07:00
|
|
|
|
|
|
|
if (permissions.transaction_history) {
|
2015-09-12 19:54:18 -07:00
|
|
|
self.glideraLoadingHistory = 'Getting Glidera transactions...';
|
2015-09-09 06:39:35 -07:00
|
|
|
glideraService.getTransactions(accessToken, function(err, data) {
|
|
|
|
self.glideraLoadingHistory = null;
|
|
|
|
self.glideraTxs = data;
|
|
|
|
});
|
|
|
|
}
|
2015-09-18 09:59:18 -07:00
|
|
|
|
2015-09-09 06:39:35 -07:00
|
|
|
if (permissions.view_email_address && opts.fullUpdate) {
|
2015-09-12 19:54:18 -07:00
|
|
|
self.glideraLoadingEmail = 'Getting Glidera Email...';
|
2015-09-05 10:30:02 -07:00
|
|
|
glideraService.getEmail(accessToken, function(err, data) {
|
2015-09-07 07:14:09 -07:00
|
|
|
self.glideraLoadingEmail = null;
|
2015-09-05 10:30:02 -07:00
|
|
|
self.glideraEmail = data.email;
|
|
|
|
});
|
|
|
|
}
|
2015-09-09 06:39:35 -07:00
|
|
|
if (permissions.personal_info && opts.fullUpdate) {
|
2015-09-12 19:54:18 -07:00
|
|
|
self.glideraLoadingPersonalInfo = 'Getting Glidera Personal Information...';
|
2015-09-05 10:30:02 -07:00
|
|
|
glideraService.getPersonalInfo(accessToken, function(err, data) {
|
2015-09-07 07:14:09 -07:00
|
|
|
self.glideraLoadingPersonalInfo = null;
|
2015-09-05 10:30:02 -07:00
|
|
|
self.glideraPersonalInfo = data;
|
|
|
|
});
|
|
|
|
}
|
2015-09-09 06:39:35 -07:00
|
|
|
|
2015-09-05 10:30:02 -07:00
|
|
|
};
|
|
|
|
|
2015-03-06 07:00:10 -08:00
|
|
|
// UX event handlers
|
|
|
|
$rootScope.$on('Local/ColorUpdated', function(event) {
|
|
|
|
self.updateColor();
|
2015-04-27 09:11:32 -07:00
|
|
|
$timeout(function() {
|
|
|
|
$rootScope.$apply();
|
|
|
|
});
|
2015-03-06 07:00:10 -08:00
|
|
|
});
|
|
|
|
|
2015-05-14 06:39:22 -07:00
|
|
|
$rootScope.$on('Local/AliasUpdated', function(event) {
|
|
|
|
self.updateAlias();
|
|
|
|
$timeout(function() {
|
|
|
|
$rootScope.$apply();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2015-08-03 16:39:09 -07:00
|
|
|
$rootScope.$on('Local/SpendUnconfirmedUpdated', function(event) {
|
|
|
|
self.setSpendUnconfirmed();
|
2015-08-11 13:45:57 -07:00
|
|
|
self.updateAll();
|
2015-08-03 16:39:09 -07:00
|
|
|
});
|
|
|
|
|
2015-07-24 08:11:07 -07:00
|
|
|
$rootScope.$on('Local/FeeLevelUpdated', function(event, level) {
|
|
|
|
self.setCurrentFeeLevel(level);
|
|
|
|
});
|
|
|
|
|
2015-06-29 18:40:39 -07:00
|
|
|
$rootScope.$on('Local/ProfileBound', function() {
|
|
|
|
storageService.getRemotePrefsStoredFlag(function(err, val) {
|
|
|
|
if (err || val) return;
|
|
|
|
self.updateRemotePreferences({
|
|
|
|
saveAll: true
|
|
|
|
}, function() {
|
|
|
|
$log.debug('Remote preferences saved')
|
|
|
|
storageService.setRemotePrefsStoredFlag(function() {});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
2015-06-29 17:46:34 -07:00
|
|
|
|
|
|
|
$rootScope.$on('Local/NewFocusedWallet', function() {
|
|
|
|
self.setUxLanguage();
|
|
|
|
});
|
|
|
|
|
|
|
|
$rootScope.$on('Local/LanguageSettingUpdated', function() {
|
|
|
|
self.setUxLanguage();
|
|
|
|
self.updateRemotePreferences({
|
|
|
|
saveAll: true
|
|
|
|
}, function() {
|
|
|
|
$log.debug('Remote preferences saved')
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2015-09-11 09:11:41 -07:00
|
|
|
$rootScope.$on('Local/GlideraUpdated', function(event, accessToken) {
|
2015-09-05 10:30:02 -07:00
|
|
|
self.initGlidera(accessToken);
|
|
|
|
});
|
|
|
|
|
2015-09-09 06:39:35 -07:00
|
|
|
$rootScope.$on('Local/GlideraTx', function(event, accessToken, permissions) {
|
|
|
|
self.updateGlidera();
|
2015-08-28 14:23:24 -07:00
|
|
|
});
|
|
|
|
|
2015-09-07 13:43:55 -07:00
|
|
|
$rootScope.$on('Local/GlideraError', function(event) {
|
|
|
|
self.debouncedUpdate();
|
|
|
|
});
|
|
|
|
|
2015-04-25 08:37:04 -07:00
|
|
|
$rootScope.$on('Local/UnitSettingUpdated', function(event) {
|
2015-03-06 07:00:10 -08:00
|
|
|
self.updateAll();
|
2015-04-21 08:20:54 -07:00
|
|
|
self.updateTxHistory();
|
2015-06-29 17:46:34 -07:00
|
|
|
self.updateRemotePreferences({
|
|
|
|
saveAll: true
|
|
|
|
}, function() {
|
|
|
|
$log.debug('Remote preferences saved')
|
|
|
|
});
|
2015-03-06 07:00:10 -08:00
|
|
|
});
|
|
|
|
|
2015-06-29 17:46:34 -07:00
|
|
|
$rootScope.$on('Local/EmailSettingUpdated', function(event, email, cb) {
|
|
|
|
self.updateRemotePreferences({
|
|
|
|
preferences: {
|
2015-07-14 13:29:56 -07:00
|
|
|
email: email || null
|
2015-06-29 17:46:34 -07:00
|
|
|
},
|
|
|
|
}, cb);
|
2015-05-19 10:10:47 -07:00
|
|
|
});
|
|
|
|
|
2015-03-06 07:00:10 -08:00
|
|
|
$rootScope.$on('Local/WalletCompleted', function(event) {
|
|
|
|
self.setFocusedWallet();
|
|
|
|
go.walletHome();
|
|
|
|
});
|
|
|
|
|
2015-04-28 15:26:22 -07:00
|
|
|
self.debouncedUpdate = lodash.throttle(function() {
|
2015-06-29 17:46:34 -07:00
|
|
|
self.updateAll({
|
|
|
|
quiet: true
|
|
|
|
});
|
2015-04-28 15:26:22 -07:00
|
|
|
self.updateTxHistory();
|
2015-05-04 08:23:43 -07:00
|
|
|
}, 4000, {
|
|
|
|
leading: false,
|
|
|
|
trailing: true
|
|
|
|
});
|
2015-04-28 15:26:22 -07:00
|
|
|
|
2015-06-25 08:26:43 -07:00
|
|
|
$rootScope.$on('Local/Resume', function(event) {
|
|
|
|
$log.debug('### Resume event');
|
|
|
|
self.debouncedUpdate();
|
2015-03-06 07:00:10 -08:00
|
|
|
});
|
|
|
|
|
|
|
|
$rootScope.$on('Local/BackupDone', function(event) {
|
|
|
|
self.needsBackup = false;
|
2015-09-21 06:18:43 -07:00
|
|
|
$log.debug('Backup done');
|
2015-04-27 08:35:26 -07:00
|
|
|
storageService.setBackupFlag(self.walletId, function(err) {
|
2015-08-12 09:04:39 -07:00
|
|
|
if (err) root.showErrorPopup(err);
|
2015-09-21 06:18:43 -07:00
|
|
|
$log.debug('Backup done stored');
|
2015-04-27 08:35:26 -07:00
|
|
|
});
|
2015-03-06 07:00:10 -08:00
|
|
|
});
|
|
|
|
|
2015-04-24 12:39:12 -07:00
|
|
|
$rootScope.$on('Local/DeviceError', function(event, err) {
|
2015-08-12 09:04:39 -07:00
|
|
|
root.showErrorPopup(err);
|
2015-03-06 07:00:10 -08:00
|
|
|
});
|
|
|
|
|
|
|
|
$rootScope.$on('Local/WalletImported', function(event, walletId) {
|
2015-05-04 11:47:04 -07:00
|
|
|
self.needsBackup = false;
|
2015-05-04 08:23:43 -07:00
|
|
|
storageService.setBackupFlag(walletId, function() {
|
2015-09-21 06:18:43 -07:00
|
|
|
$log.debug('Backup done stored');
|
2015-06-27 09:22:56 -07:00
|
|
|
addressService.expireAddress(walletId, function(err) {
|
2015-09-04 20:11:14 -07:00
|
|
|
$timeout(function() {
|
|
|
|
self.startScan(walletId);
|
|
|
|
}, 500);
|
2015-05-04 08:23:43 -07:00
|
|
|
});
|
2015-04-18 03:23:11 -07:00
|
|
|
});
|
2015-03-06 07:00:10 -08:00
|
|
|
});
|
|
|
|
|
2015-04-15 10:03:38 -07:00
|
|
|
$rootScope.$on('NewIncomingTx', function() {
|
2015-07-06 06:40:40 -07:00
|
|
|
self.updateAll({
|
|
|
|
walletStatus: null,
|
|
|
|
untilItChanges: true,
|
|
|
|
triggerTxUpdate: true,
|
|
|
|
});
|
2015-03-06 07:00:10 -08:00
|
|
|
});
|
|
|
|
|
2015-08-12 04:57:44 -07:00
|
|
|
|
|
|
|
$rootScope.$on('NewBlock', function() {
|
2015-10-05 11:21:44 -07:00
|
|
|
if (self.glideraEnabled) {
|
|
|
|
$timeout(function() {
|
|
|
|
self.updateGlidera();
|
|
|
|
});
|
|
|
|
}
|
2015-08-12 04:57:44 -07:00
|
|
|
if (self.pendingAmount) {
|
2015-09-18 09:59:18 -07:00
|
|
|
self.updateAll({
|
|
|
|
walletStatus: null,
|
|
|
|
untilItChanges: null,
|
|
|
|
triggerTxUpdate: true,
|
|
|
|
});
|
|
|
|
} else if (self.hasUnsafeConfirmed) {
|
|
|
|
$log.debug('Wallet has transactions with few confirmations. Updating.')
|
|
|
|
if (self.network == 'testnet') {
|
|
|
|
self.debouncedUpdateHistory();
|
|
|
|
} else {
|
|
|
|
self.updateTxHistory();
|
|
|
|
}
|
2015-08-12 04:57:44 -07:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
|
2015-05-29 08:39:17 -07:00
|
|
|
$rootScope.$on('NewOutgoingTx', function() {
|
2015-06-29 17:46:34 -07:00
|
|
|
self.updateAll({
|
|
|
|
walletStatus: null,
|
2015-07-06 07:12:40 -07:00
|
|
|
untilItChanges: true,
|
|
|
|
triggerTxUpdate: true,
|
2015-06-29 17:46:34 -07:00
|
|
|
});
|
2015-05-29 08:39:17 -07:00
|
|
|
});
|
|
|
|
|
2015-09-09 07:52:19 -07:00
|
|
|
lodash.each(['NewTxProposal', 'TxProposalFinallyRejected', 'TxProposalRemoved', 'NewOutgoingTxByThirdParty',
|
2015-09-09 06:39:35 -07:00
|
|
|
'Local/NewTxProposal', 'Local/TxProposalAction', 'ScanFinished', 'Local/GlideraTx'
|
2015-03-06 07:00:10 -08:00
|
|
|
], function(eventName) {
|
2015-05-18 12:21:36 -07:00
|
|
|
$rootScope.$on(eventName, function(event, untilItChanges) {
|
2015-06-29 17:46:34 -07:00
|
|
|
self.updateAll({
|
|
|
|
walletStatus: null,
|
2015-07-06 06:40:40 -07:00
|
|
|
untilItChanges: untilItChanges,
|
|
|
|
triggerTxUpdate: true,
|
2015-06-29 17:46:34 -07:00
|
|
|
});
|
2015-03-06 07:00:10 -08:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
lodash.each(['TxProposalRejectedBy', 'TxProposalAcceptedBy'], function(eventName) {
|
|
|
|
$rootScope.$on(eventName, function() {
|
|
|
|
var f = function() {
|
|
|
|
if (self.updatingStatus) {
|
|
|
|
return $timeout(f, 200);
|
|
|
|
};
|
|
|
|
self.updatePendingTxps();
|
|
|
|
};
|
|
|
|
f();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
$rootScope.$on('Local/NoWallets', function(event) {
|
|
|
|
$timeout(function() {
|
|
|
|
self.hasProfile = true;
|
|
|
|
self.noFocusedWallet = true;
|
|
|
|
self.isComplete = null;
|
|
|
|
self.walletName = null;
|
2015-05-13 07:58:19 -07:00
|
|
|
go.path('import');
|
2015-03-06 07:00:10 -08:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
$rootScope.$on('Local/NewFocusedWallet', function() {
|
|
|
|
self.setFocusedWallet();
|
|
|
|
self.updateTxHistory();
|
2015-05-08 11:19:42 -07:00
|
|
|
go.walletHome();
|
2015-10-19 13:26:15 -07:00
|
|
|
storageService.getCleanAndScanAddresses(function(err, walletId) {
|
|
|
|
if (walletId && profileService.walletClients[walletId]) {
|
|
|
|
$log.debug('Clear last address cache and Scan ', walletId);
|
|
|
|
addressService.expireAddress(walletId, function(err) {
|
|
|
|
self.startScan(walletId);
|
2015-06-10 11:01:49 -07:00
|
|
|
});
|
2015-06-10 08:56:26 -07:00
|
|
|
storageService.removeCleanAndScanAddresses(function() {});
|
|
|
|
}
|
|
|
|
});
|
2015-03-06 07:00:10 -08:00
|
|
|
});
|
|
|
|
|
2015-04-28 16:13:28 -07:00
|
|
|
$rootScope.$on('Local/SetTab', function(event, tab, reset) {
|
|
|
|
self.setTab(tab, reset);
|
2015-04-23 10:37:44 -07:00
|
|
|
});
|
|
|
|
|
2015-10-07 12:17:19 -07:00
|
|
|
$rootScope.$on('Local/RequestTouchid', function(event, cb) {
|
|
|
|
window.plugins.touchid.verifyFingerprint(
|
|
|
|
gettextCatalog.getString('Scan your fingerprint please'),
|
|
|
|
function(msg) {
|
|
|
|
// OK
|
|
|
|
return cb();
|
|
|
|
},
|
|
|
|
function(msg) {
|
|
|
|
// ERROR
|
|
|
|
return cb(gettext('Invalid Touch ID'));
|
|
|
|
}
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
2015-08-12 09:04:39 -07:00
|
|
|
$rootScope.$on('Local/ShowAlert', function(event, msg, cb) {
|
2015-09-04 20:11:14 -07:00
|
|
|
self.showErrorPopup(msg, cb);
|
2015-08-12 09:04:39 -07:00
|
|
|
});
|
|
|
|
|
2015-03-06 07:00:10 -08:00
|
|
|
$rootScope.$on('Local/NeedsPassword', function(event, isSetup, cb) {
|
|
|
|
self.askPassword = {
|
|
|
|
isSetup: isSetup,
|
2015-04-13 10:58:07 -07:00
|
|
|
callback: function(err, pass) {
|
2015-03-06 07:00:10 -08:00
|
|
|
self.askPassword = null;
|
|
|
|
return cb(err, pass);
|
|
|
|
},
|
|
|
|
};
|
|
|
|
});
|
|
|
|
|
|
|
|
lodash.each(['NewCopayer', 'CopayerUpdated'], function(eventName) {
|
|
|
|
$rootScope.$on(eventName, function() {
|
2015-04-29 08:16:28 -07:00
|
|
|
// Re try to open wallet (will triggers)
|
2015-03-06 07:00:10 -08:00
|
|
|
self.setFocusedWallet();
|
|
|
|
});
|
|
|
|
});
|
2015-10-05 08:20:00 -07:00
|
|
|
});
|