2021-06-10 14:18:46 +02:00
|
|
|
import * as people from "./people";
|
2023-09-06 23:21:13 +02:00
|
|
|
import {get_key_from_message} from "./recent_view_util";
|
2023-09-22 09:58:32 +02:00
|
|
|
import type {Message} from "./types";
|
2021-06-10 14:18:46 +02:00
|
|
|
|
2023-09-22 09:58:32 +02:00
|
|
|
export type TopicData = {
|
|
|
|
last_msg_id: number;
|
|
|
|
participated: boolean;
|
|
|
|
type: "private" | "stream";
|
|
|
|
};
|
2023-09-27 17:56:40 +02:00
|
|
|
export const topics = new Map<string, TopicData>();
|
2022-11-18 17:00:42 +01:00
|
|
|
// For stream messages, key is stream-id:topic.
|
|
|
|
// For pms, key is the user IDs to whom the message is being sent.
|
2021-06-10 14:18:46 +02:00
|
|
|
|
2023-09-22 09:58:32 +02:00
|
|
|
export function process_message(msg: Message): boolean {
|
2022-11-18 17:00:42 +01:00
|
|
|
// Return whether any conversation data is updated.
|
|
|
|
let conversation_data_updated = false;
|
|
|
|
|
|
|
|
// Initialize conversation data
|
2022-04-24 06:13:19 +02:00
|
|
|
const key = get_key_from_message(msg);
|
2023-09-22 09:58:32 +02:00
|
|
|
let topic_data = topics.get(key);
|
|
|
|
if (topic_data === undefined) {
|
|
|
|
topic_data = {
|
2021-06-10 14:18:46 +02:00
|
|
|
last_msg_id: -1,
|
|
|
|
participated: false,
|
2022-04-24 06:13:19 +02:00
|
|
|
type: msg.type,
|
2023-09-22 09:58:32 +02:00
|
|
|
};
|
|
|
|
topics.set(key, topic_data);
|
2022-11-18 17:00:42 +01:00
|
|
|
conversation_data_updated = true;
|
2021-06-10 14:18:46 +02:00
|
|
|
}
|
2022-11-18 17:00:42 +01:00
|
|
|
// Update conversation data
|
2021-06-10 14:18:46 +02:00
|
|
|
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;
|
2022-11-18 17:00:42 +01:00
|
|
|
conversation_data_updated = true;
|
2021-06-10 14:18:46 +02:00
|
|
|
}
|
|
|
|
// 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.
|
2022-11-18 17:00:42 +01:00
|
|
|
if (!topic_data.participated && people.is_my_user_id(msg.sender_id)) {
|
|
|
|
topic_data.participated = true;
|
|
|
|
conversation_data_updated = true;
|
|
|
|
}
|
|
|
|
return conversation_data_updated;
|
2021-06-10 14:18:46 +02:00
|
|
|
}
|
|
|
|
|
2023-09-22 09:58:32 +02:00
|
|
|
function get_sorted_topics(): Map<string | undefined, TopicData> {
|
2021-06-10 14:18:46 +02:00
|
|
|
// Sort all recent topics by last message time.
|
2023-03-02 01:58:25 +01:00
|
|
|
return new Map([...topics.entries()].sort((a, b) => b[1].last_msg_id - a[1].last_msg_id));
|
2021-06-10 14:18:46 +02:00
|
|
|
}
|
|
|
|
|
2023-09-22 09:58:32 +02:00
|
|
|
export function get(): Map<string | undefined, TopicData> {
|
2021-06-10 14:18:46 +02:00
|
|
|
return get_sorted_topics();
|
|
|
|
}
|
|
|
|
|
2023-09-22 09:58:32 +02:00
|
|
|
export function reify_message_id_if_available(opts: {old_id: number; new_id: number}): boolean {
|
2021-06-10 14:18:46 +02:00
|
|
|
// 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.
|
2023-06-30 00:22:26 +02:00
|
|
|
for (const value of topics.values()) {
|
2021-06-10 14:18:46 +02:00
|
|
|
if (value.last_msg_id === opts.old_id) {
|
|
|
|
value.last_msg_id = opts.new_id;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|