From 86f356bca3acfd4dad3aeae643b951b83eae24b6 Mon Sep 17 00:00:00 2001 From: Javier Date: Thu, 8 Oct 2015 14:29:35 -0300 Subject: [PATCH] loading history from bwc and local --- public/views/walletHome.html | 10 +- src/js/controllers/index.js | 457 +++++++++++++++++++++--------- src/js/services/storageService.js | 15 + 3 files changed, 340 insertions(+), 142 deletions(-) diff --git a/public/views/walletHome.html b/public/views/walletHome.html index faf16d9ef..2482d093f 100644 --- a/public/views/walletHome.html +++ b/public/views/walletHome.html @@ -513,12 +513,18 @@ -
+ +
- + Download CSV file + + + + READ CSV file +
diff --git a/src/js/controllers/index.js b/src/js/controllers/index.js index 988228bd5..6a68e177f 100644 --- a/src/js/controllers/index.js +++ b/src/js/controllers/index.js @@ -404,48 +404,6 @@ angular.module('copayApp.controllers').controller('indexController', function($r }); }; - self.updateTxHistory = function(skip) { - var fc = profileService.focusedClient; - if (!fc || !fc.isComplete()) return; - if (!skip) { - self.txHistory = []; - self.txHistoryUnique = {}; - } - self.skipHistory = skip || 0; - $log.debug('Updating Transaction History'); - self.txHistoryError = false; - self.updatingTxHistory = true; - self.txHistoryPaging = false; - - $timeout(function() { - fc.getTxHistory({ - skip: self.skipHistory, - limit: self.limitHistory + 1 - }, function(err, txs) { - self.updatingTxHistory = false; - if (err) { - $log.debug('TxHistory ERROR:', err); - // We do not should errors here, since history is usually - // fetched AFTER others requests (if skip=0) - if (skip) - self.handleError(err); - - self.txHistoryError = true; - } else { - $log.debug('Wallet Transaction History:', txs); - self.skipHistory = self.skipHistory + self.limitHistory; - self.setTxHistory(txs); - } - $rootScope.$apply(); - }); - }); - }; - - self.debouncedUpdateHistory = lodash.throttle(function() { - self.updateTxHistory(); - }, 5000); - - // This handles errors from BWS/index with are nomally // trigger from async events (like updates) self.handleError = function(err) { @@ -551,7 +509,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r self.txHistoryUnique[tx.txid] = true; c++; } else { - $log.debug('Ignoring duplicate TX in history: '+ tx.txid) + $log.debug('Ignoring duplicate TX in history: ' + tx.txid) } } }); @@ -648,51 +606,141 @@ angular.module('copayApp.controllers').controller('indexController', function($r } }; + // this.csvHistory = function() { + + // function saveFile(name, data) { + // var chooser = document.querySelector(name); + // chooser.addEventListener("change", function(evt) { + // var fs = require('fs'); + // fs.writeFile(this.value, data, function(err) { + // if (err) { + // $log.debug(err); + // } + // }); + // }, false); + // chooser.click(); + // } + + // function formatDate(date) { + // var dateObj = new Date(date); + // if (!dateObj) { + // $log.debug('Error formating a date'); + // return 'DateError' + // } + // if (!dateObj.toJSON()) { + // return ''; + // } + + // return dateObj.toJSON(); + // } + + // function formatString(str) { + // if (!str) return ''; + + // if (str.indexOf('"') !== -1) { + // //replace all + // str = str.replace(new RegExp('"', 'g'), '\''); + // } + + // //escaping commas + // str = '\"' + str + '\"'; + + // return str; + // } + + // var step = 6; + + // function getHistory(skip, cb) { + // skip = skip || 0; + // fc.getTxHistory({ + // skip: skip, + // limit: step, + // }, function(err, txs) { + // if (err) return cb(err); + // if (txs && txs.length > 0) { + // allTxs.push(txs); + // return getHistory(skip + step, cb); + // } else { + // return cb(null, lodash.flatten(allTxs)); + // } + // }); + // }; + + // if (isCordova) { + // $log.info('Not available on mobile'); + // return; + // } + // var isNode = nodeWebkit.isDefined(); + // var fc = profileService.focusedClient; + // if (!fc.isComplete()) return; + // var self = this; + // var allTxs = []; + // $log.debug('Generating CSV from History'); + // self.setOngoingProcess('generatingCSV', true); + // $timeout(function() { + // getHistory(null, function(err, txs) { + // self.setOngoingProcess('generatingCSV', false); + // if (err) { + // self.handleError(err); + // } else { + // $log.debug('Wallet Transaction History:', txs); + + // self.satToUnit = 1 / self.unitToSatoshi; + // var data = txs; + // var satToBtc = 1 / 100000000; + // var filename = 'Copay-' + (self.alias || self.walletName) + '.csv'; + // 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'; + + // var _amount, _note; + // var dataString; + // data.forEach(function(it, index) { + // var amount = it.amount; + + // if (it.action == 'moved') + // amount = 0; + + // _amount = (it.action == 'sent' ? '-' : '') + (amount * satToBtc).toFixed(8); + // _note = formatString((it.message ? it.message : '') + ' TxId: ' + it.txid + ' Fee:' + (it.fees * satToBtc).toFixed(8)); + + // if (it.action == 'moved') + // _note += ' Moved:' + (it.amount * satToBtc).toFixed(8) + + // dataString = formatDate(it.time * 1000) + ',' + formatString(it.addressTo) + ',' + _note + ',' + _amount + ',BTC,,,,'; + // 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"; + // } + // }); + + // if (isNode) { + // saveFile('#export_file', csvContent); + // } else { + // var encodedUri = encodeURI(csvContent); + // var link = document.createElement("a"); + // link.setAttribute("href", encodedUri); + // link.setAttribute("download", filename); + // link.click(); + // } + // } + // $rootScope.$apply(); + // }); + // }); + // }; + this.csvHistory = function() { + if (isCordova) return $log.info('Not available on mobile'); - function saveFile(name, data) { - var chooser = document.querySelector(name); - chooser.addEventListener("change", function(evt) { - var fs = require('fs'); - fs.writeFile(this.value, data, function(err) { - if (err) { - $log.debug(err); - } - }); - }, false); - chooser.click(); - } - - function formatDate(date) { - var dateObj = new Date(date); - if (!dateObj) { - $log.debug('Error formating a date'); - return 'DateError' - } - if (!dateObj.toJSON()) { - return ''; - } - - return dateObj.toJSON(); - } - - function formatString(str) { - if (!str) return ''; - - if (str.indexOf('"') !== -1) { - //replace all - str = str.replace(new RegExp('"', 'g'), '\''); - } - - //escaping commas - str = '\"' + str + '\"'; - - return str; - } + var fc = profileService.focusedClient; + if (!fc.isComplete()) return; var step = 6; var unique = {}; + function getHistory(skip, cb) { skip = skip || 0; fc.getTxHistory({ @@ -700,88 +748,217 @@ angular.module('copayApp.controllers').controller('indexController', function($r limit: step, }, function(err, txs) { if (err) return cb(err); + if (txs && txs.length > 0) { lodash.each(txs, function(tx) { - if (!unique[tx.txid]){ + if (!unique[tx.txid]) { allTxs.push(tx); unique[tx.txid] = 1; console.log("Got:" + lodash.keys(unique).length + " txs"); } else { - console.log("Ignoring duplicate TX in CSV: "+ tx.txid); + console.log("Ignoring duplicate TX in CSV: " + tx.txid); } }); return getHistory(skip + step, cb); - } else { + } else return cb(null, lodash.flatten(allTxs)); - } }); }; - if (isCordova) { - $log.info('Not available on mobile'); - return; - } - var isNode = nodeWebkit.isDefined(); - var fc = profileService.focusedClient; - if (!fc.isComplete()) return; var self = this; var allTxs = []; - $log.debug('Generating CSV from History'); - self.setOngoingProcess('generatingCSV', true); + $log.debug('Fetching transactions from History'); + self.setOngoingProcess('generatingCSV', true); // cambiar esto + $timeout(function() { getHistory(null, function(err, txs) { - self.setOngoingProcess('generatingCSV', false); - if (err) { + self.setOngoingProcess('generatingCSV', false); // cambiar esto + + if (err) self.handleError(err); - } else { + else $log.debug('Wallet Transaction History:', txs); - self.satToUnit = 1 / self.unitToSatoshi; - var data = txs; - var satToBtc = 1 / 100000000; - var filename = 'Copay-' + (self.alias || self.walletName) + '.csv'; - 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'; - - var _amount, _note; - var dataString; - data.forEach(function(it, index) { - var amount = it.amount; - - if (it.action == 'moved') - amount = 0; - - _amount = (it.action == 'sent' ? '-' : '') + (amount * satToBtc).toFixed(8); - _note = formatString((it.message ? it.message : '') + ' TxId: ' + it.txid + ' Fee:' + (it.fees * satToBtc).toFixed(8)); - - if (it.action == 'moved') - _note += ' Moved:' + (it.amount * satToBtc).toFixed(8) - - dataString = formatDate(it.time * 1000) + ',' + formatString(it.addressTo) + ',' + _note + ',' + _amount + ',BTC,,,,'; - 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"; - } - }); - - if (isNode) { - saveFile('#export_file', csvContent); - } else { - var encodedUri = encodeURI(csvContent); - var link = document.createElement("a"); - link.setAttribute("href", encodedUri); - link.setAttribute("download", filename); - link.click(); - } - } - $rootScope.$apply(); + // verificar wallets sin transacciones (pendiente) + storageService.setTxHistory(JSON.stringify(txs), fc.credentials.walletId, function() { + return; + }); }); }); }; + self.getLocalHistory = function(walletId, cb) { + storageService.getTxHistory(walletId, function(err, txH) { + if (err) return cb(err); + if (!txH) return cb($log.debug('There is not transactions stored')); + + var txHistory; + try { + txHistory = JSON.parse(txH); + } catch (ex) { + return cb(ex); + } + + // console.log('From getLocalHistory: ', txHistory); + // lodash.each(txHistory, function(tx) { + // console.log(tx); + // }); + + return cb(null, txHistory); + }); + } + + // self.updateTxHistory = function(skip) { + // var fc = profileService.focusedClient; + // if (!fc || !fc.isComplete()) return; + // if (!skip) { + // self.txHistory = []; + // } + // self.skipHistory = skip || 0; + // $log.debug('Updating Transaction History'); + // self.txHistoryError = false; + // self.updatingTxHistory = true; + // self.txHistoryPaging = false; + + // $timeout(function() { + // fc.getTxHistory({ + // skip: self.skipHistory, + // limit: self.limitHistory + 1 + // }, function(err, txs) { + // self.updatingTxHistory = false; + // if (err) { + // $log.debug('TxHistory ERROR:', err); + // // We do not should errors here, since history is usually + // // fetched AFTER others requests (if skip=0) + // if (skip) + // self.handleError(err); + + // self.txHistoryError = true; + // } else { + // $log.debug('Wallet Transaction History:', txs); + // self.skipHistory = self.skipHistory + self.limitHistory; + // self.setTxHistory(txs); + // } + // $rootScope.$apply(); + // }); + // }); + // }; + + // self.debouncedUpdateHistory = lodash.throttle(function() { + // self.updateTxHistory(); + // }, 5000); + + self.updateTxHistory = function(skip) { + var fc = profileService.focusedClient; + if (!fc || !fc.isComplete()) return; + if (!skip) self.txHistory = []; + + $log.debug('Updating Transaction History'); + self.skipHistory = skip || 0; + self.txHistoryError = false; + self.updatingTxHistory = true; + self.txHistoryPaging = false; + + $timeout(function() { + storageService.getTxHistoryFlag(fc.credentials.walletId, function(err, historyFlag) { + if (err) { + $log.debug('TxHistory ERROR:', err); + if (skip) self.handleError(err); + self.txHistoryError = true; + return; + } + + if (historyFlag) { + // history from local storage + self.getLocalHistory(fc.credentials.walletId, function(err, txsFromLocal) { + self.updatingTxHistory = false; + if (err) { + $log.debug('TxHistory ERROR:', err); + if (skip) self.handleError(err); + self.txHistoryError = true; + return; + } + + self.setTxHistory(txsFromLocal); + console.log('Loaded from local.'); + $log.debug('Wallet Transaction History:', txsFromLocal); + storageService.setTxHistoryFlag(true, fc.credentials.walletId, function() { + return; + }); + }); + } else { + // history from BWC + fc.getTxHistory({ + skip: self.skipHistory, + limit: self.limitHistory + 1 + }, function(err, txsFromBWC) { + self.updatingTxHistory = false; + if (err) { + $log.debug('TxHistory ERROR:', err); + + if (skip) self.handleError(err); + self.txHistoryError = true; + return; + } else { + if (!txsFromBWC[0]) + return $log.debug('There is not transactions stored'); + + self.setTxHistory(txsFromBWC); + $log.debug('Wallet Transaction History:', txsFromBWC); + storageService.setTxHistory(JSON.stringify(txsFromBWC), fc.credentials.walletId, function() { + storageService.setTxHistoryFlag(true, fc.credentials.walletId, function() { + return; + }); + }); + console.log('Loaded from BWC.'); + // // Check if the last tx on server is equal to the last tx in local storage + // // console.log('Last tx from BWC: ', txsFromBWC[0]); + // self.getLocalHistory(function(err, txsFromLocal) { + // // console.log('Last tx from LocalStorage: ', txsFromLocal[0]); + // if (err) { + // $log.debug('TxHistory ERROR:', err); + // if (skip) self.handleError(err); + // self.txHistoryError = true; + // } + + // if (self.areEqualsTxs(txsFromBWC[0], txsFromLocal[0])) { + // self.setTxHistory(txsFromLocal); + // $log.debug('Wallet Transaction History:', txsFromLocal); + // storageService.setTxHistoryFlag(true, function() { + // return; + // }); + // } else { + // self.setTxHistory(txsFromBWC); + // $log.debug('Wallet Transaction History:', txsFromBWC); + // storageService.setTxHistory(JSON.stringify(txsFromBWC), function() { + // return; + // }); + // storageService.setTxHistoryFlag(false, function() { + // return; + // }); + // } + // }); + } + }); + } + }); + self.skipHistory = self.skipHistory + self.limitHistory; + self.updatingTxHistory = false; + $rootScope.$apply(); + }); + }; + + self.debouncedUpdateHistory = lodash.throttle(function() { + self.updateTxHistory(); + }, 5000); + + self.areEqualsTxs = function(firstTx, secondTx) { + if (firstTx.txid == secondTx.txid) // enough to determinate it? + return true; + else + return false; + } + self.showErrorPopup = function(msg, cb) { $log.warn('Showing err popup:' + msg); self.showAlert = { diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index b19db8779..13de88221 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -216,5 +216,20 @@ angular.module('copayApp.services') storage.remove('addressbook-' + network, cb); }; + root.setTxHistory = function(txs, walletId, cb) { + storage.set('txsHistory-' + walletId, txs, cb); + } + + root.getTxHistory = function(walletId, cb) { + storage.get('txsHistory-' + walletId, cb); + } + + root.setTxHistoryFlag = function(value, walletId, cb) { + storage.set('txsHistoryFlag-' + walletId, value, cb); + } + + root.getTxHistoryFlag = function(walletId, cb) { + storage.get('txsHistoryFlag-' + walletId, cb); + } return root; });