// 1 stage let messageIdSave = 0; let errorText = document.createElement("span"); errorText.style.color = "red"; async function sendMessage(nickName, message) { await jsonPost("http://students.a-level.com.ua:10012", { func: "addMessage", nick: nickName, message: message, }); } sendBtn.onclick = () => { if (nickname.value.length < 3) { errorText.innerText = "Nickname must be at least 3 characters"; errorBox.append(errorText); } else if (message.value.length < 1) { errorText.innerText = "Message must be at least 1 character"; errorBox.append(errorText); } else { errorText.innerText = ""; sendAndCheck(nickname.value, message.value, messageIdSave); } }; // 2, 3 stages async function getMessages(nextMessageId) { let youtubeRE = /http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?‌​[\w\?‌​=]*)?/; let imageRE = /\.(gif|jpg|jpeg|tiff|png)$/i; let object = await jsonPost("http://students.a-level.com.ua:10012", { func: "getMessages", messageId: nextMessageId, }); object.data.map((t) => { let container = document.createElement("div"); container.classList.add("container"); let nickname = document.createElement("span"); nickname.classList.add("nickname"); let message = document.createElement("p"); message.classList.add("message"); nickname.innerText = `${new Date().toLocaleString()} ${t.nick}:`; if (youtubeRE.test(t.message)) { message.innerHTML = ``; } else if (imageRE.test(t.message)) { message.innerHTML = ``; } else { message.innerText = t.message; } container.append(nickname); container.append(message); historyChat.prepend(container); }); messageIdSave = object.nextMessageId; } // 4 stage // setInterval(async () => getMessages(messageIdSave), 4000); // 5 stage async function sendAndCheck(nickName, message, nextMessageId) { await Promise.all([ sendMessage(nickName, message), getNewMessage(nextMessageId), ]); } async function checkLoop() { const delay = (ms) => new Promise((ok) => setTimeout(() => ok(ms), ms)); while (true) { await delay(4000); getMessages(messageIdSave); } } checkLoop(); // 6 stage async function jsonPost(url, data) { let response = await fetch(url, { method: "POST", body: JSON.stringify(data), }); return await response.json(); }