@@ -5,6 +5,7 @@ var me = new XChatUser();
55
66// 添加当前传输用户的引用
77let currentTransferUser = null ;
8+ let currentNickname = '' ;
89
910function setRemote ( ) {
1011 me . setRemoteSdp ( remoteSDP . value ) ;
@@ -13,8 +14,12 @@ function addLinkItem(uid, file) {
1314 const chatBox = document . querySelector ( '.chat-wrapper' ) ;
1415 const chatItem = document . createElement ( 'div' ) ;
1516 chatItem . className = 'chat-item' ;
17+
18+ const user = users . find ( u => u . id === uid ) ;
19+ const displayName = user ?. nickname || uid ;
20+
1621 chatItem . innerHTML = `
17- <div class="chat-item_user">${ uid === me . id ? '(我)' : '' } ${ uid } :</div>
22+ <div class="chat-item_user">${ uid === me . id ? '(我)' : '' } ${ displayName } :</div>
1823 <div class="chat-item_content"><a class="file" href="${ file . url } " download="${ file . name } ">[文件] ${ file . name } </a></div>
1924 ` ;
2025 chatBox . appendChild ( chatItem ) ;
@@ -33,13 +38,15 @@ function addChatItem(uid, message) {
3338 } ) ;
3439 }
3540
41+ const user = users . find ( u => u . id === uid ) ;
42+ const displayName = user ?. nickname || uid ;
43+
3644 chatItem . innerHTML = `
37- <div class="chat-item_user">${ uid === me . id ? '(我)' : '' } ${ uid } :</div>
45+ <div class="chat-item_user">${ uid === me . id ? '(我)' : '' } ${ displayName } :</div>
3846 <div class="chat-item_content"><pre>${ msg } </pre></div>
3947 ` ;
4048 chatBox . appendChild ( chatItem ) ;
4149 chatBox . scrollTop = chatBox . scrollHeight ;
42-
4350}
4451function sendMessage ( msg ) {
4552 const message = msg ?? messageInput . value ;
@@ -141,16 +148,18 @@ function refreshUsers(data) {
141148 u => {
142149 let uOld = users . find ( uOld => uOld . id === u . id )
143150 if ( uOld ) {
151+ // 保持原有昵称
152+ u . nickname = u . nickname || uOld . nickname ;
144153 return uOld ;
145154 }
146155 let xchatUser = new XChatUser ( ) ;
147156 xchatUser . id = u . id ;
148157 xchatUser . isMe = u . id === me . id ;
158+ xchatUser . nickname = u . nickname ; // 设置昵称
149159
150- // 添加连接状态变化监听
151160 xchatUser . onConnectionStateChange = ( state ) => {
152161 console . log ( `User ${ xchatUser . id } connection state: ${ state } ` ) ;
153- refreshUsersHTML ( ) ; // 更新用户列表显示
162+ refreshUsersHTML ( ) ;
154163 } ;
155164
156165 return xchatUser ;
@@ -212,12 +221,14 @@ function refreshUsersHTML() {
212221 `<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/></svg>` :
213222 `<svg viewBox="0 0 24 24" fill="currentColor"><path d="M17 7h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1 0 1.43-.98 2.63-2.31 2.98l1.46 1.46C20.88 15.61 22 13.95 22 12c0-2.76-2.24-5-5-5zm-1 4h-2.19l2 2H16zM2 4.27l3.11 3.11C3.29 8.12 2 9.91 2 12c0 2.76 2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1 0-1.59 1.21-2.9 2.76-3.07L8.73 11H8v2h2.73L13 15.27V17h1.73l4.01 4L20 19.74 3.27 3 2 4.27z"/></svg>` ;
214223
224+ const displayName = u . nickname || u . id ;
225+
215226 return `
216227 <li>
217228 <span class="connection-status ${ statusClass } ">
218229 ${ statusIcon }
219230 </span>
220- ${ u . id } ${ u . isMe ?'(我)' :'' }
231+ ${ displayName } ${ u . isMe ?'(我)' :'' }
221232 </li>
222233 ` ;
223234 } ) . join ( '' ) ;
@@ -237,6 +248,13 @@ function enterTxt(event) {
237248const signalingServer = new WebSocket ( wsUrl ) ;
238249signalingServer . onopen = ( ) => {
239250 console . log ( 'Connected to signaling server' ) ;
251+
252+ // 读取保存的昵称
253+ const match = document . cookie . match ( / n i c k n a m e = ( [ ^ ; ] + ) / ) ;
254+ if ( match ) {
255+ currentNickname = decodeURIComponent ( match [ 1 ] ) ;
256+ }
257+
240258 setInterval ( ( ) => {
241259 signalingServer . send ( JSON . stringify ( { type : '9999' } ) ) ;
242260 } , 1000 * 10 ) ;
@@ -248,6 +266,15 @@ signalingServer.onmessage = ({ data: responseStr }) => {
248266
249267 if ( type === '1001' ) {
250268 me . id = data . id ;
269+ // 如果有保存的昵称,发送给服务器
270+ if ( currentNickname ) {
271+ signalingServer . send ( JSON . stringify ( {
272+ uid : me . id ,
273+ targetId : me . id ,
274+ type : '9004' ,
275+ data : { nickname : currentNickname }
276+ } ) ) ;
277+ }
251278 return ;
252279 }
253280 if ( type === '1002' ) {
@@ -270,6 +297,14 @@ signalingServer.onmessage = ({ data: responseStr }) => {
270297 joinedConnection ( data ) ;
271298 return ;
272299 }
300+ if ( type === '1007' ) {
301+ const user = users . find ( u => u . id === data . id ) ;
302+ if ( user ) {
303+ user . nickname = data . nickname ;
304+ refreshUsersHTML ( ) ;
305+ }
306+ return ;
307+ }
273308}
274309
275310function showUserSelectModal ( ) {
@@ -284,24 +319,21 @@ function showUserSelectModal() {
284319 if ( ! user . isMe ) {
285320 const item = document . createElement ( 'div' ) ;
286321 item . className = 'user-select-item' ;
287- const id = ` user- ${ user . id } ` ;
322+ const displayName = user . nickname || user . id ;
288323
289- // 不使用 label 的 for 属性,改用包裹的方式
290324 item . innerHTML = `
291325 <label>
292326 <input type="checkbox" value="${ user . id } ">
293- <span>${ user . id } </span>
327+ <span>${ displayName } </span>
294328 </label>
295329 ` ;
296330
297331 // 点击整行时切换复选框状态
298332 item . addEventListener ( 'click' , ( e ) => {
299333 const checkbox = item . querySelector ( 'input[type="checkbox"]' ) ;
300- // 如果点击的是复选框本身,不需要额外处理
301334 if ( e . target === checkbox ) return ;
302-
303335 checkbox . checked = ! checkbox . checked ;
304- e . preventDefault ( ) ; // 阻止事件冒泡
336+ e . preventDefault ( ) ;
305337 } ) ;
306338
307339 userList . appendChild ( item ) ;
@@ -415,4 +447,46 @@ document.querySelector('.send-btn').addEventListener('click', () => {
415447 if ( messageInput . value . trim ( ) ) { // 只有当消息不为空时才发送
416448 sendMessage ( ) ;
417449 }
418- } ) ;
450+ } ) ;
451+
452+ function showNicknameModal ( ) {
453+ const modal = document . getElementById ( 'nicknameModal' ) ;
454+ const input = document . getElementById ( 'nicknameInput' ) ;
455+ input . value = currentNickname ;
456+ modal . style . display = 'block' ;
457+ }
458+
459+ function closeNicknameModal ( ) {
460+ const modal = document . getElementById ( 'nicknameModal' ) ;
461+ modal . style . display = 'none' ;
462+ }
463+
464+ function saveNickname ( ) {
465+ const input = document . getElementById ( 'nicknameInput' ) ;
466+ const nickname = input . value . trim ( ) ;
467+
468+ if ( nickname ) {
469+ currentNickname = nickname ;
470+ document . cookie = `nickname=${ encodeURIComponent ( nickname ) } ; path=/; max-age=31536000` ; // 保存一年
471+
472+ // 更新本地显示
473+ const user = users . find ( u => u . id === me . id ) ;
474+ if ( user ) {
475+ user . nickname = nickname ;
476+ refreshUsersHTML ( ) ;
477+ }
478+
479+ // 发送到服务器
480+ signalingServer . send ( JSON . stringify ( {
481+ uid : me . id ,
482+ targetId : me . id ,
483+ type : '9004' ,
484+ data : { nickname }
485+ } ) ) ;
486+ }
487+
488+ closeNicknameModal ( ) ;
489+ }
490+
491+ // ... 添加昵称按钮事件监听
492+ document . querySelector ( '.nickname-btn' ) . addEventListener ( 'click' , showNicknameModal ) ;
0 commit comments