自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

構(gòu)建一個(gè)即時(shí)消息應(yīng)用(九):Conversation頁面

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

[[347198]]

本文是該系列的第八篇。

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

聊天標(biāo)題

 

讓我們從創(chuàng)建 static/pages/conversation-page.js 文件開始,它包含以下內(nèi)容:

  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} 發(fā)起一個(gè) GET 請求,以獲取有關(guān)對話的信息。 如果出現(xiàn)錯(cuò)誤,我們會將其顯示,并重定向回 /。然后我們呈現(xiàn)有關(guān)其他參與者的信息。

對話列表

 

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

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

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

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

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

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

現(xiàn)在,將該列表添加到標(biāo)記中。

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

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

  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 

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

消息表單

 

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

將該表單添加到當(dāng)前標(biāo)記中。

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

將事件監(jiān)聽器附加到 “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。它 從輸入中獲取消息內(nèi)容,并用它對 /api/conversations/{conversationID}/messages 發(fā)出 POST 請求。 然后將新創(chuàng)建的消息添加到列表中。

消息訂閱

為了實(shí)現(xiàn)實(shí)時(shí),我們還將訂閱此頁面中的消息流。

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

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

  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`) 

在這里我們?nèi)匀皇褂眠@個(gè)應(yīng)用的部分來獲取會話 ID。 當(dāng)新消息到達(dá)時(shí),我們首先檢查它是否來自此對話。如果是,我們會將消息條目預(yù)先添加到列表中,并向 /api/conversations/{conversationID}/read_messages 發(fā)起 POST 一個(gè)請求,以更新參與者上次閱讀消息的時(shí)間。


本系列到此結(jié)束。 消息應(yīng)用現(xiàn)在可以運(yùn)行了。

 

 

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2020-10-12 09:20:13

即時(shí)消息Access頁面編程語言

2020-10-16 14:40:20

即時(shí)消息Home頁面編程語言

2020-10-09 12:45:19

創(chuàng)建消息即時(shí)消息編程語言

2019-09-29 15:25:13

CockroachDBGoJavaScript

2020-10-09 15:00:56

實(shí)時(shí)消息編程語言

2019-10-28 20:12:40

OAuthGuard中間件編程語言

2020-03-31 12:21:20

JSON即時(shí)消息編程語言

2020-10-10 20:51:10

即時(shí)消息編程語言

2021-03-25 08:29:33

SpringBootWebSocket即時(shí)消息

2023-08-14 08:01:12

websocket8g用戶

2015-03-18 15:37:19

社交APP場景

2014-10-15 11:01:02

Web應(yīng)用測試應(yīng)用

2018-08-22 17:32:45

2022-02-10 07:03:32

流量應(yīng)用架構(gòu)數(shù)據(jù)交換

2021-07-14 17:39:46

ReactRails API前端組件

2023-09-21 08:00:00

ChatGPT編程工具

2021-12-03 00:02:01

通訊工具即時(shí)

2023-09-15 10:10:05

R 語言

2010-05-24 09:51:37

System Cent

2009-04-28 09:44:31

jQueryAjaxphp
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號