From 40e7ee1ae6d68d7815a1f96c00b6a77901c972d9 Mon Sep 17 00:00:00 2001 From: JC Brand Date: Mon, 12 Jun 2017 20:30:58 +0200 Subject: [PATCH] Initial stab at using ES2015 Mostly replaced ``var`` with ``let`` and ``const``. Also added a few arrow functions. --- .eslintrc.json | 3 + spec/bookmarks.js | 6 +- spec/chatbox.js | 22 +- src/build-no-dependencies.js | 2 +- src/build.js | 2 +- src/converse-bookmarks.js | 8 +- src/converse-chatview.js | 120 ++++++----- src/converse-controlbox.js | 13 +- src/converse-core.js | 330 ++++++++++++++--------------- src/converse-dragresize.js | 2 +- src/converse-headline.js | 20 +- src/converse-minimize.js | 11 +- src/converse-muc-embedded.js | 10 +- src/converse-muc.js | 387 +++++++++++++++++------------------ src/converse-notification.js | 8 +- src/converse-otr.js | 22 +- src/converse-ping.js | 4 +- src/converse-register.js | 4 +- src/converse-roomslist.js | 4 +- src/converse-rosterview.js | 2 +- src/converse-singleton.js | 6 +- src/converse-vcard.js | 18 +- src/utils.js | 10 +- 23 files changed, 497 insertions(+), 517 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index cd3ecd843..44574e410 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,4 +1,7 @@ { + "parserOptions": { + "ecmaVersion": 6 + }, "env": { "browser": true, "jasmine": true diff --git a/spec/bookmarks.js b/spec/bookmarks.js index bca67b125..9fb7e58d5 100644 --- a/spec/bookmarks.js +++ b/spec/bookmarks.js @@ -306,7 +306,7 @@ */ var IQ_id; expect(_.filter(_converse.connection.send.calls.all(), function (call) { - var stanza = call.args[0] + var stanza = call.args[0]; if (!(stanza instanceof Element) || stanza.nodeName !== 'iq') { return; } @@ -373,7 +373,7 @@ it("shows a list of bookmarks", mock.initConverseWithConnectionSpies(['send'], function (_converse) { var IQ_id; expect(_.filter(_converse.connection.send.calls.all(), function (call) { - var stanza = call.args[0] + var stanza = call.args[0]; if (!(stanza instanceof Element) || stanza.nodeName !== 'iq') { return; } @@ -421,7 +421,7 @@ mock.initConverseWithConnectionSpies(['send'], function (_converse) { var IQ_id; expect(_.filter(_converse.connection.send.calls.all(), function (call) { - var stanza = call.args[0] + var stanza = call.args[0]; if (!(stanza instanceof Element) || stanza.nodeName !== 'iq') { return; } diff --git a/spec/chatbox.js b/spec/chatbox.js index 724fe4e5e..4921ca692 100644 --- a/spec/chatbox.js +++ b/spec/chatbox.js @@ -106,7 +106,7 @@ } return test_utils.waitUntil(function () { return _converse.chatboxviews.keys().length > 1; - }, 500) + }, 500); }).then(function () { var key = _converse.chatboxviews.keys()[1]; trimmedview = trimmed_chatboxes.get(key); @@ -268,7 +268,7 @@ expect(_converse.emit).toHaveBeenCalledWith('chatBoxMaximized', jasmine.any(Object)); return test_utils.waitUntil(function () { return chatview.$el.find('.chat-body').is(':visible'); - }, 500) + }, 500); }).then(function () { expect(chatview.$el.find('.toggle-chatbox-button').hasClass('icon-minus')).toBeTruthy(); expect(chatview.$el.find('.toggle-chatbox-button').hasClass('icon-plus')).toBeFalsy(); @@ -715,12 +715,12 @@ .then(function () { return test_utils.waitUntil(function () { return !chatboxview.model.get('auto_scrolled'); - }, 300) + }, 300); }).then(function () { chatboxview.$content.scrollTop(0); return test_utils.waitUntil(function () { return chatboxview.model.get('scrolled'); - }, 900) + }, 900); }).then(function () { _converse.chatboxes.onMessage($msg({ from: sender_jid, @@ -736,7 +736,7 @@ expect(msg_txt).toEqual(message); return test_utils.waitUntil(function () { return chatboxview.$('.new-msgs-indicator').is(':visible'); - }, 300) + }, 300); }).then(function () { expect(chatboxview.model.get('scrolled')).toBe(true); expect(chatboxview.$content.scrollTop()).toBe(0); @@ -745,7 +745,7 @@ chatboxview.$content.scrollTop(chatboxview.$content[0].scrollHeight); return test_utils.waitUntil(function () { return !chatboxview.$('.new-msgs-indicator').is(':visible'); - }, 300) + }, 300); }).then(done); })); @@ -1256,7 +1256,7 @@ test_utils.sendMessage(view, message); return test_utils.waitUntil(function () { return view.$el.find('.chat-content').find('.chat-message img').length === 2; - }, 500) + }, 500); }).then(function () { expect(view.sendMessage).toHaveBeenCalled(); var msg = view.$el.find('.chat-content').find('.chat-message').last().find('.chat-msg-content'); @@ -1351,7 +1351,7 @@ view.model.maximize(); return test_utils.waitUntil(function () { return view.model.get('chat_state') === 'active'; - }, 300) + }, 300); }).then(function () { expect(_converse.connection.send).toHaveBeenCalled(); var $stanza = $(_converse.connection.send.calls.argsFor(0)[0].tree()); @@ -1496,7 +1496,7 @@ expect($stanza.children().get(0).tagName).toBe('composing'); return test_utils.waitUntil(function () { return view.model.get('chat_state') === 'paused'; - }, 500) + }, 500); }).then(function () { expect(_converse.connection.send).toHaveBeenCalled(); var $stanza = $(_converse.connection.send.calls.argsFor(1)[0].tree()); @@ -1618,11 +1618,11 @@ return true; } return false; - }, 250) + }, 250); }).then(function () { return test_utils.waitUntil(function () { return view.model.get('chat_state') === 'inactive'; - }, 250) + }, 250); }).then(function () { expect(_converse.connection.send).toHaveBeenCalled(); var $stanza = $(_converse.connection.send.calls.first().args[0].tree()); diff --git a/src/build-no-dependencies.js b/src/build-no-dependencies.js index 18c49ea77..78f2f6129 100644 --- a/src/build-no-dependencies.js +++ b/src/build-no-dependencies.js @@ -43,4 +43,4 @@ endFile: "end-no-dependencies.frag" }, mainConfigFile: "config.js" -}) +}); diff --git a/src/build.js b/src/build.js index 55da9e821..1ddaf8d69 100644 --- a/src/build.js +++ b/src/build.js @@ -6,4 +6,4 @@ startFile: "start.frag", endFile: "end.frag" } -}) +}); diff --git a/src/converse-bookmarks.js b/src/converse-bookmarks.js index 812341de3..402defe6d 100644 --- a/src/converse-bookmarks.js +++ b/src/converse-bookmarks.js @@ -29,7 +29,7 @@ tpl_bookmarks_list ) { - var $ = converse.env.jQuery, + const $ = converse.env.jQuery, Backbone = converse.env.Backbone, Strophe = converse.env.Strophe, $iq = converse.env.$iq, @@ -66,7 +66,7 @@ }, generateHeadingHTML: function () { - var _converse = this.__super__._converse, + const _converse = this.__super__._converse, __ = _converse.__, html = this.__super__.generateHeadingHTML.apply(this, arguments); if (_converse.allow_bookmarks) { @@ -92,11 +92,11 @@ * for this room, and if so use it. * Otherwise delegate to the super method. */ - var _converse = this.__super__._converse; + const _converse = this.__super__._converse; if (_.isUndefined(_converse.bookmarks) || !_converse.allow_bookmarks) { return this.__super__.checkForReservedNick.apply(this, arguments); } - var model = _converse.bookmarks.findWhere({'jid': this.model.get('jid')}); + const model = _converse.bookmarks.findWhere({'jid': this.model.get('jid')}); if (!_.isUndefined(model) && model.get('nick')) { this.join(model.get('nick')); } else { diff --git a/src/converse-chatview.js b/src/converse-chatview.js index 6014adc68..f0c5839ed 100644 --- a/src/converse-chatview.js +++ b/src/converse-chatview.js @@ -30,7 +30,7 @@ tpl_spinner ) { "use strict"; - var $ = converse.env.jQuery, + const $ = converse.env.jQuery, $msg = converse.env.$msg, Backbone = converse.env.Backbone, Strophe = converse.env.Strophe, @@ -38,7 +38,7 @@ moment = converse.env.moment, utils = converse.env.utils; - var KEY = { + const KEY = { ENTER: 13, FORWARD_SLASH: 47 }; @@ -55,8 +55,8 @@ ChatBoxViews: { onChatBoxAdded: function (item) { - var _converse = this.__super__._converse; - var view = this.get(item.get('id')); + const _converse = this.__super__._converse; + let view = this.get(item.get('id')); if (!view) { view = new _converse.ChatBoxView({model: item}); this.add(item.get('id'), view); @@ -73,7 +73,7 @@ /* The initialize function gets called as soon as the plugin is * loaded by converse.js's plugin machinery. */ - var _converse = this._converse, + const _converse = this._converse, __ = _converse.__; _converse.api.settings.update({ @@ -88,12 +88,11 @@ }, }); - var onWindowStateChanged = function (data) { - var state = data.state; + function onWindowStateChanged (data) { _converse.chatboxviews.each(function (chatboxview) { - chatboxview.onWindowStateChanged(state); - }) - }; + chatboxview.onWindowStateChanged(data.state); + }); + } _converse.api.listen.on('windowStateChanged', onWindowStateChanged); @@ -173,7 +172,7 @@ /* This method gets overridden in src/converse-controlbox.js if * the controlbox plugin is active. */ - var container = document.querySelector('#conversejs'); + const container = document.querySelector('#conversejs'); if (this.el.parentNode !== container) { container.insertBefore(this.el, container.firstChild); } @@ -188,7 +187,7 @@ if (!keep_old) { this.clearStatusNotification(); } - var $el = $('
').text(message); + const $el = $('
').text(message); if (!permanent) { $el.addClass('chat-event'); } @@ -216,8 +215,8 @@ * Parameters: * (String) date - An ISO8601 date string. */ - var day_date = moment(date).startOf('day'); - var insert = prepend ? this.$content.prepend: this.$content.append; + const day_date = moment(date).startOf('day'); + const insert = prepend ? this.$content.prepend: this.$content.append; insert.call(this.$content, tpl_new_day({ isodate: day_date.format(), datestring: day_date.format("dddd MMM Do YYYY") @@ -232,11 +231,9 @@ * Parameters: * (Object) attrs: An object containing the message attributes. */ - var that = this; - var insert = prepend ? this.$content.prepend : this.$content.append; - _.flow( - function ($el) { - insert.call(that.$content, $el); + const insert = prepend ? this.$content.prepend : this.$content.append; + _.flow(($el) => { + insert.call(this.$content, $el); return $el; }, this.scrollDown.bind(this) @@ -255,11 +252,9 @@ * (Object) attrs: An object containing the message * attributes. */ - var msg_dates, - $first_msg = this.$content.find('.chat-message:first'), - first_msg_date = $first_msg.data('isodate'), - current_msg_date = moment(attrs.time) || moment, - last_msg_date = this.$content.find('.chat-message:last').data('isodate'); + let current_msg_date = moment(attrs.time) || moment; + const $first_msg = this.$content.find('.chat-message:first'), + first_msg_date = $first_msg.data('isodate'); if (!first_msg_date) { // This is the first received message, so we insert a @@ -268,6 +263,8 @@ this.insertMessage(attrs); return; } + + const last_msg_date = this.$content.find('.chat-message:last').data('isodate'); if (current_msg_date.isAfter(last_msg_date) || current_msg_date.isSame(last_msg_date)) { // The new message is after the last message @@ -294,16 +291,17 @@ } // Find the correct place to position the message current_msg_date = current_msg_date.format(); - msg_dates = _.map(this.$content.find('.chat-message'), function (el) { + const msg_dates = _.map(this.$content.find('.chat-message'), function (el) { return $(el).data('isodate'); }); msg_dates.push(current_msg_date); msg_dates.sort(); - var idx = msg_dates.indexOf(current_msg_date)-1; - var $latest_message = this.$content.find('.chat-message[data-isodate="'+msg_dates[idx]+'"]:last'); - _.flow( - function ($el) { + + const idx = msg_dates.indexOf(current_msg_date)-1; + const $latest_message = this.$content.find('.chat-message[data-isodate="'+msg_dates[idx]+'"]:last'); + _.flow(($el) => { $el.insertAfter($latest_message); + return $el; }, this.scrollDown.bind(this) )(this.renderMessage(attrs)); @@ -332,12 +330,11 @@ * Returns: * The DOM element representing the message. */ - var msg_time = moment(attrs.time) || moment, - text = attrs.message, - match = text.match(/^\/(.*?)(?: (.*))?$/), + let text = attrs.message, fullname = this.model.get('fullname') || attrs.fullname, template, username; + const match = text.match(/^\/(.*?)(?: (.*))?$/); if ((match) && (match[1] === 'me')) { text = text.replace(/^\/me/, ''); template = tpl_action; @@ -361,7 +358,8 @@ "Output has been shortened."), true, true); } - var $msg = $(template( + const msg_time = moment(attrs.time) || moment; + const $msg = $(template( _.extend(this.getExtraMessageTemplateAttributes(attrs), { 'msgid': attrs.msgid, 'sender': attrs.sender, @@ -379,13 +377,12 @@ }, showHelpMessages: function (msgs, type, spinner) { - var i, msgs_length = msgs.length; - for (i=0; i { this.$content.append($(tpl_help_message({ 'type': type||'info', - 'message': msgs[i] + 'message': msgs }))); - } + }); if (spinner === true) { this.$content.append(tpl_spinner); } else if (spinner === false) { @@ -440,7 +437,7 @@ }, handleErrorMessage: function (message) { - var $message = $('[data-msgid='+message.get('msgid')+']'); + const $message = $('[data-msgid='+message.get('msgid')+']'); if ($message.length) { $message.after($('
').text(message.get('message'))); this.scrollDown(); @@ -488,7 +485,7 @@ */ // TODO: We might want to send to specfic resources. // Especially in the OTR case. - var messageStanza = this.createMessageStanza(message); + const messageStanza = this.createMessageStanza(message); _converse.connection.send(messageStanza); if (_converse.forward_messages) { // Forward the message, so that other connected resources are also aware of it. @@ -515,13 +512,13 @@ 'error' ); } - var match = text.replace(/^\s*/, "").match(/^\/(.*)\s*$/), msgs; + const match = text.replace(/^\s*/, "").match(/^\/(.*)\s*$/); if (match) { if (match[1] === "clear") { return this.clearMessages(); } else if (match[1] === "help") { - msgs = [ + const msgs = [ '/help:'+__('Show this menu')+'', '/me:'+__('Write in the third person')+'', '/clear:'+__('Remove messages')+'' @@ -530,9 +527,10 @@ return; } } - var fullname = _converse.xmppstatus.get('fullname'); + let fullname = _converse.xmppstatus.get('fullname'); fullname = _.isEmpty(fullname)? _converse.bare_jid: fullname; - var message = this.model.messages.create({ + + const message = this.model.messages.create({ fullname: fullname, sender: 'me', time: moment().format(), @@ -586,10 +584,10 @@ keyPressed: function (ev) { /* Event handler for when a key is pressed in a chat box textarea. */ - var textarea = ev.target, message; if (ev.keyCode === KEY.ENTER) { ev.preventDefault(); - message = textarea.value; + const textarea = ev.target; + const message = textarea.value; textarea.value = ''; textarea.focus(); if (message !== '') { @@ -608,7 +606,7 @@ /* Event handler for when a send button is clicked in a chat box textarea. */ ev.preventDefault(); - var textarea = this.el.querySelector('.chat-textarea'), + const textarea = this.el.querySelector('.chat-textarea'), message = textarea.value; textarea.value = ''; @@ -622,7 +620,7 @@ clearMessages: function (ev) { if (ev && ev.preventDefault) { ev.preventDefault(); } - var result = confirm(__("Are you sure you want to clear the messages from this chat box?")); + const result = confirm(__("Are you sure you want to clear the messages from this chat box?")); if (result === true) { this.$content.empty(); this.model.messages.reset(); @@ -632,8 +630,8 @@ }, insertIntoTextArea: function (value) { - var $textbox = this.$el.find('textarea.chat-textarea'); - var existing = $textbox.val(); + const $textbox = this.$el.find('textarea.chat-textarea'); + let existing = $textbox.val(); if (existing && (existing[existing.length-1] !== ' ')) { existing = existing + ' '; } @@ -643,7 +641,7 @@ insertEmoticon: function (ev) { ev.stopPropagation(); this.$el.find('.toggle-smiley ul').slideToggle(200); - var $target = $(ev.target); + let $target = $(ev.target); $target = $target.is('a') ? $target : $target.children('a'); this.insertIntoTextArea($target.data('emoticon')); }, @@ -662,8 +660,8 @@ }, onChatStatusChanged: function (item) { - var chat_status = item.get('chat_status'), - fullname = item.get('fullname'); + const chat_status = item.get('chat_status'); + let fullname = item.get('fullname'); fullname = _.isEmpty(fullname)? item.get('jid'): fullname; if (this.$el.is(':visible')) { if (chat_status === 'offline') { @@ -738,9 +736,9 @@ if (!this.model.get('image')) { return; } - var width = _converse.chatview_avatar_width; - var height = _converse.chatview_avatar_height; - var img_src = 'data:'+this.model.get('image_type')+';base64,'+this.model.get('image'), + const width = _converse.chatview_avatar_width; + const height = _converse.chatview_avatar_height; + const img_src = 'data:'+this.model.get('image_type')+';base64,'+this.model.get('image'), canvas = $(tpl_avatar({ 'width': width, 'height': height @@ -749,10 +747,10 @@ if (!(canvas.getContext && canvas.getContext('2d'))) { return this; } - var ctx = canvas.getContext('2d'); - var img = new Image(); // Create new Image object + const ctx = canvas.getContext('2d'); + const img = new Image(); // Create new Image object img.onload = function () { - var ratio = img.width/img.height; + const ratio = img.width/img.height; if (ratio < 1) { ctx.drawImage(img, 0,0, width, height*(1/ratio)); } else { @@ -810,7 +808,7 @@ }, hideNewMessagesIndicator: function () { - var new_msgs_indicator = this.el.querySelector('.new-msgs-indicator'); + const new_msgs_indicator = this.el.querySelector('.new-msgs-indicator'); if (!_.isNull(new_msgs_indicator)) { new_msgs_indicator.classList.add('hidden'); } @@ -831,8 +829,8 @@ }); return; } - var scrolled = true; - var is_at_bottom = + let scrolled = true; + const is_at_bottom = (this.$content.scrollTop() + this.$content.innerHeight()) >= this.$content[0].scrollHeight-10; if (is_at_bottom) { diff --git a/src/converse-controlbox.js b/src/converse-controlbox.js index bf854c9b8..866950a6b 100644 --- a/src/converse-controlbox.js +++ b/src/converse-controlbox.js @@ -42,14 +42,14 @@ ) { "use strict"; - var USERS_PANEL_ID = 'users'; - var CHATBOX_TYPE = 'chatbox'; + const USERS_PANEL_ID = 'users'; + const CHATBOX_TYPE = 'chatbox'; // Strophe methods for building stanzas - var Strophe = converse.env.Strophe, + const Strophe = converse.env.Strophe, Backbone = converse.env.Backbone, utils = converse.env.utils; // Other necessary globals - var $ = converse.env.jQuery, + const $ = converse.env.jQuery, _ = converse.env._, fp = converse.env.fp, moment = converse.env.moment; @@ -188,7 +188,7 @@ /* The initialize function gets called as soon as the plugin is * loaded by converse.js's plugin machinery. */ - var _converse = this._converse, + const _converse = this._converse, __ = _converse.__; _converse.api.settings.update({ @@ -200,12 +200,13 @@ xhr_user_search_url: '' }); - var LABEL_CONTACTS = __('Contacts'); + const LABEL_CONTACTS = __('Contacts'); _converse.addControlBox = function () { return _converse.chatboxes.add({ id: 'controlbox', box_id: 'controlbox', + type: 'controlbox', closed: !_converse.show_controlbox_by_default }); }; diff --git a/src/converse-core.js b/src/converse-core.js index f4ccf2f75..4f94dce23 100755 --- a/src/converse-core.js +++ b/src/converse-core.js @@ -30,14 +30,14 @@ // "use strict"; // Create the FP (functional programming) version of lodash - var fp = lodashConverter(_.runInContext()); + const fp = lodashConverter(_.runInContext()); // Strophe globals - var $build = Strophe.$build; - var $iq = Strophe.$iq; - var $msg = Strophe.$msg; - var $pres = Strophe.$pres; - var b64_sha1 = Strophe.SHA1.b64_sha1; + const $build = Strophe.$build; + const $iq = Strophe.$iq; + const $msg = Strophe.$msg; + const $pres = Strophe.$pres; + const b64_sha1 = Strophe.SHA1.b64_sha1; Strophe = Strophe.Strophe; // Use Mustache style syntax for variable interpolation @@ -50,7 +50,7 @@ 'interpolate': /\{\{([\s\S]+?)\}\}/g }; - var _converse = {}; + const _converse = {}; _converse.templates = {}; _.extend(_converse, Backbone.Events); _converse.promises = { @@ -66,7 +66,7 @@ }; _converse.emit = function (name) { _converse.trigger.apply(this, arguments); - var promise = _converse.promises[name]; + const promise = _converse.promises[name]; if (!_.isUndefined(promise)) { promise.resolve(); } @@ -121,7 +121,7 @@ _converse.OPENED = 'opened'; _converse.PREBIND = "prebind"; - var PRETTY_CONNECTION_STATUS = { + const PRETTY_CONNECTION_STATUS = { 0: 'ERROR', 1: 'CONNECTING', 2: 'CONNFAIL', @@ -134,11 +134,11 @@ 9: 'REDIRECT' }; - var DEFAULT_IMAGE_TYPE = 'image/png'; - var DEFAULT_IMAGE = "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"; + const DEFAULT_IMAGE_TYPE = 'image/png'; + const DEFAULT_IMAGE = "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"; _converse.log = function (txt, level) { - var logger = _.assignIn({ + const logger = _.assignIn({ 'debug': _.noop, 'error': _.noop, 'info': _.noop, @@ -170,7 +170,7 @@ _converse.initialize = function (settings, callback) { "use strict"; settings = !_.isUndefined(settings) ? settings : {}; - var init_deferred = new $.Deferred(); + const init_deferred = new $.Deferred(); if (!_.isUndefined(_converse.chatboxes)) { // Looks like _converse.initialized was called again without logging @@ -182,7 +182,7 @@ _converse._tearDown(); } - var unloadevent; + let unloadevent; if ('onpagehide' in window) { // Pagehide gets thrown in more cases than unload. Specifically it // gets thrown when the page is cached and not just @@ -225,7 +225,7 @@ moment.locale = moment.lang; } moment.locale(utils.getLocale(settings.i18n, utils.isMomentLocale)); - var __ = _converse.__ = utils.__.bind(_converse); + const __ = _converse.__ = utils.__.bind(_converse); _converse.___ = utils.___; // XEP-0085 Chat states @@ -364,7 +364,7 @@ // This can happen when the connection reconnects. return; } - var stat = _converse.xmppstatus.getStatus(); + const stat = _converse.xmppstatus.getStatus(); _converse.idle_seconds++; if (_converse.csi_waiting_time > 0 && _converse.idle_seconds > _converse.csi_waiting_time && @@ -403,7 +403,7 @@ }; this.giveFeedback = function (subject, klass, message) { - var els = document.querySelectorAll('.conn-feedback'); + const els = document.querySelectorAll('.conn-feedback'); _.forEach(els, function (el) { el.classList.add('conn-feedback'); el.textContent = subject; @@ -428,7 +428,7 @@ * is being canceled. * (String) message - An optional message to the user */ - var pres = $pres({to: jid, type: "unsubscribed"}); + const pres = $pres({to: jid, type: "unsubscribed"}); if (message && message !== "") { pres.c("status").t(message); } _converse.connection.send(pres); }; @@ -543,7 +543,7 @@ this.incrementMsgCounter = function () { this.msg_counter += 1; - var unreadMsgCount = this.msg_counter; + const unreadMsgCount = this.msg_counter; if (document.title.search(/^Messages \(\d+\) /) === -1) { document.title = "Messages (" + unreadMsgCount + ") " + document.title; } else { @@ -559,9 +559,9 @@ }; this.initStatus = function () { - var deferred = new $.Deferred(); + const deferred = new $.Deferred(); this.xmppstatus = new this.XMPPStatus(); - var id = b64_sha1('converse.xmppstatus-'+_converse.bare_jid); + const id = b64_sha1('converse.xmppstatus-'+_converse.bare_jid); this.xmppstatus.id = id; // Appears to be necessary for backbone.browserStorage this.xmppstatus.browserStorage = new Backbone.BrowserStorage[_converse.storage](id); this.xmppstatus.fetch({ @@ -574,7 +574,7 @@ this.initSession = function () { this.session = new this.Session(); - var id = b64_sha1('converse.bosh-session'); + const id = b64_sha1('converse.bosh-session'); this.session.id = id; // Appears to be necessary for backbone.browserStorage this.session.browserStorage = new Backbone.BrowserStorage[_converse.storage](id); this.session.fetch(); @@ -606,16 +606,15 @@ // XXX: eventually we should be able to just use // document.visibilityState (when we drop support for older // browsers). - var state; - var v = "visible", h = "hidden", - event_map = { - 'focus': v, - 'focusin': v, - 'pageshow': v, - 'blur': h, - 'focusout': h, - 'pagehide': h - }; + let state; + const event_map = { + 'focus': "visible", + 'focusin': "visible", + 'pageshow': "visible", + 'blur': "hidden", + 'focusout': "hidden", + 'pagehide': "hidden" + }; ev = ev || document.createEvent('Events'); if (ev.type in event_map) { state = event_map[ev.type]; @@ -626,13 +625,13 @@ _converse.clearMsgCounter(); } _converse.windowState = state; - _converse.emit('windowStateChanged', {state: state}) + _converse.emit('windowStateChanged', {state: state}); }; this.registerGlobalEventHandlers = function () { // Taken from: // http://stackoverflow.com/questions/1060008/is-there-a-way-to-detect-if-a-browser-window-is-not-currently-active - var hidden = "hidden"; + let hidden = "hidden"; // Standards: if (hidden in document) { document.addEventListener("visibilitychange", _.partial(_converse.saveWindowState, _, hidden)); @@ -662,7 +661,7 @@ if (!this.message_carbons || this.session.get('carbons_enabled')) { return; } - var carbons_iq = new Strophe.Builder('iq', { + const carbons_iq = new Strophe.Builder('iq', { from: this.connection.jid, id: 'enablecarbons', type: 'set' @@ -811,9 +810,9 @@ }, initialize: function (attributes) { - var jid = attributes.jid; - var bare_jid = Strophe.getBareJidFromJid(jid).toLowerCase(); - var resource = Strophe.getResourceFromJid(jid); + const jid = attributes.jid; + const bare_jid = Strophe.getBareJidFromJid(jid).toLowerCase(); + const resource = Strophe.getResourceFromJid(jid); attributes.jid = bare_jid; this.set(_.assignIn({ 'id': bare_jid, @@ -837,11 +836,11 @@ * reason for the subscription request. */ this.save('ask', "subscribe"); // ask === 'subscribe' Means we have ask to subscribe to them. - var pres = $pres({to: this.get('jid'), type: "subscribe"}); + const pres = $pres({to: this.get('jid'), type: "subscribe"}); if (message && message !== "") { pres.c("status").t(message).up(); } - var nick = _converse.xmppstatus.get('fullname'); + const nick = _converse.xmppstatus.get('fullname'); if (nick && nick !== "") { pres.c('nick', {'xmlns': Strophe.NS.NICK}).t(nick).up(); } @@ -888,7 +887,7 @@ * Parameters: * (String) message - Optional message to send to the person being authorized */ - var pres = $pres({to: this.get('jid'), type: "subscribed"}); + const pres = $pres({to: this.get('jid'), type: "subscribed"}); if (message && message !== "") { pres.c("status").t(message); } @@ -903,23 +902,23 @@ * Also updates the contact's chat_status if the presence has * higher priority (and is newer). */ - var jid = presence.getAttribute('from'), + const jid = presence.getAttribute('from'), chat_status = _.propertyOf(presence.querySelector('show'))('textContent') || 'online', resource = Strophe.getResourceFromJid(jid), - priority = _.propertyOf(presence.querySelector('priority'))('textContent') || 0, delay = presence.querySelector('delay[xmlns="'+Strophe.NS.DELAY+'"]'), timestamp = _.isNull(delay) ? moment().format() : moment(delay.getAttribute('stamp')).format(); + let priority = _.propertyOf(presence.querySelector('priority'))('textContent') || 0; priority = _.isNaN(parseInt(priority, 10)) ? 0 : parseInt(priority, 10); - var resources = _.isObject(this.get('resources')) ? this.get('resources') : {}; + const resources = _.isObject(this.get('resources')) ? this.get('resources') : {}; resources[resource] = { 'priority': priority, 'status': chat_status, 'timestamp': timestamp }; - var changed = {'resources': resources}; - var hpr = this.getHighestPriorityResource(); + const changed = {'resources': resources}; + const hpr = this.getHighestPriorityResource(); if (priority == hpr.priority && timestamp == hpr.timestamp) { // Only set the chat status if this is the newest resource // with the highest priority @@ -935,7 +934,7 @@ * Also recomputes the chat_status given that there's one less * resource. */ - var resources = this.get('resources'); + let resources = this.get('resources'); if (!_.isObject(resources)) { resources = {}; } else { @@ -954,9 +953,9 @@ * If multiple resources have the same priority, take the * newest one. */ - var resources = this.get('resources'); + const resources = this.get('resources'); if (_.isObject(resources) && _.size(resources)) { - var val = _.flow( + const val = _.flow( _.values, _.partial(_.sortBy, _, ['priority', 'timestamp']), _.reverse @@ -972,7 +971,7 @@ * Parameters: * (Function) callback */ - var iq = $iq({type: 'set'}) + const iq = $iq({type: 'set'}) .c('query', {xmlns: Strophe.NS.ROSTER}) .c('item', {jid: this.get('jid'), subscription: "remove"}); _converse.connection.sendIQ(iq, callback, callback); @@ -985,12 +984,11 @@ model: _converse.RosterContact, comparator: function (contact1, contact2) { - var name1, name2; - var status1 = contact1.get('chat_status') || 'offline'; - var status2 = contact2.get('chat_status') || 'offline'; + const status1 = contact1.get('chat_status') || 'offline'; + const status2 = contact2.get('chat_status') || 'offline'; if (_converse.STATUS_WEIGHTS[status1] === _converse.STATUS_WEIGHTS[status2]) { - name1 = contact1.get('fullname').toLowerCase(); - name2 = contact2.get('fullname').toLowerCase(); + const name1 = contact1.get('fullname').toLowerCase(); + const name2 = contact2.get('fullname').toLowerCase(); return name1 < name2 ? -1 : (name1 > name2? 1 : 0); } else { return _converse.STATUS_WEIGHTS[status1] < _converse.STATUS_WEIGHTS[status2] ? -1 : 1; @@ -1044,7 +1042,7 @@ * Returns a promise which resolves once the contacts have been * fetched. */ - var deferred = new $.Deferred(); + const deferred = new $.Deferred(); this.fetch({ add: true, success: function (collection) { @@ -1112,7 +1110,7 @@ * (Function) errback - A function to call if an error occured */ name = _.isEmpty(name)? jid: name; - var iq = $iq({type: 'set'}) + const iq = $iq({type: 'set'}) .c('query', {xmlns: Strophe.NS.ROSTER}) .c('item', { jid: jid, name: name }); _.each(groups, function (group) { iq.c('group').t(group).up(); }); @@ -1131,12 +1129,12 @@ * (Array of Strings) groups - Any roster groups the user might belong to * (Object) attributes - Any additional attributes to be stored on the user's model. */ - var deferred = new $.Deferred(); + const deferred = new $.Deferred(); groups = groups || []; name = _.isEmpty(name)? jid: name; this.sendContactAddIQ(jid, name, groups, function () { - var contact = this.create(_.assignIn({ + const contact = this.create(_.assignIn({ ask: undefined, fullname: name, groups: groups, @@ -1156,7 +1154,7 @@ }, subscribeBack: function (bare_jid) { - var contact = this.get(bare_jid); + const contact = this.get(bare_jid); if (contact instanceof _converse.RosterContact) { contact.authorize().subscribe(); } else { @@ -1170,20 +1168,13 @@ }, getNumOnlineContacts: function () { - var count = 0, - ignored = ['offline', 'unavailable'], - models = this.models, - models_length = models.length, - i; + let ignored = ['offline', 'unavailable']; if (_converse.show_only_online_users) { ignored = _.union(ignored, ['dnd', 'xa', 'away']); } - for (i=0; i { + this.onReceivedFromServer(iq); + callback.apply(this, arguments); }); }, @@ -1230,8 +1219,7 @@ /* An IQ stanza containing the roster has been received from * the XMPP server. */ - // var items = iq.querySelectorAll('query[xmlns="'+Strophe.NS.ROSTER+'"] item'); - var items = sizzle('query[xmlns="'+Strophe.NS.ROSTER+'"] item', iq); + const items = sizzle('query[xmlns="'+Strophe.NS.ROSTER+'"] item', iq); _.each(items, this.updateContact.bind(this)); _converse.emit('roster', iq); }, @@ -1240,12 +1228,14 @@ /* Update or create RosterContact models based on items * received in the IQ from the server. */ - var jid = item.getAttribute('jid'); + const jid = item.getAttribute('jid'); if (this.isSelf(jid)) { return; } - var groups = _.map(item.getElementsByTagName('group'), Strophe.getText), - contact = this.get(jid), - ask = item.getAttribute("ask"), - subscription = item.getAttribute("subscription"); + + const contact = this.get(jid), + subscription = item.getAttribute("subscription"), + ask = item.getAttribute("ask"), + groups = _.map(item.getElementsByTagName('group'), Strophe.getText); + if (!contact) { if ((subscription === "none" && ask === null) || (subscription === "remove")) { return; // We're lazy when adding contacts. @@ -1279,9 +1269,9 @@ * * Note: this method gets completely overridden by converse-vcard.js */ - var bare_jid = Strophe.getBareJidFromJid(presence.getAttribute('from')); - var nick_el = presence.querySelector('nick[xmlns="'+Strophe.NS.NICK+'"]'); - var user_data = { + const bare_jid = Strophe.getBareJidFromJid(presence.getAttribute('from')), + nick_el = presence.querySelector('nick[xmlns="'+Strophe.NS.NICK+'"]'); + const user_data = { jid: bare_jid, subscription: 'none', ask: null, @@ -1293,9 +1283,10 @@ }, handleIncomingSubscription: function (presence) { - var jid = presence.getAttribute('from'); - var bare_jid = Strophe.getBareJidFromJid(jid); - var contact = this.get(bare_jid); + const jid = presence.getAttribute('from'), + bare_jid = Strophe.getBareJidFromJid(jid), + contact = this.get(bare_jid); + if (!_converse.allow_contact_requests) { _converse.rejectPresenceSubscription( jid, @@ -1315,16 +1306,17 @@ } else if (contact.get('ask') === "subscribe") { contact.authorize(); } - } else if (!contact) { + } else { this.createRequestingContact(presence); } } }, presenceHandler: function (presence) { - var presence_type = presence.getAttribute('type'); + const presence_type = presence.getAttribute('type'); if (presence_type === 'error') { return true; } - var jid = presence.getAttribute('from'), + + const jid = presence.getAttribute('from'), bare_jid = Strophe.getBareJidFromJid(jid), resource = Strophe.getResourceFromJid(jid), chat_status = _.propertyOf(presence.querySelector('show'))('textContent') || 'online', @@ -1390,7 +1382,7 @@ * Returns a promise which resolves once the groups have been * returned. */ - var deferred = new $.Deferred(); + const deferred = new $.Deferred(); this.fetch({ silent: true, // We need to first have all groups before // we can start positioning them, so we set @@ -1442,15 +1434,13 @@ getMessageAttributes: function (message, delay, original_stanza) { delay = delay || message.querySelector('delay'); - var type = message.getAttribute('type'), - body, stamp, time, sender, from, fullname; + const type = message.getAttribute('type'); - if (type === 'error') { - body = _.propertyOf(message.querySelector('error text'))('textContent'); - } else { - body = _.propertyOf(message.querySelector('body'))('textContent'); - } - var delayed = !_.isNull(delay), + const body = (type === 'error') ? + _.propertyOf(message.querySelector('error text'))('textContent') : + _.propertyOf(message.querySelector('body'))('textContent'); + + const delayed = !_.isNull(delay), is_groupchat = type === 'groupchat', chat_state = message.getElementsByTagName(_converse.COMPOSING).length && _converse.COMPOSING || message.getElementsByTagName(_converse.PAUSED).length && _converse.PAUSED || @@ -1458,17 +1448,15 @@ message.getElementsByTagName(_converse.ACTIVE).length && _converse.ACTIVE || message.getElementsByTagName(_converse.GONE).length && _converse.GONE; + let from; if (is_groupchat) { from = Strophe.unescapeNode(Strophe.getResourceFromJid(message.getAttribute('from'))); } else { from = Strophe.getBareJidFromJid(message.getAttribute('from')); } - if (delayed) { - stamp = delay.getAttribute('stamp'); - time = stamp; - } else { - time = moment().format(); - } + + const time = delayed ? delay.getAttribute('stamp') : moment().format(); + let sender, fullname; if ((is_groupchat && from === this.get('nick')) || (!is_groupchat && from === _converse.bare_jid)) { sender = 'me'; fullname = _converse.xmppstatus.get('fullname') || from; @@ -1546,9 +1534,8 @@ * This method gets overridden entirely in src/converse-controlbox.js * if the controlbox plugin is active. */ - var that = this; - collection.each(function (chatbox) { - if (that.chatBoxMayBeShown(chatbox)) { + collection.each((chatbox) => { + if (this.chatBoxMayBeShown(chatbox)) { chatbox.trigger('show'); } }); @@ -1569,12 +1556,12 @@ /* Handler method for all incoming error message stanzas */ // TODO: we can likely just reuse "onMessage" below - var from_jid = Strophe.getBareJidFromJid(message.getAttribute('from')); + const from_jid = Strophe.getBareJidFromJid(message.getAttribute('from')); if (utils.isSameBareJID(from_jid, _converse.bare_jid)) { return true; } // Get chat box, but only create a new one when the message has a body. - var chatbox = this.getChatBox(from_jid); + const chatbox = this.getChatBox(from_jid); if (!chatbox) { return true; } @@ -1586,14 +1573,14 @@ /* Handler method for all incoming single-user chat "message" * stanzas. */ - var original_stanza = message, - contact_jid, delay, from_bare_jid, - from_resource, is_me, msgid, messages, - chatbox, resource, + + let contact_jid, delay, resource, from_jid = message.getAttribute('from'), - to_jid = message.getAttribute('to'), - to_resource = Strophe.getResourceFromJid(to_jid), - is_carbon = !_.isNull(message.querySelector('received[xmlns="'+Strophe.NS.CARBONS+'"]')); + to_jid = message.getAttribute('to'); + + const original_stanza = message, + to_resource = Strophe.getResourceFromJid(to_jid), + is_carbon = !_.isNull(message.querySelector('received[xmlns="'+Strophe.NS.CARBONS+'"]')); if (_converse.filter_by_resource && (to_resource && to_resource !== _converse.resource)) { _converse.log( @@ -1611,10 +1598,10 @@ ); return true; } - var forwarded = message.querySelector('forwarded'); + const forwarded = message.querySelector('forwarded'); if (!_.isNull(forwarded)) { - var forwarded_message = forwarded.querySelector('message'); - var forwarded_from = forwarded_message.getAttribute('from'); + const forwarded_message = forwarded.querySelector('message'); + const forwarded_from = forwarded_message.getAttribute('from'); if (is_carbon && Strophe.getBareJidFromJid(forwarded_from) !== from_jid) { // Prevent message forging via carbons // @@ -1626,9 +1613,11 @@ from_jid = message.getAttribute('from'); to_jid = message.getAttribute('to'); } - from_bare_jid = Strophe.getBareJidFromJid(from_jid); - from_resource = Strophe.getResourceFromJid(from_jid); - is_me = from_bare_jid === _converse.bare_jid; + + const from_bare_jid = Strophe.getBareJidFromJid(from_jid), + from_resource = Strophe.getResourceFromJid(from_jid), + is_me = from_bare_jid === _converse.bare_jid; + if (is_me) { // I am the sender, so this must be a forwarded message... contact_jid = Strophe.getBareJidFromJid(to_jid); @@ -1638,10 +1627,11 @@ resource = from_resource; } // Get chat box, but only create a new one when the message has a body. - chatbox = this.getChatBox(contact_jid, !_.isNull(message.querySelector('body'))); - msgid = message.getAttribute('id'); + const chatbox = this.getChatBox(contact_jid, !_.isNull(message.querySelector('body'))), + msgid = message.getAttribute('id'); + if (chatbox) { - messages = msgid && chatbox.messages.findWhere({msgid: msgid}) || []; + const messages = msgid && chatbox.messages.findWhere({msgid: msgid}) || []; if (_.isEmpty(messages)) { // Only create the message when we're sure it's not a // duplicate @@ -1661,9 +1651,10 @@ * gets created. * (Object) attrs - Optional chat box atributes. */ - var bare_jid = Strophe.getBareJidFromJid(jid); - var roster_info = {}; - var roster_item = _converse.roster.get(bare_jid); + const bare_jid = Strophe.getBareJidFromJid(jid), + roster_item = _converse.roster.get(bare_jid); + let roster_info = {}; + if (! _.isUndefined(roster_item)) { roster_info = { 'fullname': _.isEmpty(roster_item.get('fullname'))? jid: roster_item.get('fullname'), @@ -1697,7 +1688,7 @@ * (Object) attrs - Optional chat box atributes. */ jid = jid.toLowerCase(); - var chatbox = this.get(Strophe.getBareJidFromJid(jid)); + let chatbox = this.get(Strophe.getBareJidFromJid(jid)); if (!chatbox && create) { chatbox = this.createChatBox(jid, attrs); } @@ -1717,7 +1708,7 @@ * If the #conversejs element doesn't exist, create it. */ if (!this.el) { - var el = document.querySelector('#conversejs'); + let el = document.querySelector('#conversejs'); if (_.isNull(el)) { el = document.createElement('div'); el.setAttribute('id', 'conversejs'); @@ -1755,7 +1746,7 @@ }, getChatBox: function (attrs, create) { - var chatbox = this.model.get(attrs.jid); + let chatbox = this.model.get(attrs.jid); if (!chatbox && create) { chatbox = this.model.create(attrs, { 'error': function (model, response) { @@ -1770,7 +1761,7 @@ /* Find the chat box and show it (if it may be shown). * If it doesn't exist, create it. */ - var chatbox = this.getChatBox(attrs, true); + const chatbox = this.getChatBox(attrs, true); if (this.chatBoxMayBeShown(chatbox)) { chatbox.trigger('show', true); } @@ -1795,7 +1786,7 @@ }, constructPresence: function (type, status_message) { - var presence; + let presence; type = _.isString(type) ? type : (this.get('status') || _converse.default_state); status_message = _.isString(status_message) ? status_message : undefined; // Most of these presence types are actually not explicitly sent, @@ -1839,14 +1830,14 @@ setStatusMessage: function (status_message) { this.sendPresence(this.getStatus(), status_message); - var prev_status = this.get('status_message'); this.save({'status_message': status_message}); if (this.xhr_custom_status) { - var xhr = new XMLHttpRequest(); + const xhr = new XMLHttpRequest(); xhr.open('POST', this.xhr_custom_status_url, true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); xhr.send({'msg': status_message}); } + const prev_status = this.get('status_message'); if (prev_status === status_message) { this.trigger("update-status-ui", this); } @@ -1908,12 +1899,11 @@ }, onItems: function (stanza) { - var that = this; - _.each(stanza.querySelectorAll('query item'), function (item) { + _.each(stanza.querySelectorAll('query item'), (item) => { _converse.connection.disco.info( item.getAttribute('jid'), null, - that.onInfo.bind(that)); + this.onInfo.bind(this)); }); }, @@ -1923,11 +1913,10 @@ // This isn't an IM server component return; } - var that = this; - _.forEach(stanza.querySelectorAll('feature'), function (feature) { - var namespace = feature.getAttribute('var'); - that[namespace] = true; - that.create({ + _.forEach(stanza.querySelectorAll('feature'), (feature) => { + const namespace = feature.getAttribute('var'); + this[namespace] = true; + this.create({ 'var': namespace, 'from': stanza.getAttribute('from') }); @@ -1950,13 +1939,13 @@ }; this.fetchLoginCredentials = function () { - var deferred = new $.Deferred(); - var xhr = new XMLHttpRequest(); + const deferred = new $.Deferred(); + const xhr = new XMLHttpRequest(); xhr.open('GET', _converse.credentials_url, true); xhr.setRequestHeader('Accept', "application/json, text/javascript"); xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 400) { - var data = JSON.parse(xhr.responseText); + const data = JSON.parse(xhr.responseText); deferred.resolve({ 'jid': data.jid, 'password': data.password @@ -1975,12 +1964,12 @@ }; this.startNewBOSHSession = function () { - var xhr = new XMLHttpRequest(); + const xhr = new XMLHttpRequest(); xhr.open('GET', _converse.prebind_url, true); xhr.setRequestHeader('Accept', "application/json, text/javascript"); xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 400) { - var data = JSON.parse(xhr.responseText); + const data = JSON.parse(xhr.responseText); _converse.connection.attach( data.jid, data.sid, data.rid, _converse.onConnectStatusChanged); @@ -1998,8 +1987,8 @@ this.restoreBOSHSession = function (jid_is_required) { /* Tries to restore a cached BOSH session. */ if (!this.jid) { - var msg = "restoreBOSHSession: tried to restore a \"keepalive\" session "+ - "but we don't have the JID for the user!"; + const msg = "restoreBOSHSession: tried to restore a \"keepalive\" session "+ + "but we don't have the JID for the user!"; if (jid_is_required) { throw new Error(msg); } else { @@ -2094,7 +2083,7 @@ } this.connection.connect(this.jid.toLowerCase(), null, this.onConnectStatusChanged); } else if (this.authentication === _converse.LOGIN) { - var password = _.isNil(credentials) ? (_converse.connection.pass || this.password) : credentials.password; + const password = _.isNil(credentials) ? (_converse.connection.pass || this.password) : credentials.password; if (!password) { if (this.auto_login) { throw new Error("initConnection: If you use auto_login and "+ @@ -2104,7 +2093,7 @@ _converse.disconnect(); return; } - var resource = Strophe.getResourceFromJid(this.jid); + const resource = Strophe.getResourceFromJid(this.jid); if (!resource) { this.jid = this.jid.toLowerCase() + _converse.generateResource(); } else { @@ -2182,7 +2171,7 @@ // If initialize is called for the first time, then this array is empty // in any case. _converse.pluggable.initialized_plugins = []; - var whitelist = _converse.core_plugins.concat( + const whitelist = _converse.core_plugins.concat( _converse.whitelisted_plugins); _converse.pluggable.initializePlugins({ @@ -2250,7 +2239,7 @@ return _converse.xmppstatus.get('status'); }, 'set': function (value, message) { - var data = {'status': value}; + const data = {'status': value}; if (!_.includes(_.keys(_converse.STATUS_WEIGHTS), value)) { throw new Error('Invalid availability value. See https://xmpp.org/rfcs/rfc3921.html#rfc.section.2.2.2.1'); } @@ -2282,7 +2271,7 @@ } }, 'set': function (key, val) { - var o = {}; + const o = {}; if (_.isObject(key)) { _.assignIn(_converse, _.pick(key, _.keys(_converse.default_settings))); } else if (_.isString("string")) { @@ -2301,8 +2290,8 @@ }, 'contacts': { 'get': function (jids) { - var _transform = function (jid) { - var contact = _converse.roster.get(Strophe.getBareJidFromJid(jid)); + const _transform = function (jid) { + const contact = _converse.roster.get(Strophe.getBareJidFromJid(jid)); if (contact) { return contact.attributes; } @@ -2324,26 +2313,23 @@ }, 'chats': { 'open': function (jids, attrs) { - var chatbox; if (_.isUndefined(jids)) { _converse.log("chats.open: You need to provide at least one JID", Strophe.LogLevel.ERROR); return null; } else if (_.isString(jids)) { - chatbox = _converse.getViewForChatBox( + return _converse.getViewForChatBox( _converse.chatboxes.getChatBox(jids, true, attrs).trigger('show') ); - return chatbox; } return _.map(jids, function (jid) { - chatbox = _converse.getViewForChatBox( + return _converse.getViewForChatBox( _converse.chatboxes.getChatBox(jid, true, attrs).trigger('show') ); - return chatbox; }); }, 'get': function (jids) { if (_.isUndefined(jids)) { - var result = []; + const result = []; _converse.chatboxes.each(function (chatbox) { // FIXME: Leaky abstraction from MUC. We need to add a // base type for chat boxes, and check for that. @@ -2400,7 +2386,7 @@ }, }, 'waitUntil': function (name) { - var promise = _converse.promises[name]; + const promise = _converse.promises[name]; if (_.isUndefined(promise)) { return null; } diff --git a/src/converse-dragresize.js b/src/converse-dragresize.js index dabeff9b5..b1a672297 100644 --- a/src/converse-dragresize.js +++ b/src/converse-dragresize.js @@ -16,7 +16,7 @@ ], factory); }(this, function (converse, tpl_dragresize) { "use strict"; - var $ = converse.env.jQuery, + const $ = converse.env.jQuery, _ = converse.env._; function renderDragResizeHandles (_converse, view) { diff --git a/src/converse-headline.js b/src/converse-headline.js index a7473a01a..11023e159 100644 --- a/src/converse-headline.js +++ b/src/converse-headline.js @@ -14,7 +14,7 @@ ], factory); }(this, function (converse, tpl_chatbox) { "use strict"; - var _ = converse.env._, + const _ = converse.env._, utils = converse.env.utils; converse.plugins.add('converse-headline', { @@ -28,8 +28,8 @@ ChatBoxViews: { onChatBoxAdded: function (item) { - var _converse = this.__super__._converse; - var view = this.get(item.get('id')); + const _converse = this.__super__._converse; + let view = this.get(item.get('id')); if (!view && item.get('type') === 'headline') { view = new _converse.HeadlinesBoxView({model: item}); this.add(item.get('id'), view); @@ -45,7 +45,7 @@ /* The initialize function gets called as soon as the plugin is * loaded by converse.js's plugin machinery. */ - var _converse = this._converse, + const _converse = this._converse, __ = _converse.__; _converse.HeadlinesBoxView = _converse.ChatBoxView.extend({ @@ -89,14 +89,14 @@ } }); - var onHeadlineMessage = function (message) { + function onHeadlineMessage (message) { /* Handler method for all incoming messages of type "headline". */ - var from_jid = message.getAttribute('from'); + const from_jid = message.getAttribute('from'); if (utils.isHeadlineMessage(message)) { if (_.includes(from_jid, '@') && !_converse.allow_non_roster_messaging) { return; } - var chatbox = _converse.chatboxes.create({ + const chatbox = _converse.chatboxes.create({ 'id': from_jid, 'jid': from_jid, 'fullname': from_jid, @@ -106,12 +106,12 @@ _converse.emit('message', {'chatbox': chatbox, 'stanza': message}); } return true; - }; + } - var registerHeadlineHandler = function () { + function registerHeadlineHandler () { _converse.connection.addHandler( onHeadlineMessage, null, 'message'); - }; + } _converse.on('connected', registerHeadlineHandler); _converse.on('reconnected', registerHeadlineHandler); } diff --git a/src/converse-minimize.js b/src/converse-minimize.js index 9c265dbce..8e5e8f2c7 100644 --- a/src/converse-minimize.js +++ b/src/converse-minimize.js @@ -24,7 +24,8 @@ tpl_chats_panel ) { "use strict"; - var $ = converse.env.jQuery, + + const $ = converse.env.jQuery, _ = converse.env._, utils = converse.env.utils, Backbone = converse.env.Backbone, @@ -40,8 +41,8 @@ // New functions which don't exist yet can also be added. initChatBoxes: function () { - var _converse = this.__super__._converse; - var result = this.__super__.initChatBoxes.apply(this, arguments); + const _converse = this.__super__._converse; + const result = this.__super__.initChatBoxes.apply(this, arguments); _converse.minimized_chats = new _converse.MinimizedChats({ model: _converse.chatboxes }); @@ -49,7 +50,7 @@ }, registerGlobalEventHandlers: function () { - var _converse = this.__super__._converse; + const _converse = this.__super__._converse; $(window).on("resize", _.debounce(function (ev) { if (_converse.connection.connected) { _converse.chatboxviews.trimChats(); @@ -96,7 +97,7 @@ }, _show: function () { - var _converse = this.__super__._converse; + const _converse = this.__super__._converse; if (!this.model.get('minimized')) { this.__super__._show.apply(this, arguments); _converse.chatboxviews.trimChats(this); diff --git a/src/converse-muc-embedded.js b/src/converse-muc-embedded.js index 0e759c76b..b37c044f9 100644 --- a/src/converse-muc-embedded.js +++ b/src/converse-muc-embedded.js @@ -8,7 +8,7 @@ define(["converse-core", "converse-muc"], factory); }(this, function (converse) { "use strict"; - var Backbone = converse.env.Backbone, + const Backbone = converse.env.Backbone, _ = converse.env._; converse.plugins.add('converse-muc-embedded', { @@ -23,7 +23,7 @@ onConnected: function () { // Override to avoid storing or fetching chat boxes from session // storage. - var _converse = this.__super__._converse; + const _converse = this.__super__._converse; this.browserStorage = new Backbone.BrowserStorage[_converse.storage]( converse.env.b64_sha1('converse.chatboxes-'+_converse.bare_jid)); this.registerMessageHandler(); @@ -41,7 +41,7 @@ ChatRoomView: { insertIntoDOM: function () { if (!document.body.contains(this.el)) { - var container = document.querySelector('#converse-embedded-chat'); + const container = document.querySelector('#converse-embedded-chat'); container.innerHTML = ''; container.appendChild(this.el); } @@ -54,7 +54,7 @@ /* The initialize function gets called as soon as the plugin is * loaded by converse.js's plugin machinery. */ - var _converse = this._converse; + const _converse = this._converse; if (!_.isArray(_converse.auto_join_rooms)) { throw new Error("converse-muc-embedded: auto_join_rooms must be an Array"); } @@ -62,7 +62,7 @@ throw new Error("converse-muc-embedded: It doesn't make "+ "sense to have the auto_join_rooms setting to zero or "+ "more then one, since only one chat room can be open "+ - "at any time.") + "at any time."); } } }); diff --git a/src/converse-muc.js b/src/converse-muc.js index b7f3f7bbd..1c6df5aba 100755 --- a/src/converse-muc.js +++ b/src/converse-muc.js @@ -57,11 +57,11 @@ ) { "use strict"; - var ROOMS_PANEL_ID = 'chatrooms'; - var CHATROOMS_TYPE = 'chatroom'; + const ROOMS_PANEL_ID = 'chatrooms'; + const CHATROOMS_TYPE = 'chatroom'; // Strophe methods for building stanzas - var Strophe = converse.env.Strophe, + const Strophe = converse.env.Strophe, Backbone = converse.env.Backbone, $iq = converse.env.$iq, $build = converse.env.$build, @@ -71,7 +71,7 @@ sizzle = converse.env.sizzle, utils = converse.env.utils; // Other necessary globals - var $ = converse.env.jQuery, + const $ = converse.env.jQuery, _ = converse.env._, fp = converse.env.fp, moment = converse.env.moment; @@ -83,13 +83,13 @@ Strophe.addNamespace('MUC_ROOMCONF', Strophe.NS.MUC + "#roomconfig"); Strophe.addNamespace('MUC_USER', Strophe.NS.MUC + "#user"); - var ROOM_FEATURES = [ + const ROOM_FEATURES = [ 'passwordprotected', 'unsecured', 'hidden', 'public', 'membersonly', 'open', 'persistent', 'temporary', 'nonanonymous', 'semianonymous', 'moderated', 'unmoderated', 'mam_enabled' ]; - var ROOM_FEATURES_MAP = { + const ROOM_FEATURES_MAP = { 'passwordprotected': 'unsecured', 'unsecured': 'passwordprotected', 'hidden': 'public', @@ -103,7 +103,7 @@ 'moderated': 'unmoderated', 'unmoderated': 'moderated' }; - var ROOMSTATUS = { + const ROOMSTATUS = { CONNECTED: 0, CONNECTING: 1, NICKNAME_REQUIRED: 2, @@ -144,7 +144,7 @@ Features: { addClientFeatures: function () { - var _converse = this.__super__._converse; + const _converse = this.__super__._converse; this.__super__.addClientFeatures.apply(this, arguments); if (_converse.allow_muc_invitations) { _converse.connection.disco.addFeature('jabber:x:conference'); // Invites @@ -157,7 +157,7 @@ ChatBoxes: { model: function (attrs, options) { - var _converse = this.__super__._converse; + const _converse = this.__super__._converse; if (attrs.type == CHATROOMS_TYPE) { return new _converse.ChatRoom(attrs, options); } else { @@ -168,7 +168,7 @@ ControlBoxView: { renderRoomsPanel: function () { - var _converse = this.__super__._converse; + const _converse = this.__super__._converse; this.roomspanel = new _converse.RoomsPanel({ '$parent': this.$el.find('.controlbox-panes'), 'model': new (Backbone.Model.extend({ @@ -187,7 +187,7 @@ }, renderContactsPanel: function () { - var _converse = this.__super__._converse; + const _converse = this.__super__._converse; this.__super__.renderContactsPanel.apply(this, arguments); if (_converse.allow_muc) { this.renderRoomsPanel(); @@ -195,7 +195,7 @@ }, onConnected: function () { - var _converse = this.__super__._converse; + const _converse = this.__super__._converse; this.__super__.onConnected.apply(this, arguments); if (!this.model.get('connected')) { return; @@ -205,7 +205,7 @@ _converse.features.on('add', this.featureAdded, this); // Features could have been added before the controlbox was // initialized. We're only interested in MUC - var feature = _converse.features.findWhere({ + const feature = _converse.features.findWhere({ 'var': Strophe.NS.MUC }); if (feature) { @@ -218,14 +218,14 @@ setMUCDomain: function (domain) { this.roomspanel.model.save({'muc_domain': domain}); - var $server= this.$el.find('input.new-chatroom-server'); + const $server= this.$el.find('input.new-chatroom-server'); if (!$server.is(':focus')) { $server.val(this.roomspanel.model.get('muc_domain')); } }, featureAdded: function (feature) { - var _converse = this.__super__._converse; + const _converse = this.__super__._converse; if ((feature.get('var') === Strophe.NS.MUC) && (_converse.allow_muc)) { this.setMUCDomain(feature.get('from')); } @@ -234,8 +234,8 @@ ChatBoxViews: { onChatBoxAdded: function (item) { - var _converse = this.__super__._converse; - var view = this.get(item.get('id')); + const _converse = this.__super__._converse; + let view = this.get(item.get('id')); if (!view && item.get('type') === CHATROOMS_TYPE) { view = new _converse.ChatRoomView({'model': item}); return this.add(item.get('id'), view); @@ -250,7 +250,7 @@ /* The initialize function gets called as soon as the plugin is * loaded by converse.js's plugin machinery. */ - var _converse = this._converse, + const _converse = this._converse, __ = _converse.__, ___ = _converse.___; // XXX: Inside plugins, all calls to the translation machinery @@ -402,7 +402,7 @@ * Parameters: * (XMLElement): The stanza */ - var body = stanza.querySelector('body') + const body = stanza.querySelector('body'); if (_.isNull(body)) { return; // The message has no text } @@ -446,7 +446,6 @@ }, initialize: function () { - var that = this; this.model.messages.on('add', this.onMessageAdded, this); this.model.on('show', this.show, this); this.model.on('destroy', this.hide, this); @@ -461,10 +460,10 @@ this.registerHandlers(); if (this.model.get('connection_status') !== ROOMSTATUS.ENTERED) { - this.getRoomFeatures().always(function () { - that.join(); - that.fetchMessages(); - _converse.emit('chatRoomOpened', that); + this.getRoomFeatures().always(() => { + this.join(); + this.fetchMessages(); + _converse.emit('chatRoomOpened', this); }); } else { this.fetchMessages(); @@ -513,10 +512,10 @@ createOccupantsView: function () { /* Create the ChatRoomOccupantsView Backbone.View */ - var model = new _converse.ChatRoomOccupants(); + const model = new _converse.ChatRoomOccupants(); model.chatroomview = this; this.occupantsview = new _converse.ChatRoomOccupantsView({'model': model}); - var id = b64_sha1('converse.occupants'+_converse.bare_jid+this.model.get('jid')); + const id = b64_sha1('converse.occupants'+_converse.bare_jid+this.model.get('jid')); this.occupantsview.model.browserStorage = new Backbone.BrowserStorage.session(id); this.occupantsview.render(); this.occupantsview.model.fetch({add:true}); @@ -527,7 +526,7 @@ if (document.querySelector('body').contains(this.el)) { return; } - var view = _converse.chatboxviews.get("controlbox"); + const view = _converse.chatboxviews.get("controlbox"); if (view) { this.$el.insertAfter(view.$el); } else { @@ -570,7 +569,7 @@ }, getExtraMessageClasses: function (attrs) { - var extra_classes = _converse.ChatBoxView.prototype + let extra_classes = _converse.ChatBoxView.prototype .getExtraMessageClasses.apply(this, arguments); if (this.is_chatroom && attrs.sender === 'them' && @@ -649,9 +648,9 @@ * A promise which resolves once the list has been * retrieved. */ - var deferred = new $.Deferred(); + const deferred = new $.Deferred(); affiliation = affiliation || 'member'; - var iq = $iq({to: chatroom_jid, type: "get"}) + const iq = $iq({to: chatroom_jid, type: "get"}) .c("query", {xmlns: Strophe.NS.MUC_ADMIN}) .c("item", {'affiliation': affiliation}); _converse.connection.sendIQ(iq, deferred.resolve, deferred.reject); @@ -700,17 +699,17 @@ * (Array) new_list: Array containing the new affiliations * (Array) old_list: Array containing the old affiliations */ - var new_jids = _.map(new_list, 'jid'); - var old_jids = _.map(old_list, 'jid'); + const new_jids = _.map(new_list, 'jid'); + const old_jids = _.map(old_list, 'jid'); // Get the new affiliations - var delta = _.map(_.difference(new_jids, old_jids), function (jid) { + let delta = _.map(_.difference(new_jids, old_jids), function (jid) { return new_list[_.indexOf(new_jids, jid)]; }); if (!exclude_existing) { // Get the changed affiliations delta = delta.concat(_.filter(new_list, function (item) { - var idx = _.indexOf(old_jids, item.jid); + const idx = _.indexOf(old_jids, item.jid); if (idx >= 0) { return item.affiliation !== old_list[idx].affiliation; } @@ -736,8 +735,8 @@ * (Object) member: Map containing the member's jid and * optionally a reason and affiliation. */ - var deferred = new $.Deferred(); - var iq = $iq({to: chatroom_jid, type: "set"}) + const deferred = new $.Deferred(); + const iq = $iq({to: chatroom_jid, type: "set"}) .c("query", {xmlns: Strophe.NS.MUC_ADMIN}) .c("item", { 'affiliation': member.affiliation || affiliation, @@ -779,7 +778,7 @@ return _.isUndefined(member.affiliation) || member.affiliation === affiliation; }); - var promises = _.map( + const promises = _.map( members, _.partial(this.sendAffiliationIQ, this.model.get('jid'), affiliation) ); @@ -802,8 +801,8 @@ onSuccess(null); return; } - var affiliations = _.uniq(_.map(members, 'affiliation')); - var promises = _.map(affiliations, _.partial(this.setAffiliation.bind(this), _, members)); + const affiliations = _.uniq(_.map(members, 'affiliation')); + const promises = _.map(affiliations, _.partial(this.setAffiliation.bind(this), _, members)); $.when.apply($, promises).done(onSuccess).fail(onError); }, @@ -825,8 +824,8 @@ if (_.isString(affiliations)) { affiliations = [affiliations]; } - var deferred = new $.Deferred(); - var promises = _.map(affiliations, _.partial(this.requestMemberList, this.model.get('jid'))); + const deferred = new $.Deferred(); + const promises = _.map(affiliations, _.partial(this.requestMemberList, this.model.get('jid'))); $.when.apply($, promises).always( _.flow(this.marshallAffiliationIQs.bind(this), deferred.resolve) ); @@ -851,10 +850,9 @@ * updated or once it's been established there's no need * to update the list. */ - var that = this; - var deferred = new $.Deferred(); - this.getJidsWithAffiliations(affiliations).then(function (old_members) { - that.setAffiliations( + const deferred = new $.Deferred(); + this.getJidsWithAffiliations(affiliations).then((old_members) => { + this.setAffiliations( deltaFunc(members, old_members), deferred.resolve, deferred.reject @@ -875,21 +873,21 @@ // the person to the member list by giving them an // affiliation of 'member' (if they're not affiliated // already), otherwise they won't be able to join. - var map = {}; map[recipient] = 'member'; - var deltaFunc = _.partial(this.computeAffiliationsDelta, true, false); + const map = {}; map[recipient] = 'member'; + const deltaFunc = _.partial(this.computeAffiliationsDelta, true, false); this.updateMemberLists( [{'jid': recipient, 'affiliation': 'member', 'reason': reason}], ['member', 'owner', 'admin'], deltaFunc ); } - var attrs = { + const attrs = { 'xmlns': 'jabber:x:conference', 'jid': this.model.get('jid') }; if (reason !== null) { attrs.reason = reason; } if (this.model.get('password')) { attrs.password = this.model.get('password'); } - var invitation = $msg({ + const invitation = $msg({ from: _converse.connection.jid, to: recipient, id: _converse.connection.getUniqueId() @@ -928,7 +926,7 @@ if (this.model.get('connection_status') !== ROOMSTATUS.ENTERED) { return; } - var chat_state = this.model.get('chat_state'); + const chat_state = this.model.get('chat_state'); if (chat_state === _converse.GONE) { // is not applicable within MUC context return; @@ -948,8 +946,8 @@ * Parameters: * (String) text: The message text to be sent. */ - var msgid = _converse.connection.getUniqueId(); - var msg = $msg({ + const msgid = _converse.connection.getUniqueId(); + const msg = $msg({ to: this.model.get('jid'), from: _converse.connection.jid, type: 'groupchat', @@ -967,8 +965,8 @@ }, modifyRole: function(room, nick, role, reason, onSuccess, onError) { - var item = $build("item", {nick: nick, role: role}); - var iq = $iq({to: room, type: "set"}).c("query", {xmlns: Strophe.NS.MUC_ADMIN}).cnode(item.node); + const item = $build("item", {nick: nick, role: role}); + const iq = $iq({to: room, type: "set"}).c("query", {xmlns: Strophe.NS.MUC_ADMIN}).cnode(item.node); if (reason !== null) { iq.c("reason", reason); } return _converse.connection.sendIQ(iq.tree(), onSuccess, onError); }, @@ -992,7 +990,7 @@ /* Remove all messages from the chat room UI. */ if (!_.isUndefined(ev)) { ev.stopPropagation(); } - var result = confirm(__("Are you sure you want to clear the messages from this room?")); + const result = confirm(__("Are you sure you want to clear the messages from this room?")); if (result === true) { this.$content.empty(); } @@ -1013,7 +1011,7 @@ if (_converse.muc_disable_moderator_commands) { return this.sendChatRoomMessage(text); } - var match = text.replace(/^\s*/, "").match(/^\/(.*?)(?: (.*))?$/) || [false, '', ''], + const match = text.replace(/^\s*/, "").match(/^\/(.*?)(?: (.*))?$/) || [false, '', ''], args = match[2] && match[2].splitOnce(' ') || [], command = match[1].toLowerCase(); switch (command) { @@ -1134,12 +1132,12 @@ * Parameters: * (XMLElement) stanza: The message stanza. */ - var configuration_changed = stanza.querySelector("status[code='104']"); - var logging_enabled = stanza.querySelector("status[code='170']"); - var logging_disabled = stanza.querySelector("status[code='171']"); - var room_no_longer_anon = stanza.querySelector("status[code='172']"); - var room_now_semi_anon = stanza.querySelector("status[code='173']"); - var room_now_fully_anon = stanza.querySelector("status[code='173']"); + const configuration_changed = stanza.querySelector("status[code='104']"); + const logging_enabled = stanza.querySelector("status[code='170']"); + const logging_disabled = stanza.querySelector("status[code='171']"); + const room_no_longer_anon = stanza.querySelector("status[code='172']"); + const room_now_semi_anon = stanza.querySelector("status[code='173']"); + const room_now_fully_anon = stanza.querySelector("status[code='173']"); if (configuration_changed || logging_enabled || logging_disabled || room_no_longer_anon || room_now_semi_anon || room_now_fully_anon) { this.getRoomFeatures(); @@ -1162,9 +1160,9 @@ } else { nick = this.model.get('nick'); } - var room = this.model.get('jid'); - var node = Strophe.getNodeFromJid(room); - var domain = Strophe.getDomainFromJid(room); + const room = this.model.get('jid'); + const node = Strophe.getNodeFromJid(room); + const domain = Strophe.getDomainFromJid(room); return node + "@" + domain + (nick !== null ? "/" + nick : ""); }, @@ -1172,7 +1170,7 @@ /* Register presence and message handlers for this chat * room */ - var room_jid = this.model.get('jid'); + const room_jid = this.model.get('jid'); this.removeHandlers(); this.presence_handler = _converse.connection.addHandler( this.onChatRoomPresence.bind(this), @@ -1218,7 +1216,7 @@ // so we don't send out a presence stanza again. return this; } - var stanza = $pres({ + const stanza = $pres({ 'from': _converse.connection.jid, 'to': this.getRoomJIDAndNick(nick) }).c("x", {'xmlns': Strophe.NS.MUC}) @@ -1275,19 +1273,18 @@ * (XMLElement) stanza: The IQ stanza containing the room * config. */ - var that = this, - $body = this.$('.chatroom-body'); + const $body = this.$('.chatroom-body'); $body.children().addClass('hidden'); // Remove any existing forms $body.find('form.chatroom-form').remove(); $body.append(tpl_chatroom_form()); - var $form = $body.find('form.chatroom-form'), - $fieldset = $form.children('fieldset:first'), - $stanza = $(stanza), - $fields = $stanza.find('field'), - title = $stanza.find('title').text(), - instructions = $stanza.find('instructions').text(); + const $form = $body.find('form.chatroom-form'); + let $fieldset = $form.children('fieldset:first'); + const $stanza = $(stanza), + $fields = $stanza.find('field'), + title = $stanza.find('title').text(), + instructions = $stanza.find('instructions').text(); $fieldset.find('span.spinner').remove(); $fieldset.append($('').text(title)); if (instructions && instructions !== title) { @@ -1300,13 +1297,13 @@ $fieldset = $form.children('fieldset:last'); $fieldset.append(''); $fieldset.append(''); - $fieldset.find('input[type=button]').on('click', function (ev) { + $fieldset.find('input[type=button]').on('click', (ev) => { ev.preventDefault(); - that.cancelConfiguration(); + this.cancelConfiguration(); }); - $form.on('submit', function (ev) { + $form.on('submit', (ev) => { ev.preventDefault(); - that.saveConfiguration(ev.target); + this.saveConfiguration(ev.target); }); }, @@ -1324,7 +1321,7 @@ * room configuration. * The second is the response IQ from the server. */ - var iq = $iq({to: this.model.get('jid'), type: "set"}) + const iq = $iq({to: this.model.get('jid'), type: "set"}) .c("query", {xmlns: Strophe.NS.MUC_OWNER}) .c("x", {xmlns: Strophe.NS.XFORM, type: "submit"}); _.each(config || [], function (node) { iq.cnode(node).up(); }); @@ -1343,9 +1340,8 @@ * Parameters: * (HTMLElement) form: The configuration form DOM element. */ - var deferred = new $.Deferred(); - var that = this; - var $inputs = $(form).find(':input:not([type=button]):not([type=submit])'), + const deferred = new $.Deferred(); + const $inputs = $(form).find(':input:not([type=button]):not([type=submit])'), configArray = []; $inputs.each(function () { configArray.push(utils.webForm2xForm(this)); @@ -1355,11 +1351,10 @@ deferred.resolve, deferred.reject ); - this.$el.find('div.chatroom-form-container').hide( - function () { - $(this).remove(); - that.renderAfterTransition(); - }); + this.$el.find('div.chatroom-form-container').hide((el) => { + $(el).remove(); + this.renderAfterTransition(); + }); return deferred.promise(); }, @@ -1374,8 +1369,8 @@ * (XMLElement) stanza: IQ stanza from the server, * containing the configuration. */ - var that = this, - deferred = new $.Deferred(); + var that = this; + const deferred = new $.Deferred(); this.fetchRoomConfiguration().then(function (stanza) { var configArray = [], @@ -1418,11 +1413,10 @@ /* Remove the configuration form without submitting and * return to the chat view. */ - var that = this; this.$el.find('div.chatroom-form-container').hide( - function () { - $(this).remove(); - that.renderAfterTransition(); + (el) => { + $(el).remove(); + this.renderAfterTransition(); }); }, @@ -1434,16 +1428,15 @@ * Parameters: * (Function) handler: The handler for the response IQ */ - var that = this; - var deferred = new $.Deferred(); + const deferred = new $.Deferred(); _converse.connection.sendIQ( $iq({ 'to': this.model.get('jid'), 'type': "get" }).c("query", {xmlns: Strophe.NS.MUC_OWNER}), - function (iq) { + (iq) => { if (handler) { - handler.apply(that, arguments); + handler.apply(this, arguments); } deferred.resolve(iq); }, @@ -1456,7 +1449,7 @@ /* Fetch the room disco info, parse it and then * save it on the Backbone.Model of this chat rooms. */ - var deferred = new $.Deferred(); + const deferred = new $.Deferred(); var that = this; _converse.connection.disco.info(this.model.get('jid'), null, function (iq) { @@ -1475,11 +1468,11 @@ * * */ - var features = { + const features = { 'features_fetched': true }; _.each(iq.querySelectorAll('feature'), function (field) { - var fieldname = field.getAttribute('var'); + const fieldname = field.getAttribute('var'); if (!fieldname.startsWith('muc_')) { if (fieldname === Strophe.NS.MAM) { features.mam_enabled = true; @@ -1488,7 +1481,7 @@ } features[fieldname.replace('muc_', '')] = true; }); - var desc_field = iq.querySelector('field[var="muc#roominfo_description"] value'); + const desc_field = iq.querySelector('field[var="muc#roominfo_description"] value'); if (!_.isNull(desc_field)) { features.description = desc_field.textContent; } @@ -1526,8 +1519,8 @@ * chat room with it. */ ev.preventDefault(); - var nick_el = ev.target.nick; - var nick = nick_el.value; + const nick_el = ev.target.nick; + const nick = nick_el.value; if (!nick) { nick_el.classList.add('error'); return; @@ -1572,7 +1565,7 @@ * Parameters: * (XMLElement) iq: The received IQ stanza */ - var nick = $(iq) + const nick = $(iq) .find('query[node="x-roomuser-item"] identity') .attr('name'); if (!nick) { @@ -1611,12 +1604,12 @@ * muc_nickname_from_jid. */ if (_converse.muc_nickname_from_jid) { - var nick = presence.getAttribute('from').split('/')[1]; + const nick = presence.getAttribute('from').split('/')[1]; if (nick === this.getDefaultNickName()) { this.join(nick + '-2'); } else { - var del= nick.lastIndexOf("-"); - var num = nick.substring(del+1, nick.length); + const del= nick.lastIndexOf("-"); + const num = nick.substring(del+1, nick.length); this.join(nick.substring(0, del+1) + String(Number(num)+1)); } } else { @@ -1649,7 +1642,7 @@ submitPassword: function (ev) { ev.preventDefault(); - var password = this.$el.find('.chatroom-form').find('input[type=password]').val(); + const password = this.$el.find('.chatroom-form').find('input[type=password]').val(); this.$el.find('.chatroom-form-container').replaceWith(tpl_spinner); this.join(this.model.get('nick'), password); }, @@ -1683,11 +1676,12 @@ * current user. * (XMLElement) stanza: The original stanza received. */ - var code = stat.getAttribute('code'), nick; + const code = stat.getAttribute('code'); if (code === '110') { return; } if (code in _converse.muc.info_messages) { return _converse.muc.info_messages[code]; } + let nick; if (!is_self) { if (code in _converse.muc.action_info_messages) { nick = Strophe.getResourceFromJid(stanza.getAttribute('from')); @@ -1711,11 +1705,11 @@ * Parameters: * (XMLElement) pres: A stanza. */ - var item = sizzle('x[xmlns="'+Strophe.NS.MUC_USER+'"] item', pres).pop(); - var is_self = pres.querySelector("status[code='110']"); + const item = sizzle('x[xmlns="'+Strophe.NS.MUC_USER+'"] item', pres).pop(); + const is_self = pres.querySelector("status[code='110']"); if (is_self && !_.isNil(item)) { - var affiliation = item.getAttribute('affiliation'); - var role = item.getAttribute('role'); + const affiliation = item.getAttribute('affiliation'); + const role = item.getAttribute('role'); if (affiliation) { this.model.save({'affiliation': affiliation}); } @@ -1731,33 +1725,33 @@ * information. */ // 1. Get notification messages based on the elements. - var statuses = x.querySelectorAll('status'); - var mapper = _.partial(this.getMessageFromStatus, _, stanza, is_self); - var notification = {}; - var messages = _.reject(_.map(statuses, mapper), _.isUndefined); + const statuses = x.querySelectorAll('status'); + const mapper = _.partial(this.getMessageFromStatus, _, stanza, is_self); + const notification = {}; + const messages = _.reject(_.map(statuses, mapper), _.isUndefined); if (messages.length) { notification.messages = messages; } // 2. Get disconnection messages based on the elements - var codes = _.invokeMap(statuses, Element.prototype.getAttribute, 'code'); - var disconnection_codes = _.intersection(codes, _.keys(_converse.muc.disconnect_messages)); - var disconnected = is_self && disconnection_codes.length > 0; + const codes = _.invokeMap(statuses, Element.prototype.getAttribute, 'code'); + const disconnection_codes = _.intersection(codes, _.keys(_converse.muc.disconnect_messages)); + const disconnected = is_self && disconnection_codes.length > 0; if (disconnected) { notification.disconnected = true; notification.disconnection_message = _converse.muc.disconnect_messages[disconnection_codes[0]]; } // 3. Find the reason and actor from the element - var item = x.querySelector('item'); + const item = x.querySelector('item'); // By using querySelector above, we assume here there is // one per // element. This appears to be a safe assumption, since // each element pertains to a single user. if (!_.isNull(item)) { - var reason = item.querySelector('reason'); + const reason = item.querySelector('reason'); if (reason) { notification.reason = reason ? reason.textContent : undefined; } - var actor = item.querySelector('actor'); + const actor = item.querySelector('actor'); if (actor) { notification.actor = actor ? actor.getAttribute('nick') : undefined; } @@ -1770,7 +1764,6 @@ * parseXUserElement, display any relevant messages and * information to the user. */ - var that = this; if (notification.disconnected) { this.showDisconnectMessage(notification.disconnection_message); if (notification.actor) { @@ -1782,8 +1775,8 @@ this.model.save('connection_status', ROOMSTATUS.DISCONNECTED); return; } - _.each(notification.messages, function (message) { - that.$content.append(tpl_info({'message': message})); + _.each(notification.messages, (message) => { + this.$content.append(tpl_info({'message': message})); }); if (notification.reason) { this.showStatusNotification(__('The reason given is: "'+notification.reason+'"'), true); @@ -1800,8 +1793,8 @@ // XXX: some mangling required to make the returned // result look like the structure returned by // parseXUserElement. Not nice... - var nick = Strophe.getResourceFromJid(stanza.getAttribute('from')); - var stat = stanza.querySelector('status'); + const nick = Strophe.getResourceFromJid(stanza.getAttribute('from')); + const stat = stanza.querySelector('status'); if (stanza.getAttribute('type') === 'unavailable') { if (!_.isNull(stat) && stat.textContent) { return [{'messages': [__(nick+' has left the room. "'+stat.textContent+'"')]}]; @@ -1829,10 +1822,10 @@ * (XMLElement) stanza: The message or presence stanza * containing the status codes. */ - var elements = sizzle('x[xmlns="'+Strophe.NS.MUC_USER+'"]', stanza); - var is_self = stanza.querySelectorAll("status[code='110']").length; - var iteratee = _.partial(this.parseXUserElement.bind(this), _, stanza, is_self); - var notifications = _.reject(_.map(elements, iteratee), _.isEmpty); + const elements = sizzle('x[xmlns="'+Strophe.NS.MUC_USER+'"]', stanza); + const is_self = stanza.querySelectorAll("status[code='110']").length; + const iteratee = _.partial(this.parseXUserElement.bind(this), _, stanza, is_self); + let notifications = _.reject(_.map(elements, iteratee), _.isEmpty); if (_.isEmpty(notifications) && _converse.muc_show_join_leave && stanza.nodeName === 'presence' && @@ -1846,7 +1839,7 @@ showErrorMessage: function (presence) { // We didn't enter the room, so we must remove it from the MUC add-on - var error = presence.querySelector('error'); + const error = presence.querySelector('error'); if (error.getAttribute('type') === 'auth') { if (!_.isNull(error.querySelector('not-authorized'))) { this.renderPasswordForm(); @@ -1901,7 +1894,7 @@ * Also make sure then that the chat area and occupants * list are both visible. */ - var spinner = this.el.querySelector('.spinner'); + const spinner = this.el.querySelector('.spinner'); if (!_.isNull(spinner)) { spinner.parentNode.removeChild(spinner); this.renderAfterTransition(); @@ -1927,7 +1920,7 @@ */ this.saveAffiliationAndRole(pres); - var locked_room = pres.querySelector("status[code='201']"); + const locked_room = pres.querySelector("status[code='201']"); if (locked_room) { if (this.model.get('auto_configure')) { this.autoConfigureChatRoom().then(this.getRoomFeatures.bind(this)); @@ -1964,7 +1957,7 @@ this.showErrorMessage(pres); return true; } - var is_self = pres.querySelector("status[code='110']"); + const is_self = pres.querySelector("status[code='110']"); if (is_self && pres.getAttribute('type') !== 'unavailable') { this.onOwnChatRoomPresence(pres); } @@ -2052,8 +2045,8 @@ }, render: function () { - var show = this.model.get('show') || 'online'; - var new_el = tpl_occupant( + const show = this.model.get('show') || 'online'; + const new_el = tpl_occupant( _.extend( { 'jid': '', 'show': show, @@ -2065,7 +2058,7 @@ }, this.model.toJSON() ) ); - var $parents = this.$el.parents(); + const $parents = this.$el.parents(); if ($parents.length) { this.$el.replaceWith(new_el); this.setElement($parents.first().children('#'+this.model.get('id')), true); @@ -2126,10 +2119,10 @@ }, renderInviteWidget: function () { - var form = this.el.querySelector('form.room-invite'); + let form = this.el.querySelector('form.room-invite'); if (this.shouldInviteWidgetBeShown()) { if (_.isNull(form)) { - var heading = this.el.querySelector('.occupants-heading'); + const heading = this.el.querySelector('.occupants-heading'); form = tpl_chatroom_invite({ 'label_invitation': __('Invite'), }); @@ -2145,7 +2138,7 @@ }, renderRoomFeatures: function () { - var picks = _.pick(this.chatroomview.model.attributes, ROOM_FEATURES), + const picks = _.pick(this.chatroomview.model.attributes, ROOM_FEATURES), iteratee = function (a, v) { return a || v; }, el = this.el.querySelector('.chatroom-features'); @@ -2199,7 +2192,7 @@ this.renderRoomFeatures, 100, {'leading': false} ); } - var changed_features = {}; + const changed_features = {}; _.each(_.keys(model.changed), function (k) { if (!_.isNil(ROOM_FEATURES_MAP[k])) { changed_features[ROOM_FEATURES_MAP[k]] = !model.changed[k]; @@ -2211,13 +2204,13 @@ setOccupantsHeight: function () { - var el = this.el.querySelector('.chatroom-features'); + const el = this.el.querySelector('.chatroom-features'); this.el.querySelector('.occupant-list').style.cssText = 'height: calc(100% - '+el.offsetHeight+'px - 5em);'; }, onOccupantAdded: function (item) { - var view = this.get(item.get('id')); + let view = this.get(item.get('id')); if (!view) { view = this.add( item.get('id'), @@ -2232,8 +2225,8 @@ }, parsePresence: function (pres) { - var id = Strophe.getResourceFromJid(pres.getAttribute("from")); - var data = { + const id = Strophe.getResourceFromJid(pres.getAttribute("from")); + const data = { nick: id, type: pres.getAttribute("type"), states: [] @@ -2276,7 +2269,7 @@ * otherwise we use the nick. We don't always have both, * but should have at least one or the other. */ - var jid = Strophe.getBareJidFromJid(data.jid); + const jid = Strophe.getBareJidFromJid(data.jid); if (jid !== null) { return this.model.where({'jid': jid}).pop(); } else { @@ -2291,31 +2284,29 @@ * Parameters: * (XMLElement) pres: The presence stanza */ - var data = this.parsePresence(pres); + const data = this.parsePresence(pres); if (data.type === 'error') { return true; } - var occupant = this.findOccupant(data); - switch (data.type) { - case 'unavailable': - if (occupant) { occupant.destroy(); } - break; - default: - var jid = Strophe.getBareJidFromJid(data.jid); - var attributes = _.extend(data, { - 'jid': jid ? jid : undefined, - 'resource': data.jid ? Strophe.getResourceFromJid(data.jid) : undefined - }); - if (occupant) { - occupant.save(attributes); - } else { - this.model.create(attributes); - } + const occupant = this.findOccupant(data); + if (data.type === 'unavailable') { + if (occupant) { occupant.destroy(); } + } else { + const jid = Strophe.getBareJidFromJid(data.jid); + const attributes = _.extend(data, { + 'jid': jid ? jid : undefined, + 'resource': data.jid ? Strophe.getResourceFromJid(data.jid) : undefined + }); + if (occupant) { + occupant.save(attributes); + } else { + this.model.create(attributes); + } } }, promptForInvite: function (suggestion) { - var reason = prompt( + const reason = prompt( __(___('You are about to invite %1$s to the chat room "%2$s". '), suggestion.text.label, this.model.get('id')) + __("You may optionally include a message, explaining the reason for the invitation.") ); @@ -2327,7 +2318,7 @@ inviteFormSubmitted: function (evt) { evt.preventDefault(); - var el = evt.target.querySelector('input.invited-contact'); + const el = evt.target.querySelector('input.invited-contact'); this.promptForInvite({ 'target': el, 'text': { @@ -2344,17 +2335,17 @@ }, initInviteWidget: function () { - var form = this.el.querySelector('form.room-invite'); + const form = this.el.querySelector('form.room-invite'); if (_.isNull(form)) { return; } form.addEventListener('submit', this.inviteFormSubmitted.bind(this)); - var el = this.el.querySelector('input.invited-contact'); - var list = _converse.roster.map(function (item) { - var label = item.get('fullname') || item.get('jid'); + const el = this.el.querySelector('input.invited-contact'); + const list = _converse.roster.map(function (item) { + const label = item.get('fullname') || item.get('jid'); return {'label': label, 'value':item.get('jid')}; }); - var awesomplete = new Awesomplete(el, { + const awesomplete = new Awesomplete(el, { 'minChars': 1, 'list': list }); @@ -2401,7 +2392,7 @@ 'label_show_rooms': __('Show rooms') }); this.renderTab(); - var controlbox = _converse.chatboxes.get('controlbox'); + const controlbox = _converse.chatboxes.get('controlbox'); if (controlbox.get('active-panel') !== ROOMS_PANEL_ID) { this.el.classList.add('hidden'); } @@ -2409,8 +2400,8 @@ }, renderTab: function () { - var controlbox = _converse.chatboxes.get('controlbox'); - var chatrooms = fp.filter( + const controlbox = _converse.chatboxes.get('controlbox'); + const chatrooms = fp.filter( _.partial(utils.isOfType, CHATROOMS_TYPE), _converse.chatboxes.models ); @@ -2429,7 +2420,7 @@ }, onDomainChange: function (model) { - var $server = this.$el.find('input.new-chatroom-server'); + const $server = this.$el.find('input.new-chatroom-server'); $server.val(model.get('muc_domain')); if (_converse.auto_list_rooms) { this.updateRoomsList(); @@ -2437,12 +2428,12 @@ }, onNickChange: function (model) { - var $nick = this.$el.find('input.new-chatroom-nick'); + const $nick = this.$el.find('input.new-chatroom-nick'); $nick.val(model.get('nick')); }, informNoRoomsFound: function () { - var $available_chatrooms = this.$el.find('#available-chatrooms'); + const $available_chatrooms = this.$el.find('#available-chatrooms'); // For translators: %1$s is a variable and will be replaced with the XMPP server name $available_chatrooms.html('
'+__('No rooms on %1$s',this.model.get('muc_domain'))+'
'); $('input#show-rooms').show().siblings('span.spinner').remove(); @@ -2495,9 +2486,9 @@ }, showRooms: function () { - var $available_chatrooms = this.$el.find('#available-chatrooms'); - var $server = this.$el.find('input.new-chatroom-server'); - var server = $server.val(); + const $available_chatrooms = this.$el.find('#available-chatrooms'); + const $server = this.$el.find('input.new-chatroom-server'); + const server = $server.val(); if (!server) { $server.addClass('error'); return; @@ -2519,7 +2510,7 @@ * (XMLElement) stanza: The IQ stanza containing the room * info. */ - var $stanza = $(stanza); + const $stanza = $(stanza); // All MUC features found here: http://xmpp.org/registrar/disco-features.html $(el).find('span.spinner').replaceWith( tpl_room_description({ @@ -2559,7 +2550,7 @@ toggleRoomInfo: function (ev) { /* Show/hide extra information about a room in the listing. */ - var target = ev.target, + const target = ev.target, $parent = $(target).parent('dd'), $div = $parent.find('div.room-info'); if ($div.length) { @@ -2579,9 +2570,9 @@ name = $(ev.target).text(); jid = $(ev.target).attr('data-room-jid'); } else { - $name = this.$el.find('input.new-chatroom-name'); - $server= this.$el.find('input.new-chatroom-server'); - server = $server.val(); + const $name = this.$el.find('input.new-chatroom-name'); + const $server= this.$el.find('input.new-chatroom-server'); + const server = $server.val(); name = $name.val().trim(); $name.val(''); // Clear the input if (name && server) { @@ -2669,7 +2660,7 @@ }; if (_converse.allow_muc_invitations) { - var registerDirectInvitationHandler = function () { + const registerDirectInvitationHandler = function () { _converse.connection.addHandler( function (message) { _converse.onDirectMUCInvitation(message); @@ -2680,7 +2671,7 @@ _converse.on('reconnected', registerDirectInvitationHandler); } - var autoJoinRooms = function () { + function autoJoinRooms () { /* Automatically join chat rooms, based on the * "auto_join_rooms" configuration setting, which is an array * of strings (room JIDs) or objects (with room JID and other @@ -2697,7 +2688,7 @@ Strophe.LogLevel.ERROR); } }); - }; + } _converse.on('chatBoxesFetched', autoJoinRooms); _converse.getChatRoom = function (jid, attrs, fetcher) { @@ -2724,11 +2715,11 @@ } }); } else if (_.isString(jids)) { - var view = _converse.chatboxviews.get(jids); + const view = _converse.chatboxviews.get(jids); if (view) { view.close(); } } else { _.each(jids, function (jid) { - var view = _converse.chatboxviews.get(jid); + const view = _converse.chatboxviews.get(jid); if (view) { view.close(); } }); } @@ -2759,7 +2750,7 @@ attrs = {}; } if (_.isUndefined(jids)) { - var result = []; + const result = []; _converse.chatboxes.each(function (chatbox) { if (chatbox.get('type') === CHATROOMS_TYPE) { result.push(_converse.getViewForChatBox(chatbox)); @@ -2767,7 +2758,7 @@ }); return result; } - var fetcher = _.partial(_converse.chatboxviews.getChatBox.bind(_converse.chatboxviews), _, create); + const fetcher = _.partial(_converse.chatboxviews.getChatBox.bind(_converse.chatboxviews), _, create); if (!attrs.nick) { attrs.nick = Strophe.getNodeFromJid(_converse.bare_jid); } @@ -2779,7 +2770,7 @@ } }); - var reconnectToChatRooms = function () { + function reconnectToChatRooms () { /* Upon a reconnection event from converse, join again * all the open chat rooms. */ @@ -2791,10 +2782,10 @@ view.fetchMessages(); } }); - }; + } _converse.on('reconnected', reconnectToChatRooms); - var disconnectChatRooms = function () { + function disconnectChatRooms () { /* When disconnecting, or reconnecting, mark all chat rooms as * disconnected, so that they will be properly entered again * when fetched from session storage. @@ -2804,7 +2795,7 @@ model.save('connection_status', ROOMSTATUS.DISCONNECTED); } }); - }; + } _converse.on('reconnecting', disconnectChatRooms); _converse.on('disconnecting', disconnectChatRooms); } diff --git a/src/converse-notification.js b/src/converse-notification.js index 3355446c0..ed735a30d 100644 --- a/src/converse-notification.js +++ b/src/converse-notification.js @@ -10,7 +10,7 @@ define(["converse-core"], factory); }(this, function (converse) { "use strict"; - var utils = converse.env.utils, + const utils = converse.env.utils, Strophe = converse.env.Strophe, _ = converse.env._; @@ -20,11 +20,11 @@ /* The initialize function gets called as soon as the plugin is * loaded by converse.js's plugin machinery. */ - var _converse = this._converse; + const _converse = this._converse; // For translations - var __ = _converse.__; - var ___ = _converse.___; + const __ = _converse.__; + const ___ = _converse.___; _converse.supports_html5_notification = "Notification" in window; diff --git a/src/converse-otr.js b/src/converse-otr.js index 1343995db..be37c8f7e 100644 --- a/src/converse-otr.js +++ b/src/converse-otr.js @@ -19,29 +19,29 @@ "use strict"; // Strophe methods for building stanzas - var Strophe = converse.env.Strophe, + const Strophe = converse.env.Strophe, utils = converse.env.utils, b64_sha1 = converse.env.b64_sha1; // Other necessary globals - var $ = converse.env.jQuery, + const $ = converse.env.jQuery, _ = converse.env._; - var HAS_CSPRNG = ((!_.isUndefined(crypto)) && + const HAS_CSPRNG = ((!_.isUndefined(crypto)) && ((_.isFunction(crypto.randomBytes)) || (_.isFunction(crypto.getRandomValues)) )); - var HAS_CRYPTO = HAS_CSPRNG && ( + const HAS_CRYPTO = HAS_CSPRNG && ( (!_.isUndefined(otr.OTR)) && (!_.isUndefined(otr.DSA)) ); - var UNENCRYPTED = 0; - var UNVERIFIED= 1; - var VERIFIED= 2; - var FINISHED = 3; + const UNENCRYPTED = 0; + const UNVERIFIED= 1; + const VERIFIED= 2; + const FINISHED = 3; - var OTR_TRANSLATED_MAPPING = {}; // Populated in initialize - var OTR_CLASS_MAPPING = {}; + const OTR_TRANSLATED_MAPPING = {}; // Populated in initialize + const OTR_CLASS_MAPPING = {}; OTR_CLASS_MAPPING[UNENCRYPTED] = 'unencrypted'; OTR_CLASS_MAPPING[UNVERIFIED] = 'unverified'; OTR_CLASS_MAPPING[VERIFIED] = 'verified'; @@ -132,7 +132,7 @@ encrypted_key = this.get('otr_priv_key'); if (_.isString(encrypted_key)) { instance_tag = this.get('otr_instance_tag'); - saved_key = otr.DSA.parsePrivate(encrypted_key) + saved_key = otr.DSA.parsePrivate(encrypted_key); if (saved_key && instance_tag) { this.trigger('showHelpMessages', [__('Re-establishing encrypted session')]); callback({ diff --git a/src/converse-ping.js b/src/converse-ping.js index 83d58e288..fd696853a 100644 --- a/src/converse-ping.js +++ b/src/converse-ping.js @@ -14,7 +14,7 @@ }(this, function (converse) { "use strict"; // Strophe methods for building stanzas - var Strophe = converse.env.Strophe, + const Strophe = converse.env.Strophe, _ = converse.env._; converse.plugins.add('converse-ping', { @@ -23,7 +23,7 @@ /* The initialize function gets called as soon as the plugin is * loaded by converse.js's plugin machinery. */ - var _converse = this._converse; + const _converse = this._converse; _converse.api.settings.update({ ping_interval: 180 //in seconds diff --git a/src/converse-register.js b/src/converse-register.js index ae533da02..55c1b7d40 100644 --- a/src/converse-register.js +++ b/src/converse-register.js @@ -32,12 +32,12 @@ "use strict"; // Strophe methods for building stanzas - var Strophe = converse.env.Strophe, + const Strophe = converse.env.Strophe, Backbone = converse.env.Backbone, utils = converse.env.utils, $iq = converse.env.$iq; // Other necessary globals - var $ = converse.env.jQuery, + const $ = converse.env.jQuery, _ = converse.env._; // Add Strophe Namespaces diff --git a/src/converse-roomslist.js b/src/converse-roomslist.js index be84b52c1..4eadde096 100644 --- a/src/converse-roomslist.js +++ b/src/converse-roomslist.js @@ -70,7 +70,7 @@ 'toggle_state': this.list_model.get('toggle-state'), 'desc_rooms': __('Click to toggle the rooms list'), 'label_rooms': __('Open Rooms') - }) + }); this.hide(); if (this.list_model.get('toggle-state') !== _converse.OPENED) { this.$('.open-rooms-list').hide(); @@ -111,7 +111,7 @@ } this.removeRoomsListElement(item); - var name, bookmark + var name, bookmark; if (item.get('bookmarked')) { bookmark = _.head(_converse.bookmarksview.model.where({'jid': item.get('jid')})); name = bookmark.get('name'); diff --git a/src/converse-rosterview.js b/src/converse-rosterview.js index 9095e3de0..410d11397 100644 --- a/src/converse-rosterview.js +++ b/src/converse-rosterview.js @@ -590,7 +590,7 @@ )); } else if (subscription === 'both' || subscription === 'to') { this.el.classList.add('current-xmpp-contact'); - this.el.classList.remove(_.without(['both', 'to'], subscription)[0]) + this.el.classList.remove(_.without(['both', 'to'], subscription)[0]); this.el.classList.add(subscription); this.renderRosterItem(item); } diff --git a/src/converse-singleton.js b/src/converse-singleton.js index 135b49cca..d6b4e9b3b 100644 --- a/src/converse-singleton.js +++ b/src/converse-singleton.js @@ -72,9 +72,9 @@ * time. So before opening a chat, we make sure all other * chats are hidden. */ - var _converse = this.__super__._converse; - var chatbox = this.getChatBox(attrs, true); - var hidden = _.isUndefined(attrs.hidden) ? chatbox.get('hidden') : attrs.hidden; + const _converse = this.__super__._converse; + const chatbox = this.getChatBox(attrs, true); + const hidden = _.isUndefined(attrs.hidden) ? chatbox.get('hidden') : attrs.hidden; if ((force || !hidden) && _converse.connection.authenticated) { _.each(_converse.chatboxviews.xget(chatbox.get('id')), hideChat); chatbox.save({'hidden': false}); diff --git a/src/converse-vcard.js b/src/converse-vcard.js index bb0d0f572..9cef1a95a 100644 --- a/src/converse-vcard.js +++ b/src/converse-vcard.js @@ -10,7 +10,7 @@ define(["converse-core", "strophe.vcard"], factory); }(this, function (converse) { "use strict"; - var Strophe = converse.env.Strophe, + const Strophe = converse.env.Strophe, $ = converse.env.jQuery, _ = converse.env._, moment = converse.env.moment; @@ -26,7 +26,7 @@ Features: { addClientFeatures: function () { - var _converse = this.__super__._converse; + const _converse = this.__super__._converse; this.__super__.addClientFeatures.apply(this, arguments); if (_converse.use_vcards) { _converse.connection.disco.addFeature(Strophe.NS.VCARD); @@ -36,8 +36,8 @@ RosterContacts: { createRequestingContact: function (presence) { - var _converse = this.__super__._converse; - var bare_jid = Strophe.getBareJidFromJid(presence.getAttribute('from')); + const _converse = this.__super__._converse; + const bare_jid = Strophe.getBareJidFromJid(presence.getAttribute('from')); _converse.getVCard( bare_jid, _.partial(_converse.createRequestingContactFromVCard, presence), @@ -58,15 +58,15 @@ /* The initialize function gets called as soon as the plugin is * loaded by converse.js's plugin machinery. */ - var _converse = this._converse; + const _converse = this._converse; _converse.api.settings.update({ use_vcards: true, }); _converse.createRequestingContactFromVCard = function (presence, iq, jid, fullname, img, img_type, url) { - var bare_jid = Strophe.getBareJidFromJid(jid); - var nick = $(presence).children('nick[xmlns="'+Strophe.NS.NICK+'"]').text(); - var user_data = { + const bare_jid = Strophe.getBareJidFromJid(jid); + const nick = $(presence).children('nick[xmlns="'+Strophe.NS.NICK+'"]').text(); + const user_data = { jid: bare_jid, subscription: 'none', ask: null, @@ -82,7 +82,7 @@ }; _converse.onVCardError = function (jid, iq, errback) { - var contact = _converse.roster.get(jid); + const contact = _converse.roster.get(jid); if (contact) { contact.save({ 'vcard_updated': moment().format() }); } diff --git a/src/utils.js b/src/utils.js index bb913167d..bae42b183 100755 --- a/src/utils.js +++ b/src/utils.js @@ -63,7 +63,7 @@ var div = document.createElement('div'); div.innerHTML = htmlEscapedText; return div.innerText; - } + }; var isImage = function (url) { var deferred = new $.Deferred(); @@ -467,13 +467,13 @@ utils.isConverseLocale = function (locale) { if (!_.isString(locale)) { return false; } - return _.includes(_.keys(locales || {}), locale) + return _.includes(_.keys(locales || {}), locale); }; utils.isMomentLocale = function (locale) { if (!_.isString(locale)) { return false; } return moment.locale() !== moment.locale(locale); - } + }; utils.getLocale = function (preferred_locale, isSupportedByLibrary) { if (_.isString(preferred_locale)) { @@ -492,7 +492,7 @@ utils.isOfType = function (type, item) { return item.get('type') == type; - } + }; utils.isInstance = function (type, item) { return item instanceof type; @@ -520,7 +520,7 @@ } element.appendChild(frag); // Now, append all elements at once frag = tmp = null; - } + }; utils.isPersistableModel = function (model) { return model.collection && model.collection.browserStorage;