let chatMessageTemplate = document.querySelector("#chat__message-template").content.querySelector(".chat__message-wrap"); let chatMessageBox = document.querySelector(".chat__messages-box"); let chatInputNick = document.querySelector(".chat__input--nick"); let chatInputMessage = document.querySelector(".chat__input--message"); let chatSendButton = document.querySelector(".chat__send-button"); let messageId = 0; async function jsonPost(url, data) { const res = await fetch(url, { method: "POST", body: JSON.stringify(data) }); return await res.json(); }; let delay = function(ms) { return new Promise((resolve, reject) => { setTimeout(() => resolve(ms), ms); }); }; let drawAllMessage = async function() { // Отрисовка всех сообщений, функция вызывается один раз и после не используется let data = await jsonPost("http://students.a-level.com.ua:10012", {func: "getMessages", messageId: 0}); messageId = data["nextMessageId"]; // Получаю id последнего сообщения for(let item of data["data"]) { // Рисую все сообщения let chatMessage = chatMessageTemplate.cloneNode(true); let timespan = new Date(item["timestamp"]); chatMessage.querySelector(".chat__user-nick").textContent = item["nick"]; chatMessage.querySelector(".chat__user-message").textContent = item["message"]; chatMessage.querySelector(".chat__timespan").textContent = `${timespan.getHours()}:${timespan.getMinutes()}`; chatMessageBox.appendChild(chatMessage); chatMessageBox.scrollTo(0, chatMessageBox.scrollHeight); } } drawAllMessage(); async function sendMessage(nick, message) { let nextMessageId = await jsonPost("http://students.a-level.com.ua:10012", {func: 'addMessage', nick: nick, message: message}); messageId = nextMessageId["nextMessageId"]; // После отправки сообщения переприсваиваю новый id chatInputMessage.value = ""; // Удаляю все что написал пользователь из поля сообщения после нажатия "Отправить" } async function getMessages(data) { // Отрисовка одного последнего сообщения let chatMessage = chatMessageTemplate.cloneNode(true); // Копирую уже заверстаный в HTML шаблон сообщения в переменную chatMessage let timespan = new Date(data["data"][0]["timestamp"]); chatMessage.querySelector(".chat__user-nick").textContent = data["data"][0]["nick"]; chatMessage.querySelector(".chat__user-message").textContent = data["data"][0]["message"]; chatMessage.querySelector(".chat__timespan").textContent = `${timespan.getHours()}:${timespan.getMinutes()}`; chatMessageBox.appendChild(chatMessage); chatMessageBox.scrollTo(0, chatMessageBox.scrollHeight); // Скрол в самый низ } async function sendAndCheck() { await sendMessage(chatInputNick.value, chatInputMessage.value); let data = await jsonPost("http://students.a-level.com.ua:10012", {func: "getMessages", messageId: messageId - 1}); await getMessages(data); } async function checkLoop() { while(true) { await delay(3000); let data = await jsonPost("http://students.a-level.com.ua:10012", {func: "getMessages", messageId: messageId}); if(messageId != data["nextMessageId"]) { // Если id не совпадают то было написано новое сообщение messageId = data["nextMessageId"]; getMessages(data); } } } checkLoop(); chatSendButton.addEventListener("click", sendAndCheck);