Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
client.js 20.72 KiB
// Global variables
var minPassLength = 2;
var windowDiv;
var welcomeDiv;
var profileDiv;
var url = 'http://' + document.domain + ':5000/myServer/';
var curr_page = "";
var socket;

// source "/Users/lorenzo/OneDrive - Linköpings universitet/Skola/DI3B/TDDD97/virtualenv/bin/activate"


function connectWithSocket() {
    let token = localStorage.getItem("currentUser");
            
    // Changes the view to profile view and loads user info
    displayView();
    setUserDetails("home");

    // Establish web socket
    socket = new WebSocket('ws://' + document.domain + ':5000/myServer/api');

    socket.onopen = function (event) {
        let myEmail = localStorage.getItem("homeEmail");

        // Todo - ändra så att token skickas i header istället
        this.send(JSON.stringify({token: token, email: myEmail}));
        console.log("Nu har jag skickat");
    }

    socket.onmessage = function (event) {
        let response = JSON.parse(event.data);

        console.log("Nu fick jag svar"); 
        switch (response["action"]) {
            case "signOut":

                // If old socket open, close it.
                //socket.close();
                console.log(response);

                // Reset token in the localStorage
                localStorage.setItem("currentUser", "");
                localStorage.setItem("homeEmail", "");
                localStorage.setItem("browseEmail", "");

                // Changes the view to welcome view
                displayView();
                document.getElementById("error").innerHTML = "Signed Out, you signed in elsewhere";
                break;
            case "signIn":
                console.log(response);
                console.log("ja är signed in");
                break;
        } 
    }
}


// - - - - - Init Request Objects - - - - - //

// Sign In Request Object
var signInRequest = new XMLHttpRequest();
signInRequest.onreadystatechange = function() {
    if (this.readyState == 4) {

        let errorMessage = document.getElementById("error");
        if (this.status == 204) {
            let token = this.getResponseHeader("Authorization")
            localStorage.setItem("currentUser", token);
            connectWithSocket();
        }
        else if (this.status == 400) {
            errorMessage.innerHTML = "Error 400: Incorrect format"; 
        }
        else if (this.status == 404) {
            errorMessage.innerHTML = "Error 404: No user with that email exists"; 
        }
        else if (this.status == 401) {
            errorMessage.innerHTML = "Error 401: Incorrect password"; 
        }
        else {
            errorMessage.innerHTML = "Unknown error"; 
        } 
    }
};

// Sign Out Request Object
var signOutRequest = new XMLHttpRequest();
signOutRequest.onreadystatechange = function() {
    if (this.readyState == 4) {
        if (this.status == 204) {

            // Reset token in the localStorage
            localStorage.setItem("currentUser", "");
            localStorage.setItem("homeEmail", "");
            localStorage.setItem("browseEmail", "");

            // Changes the view to welcome view
            displayView();
        }
        else if (this.status == 401) {
            console.log("Error 401: You are not logged in");
            displayView();
        }
        else {
            console.log("Unknown error");
            displayView();
        } 
    }
};

// Sign Up Request Object
var signUpRequest = new XMLHttpRequest();
signUpRequest.onreadystatechange = function () {
    if (this.readyState == 4) {

        let errorMessage = document.getElementById("error");
        if (this.status == 204) {
            errorMessage.innerHTML = "You have signed up";
        }
        else if (this.status == 400) {
            errorMessage.innerHTML = "Error 400: Enter the data in the correct format";
        }
        else if (this.status == 409) {
            errorMessage.innerHTML = "Error 409: User already exists";
        }
        else if (this.status == 500) {
            errorMessage.innerHTML = "Error 500: Error at server side";
            }
        else {
            errorMessage.innerHTML = "Unknown error";
        }
    }
};

// Change Password Request Object
var ChangePassRequest = new XMLHttpRequest();
ChangePassRequest.onreadystatechange = function () {
    if (this.readyState == 4) {

        let errorMessage = document.getElementById("match_error");
        if (this.status == 204) {
            errorMessage.innerHTML = "Password has been changed!";
        }
        else if (this.status == 400) {
            errorMessage.innerHTML = "Error 400: Old password is incorrect or Old/New password has wrong format"
        }
        else if (this.status == 401) {
            errorMessage.innerHTML = "Error 401: You are not logged in"
        }
        else if (this.status == 500) {
            errorMessage.innerHTML = "Error 500: Error at server side";
        }
        else {
            errorMessage.innerHTML = "Unknown error"
        }
        errorMessage.style.display = "block";
    }
};

// Get user data by token Request Object
var dataByTokenRequest = new XMLHttpRequest();
dataByTokenRequest.onreadystatechange = function() {
    if (this.readyState == 4) {
        if (this.status == 200) {
            
            let userDataArray = JSON.parse(this.responseText);

            // Putting the user data we retrieved from server to the corresponding html table
            let userTable = document.getElementById("homeUserInfo");
            userTable.rows[0].cells[1].innerHTML = userDataArray["data"].email;
            userTable.rows[1].cells[1].innerHTML = userDataArray["data"].firstname;
            userTable.rows[2].cells[1].innerHTML = userDataArray["data"].familyname;
            userTable.rows[3].cells[1].innerHTML = userDataArray["data"].gender;
            userTable.rows[4].cells[1].innerHTML = userDataArray["data"].city;
            userTable.rows[5].cells[1].innerHTML = userDataArray["data"].country;

            localStorage.setItem("homeEmail", userDataArray["data"].email);
            reloadWall("home");
        }
        else if (this.status == 401) {
            console.log("Error 401: You are not logged in");
        }
        else if (this.status == 400) {
            console.log("Error 400: Incorrect format");
        }
        else if (this.status == 404) {
            console.log("Error 404: No user with that email exists");
        }
        else {
            console.log("Unknown error");
        }
    }
};

// Get user data by email Request Object
var dataByEmailRequest = new XMLHttpRequest();
dataByEmailRequest.onreadystatechange = function() {
    if (this.readyState == 4) {

        let errorMessage = document.getElementById("searchMessage");
        if (this.status == 200) {
           
            let userDataArray = JSON.parse(this.responseText);

            // Putting the user data we retrieved from server to the corresponding html table
            let userTable = document.getElementById("browseUserInfo");
            userTable.rows[0].cells[1].innerHTML = userDataArray["data"].email;
            userTable.rows[1].cells[1].innerHTML = userDataArray["data"].firstname;
            userTable.rows[2].cells[1].innerHTML = userDataArray["data"].familyname;
            userTable.rows[3].cells[1].innerHTML = userDataArray["data"].gender;
            userTable.rows[4].cells[1].innerHTML = userDataArray["data"].city;
            userTable.rows[5].cells[1].innerHTML = userDataArray["data"].country;

            localStorage.setItem("browseEmail", userDataArray["data"].email);
            errorMessage.iinnerHTML = ""
            reloadWall("browse");
        }
        else {
            if (this.status == 401) {
                errorMessage.innerHTML = "Error 401: You are not loged in"; 
            }
            else if (this.status == 400) {
                errorMessage.innerHTML = "Error 400: Incorrect format"; 
            }
            else if (this.status == 404) {
                errorMessage.innerHTML = "Error 404: No user with that email exists"; 
            }
            else {
                errorMessage.innerHTML = "Unknown error"; 
            } 
            localStorage.setItem("browseEmail", "");
        }
    }
};

// Get Messages By Token Request Object
var messagesByTokenRequest = new XMLHttpRequest();
messagesByTokenRequest.onreadystatechange = function() {
    if (this.readyState == 4) {

        if (this.status == 200) {
           
            let currentWall = JSON.parse(this.responseText);

            // Formating the text before putting to wall
            let complete = "";
            for (let i = 0; i < currentWall.data.length; i++) {
                complete += currentWall.data[i].person_who_posted + ':   ' + currentWall.data[i].message + "</br>";
            }
            document.getElementById('homePostedMessagesDiv').innerHTML = complete;
        }
        else if (this.status == 204) {
            console.log("Success, but no messages to receive");
        }
        else if (this.status == 401) {
            console.log("Error 401: You are not loged in");
        }
        else if (this.status == 400) {
            console.log("Error 400: Incorrect format");
        }
        else if (this.status == 404) {
            console.log("Error 404: No user with that email exists");
        }
        else {
            console.log("Unknown error");
        } 
    }
};

// Get Messages By Email Request Object
var messagesByEmailRequest = new XMLHttpRequest();
messagesByEmailRequest.onreadystatechange = function() {
    if (this.readyState == 4) {

        if (this.status == 200) {
           
            let currentWall = JSON.parse(this.responseText);
            // Fromating the text before putting to wall
            let complete = "";
            for (let i = 0; i < currentWall.data.length; i++) {
                complete += currentWall.data[i].person_who_posted + ':   ' + currentWall.data[i].message + "</br>";
            }
            document.getElementById('browsePostedMessagesDiv').innerHTML = complete;

        }
        else if (this.status == 204) {
            console.log("Success, but no messages to receive");
        }
        else if (this.status == 401) {
            console.log("Error 401: You are not loged in");
        }
        else if (this.status == 400) {
            console.log("Error 400: Incorrect format");
        }
        else if (this.status == 404) {
            console.log("Error 404: No user with that email exists");
        }
        else {
            console.log("Unknown error");
        } 
    }
};

// Post Message Request Object
var postMessageRequest = new XMLHttpRequest();
postMessageRequest.onreadystatechange = function () {
    if (this.readyState == 4) {

        let errorMessage = document.getElementById('searchMessage');
        if (this.status == 204) {   
            console.log('Message posted!')
            errorMessage.innerHTML = "";
            if (curr_page != null && curr_page != "")
                reloadWall(curr_page);
        }
        else if (this.status == 400) {
            errorMessage.innerHTML = "Error 400: Incorrect format";
        }
        else if (this.status == 404) {
            errorMessage.innerHTML = "Error 404: No user selected to write to";
        }
        else if (this.status == 401) {
            errorMessage.innerHTML = "Error 401: You are not loged in";
        }
        else if (this.status == 500) {
            errorMessage.innerHTML = "Error 500: Error at server side";
        }
        else {
            errorMessage.innerHTML = "Unknown error";
        }
    }
};


// - - - - - Init functions - - - - - //

// Function for displaying the right view
displayView = function(){
    if (localStorage.getItem("currentUser") == "")
        windowDiv.innerHTML = welcomeDiv.innerHTML;
    else
        windowDiv.innerHTML = profileDiv.innerHTML;
};


// - - - - - The function when page loads - - - - - //
window.onload = function () {

    // Delete when done - används för att hoppa tillbaka till rtt view under utveckling
    // localStorage.setItem("currentUser", "");
    // localStorage.setItem("homeEmail", "");
    // localStorage.setItem("browseEmail", "");

    // All key/value pairs stored in out localStorage
    // If first time? check this:
    if (localStorage.getItem("homeEmail") == null)
        localStorage.setItem("homeEmail", "");
    if (localStorage.getItem("browseEmail") == null)
        localStorage.setItem("browseEmail", "");
    if (localStorage.getItem("currentUser") == null)
        localStorage.setItem("currentUser", "");
    
    // Initialize div objects (global variables)
    welcomeDiv = document.getElementById("welcomeview");
    profileDiv = document.getElementById("profileview");
    windowDiv = document.getElementById("windowDiv");
    
    if (localStorage.getItem("currentUser") != "") {//if logged in
        connectWithSocket();
    }
    else {
        // Set correct view depending on if someone is signed in or not
        displayView();
    }
};


// Function for setting user details, either for yourself or for some other user
function setUserDetails(who) {

    // "who" could be either home or browse, this way know which info we are displaying and where
    let token = localStorage.getItem("currentUser");
    if (token != null && token != "" ){
        let userTable = document.getElementById(who + "UserInfo");
        let email = localStorage.getItem(who + "Email");

        // Display my own info
        if (who == 'home') {
            // Send request to server about receiving the info
            dataByTokenRequest.open("GET", url + "getDataByToken", true);
            dataByTokenRequest.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
            dataByTokenRequest.setRequestHeader("Authorization", token)
            dataByTokenRequest.send();
        }

        // Display the info about the searched user
        else if (who == 'browse' && email != null && email != "") {
            // Send request to server about receiving the info
            dataByEmailRequest.open("GET", url + "getDataByEmail/" + email, true);
            dataByEmailRequest.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
            dataByEmailRequest.setRequestHeader("Authorization", token)
            dataByEmailRequest.send();
        }
    }
    return false;
}

// - - - - - Sign Up/In/Out - - - - - //

function sign_up() {

    let form = document.getElementById("signup_form");
    let errorMess = document.getElementById("signUpError");
    let user = {
        firstname: form[0].value,
        familyname: form[1].value,
        gender: form[2].value,
        city: form[3].value,
        country: form[4].value,
        email: form[5].value,
        password: form[6].value,
        repeat_password: form[7].value
    };


    // Error checks
    if (user.password.length < minPassLength)
        errorMess.innerHTML = "Password's length is too short";
    else if (user.password != user.repeat_password)
        errorMess.innerHTML = "Passwords does not match";
    else {

        // Sending sign_ou request to "server"
        signUpRequest.open("POST", url + "sign_up", true);
        signUpRequest.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
        signUpRequest.send(JSON.stringify(user));
    }
    return false;
}

function sign_in() {
    let form = document.getElementById("sign_in_form");
    let email = form[0].value;
    let password = form[1].value;
    let errorMess = document.getElementById("error");
  
    // Error checks
    if (password.length < minPassLength)
        errorMess.innerHTML = "Password's length is too short";
    else {

        // Sending sign_in request to "server"
        signInRequest.open("POST", url + "sign_in", true);
        signInRequest.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
        signInRequest.send(JSON.stringify({email: email,password: password}));
    }
    return false;
}

function sign_out(){
    let token = localStorage.getItem("currentUser");

    // Sending sign_out request to "server"
    signOutRequest.open("POST", url + "sign_out", true);
    signOutRequest.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
    signOutRequest.setRequestHeader("Authorization", token)
    signOutRequest.send();

    return false;
}



// - - - - - Changing tabs - - - - - //

function showPage(ourEvent, name) {

    // - - Fixing the tabs - - //
    // Unselect all
    let tabcontent = document.getElementById("tabDiv");
    for (i = 0; i < tabcontent.children.length; i++) {
        tabcontent.children[i].style.backgroundColor = "red";
    }
    // Select only the one we want
    let div = ourEvent.target;
    div.style.backgroundColor = "lightgreen";


    // - - Fixing the content - - //
    // Unselect all
    let allPages = document.getElementsByClassName("tabcontent");
    for (let i = 0; i < allPages.length; i++) {
        allPages[i].style.display = "none";
    }
    // Select only the one we want
    let selected_tab = document.getElementById(name);
    selected_tab.style.display = "block";

    return false;
}



// - - - - - Changing Password - - - - - //

//Function for changing password
function change_password(ourEvent){
    let old_pass = document.getElementById("old_password").value;
    let new_pass = document.getElementById("new_password").value;
    let confirm_pass = document.getElementById("confirm_pass").value;
    let token = localStorage.getItem("currentUser");
    let error_text = document.getElementById("match_error");

    // New password have to be entered twice, otherwise throw error
    if (new_pass.length < minPassLength) {
        error_text.innerHTML = "New password too short";
    }
    else if (new_pass != confirm_pass) {
        error_text.innerHTML = "New password and confirm password does not match";
    }
    else {
        ChangePassRequest.open("PUT", url + "change_password", true);
        ChangePassRequest.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
        ChangePassRequest.setRequestHeader("Authorization", token)
        ChangePassRequest.send(JSON.stringify({old_password:old_pass, new_password:new_pass}));
    }
    return false;
}

// - - - - - Changing the wall - - - - - //

// Submit text button
function updateWall(who){
    // "who" could be either home or browse, this way know which wall to write on 
    let messageToWall = document.getElementById(who + 'Textarea').value;
    let errorMessage = document.getElementById('searchMessage');
    let token = localStorage.getItem("currentUser");
    let email = localStorage.getItem(who + "Email");
    curr_page = who;

    if (email != null && email != "" && token != null && token != "") {

        // Send user's message to the server
        postMessageRequest.open("POST", url + "post", true);
        postMessageRequest.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
        postMessageRequest.setRequestHeader("Authorization", token)
        postMessageRequest.send(JSON.stringify({ email: email, message: messageToWall }));

        errorMessage.innerHTML = "";
    }
    else{
        errorMessage.innerHTML = "No user selected to write to";
    }

    // Clear the text area the user just wrote in
    document.getElementById(who + 'Textarea').value = "";
    return false;
}

// Reload button
function reloadWall(who) {
    // "who" could be either home or browse, this way know which wall to load to 
    let token = localStorage.getItem("currentUser");
    let email = localStorage.getItem(who + "Email");

    // If wanting messages from my own wall
    if (who == 'home') {
        // Send request to server about receiving the info
        messagesByTokenRequest.open("GET", url + "getUserMessageByToken", true);
        messagesByTokenRequest.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
        messagesByTokenRequest.setRequestHeader("Authorization", token)
        messagesByTokenRequest.send();
    }

    // If wanting messages from another's wall
    else if (who == 'browse' && email != null && email != "") {
        // Send request to server about receiving the info
        messagesByEmailRequest.open("GET", url + "getMessagesByEmail/" + email, true);
        messagesByEmailRequest.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
        messagesByEmailRequest.setRequestHeader("Authorization", token)
        messagesByEmailRequest.send();
    }    

    return false;
}

// Changing another's wall
function searchAnotherUser(event){
    let token = localStorage.getItem("currentUser");

    // Reseting the error messages
    document.getElementById('searchMessage').innerHTML = "";

    if(token != "") {

        // Store the searched email in localStorage so that it can be reached in "setUserDetails()"
        let email = event.target["searchInput"].value;
        localStorage.setItem("browseEmail", email);
        setUserDetails("browse");
    }
    return false;
}