mirror of https://github.com/zulip/zulip.git
64 lines
2.1 KiB
JavaScript
64 lines
2.1 KiB
JavaScript
|
import * as people from "./people";
|
||
|
import {get_topic_key} from "./recent_topics_util";
|
||
|
|
||
|
export const topics = new Map(); // Key is stream-id:topic.
|
||
|
|
||
|
export function process_message(msg) {
|
||
|
// This function returns if topic_data
|
||
|
// has changed or not.
|
||
|
if (msg.type !== "stream") {
|
||
|
// We don't process private messages yet.
|
||
|
return false;
|
||
|
}
|
||
|
// Initialize topic data
|
||
|
const key = get_topic_key(msg.stream_id, msg.topic);
|
||
|
if (!topics.has(key)) {
|
||
|
topics.set(key, {
|
||
|
last_msg_id: -1,
|
||
|
participated: false,
|
||
|
});
|
||
|
}
|
||
|
// Update topic data
|
||
|
const is_ours = people.is_my_user_id(msg.sender_id);
|
||
|
const topic_data = topics.get(key);
|
||
|
if (topic_data.last_msg_id < msg.id) {
|
||
|
// NOTE: This also stores locally echoed msg_id which
|
||
|
// has not been successfully received from the server.
|
||
|
// We store it now and reify it when response is available
|
||
|
// from server.
|
||
|
topic_data.last_msg_id = msg.id;
|
||
|
}
|
||
|
// TODO: Add backend support for participated topics.
|
||
|
// Currently participated === recently participated
|
||
|
// i.e. Only those topics are participated for which we have the user's
|
||
|
// message fetched in the topic. Ideally we would want this to be attached
|
||
|
// to topic info fetched from backend, which is currently not a thing.
|
||
|
topic_data.participated = is_ours || topic_data.participated;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
function get_sorted_topics() {
|
||
|
// Sort all recent topics by last message time.
|
||
|
return new Map(
|
||
|
Array.from(topics.entries()).sort((a, b) => b[1].last_msg_id - a[1].last_msg_id),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
export function get() {
|
||
|
return get_sorted_topics();
|
||
|
}
|
||
|
|
||
|
export function reify_message_id_if_available(opts) {
|
||
|
// We don't need to reify the message_id of the topic
|
||
|
// if a new message arrives in the topic from another user,
|
||
|
// since it replaces the last_msg_id of the topic which
|
||
|
// we were trying to reify.
|
||
|
for (const [, value] of topics.entries()) {
|
||
|
if (value.last_msg_id === opts.old_id) {
|
||
|
value.last_msg_id = opts.new_id;
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|