1cf9289b1a
FREEBIE
115 lines
3.7 KiB
JavaScript
115 lines
3.7 KiB
JavaScript
/*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:timestamp change:name change:number', this.sort);
|
|
|
|
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');
|
|
var timestamp2 = m2.get('timestamp');
|
|
if (timestamp1 && timestamp2) {
|
|
return timestamp2 - timestamp1;
|
|
}
|
|
if (timestamp1) {
|
|
return -1;
|
|
}
|
|
if (timestamp2) {
|
|
return 1;
|
|
}
|
|
var title1 = m1.getTitle().toLowerCase();
|
|
var title2 = m2.getTitle().toLowerCase();
|
|
if (title1 === title2) {
|
|
return 0;
|
|
}
|
|
if (title1 < title2) {
|
|
return -1;
|
|
}
|
|
if (title1 > title2) {
|
|
return 1;
|
|
}
|
|
},
|
|
addActive: function(model) {
|
|
if (model.get('active_at')) {
|
|
this.add(model);
|
|
} else {
|
|
this.remove(model);
|
|
}
|
|
},
|
|
updateUnreadCount: function() {
|
|
var newUnreadCount = _.reduce(
|
|
this.map(function(m) { return m.get('unreadCount'); }),
|
|
function(item, memo) {
|
|
return item + memo;
|
|
},
|
|
0
|
|
);
|
|
storage.put("unreadCount", newUnreadCount);
|
|
|
|
setUnreadCount(newUnreadCount);
|
|
if (newUnreadCount === 0) {
|
|
window.clearAttention();
|
|
}
|
|
}
|
|
}))();
|
|
|
|
window.getInboxCollection = function() {
|
|
return inboxCollection;
|
|
};
|
|
|
|
window.ConversationController = {
|
|
get: function(id) {
|
|
return conversations.get(id);
|
|
},
|
|
add: function(attrs) {
|
|
return conversations.add(attrs, {merge: true});
|
|
},
|
|
create: function(attrs) {
|
|
if (typeof attrs !== 'object') {
|
|
throw new Error('ConversationController.create requires an object, got', attrs);
|
|
}
|
|
var conversation = conversations.add(attrs, {merge: true});
|
|
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();
|
|
}
|
|
});
|
|
});
|
|
},
|
|
getAllGroupsInvolvingId: function(id) {
|
|
return conversations.filter(function(conversation) {
|
|
return !conversation.isPrivate() && conversation.hasMember(id);
|
|
});
|
|
},
|
|
updateInbox: function() {
|
|
return conversations.fetchActive();
|
|
}
|
|
};
|
|
})();
|