From 8a2b63b773dddaadf02bec6466666b1fcf557cae Mon Sep 17 00:00:00 2001
From: Adeel Ahmad <adeah090@student.liu.se>
Date: Fri, 10 Mar 2023 12:42:00 +0000
Subject: [PATCH] Upload New File client.js

---
 static/client.js | 628 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 628 insertions(+)
 create mode 100644 static/client.js

diff --git a/static/client.js b/static/client.js
new file mode 100644
index 0000000..c3ff8cc
--- /dev/null
+++ b/static/client.js
@@ -0,0 +1,628 @@
+window.onload = function () {
+  checkUserSignedIn();
+};
+
+function checkUserSignedIn() {
+  let token = window.localStorage.getItem("twidderToken");
+  console.log("checkUserSignedIn token", token);
+
+  if (token) {
+    sendXmlHttpRequest(
+      "GET",
+      "validate_token",
+      validateTokenCallback,
+      null,
+      token
+    );
+    function validateTokenCallback(res) {
+      console.log("validateTokenCallback", { res });
+      if (res.success) {
+        signinSuccess();
+        signInSocket();
+        setProfile();
+        setDrop();
+      } else {
+        signinFailure();
+      }
+    }
+  } else {
+    signinFailure();
+  }
+
+  if (!token) {
+    return false;
+  } else {
+    return true;
+  }
+}
+
+function signInSocket() {
+  let tempUrl = "ws://" + getUrl(true) + "/api";
+  let token = window.localStorage.getItem("twidderToken");
+
+  if ("WebSocket" in window) {
+    console.log("WebSocket", token);
+    if (!token) {
+      console.log("WebSocket token not found");
+      return;
+    }
+    console.log("created new WebSocket");
+    let connection = new WebSocket(tempUrl);
+
+    // When the connection is open, send some data to the server
+    connection.onopen = function () {
+      console.log("Send socket message = ", token);
+      connection.send(token); // Send the message 'Ping' to the server
+    };
+
+    // Log errors
+    connection.onerror = function (error) {
+      console.log("WebSocket Error " + error);
+    };
+    // Log messages from the server
+    connection.onmessage = function (e) {
+      console.log("Message recieved");
+      console.log("Server: " + e.data);
+      let res = JSON.parse(e.data);
+      if (res.success == true) {
+        console.log("res.success == true");
+        signinFailure();
+      }
+    };
+
+    // Logout on close server
+    connection.onclose = function () {
+      console.log("Socket close");
+      connection.close();
+      window.localStorage.removeItem("twidderToken");
+      signinFailure();
+    };
+  } else {
+    alert("WebSocket is not available on your browser.");
+  }
+}
+
+function addEventListenerForWelcomePage() {
+  // adding event for signing and signup
+  const form1 = document.getElementById("form1");
+  form1.addEventListener("submit", signInFromSubmit);
+
+  const form2 = document.getElementById("form2");
+  form2.addEventListener("submit", signUpFromSubmit);
+}
+
+function setBody(myhtml) {
+  document.body.innerHTML = myhtml;
+}
+
+// function to sign in the user
+function signInFromSubmit(event) {
+  event.preventDefault();
+  let password = document.getElementById("signinPassword");
+  let signinsubmitError =
+    document.getElementsByClassName("signinsubmitError")[0];
+  signinsubmitError.innerHTML = "";
+
+  if (password.value.length <= 8) {
+    signinsubmitError.innerHTML =
+      "Password should be at least 8 characters long";
+    return;
+  }
+
+  var data = new FormData();
+  data.append("email", document.getElementById("signinEmail").value);
+  data.append("password", password.value);
+
+  sendXmlHttpRequest("POST", "sign_in", signInCallback, data);
+
+  // function for signIn Callback
+  function signInCallback(res) {
+    if (res.success == false) {
+      signinsubmitError.innerHTML = res.message;
+      return;
+    }
+
+    if (res.success == true) {
+      signinSuccess(res.data);
+      signInSocket();
+      setProfile();
+      setDrop();
+    }
+  }
+}
+
+function signUpFromSubmit(event) {
+  event.preventDefault();
+  let signupsubmitError =
+    document.getElementsByClassName("signupsubmitError")[0];
+  signupsubmitError.innerHTML = "";
+
+  let password = document.getElementById("signupPassword");
+  let repPassword = document.getElementById("signupPasswordRepeat");
+  if (password.value.length <= 8) {
+    signupsubmitError.innerHTML =
+      "Password should be at least 8 characters long";
+    return;
+  }
+
+  if (password.value !== repPassword.value) {
+    signupsubmitError.innerHTML =
+      "Password and repeat password should be same.";
+    return;
+  }
+
+  var data = new FormData();
+  data.append("email", document.getElementById("signupEmail").value);
+  data.append("password", password.value);
+  data.append("firstname", document.getElementById("signupFirstName").value);
+  data.append("familyname", document.getElementById("signupFamilyName").value);
+  data.append("gender", document.getElementById("signupGender").value);
+  data.append("city", document.getElementById("signupCity").value);
+  data.append("country", document.getElementById("signupCountry").value);
+
+  sendXmlHttpRequest("POST", "sign_up", signUpCallback, data);
+
+  function signUpCallback(res) {
+    if (res.success == false) {
+      signupsubmitError.innerHTML = res.message;
+    }
+
+    if (res.success == true) {
+      document.getElementsByClassName("signupsubmitSuccess")[0].innerHTML =
+        res.message;
+    }
+  }
+}
+
+// function to set token and set displays of div
+function signinSuccess(token) {
+  console.log("signinSuccess");
+  if (token) {
+    window.localStorage.setItem("twidderToken", token);
+  }
+  let homeScriptHtml = document.getElementById("homeScript").innerHTML;
+  setBody(homeScriptHtml);
+  addEventListenerForHomeTabs();
+}
+
+function signinFailure() {
+  let welcomeScriptHtml = document.getElementById("welcomeScript").innerHTML;
+  setBody(welcomeScriptHtml);
+  addEventListenerForWelcomePage();
+}
+
+function addEventListenerForHomeTabs() {
+  let tabAnchors = document.getElementsByClassName("tabButton");
+
+  let tabAnchorsEvent = function () {
+    let attribute = this.getAttribute("data-detail");
+
+    // unmarking old tab details
+    let currActiveTabAnchor = document.querySelectorAll(".tabButton.active");
+    currActiveTabAnchor[0].classList.remove("active");
+
+    // marking new tab details
+    this.classList.add("active");
+
+    // hiding old tab details
+    let currActiveTab = document.querySelectorAll(".tabsDetails.active");
+    currActiveTab[0].classList.remove("active");
+
+    // displaying new tab details
+    let clickedTab = document.getElementById(attribute);
+    clickedTab.classList.add("active");
+  };
+
+  for (let i = 0; i < tabAnchors.length; i++) {
+    tabAnchors[i].addEventListener("click", tabAnchorsEvent, false);
+  }
+}
+
+function changePassword() {
+  let errorDiv = document.getElementsByClassName("changePasswordNewError")[0];
+  let successDiv = document.getElementsByClassName(
+    "changePasswordNewSuccess"
+  )[0];
+
+  // removing previous error values
+  errorDiv.innerHTML = "";
+  successDiv.innerHTML = "";
+
+  let oldPassword = document.getElementById("changePasswordOldPassword").value;
+  let newPassword = document.getElementById("changePasswordNewPassword").value;
+  let repPassword = document.getElementById(
+    "changePasswordNewPasswordRepeat"
+  ).value;
+
+  if (oldPassword.length <= 8) {
+    errorDiv.innerHTML = "Old password should be at least 8 characters long";
+    return;
+  }
+
+  if (newPassword.length <= 8) {
+    errorDiv.innerHTML = "New password should be at least 8 characters long";
+    return;
+  }
+
+  if (newPassword !== repPassword) {
+    errorDiv.innerHTML = "Password and repeat password should be same.";
+    return;
+  }
+
+  if (newPassword === oldPassword) {
+    errorDiv.innerHTML = "old password and new password should not be same.";
+    return;
+  }
+
+  let token = window.localStorage.getItem("twidderToken");
+
+  var data = new FormData();
+  data.append("oldPassword", oldPassword);
+  data.append("newPassword", newPassword);
+  sendXmlHttpRequest(
+    "PUT",
+    "change_password",
+    changePasswordCallback,
+    data,
+    token
+  );
+
+  function changePasswordCallback(res) {
+    if (res.success == false) {
+      errorDiv.innerHTML = res.message;
+      return;
+    }
+
+    if (res.success == true) {
+      successDiv.innerHTML = res.message;
+      return;
+    }
+  }
+}
+
+function logoutUser() {
+  let token = window.localStorage.getItem("twidderToken");
+  sendXmlHttpRequest("DELETE", "sign_out", signOutCallback, null, token);
+
+  function signOutCallback(res) {
+    if (res.success == false) {
+      document.getElementsByClassName("changePasswordNewError")[0].innerHTML =
+        res.message;
+      return;
+    }
+
+    if (res.success == true) {
+      window.localStorage.removeItem("twidderToken");
+      signinFailure();
+    }
+  }
+}
+
+function setProfile() {
+  let token = window.localStorage.getItem("twidderToken");
+  if (token) {
+    sendXmlHttpRequest(
+      "GET",
+      "get_user_data_by_token",
+      setProfileCallback,
+      null,
+      token
+    );
+
+    function setProfileCallback(data) {
+      // if data is retrieved successfully
+      if (data.success == true) {
+        let ul = getUserDetailsList(data.data, "tabHomeUserInfoList");
+        document.getElementById("tabHomeUserInfo").append(ul);
+        loadPostMessage();
+      }
+    }
+  } else {
+    console.log("setProfile no token");
+  }
+}
+
+function postMessageToWall() {
+  let postedMessage = document.getElementById("userPostFormTextarea");
+  let postedMessageErr = document.getElementsByClassName(
+    "userPostFormTextareaError"
+  )[0];
+  let postedMessageSuccess = document.getElementsByClassName(
+    "userPostFormTextareaSuccess"
+  )[0];
+
+  postedMessageErr.innerHTML = "";
+  postedMessageSuccess.innerHTML = "";
+
+  if (postedMessage.value.length == 0) {
+    postedMessageErr.innerHTML =
+      "Empty post message, please enter a valid post message.";
+    return;
+  }
+
+  let token = window.localStorage.getItem("twidderToken");
+
+  var data = new FormData();
+  data.append("message", postedMessage.value);
+
+  sendXmlHttpRequest("POST", "post_message", postMessageCallback, data, token);
+
+  function postMessageCallback(res) {
+    if (res.success == true) {
+      postedMessageSuccess.innerHTML = res.message;
+
+      loadPostMessage();
+      postedMessage.value = "";
+      return;
+    }
+    if (res.success == false) {
+      postedMessageErr.innerHTML = res.message;
+      return;
+    }
+  }
+}
+
+function postMessageToUserWall() {
+  // getting all the required data
+  let token = window.localStorage.getItem("twidderToken");
+  let postedMessage = document.getElementById("userPostFormBrosweTextarea");
+  let postedMessageRecipient = document.getElementById("browseUserEmail");
+  let postedMessageErr = document.getElementsByClassName(
+    "userPostFormBrosweTextareaError"
+  )[0];
+  let postedMessageSuccess = document.getElementsByClassName(
+    "userPostFormBrosweTextareaSuccess"
+  )[0];
+
+  // clearing inner html of success and error messages
+  postedMessageErr.innerHTML = "";
+  postedMessageSuccess.innerHTML = "";
+
+  // validating inputs
+  if (postedMessageRecipient.value.length == 0) {
+    postedMessageErr.innerHTML = "Please add reciepient email.";
+    return;
+  }
+
+  if (postedMessage.value.length == 0) {
+    postedMessageErr.innerHTML =
+      "Empty post message, please enter a valid post message.";
+    return;
+  }
+
+  // posting message to user wall
+  var data = new FormData();
+  data.append("email", postedMessageRecipient.value);
+  data.append("message", postedMessage.value);
+  // sending request
+  sendXmlHttpRequest("POST", "post_message", postMessageallback2, data, token);
+
+  function postMessageallback2(res) {
+    if (res.success == true) {
+      postedMessageSuccess.innerHTML = res.message;
+
+      // load Browse User posts
+      var data = new FormData();
+      data.append("email", postedMessageRecipient.value);
+      // ----------------------------------------------------------------
+      sendXmlHttpRequest(
+        "POST",
+        "get_user_messages_by_email",
+        getUserMessages2Callback,
+        data,
+        token
+      );
+
+      function getUserMessages2Callback(res2) {
+        if (res2.success == true) {
+          let ul = getUserPostList(res2.data, "browseUserDetailsPosts");
+          let userPostsParent =
+            document.getElementsByClassName("browseUserPosts")[0];
+          userPostsParent.innerHTML = "";
+          userPostsParent.append(ul);
+        } else if (res2.success == false) {
+          postedMessageErr.innerHTML = res.message;
+          return;
+        }
+
+        postedMessage.value = "";
+        return;
+      }
+    }
+    if (res.success == false) {
+      postedMessageErr.innerHTML = res.message;
+      return;
+    }
+  }
+}
+
+function loadPostMessage(email) {
+  let token = window.localStorage.getItem("twidderToken");
+
+  if (email) {
+    var data = new FormData();
+    data.append("email", email);
+
+    sendXmlHttpRequest(
+      "POST",
+      "get_user_messages_by_email",
+      getUserMessagesCallback,
+      data,
+      token
+    );
+  } else {
+    sendXmlHttpRequest(
+      "GET",
+      "get_user_messages_by_token",
+      getUserMessagesCallback,
+      null,
+      token
+    );
+  }
+
+  // call back function to get User Messages
+  function getUserMessagesCallback(res) {
+    if (res.success == false) {
+      document.getElementsByClassName(
+        "userPostFormTextareaError"
+      )[0].innerHTML = res.message;
+      return;
+    }
+
+    if (res.success == true) {
+      let postedMessageDiv =
+        document.getElementsByClassName("postedMessageList")[0];
+      postedMessageDiv.innerHTML = "";
+
+      let ul = getUserPostList(res.data, "userPostsList");
+      postedMessageDiv.append(ul);
+      return;
+    }
+  }
+}
+
+function browseUser() {
+  // getting basic values
+  let email = document.getElementById("browseUserEmail");
+  let token = window.localStorage.getItem("twidderToken");
+  let browseUserDetails =
+    document.getElementsByClassName("browseUserDetails")[0];
+  let browseUserPosts = document.getElementsByClassName("browseUserPosts")[0];
+
+  let browseUserFormError = document.getElementsByClassName(
+    "browseUserFormError"
+  )[0];
+  browseUserFormError.innerHTML = "";
+
+  var data = new FormData();
+  data.append("email", email.value);
+  sendXmlHttpRequest(
+    "POST",
+    "get_user_data_by_email",
+    browseUserCallback,
+    data,
+    token
+  );
+
+  function browseUserCallback(res) {
+    browseUserDetails.innerHTML = "";
+    browseUserPosts.innerHTML = "";
+
+    if (res.success == false) {
+      browseUserFormError.innerHTML = res.message;
+      return;
+    }
+
+    if (res.success == true) {
+      let ul = getUserDetailsList(res.data, "browseUserDetailsInfo");
+      browseUserDetails.append(ul);
+      data2 = new FormData();
+      data2.append("email", email.value);
+      sendXmlHttpRequest(
+        "POST",
+        "get_user_messages_by_email",
+        browseUserCallback2,
+        data2,
+        token
+      );
+
+      function browseUserCallback2(res) {
+        if (res.success == false) {
+          browseUserFormError.innerHTML = res.message;
+          return;
+        }
+
+        if (res.success == true) {
+          browseUserPosts.innerHTML = "";
+          let ul = getUserPostList(res.data, "browseUserDetailsPosts");
+          browseUserPosts.append(ul);
+        }
+      }
+    }
+  }
+}
+
+function getUserDetailsList(userData, ulId) {
+  let ul = document.createElement("ul");
+  ul.setAttribute("id", ulId);
+
+  for (const [key, value] of Object.entries(userData)) {
+    let li = document.createElement("li");
+    li.innerHTML = `<b> ${key}</b>: ${value} `;
+    ul.appendChild(li);
+  }
+  return ul;
+}
+
+function getUserPostList(data, ulId) {
+  let ul = document.createElement("ul");
+  ul.setAttribute("id", ulId);
+  if (data) {
+    for (let i = 0; i < data.length; i++) {
+      let li = document.createElement("li");
+      li.draggable = true;
+      li.addEventListener("dragstart", (event) => {
+        event.dataTransfer.setData("text/plain", li.textContent);
+      });
+      li.id = i;
+      li.innerHTML = `<b> ${data[i].writer}</b>: ${data[i].content} `;
+      ul.append(li);
+    }
+  }
+  return ul;
+}
+
+function setDrop() {
+  function allowDrop(ev) {
+    ev.preventDefault();
+  }
+  function drop(ev) {
+    const text = ev.dataTransfer.getData("text/plain");
+    wallTextArea.value += text.split(":")[1];
+    ev.preventDefault();
+  }
+  const wallTextArea = document.getElementById("userPostFormTextarea");
+  wallTextArea.ondrop = drop;
+  wallTextArea.ondragover = allowDrop;
+}
+
+// Function to sendXmlHttpRequest to server
+// 3 steps to change
+//  1 use form data and send request function
+//  2 call sendXmlHttpRequest with right parameters
+//  3 create a callbackdunction that does evenything that res would have done
+function sendXmlHttpRequest(
+  type,
+  endpoint,
+  callback,
+  formData = null,
+  token = null
+) {
+  var xhr = new XMLHttpRequest();
+  // xhr.withCredentials = true;
+  // console.log(endpoint, formData, token);
+  xhr.addEventListener("readystatechange", function () {
+    if (this.readyState === 4) {
+      let jsonResponse = JSON.parse(xhr.responseText);
+      callback(jsonResponse);
+    }
+  });
+
+  let myUrl = getUrl() + "/" + endpoint;
+  xhr.open(type, myUrl);
+  if (token) {
+    xhr.setRequestHeader("token", token);
+  }
+
+  xhr.send(formData);
+}
+
+function getUrl(ip = false) {
+  let temp = "http://127.0.0.1:5000";
+
+  if (ip) {
+    tempArr = temp.split("//");
+    return tempArr[1];
+  }
+  return temp;
+}
-- 
GitLab