You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			116 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			116 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();
 | |
|         }
 | |
|     };
 | |
| })();
 |