Files
zulip/static/js/pm_conversations.js
Steve Howell ee3e488e02 js: Extract FoldDict class.
We have ~5 years of proof that we'll probably never
extend Dict with more options.

Breaking the classes into makes both a little faster
(no options to check), and we remove some options
in FoldDict that are never used (from/from_array).

A possible next step is to fine-tune the Dict to use
Map internally.

Note that the TypeScript types for FoldDict are now
more specific (requiring string keys).  Of course,
this isn't really enforced until we convert other
modules to TS.
2020-01-03 17:19:50 -08:00

85 lines
2.8 KiB
JavaScript

const Dict = require('./dict').Dict;
const FoldDict = require('./fold_dict').FoldDict;
const partners = new Dict();
exports.set_partner = function (user_id) {
partners.set(user_id, true);
};
exports.is_partner = function (user_id) {
return partners.get(user_id) || false;
};
exports.recent = (function () {
// This data structure keeps track of the sets of users you've had
// recent conversations with, sorted by time (implemented via
// `message_id` sorting, since that's how we time-sort messages).
const self = {};
const recent_message_ids = new FoldDict(); // key is user_ids_string
const recent_private_messages = [];
self.insert = function (user_ids, message_id) {
if (user_ids.length === 0) {
// The server sends [] for self-PMs.
user_ids = [people.my_current_user_id()];
}
user_ids.sort((a, b) => a - b);
const user_ids_string = user_ids.join(',');
let conversation = recent_message_ids.get(user_ids_string);
if (conversation === undefined) {
// This is a new user, so create a new object.
conversation = {
user_ids_string: user_ids_string,
max_message_id: message_id,
};
recent_message_ids.set(user_ids_string, conversation);
// Optimistically insert the new message at the front, since that
// is usually where it belongs, but we'll re-sort.
recent_private_messages.unshift(conversation);
} else {
if (conversation.max_message_id >= message_id) {
// don't backdate our conversation. This is the
// common code path after initialization when
// processing old messages, since we'll already have
// the latest message_id for the conversation from
// initialization.
return;
}
// update our latest message_id
conversation.max_message_id = message_id;
}
recent_private_messages.sort(function (a, b) {
return b.max_message_id - a.max_message_id;
});
};
self.get = function () {
// returns array of structs with user_ids_string and
// message_id
return recent_private_messages;
};
self.get_strings = function () {
// returns array of structs with user_ids_string and
// message_id
return _.pluck(recent_private_messages, 'user_ids_string');
};
self.initialize = function () {
_.each(page_params.recent_private_conversations, function (conversation) {
self.insert(conversation.user_ids, conversation.max_message_id);
});
delete page_params.recent_private_messages;
};
return self;
}());
window.pm_conversations = exports;