mirror of
https://github.com/zulip/zulip.git
synced 2025-11-16 20:02:15 +00:00
Set initial user presences in O(n), not O(n²) time
Previous code iteratively called set_user_status() once for each user; which in turn was rerendering the user sidebar, also once for each user. I changed the API a bit by replacing activity.set_user_status() with activity.set_user_statuses(), plural, that takes an object and updates all the user statuses in one go before rendering. (imported from commit 1111c9029264f892f25e76d2e5e5ff996dcbc7ca)
This commit is contained in:
@@ -143,11 +143,21 @@ exports.initialize = function () {
|
|||||||
focus_ping();
|
focus_ping();
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.set_user_status = function (user_email, presence, server_time) {
|
// Set user statuses. `users` should be an object with user emails as keys
|
||||||
if (user_email === page_params.email) {
|
// and presence information (see `status_from_timestamp`) as values.
|
||||||
return;
|
//
|
||||||
}
|
// The object does not need to include every user, only the ones
|
||||||
user_info[user_email] = status_from_timestamp(server_time, presence);
|
// whose presence you wish to update.
|
||||||
|
//
|
||||||
|
// This rerenders the user sidebar at the end, which can be slow if done too
|
||||||
|
// often, so try to avoid calling this repeatedly.
|
||||||
|
exports.set_user_statuses = function (users, server_time) {
|
||||||
|
$.each(users, function (email, presence) {
|
||||||
|
if (email === page_params.email) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
user_info[email] = status_from_timestamp(server_time, presence);
|
||||||
|
});
|
||||||
|
|
||||||
update_users();
|
update_users();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -72,10 +72,8 @@ $(function () {
|
|||||||
"full_name": "Humbug Feedback Bot"});
|
"full_name": "Humbug Feedback Bot"});
|
||||||
}
|
}
|
||||||
|
|
||||||
$.each(page_params.initial_presences, function (email, presence) {
|
activity.set_user_statuses(page_params.initial_presences,
|
||||||
activity.set_user_status(email, presence, page_params.initial_servertime);
|
page_params.initial_servertime);
|
||||||
});
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
function within_viewport(row_offset, row_height) {
|
function within_viewport(row_offset, row_height) {
|
||||||
@@ -823,7 +821,9 @@ function get_updates_success(data) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'presence':
|
case 'presence':
|
||||||
activity.set_user_status(event.email, event.presence, event.server_timestamp);
|
var users = {};
|
||||||
|
users[event.email] = event.presence;
|
||||||
|
activity.set_user_statuses(users, event.server_timestamp);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user