From 405e67c758cf0e0f04b9e7a1c528f96ea4a56d10 Mon Sep 17 00:00:00 2001 From: lilia Date: Tue, 26 May 2015 13:28:43 -0700 Subject: [PATCH] Merge inbox and panel controllers These collections should always be operating with the same model instances, so let the inbox reset it self from the same in-memory cache of conversation models used by the conversation windows. --- background.html | 1 - js/inbox_controller.js | 64 -------------------------------------- js/models/conversations.js | 14 +++++++++ js/panel_controller.js | 36 +++++++++++++++++++++ 4 files changed, 50 insertions(+), 65 deletions(-) delete mode 100644 js/inbox_controller.js diff --git a/background.html b/background.html index 88f5449297f..0c7e0d53c08 100644 --- a/background.html +++ b/background.html @@ -266,7 +266,6 @@ - diff --git a/js/inbox_controller.js b/js/inbox_controller.js deleted file mode 100644 index 58fbc9ace3f..00000000000 --- a/js/inbox_controller.js +++ /dev/null @@ -1,64 +0,0 @@ -/* vim: ts=4:sw=4:expandtab - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -;(function() { - 'use strict'; - - /* - * Provides a persistent collection of conversations for - * the inbox view. Automatically updates when messages are received. - * - */ - - window.inbox = new Whisper.ConversationCollection([], { - comparator: function(model) { - return -model.get('active_at'); - } - }); - - inbox.on('change:active_at', inbox.sort); - inbox.on('change:unreadCount', function(model, count) { - var prev = model.previous('unreadCount') || 0; - if (count < prev) { // decreased - var newUnreadCount = storage.get("unreadCount", 0) - (prev - count); - setUnreadCount(newUnreadCount); - storage.put("unreadCount", newUnreadCount); - } - }); - - function fetch() { - window.inbox.fetch({ - index: { - name: 'inbox', // 'inbox' index on active_at - order: 'desc' // ORDER timestamp DESC - } - // TODO pagination/infinite scroll - // limit: 10, offset: page*10, - }); - } - - extension.on('updateInbox', fetch); - fetch(); - setUnreadCount(storage.get("unreadCount", 0)); - - function setUnreadCount(count) { - if (count > 0) { - extension.navigator.setBadgeText(count); - } else { - extension.navigator.setBadgeText(""); - } - } -})(); diff --git a/js/models/conversations.js b/js/models/conversations.js index 18090e3f9c9..315043e6cbd 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -277,6 +277,20 @@ only: number } }); + }, + + fetchActive: function() { + // Ensures all active conversations are included in this collection, + // and updates their attributes, but removes nothing. + return this.fetch({ + index: { + name: 'inbox', // 'inbox' index on active_at + order: 'desc' // ORDER timestamp DESC + // TODO pagination/infinite scroll + // limit: 10, offset: page*10, + }, + remove: false + }); } }); })(); diff --git a/js/panel_controller.js b/js/panel_controller.js index 657f9c22711..7cfa324a43a 100644 --- a/js/panel_controller.js +++ b/js/panel_controller.js @@ -25,6 +25,42 @@ var windowMap = new Whisper.Bimap('windowId', 'modelId'); var conversations = new Whisper.ConversationCollection(); + window.inbox = new Whisper.ConversationCollection([], { + comparator: function(model) { + return -model.get('active_at'); + } + }); + + inbox.on('change:active_at', inbox.sort); + inbox.on('change:unreadCount', function(model, count) { + var prev = model.previous('unreadCount') || 0; + if (count < prev) { // decreased + var newUnreadCount = storage.get("unreadCount", 0) - (prev - count); + setUnreadCount(newUnreadCount); + storage.put("unreadCount", newUnreadCount); + } + }); + + function updateInbox() { + conversations.fetchActive().then(function() { + inbox.reset(conversations.filter(function(model) { + return model.get('active_at'); + })); + }); + } + + extension.on('updateInbox', updateInbox); + updateInbox(); + setUnreadCount(storage.get("unreadCount", 0)); + + function setUnreadCount(count) { + if (count > 0) { + extension.navigator.setBadgeText(count); + } else { + extension.navigator.setBadgeText(""); + } + } + window.getConversationForWindow = function(windowId) { return conversations.get(windowMap.modelIdFrom(windowId)); };