Browse Source

Async and Promise CHAT

serg155alternate 2 years ago
parent
commit
6832153fbd

+ 1 - 1
Class works/promise/script.js

@@ -52,7 +52,7 @@ function LoginForm(parent = document.body){
                                         inputP.value = '';
                                     };
                                 } 
-        btnCancel.onclick = () =>reject('Error in form data'); 
+        btnCancel.onclick = () => reject('Error in form data'); 
         })
 }
 

+ 18 - 7
HW14 await paradise/index.html

@@ -1,18 +1,29 @@
 <!DOCTYPE html>
-<html lang="en">
+<html>
 
 <head>
-    <meta charset="UTF-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>HW14 Await
-    </title>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <title> Chat </title>
     <link rel="stylesheet" href="style.css">
 </head>
 
 <body>
     <div class="container">
-       
+        <h2>Simple Chat</h2>
+        <div class="wrapper">
+            <input type="text" id='nickname'>
+            <label for="nickname">Enter NickName</label>
+            <div>
+                <input type="text" id='message'>
+                <label for="nickname">Enter your message</label>
+                <button class='btn'>Send message</button>
+            </div>
+        </div>
+        <div id="answer"></div>
+
+
+
+
     </div>
     <script src="script.js"></script>
 </body>

+ 96 - 1
HW14 await paradise/script.js

@@ -1 +1,96 @@
-//Closures and scopes
+//Chat Homework
+
+/* Этапы.
+//Используя функцию jsonPost на адрес http://students.a-level.com.ua:10012 напишите чат-клиент, который:
+Stage 0
+Для поиграться скопируйте в консоль функцию jsonPost (или запустите её с этой страницы) и вызовите её с теми или иными объектами в качестве второго параметра. см. RPC. */
+
+let message = document.querySelector('#message');
+let nick = document.querySelector('#nickname');
+let btn = document.querySelector('.btn');
+
+btn.addEventListener('click', () => {
+     nickName = nickname.value;
+     userMessage = message.value;
+     sendMessage(nickName , userMessage);
+     getMasseges();
+     message.value = '';
+});
+
+
+
+function jsonPost(url, data)
+{
+    return new Promise((resolve, reject) => {
+        var x = new XMLHttpRequest();   
+        x.onerror = () => reject(new Error('jsonPost failed'))
+        //x.setRequestHeader('Content-Type', 'application/json');
+        x.open("POST", url, true);
+        x.send(JSON.stringify(data))
+
+        x.onreadystatechange = () => {
+            if (x.readyState == XMLHttpRequest.DONE && x.status == 200){
+                resolve(JSON.parse(x.responseText))
+            }
+            else if (x.status != 200){
+                reject(new Error('status is not 200'))
+            }
+        }
+    })
+}
+function getMasseges(messageId = 0){
+    jsonPost("http://students.a-level.com.ua:10012", {func: "getMessages", messageId: messageId})
+        .then(res => {
+            res.data.forEach(el=> {
+            readMessage(el)});
+            //console.log(res.nextMessageId);
+            let messageInterval = setInterval((id) => {
+                let prevId = res.nextMessageId;
+                console.log(prevId);
+                console.log(res.nextMessageId);
+                if(prevId < res.nextMessageId){
+                    console.log('get');
+                    getMasseges(res.nextMessageId) 
+                }
+            }  , 1000);
+            }) ;
+}
+
+getMasseges();
+
+
+function sendMessage(nick, message) {
+    jsonPost("http://students.a-level.com.ua:10012", {func: "addMessage", nick: nick, message: message}).then(res => console.log(res));
+    getMasseges();
+    message.value = '';
+    
+}
+
+
+let regYoutube = /http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?‌​[\w\?‌​=]*)?/; //regExp for YouTube video
+
+function readMessage(msg) {
+    let div = document.createElement('div');
+    let spanUserName = document.createElement('span');
+    let spanMessages = document.createElement('span');
+    let idMsg = document.createElement('span');
+    div.style.marginBottom = '10px';
+
+    spanUserName.style.backgroundColor = '#a7cbf8';
+    spanUserName.style.marginBottom = '10px';
+    spanMessages.style.backgroundColor = '#94f094';
+    spanMessages.style.textAlign = 'rigth';
+    spanUserName.innerHTML += `${msg.nick  || 'NONAME'}`;
+    //idMsg.innerText = nextMessageId;
+    /* if (msg.message.match(regYoutube)) {
+        console.log(`https://www.youtube.com/embed/${msg.message.match(regYoutube)[1]}`) // get youtube key
+        spanMessages.innerHTML += `<iframe width="560" height="315" src="https://www.youtube.com/embed/${msg.message.match(regYoutube)[1]}" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>`;
+    } else {
+        spanMessages.innerHTML += `  Write: ${msg.message}`;
+    } */
+    spanMessages.innerHTML += msg.message || 'Send empty message';//*** */
+
+    div.prepend(spanMessages);
+    div.prepend(spanUserName, idMsg);
+    answer.prepend(div)
+}

+ 47 - 0
HW14 await paradise/style.css

@@ -5,6 +5,53 @@
 .container {
     position: relative;
     max-width: 1140px;
+    min-height: 100vh;
     margin: 0 auto;
     padding: 50px;
+    background-color:azure;
 }
+h2 {
+    text-align: center;
+    margin-bottom: 10px;
+}
+.wrapper{
+    padding: 15px;
+    margin: 0 auto;
+    border: 1px solid rgb(144, 148, 90);
+    border-radius: 10px;
+    margin-bottom: 10px;
+    width: 550px;
+}
+input {
+    margin-bottom: 10px;
+    border-radius: 5px;
+    padding: 2px;
+}
+#formContainer {
+    display: flex;
+    margin: 0 auto;
+}
+#answer {
+    margin: 0 auto;
+    padding: 10px;
+    background-color: antiquewhite;
+    border: 2px solid black;
+    border-radius: 10px;
+    width: 600px;
+}
+#message {
+    
+    background-color:rgb(252, 250, 248);
+}
+.btn {
+    height: 20px;
+    padding:0 8px;
+    margin-bottom: 10px;
+    margin-left: 10px;
+    background-color: rgb(243, 219, 167);
+    border-radius: 10px;
+}
+span {
+    padding: 7px;
+    border-radius:10px;
+}