Move ConversationController to its own file

Encapsulate the global conversation cache collection against accidental
access, avoiding the data-clobbering bug fixed in previous commit.

Also move some one-off program initialization code from panel controller
to background.js

// FREEBIE
This commit is contained in:
lilia 2015-09-16 23:13:17 -07:00
parent 8f28c3af68
commit 0017f196ef
4 changed files with 90 additions and 77 deletions

View file

@ -281,6 +281,7 @@
<script type="text/javascript" src="js/chromium.js"></script>
<script type="text/javascript" src="js/bimap.js"></script>
<script type="text/javascript" src="js/conversation_controller.js"></script>
<script type="text/javascript" src="js/panel_controller.js"></script>
<script type="text/javascript" src="js/views/whisper_view.js"></script>

View file

@ -18,6 +18,18 @@
textsecure.protocol_wrapper.startWorker();
ConversationController.updateInbox();
extension.onLaunched(function() {
storage.onready(function() {
if (textsecure.registration.isDone()) {
openInbox();
} else {
extension.install();
}
});
});
storage.fetch();
storage.onready(function() {
var messageReceiver;
@ -27,6 +39,8 @@
}
extension.on('registration_done', init);
setUnreadCount(storage.get("unreadCount", 0));
window.getSocketStatus = function() {
if (messageReceiver) {
return messageReceiver.getStatus();

View file

@ -0,0 +1,73 @@
/*global $, Whisper, Backbone, textsecure, extension*/
/*
* vim: ts=4:sw=4:expandtab
*/
// This script should only be included in background.html
(function () {
'use strict';
window.Whisper = window.Whisper || {};
var conversations = new Whisper.ConversationCollection();
var inboxCollection = new (Backbone.Collection.extend({
initialize: function() {
this.on('change:active_at', this.sort);
this.on('change:unreadCount', this.updateUnreadCount);
this.listenTo(conversations, 'add change:active_at', this.addActive);
},
comparator: function(model) {
return -model.get('active_at');
},
addActive: function(model) {
if (model.get('active_at')) {
this.add(model);
} else {
this.remove(model);
}
},
updateUnreadCount: 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);
}
}
}))();
window.getInboxCollection = function() {
return inboxCollection;
};
window.ConversationController = {
get: function(id) {
return conversations.get(id);
},
create: function(attrs) {
var conversation = conversations.add(attrs);
return conversation;
},
findOrCreatePrivateById: function(id) {
var conversation = conversations.add({ id: id, type: 'private' });
return new Promise(function(resolve, reject) {
conversation.fetch().then(function() {
resolve(conversation);
}).fail(function() {
var saved = conversation.save(); // false or indexedDBRequest
if (saved) {
saved.then(function() {
resolve(conversation);
}).fail(reject);
} else {
reject();
}
});
});
},
updateInbox: function() {
conversations.fetchActive();
}
};
})();

View file

@ -9,78 +9,13 @@
window.Whisper = window.Whisper || {};
var conversations = new Whisper.ConversationCollection();
var inboxCollection = new (Backbone.Collection.extend({
initialize: function() {
this.on('change:active_at', this.sort);
this.on('change:unreadCount', this.updateUnreadCount);
this.listenTo(conversations, 'add change:active_at', this.addActive);
},
comparator: function(model) {
return -model.get('active_at');
},
addActive: function(model) {
if (model.get('active_at')) {
this.add(model);
} else {
this.remove(model);
}
},
updateUnreadCount: 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);
}
}
}))();
window.getInboxCollection = function() {
return inboxCollection;
};
window.ConversationController = {
get: function(id) {
return conversations.get(id);
},
create: function(attrs) {
var conversation = conversations.add(attrs);
return conversation;
},
findOrCreatePrivateById: function(id) {
var conversation = conversations.add({ id: id, type: 'private' });
return new Promise(function(resolve, reject) {
conversation.fetch().then(function() {
resolve(conversation);
}).fail(function() {
var saved = conversation.save(); // false or indexedDBRequest
if (saved) {
saved.then(function() {
resolve(conversation);
}).fail(reject);
} else {
reject();
}
});
});
},
updateInbox: function() {
conversations.fetchActive();
}
};
ConversationController.updateInbox();
setUnreadCount(storage.get("unreadCount", 0));
function setUnreadCount(count) {
window.setUnreadCount = function(count) {
if (count > 0) {
extension.navigator.setBadgeText(count);
} else {
extension.navigator.setBadgeText("");
}
}
};
window.notifyConversation = function(message) {
var conversationId = message.get('conversationId');
@ -176,14 +111,4 @@
open = null;
return o;
};
extension.onLaunched(function() {
storage.onready(function() {
if (textsecure.registration.isDone()) {
openInbox();
} else {
extension.install();
}
});
});
})();