Skip to content

Commit 808bf65

Browse files
committed
perf(ui): add fingerprint guard to renderUserStrip
Move the data comparison guard into renderUserStrip itself instead of individual call sites. Prevents unnecessary full DOM rebuilds of the user/mate strip when called from mate_list, dm_favorites_updated, or any other message handler with unchanged data.
1 parent 499e5d3 commit 808bf65

2 files changed

Lines changed: 8 additions & 16 deletions

File tree

lib/public/modules/app-projects.js

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -229,23 +229,12 @@ export function updateProjectList(msg) {
229229
}
230230
}
231231

232-
// Update user strip (DM targets) - only if user data actually changed
232+
// Update user strip (DM targets) - renderUserStrip has its own fingerprint guard
233233
if (msg.allUsers) {
234-
var allUsersJson = JSON.stringify(msg.allUsers);
235-
var dmFavJson = msg.dmFavorites ? JSON.stringify(msg.dmFavorites) : _lastDmFavJson;
236-
var dmConvJson = msg.dmConversations ? JSON.stringify(msg.dmConversations) : _lastDmConvJson;
237-
var userDataChanged = allUsersJson !== _lastAllUsersJson || dmFavJson !== _lastDmFavJson || dmConvJson !== _lastDmConvJson;
238-
239234
_ctx.setCachedAllUsers(msg.allUsers);
240235
if (msg.dmFavorites) _ctx.setCachedDmFavorites(msg.dmFavorites);
241236
if (msg.dmConversations) _ctx.setCachedDmConversations(msg.dmConversations);
242-
243-
if (userDataChanged) {
244-
_lastAllUsersJson = allUsersJson;
245-
_lastDmFavJson = dmFavJson;
246-
_lastDmConvJson = dmConvJson;
247-
_ctx.renderUserStrip(msg.allUsers, _ctx.cachedOnlineIds, _ctx.myUserId, _ctx.cachedDmFavorites, _ctx.cachedDmConversations, _ctx.dmUnread, _ctx.dmRemovedUsers, _ctx.cachedMatesList);
248-
}
237+
_ctx.renderUserStrip(msg.allUsers, _ctx.cachedOnlineIds, _ctx.myUserId, _ctx.cachedDmFavorites, _ctx.cachedDmConversations, _ctx.dmUnread, _ctx.dmRemovedUsers, _ctx.cachedMatesList);
249238
if (document.body.classList.contains("mate-dm-active") || document.body.classList.contains("wide-view")) {
250239
var refreshedMyUser = _ctx.cachedAllUsers.find(function (u) { return u.id === _ctx.myUserId; });
251240
if (refreshedMyUser) {
@@ -271,9 +260,6 @@ export function updateProjectList(msg) {
271260
var _lastTopbarUserIds = [];
272261
var _lastProjectsJson = "";
273262
var _lastRenderedSlug = null;
274-
var _lastAllUsersJson = "";
275-
var _lastDmFavJson = "";
276-
var _lastDmConvJson = "";
277263
export function renderTopbarPresence(serverUsers) {
278264
var countEl = document.getElementById("client-count");
279265
if (!countEl) return;

lib/public/modules/sidebar-mates.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ var currentDmUserId = null;
1919
var dmPickerOpen = false;
2020
var cachedDmRemovedUsers = {};
2121
var cachedMates = [];
22+
var _lastUserStripJson = "";
2223

2324
// --- Icon strip tooltip ---
2425
var iconStripTooltip = null;
@@ -238,6 +239,11 @@ function presenceAvatarUrl(userOrStyle) {
238239
}
239240

240241
export function renderUserStrip(allUsers, onlineUserIds, myUserId, dmFavorites, dmConversations, dmUnread, dmRemovedUsers, matesList) {
242+
// Skip full DOM rebuild if input data hasn't changed
243+
var fingerprint = JSON.stringify([allUsers, onlineUserIds, dmFavorites, dmConversations, dmUnread, dmRemovedUsers, matesList]);
244+
if (fingerprint === _lastUserStripJson) return;
245+
_lastUserStripJson = fingerprint;
246+
241247
cachedMates = matesList || cachedMates || [];
242248
cachedAllUsers = allUsers || [];
243249
cachedOnlineUserIds = onlineUserIds || [];

0 commit comments

Comments
 (0)