main.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. let chatMessageTemplate = document.querySelector("#chat__message-template").content.querySelector(".chat__message-wrap");
  2. let chatMessageBox = document.querySelector(".chat__messages-box");
  3. let chatInputNick = document.querySelector(".chat__input--nick");
  4. let chatInputMessage = document.querySelector(".chat__input--message");
  5. let chatSendButton = document.querySelector(".chat__send-button");
  6. let messageId = 0;
  7. async function jsonPost(url, data) {
  8. const res = await fetch(url, {
  9. method: "POST",
  10. body: JSON.stringify(data)
  11. });
  12. return await res.json();
  13. };
  14. let delay = function(ms) {
  15. return new Promise((resolve, reject) => {
  16. setTimeout(() => resolve(ms), ms);
  17. });
  18. };
  19. let drawAllMessage = async function() { // Отрисовка всех сообщений, функция вызывается один раз и после не используется
  20. let data = await jsonPost("http://students.a-level.com.ua:10012", {func: "getMessages", messageId: 0});
  21. messageId = data["nextMessageId"]; // Получаю id последнего сообщения
  22. for(let item of data["data"]) { // Рисую все сообщения
  23. let chatMessage = chatMessageTemplate.cloneNode(true);
  24. let timespan = new Date(item["timestamp"]);
  25. chatMessage.querySelector(".chat__user-nick").textContent = item["nick"];
  26. chatMessage.querySelector(".chat__user-message").textContent = item["message"];
  27. chatMessage.querySelector(".chat__timespan").textContent = `${timespan.getHours()}:${timespan.getMinutes()}`;
  28. chatMessageBox.appendChild(chatMessage);
  29. chatMessageBox.scrollTo(0, chatMessageBox.scrollHeight);
  30. }
  31. }
  32. drawAllMessage();
  33. async function sendMessage(nick, message) {
  34. let nextMessageId = await jsonPost("http://students.a-level.com.ua:10012", {func: 'addMessage', nick: nick, message: message});
  35. messageId = nextMessageId["nextMessageId"]; // После отправки сообщения переприсваиваю новый id
  36. chatInputMessage.value = ""; // Удаляю все что написал пользователь из поля сообщения после нажатия "Отправить"
  37. }
  38. async function getMessages(data) { // Отрисовка одного последнего сообщения
  39. let chatMessage = chatMessageTemplate.cloneNode(true); // Копирую уже заверстаный в HTML шаблон сообщения в переменную chatMessage
  40. let timespan = new Date(data["data"][0]["timestamp"]);
  41. chatMessage.querySelector(".chat__user-nick").textContent = data["data"][0]["nick"];
  42. chatMessage.querySelector(".chat__user-message").textContent = data["data"][0]["message"];
  43. chatMessage.querySelector(".chat__timespan").textContent = `${timespan.getHours()}:${timespan.getMinutes()}`;
  44. chatMessageBox.appendChild(chatMessage);
  45. chatMessageBox.scrollTo(0, chatMessageBox.scrollHeight); // Скрол в самый низ
  46. }
  47. async function sendAndCheck() {
  48. await sendMessage(chatInputNick.value, chatInputMessage.value);
  49. let data = await jsonPost("http://students.a-level.com.ua:10012", {func: "getMessages", messageId: messageId - 1});
  50. await getMessages(data);
  51. }
  52. async function checkLoop() {
  53. while(true) {
  54. await delay(3000);
  55. let data = await jsonPost("http://students.a-level.com.ua:10012", {func: "getMessages", messageId: messageId});
  56. if(messageId != data["nextMessageId"]) { // Если id не совпадают то было написано новое сообщение
  57. messageId = data["nextMessageId"];
  58. getMessages(data);
  59. }
  60. }
  61. }
  62. checkLoop();
  63. chatSendButton.addEventListener("click", sendAndCheck);