403Webshell
Server IP : 66.29.132.124  /  Your IP : 18.117.254.177
Web Server : LiteSpeed
System : Linux business141.web-hosting.com 4.18.0-553.lve.el8.x86_64 #1 SMP Mon May 27 15:27:34 UTC 2024 x86_64
User : wavevlvu ( 1524)
PHP Version : 7.4.33
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /proc/thread-self/root/proc/self/cwd/js/chatify/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /proc/thread-self/root/proc/self/cwd/js/chatify/code.js
/**
 *-------------------------------------------------------------
 * Global variables
 *-------------------------------------------------------------
 */
var messenger,
    typingTimeout,
    typingNow = 0,
    temporaryMsgId = 0,
    defaultAvatarInSettings = null,
    messengerColor,
    dark_mode;
const messagesContainer = $(".messenger-messagingView .m-body"),
    messengerTitleDefault = $(".messenger-headTitle").text(),
    messageInput = $("#message-form .m-send"),
    auth_id = $("meta[name=url]").attr("data-user"),
    route = $("meta[name=route]").attr("content"),
    url = $("meta[name=url]").attr("content"),
    access_token = $('meta[name="csrf-token"]').attr("content");
// console.log(auth_id);

/**
 *-------------------------------------------------------------
 * Global Templates
 *-------------------------------------------------------------
 */
// Loading svg
function loadingSVG(w_h = "25px", className = null, style = null) {
    return `
 <svg style="${style}" class="loadingSVG ${className}" xmlns="http://www.w3.org/2000/svg" width="${w_h}" height="${w_h}" viewBox="0 0 40 40" stroke="#2196f3">
   <g fill="none" fill-rule="evenodd">
     <g transform="translate(2 2)" stroke-width="3">
       <circle stroke-opacity=".1" cx="18" cy="18" r="18"></circle>
       <path d="M36 18c0-9.94-8.06-18-18-18" transform="rotate(349.311 18 18)">
           <animateTransform attributeName="transform" type="rotate" from="0 18 18" to="360 18 18" dur=".8s" repeatCount="indefinite"></animateTransform>
       </path>
     </g>
   </g>
 </svg>
 `;
}

// loading placeholder for users list item
function listItemLoading(items) {
    let template = "";
    for (let i = 0; i < items; i++) {
        template += `
     <div class="loadingPlaceholder">
       <div class="loadingPlaceholder-wrapper">
         <div class="loadingPlaceholder-body">
         <table class="loadingPlaceholder-header">
           <tr>
             <td style="width: 45px;"><div class="loadingPlaceholder-avatar"></div></td>
             <td>
               <div class="loadingPlaceholder-name"></div>
                   <div class="loadingPlaceholder-date"></div>
             </td>
           </tr>
         </table>
         </div>
       </div>
   </div>
     `;
    }
    return template;
}

// loading placeholder for avatars
function avatarLoading(items) {
    let template = "";
    for (let i = 0; i < items; i++) {
        template += `
     <div class="loadingPlaceholder">
     <div class="loadingPlaceholder-wrapper">
         <div class="loadingPlaceholder-body">
             <table class="loadingPlaceholder-header">
                 <tr>
                     <td style="width: 45px;">
                         <div class="loadingPlaceholder-avatar" style="margin: 2px;"></div>
                     </td>
                 </tr>
             </table>
         </div>
     </div>
     </div>
     `;
    }
    return template;
}

// While sending a message, show this temporary message card.
function sendigCard(message, id) {
    return (
        `
 <div class="message-card mc-sender" data-id="` +
        id +
        `">
     <p>` +
        message +
        `<sub><span class="far fa-clock"></span></sub></p>
 </div>
 `
    );
}
// upload image preview card.
function attachmentTemplate(fileType, fileName, imgURL = null) {
    if (fileType != "image") {
        return (
            `
     <div class="attachment-preview">
         <span class="fas fa-times cancel"></span>
         <p style="padding:0px 30px;"><span class="fas fa-file"></span> ` +
            fileName +
            `</p>
     </div>
     `
        );
    } else {
        return (
            `
     <div class="attachment-preview">
         <span class="fas fa-times cancel"></span>
         <div class="image-file chat-image" style="background-image: url('` +
            imgURL +
            `');"></div>
         <p><span class="fas fa-file-image"></span> ` +
            fileName +
            `</p>
     </div>
     `
        );
    }
}

// Active Status Circle
function activeStatusCircle() {
    return `<span class="activeStatus"></span>`;
}

/**
 *-------------------------------------------------------------
 * Css Media Queries [For responsive design]
 *-------------------------------------------------------------
 */
$(window).resize(function() {
    cssMediaQueries();
});
function cssMediaQueries() {
    if (window.matchMedia("(min-width: 980px)").matches) {
        $(".messenger-listView").removeAttr("style");
    }
    if (window.matchMedia("(max-width: 980px)").matches) {
        $("body")
            .find(".messenger-list-item")
            .find("tr[data-action]")
            .attr("data-action", "1");
        $("body")
            .find(".favorite-list-item")
            .find("div")
            .attr("data-action", "1");
    } else {
        $("body")
            .find(".messenger-list-item")
            .find("tr[data-action]")
            .attr("data-action", "0");
        $("body")
            .find(".favorite-list-item")
            .find("div")
            .attr("data-action", "0");
    }
}

/**
 *-------------------------------------------------------------
 * App Modal
 *-------------------------------------------------------------
 */
let app_modal = function({
                             show = true,
                             name,
                             data = 0,
                             buttons = true,
                             header = null,
                             body = null,
                         }) {
    const modal = $(".app-modal[data-name=" + name + "]");
    // header
    header ? modal.find(".app-modal-header").html(header) : "";

    // body
    body ? modal.find(".app-modal-body").html(body) : "";

    // buttons
    buttons == true
        ? modal.find(".app-modal-footer").show()
        : modal.find(".app-modal-footer").hide();

    // show / hide
    if (show == true) {
        modal.show();
        $(".app-modal-card[data-name=" + name + "]").addClass("app-show-modal");
        $(".app-modal-card[data-name=" + name + "]").attr("data-modal", data);
    } else {
        modal.hide();
        $(".app-modal-card[data-name=" + name + "]").removeClass("app-show-modal");
        $(".app-modal-card[data-name=" + name + "]").attr("data-modal", data);
    }
};

/**
 *-------------------------------------------------------------
 * Slide to bottom on [action] - e.g. [message received, sent, loaded]
 *-------------------------------------------------------------
 */
function scrollBottom(container) {
    $(container)
        .stop()
        .animate({
            scrollTop: $(container)[0].scrollHeight,
        });
}

/**
 *-------------------------------------------------------------
 * click and drag to scroll - function
 *-------------------------------------------------------------
 */
function hScroller(scroller) {
    const slider = document.querySelector(scroller);
    let isDown = false;
    let startX;
    let scrollLeft;

    slider.addEventListener("mousedown", (e) => {
        isDown = true;
        startX = e.pageX - slider.offsetLeft;
        scrollLeft = slider.scrollLeft;
    });
    slider.addEventListener("mouseleave", () => {
        isDown = false;
    });
    slider.addEventListener("mouseup", () => {
        isDown = false;
    });
    slider.addEventListener("mousemove", (e) => {
        if (!isDown) return;
        e.preventDefault();
        const x = e.pageX - slider.offsetLeft;
        const walk = (x - startX) * 1;
        slider.scrollLeft = scrollLeft - walk;
    });
}

/**
 *-------------------------------------------------------------
 * Disable/enable message form fields, messaging container...
 * on load info or if needed elsewhere.
 *
 * Default : true
 *-------------------------------------------------------------
 */
function disableOnLoad(action = true) {
    if (action == true) {
        // hide star button
        $(".add-to-favorite").hide();
        // hide send card
        $(".messenger-sendCard").hide();
        // add loading opacity to messages container
        messagesContainer.css("opacity", ".5");
        // disable message form fields
        messageInput.attr("readonly", "readonly");
        $("#message-form button").attr("disabled", "disabled");
        $(".upload-attachment").attr("disabled", "disabled");
    } else {
        // show star button
        if (messenger.split("_")[1] != auth_id) {
            $(".add-to-favorite").show();
        }
        // show send card
        $(".messenger-sendCard").show();
        // remove loading opacity to messages container
        messagesContainer.css("opacity", "1");
        // enable message form fields
        messageInput.removeAttr("readonly");
        $("#message-form button").removeAttr("disabled");
        $(".upload-attachment").removeAttr("disabled");
    }
}

/**
 *-------------------------------------------------------------
 * Error message card
 *-------------------------------------------------------------
 */
function errorMessageCard(id) {
    messagesContainer
        .find(".message-card[data-id=" + id + "]")
        .addClass("mc-error");
    messagesContainer
        .find(".message-card[data-id=" + id + "]")
        .find("svg.loadingSVG")
        .remove();
    messagesContainer
        .find(".message-card[data-id=" + id + "] p")
        .prepend('<span class="fas fa-exclamation-triangle"></span>');
}

/**
 *-------------------------------------------------------------
 * Fetch id data (user/group) and update the view
 *-------------------------------------------------------------
 */
function IDinfo(id, type) {
    // clear temporary message id
    temporaryMsgId = 0;
    // clear typing now
    typingNow = 0;
    // show loading bar
    NProgress.start();
    // disable message form
    disableOnLoad();
    if (messenger != 0) {
        // get shared photos
        getSharedPhotos(id);
        // Get info
        $.ajax({
            url: url + "/idInfo",
            method: "POST",
            data: { _token: access_token, id: id, type: type },
            dataType: "JSON",
            success: (data) => {
                // avatar photo
                $(".messenger-infoView")
                    .find(".avatar")
                    .css("background-image", 'url("' + data.user_avatar + '")');
                $(".header-avatar").css(
                    "background-image",
                    'url("' + data.user_avatar + '")'
                );
                // Show shared and actions
                $(".messenger-infoView-btns .delete-conversation").show();
                $(".messenger-infoView-shared").show();
                // fetch messages
                fetchMessages(id, type);
                // focus on messaging input
                messageInput.focus();
                // update info in view
                $(".messenger-infoView .info-name").html(data.fetch.name);
                $(".m-header-messaging .user-name").html(data.fetch.name);
                // Star status
                data.favorite > 0
                    ? $(".add-to-favorite").addClass("favorite")
                    : $(".add-to-favorite").removeClass("favorite");
                // form reset and focus
                $("#message-form").trigger("reset");
                cancelAttachment();
                messageInput.focus();
            },
            error: () => {
                console.error("Error, check server response!");
                // remove loading bar
                NProgress.done();
                NProgress.remove();
            },
        });
    } else {
        // remove loading bar
        NProgress.done();
        NProgress.remove();
    }
}

/**
 *-------------------------------------------------------------
 * Send message function
 *-------------------------------------------------------------
 */
function sendMessage() {
    temporaryMsgId += 1;
    let tempID = "temp_" + temporaryMsgId;
    let hasFile = $(".upload-attachment").val() ? true : false;

    if ($.trim(messageInput.val()).length > 0 || hasFile) {
        const formData = new FormData($("#message-form")[0]);
        formData.append("id", messenger.split("_")[1]);
        formData.append("type", messenger.split("_")[0]);
        formData.append("temporaryMsgId", tempID);
        formData.append("_token", access_token);
        $.ajax({
            url: $("#message-form").attr("action"),
            method: "POST",
            data: formData,
            dataType: "JSON",
            processData: false,
            contentType: false,
            beforeSend: () => {
                // remove message hint
                $(".messages")
                    .find(".message-hint")
                    .remove();
                // append message
                hasFile
                    ? messagesContainer
                        .find(".messages")
                        .append(
                            sendigCard(
                                messageInput.text() + "\n" + loadingSVG("28px"),
                                tempID
                            )
                        )
                    : messagesContainer
                        .find(".messages")
                        .append(sendigCard(messageInput.text(), tempID));
                // scroll to bottom
                scrollBottom(messagesContainer);
                messageInput.css({ height: "42px" });
                // form reset and focus
                $("#message-form").trigger("reset");
                cancelAttachment();
                messageInput.focus();
            },
            success: (data) => {
                console.log(data.tempID);
                if (data.error > 0) {
                    // message card error status
                    errorMessageCard(tempID);
                    console.error(data.error_msg);
                } else {
                    // update contact item
                    updateContatctItem(messenger.split("_")[1]);
                    messagesContainer.find('.mc-sender[data-id="sending"]').remove();
                    // get message before the sending one [temporary]
                    messagesContainer
                        .find(".message-card[data-id=" + data.tempID + "]")
                        .before(data.message);
                    // delete the temporary one
                    messagesContainer
                        .find(".message-card[data-id=" + data.tempID + "]")
                        .remove();
                    // scroll to bottom
                    scrollBottom(messagesContainer);
                    // send contact item updates
                    sendContactItemUpdates(true);
                }
            },
            error: () => {
                // message card error status
                errorMessageCard(tempID);
                // error log
                console.error(
                    "Failed sending the message! Please, check your server response"
                );
            },
        });
    }
    return false;
}

/**
 *-------------------------------------------------------------
 * Fetch messages from database
 *-------------------------------------------------------------
 */
function fetchMessages(id, type) {
    if (messenger != 0) {
        $.ajax({
            url: url + "/fetchMessages",
            method: "POST",
            data: { _token: access_token, id: id, type: type },
            dataType: "JSON",
            success: (data) => {
                // Enable message form if messenger not = 0; means if data is valid
                if (messenger != 0) {
                    disableOnLoad(false);
                }
                messagesContainer.find(".messages").html(data.messages);
                // scroll to bottom
                scrollBottom(messagesContainer);
                // remove loading bar
                NProgress.done();
                NProgress.remove();

                // trigger seen event
                makeSeen(true);
            },
            error: () => {
                // remove loading bar
                NProgress.done();
                NProgress.remove();
                console.error("Failed to fetch messages! check your server response.");
            },
        });
    }
}

/**
 *-------------------------------------------------------------
 * Cancel file attached in the message.
 *-------------------------------------------------------------
 */
function cancelAttachment() {
    $(".messenger-sendCard")
        .find(".attachment-preview")
        .remove();
    $(".upload-attachment").replaceWith(
        $(".upload-attachment")
            .val("")
            .clone(true)
    );
}

/**
 *-------------------------------------------------------------
 * Cancel updating avatar in settings
 *-------------------------------------------------------------
 */
function cancelUpdatingAvatar() {
    $(".upload-avatar-preview").css("background-image", defaultAvatarInSettings);
    $(".upload-avatar").replaceWith(
        $(".upload-avatar")
            .val("")
            .clone(true)
    );
}

/**
 *-------------------------------------------------------------
 * Pusher channels and event listening..
 *-------------------------------------------------------------
 */

// subscribe to the channel
var channel = pusher.subscribe("private-chatify");

// Listen to messages, and append if data received
channel.bind("messaging", function(data) {
    if (data.from_id == messenger.split("_")[1] && data.to_id == auth_id) {
        $(".messages")
            .find(".message-hint")
            .remove();
        messagesContainer.find(".messages").append(data.message);
        scrollBottom(messagesContainer);
        makeSeen(true);
        // remove unseen counter for the user from the contacts list
        $(".messenger-list-item[data-contact=" + messenger.split("_")[1] + "]")
            .find("tr>td>b")
            .remove();
    }
});

// listen to typing indicator
channel.bind("client-typing", function(data) {
    if (data.from_id == messenger.split("_")[1] && data.to_id == auth_id) {
        data.typing == true
            ? messagesContainer.find(".typing-indicator").show()
            : messagesContainer.find(".typing-indicator").hide();
    }
    // scroll to bottom
    scrollBottom(messagesContainer);
});

// listen to seen event
channel.bind("client-seen", function(data) {
    if (data.from_id == messenger.split("_")[1] && data.to_id == auth_id) {
        if (data.seen == true) {
            $(".message-time")
                .find(".fa-check")
                .before('<span class="fas fa-check-double seen"></span> ');
            $(".message-time")
                .find(".fa-check")
                .remove();
            console.info("[seen] triggered!");
        } else {
            console.error("[seen] event not triggered!");
        }
    }
});

// listen to contact item updates event
channel.bind("client-contactItem", function(data) {
    if (data.update_for == auth_id) {
        data.updating == true
            ? updateContatctItem(data.update_to)
            : console.error("[Contact Item updates] Updating failed!");
    }
});

// -------------------------------------
// presence channel [User Active Status]
var activeStatusChannel = pusher.subscribe("presence-activeStatus");

// Joined
activeStatusChannel.bind("pusher:member_added", function(member) {
    setActiveStatus(1, member.id);
    $(".messenger-list-item[data-contact=" + member.id + "]")
        .find(".activeStatus")
        .remove();
    $(".messenger-list-item[data-contact=" + member.id + "]")
        .find(".avatar")
        .before(activeStatusCircle());
});

// Leaved
activeStatusChannel.bind("pusher:member_removed", function(member) {
    setActiveStatus(0, member.id);
    $(".messenger-list-item[data-contact=" + member.id + "]")
        .find(".activeStatus")
        .remove();
});

/**
 *-------------------------------------------------------------
 * Trigger typing event
 *-------------------------------------------------------------
 */
function isTyping(status) {
    return channel.trigger("client-typing", {
        from_id: auth_id, // Me
        to_id: messenger.split("_")[1], // Messenger
        typing: status,
    });
}

/**
 *-------------------------------------------------------------
 * Trigger seen event
 *-------------------------------------------------------------
 */
function makeSeen(status) {
    // remove unseen counter for the user from the contacts list
    $(".messenger-list-item[data-contact=" + messenger.split("_")[1] + "]")
        .find("tr>td>b")
        .remove();
    // seen
    $.ajax({
        url: url + "/makeSeen",
        method: "POST",
        data: { _token: access_token, id: messenger.split("_")[1] },
        dataType: "JSON",
        success: (data) => {
            console.log("[seen] Messages seen - " + messenger.split("_")[1]);
        },
    });
    return channel.trigger("client-seen", {
        from_id: auth_id, // Me
        to_id: messenger.split("_")[1], // Messenger
        seen: status,
    });
}

/**
 *-------------------------------------------------------------
 * Trigger contact item updates
 *-------------------------------------------------------------
 */
function sendContactItemUpdates(status) {
    return channel.trigger("client-contactItem", {
        update_for: messenger.split("_")[1], // Messenger
        update_to: auth_id, // Me
        updating: status,
    });
}

/**
 *-------------------------------------------------------------
 * Check internet connection using pusher states
 *-------------------------------------------------------------
 */
function checkInternet(state, selector) {
    let net_errs = 0;
    const messengerTitle = $(".messenger-headTitle");
    switch (state) {
        case "connected":
            if (net_errs < 1) {
                messengerTitle.text(messengerTitleDefault);
                selector.addClass("successBG-rgba");
                selector.find("span").hide();
                selector.slideDown("fast", function() {
                    selector.find(".ic-connected").show();
                });
                setTimeout(function() {
                    $(".internet-connection").slideUp("fast");
                }, 3000);
            }
            break;
        case "connecting":
            messengerTitle.text($(".ic-connecting").text());
            selector.removeClass("successBG-rgba");
            selector.find("span").hide();
            selector.slideDown("fast", function() {
                selector.find(".ic-connecting").show();
            });
            net_errs = 1;
            break;
        // Not connected
        default:
            messengerTitle.text($(".ic-noInternet").text());
            selector.removeClass("successBG-rgba");
            selector.find("span").hide();
            selector.slideDown("fast", function() {
                selector.find(".ic-noInternet").show();
            });
            net_errs = 1;
            break;
    }
}

/**
 *-------------------------------------------------------------
 * Get contacts
 *-------------------------------------------------------------
 */
function getContacts(user_id) {
    if(typeof user_id == 'undefined') user_id = '';
    $(".listOfContacts").html(listItemLoading(4));
    $.ajax({
        url: url + '/getContacts?user_id='+user_id,
        method: "POST",
        data: { _token: access_token, messenger_id: messenger.split("_")[1] },
        dataType: "JSON",
        success: (data) => {
            $(".listOfContacts").html("");
            $(".listOfContacts").html(data.contacts);
            // update data-action required with [responsive design]
            cssMediaQueries();
            if(user_id){
                $('.messenger-list-item[data-contact='+user_id+']').trigger('click');
                // messenger = 'user_'+user_id;
                // IDinfo(user_id,'user');
            }
        },
        error: () => {
            console.error("Server error, check your response");
        },
    });
}

/**
 *-------------------------------------------------------------
 * Update contact item
 *-------------------------------------------------------------
 */
function updateContatctItem(user_id) {
    if (user_id != auth_id) {
        let listItem = $("body")
            .find(".listOfContacts")
            .find(".messenger-list-item[data-contact=" + user_id + "]");
        $.ajax({
            url: url + "/updateContacts",
            method: "POST",
            data: {
                _token: access_token,
                user_id: user_id,
                messenger_id: messenger.split("_")[1],
            },
            dataType: "JSON",
            success: (data) => {
                listItem.remove();
                $(".listOfContacts").prepend(data.contactItem);
                // update data-action required with [responsive design]
                cssMediaQueries();
            },
            error: () => {
                console.error("Server error, check your response");
            },
        });
    }
}

/**
 *-------------------------------------------------------------
 * Star
 *-------------------------------------------------------------
 */

function star(user_id) {
    console.log(messenger);
    if (messenger.split("_")[1] != auth_id) {
        $.ajax({
            url: url + "/star",
            method: "POST",
            data: { _token: access_token, user_id: user_id },
            dataType: "JSON",
            success: (data) => {
                data.status > 0
                    ? $(".add-to-favorite").addClass("favorite")
                    : $(".add-to-favorite").removeClass("favorite");
            },
            error: () => {
                console.error("Server error, check your response");
            },
        });
    }
}

/**
 *-------------------------------------------------------------
 * Get favorite list
 *-------------------------------------------------------------
 */
function getFavoritesList() {
    $(".messenger-favorites").html(avatarLoading(4));
    $.ajax({
        url: url + "/favorites",
        method: "POST",
        data: { _token: access_token },
        dataType: "JSON",
        success: (data) => {
            if (data.count > 0) {
                $(".favorites-section").show();
                $(".messenger-favorites").html(data.favorites);
            } else {
                $(".favorites-section").hide();
            }
            // update data-action required with [responsive design]
            cssMediaQueries();
        },
        error: () => {
            console.error("Server error, check your response");
        },
    });
}

/**
 *-------------------------------------------------------------
 * Get shared photos
 *-------------------------------------------------------------
 */
function getSharedPhotos(user_id) {
    $.ajax({
        url: url + "/shared",
        method: "POST",
        data: { _token: access_token, user_id: user_id },
        dataType: "JSON",
        success: (data) => {
            $(".shared-photos-list").html(data.shared);
        },
        error: () => {
            console.error("Server error, check your response");
        },
    });
}

/**
 *-------------------------------------------------------------
 * Search in messenger
 *-------------------------------------------------------------
 */
function messengerSearch(input) {
    $.ajax({
        url: url + "/search",
        method: "POST",
        data: { _token: access_token, input: input },
        dataType: "JSON",
        beforeSend: () => {
            $(".search-records").html(listItemLoading(4));
        },
        success: (data) => {
            $(".search-records")
                .find("svg")
                .remove();
            data.addData == "append"
                ? $(".search-records").append(data.records)
                : $(".search-records").html(data.records);
            // update data-action required with [responsive design]
            cssMediaQueries();
        },
        error: () => {
            console.error("Server error, check your response");
        },
    });
}

/**
 *-------------------------------------------------------------
 * Delete Conversation
 *-------------------------------------------------------------
 */
function deleteConversation(id) {
    $.ajax({
        url: url + "/deleteConversation",
        method: "POST",
        data: { _token: access_token, id: id },
        dataType: "JSON",
        beforeSend: () => {
            // hide delete modal
            app_modal({
                show: false,
                name: "delete",
            });
            // Show waiting alert modal
            app_modal({
                show: true,
                name: "alert",
                buttons: false,
                body: loadingSVG("32px", null, "margin:auto"),
            });
        },
        success: (data) => {
            // delete contact from the list
            $(".listOfContacts")
                .find(".messenger-list-item[data-contact=" + id + "]")
                .remove();
            // refresh info
            IDinfo(id, messenger.split("_")[0]);

            data.deleted ? "" : console.error("Error occured!");

            // Hide waiting alert modal
            app_modal({
                show: false,
                name: "alert",
                buttons: true,
                body: "",
            });
        },
        error: () => {
            console.error("Server error, check your response");
        },
    });
}

function updateSettings() {
    const formData = new FormData($("#update-settings")[0]);
    if (messengerColor) {
        formData.append("messengerColor", messengerColor);
    }
    if (dark_mode) {
        formData.append("dark_mode", dark_mode);
    }
    $.ajax({
        url: url + "/updateSettings",
        method: "POST",
        data: formData,
        dataType: "JSON",
        processData: false,
        contentType: false,
        beforeSend: () => {
            // close settings modal
            app_modal({
                show: false,
                name: "settings",
            });
            // Show waiting alert modal
            app_modal({
                show: true,
                name: "alert",
                buttons: false,
                body: loadingSVG("32px", null, "margin:auto"),
            });
        },
        success: (data) => {
            if (data.error) {
                // Show error message in alert modal
                app_modal({
                    show: true,
                    name: "alert",
                    buttons: true,
                    body: data.msg,
                });
            } else {
                // Hide alert modal
                app_modal({
                    show: false,
                    name: "alert",
                    buttons: true,
                    body: "",
                });

                // reload the page
                location.reload(true);
            }
        },
        error: () => {
            console.error("Server error, check your response");
        },
    });
}

/**
 *-------------------------------------------------------------
 * Set Active status
 *-------------------------------------------------------------
 */
function setActiveStatus(status, user_id) {
    $.ajax({
        url: url + "/setActiveStatus",
        method: "POST",
        data: { _token: access_token, user_id: user_id, status: status },
        dataType: "JSON",
        success: (data) => {
            // Nothing to do
        },
        error: () => {
            console.error("Server error, check your response");
        },
    });
}

/**
 *-------------------------------------------------------------
 * On DOM ready
 *-------------------------------------------------------------
 */
$(document).ready(function() {
    // get contacts list
    getContacts(window.tmp_user_id);

    // get contacts list
    getFavoritesList();

    // Clear typing timeout
    clearTimeout(typingTimeout);

    // NProgress configurations
    NProgress.configure({ showSpinner: false, minimum: 0.7, speed: 500 });

    // make message input autosize.
    autosize($(".m-send"));

    // check if pusher has access to the channel [Internet status]
    pusher.connection.bind("state_change", function(states) {
        let selector = $(".internet-connection");
        checkInternet(states.current, selector);
        // listening for pusher:subscription_succeeded
        channel.bind("pusher:subscription_succeeded", function() {
            // On connection state change [Updating] and get [info & msgs]
            IDinfo(messenger.split("_")[1], messenger.split("_")[0]);
        });
    });

    // tabs on click, show/hide...
    $(".messenger-listView-tabs a").on("click", function() {
        var dataView = $(this).attr("data-view");
        $(".messenger-listView-tabs a").removeClass("active-tab");
        $(this).addClass("active-tab");
        $(".messenger-tab").hide();
        $(".messenger-tab[data-view=" + dataView + "]").show();
    });

    // set item active on click
    $("body").on("click", ".messenger-list-item", function() {
        $(".messenger-list-item").removeClass("m-list-active");
        $(this).addClass("m-list-active");
    });

    // show info side button
    $(".messenger-infoView nav a , .show-infoSide").on("click", function() {
        $(".messenger-infoView").toggle();
    });

    // make favorites card dragable on click to slide.
    hScroller(".messenger-favorites");

    // click action for list item [user/group]
    $("body").on("click", ".messenger-list-item", function() {
        if (
            $(this)
                .find("tr[data-action]")
                .attr("data-action") == "1"
        ) {
            $(".messenger-listView").hide();
        }
        messenger = $(this)
            .find("p[data-id]")
            .attr("data-id");
        IDinfo(messenger.split("_")[1], messenger.split("_")[0]);
    });

    // click action for favorite button
    $("body").on("click", ".favorite-list-item", function() {
        if (
            $(this)
                .find("div")
                .attr("data-action") == "1"
        ) {
            $(".messenger-listView").hide();
        }
        messenger =
            "user_" +
            $(this)
                .find("div.avatar")
                .attr("data-id");
        IDinfo(messenger.split("_")[1], messenger.split("_")[0]);
    });

    // list view buttons
    $(".listView-x").on("click", function() {
        $(".messenger-listView").hide();
    });
    $(".show-listView").on("click", function() {
        $(".messenger-listView").show();
    });

    // click action for [add to favorite] button.
    $(".add-to-favorite").on("click", function() {
        star(messenger.split("_")[1]);
    });

    // calling Css Media Queries
    cssMediaQueries();

    // message form on submit.
    $("#message-form").on("submit", (e) => {
        e.preventDefault();
        sendMessage();
    });

    // message input on keyup [Enter to send, Enter+Shift for new line]
    $("#message-form .m-send").on("keyup", (e) => {
        // if enter key pressed.
        if (e.which == 13 || e.keyCode == 13) {
            // if shift + enter key pressed, do nothing (new line).
            // if only enter key pressed, send message.
            if (!e.shiftKey) {
                triggered = isTyping(false);
                sendMessage();
            }
        }
    });

    // On [upload attachment] input change, show a preview of the image/file.
    $("body").on("change", ".upload-attachment", (e) => {
        let file = e.target.files[0];
        if (!attachmentValidate(file)) return false;
        let reader = new FileReader();
        let sendCard = $(".messenger-sendCard");
        reader.readAsDataURL(file);
        reader.addEventListener("loadstart", (e) => {
            $("#message-form").before(loadingSVG());
        });
        reader.addEventListener("load", (e) => {
            $(".messenger-sendCard")
                .find(".loadingSVG")
                .remove();
            if (!file.type.match("image.*")) {
                // if the file not image
                sendCard.find(".attachment-preview").remove(); // older one
                sendCard.prepend(attachmentTemplate("file", file.name));
            } else {
                // if the file is an image
                sendCard.find(".attachment-preview").remove(); // older one
                sendCard.prepend(
                    attachmentTemplate("image", file.name, e.target.result)
                );
            }
        });
    });

    function attachmentValidate(file) {
        const fileElement = $(".upload-attachment");
        const allowedExtensions = [
                "jpg",
                "jpeg",
                "png",
                "gif",
                "zip",
                "rar",
                "txt",
            ],
            sizeLimit = 5000000; // 5 megabyte
        const { name: fileName, size: fileSize } = file;
        const fileExtension = fileName.split(".").pop();
        if (!allowedExtensions.includes(fileExtension)) {
            alert("file type not allowed");
            fileElement.val("");
            return false;
        }
        // Validate file size.
        if (fileSize > sizeLimit) {
            alert("Please select file size less than 5 MiB");
            return false;
        }
        return true;
    }

    // Attachment preview cancel button.
    $("body").on("click", ".attachment-preview .cancel", () => {
        cancelAttachment();
    });

    // typing indicator on [input] keyDown
    $("#message-form .m-send").on("keydown", () => {
        if (typingNow < 1) {
            // Trigger typing
            let triggered = isTyping(true);
            triggered
                ? console.info("[+] Triggered")
                : console.error("[+] Not triggered");
            // Typing now
            typingNow = 1;
        }
        // Clear typing timeout
        clearTimeout(typingTimeout);
        // Typing timeout
        typingTimeout = setTimeout(function() {
            triggered = isTyping(false);
            triggered
                ? console.info("[-] Triggered")
                : console.error("[-] Not triggered");
            // Clear typing now
            typingNow = 0;
        }, 1000);
    });

    // Image modal
    $("body").on("click", ".chat-image", function() {
        let src = $(this)
            .css("background-image")
            .split(/"/)[1];
        $("#imageModalBox").show();
        $("#imageModalBoxSrc").attr("src", src);
    });
    $(".imageModal-close").on("click", function() {
        $("#imageModalBox").hide();
    });

    // Search input on focus
    $(".messenger-search").on("focus", function() {
        $(".messenger-tab").hide();
        $('.messenger-tab[data-view="search"]').show();
    });
    // Search action on keyup
    $(".messenger-search").on("keyup", function(e) {
        $.trim($(this).val()).length > 0
            ? $(".messenger-search").trigger("focus") + messengerSearch($(this).val())
            : $(".messenger-tab").hide() +
            $('.messenger-listView-tabs a[data-view="users"]').trigger("click");
    });

    // Delete Conversation button
    $(".messenger-infoView-btns .delete-conversation").on("click", function() {
        app_modal({
            name: "delete",
        });
    });
    // delete modal [delete button]
    $(".app-modal[data-name=delete]")
        .find(".app-modal-footer .delete")
        .on("click", function() {
            deleteConversation(messenger.split("_")[1]);
            app_modal({
                show: false,
                name: "delete",
            });
        });
    // delete modal [cancel button]
    $(".app-modal[data-name=delete]")
        .find(".app-modal-footer .cancel")
        .on("click", function() {
            app_modal({
                show: false,
                name: "delete",
            });
        });

    // Settings button action to show settings modal
    $("body").on("click", ".settings-btn", function(e) {
        e.preventDefault();
        console.log("test");
        app_modal({
            show: true,
            name: "settings",
        });
    });

    // on submit settings' form
    $("#update-settings").on("submit", (e) => {
        e.preventDefault();
        updateSettings();
    });
    // Settings modal [cancel button]
    $(".app-modal[data-name=settings]")
        .find(".app-modal-footer .cancel")
        .on("click", function() {
            app_modal({
                show: false,
                name: "settings",
            });
            cancelUpdatingAvatar();
        });
    // upload avatar on change
    $("body").on("change", ".upload-avatar", (e) => {
        // store the original avatar
        if (defaultAvatarInSettings == null) {
            defaultAvatarInSettings = $(".upload-avatar-preview").css(
                "background-image"
            );
        }
        let file = e.target.files[0];
        if (!attachmentValidate(file)) return false;
        let reader = new FileReader();
        reader.readAsDataURL(file);
        reader.addEventListener("loadstart", (e) => {
            $(".upload-avatar-preview").append(
                loadingSVG("42px", "upload-avatar-loading")
            );
        });
        reader.addEventListener("load", (e) => {
            $(".upload-avatar-preview")
                .find(".loadingSVG")
                .remove();
            if (!file.type.match("image.*")) {
                // if the file is not an image
                console.error("File you selected is not an image!");
            } else {
                // if the file is an image
                $(".upload-avatar-preview").css(
                    "background-image",
                    'url("' + e.target.result + '")'
                );
            }
        });
    });
    // change messenger color button
    $("body").on("click", ".update-messengerColor .color-btn", function() {
        messengerColor = $(this)
            .attr("class")
            .split(" ")[0];
        $(".update-messengerColor .color-btn").removeClass("m-color-active");
        $(this).addClass("m-color-active");
    });
    // Switch to Dark/Light mode
    $("body").on("click", ".dark-mode-switch", function() {
        if ($(this).attr("data-mode") == "0") {
            $(this).attr("data-mode", "1");
            $(this).removeClass("far");
            $(this).addClass("fas");
            dark_mode = "dark";
        } else {
            $(this).attr("data-mode", "0");
            $(this).removeClass("fas");
            $(this).addClass("far");
            dark_mode = "light";
        }
    });
});

Youez - 2016 - github.com/yon3zu
LinuXploit