From 259e77fbf64a522ff4d8151839e24778a69b4cb7 Mon Sep 17 00:00:00 2001 From: Aman Agrawal Date: Mon, 12 Aug 2024 09:06:32 +0000 Subject: [PATCH] message_list_data: Track if the data is rendered using message list id. This is an easy way to track if a MessageListData is rendered. Storing MessageList object would make us liable to cleanup the MessageList object when the data is no longer in use. Note that this is more like "likely / past rendered message list id", we will have to check currently rendered message list data to verify if the data object is really rendered. --- web/src/message_list.js | 2 ++ web/src/message_list_data.ts | 9 +++++++++ web/src/message_lists.ts | 1 + 3 files changed, 12 insertions(+) diff --git a/web/src/message_list.js b/web/src/message_list.js index 4e23ed3bc1..c626224fc6 100644 --- a/web/src/message_list.js +++ b/web/src/message_list.js @@ -48,6 +48,8 @@ export class MessageList { }); } + this.data.set_rendered_message_list_id(this.id); + // TODO: This property should likely just be inlined into // having the MessageListView code that needs to access it // query .data.filter directly. diff --git a/web/src/message_list_data.ts b/web/src/message_list_data.ts index 5d89a59c91..c0e7f0fe8a 100644 --- a/web/src/message_list_data.ts +++ b/web/src/message_list_data.ts @@ -46,6 +46,11 @@ export class MessageListData { // This is a callback that is called when messages are added to the message list. add_messages_callback?: (messages: Message[], recipient_order_changed: boolean) => void; + // ID of the MessageList for which this MessageListData is the data. + // Using ID instead of the MessageList object itself to avoid circular dependencies + // and to allow MessageList objects to be easily garbage collected. + rendered_message_list_id: number | undefined; + // MessageListData is a core data structure for keeping track of a // contiguous block of messages matching a given narrow that can // be displayed in a Zulip message feed. @@ -64,6 +69,10 @@ export class MessageListData { this._selected_id = -1; } + set_rendered_message_list_id(rendered_message_list_id: number | undefined): void { + this.rendered_message_list_id = rendered_message_list_id; + } + set_add_messages_callback( callback: (messages: Message[], rows_order_changed: boolean) => void, ): void { diff --git a/web/src/message_lists.ts b/web/src/message_lists.ts index a0767b0a54..3899a16f66 100644 --- a/web/src/message_lists.ts +++ b/web/src/message_lists.ts @@ -97,6 +97,7 @@ export function set_current(msg_list: MessageList | undefined): void { function delete_message_list(message_list: MessageList): void { message_list.view.$list.remove(); rendered_message_lists.delete(message_list.id); + message_list.data.set_rendered_message_list_id(undefined); } export function update_current_message_list(msg_list: MessageList | undefined): void {