diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..2bd2bb7be --- /dev/null +++ b/.eslintignore @@ -0,0 +1,11 @@ +# The build artifacts of the jitsi-meet project. +build/* + +# Third-party source code which we (1) do not want to modify or (2) try to +# modify as little as possible. +libs/* + +# ESLint will by default ignore its own configuration file. However, there does +# not seem to be a reason why we will want to risk being inconsistent with our +# remaining JavaScript source code. +!.eslintrc.js diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 000000000..bbec37f88 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,37 @@ +module.exports = { + 'env': { + 'browser': true, + 'commonjs': true, + 'es6': true + }, + 'extends': 'eslint:recommended', + 'globals': { + // The globals that (1) are accessed but not defined within many of our + // files, (2) are certainly defined, and (3) we would like to use + // without explicitly specifying them (using a comment) inside of our + // files. + '__filename': false + }, + 'parserOptions': { + 'ecmaFeatures': { + 'experimentalObjectRestSpread': true + }, + 'sourceType': 'module' + }, + 'rules': { + 'new-cap': [ + 'error', + { + 'capIsNew': false // Behave like JSHint's newcap. + } + ], + // While it is considered a best practice to avoid using methods on + // console in JavaScript that is designed to be executed in the browser + // and ESLint includes the rule among its set of recommended rules, (1) + // the general practice is to strip such calls before pushing to + // production and (2) we prefer to utilize console in lib-jitsi-meet + // (and jitsi-meet). + 'no-console': 'off', + 'semi': 'error' + } +}; diff --git a/analytics.js b/analytics.js index ebaf3d332..ff25e85b5 100644 --- a/analytics.js +++ b/analytics.js @@ -1,5 +1,9 @@ +/* global ga */ + (function (ctx) { function Analytics() { + /* eslint-disable */ + /** * Google Analytics */ @@ -8,6 +12,8 @@ })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-319188-14', 'jit.si'); ga('send', 'pageview'); + + /* eslint-enable */ } Analytics.prototype.sendEvent = function (action, data, label, browserName) { diff --git a/app.js b/app.js index 627b57702..5a06b4c8d 100644 --- a/app.js +++ b/app.js @@ -1,4 +1,4 @@ -/* global $, JitsiMeetJS, config, getRoomName */ +/* global $, config, getRoomName */ /* application specific logic */ import "babel-polyfill"; diff --git a/conference.js b/conference.js index ca74ab449..0cc772646 100644 --- a/conference.js +++ b/conference.js @@ -19,7 +19,6 @@ import {reportError} from './modules/util/helpers'; import UIErrors from './modules/UI/UIErrors'; import UIUtil from './modules/UI/util/UIUtil'; -const ConnectionEvents = JitsiMeetJS.events.connection; const ConnectionErrors = JitsiMeetJS.errors.connection; const ConferenceEvents = JitsiMeetJS.events.conference; @@ -159,29 +158,24 @@ function getDisplayName (id) { /** * Mute or unmute local audio stream if it exists. - * @param {boolean} muted if audio stream should be muted or unmuted. - * @param {boolean} indicates if this local audio mute was a result of user - * interaction - * + * @param {boolean} muted - if audio stream should be muted or unmuted. + * @param {boolean} userInteraction - indicates if this local audio mute was a + * result of user interaction */ -function muteLocalAudio (muted, userInteraction) { - if (!localAudio) { +function muteLocalAudio (muted) { + muteLocalMedia(localAudio, muted, 'Audio'); +} + +function muteLocalMedia(localMedia, muted, localMediaTypeString) { + if (!localMedia) { return; } - if (muted) { - localAudio.mute().then(function(value) {}, - function(value) { - console.warn('Audio Mute was rejected:', value); - } - ); - } else { - localAudio.unmute().then(function(value) {}, - function(value) { - console.warn('Audio unmute was rejected:', value); - } - ); - } + const method = muted ? 'mute' : 'unmute'; + + localMedia[method]().catch(reason => { + console.warn(`${localMediaTypeString} ${method} was rejected:`, reason); + }); } /** @@ -189,23 +183,7 @@ function muteLocalAudio (muted, userInteraction) { * @param {boolean} muted if video stream should be muted or unmuted. */ function muteLocalVideo (muted) { - if (!localVideo) { - return; - } - - if (muted) { - localVideo.mute().then(function(value) {}, - function(value) { - console.warn('Video mute was rejected:', value); - } - ); - } else { - localVideo.unmute().then(function(value) {}, - function(value) { - console.warn('Video unmute was rejected:', value); - } - ); - } + muteLocalMedia(localVideo, muted, 'Video'); } /** @@ -433,7 +411,7 @@ class ConferenceConnector { room.on(ConferenceEvents.CONFERENCE_ERROR, this._onConferenceError.bind(this)); } - _handleConferenceFailed(err, msg) { + _handleConferenceFailed(err) { this._unsubscribe(); this._reject(err); } @@ -1284,6 +1262,7 @@ export default { UIUtil.animateShowElement($("#talkWhileMutedPopup"), true, 5000); }); +/* room.on(ConferenceEvents.IN_LAST_N_CHANGED, (inLastN) => { //FIXME if (config.muteLocalVideoIfNotInLastN) { @@ -1292,6 +1271,7 @@ export default { // APP.UI.markVideoMuted(true/false); } }); +*/ room.on( ConferenceEvents.LAST_N_ENDPOINTS_CHANGED, (ids, enteringIds) => { APP.UI.handleLastNEndpoints(ids, enteringIds); diff --git a/config.js b/config.js index 912b90f23..ba78935f4 100644 --- a/config.js +++ b/config.js @@ -1,5 +1,6 @@ -/* jshint -W101 */ -var config = { +/* jshint maxlen:false */ + +var config = { // eslint-disable-line no-unused-vars // configLocation: './config.json', // see ./modules/HttpConfigFetch.js hosts: { domain: 'jitsi-meet.example.com', diff --git a/interface_config.js b/interface_config.js index 5218f0c56..41530f6e1 100644 --- a/interface_config.js +++ b/interface_config.js @@ -1,4 +1,4 @@ -var interfaceConfig = { +var interfaceConfig = { // eslint-disable-line no-unused-vars CANVAS_EXTRA: 104, CANVAS_RADIUS: 0, SHADOW_COLOR: '#ffffff', @@ -44,4 +44,4 @@ var interfaceConfig = { DISABLE_FOCUS_INDICATOR: false, AUDIO_LEVEL_PRIMARY_COLOR: "rgba(255,255,255,0.7)", AUDIO_LEVEL_SECONDARY_COLOR: "rgba(255,255,255,0.4)" -}; \ No newline at end of file +}; diff --git a/modules/API/external/external_api.js b/modules/API/external/external_api.js index 45251bc44..307484287 100644 --- a/modules/API/external/external_api.js +++ b/modules/API/external/external_api.js @@ -336,7 +336,6 @@ JitsiMeetExternalAPI.prototype.removeEventListener = function(event) { * @param events array with the names of the events. */ JitsiMeetExternalAPI.prototype.removeEventListeners = function(events) { - var eventsArray = []; for(var i = 0; i < events.length; i++) this.removeEventListener(events[i]); }; diff --git a/modules/FollowMe.js b/modules/FollowMe.js index 8457b8e79..8eb1bf40e 100644 --- a/modules/FollowMe.js +++ b/modules/FollowMe.js @@ -261,25 +261,26 @@ class FollowMe { * @param newValue the new value * @private */ + // eslint-disable-next-line no-unused-vars _localPropertyChange (property, oldValue, newValue) { // Only a moderator is allowed to send commands. - var conference = this._conference; + const conference = this._conference; if (!conference.isModerator) return; - var commands = conference.commands; + const commands = conference.commands; // XXX The "Follow Me" command represents a snapshot of all states // which are to be followed so don't forget to removeCommand before // sendCommand! commands.removeCommand(_COMMAND); - var self = this; + const local = this._local; commands.sendCommandOnce( _COMMAND, { attributes: { - filmStripVisible: self._local.filmStripVisible, - nextOnStage: self._local.nextOnStage, - sharedDocumentVisible: self._local.sharedDocumentVisible + filmStripVisible: local.filmStripVisible, + nextOnStage: local.nextOnStage, + sharedDocumentVisible: local.sharedDocumentVisible } }); } diff --git a/modules/UI/UI.js b/modules/UI/UI.js index 9a3f68add..4c8e4f6b1 100644 --- a/modules/UI/UI.js +++ b/modules/UI/UI.js @@ -1,5 +1,4 @@ /* global APP, JitsiMeetJS, $, config, interfaceConfig, toastr */ -/* jshint -W101 */ var UI = {}; import Chat from "./side_pannels/chat/Chat"; @@ -10,11 +9,11 @@ import Avatar from "./avatar/Avatar"; import SideContainerToggler from "./side_pannels/SideContainerToggler"; import UIUtil from "./util/UIUtil"; import UIEvents from "../../service/UI/UIEvents"; -import CQEvents from '../../service/connectionquality/CQEvents'; import EtherpadManager from './etherpad/Etherpad'; import SharedVideoManager from './shared_video/SharedVideo'; import Recording from "./recording/Recording"; -import GumPermissionsOverlay from './gum_overlay/UserMediaPermissionsGuidanceOverlay'; +import GumPermissionsOverlay + from './gum_overlay/UserMediaPermissionsGuidanceOverlay'; import VideoLayout from "./videolayout/VideoLayout"; import FilmStrip from "./videolayout/FilmStrip"; @@ -194,21 +193,16 @@ UI.notifyReservationError = function (code, msg) { "dialog.reservationError"); var message = APP.translation.generateTranslationHTML( "dialog.reservationErrorMsg", {code: code, msg: msg}); - messageHandler.openDialog( - title, - message, - true, {}, - function (event, value, message, formVals) { - return false; - } - ); + messageHandler.openDialog(title, message, true, {}, () => false); }; /** * Notify user that he has been kicked from the server. */ UI.notifyKicked = function () { - messageHandler.openMessageDialog("dialog.sessTerminated", "dialog.kickMessage"); + messageHandler.openMessageDialog( + "dialog.sessTerminated", + "dialog.kickMessage"); }; /** @@ -218,13 +212,9 @@ UI.notifyKicked = function () { UI.notifyConferenceDestroyed = function (reason) { //FIXME: use Session Terminated from translation, but // 'reason' text comes from XMPP packet and is not translated - var title = APP.translation.generateTranslationHTML("dialog.sessTerminated"); - messageHandler.openDialog( - title, reason, true, {}, - function (event, value, message, formVals) { - return false; - } - ); + const title + = APP.translation.generateTranslationHTML("dialog.sessTerminated"); + messageHandler.openDialog(title, reason, true, {}, () => false); }; /** @@ -287,7 +277,9 @@ UI.setRaisedHandStatus = (participant, raisedHandStatus) => { * Sets the local "raised hand" status. */ UI.setLocalRaisedHandStatus = (raisedHandStatus) => { - VideoLayout.setRaisedHandStatus(APP.conference.getMyUserId(), raisedHandStatus); + VideoLayout.setRaisedHandStatus( + APP.conference.getMyUserId(), + raisedHandStatus); }; /** @@ -579,10 +571,6 @@ UI.removeRemoteStream = function (track) { VideoLayout.onRemoteStreamRemoved(track); }; -function chatAddError(errorMessage, originalText) { - return Chat.chatAddError(errorMessage, originalText); -} - /** * Update chat subject. * @param {string} subject new chat subject @@ -959,9 +947,7 @@ UI.notifyConnectionFailed = function (stropheErrorMsg) { "dialog.connectError"); } - messageHandler.openDialog( - title, message, true, {}, function (e, v, m, f) { return false; } - ); + messageHandler.openDialog(title, message, true, {}, () => false); }; @@ -975,9 +961,7 @@ UI.notifyMaxUsersLimitReached = function () { var message = APP.translation.generateTranslationHTML( "dialog.maxUsersLimitReached"); - messageHandler.openDialog( - title, message, true, {}, function (e, v, m, f) { return false; } - ); + messageHandler.openDialog(title, message, true, {}, () => false); }; /** @@ -985,8 +969,12 @@ UI.notifyMaxUsersLimitReached = function () { */ UI.notifyInitiallyMuted = function () { messageHandler.notify( - null, "notify.mutedTitle", "connected", "notify.muted", null, {timeOut: 120000} - ); + null, + "notify.mutedTitle", + "connected", + "notify.muted", + null, + { timeOut: 120000 }); }; /** @@ -1089,6 +1077,7 @@ UI.addMessage = function (from, displayName, message, stamp) { Chat.updateChatConversation(from, displayName, message, stamp); }; +// eslint-disable-next-line no-unused-vars UI.updateDTMFSupport = function (isDTMFSupported) { //TODO: enable when the UI is ready //Toolbar.showDialPadButton(dtmfSupport); @@ -1105,7 +1094,7 @@ UI.requestFeedback = function () { else if (Feedback.isEnabled() && Feedback.isSubmitted()) return Promise.resolve(); else - return new Promise(function (resolve, reject) { + return new Promise(function (resolve) { if (Feedback.isEnabled()) { // If the user has already entered feedback, we'll show the // window and immidiately start the conference dispose timeout. @@ -1272,7 +1261,7 @@ UI.showExtensionExternalInstallationDialog = function (url) { null, true, "dialog.goToStore", - function(e,v,m,f){ + function(e,v) { if (v) { e.preventDefault(); eventEmitter.emit(UIEvents.OPEN_EXTENSION_STORE, url); @@ -1407,13 +1396,12 @@ UI.showDeviceErrorDialog = function (micError, cameraError) { let title = "dialog.error"; if (micError && micError.name === TrackErrors.PERMISSION_DENIED) { - if (cameraError && cameraError.name === TrackErrors.PERMISSION_DENIED) { - title = "dialog.permissionDenied"; - } else if (!cameraError) { + if (!cameraError + || cameraError.name === TrackErrors.PERMISSION_DENIED) { title = "dialog.permissionDenied"; } - } else if (cameraError && - cameraError.name === TrackErrors.PERMISSION_DENIED) { + } else if (cameraError + && cameraError.name === TrackErrors.PERMISSION_DENIED) { title = "dialog.permissionDenied"; } diff --git a/modules/UI/authentication/AuthHandler.js b/modules/UI/authentication/AuthHandler.js index a2342fa22..8ce8246ba 100644 --- a/modules/UI/authentication/AuthHandler.js +++ b/modules/UI/authentication/AuthHandler.js @@ -4,7 +4,6 @@ import LoginDialog from './LoginDialog'; import UIUtil from '../util/UIUtil'; import {openConnection} from '../../../connection'; -const ConferenceEvents = JitsiMeetJS.events.conference; const ConnectionErrors = JitsiMeetJS.errors.connection; let externalAuthWindow; @@ -73,7 +72,6 @@ function redirectToTokenAuthService(roomName) { * @param room the name fo the conference room. */ function initJWTTokenListener(room) { - var self = this; var listener = function (event) { if (externalAuthWindow !== event.source) { console.warn("Ignored message not coming " + @@ -279,15 +277,12 @@ function showXmppPasswordPrompt(roomName, connect) { function requestAuth(roomName, connect) { if (isTokenAuthEnabled) { // This Promise never resolves as user gets redirected to another URL - return new Promise(function (resolve, reject) { - redirectToTokenAuthService(roomName); - }); + return new Promise(() => redirectToTokenAuthService(roomName)); } else { return showXmppPasswordPrompt(roomName, connect); } } - export default { authenticate, requireAuth, diff --git a/modules/UI/authentication/LoginDialog.js b/modules/UI/authentication/LoginDialog.js index 124269524..e730e848a 100644 --- a/modules/UI/authentication/LoginDialog.js +++ b/modules/UI/authentication/LoginDialog.js @@ -1,4 +1,4 @@ -/* global $, APP, config*/ +/* global APP, config */ /** * Build html for "password required" dialog. @@ -109,7 +109,7 @@ function LoginDialog(successCallback, cancelCallback) { html: '
', buttons: finishedButtons, defaultButton: 0, - submit: function (e, v, m, f) { + submit: function (e, v) { e.preventDefault(); if (v === 'retry') { connDialog.goToState('login'); diff --git a/modules/UI/authentication/RoomLocker.js b/modules/UI/authentication/RoomLocker.js index 4c05b6dce..611b1d75c 100644 --- a/modules/UI/authentication/RoomLocker.js +++ b/modules/UI/authentication/RoomLocker.js @@ -51,7 +51,7 @@ function askForPassword () { APP.UI.messageHandler.openTwoButtonDialog( null, null, null, msg, true, "dialog.Ok", - function (e, v, m, f) {}, null, + function () {}, null, function (e, v, m, f) { if (v && f.lockKey) { resolve(UIUtil.escapeHtml(f.lockKey)); diff --git a/modules/UI/etherpad/Etherpad.js b/modules/UI/etherpad/Etherpad.js index d5c9e7e4a..4bbfbdc96 100644 --- a/modules/UI/etherpad/Etherpad.js +++ b/modules/UI/etherpad/Etherpad.js @@ -2,7 +2,6 @@ import VideoLayout from "../videolayout/VideoLayout"; import LargeContainer from '../videolayout/LargeContainer'; -import UIUtil from "../util/UIUtil"; import UIEvents from "../../../service/UI/UIEvents"; import FilmStrip from '../videolayout/FilmStrip'; @@ -101,6 +100,7 @@ class Etherpad extends LargeContainer { return document.getElementById('etherpad'); } + // eslint-disable-next-line no-unused-vars resize (containerWidth, containerHeight, animate) { let height = containerHeight - FilmStrip.getFilmStripHeight(); let width = containerWidth; diff --git a/modules/UI/feedback/Feedback.js b/modules/UI/feedback/Feedback.js index 8fbc29e85..7e23d1ca9 100644 --- a/modules/UI/feedback/Feedback.js +++ b/modules/UI/feedback/Feedback.js @@ -1,4 +1,4 @@ -/* global $, APP, config, interfaceConfig, JitsiMeetJS */ +/* global $, APP, JitsiMeetJS */ import UIEvents from "../../../service/UI/UIEvents"; import FeedabckWindow from "./FeedbackWindow"; @@ -125,4 +125,4 @@ var Feedback = { } }; -module.exports = Feedback; \ No newline at end of file +module.exports = Feedback; diff --git a/modules/UI/feedback/FeedbackWindow.js b/modules/UI/feedback/FeedbackWindow.js index bededdffa..3e57993f7 100644 --- a/modules/UI/feedback/FeedbackWindow.js +++ b/modules/UI/feedback/FeedbackWindow.js @@ -1,5 +1,4 @@ /* global $, APP, interfaceConfig, AJS */ -/* jshint -W101 */ const selector = '#aui-feedback-dialog'; @@ -9,21 +8,21 @@ const selector = '#aui-feedback-dialog'; * * @param starCount the number of stars, for which to toggle the css class */ -let toggleStars = function(starCount) { +function toggleStars(starCount) { $('#stars > a').each(function(index, el) { if (index <= starCount) { el.classList.add("starHover"); } else el.classList.remove("starHover"); }); -}; +} /** * Constructs the html for the rated feedback window. * * @returns {string} the contructed html string */ -let createRateFeedbackHTML = function (Feedback) { +function createRateFeedbackHTML() { let rateExperience = APP.translation.translateString('dialog.rateExperience'), feedbackHelp = APP.translation.translateString('dialog.feedbackHelp'); @@ -58,17 +57,22 @@ let createRateFeedbackHTML = function (Feedback) {
${ feedbackHelp }
- + `; -}; +} /** * Callback for Rate Feedback diff --git a/modules/UI/gum_overlay/UserMediaPermissionsGuidanceOverlay.js b/modules/UI/gum_overlay/UserMediaPermissionsGuidanceOverlay.js index ef2cfc9c1..db0d977e4 100644 --- a/modules/UI/gum_overlay/UserMediaPermissionsGuidanceOverlay.js +++ b/modules/UI/gum_overlay/UserMediaPermissionsGuidanceOverlay.js @@ -1,4 +1,4 @@ -/* global $, APP, JitsiMeetJS */ +/* global $, APP */ let $overlay; @@ -43,4 +43,4 @@ export default { hide() { $overlay && $overlay.detach(); } -}; \ No newline at end of file +}; diff --git a/modules/UI/recording/Recording.js b/modules/UI/recording/Recording.js index c37a39eb0..bfce1a6ab 100644 --- a/modules/UI/recording/Recording.js +++ b/modules/UI/recording/Recording.js @@ -97,7 +97,7 @@ function _requestLiveStreamId() { ], focus: ':input:first', defaultButton: 1, - submit: function (e, v, m, f) { + submit: function (e, v) { e.preventDefault(); if (v === 0) { reject(APP.UI.messageHandler.CANCEL); @@ -177,7 +177,7 @@ function _showStopRecordingPrompt (recordingType) { null, false, buttonKey, - function(e,v,m,f) { + function(e,v) { if (v) { resolve(); } else { diff --git a/modules/UI/shared_video/SharedVideo.js b/modules/UI/shared_video/SharedVideo.js index 3d777c6ed..737cb2eb9 100644 --- a/modules/UI/shared_video/SharedVideo.js +++ b/modules/UI/shared_video/SharedVideo.js @@ -729,7 +729,7 @@ function showStopVideoPropmpt() { null, false, "dialog.Remove", - function(e,v,m,f) { + function(e,v) { if (v) { resolve(); } else { @@ -811,7 +811,7 @@ function requestVideoLink() { ], focus: ':input:first', defaultButton: 1, - submit: function (e, v, m, f) { + submit: function (e, v) { e.preventDefault(); if (v === 0) { reject(); diff --git a/modules/UI/side_pannels/chat/Commands.js b/modules/UI/side_pannels/chat/Commands.js index 94e225eeb..9970d60c5 100644 --- a/modules/UI/side_pannels/chat/Commands.js +++ b/modules/UI/side_pannels/chat/Commands.js @@ -1,4 +1,3 @@ -/* global APP */ import UIUtil from '../../util/UIUtil'; import UIEvents from '../../../../service/UI/UIEvents'; diff --git a/modules/UI/side_pannels/contactlist/ContactList.js b/modules/UI/side_pannels/contactlist/ContactList.js index f19bb8d61..b660a2d30 100644 --- a/modules/UI/side_pannels/contactlist/ContactList.js +++ b/modules/UI/side_pannels/contactlist/ContactList.js @@ -4,7 +4,6 @@ import UIEvents from '../../../../service/UI/UIEvents'; import UIUtil from '../../util/UIUtil'; let numberOfContacts = 0; -let notificationInterval; /** * Updates the number of participants in the contact list button and sets @@ -61,10 +60,6 @@ function getContactEl (id) { return $(`#contacts>li[id="${id}"]`); } -function contactElExists (id) { - return getContactEl(id).length > 0; -} - /** * Contact list. */ diff --git a/modules/UI/side_pannels/profile/Profile.js b/modules/UI/side_pannels/profile/Profile.js index cbd4aeeae..1479e7159 100644 --- a/modules/UI/side_pannels/profile/Profile.js +++ b/modules/UI/side_pannels/profile/Profile.js @@ -1,7 +1,6 @@ -/* global APP, $, JitsiMeetJS */ +/* global $ */ import UIUtil from "../../util/UIUtil"; import UIEvents from "../../../../service/UI/UIEvents"; -import languages from "../../../../service/translation/languages"; import Settings from '../../../settings/Settings'; export default { @@ -58,4 +57,4 @@ export default { changeAvatar (avatarUrl) { $('#avatar').attr('src', avatarUrl); } -}; \ No newline at end of file +}; diff --git a/modules/UI/side_pannels/settings/SettingsMenu.js b/modules/UI/side_pannels/settings/SettingsMenu.js index 20f9c536c..3c1e80067 100644 --- a/modules/UI/side_pannels/settings/SettingsMenu.js +++ b/modules/UI/side_pannels/settings/SettingsMenu.js @@ -1,4 +1,4 @@ -/* global APP, $, JitsiMeetJS, interfaceConfig */ +/* global APP, $, JitsiMeetJS */ import UIUtil from "../../util/UIUtil"; import UIEvents from "../../../../service/UI/UIEvents"; import languages from "../../../../service/translation/languages"; @@ -268,4 +268,4 @@ export default { APP.translation.translateElement($('#settings_container option')); } -}; \ No newline at end of file +}; diff --git a/modules/UI/toolbars/Toolbar.js b/modules/UI/toolbars/Toolbar.js index ef0d5e0cc..bcfd02ee5 100644 --- a/modules/UI/toolbars/Toolbar.js +++ b/modules/UI/toolbars/Toolbar.js @@ -1,5 +1,4 @@ /* global APP, $, config, interfaceConfig, JitsiMeetJS */ -/* jshint -W101 */ import UIUtil from '../util/UIUtil'; import UIEvents from '../../../service/UI/UIEvents'; import SideContainerToggler from "../side_pannels/SideContainerToggler"; @@ -350,7 +349,11 @@ function showSipNumberInput () { APP.UI.messageHandler.openTwoButtonDialog( null, null, null, `