/* global APP, $ */ import {processReplacements, linkify} from './Replacement'; import CommandsProcessor from './Commands'; import ToolbarToggler from '../../toolbars/ToolbarToggler'; import VideoLayout from "../../videolayout/VideoLayout"; import UIUtil from '../../util/UIUtil'; import UIEvents from '../../../../service/UI/UIEvents'; import { smileys } from './smileys'; let unreadMessages = 0; const sidePanelsContainerId = 'sideToolbarContainer'; const htmlStr = `
`; function initHTML() { $(`#${sidePanelsContainerId}`) .append(htmlStr); } /** * The container id, which is and the element id. */ var CHAT_CONTAINER_ID = "chat_container"; /** * Updates visual notification, indicating that a message has arrived. */ function updateVisualNotification() { var unreadMsgElement = document.getElementById('unreadMessages'); if (unreadMessages) { unreadMsgElement.innerHTML = unreadMessages.toString(); ToolbarToggler.dockToolbar(true); var chatButtonElement = document.getElementById('toolbar_button_chat'); var leftIndent = (UIUtil.getTextWidth(chatButtonElement) - UIUtil.getTextWidth(unreadMsgElement)) / 2; var topIndent = (UIUtil.getTextHeight(chatButtonElement) - UIUtil.getTextHeight(unreadMsgElement)) / 2 - 5; unreadMsgElement.setAttribute( 'style', 'top:' + topIndent + '; left:' + leftIndent + ';'); } else { unreadMsgElement.innerHTML = ''; } $(unreadMsgElement).parent()[unreadMessages > 0 ? 'show' : 'hide'](); } /** * Returns the current time in the format it is shown to the user * @returns {string} */ function getCurrentTime(stamp) { var now = (stamp? new Date(stamp): new Date()); var hour = now.getHours(); var minute = now.getMinutes(); var second = now.getSeconds(); if(hour.toString().length === 1) { hour = '0'+hour; } if(minute.toString().length === 1) { minute = '0'+minute; } if(second.toString().length === 1) { second = '0'+second; } return hour+':'+minute+':'+second; } function toggleSmileys() { var smileys = $('#smileysContainer'); if(!smileys.is(':visible')) { smileys.show("slide", { direction: "down", duration: 300}); } else { smileys.hide("slide", { direction: "down", duration: 300}); } $('#usermsg').focus(); } function addClickFunction(smiley, number) { smiley.onclick = function addSmileyToMessage() { var usermsg = $('#usermsg'); var message = usermsg.val(); message += smileys['smiley' + number]; usermsg.val(message); usermsg.get(0).setSelectionRange(message.length, message.length); toggleSmileys(); usermsg.focus(); }; } /** * Adds the smileys container to the chat */ function addSmileys() { var smileysContainer = document.createElement('div'); smileysContainer.id = 'smileysContainer'; for(var i = 1; i <= 21; i++) { var smileyContainer = document.createElement('div'); smileyContainer.id = 'smiley' + i; smileyContainer.className = 'smileyContainer'; var smiley = document.createElement('img'); smiley.src = 'images/smileys/smiley' + i + '.svg'; smiley.className = 'smiley'; addClickFunction(smiley, i); smileyContainer.appendChild(smiley); smileysContainer.appendChild(smileyContainer); } $("#chat_container").append(smileysContainer); } /** * Resizes the chat conversation. */ function resizeChatConversation() { var msgareaHeight = $('#usermsg').outerHeight(); var chatspace = $('#' + CHAT_CONTAINER_ID); var width = chatspace.width(); var chat = $('#chatconversation'); var smileys = $('#smileysarea'); smileys.height(msgareaHeight); $("#smileys").css('bottom', (msgareaHeight - 26) / 2); $('#smileysContainer').css('bottom', msgareaHeight); chat.width(width - 10); chat.height(window.innerHeight - 15 - msgareaHeight); } /** * Focus input after 400 ms * Found input by id * * @param id {string} input id */ function deferredFocus(id){ setTimeout(() => $(`#${id}`).focus(), 400); } /** * Chat related user interface. */ var Chat = { /** * Initializes chat related interface. */ init (eventEmitter) { initHTML(); if (APP.settings.getDisplayName()) { Chat.setChatConversationMode(true); } $("#toggle_smileys").click(function() { Chat.toggleSmileys(); }); $('#nickinput').keydown(function (event) { if (event.keyCode === 13) { event.preventDefault(); let val = this.value; this.value = ''; eventEmitter.emit(UIEvents.NICKNAME_CHANGED, val); deferredFocus('usermsg'); } }); var usermsg = $('#usermsg'); usermsg.keydown(function (event) { if (event.keyCode === 13) { event.preventDefault(); var value = this.value; usermsg.val('').trigger('autosize.resize'); this.focus(); var command = new CommandsProcessor(value, eventEmitter); if (command.isCommand()) { command.processCommand(); } else { var message = UIUtil.escapeHtml(value); eventEmitter.emit(UIEvents.MESSAGE_CREATED, message); } } }); var onTextAreaResize = function () { resizeChatConversation(); Chat.scrollChatToBottom(); }; usermsg.autosize({callback: onTextAreaResize}); eventEmitter.on(UIEvents.SIDE_TOOLBAR_CONTAINER_TOGGLED, function(containerId, isVisible) { if (containerId !== CHAT_CONTAINER_ID || !isVisible) return; unreadMessages = 0; updateVisualNotification(); // Undock the toolbar when the chat is shown and if we're in a // video mode. if (VideoLayout.isLargeVideoVisible()) { ToolbarToggler.dockToolbar(false); } // if we are in conversation mode focus on the text input // if we are not, focus on the display name input if (APP.settings.getDisplayName()) deferredFocus('usermsg'); else deferredFocus('nickinput'); }); addSmileys(); updateVisualNotification(); }, /** * Appends the given message to the chat conversation. */ updateChatConversation (id, displayName, message, stamp) { var divClassName = ''; if (APP.conference.isLocalId(id)) { divClassName = "localuser"; } else { divClassName = "remoteuser"; if (!Chat.isVisible()) { unreadMessages++; UIUtil.playSoundNotification('chatNotification'); updateVisualNotification(); } } // replace links and smileys // Strophe already escapes special symbols on sending, // so we escape here only tags to avoid double & var escMessage = message.replace(//g, '>').replace(/\n/g, '