优化
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
import { createTextElement, textValue } from '../../shared/dom.js';
|
||||
|
||||
const EMPTY_CONNECTION_IDS_HTML = '<p class="text-gray-500 text-sm">\u6682\u65e0\u53ef\u7528\u7684\u8fde\u63a5ID</p>';
|
||||
const EMPTY_USERS_HTML = '<p class="text-gray-500 text-sm">\u6682\u65e0\u5728\u7ebf\u7528\u6237</p>';
|
||||
const HALL_LABEL = '\u5927\u5385\uff08\u672a\u52a0\u5165\u623f\u95f4\uff09';
|
||||
@@ -10,13 +12,14 @@ const SELECT_LABEL = '\u9009\u62e9';
|
||||
const USER_COUNT_SUFFIX = '\u4eba';
|
||||
const ONLINE_USERS_SUMMARY_SUFFIX = ' \u4e2aWebSocket\u7528\u6237\u5728\u7ebf';
|
||||
|
||||
function escapeHtml(value) {
|
||||
return String(value || '')
|
||||
.replace(/&/g, '&')
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/"/g, '"')
|
||||
.replace(/'/g, ''');
|
||||
function getRoleTagClass(role) {
|
||||
if (role === 'host') {
|
||||
return 'text-xs px-2 py-1 rounded-full bg-indigo-500/20 text-indigo-300';
|
||||
}
|
||||
if (role === 'participant') {
|
||||
return 'text-xs px-2 py-1 rounded-full bg-white/10 text-gray-300';
|
||||
}
|
||||
return 'text-xs px-2 py-1 rounded-full bg-emerald-500/20 text-emerald-300';
|
||||
}
|
||||
|
||||
export async function fetchOnlineUsers() {
|
||||
@@ -115,10 +118,8 @@ export function renderOnlineUsers({ users, currentUserId, onlineUsersList, users
|
||||
|
||||
const roomTitle = document.createElement('div');
|
||||
roomTitle.className = 'flex items-center justify-between mb-2';
|
||||
roomTitle.innerHTML = `
|
||||
<span class="text-sm font-medium text-white">${escapeHtml(groupName)}</span>
|
||||
<span class="text-xs text-gray-400">${roomUsers.length} ${USER_COUNT_SUFFIX}</span>
|
||||
`;
|
||||
roomTitle.appendChild(createTextElement('span', 'text-sm font-medium text-white', groupName));
|
||||
roomTitle.appendChild(createTextElement('span', 'text-xs text-gray-400', `${roomUsers.length} ${USER_COUNT_SUFFIX}`));
|
||||
section.appendChild(roomTitle);
|
||||
|
||||
const roomList = document.createElement('div');
|
||||
@@ -135,19 +136,31 @@ export function renderOnlineUsers({ users, currentUserId, onlineUsersList, users
|
||||
|
||||
const userItem = document.createElement('div');
|
||||
userItem.className = 'flex items-center justify-between rounded-lg bg-black/20 px-3 py-2';
|
||||
userItem.innerHTML = `
|
||||
<div class="flex items-center gap-3 min-w-0">
|
||||
<img src="${escapeHtml(avatar)}" alt="${escapeHtml(userName)}" class="w-8 h-8 rounded-full object-cover">
|
||||
<div class="min-w-0">
|
||||
<div class="text-sm text-white truncate">${escapeHtml(userName)}</div>
|
||||
<div class="text-xs text-gray-400 truncate">${escapeHtml(identity)}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-center gap-2">
|
||||
<span class="text-xs px-2 py-1 rounded-full ${user.role === 'host' ? 'bg-indigo-500/20 text-indigo-300' : (user.role === 'participant' ? 'bg-white/10 text-gray-300' : 'bg-emerald-500/20 text-emerald-300')}">${roleLabel}</span>
|
||||
${isSelf ? `<span class="text-xs text-gray-500">${SELF_LABEL}</span>` : ''}
|
||||
</div>
|
||||
`;
|
||||
|
||||
const profile = document.createElement('div');
|
||||
profile.className = 'flex items-center gap-3 min-w-0';
|
||||
|
||||
const avatarImage = document.createElement('img');
|
||||
avatarImage.src = textValue(avatar);
|
||||
avatarImage.alt = textValue(userName);
|
||||
avatarImage.className = 'w-8 h-8 rounded-full object-cover';
|
||||
profile.appendChild(avatarImage);
|
||||
|
||||
const info = document.createElement('div');
|
||||
info.className = 'min-w-0';
|
||||
info.appendChild(createTextElement('div', 'text-sm text-white truncate', userName));
|
||||
info.appendChild(createTextElement('div', 'text-xs text-gray-400 truncate', identity));
|
||||
profile.appendChild(info);
|
||||
|
||||
const status = document.createElement('div');
|
||||
status.className = 'flex items-center gap-2';
|
||||
status.appendChild(createTextElement('span', getRoleTagClass(user.role), roleLabel));
|
||||
if (isSelf) {
|
||||
status.appendChild(createTextElement('span', 'text-xs text-gray-500', SELF_LABEL));
|
||||
}
|
||||
|
||||
userItem.appendChild(profile);
|
||||
userItem.appendChild(status);
|
||||
roomList.appendChild(userItem);
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user