performance: Use a single ListWidget for subscribers.

It's kind of silly to cache ListWidgets for subscriber
lists when we only ever update the most recent one.

This will save memory if you are managing a whole bunch
of streams, although I suspect the savings here is
mostly negligible unless you were doing something
crazy.

The main motivation here is just that it simplifies the
code.
This commit is contained in:
Steve Howell 2021-12-20 14:54:10 +00:00 committed by Tim Abbott
parent afd1d12405
commit fb003d757b

View File

@ -25,6 +25,7 @@ import * as user_pill from "./user_pill";
export let pill_widget;
let current_stream_id;
let subscribers_list_widget;
function create_item_from_text(text, current_items) {
const funcs = [
@ -129,8 +130,10 @@ export function enable_subscriber_management({sub, parent_container}) {
const simplebar_container = parent_container.find(".subscriber_list_container");
ListWidget.create(list_container, users, {
name: "stream_subscribers/" + stream_id,
// We track a single subscribers_list_widget for this module, since we
// only ever have one list of subscribers visible at a time.
subscribers_list_widget = ListWidget.create(list_container, users, {
name: "stream_subscribers",
modifier(item) {
return format_member_list_elem(item);
},
@ -329,25 +332,14 @@ export function update_subscribers_list(sub) {
if (!stream_data.can_view_subscribers(sub)) {
$(".subscriber_list_settings_container").hide();
} else {
// Re-render the whole list when we add new users. This is
// inefficient for the single-user case, but using the big-hammer
// approach is superior when you do things like add subscribers
// from an existing stream or a user group.
const subscriber_ids = peer_data.get_subscribers(sub.stream_id);
const users = people.get_users_from_ids(subscriber_ids);
/*
We try to find a subscribers list that is already in the
cache that list_widget.js maintains. The list we are
looking for would have been created in the function
stream_edit.show_subscription_settings, using the same
naming scheme as below for the `name` parameter.
*/
const subscribers_list = ListWidget.get("stream_subscribers/" + sub.stream_id);
// Changing the data clears the rendered list and the list needs to be re-rendered.
// Perform re-rendering only when the stream settings form of the corresponding
// stream is open.
if (subscribers_list) {
people.sort_but_pin_current_user_on_top(users);
subscribers_list.replace_list_data(users);
}
people.sort_but_pin_current_user_on_top(users);
subscribers_list_widget.replace_list_data(users);
$(".subscriber_list_settings_container").show();
}
}