chat.ejs 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <div class="chats-container">
  2. <div class="chat-header">
  3. <a href="/" class="action">
  4. <img src="/img/back.png" />
  5. </a>
  6. <span class="chat-title"><%- title %></span>
  7. </div>
  8. <div id="message-list" class="message-list">
  9. <% if (empty) { %>
  10. <p class="empty-label">No messages</p>
  11. <% } %>
  12. <% messages.forEach(function(message) { %>
  13. <div class="message">
  14. <span class="message-username"><%- message.username %></span>
  15. <span class="message-text"><%- message.text %></span>
  16. <span class="message-datetime"><%- message.datetime %></span>
  17. </div>
  18. <% }); %>
  19. </div>
  20. <form onsubmit="return onMessageSubmit(event)" class="input-form">
  21. <input type="text" id="message-input" name="text" placeholder="Enter message..." class="text-input" required />
  22. <input type="submit" value="Send" class="button" />
  23. </form>
  24. </div>
  25. <script>
  26. var lastTimestamp = new Date().toISOString()
  27. var messageList = document.getElementById("message-list")
  28. var messageInput = document.getElementById("message-input")
  29. var timestamps = document.getElementsByClassName("message-datetime")
  30. for (var i = 0; i < timestamps.length; i++) {
  31. var timestamp = timestamps[i]
  32. timestamp.innerText = new Date(timestamp.innerText).toLocaleString()
  33. }
  34. function addMessage(message) {
  35. var container = document.createElement("div")
  36. var nameSpan = document.createElement("span")
  37. var textSpan = document.createElement("span")
  38. var datetimeSpan = document.createElement("span")
  39. container.className = "message"
  40. nameSpan.className = "message-username"
  41. textSpan.className = "message-text"
  42. datetimeSpan.className = "message-datetime"
  43. nameSpan.innerText = message.username
  44. textSpan.innerText = message.text
  45. datetimeSpan.innerText = new Date(message.datetime).toLocaleString()
  46. container.appendChild(nameSpan)
  47. container.appendChild(textSpan)
  48. container.appendChild(datetimeSpan)
  49. messageList.insertBefore(container, messageList.firstChild)
  50. lastTimestamp = message.datetime
  51. }
  52. function onMessageSubmit(event) {
  53. event.preventDefault()
  54. var message = {
  55. username: "<%- username %>",
  56. text: messageInput.value,
  57. datetime: new Date().toISOString()
  58. }
  59. var xhr = new XMLHttpRequest()
  60. xhr.open("POST", "/chat/<%- title %>")
  61. xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8")
  62. xhr.send(JSON.stringify(message))
  63. messageInput.value = ""
  64. return false
  65. }
  66. function pollMessages() {
  67. var data = { timestamp: lastTimestamp }
  68. var xhr = new XMLHttpRequest()
  69. xhr.timeout = 30000
  70. xhr.open("POST", "/poll/<%- chatId %>")
  71. xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8")
  72. xhr.onload = function () {
  73. var response = JSON.parse(xhr.responseText)
  74. for (var i = 0; i < response["messages"].length; i++) {
  75. var message = response["messages"][i]
  76. addMessage(message)
  77. }
  78. pollMessages()
  79. }
  80. xhr.ontimeout = function (e) {
  81. pollMessages()
  82. }
  83. xhr.send(JSON.stringify(data))
  84. }
  85. pollMessages()
  86. </script>