From bb2868f1ec4eefe1e5d91ce9c38a8c72062d94e9 Mon Sep 17 00:00:00 2001 From: lilia Date: Mon, 11 Apr 2016 11:24:18 -0700 Subject: [PATCH] Debounce updates to notifications and other events Wait for one second of silence before displaying new notifications, updating the unread count and conversation list previews. Fixes #470 --- js/conversation_controller.js | 7 +++++-- js/notifications.js | 10 +++++----- js/views/conversation_list_item_view.js | 3 ++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/js/conversation_controller.js b/js/conversation_controller.js index 5ca8354f..47b35add 100644 --- a/js/conversation_controller.js +++ b/js/conversation_controller.js @@ -13,9 +13,12 @@ var inboxCollection = new (Backbone.Collection.extend({ initialize: function() { this.on('change:timestamp change:name change:number', this.sort); - this.on('add remove change:unreadCount', this.updateUnreadCount); this.listenTo(conversations, 'add change:active_at', this.addActive); + + this.on('add remove change:unreadCount', + _.debounce(this.updateUnreadCount.bind(this), 1000) + ); }, comparator: function(m1, m2) { var timestamp1 = m1.get('timestamp'); @@ -48,7 +51,7 @@ this.remove(model); } }, - updateUnreadCount: function(model, count) { + updateUnreadCount: function() { var newUnreadCount = _.reduce( this.map(function(m) { return m.get('unreadCount'); }), function(item, memo) { diff --git a/js/notifications.js b/js/notifications.js index b62110c7..92d375c7 100644 --- a/js/notifications.js +++ b/js/notifications.js @@ -14,7 +14,7 @@ Whisper.Notifications = new (Backbone.Collection.extend({ initialize: function() { - this.on('add', this.onAdd); + this.on('add', _.debounce(this.update.bind(this), 1000)); this.on('remove', this.onRemove); }, onclick: function() { @@ -30,6 +30,10 @@ this.clear(); }, update: function() { + extension.notification.clear(); + if (this.length === 0) { + return; + } var setting = storage.get('notification-setting') || 'message'; if (setting === SETTINGS.OFF) { return; @@ -116,10 +120,6 @@ var setting = this.getSetting(); return (setting === SETTINGS.MESSAGE || setting === SETTINGS.NAME); }, - onAdd: function() { - extension.notification.clear(); - this.update(); - }, onRemove: function() { if (this.length === 0) { extension.notification.clear(); diff --git a/js/views/conversation_list_item_view.js b/js/views/conversation_list_item_view.js index 5664e428..be1fb4d1 100644 --- a/js/views/conversation_list_item_view.js +++ b/js/views/conversation_list_item_view.js @@ -16,7 +16,8 @@ 'click': 'select' }, initialize: function() { - this.listenTo(this.model, 'change', this.render); // auto update + // auto update + this.listenTo(this.model, 'change', _.debounce(this.render.bind(this), 1000)); this.listenTo(this.model, 'destroy', this.remove); // auto update this.listenTo(this.model, 'opened', this.markSelected); // auto update extension.windows.onClosed(this.stopListening.bind(this));