Track and sync unread messages
// FREEBIE
This commit is contained in:
parent
1be45f3775
commit
1f897f32b7
4 changed files with 78 additions and 7 deletions
|
@ -175,7 +175,8 @@
|
||||||
sent_at : timestamp,
|
sent_at : timestamp,
|
||||||
received_at : now,
|
received_at : now,
|
||||||
conversationId : source,
|
conversationId : source,
|
||||||
type : 'incoming'
|
type : 'incoming',
|
||||||
|
unread : true
|
||||||
});
|
});
|
||||||
|
|
||||||
return message;
|
return message;
|
||||||
|
@ -232,7 +233,29 @@
|
||||||
function onReadReceipt(ev) {
|
function onReadReceipt(ev) {
|
||||||
var timestamp = ev.timestamp.toNumber();
|
var timestamp = ev.timestamp.toNumber();
|
||||||
var sender = ev.sender;
|
var sender = ev.sender;
|
||||||
|
var messages = new Whisper.MessageCollection();
|
||||||
|
var groups = new Whisper.ConversationCollection();
|
||||||
console.log('read receipt ', sender, timestamp);
|
console.log('read receipt ', sender, timestamp);
|
||||||
|
groups.fetchGroups(sender).then(function() {
|
||||||
|
messages.fetchSentAt(timestamp).then(function() {
|
||||||
|
var ids = groups.pluck('id');
|
||||||
|
ids.push(sender);
|
||||||
|
var message = messages.find(function(message) {
|
||||||
|
return (message.get('type') === 'incoming' &&
|
||||||
|
_.contains(ids, message.get('conversationId')));
|
||||||
|
});
|
||||||
|
if (message) {
|
||||||
|
message.markRead().then(function() {
|
||||||
|
var conversation = ConversationController.get({
|
||||||
|
id: message.get('conversationId')
|
||||||
|
});
|
||||||
|
|
||||||
|
// notify frontend listeners
|
||||||
|
conversation.trigger('read', message);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// lazy hack
|
// lazy hack
|
||||||
|
|
|
@ -134,6 +134,16 @@
|
||||||
transaction.db.createObjectStore("debug");
|
transaction.db.createObjectStore("debug");
|
||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
version: "8.0",
|
||||||
|
migrate: function(transaction, next) {
|
||||||
|
console.log('migration 8.0');
|
||||||
|
console.log('creating unread message index');
|
||||||
|
var conversations = transaction.objectStore('messages');
|
||||||
|
conversations.createIndex('unread', ['conversationId', 'unread'], { unique: false });
|
||||||
|
next();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
}());
|
}());
|
||||||
|
|
|
@ -44,6 +44,31 @@
|
||||||
|
|
||||||
this.on('change:avatar', this.updateAvatarUrl);
|
this.on('change:avatar', this.updateAvatarUrl);
|
||||||
this.on('destroy', this.revokeAvatarUrl);
|
this.on('destroy', this.revokeAvatarUrl);
|
||||||
|
this.on('read', this.countUnread);
|
||||||
|
},
|
||||||
|
|
||||||
|
countUnread: function() {
|
||||||
|
return this.getUnread().then(function(unreadMessages) {
|
||||||
|
this.save({unreadCount: unreadMessages.length});
|
||||||
|
}.bind(this));
|
||||||
|
},
|
||||||
|
|
||||||
|
getUnread: function() {
|
||||||
|
var conversationId = this.id;
|
||||||
|
var unreadMessages = new Whisper.MessageCollection();
|
||||||
|
return new Promise(function(resolve) {
|
||||||
|
return unreadMessages.fetch({
|
||||||
|
index: {
|
||||||
|
// 'unread' index
|
||||||
|
name: 'unread',
|
||||||
|
lower: [conversationId, true],
|
||||||
|
upper: [conversationId, true]
|
||||||
|
}
|
||||||
|
}).always(function() {
|
||||||
|
resolve(unreadMessages);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
validate: function(attributes, options) {
|
validate: function(attributes, options) {
|
||||||
|
@ -182,13 +207,22 @@
|
||||||
|
|
||||||
markRead: function() {
|
markRead: function() {
|
||||||
if (this.get('unreadCount') > 0) {
|
if (this.get('unreadCount') > 0) {
|
||||||
this.save({unreadCount: 0});
|
this.save({ unreadCount: 0 });
|
||||||
var conversationId = this.id;
|
var conversationId = this.id;
|
||||||
Whisper.Notifications.remove(
|
Whisper.Notifications.remove(Whisper.Notifications.where({
|
||||||
Whisper.Notifications.models.filter(
|
conversationId: conversationId
|
||||||
function(model) {
|
}));
|
||||||
return model.attributes.conversationId===conversationId;
|
|
||||||
}));
|
var readReceipts = this.messageCollection.where({
|
||||||
|
type: 'incoming', unread: true
|
||||||
|
}).map(function(m) {
|
||||||
|
m.markRead();
|
||||||
|
return {
|
||||||
|
sender: m.get('source'),
|
||||||
|
timestamp: m.get('sent_at')
|
||||||
|
};
|
||||||
|
}.bind(this));
|
||||||
|
textsecure.messaging.sendReadReceipts(readReceipts);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -363,6 +363,10 @@
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
markRead: function(sync) {
|
||||||
|
this.unset('unread');
|
||||||
|
return this.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue