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 : |
/** *------------------------------------------------------------- * 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"; } }); });