优化聊天室首屏和在线名单性能
This commit is contained in:
@@ -73,6 +73,7 @@
|
||||
let onlineUsers = {};
|
||||
let autoScroll = true;
|
||||
let userBadgeRotationTick = 0;
|
||||
let userListRenderTimer = null;
|
||||
let _maxMsgId = 0; // 记录当前收到的最大消息 ID
|
||||
const initialChatPreferences = normalizeChatPreferences(window.chatContext?.chatPreferences || {});
|
||||
let blockedSystemSenders = new Set(initialChatPreferences.blocked_system_senders);
|
||||
@@ -1907,7 +1908,7 @@
|
||||
*/
|
||||
function _renderUserListToContainer(targetContainer, sortBy, keyword) {
|
||||
if (!targetContainer) return;
|
||||
targetContainer.innerHTML = '';
|
||||
const fragment = document.createDocumentFragment();
|
||||
|
||||
// 在列表顶部添加"大家"条目(原版风格)
|
||||
let allDiv = document.createElement('div');
|
||||
@@ -1916,7 +1917,7 @@
|
||||
allDiv.onclick = () => {
|
||||
toUserSelect.value = '大家';
|
||||
};
|
||||
targetContainer.appendChild(allDiv);
|
||||
fragment.appendChild(allDiv);
|
||||
|
||||
// ── AI 小助手(已在 onlineUsers 中动态维护,移除硬编码)──
|
||||
|
||||
@@ -1994,15 +1995,24 @@
|
||||
_tapTime = now;
|
||||
}
|
||||
}, { passive: false });
|
||||
targetContainer.appendChild(item);
|
||||
fragment.appendChild(item);
|
||||
});
|
||||
|
||||
targetContainer.replaceChildren(fragment);
|
||||
refreshRenderedUserBadges(targetContainer);
|
||||
}
|
||||
|
||||
function renderUserList() {
|
||||
userList.innerHTML = '';
|
||||
toUserSelect.innerHTML = '<option value="大家">大家</option>';
|
||||
if (userListRenderTimer) {
|
||||
window.clearTimeout(userListRenderTimer);
|
||||
userListRenderTimer = null;
|
||||
}
|
||||
|
||||
const selectFragment = document.createDocumentFragment();
|
||||
const everyoneOption = document.createElement('option');
|
||||
everyoneOption.value = '大家';
|
||||
everyoneOption.textContent = '大家';
|
||||
selectFragment.appendChild(everyoneOption);
|
||||
|
||||
// 获取排序方式和搜索词
|
||||
const sortSelect = document.getElementById('user-sort-select');
|
||||
@@ -2023,9 +2033,10 @@
|
||||
text = '🤖 AI小班长';
|
||||
}
|
||||
option.textContent = text;
|
||||
toUserSelect.appendChild(option);
|
||||
selectFragment.appendChild(option);
|
||||
}
|
||||
}
|
||||
toUserSelect.replaceChildren(selectFragment);
|
||||
|
||||
const count = Object.keys(onlineUsers).length;
|
||||
onlineCount.innerText = count;
|
||||
@@ -2039,6 +2050,22 @@
|
||||
window.dispatchEvent(new Event('chatroom:users-updated'));
|
||||
}
|
||||
|
||||
/**
|
||||
* 合并高频在线名单变动,避免 Presence 连续进出时重复重建名单 DOM。
|
||||
*
|
||||
* @param {number} delay 等待毫秒数
|
||||
*/
|
||||
function scheduleRenderUserList(delay = 120) {
|
||||
if (userListRenderTimer) {
|
||||
window.clearTimeout(userListRenderTimer);
|
||||
}
|
||||
|
||||
userListRenderTimer = window.setTimeout(() => {
|
||||
userListRenderTimer = null;
|
||||
renderUserList();
|
||||
}, delay);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户当前仍然有效的当日状态。
|
||||
*
|
||||
@@ -2581,7 +2608,7 @@
|
||||
|
||||
setOnlineUserDailyStatus(window.chatContext.username, getCurrentUserDailyStatus());
|
||||
syncDailyStatusUi();
|
||||
renderUserList();
|
||||
scheduleRenderUserList(0);
|
||||
});
|
||||
|
||||
// 监听机器人动态开关
|
||||
@@ -2596,7 +2623,7 @@
|
||||
delete onlineUsers['AI小班长'];
|
||||
window.chatContext.botUser = null;
|
||||
}
|
||||
renderUserList();
|
||||
scheduleRenderUserList();
|
||||
});
|
||||
|
||||
window.addEventListener('chat:user-status-updated', (e) => {
|
||||
@@ -2614,19 +2641,19 @@
|
||||
syncDailyStatusUi();
|
||||
}
|
||||
|
||||
renderUserList();
|
||||
scheduleRenderUserList();
|
||||
});
|
||||
|
||||
window.addEventListener('chat:joining', (e) => {
|
||||
const user = e.detail;
|
||||
hydrateOnlineUserPayload(user.username, user);
|
||||
renderUserList();
|
||||
scheduleRenderUserList();
|
||||
});
|
||||
|
||||
window.addEventListener('chat:leaving', (e) => {
|
||||
const user = e.detail;
|
||||
delete onlineUsers[user.username];
|
||||
renderUserList();
|
||||
scheduleRenderUserList();
|
||||
});
|
||||
|
||||
window.addEventListener('chat:message', (e) => {
|
||||
|
||||
Reference in New Issue
Block a user