From 601fa94fdeb2c79359eac2669402e72e2f60dc0b Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Fri, 12 Aug 2016 11:10:26 -0300 Subject: [PATCH] WIP: refactor walletService --- public/views/tab-home.html | 3 - src/js/controllers/index.js | 475 +------------------------------ src/js/services/walletService.js | 424 ++++++++++++++++++++++++++- 3 files changed, 426 insertions(+), 476 deletions(-) diff --git a/public/views/tab-home.html b/public/views/tab-home.html index 2fbd8cb7b..98dd66a58 100644 --- a/public/views/tab-home.html +++ b/public/views/tab-home.html @@ -25,8 +25,6 @@
  • BitPay Card - -
  • @@ -38,7 +36,6 @@ bla bla -
  • diff --git a/src/js/controllers/index.js b/src/js/controllers/index.js index 7e496191c..d50a430f0 100644 --- a/src/js/controllers/index.js +++ b/src/js/controllers/index.js @@ -262,122 +262,6 @@ angular.module('copayApp.controllers').controller('indexController', function($r }; - - var _walletStatusHash = function(walletStatus) { - var bal; - if (walletStatus) { - bal = walletStatus.balance.totalAmount; - } else { - bal = self.totalBalanceSat; - } - return bal; - }; - - // TODO move this to wallet service - self.updateAll = function(opts, initStatusHash, tries) { - $scope.$broadcast('scroll.refreshComplete'); - tries = tries || 0; - opts = opts || {}; - var fc = profileService.focusedClient; - if (!fc) return; - - var walletId = fc.credentials.walletId - - if (opts.untilItChanges && lodash.isUndefined(initStatusHash)) { - initStatusHash = _walletStatusHash(); - $log.debug('Updating status until it changes. initStatusHash:' + initStatusHash) - } - - var get = function(cb) { - if (opts.walletStatus) - return cb(null, opts.walletStatus); - else { - self.updateError = false; - return fc.getStatus({ - twoStep: true - }, function(err, ret) { - if (err) { - self.updateError = bwcError.msg(err, gettext('Could not update Wallet')); - } else { - self.isSingleAddress = !!ret.wallet.singleAddress; - if (!opts.quiet) - self.updating = ret.wallet.scanStatus == 'running'; - } - return cb(err, ret); - }); - } - }; - - // If not untilItChanges...trigger history update now - if (opts.triggerTxUpdate && !opts.untilItChanges) { - $timeout(function() { - self.debounceUpdateHistory(); - }, 1); - } - - $timeout(function() { - - if (!opts.quiet) - self.updating = true; - - $log.debug('Updating Status:', fc.credentials.walletName, tries); - get(function(err, walletStatus) { - var currentStatusHash = _walletStatusHash(walletStatus); - $log.debug('Status update. hash:' + currentStatusHash + ' Try:' + tries); - if (!err && opts.untilItChanges && initStatusHash == currentStatusHash && tries < 7 && walletId == profileService.focusedClient.credentials.walletId) { - return $timeout(function() { - $log.debug('Retrying update... Try:' + tries) - return self.updateAll({ - walletStatus: null, - untilItChanges: true, - triggerTxUpdate: opts.triggerTxUpdate, - }, initStatusHash, ++tries); - }, 1400 * tries); - } - - if (walletId != profileService.focusedClient.credentials.walletId) - return; - - self.updating = false; - - if (err) { - self.handleError(err); - return; - } - $log.debug('Wallet Status:', walletStatus); - self.setPendingTxps(walletStatus.pendingTxps); - - // Status Shortcuts - self.lastUpdate = Date.now(); - self.walletName = walletStatus.wallet.name; - self.walletSecret = walletStatus.wallet.secret; - self.walletStatus = walletStatus.wallet.status; - self.walletScanStatus = walletStatus.wallet.scanStatus; - self.copayers = walletStatus.wallet.copayers; - self.preferences = walletStatus.preferences; - self.setBalance(walletStatus.balance); - self.otherWallets = lodash.filter(profileService.getWallets(self.network), function(w) { - return w.id != self.walletId; - }); - - // Notify external addons or plugins - $rootScope.$emit('Local/BalanceUpdated', walletStatus.balance); - $rootScope.$apply(); - - - if (opts.triggerTxUpdate && opts.untilItChanges) { - $timeout(function() { - self.debounceUpdateHistory(); - }, 1); - } else { - self.loadingWallet = false; - } - - if (opts.cb) return opts.cb(); - }); - }); - }; - self.setSpendUnconfirmed = function(spendUnconfirmed) { self.spendUnconfirmed = spendUnconfirmed || configService.getSync().wallet.spendUnconfirmed; }; @@ -659,163 +543,6 @@ angular.module('copayApp.controllers').controller('indexController', function($r }); } - self.getSavedTxs = function(walletId, cb) { - - storageService.getTxHistory(walletId, function(err, txs) { - if (err) return cb(err); - - var localTxs = []; - - if (!txs) { - return cb(null, localTxs); - } - - try { - localTxs = JSON.parse(txs); - } catch (ex) { - $log.warn(ex); - } - return cb(null, lodash.compact(localTxs)); - }); - } - - self.updateLocalTxHistory = function(client, cb) { - var FIRST_LIMIT = 5; - var LIMIT = 50; - var requestLimit = FIRST_LIMIT; - var walletId = client.credentials.walletId; - var config = configService.getSync().wallet.settings; - - var fixTxsUnit = function(txs) { - if (!txs || !txs[0] || !txs[0].amountStr) return; - - var cacheUnit = txs[0].amountStr.split(' ')[1]; - - if (cacheUnit == config.unitName) - return; - - var name = ' ' + config.unitName; - - $log.debug('Fixing Tx Cache Unit to:' + name) - lodash.each(txs, function(tx) { - - tx.amountStr = profileService.formatAmount(tx.amount) + name; - tx.feeStr = profileService.formatAmount(tx.fees) + name; - }); - }; - - self.getSavedTxs(walletId, function(err, txsFromLocal) { - if (err) return cb(err); - - fixTxsUnit(txsFromLocal); - - var confirmedTxs = self.removeAndMarkSoftConfirmedTx(txsFromLocal); - var endingTxid = confirmedTxs[0] ? confirmedTxs[0].txid : null; - var endingTs = confirmedTxs[0] ? confirmedTxs[0].time : null; - - - // First update - if (walletId == profileService.focusedClient.credentials.walletId) { - self.completeHistory = txsFromLocal; - self.setCompactTxHistory(); - } - - if (historyUpdateInProgress[walletId]) - return; - - historyUpdateInProgress[walletId] = true; - - function getNewTxs(newTxs, skip, i_cb) { - self.getTxsFromServer(client, skip, endingTxid, requestLimit, function(err, res, shouldContinue) { - if (err) return i_cb(err); - - newTxs = newTxs.concat(lodash.compact(res)); - skip = skip + requestLimit; - - $log.debug('Syncing TXs. Got:' + newTxs.length + ' Skip:' + skip, ' EndingTxid:', endingTxid, ' Continue:', shouldContinue); - - if (!shouldContinue) { - newTxs = self.processNewTxs(newTxs); - $log.debug('Finished Sync: New / soft confirmed Txs: ' + newTxs.length); - return i_cb(null, newTxs); - } - - requestLimit = LIMIT; - getNewTxs(newTxs, skip, i_cb); - - // Progress update - if (walletId == profileService.focusedClient.credentials.walletId) { - self.txProgress = newTxs.length; - if (self.completeHistory < FIRST_LIMIT && txsFromLocal.length == 0) { - $log.debug('Showing partial history'); - var newHistory = self.processNewTxs(newTxs); - newHistory = lodash.compact(newHistory.concat(confirmedTxs)); - self.completeHistory = newHistory; - self.setCompactTxHistory(); - } - $timeout(function() { - $rootScope.$apply(); - }); - } - }); - }; - - getNewTxs([], 0, function(err, txs) { - if (err) return cb(err); - - var newHistory = lodash.uniq(lodash.compact(txs.concat(confirmedTxs)), function(x) { - return x.txid; - }); - - - function updateNotes(cb2) { - if (!endingTs) return cb2(); - - $log.debug('Syncing notes from: ' + endingTs); - client.getTxNotes({ - minTs: endingTs - }, function(err, notes) { - if (err) { - $log.warn(err); - return cb2(); - }; - lodash.each(notes, function(note) { - $log.debug('Note for ' + note.txid); - lodash.each(newHistory, function(tx) { - if (tx.txid == note.txid) { - $log.debug('...updating note for ' + note.txid); - tx.note = note; - } - }); - }); - return cb2(); - }); - } - - updateNotes(function() { - var historyToSave = JSON.stringify(newHistory); - - lodash.each(txs, function(tx) { - tx.recent = true; - }) - - $log.debug('Tx History synced. Total Txs: ' + newHistory.length); - - // Final update - if (walletId == profileService.focusedClient.credentials.walletId) { - self.completeHistory = newHistory; - self.setCompactTxHistory(); - } - - return storageService.setTxHistory(historyToSave, walletId, function() { - $log.debug('Tx History saved.'); - - return cb(); - }); - }); - }); - }); - } self.showMore = function() { $timeout(function() { @@ -835,181 +562,8 @@ angular.module('copayApp.controllers').controller('indexController', function($r }, 100); }; - self.startSearch = function() { - self.isSearching = true; - self.txHistorySearchResults = []; - self.result = []; - self.historyShowMore = false; - self.nextTxHistory = self.historyShowMoreLimit; - } - self.cancelSearch = function() { - self.isSearching = false; - self.result = []; - self.setCompactTxHistory(); - } - self.updateSearchInput = function(search) { - self.search = search; - if (isCordova) - window.plugins.toast.hide(); - self.throttleSearch(); - $ionicScrollDelegate.resize(); - } - - self.throttleSearch = lodash.throttle(function() { - - function filter(search) { - self.result = []; - - function computeSearchableString(tx) { - var addrbook = ''; - if (tx.addressTo && self.addressbook && self.addressbook[tx.addressTo]) addrbook = self.addressbook[tx.addressTo] || ''; - var searchableDate = computeSearchableDate(new Date(tx.time * 1000)); - var message = tx.message ? tx.message : ''; - var comment = tx.note ? tx.note.body : ''; - var addressTo = tx.addressTo ? tx.addressTo : ''; - return ((tx.amountStr + message + addressTo + addrbook + searchableDate + comment).toString()).toLowerCase(); - } - - function computeSearchableDate(date) { - var day = ('0' + date.getDate()).slice(-2).toString(); - var month = ('0' + (date.getMonth() + 1)).slice(-2).toString(); - var year = date.getFullYear(); - return [month, day, year].join('/'); - }; - - if (lodash.isEmpty(search)) { - self.historyShowMore = false; - return []; - } - self.result = lodash.filter(self.completeHistory, function(tx) { - if (!tx.searcheableString) tx.searcheableString = computeSearchableString(tx); - return lodash.includes(tx.searcheableString, search.toLowerCase()); - }); - - if (self.result.length > self.historyShowLimit) self.historyShowMore = true; - else self.historyShowMore = false; - - return self.result; - }; - - self.txHistorySearchResults = filter(self.search).slice(0, self.historyShowLimit); - if (isCordova) - window.plugins.toast.showShortBottom(gettextCatalog.getString('Matches: ' + self.result.length)); - - $timeout(function() { - $rootScope.$apply(); - }); - - }, 1000); - - self.getTxsFromServer = function(client, skip, endingTxid, limit, cb) { - var res = []; - - client.getTxHistory({ - skip: skip, - limit: limit - }, function(err, txsFromServer) { - if (err) return cb(err); - - if (!txsFromServer.length) - return cb(); - - var res = lodash.takeWhile(txsFromServer, function(tx) { - return tx.txid != endingTxid; - }); - - return cb(null, res, res.length == limit); - }); - }; - - self.updateHistory = function() { - var fc = profileService.focusedClient; - if (!fc) return; - var walletId = fc.credentials.walletId; - - if (!fc.isComplete()) { - return; - } - - $log.debug('Updating Transaction History'); - self.txHistoryError = false; - self.updatingTxHistory = true; - - $timeout(function() { - self.updateLocalTxHistory(fc, function(err) { - historyUpdateInProgress[walletId] = self.updatingTxHistory = false; - self.loadingWallet = false; - self.txProgress = 0; - if (err) - self.txHistoryError = true; - - $timeout(function() { - self.newTx = false - }, 1000); - - $rootScope.$apply(); - }); - }); - }; - - self.setCompactTxHistory = function() { - self.isSearching = false; - self.nextTxHistory = self.historyShowMoreLimit; - self.txHistory = self.completeHistory ? self.completeHistory.slice(0, self.historyShowLimit) : null; - self.historyShowMore = self.completeHistory ? self.completeHistory.length > self.historyShowLimit : null; - }; - - self.debounceUpdateHistory = lodash.debounce(function() { - self.updateHistory(); - }, 1000); - - self.throttledUpdateHistory = lodash.throttle(function() { - self.updateHistory(); - }, 5000); - - self.showErrorPopup = function(msg, cb) { - $log.warn('Showing err popup:' + msg); - - function openErrorPopup(msg, cb) { - $scope.msg = msg; - - self.errorPopup = $ionicPopup.show({ - templateUrl: 'views/includes/alert.html', - scope: $scope, - }); - - $scope.close = function() { - return cb(); - }; - } - - openErrorPopup(msg, function() { - self.errorPopup.close(); - if (cb) return cb(); - }); - }; - - self.recreate = function(cb) { - var fc = profileService.focusedClient; - ongoingProcess.set('recreating', true); - fc.recreateWallet(function(err) { - self.notAuthorized = false; - ongoingProcess.set('recreating', false); - - if (err) { - self.handleError(err); - $rootScope.$apply(); - return; - } - - profileService.bindWalletClient(fc, { - force: true - }); - self.startScan(self.walletId); - }); - }; self.toggleLeftMenu = function() { profileService.isDisclaimerAccepted(function(val) { @@ -1019,30 +573,6 @@ angular.module('copayApp.controllers').controller('indexController', function($r }); }; - self.retryScan = function() { - var self = this; - self.startScan(self.walletId); - } - - self.startScan = function(walletId) { - $log.debug('Scanning wallet ' + walletId); - var c = profileService.walletClients[walletId]; - if (!c.isComplete()) return; - - if (self.walletId == walletId) - self.updating = true; - - c.startScan({ - includeCopayerBranches: true, - }, function(err) { - if (err && self.walletId == walletId) { - self.updating = false; - self.handleError(err); - $rootScope.$apply(); - } - }); - }; - self.initGlidera = function(accessToken) { self.glideraEnabled = configService.getSync().glidera.enabled; self.glideraTestnet = configService.getSync().glidera.testnet; @@ -1656,6 +1186,11 @@ angular.module('copayApp.controllers').controller('indexController', function($r }); $rootScope.$on('Local/NewFocusedWallet', function() { +console.log('[index.js.1200:NewFocusedWallet:] TODO'); //TODO + +return; + + uxLanguage.update(); self.setFocusedWallet(); self.updateHistory(); diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index 1578a279f..62ea4980b 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -1,9 +1,9 @@ 'use strict'; // DO NOT INCLUDE STORAGE HERE \/ \/ -angular.module('copayApp.services').factory('walletService', function($log, lodash, trezor, ledger, storageService, configService, uxLanguage) { -// DO NOT INCLUDE STORAGE HERE ^^ - +angular.module('copayApp.services').factory('walletService', function($log, $timeout, lodash, trezor, ledger, storageService, configService, uxLanguage) { + // DO NOT INCLUDE STORAGE HERE ^^ + var root = {}; var _signWithLedger = function(client, txp, cb) { @@ -42,6 +42,345 @@ angular.module('copayApp.services').factory('walletService', function($log, loda return true; }; + var _walletStatusHash = function(walletStatus) { + var bal; + if (walletStatus) { + bal = walletStatus.balance.totalAmount; + } else { + bal = self.totalBalanceSat; + } + return bal; + }; + + + // TODO + // This handles errors from BWS/index which normally + // trigger from async events (like updates). + // Debounce function avoids multiple popups + var _handleError = function(err) { + $log.warn('Client ERROR: ', err); + + $log.warn('TODO'); + return ; // TODO!!! + if (err instanceof errors.NOT_AUTHORIZED) { + self.notAuthorized = true; + go.walletHome(); + } else if (err instanceof errors.NOT_FOUND) { + self.showErrorPopup(gettext('Could not access Wallet Service: Not found')); + } else { + var msg = "" + $scope.$emit('Local/ClientError', (err.error ? err.error : err)); + var msg = bwcError.msg(err, gettext('Error at Wallet Service')); + self.showErrorPopup(msg); + } + }; + root.handleError = lodash.debounce(_handleError, 1000); + + // emits + // statusUpdated walletId, err ,statusObj + // + root.updateStatus = function(client, opts, cb, initStatusHash, tries) { + tries = tries || 0; + opts = opts || {}; + + var walletId = client.credentials.walletId + + if (opts.untilItChanges && lodash.isUndefined(initStatusHash)) { + initStatusHash = _walletStatusHash(); + $log.debug('Updating status until it changes. initStatusHash:' + initStatusHash) + } + + var get = function(cb) { + if (opts.walletStatus) + return cb(null, opts.walletStatus); + else { + return client.getStatus({ + twoStep: true + }, function(err, ret) { + if (err) + return cb(bwcError.msg(err, gettext('Could not update Wallet'))); + // TODO?? + // self.isSingleAddress = !!ret.wallet.singleAddress; + // self.updating = ret.wallet.scanStatus == 'running'; + return cb(err); + }); + } + }; + + // If not untilItChanges...trigger history update now + if (opts.triggerTxUpdate && !opts.untilItChanges) { + $timeout(function() { + root.debounceUpdateHistory(); + }, 1); + } + + $timeout(function() { + + // if (!opts.quiet) + // self.updating = true; + + $log.debug('Updating Status:', client.credentials.walletName, tries); + get(function(err, walletStatus) { + var currentStatusHash = _walletStatusHash(walletStatus); + $log.debug('Status update. hash:' + currentStatusHash + ' Try:' + tries); + if (!err && opts.untilItChanges && initStatusHash == currentStatusHash && tries < 7 && walletId == profileService.focusedClient.credentials.walletId) { + return $timeout(function() { + $log.debug('Retrying update... ' + walletId + ' Try:' + tries) + return root.updateStatus(client, { + walletStatus: null, + untilItChanges: true, + triggerTxUpdate: opts.triggerTxUpdate, + }, cb, initStatusHash, ++tries); + }, 1400 * tries); + } + + if (err) { + root.handleError(err); + return cb(err); + } + + $log.debug('Wallet Status:' + client.credentials.walletName, walletStatus); + + // self.setPendingTxps(walletStatus.pendingTxps); + // + // // Status Shortcuts + // self.lastUpdate = Date.now(); + // self.walletName = walletStatus.wallet.name; + // self.walletSecret = walletStatus.wallet.secret; + // self.walletStatus = walletStatus.wallet.status; + // self.walletScanStatus = walletStatus.wallet.scanStatus; + // self.copayers = walletStatus.wallet.copayers; + // self.preferences = walletStatus.preferences; + // self.setBalance(walletStatus.balance); + // self.otherWallets = lodash.filter(profileService.getWallets(self.network), function(w) { + // return w.id != self.walletId; + // }); + // + // Notify external addons or plugins + + // TODO + if (opts.triggerTxUpdate && opts.untilItChanges) { + $timeout(function() { + root.debounceUpdateHistory(); + }, 1); + } + return cb(null, walletStatus); + // } else { + // self.loadingWallet = false; + // } + }); + }); + }; + + var getSavedTxs = function(walletId, cb) { + + storageService.getTxHistory(walletId, function(err, txs) { + if (err) return cb(err); + + var localTxs = []; + + if (!txs) { + return cb(null, localTxs); + } + + try { + localTxs = JSON.parse(txs); + } catch (ex) { + $log.warn(ex); + } + return cb(null, lodash.compact(localTxs)); + }); + }; + + var getTxsFromServer = function(client, skip, endingTxid, limit, cb) { + var res = []; + + client.getTxHistory({ + skip: skip, + limit: limit + }, function(err, txsFromServer) { + if (err) return cb(err); + + if (!txsFromServer.length) + return cb(); + + var res = lodash.takeWhile(txsFromServer, function(tx) { + return tx.txid != endingTxid; + }); + + return cb(null, res, res.length == limit); + }); + }; + + + var updateLocalTxHistory = function(client, cb) { + var FIRST_LIMIT = 5; + var LIMIT = 50; + var requestLimit = FIRST_LIMIT; + var walletId = client.credentials.walletId; + var config = configService.getSync().wallet.settings; + + var fixTxsUnit = function(txs) { + if (!txs || !txs[0] || !txs[0].amountStr) return; + + var cacheUnit = txs[0].amountStr.split(' ')[1]; + + if (cacheUnit == config.unitName) + return; + + var name = ' ' + config.unitName; + + $log.debug('Fixing Tx Cache Unit to:' + name) + lodash.each(txs, function(tx) { + + tx.amountStr = profileService.formatAmount(tx.amount) + name; + tx.feeStr = profileService.formatAmount(tx.fees) + name; + }); + }; + + getSavedTxs(walletId, function(err, txsFromLocal) { + if (err) return cb(err); + + fixTxsUnit(txsFromLocal); + + var confirmedTxs = self.removeAndMarkSoftConfirmedTx(txsFromLocal); + var endingTxid = confirmedTxs[0] ? confirmedTxs[0].txid : null; + var endingTs = confirmedTxs[0] ? confirmedTxs[0].time : null; + + + // First update + if (walletId == profileService.focusedClient.credentials.walletId) { + self.completeHistory = txsFromLocal; + setCompactTxHistory(); + } + + if (historyUpdateInProgress[walletId]) + return; + + historyUpdateInProgress[walletId] = true; + + function getNewTxs(newTxs, skip, i_cb) { + getTxsFromServer(client, skip, endingTxid, requestLimit, function(err, res, shouldContinue) { + if (err) return i_cb(err); + + newTxs = newTxs.concat(lodash.compact(res)); + skip = skip + requestLimit; + + $log.debug('Syncing TXs. Got:' + newTxs.length + ' Skip:' + skip, ' EndingTxid:', endingTxid, ' Continue:', shouldContinue); + + if (!shouldContinue) { + newTxs = self.processNewTxs(newTxs); + $log.debug('Finished Sync: New / soft confirmed Txs: ' + newTxs.length); + return i_cb(null, newTxs); + } + + requestLimit = LIMIT; + getNewTxs(newTxs, skip, i_cb); + + // Progress update + if (walletId == profileService.focusedClient.credentials.walletId) { + self.txProgress = newTxs.length; + if (self.completeHistory < FIRST_LIMIT && txsFromLocal.length == 0) { + $log.debug('Showing partial history'); + var newHistory = self.processNewTxs(newTxs); + newHistory = lodash.compact(newHistory.concat(confirmedTxs)); + self.completeHistory = newHistory; + setCompactTxHistory(); + } + $timeout(function() { + $rootScope.$apply(); + }); + } + }); + }; + + getNewTxs([], 0, function(err, txs) { + if (err) return cb(err); + + var newHistory = lodash.uniq(lodash.compact(txs.concat(confirmedTxs)), function(x) { + return x.txid; + }); + + + function updateNotes(cb2) { + if (!endingTs) return cb2(); + + $log.debug('Syncing notes from: ' + endingTs); + client.getTxNotes({ + minTs: endingTs + }, function(err, notes) { + if (err) { + $log.warn(err); + return cb2(); + }; + lodash.each(notes, function(note) { + $log.debug('Note for ' + note.txid); + lodash.each(newHistory, function(tx) { + if (tx.txid == note.txid) { + $log.debug('...updating note for ' + note.txid); + tx.note = note; + } + }); + }); + return cb2(); + }); + } + + updateNotes(function() { + var historyToSave = JSON.stringify(newHistory); + + lodash.each(txs, function(tx) { + tx.recent = true; + }) + + $log.debug('Tx History synced. Total Txs: ' + newHistory.length); + + // Final update + if (walletId == profileService.focusedClient.credentials.walletId) { + self.completeHistory = newHistory; + setCompactTxHistory(); + } + + return storageService.setTxHistory(historyToSave, walletId, function() { + $log.debug('Tx History saved.'); + + return cb(); + }); + }); + }); + }); + }; + + + root.updateHistory = function(client) { + var walletId = client.credentials.walletId; + + if (!client.isComplete()) return; + + + $log.debug('Updating Transaction History'); + self.txHistoryError = false; + self.updatingTxHistory = true; + + $timeout(function() { + updateLocalTxHistory(client, function(err) { + historyUpdateInProgress[walletId] = self.updatingTxHistory = false; + self.loadingWallet = false; + self.txProgress = 0; + if (err) + self.txHistoryError = true; + + $timeout(function() { + self.newTx = false + }, 1000); + + $rootScope.$apply(); + }); + }); + }; + + + root.isEncrypted = function(client) { if (lodash.isEmpty(client)) return; @@ -225,5 +564,84 @@ angular.module('copayApp.services').factory('walletService', function($log, loda }); }; + var setCompactTxHistory = function() { + + // TODO + self.isSearching = false; + self.nextTxHistory = self.historyShowMoreLimit; + self.txHistory = self.completeHistory ? self.completeHistory.slice(0, self.historyShowLimit) : null; + self.historyShowMore = self.completeHistory ? self.completeHistory.length > self.historyShowLimit : null; + }; + + root.debounceUpdateHistory = lodash.debounce(function() { + root.updateHistory(); + }, 1000); + + self.throttledUpdateHistory = lodash.throttle(function() { + root.updateHistory(); + }, 5000); + + self.showErrorPopup = function(msg, cb) { + $log.warn('Showing err popup:' + msg); + + function openErrorPopup(msg, cb) { + $scope.msg = msg; + + self.errorPopup = $ionicPopup.show({ + templateUrl: 'views/includes/alert.html', + scope: $scope, + }); + + $scope.close = function() { + return cb(); + }; + } + + openErrorPopup(msg, function() { + self.errorPopup.close(); + if (cb) return cb(); + }); + }; + + root.recreate = function(client, cb) { + ongoingProcess.set('recreating', true); + client.recreateWallet(function(err) { + self.notAuthorized = false; + ongoingProcess.set('recreating', false); + + if (err) { + self.handleError(err); + $rootScope.$apply(); + return; + } + + profileService.bindWalletClient(client, { + force: true + }); + self.startScan(client); + }); + }; + + root.startScan = function(client) { + $log.debug('Scanning wallet ' + client.credentials.walletId); + if (!client.isComplete()) return; + +// self.updating = true; + + client.startScan({ + includeCopayerBranches: true, + }, function(err) { + + // TODO + // if (err && self.walletId == walletId) { + // self.updating = false; + // self.handleError(err); + // $rootScope.$apply(); + // } + }); + }; + + + return root; });