diff --git a/public/views/activity.html b/public/views/activity.html index c562dfdf5..8a1738373 100644 --- a/public/views/activity.html +++ b/public/views/activity.html @@ -23,10 +23,6 @@ - - More ({{notificationsMore}}) - -
No recent activity
diff --git a/public/views/includes/txp.html b/public/views/includes/txp.html new file mode 100644 index 000000000..0749fd310 --- /dev/null +++ b/public/views/includes/txp.html @@ -0,0 +1,23 @@ + + + + {{addressbook[tx.toAddress]}} + + + {{tx.message}} + + + Sending + + + + {{tx.merchant.domain}} + {{tx.merchant.domain}} + + + - {{tx.amountStr}} + +
+ {{tx.wallet.name}} · +
+ diff --git a/public/views/includes/walletActivity.html b/public/views/includes/walletActivity.html index 9ff11beb7..c57caae8b 100644 --- a/public/views/includes/walletActivity.html +++ b/public/views/includes/walletActivity.html @@ -1,5 +1,4 @@ -
Copayer joined
@@ -25,36 +24,32 @@
- Proposal Deleted: - {{x.message}} + {{x.message}}
{{x.amountStr}}:
-
- +
Proposal Rejected: - {{x.message}} + {{x.message}}
{{x.amountStr}}:
- New Proposal: - {{x.message}} + {{x.message}}
{{x.amountStr}}
- - Proposal Accepted - {{x.message}} + Proposal Accepted: + {{x.message}}
{{x.amountStr}}
diff --git a/public/views/proposals.html b/public/views/proposals.html new file mode 100644 index 000000000..515d8e050 --- /dev/null +++ b/public/views/proposals.html @@ -0,0 +1,23 @@ + + + + Pending Proposals + + + + + + +
+ + + + +
+ No pending proposals +
+
+
+
diff --git a/public/views/tab-home.html b/public/views/tab-home.html index 57008200b..e22dcf09a 100644 --- a/public/views/tab-home.html +++ b/public/views/tab-home.html @@ -5,7 +5,21 @@ -
+ + + +
Recent Activity diff --git a/public/views/walletDetails.html b/public/views/walletDetails.html index 7efc8a472..be3dfcbcd 100644 --- a/public/views/walletDetails.html +++ b/public/views/walletDetails.html @@ -104,34 +104,11 @@

Unsent transactions

    -
  • - - - - {{addressbook[tx.toAddress]}} - - - {{tx.message}} - - - Sending - - - - {{tx.merchant.domain}} - {{tx.merchant.domain}} - - - - {{tx.amountStr}} - -
    - {{tx.wallet.name}} · -
    +
  • +
-
Total Locked Balance: {{lockedBalanceStr}} diff --git a/src/js/controllers/proposals.js b/src/js/controllers/proposals.js new file mode 100644 index 000000000..3747cd706 --- /dev/null +++ b/src/js/controllers/proposals.js @@ -0,0 +1,23 @@ + +'use strict'; + +angular.module('copayApp.controllers').controller('proposalsController', + function($timeout, $scope, profileService, $log, txpModalService) { + var self = this; + + + $scope.init = function() { + profileService.getTxps(50, function(err, txps) { + if (err) { + console.log('[tab-home.js.35:err:]', $log.error(err)); //TODO + return; + } + $scope.txps = txps; + $timeout(function() { + $scope.$apply(); + }, 1); + }); + } + + $scope.openTxpModal = txpModalService.open; + }); diff --git a/src/js/controllers/tab-home.js b/src/js/controllers/tab-home.js index e88b3ac95..20d85c7d6 100644 --- a/src/js/controllers/tab-home.js +++ b/src/js/controllers/tab-home.js @@ -1,18 +1,23 @@ 'use strict'; angular.module('copayApp.controllers').controller('tabHomeController', - function($rootScope, $timeout, $scope, $state, $ionicScrollDelegate, lodash, profileService, walletService, configService, txFormatService, $ionicModal, $log, platformInfo, storageService) { + function($rootScope, $timeout, $scope, $state, $ionicScrollDelegate, lodash, profileService, walletService, configService, txFormatService, $ionicModal, $log, platformInfo, storageService, txpModalService) { $scope.externalServices = {}; $scope.bitpayCardEnabled = true; // TODO - var setNotifications = function(notifications) { - $scope.notifications = notifications; - $timeout(function() { - $scope.$apply(); - }, 1); + + + var setPendingTxps = function(txps) { + if (!txps) { + $scope.txps = []; + return; + } + $scope.txps = lodash.sortBy(txps, 'createdOn').reverse(); }; + + $scope.updateAllWallets = function() { $scope.wallets = profileService.getWallets(); if (lodash.isEmpty($scope.wallets)) return; @@ -26,9 +31,25 @@ angular.module('copayApp.controllers').controller('tabHomeController', walletService.getStatus(wallet, {}, function(err, status) { if (err) { console.log('[tab-home.js.35:err:]', $log.error(err)); //TODO - return; + } else { + wallet.status = status; + } + if (++j==i) { + profileService.getTxps({ + limit: 3 + }, function(err, txps, n) { + if (err) { + console.log('[tab-home.js.35:err:]', $log.error(err)); //TODO + } + $scope.txps = txps; + $scope.txpsN = n; + $ionicScrollDelegate.resize(); + + $timeout(function() { + $scope.$apply(); + }, 1); + }); } - wallet.status = status; }); }); @@ -41,8 +62,13 @@ angular.module('copayApp.controllers').controller('tabHomeController', return; } $scope.fetchingNotifications = false; - setNotifications(n); + $scope.notifications = n; $ionicScrollDelegate.resize(); + + $timeout(function() { + $scope.$apply(); + }, 1); + }) }; @@ -57,13 +83,27 @@ angular.module('copayApp.controllers').controller('tabHomeController', profileService.getNotifications({ limit: 3 - }, function(err, n) { + }, function(err, notifications) { if (err) { console.log('[tab-home.js.35:err:]', $log.error(err)); //TODO return; } - setNotifications(n); - $ionicScrollDelegate.resize(); + $scope.notifications = notifications; + + profileService.getTxps({ + limit: 3 + }, function(err, txps, n) { + if (err) { + console.log('[tab-home.js.35:err:]', $log.error(err)); //TODO + } + $scope.txps = txps; + $scope.txpsN = n; + $ionicScrollDelegate.resize(); + + $timeout(function() { + $scope.$apply(); + }, 1); + }) }) }); }; @@ -101,4 +141,7 @@ angular.module('copayApp.controllers').controller('tabHomeController', $scope.coinbaseEnabled = config.coinbase.enabled && !isWindowsPhoneApp; }); + $scope.openTxpModal = txpModalService.open; + + }); diff --git a/src/js/controllers/walletDetails.js b/src/js/controllers/walletDetails.js index 9994be0dd..7d1748b7c 100644 --- a/src/js/controllers/walletDetails.js +++ b/src/js/controllers/walletDetails.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('walletDetailsController', function($scope, $rootScope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $ionicNavBarDelegate, $state, $stateParams, bwcError, profileService, lodash, configService, gettext, gettextCatalog, platformInfo, walletService, $ionicPopup) { +angular.module('copayApp.controllers').controller('walletDetailsController', function($scope, $rootScope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $ionicNavBarDelegate, $state, $stateParams, bwcError, profileService, lodash, configService, gettext, gettextCatalog, platformInfo, walletService, $ionicPopup, txpModalService) { var isCordova = platformInfo.isCordova; var isWP = platformInfo.isWP; @@ -47,26 +47,7 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun }; - var glideraActive = true; // TODO TODO TODO - // isGlidera flag is a security measure so glidera status is not - // only determined by the tx.message - $scope.openTxpModal = function(tx) { - var config = configService.getSync().wallet; - var scope = $rootScope.$new(true); - scope.tx = tx; - scope.wallet = tx.wallet; - scope.copayers = tx.wallet.copayers; - scope.isGlidera = glideraActive; - scope.currentSpendUnconfirmed = config.spendUnconfirmed; - - $ionicModal.fromTemplateUrl('views/modals/txp-details.html', { - scope: scope - }).then(function(modal) { - scope.txpDetailsModal = modal; - scope.txpDetailsModal.show(); - }); - }; - + $scope.openTxpModal = txpModalService.open; var listeners = [ $rootScope.$on('bwsEvent', function(e, walletId) { diff --git a/src/js/routes.js b/src/js/routes.js index e70269936..40dde5682 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -147,7 +147,10 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr url: '/activity', templateUrl: 'views/activity.html' }) - + .state('proposals', { + url: '/proposals', + templateUrl: 'views/proposals.html' + }) /* * diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index 2c240035b..8fb2df403 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -123,6 +123,12 @@ angular.module('copayApp.services') if (wallet.cachedActivity) wallet.cachedActivity.isValid = false; + + if (wallet.cachedTxps) + wallet.cachedTxps.isValid = false; + + + $rootScope.$emit('bwsEvent', wallet.id, n.type, n); }); @@ -780,7 +786,7 @@ angular.module('copayApp.services') }; - function getNotifications(wallet, cb2) { + function updateNotifications(wallet, cb2) { if (isActivityCached(wallet) && !opts.force) return cb2(); wallet.getNotifications({ @@ -858,7 +864,7 @@ angular.module('copayApp.services') }; lodash.each(w, function(wallet) { - getNotifications(wallet, function(err) { + updateNotifications(wallet, function(err) { j++; if (err) { $log.warn('Error updating notifications:' + err); @@ -892,5 +898,33 @@ angular.module('copayApp.services') }); }; + + root.getTxps = function(opts, cb) { + var MAX = 100; + opts = opts || {}; + + var w = root.getWallets(); + if (lodash.isEmpty(w)) return cb(); + + var txps = []; + + function process(notifications) { + if (!notifications) return []; + + var shown = lodash.sortBy(notifications, 'createdOn').reverse(); + shown = shown.splice(0, opts.limit || MAX); + return shown; + }; + + lodash.each(w, function(x) { + if (x.pendingTxps) + txps = txps.concat(x.pendingTxps); + }); + txps = lodash.sortBy(txps, 'createdOn'); + txps = lodash.compact(lodash.flatten(txps)).slice(0,MAX); + var n = txps.length; + return cb(null, process(txps), n); + }; + return root; }); diff --git a/src/js/services/txpModalService.js b/src/js/services/txpModalService.js new file mode 100644 index 000000000..a0cfce6e2 --- /dev/null +++ b/src/js/services/txpModalService.js @@ -0,0 +1,31 @@ +'use strict'; + +angular.module('copayApp.services').factory('txpModalService', function(configService, $rootScope, $ionicModal) { + + var root = {}; + + + var glideraActive = true; // TODO TODO TODO + // isGlidera flag is a security measure so glidera status is not + // only determined by the tx.message + + + root.open = function(tx) { + var config = configService.getSync().wallet; + var scope = $rootScope.$new(true); + scope.tx = tx; + scope.wallet = tx.wallet; + scope.copayers = tx.wallet.copayers; + scope.isGlidera = glideraActive; + scope.currentSpendUnconfirmed = config.spendUnconfirmed; + + $ionicModal.fromTemplateUrl('views/modals/txp-details.html', { + scope: scope + }).then(function(modal) { + scope.txpDetailsModal = modal; + scope.txpDetailsModal.show(); + }); + }; + + return root; +});