成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

構建一個即時消息應用(九):Conversation頁面

開發 后端
在這篇文章中,我們將對對話conversation頁面進行編碼。此頁面是兩個用戶之間的聊天室。在頂部我們將顯示其他參與者的信息,下面接著的是最新消息列表,以及底部的消息表單。

[[347198]]

本文是該系列的第八篇。

在這篇文章中,我們將對對話conversation頁面進行編碼。此頁面是兩個用戶之間的聊天室。在頂部我們將顯示其他參與者的信息,下面接著的是最新消息列表,以及底部的消息表單。

聊天標題

 

讓我們從創建 static/pages/conversation-page.js 文件開始,它包含以下內容:

  1. import http from '../http.js' 
  2. import { navigate } from '../router.js' 
  3. import { avatar, escapeHTML } from '../shared.js' 
  4.  
  5. export default async function conversationPage(conversationID) { 
  6.     let conversation 
  7.     try { 
  8.         conversation = await getConversation(conversationID) 
  9.     } catch (err) { 
  10.         alert(err.message) 
  11.         navigate('/'true
  12.         return 
  13.     } 
  14.  
  15.     const template = document.createElement('template'
  16.     template.innerHTML = ` 
  17.         <div> 
  18.             <a href="/">← Back</a> 
  19.             ${avatar(conversation.otherParticipant)} 
  20.             <span>${conversation.otherParticipant.username}</span> 
  21.         </div> 
  22.         <!-- message list here --> 
  23.         <!-- message form here --> 
  24.     ` 
  25.     const page = template.content 
  26.     return page 
  27.  
  28. function getConversation(id) { 
  29.     return http.get('/api/conversations/' + id) 

此頁面接收路由從 URL 中提取的會話 ID。

首先,它向 /api/ conversations/{conversationID} 發起一個 GET 請求,以獲取有關對話的信息。 如果出現錯誤,我們會將其顯示,并重定向回 /。然后我們呈現有關其他參與者的信息。

對話列表

 

我們也會獲取最新的消息并顯示它們。

  1. let conversation, messages 
  2. try { 
  3.     [conversation, messages] = await Promise.all([ 
  4.         getConversation(conversationID), 
  5.         getMessages(conversationID), 
  6.     ]) 

更新 conversationPage() 函數以獲取消息。我們使用 Promise.all() 同時執行這兩個請求。

  1. function getMessages(conversationID) { 
  2.     return http.get(`/api/conversations/${conversationID}/messages`) 

發起對 /api/conversations/{conversationID}/messages 的 GET 請求可以獲取對話中的最新消息。

  1. <ol id="messages"></ol> 

現在,將該列表添加到標記中。

  1. const messagesOList = page.getElementById('messages'
  2. for (const message of messages.reverse()) { 
  3.     messagesOList.appendChild(renderMessage(message)) 

這樣我們就可以將消息附加到列表中了。我們以時間倒序來顯示它們。

  1. function renderMessage(message) { 
  2.     const messageContent = escapeHTML(message.content) 
  3.     const messageDate = new Date(message.createdAt).toLocaleString() 
  4.  
  5.     const li = document.createElement('li'
  6.     if (message.mine) { 
  7.         li.classList.add('owned'
  8.     } 
  9.     li.innerHTML = ` 
  10.         <p>${messageContent}</p> 
  11.         <time>${messageDate}</time
  12.     ` 
  13.     return li 

每個消息條目顯示消息內容本身及其時間戳。使用 .mine,我們可以將不同的 css 類附加到條目,這樣您就可以將消息顯示在右側。

消息表單

 

 
  1. <form id="message-form"
  2.     <input type="text" placeholder="Type something" maxlength="480" required> 
  3.     <button>Send</button> 
  4. </form> 

將該表單添加到當前標記中。

  1. page.getElementById('message-form').onsubmit = messageSubmitter(conversationID) 

將事件監聽器附加到 “submit” 事件。

  1. function messageSubmitter(conversationID) { 
  2.     return async ev => { 
  3.         ev.preventDefault() 
  4.  
  5.         const form = ev.currentTarget 
  6.         const input = form.querySelector('input'
  7.         const submitButton = form.querySelector('button'
  8.  
  9.         input.disabled = true 
  10.         submitButton.disabled = true 
  11.  
  12.         try { 
  13.             const message = await createMessage(input.value, conversationID) 
  14.             input.value = '' 
  15.             const messagesOList = document.getElementById('messages'
  16.             if (messagesOList === null) { 
  17.                 return 
  18.             } 
  19.  
  20.             messagesOList.appendChild(renderMessage(message)) 
  21.         } catch (err) { 
  22.             if (err.statusCode === 422) { 
  23.                 input.setCustomValidity(err.body.errors.content) 
  24.             } else { 
  25.                 alert(err.message) 
  26.             } 
  27.         } finally { 
  28.             input.disabled = false 
  29.             submitButton.disabled = false 
  30.  
  31.             setTimeout(() => { 
  32.                 input.focus() 
  33.             }, 0) 
  34.         } 
  35.     } 
  36.  
  37. function createMessage(content, conversationID) { 
  38.     return http.post(`/api/conversations/${conversationID}/messages`, { content }) 

我們利用 partial application 在 “submit” 事件處理程序中獲取對話 ID。它 從輸入中獲取消息內容,并用它對 /api/conversations/{conversationID}/messages 發出 POST 請求。 然后將新創建的消息添加到列表中。

消息訂閱

為了實現實時,我們還將訂閱此頁面中的消息流。

  1. page.addEventListener('disconnect', subscribeToMessages(messageArriver(conversationID))) 

將該行添加到 conversationPage() 函數中。

  1. function subscribeToMessages(cb) { 
  2.     return http.subscribe('/api/messages', cb) 
  3.  
  4. function messageArriver(conversationID) { 
  5.     return message => { 
  6.         if (message.conversationID !== conversationID) { 
  7.             return 
  8.         } 
  9.  
  10.         const messagesOList = document.getElementById('messages'
  11.         if (messagesOList === null) { 
  12.             return 
  13.  
  14.         } 
  15.         messagesOList.appendChild(renderMessage(message)) 
  16.         readMessages(message.conversationID) 
  17.     } 
  18.  
  19. function readMessages(conversationID) { 
  20.     return http.post(`/api/conversations/${conversationID}/read_messages`) 

在這里我們仍然使用這個應用的部分來獲取會話 ID。 當新消息到達時,我們首先檢查它是否來自此對話。如果是,我們會將消息條目預先添加到列表中,并向 /api/conversations/{conversationID}/read_messages 發起 POST 一個請求,以更新參與者上次閱讀消息的時間。


本系列到此結束。 消息應用現在可以運行了。

 

 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2020-10-16 14:40:20

即時消息Home頁面編程語言

2020-10-12 09:20:13

即時消息Access頁面編程語言

2020-10-09 12:45:19

創建消息即時消息編程語言

2019-09-29 15:25:13

CockroachDBGoJavaScript

2020-10-09 15:00:56

實時消息編程語言

2019-10-28 20:12:40

OAuthGuard中間件編程語言

2020-03-31 12:21:20

JSON即時消息編程語言

2020-10-10 20:51:10

即時消息編程語言

2021-03-25 08:29:33

SpringBootWebSocket即時消息

2023-08-14 08:01:12

websocket8g用戶

2015-03-18 15:37:19

社交APP場景

2014-10-15 11:01:02

Web應用測試應用

2018-08-22 17:32:45

2022-02-10 07:03:32

流量應用架構數據交換

2021-07-14 17:39:46

ReactRails API前端組件

2023-09-21 08:00:00

ChatGPT編程工具

2021-12-03 00:02:01

通訊工具即時

2010-05-24 09:51:37

System Cent

2022-08-30 11:41:53

網絡攻擊木馬

2023-09-15 10:10:05

R 語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品久久久久久久久久久 | 亚洲国产成人精品女人久久久 | 久久成人一区 | 久久免费香蕉视频 | 精品一区二区在线观看 | 国产精品久久久久久久白浊 | 日韩成年人视频在线 | 欧美一区 | 久久久久久看片 | 1204国产成人精品视频 | 精区3d动漫一品二品精区 | 国产一伦一伦一伦 | 日本天堂视频在线观看 | 日本一二三区高清 | 国产精品一区二区视频 | 国产二区精品视频 | 免费三级黄 | 97天天干| 国产精品网页 | 欧美一级二级三级视频 | 伊人91在线 | 久久久久国产一区二区三区四区 | 户外露出一区二区三区 | 欧美精品在线免费 | 黄色日本视频 | 一区二区三区在线播放 | 性欧美xxxx| 一区二区三区国产 | 一区二区三区中文字幕 | 黄页网址在线观看 | 亚洲一区二区视频在线播放 | 精品国产精品一区二区夜夜嗨 | 欧美精| 黄网站免费在线观看 | 91精品一区二区三区久久久久 | 91观看| 精品美女在线观看视频在线观看 | 久久久毛片 | 青青久在线视频 | 91高清在线观看 | 国产日韩一区二区三免费高清 |