From be0abf908e01b3536be87abbe76fb5874a6aa4b0 Mon Sep 17 00:00:00 2001 From: isymchych Date: Wed, 2 Mar 2016 17:39:39 +0200 Subject: [PATCH 01/10] auto-save setiings --- conference.js | 36 ++-- css/settingsmenu.css | 17 +- index.html | 2 +- modules/UI/UI.js | 16 +- modules/UI/side_pannels/SidePanelToggler.js | 5 +- .../UI/side_pannels/settings/SettingsMenu.js | 167 +++++++++++------- modules/settings/Settings.js | 5 +- 7 files changed, 140 insertions(+), 108 deletions(-) diff --git a/conference.js b/conference.js index 201174586..3065373e0 100644 --- a/conference.js +++ b/conference.js @@ -332,10 +332,9 @@ export default { // update list of available devices if (JitsiMeetJS.isDeviceListAvailable() && JitsiMeetJS.isDeviceChangeAvailable()) { - JitsiMeetJS.enumerateDevices((devices) => { - this.availableDevices = devices; - APP.UI.onAvailableDevicesChanged(); - }); + JitsiMeetJS.enumerateDevices( + devices => APP.UI.onAvailableDevicesChanged(devices) + ); } // XXX The API will take care of disconnecting from the XMPP server // (and, thus, leaving the room) on unload. @@ -399,10 +398,6 @@ export default { listMembersIds () { return room.getParticipants().map(p => p.getId()); }, - /** - * List of available cameras and microphones. - */ - availableDevices: [], /** * Check if SIP is supported. * @returns {boolean} @@ -413,12 +408,6 @@ export default { get membersCount () { return room.getParticipants().length + 1; }, - get startAudioMuted () { - return room && room.getStartMutedPolicy().audio; - }, - get startVideoMuted () { - return room && room.getStartMutedPolicy().video; - }, /** * Returns true if the callstats integration is enabled, otherwise returns * false. @@ -665,7 +654,6 @@ export default { room.on(ConferenceEvents.USER_JOINED, (id, user) => { console.log('USER %s connnected', id, user); APP.API.notifyUserJoined(id); - // FIXME email??? APP.UI.addUser(id, user.getDisplayName()); // chek the roles for the new user and reflect them @@ -887,7 +875,13 @@ export default { }); }); - APP.UI.addListener(UIEvents.EMAIL_CHANGED, (email) => { + APP.UI.addListener(UIEvents.EMAIL_CHANGED, (email = '') => { + email = email.trim(); + + if (email === APP.settings.getEmail()) { + return; + } + APP.settings.setEmail(email); APP.UI.setUserAvatar(room.myUserId(), email); sendEmail(email); @@ -910,14 +904,16 @@ export default { APP.UI.addListener(UIEvents.START_MUTED_CHANGED, (startAudioMuted, startVideoMuted) => { - room.setStartMutedPolicy({audio: startAudioMuted, - video: startVideoMuted}); + room.setStartMutedPolicy({ + audio: startAudioMuted, + video: startVideoMuted + }); } ); room.on( ConferenceEvents.START_MUTED_POLICY_CHANGED, - (policy) => { - APP.UI.onStartMutedChanged(); + ({ audio, video }) => { + APP.UI.onStartMutedChanged(audio, video); } ); room.on(ConferenceEvents.STARTED_MUTED, () => { diff --git a/css/settingsmenu.css b/css/settingsmenu.css index 3d342cca6..c990dfb4a 100644 --- a/css/settingsmenu.css +++ b/css/settingsmenu.css @@ -27,13 +27,6 @@ margin-right: auto; } -#settingsmenu button { - width: 45%; - left: 26%; - padding: 0; - margin-top: 10px; -} - #settingsmenu #avatar { width: 24%; left: 38%; @@ -45,8 +38,9 @@ padding: 34px; } -#languages_selectbox{ +#languages_selectbox { height: 40px; + cursor: pointer; } @@ -54,6 +48,10 @@ padding-left: 10%; text-indent: -10%; + margin-top: 10px; + + display: none; /* hide by default */ + /* clearfix */ overflow: auto; zoom: 1; @@ -70,10 +68,12 @@ .startMutedLabel { width: 94%; float: left; + cursor: pointer; } #devicesOptions { display: none; + margin-top: 10px; } #devicesOptions label { @@ -87,4 +87,5 @@ #devicesOptions select { height: 40px; + cursor: pointer; } diff --git a/index.html b/index.html index 22b2e0a3f..c476b1547 100644 --- a/index.html +++ b/index.html @@ -219,6 +219,7 @@
+
-
diff --git a/modules/UI/UI.js b/modules/UI/UI.js index 601dc7aba..a507ccbc8 100644 --- a/modules/UI/UI.js +++ b/modules/UI/UI.js @@ -212,10 +212,10 @@ UI.showChatError = function (err, msg) { */ UI.changeDisplayName = function (id, displayName) { ContactList.onDisplayNameChange(id, displayName); - SettingsMenu.onDisplayNameChange(id, displayName); VideoLayout.onDisplayNameChanged(id, displayName); - if (APP.conference.isLocalId(id)) { + if (APP.conference.isLocalId(id) || id === 'localVideoContainer') { + SettingsMenu.changeDisplayName(displayName); Chat.setChatConversationMode(!!displayName); } }; @@ -256,10 +256,6 @@ UI.mucJoined = function () { * Setup some UI event listeners. */ function registerListeners() { - UI.addListener(UIEvents.EMAIL_CHANGED, function (email) { - UI.setUserAvatar(APP.conference.localId, email); - }); - UI.addListener(UIEvents.PREZI_CLICKED, function () { preziManager.handlePreziButtonClicked(); }); @@ -538,7 +534,7 @@ UI.updateLocalRole = function (isModerator) { Toolbar.showSipCallButton(isModerator); Toolbar.showRecordingButton(isModerator); - SettingsMenu.onRoleChanged(); + SettingsMenu.showStartMutedOptions(isModerator); if (isModerator) { messageHandler.notify(null, "notify.me", 'connected', "notify.moderator"); @@ -1037,8 +1033,8 @@ UI.stopPrezi = function (userId) { } }; -UI.onStartMutedChanged = function () { - SettingsMenu.onStartMutedChanged(); +UI.onStartMutedChanged = function (startAudioMuted, startVideoMuted) { + SettingsMenu.updateStartMutedBox(startAudioMuted, startVideoMuted); }; /** @@ -1046,7 +1042,7 @@ UI.onStartMutedChanged = function () { * @param {object[]} devices new list of available devices */ UI.onAvailableDevicesChanged = function (devices) { - SettingsMenu.onAvailableDevicesChanged(devices); + SettingsMenu.changeDevicesList(devices); }; /** diff --git a/modules/UI/side_pannels/SidePanelToggler.js b/modules/UI/side_pannels/SidePanelToggler.js index 6fe56bba3..d77e3ac70 100644 --- a/modules/UI/side_pannels/SidePanelToggler.js +++ b/modules/UI/side_pannels/SidePanelToggler.js @@ -154,10 +154,7 @@ var PanelToggler = { toggle(SettingsMenu, '#settingsmenu', null, - function() { - $('#setDisplayName').val(Settings.getDisplayName()); - $('#setEmail').val(Settings.getEmail()); - }, + function() {}, null); }, diff --git a/modules/UI/side_pannels/settings/SettingsMenu.js b/modules/UI/side_pannels/settings/SettingsMenu.js index 35a6dac14..b2baecd0a 100644 --- a/modules/UI/side_pannels/settings/SettingsMenu.js +++ b/modules/UI/side_pannels/settings/SettingsMenu.js @@ -4,23 +4,34 @@ import UIEvents from "../../../../service/UI/UIEvents"; import languages from "../../../../service/translation/languages"; import Settings from '../../../settings/Settings'; -function generateLanguagesSelectBox() { - var currentLang = APP.translation.getCurrentLanguage(); - var html = '"; + let attrsStr = UIUtil.attrsToString(attrs); + return ``; + }).join('\n'); } +/** + * Generate html select options for available physical devices. + * @param {{ deviceId, label }[]} items available devices + * @param {string} [selectedId] id of selected device + * @returns {string} + */ function generateDevicesOptions(items, selectedId) { return items.map(function (item) { let attrs = { @@ -39,89 +50,121 @@ function generateDevicesOptions(items, selectedId) { export default { init (emitter) { - function update() { - let displayName = $('#setDisplayName').val(); - emitter.emit(UIEvents.NICKNAME_CHANGED, displayName); + // DISPLAY NAME + function updateDisplayName () { + emitter.emit(UIEvents.NICKNAME_CHANGED, $('#setDisplayName').val()); + } + $('#setDisplayName') + .val(Settings.getDisplayName()) + .keyup(function (event) { + if (event.keyCode === 13) { // enter + updateDisplayName(); + } + }) + .focusout(updateDisplayName); - let language = $("#languages_selectbox").val(); - if (language !== Settings.getLanguage()) { - emitter.emit(UIEvents.LANG_CHANGED, language); + + // EMAIL + function updateEmail () { + emitter.emit(UIEvents.EMAIL_CHANGED, $('#setEmail').val()); + } + $('#setEmail') + .val(Settings.getEmail()) + .keyup(function (event) { + if (event.keyCode === 13) { // enter + updateEmail(); } + }).focusout(updateEmail); - let email = UIUtil.escapeHtml($('#setEmail').val()); - if (email !== Settings.getEmail()) { - emitter.emit(UIEvents.EMAIL_CHANGED, email); - } + // START MUTED + $("#startMutedOptions").change(function () { let startAudioMuted = $("#startAudioMuted").is(":checked"); let startVideoMuted = $("#startVideoMuted").is(":checked"); - if (startAudioMuted !== APP.conference.startAudioMuted - || startVideoMuted !== APP.conference.startVideoMuted) { - emitter.emit( - UIEvents.START_MUTED_CHANGED, - startAudioMuted, - startVideoMuted - ); - } + emitter.emit( + UIEvents.START_MUTED_CHANGED, + startAudioMuted, + startVideoMuted + ); + }); - let cameraDeviceId = $('#selectCamera').val(); + + // LANGUAGES BOX + let languagesBox = $("#languages_selectbox"); + languagesBox.html(generateLanguagesOptions( + languages.getLanguages(), + APP.translation.getCurrentLanguage() + )); + APP.translation.translateElement(languagesBox); + languagesBox.change(function () { + emitter.emit(UIEvents.LANG_CHANGED, languagesBox.val()); + }); + + + // DEVICES LIST + this.changeDevicesList([]); + $('#selectCamera').change(function () { + let cameraDeviceId = $(this).val(); if (cameraDeviceId !== Settings.getCameraDeviceId()) { emitter.emit(UIEvents.VIDEO_DEVICE_CHANGED, cameraDeviceId); } - - let micDeviceId = $('#selectMic').val(); + }); + $('#selectMic').change(function () { + let micDeviceId = $(this).val(); if (micDeviceId !== Settings.getMicDeviceId()) { emitter.emit(UIEvents.AUDIO_DEVICE_CHANGED, micDeviceId); } - } - - let startMutedBlock = $("#startMutedOptions"); - startMutedBlock.before(generateLanguagesSelectBox()); - APP.translation.translateElement($("#languages_selectbox")); - - this.onAvailableDevicesChanged(); - this.onRoleChanged(); - this.onStartMutedChanged(); - - $("#updateSettings").click(update); - $('#settingsmenu>input').keyup(function(event){ - if (event.keyCode === 13) {//enter - update(); - } }); }, - onRoleChanged () { - if(APP.conference.isModerator) { + /** + * If start audio muted/start video muted options should be visible or not. + * @param {boolean} show + */ + showStartMutedOptions (show) { + if (show) { $("#startMutedOptions").css("display", "block"); - } - else { + } else { $("#startMutedOptions").css("display", "none"); } }, - onStartMutedChanged () { - $("#startAudioMuted").attr("checked", APP.conference.startAudioMuted); - $("#startVideoMuted").attr("checked", APP.conference.startVideoMuted); + updateStartMutedBox (startAudioMuted, startVideoMuted) { + $("#startAudioMuted").attr("checked", startAudioMuted); + $("#startVideoMuted").attr("checked", startVideoMuted); }, + /** + * Check if settings menu is visible or not. + * @returns {boolean} + */ isVisible () { return $('#settingsmenu').is(':visible'); }, - onDisplayNameChange (id, newDisplayName) { - if(id === 'localVideoContainer' || APP.conference.isLocalId(id)) { - $('#setDisplayName').val(newDisplayName); - } + /** + * Change user display name in the settings menu. + * @param {string} newDisplayName + */ + changeDisplayName (newDisplayName) { + $('#setDisplayName').val(newDisplayName); }, + /** + * Change user avatar in the settings menu. + * @param {string} avatarUrl url of the new avatar + */ changeAvatar (avatarUrl) { $('#avatar').attr('src', avatarUrl); }, - onAvailableDevicesChanged () { - let devices = APP.conference.availableDevices; + /** + * Change available cameras/microphones or hide selects completely if + * no devices available. + * @param {{ deviceId, label, kind }[]} devices list of available devices + */ + changeDevicesList (devices) { if (!devices.length) { $('#devicesOptions').hide(); return; diff --git a/modules/settings/Settings.js b/modules/settings/Settings.js index 8b9a545f7..8ba6a7d30 100644 --- a/modules/settings/Settings.js +++ b/modules/settings/Settings.js @@ -30,7 +30,7 @@ if (supportsLocalStorage()) { console.log("generated id", window.localStorage.jitsiMeetId); } - email = window.localStorage.email || ''; + email = UIUtil.unescapeHtml(window.localStorage.email || ''); displayName = UIUtil.unescapeHtml(window.localStorage.displayname || ''); language = window.localStorage.language; cameraDeviceId = window.localStorage.cameraDeviceId || ''; @@ -68,8 +68,7 @@ export default { */ setEmail: function (newEmail) { email = newEmail; - window.localStorage.email = newEmail; - return email; + window.localStorage.email = UIUtil.escapeHtml(newEmail); }, /** From 30e1e3b23a37845600ba4177826f45a36429a31d Mon Sep 17 00:00:00 2001 From: hristoterezov Date: Thu, 3 Mar 2016 14:53:36 +0200 Subject: [PATCH 02/10] Fixes jitsi meet to work with the renamed events and methods from the latest version of lib-jitsi-meet. --- conference.js | 6 +++--- modules/UI/videolayout/LocalVideo.js | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/conference.js b/conference.js index 201174586..2a0470d84 100644 --- a/conference.js +++ b/conference.js @@ -539,7 +539,7 @@ export default { if (localVideo) { // this calls room.removeTrack internally // so we don't need to remove it manually - promise = localVideo.stop(); + promise = localVideo.dispose(); } localVideo = stream; @@ -575,7 +575,7 @@ export default { if (localAudio) { // this calls room.removeTrack internally // so we don't need to remove it manually - promise = localAudio.stop(); + promise = localAudio.dispose(); } localAudio = stream; @@ -612,7 +612,7 @@ export default { if (shareScreen) { createDesktopTrack().then(([stream]) => { stream.on( - TrackEvents.TRACK_STOPPED, + TrackEvents.LOCAL_TRACK_STOPPED, () => { // if stream was stopped during screensharing session // then we should switch to video diff --git a/modules/UI/videolayout/LocalVideo.js b/modules/UI/videolayout/LocalVideo.js index e339be4e2..c108e3252 100644 --- a/modules/UI/videolayout/LocalVideo.js +++ b/modules/UI/videolayout/LocalVideo.js @@ -193,9 +193,9 @@ LocalVideo.prototype.changeVideo = function (stream) { let endedHandler = () => { localVideoContainer.removeChild(localVideo); this.VideoLayout.updateRemovedVideo(this.id); - stream.off(TrackEvents.TRACK_STOPPED, endedHandler); + stream.off(TrackEvents.LOCAL_TRACK_STOPPED, endedHandler); }; - stream.on(TrackEvents.TRACK_STOPPED, endedHandler); + stream.on(TrackEvents.LOCAL_TRACK_STOPPED, endedHandler); }; export default LocalVideo; From 04701065247d6d3468f3a39dfe7799052e1061e5 Mon Sep 17 00:00:00 2001 From: damencho Date: Fri, 4 Mar 2016 15:20:05 -0600 Subject: [PATCH 03/10] Shows and error dialog when we fail to install desktop sharing plugin for some reason. --- conference.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/conference.js b/conference.js index 201174586..5c4c62cbe 100644 --- a/conference.js +++ b/conference.js @@ -631,6 +631,16 @@ export default { this.videoSwitchInProgress = false; this.toggleScreenSharing(false); console.error('failed to share local desktop', err); + + let dialogTxt = APP.translation + .generateTranslationHTML("dialog.failtoinstall"); + let dialogTitle = APP.translation + .generateTranslationHTML("dialog.error"); + APP.UI.messageHandler.openDialog( + dialogTitle, + dialogTxt, + false + ); }); } else { createLocalTracks('video').then( From 413e5098c86e7e00abb9a89c73fd22f7d3fea6f4 Mon Sep 17 00:00:00 2001 From: damencho Date: Fri, 4 Mar 2016 15:21:07 -0600 Subject: [PATCH 04/10] Handles the error when user cancels desktop sharing window. --- conference.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/conference.js b/conference.js index 5c4c62cbe..154a5219c 100644 --- a/conference.js +++ b/conference.js @@ -630,6 +630,10 @@ export default { }).catch((err) => { this.videoSwitchInProgress = false; this.toggleScreenSharing(false); + + if(err === TrackErrors.CHROME_EXTENSION_USER_CANCELED) + return; + console.error('failed to share local desktop', err); let dialogTxt = APP.translation From d78666a49d32523f2b99f41b96e313406f3e363c Mon Sep 17 00:00:00 2001 From: damencho Date: Fri, 4 Mar 2016 15:36:53 -0600 Subject: [PATCH 05/10] Removes listener to missing event and duplicate dialog code. --- conference.js | 4 ---- modules/UI/UI.js | 15 --------------- 2 files changed, 19 deletions(-) diff --git a/conference.js b/conference.js index 154a5219c..26f779b26 100644 --- a/conference.js +++ b/conference.js @@ -813,10 +813,6 @@ export default { APP.UI.updateDTMFSupport(isDTMFSupported); }); - room.on(ConferenceEvents.FIREFOX_EXTENSION_NEEDED, function (url) { - APP.UI.notifyFirefoxExtensionRequired(url); - }); - APP.UI.addListener(UIEvents.ROOM_LOCK_CLICKED, () => { if (room.isModerator()) { let promise = roomLocker.isLocked diff --git a/modules/UI/UI.js b/modules/UI/UI.js index 601dc7aba..f3abf3b79 100644 --- a/modules/UI/UI.js +++ b/modules/UI/UI.js @@ -736,21 +736,6 @@ UI.notifyConnectionFailed = function (stropheErrorMsg) { ); }; -/** - * Notify user that he need to install Firefox extension to share screen. - * @param {stirng} url extension url - */ -UI.notifyFirefoxExtensionRequired = function (url) { - messageHandler.openMessageDialog( - "dialog.extensionRequired", - null, - null, - APP.translation.generateTranslationHTML( - "dialog.firefoxExtensionPrompt", {url} - ) - ); -}; - /** * Notify user that he was automatically muted when joned the conference. */ From 3a933cfb84bdc2e1750908c7f506cc275f41a011 Mon Sep 17 00:00:00 2001 From: damencho Date: Fri, 4 Mar 2016 15:55:44 -0600 Subject: [PATCH 06/10] Avoids showing two warning dialogs when firefox extension is required and missing. --- conference.js | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/conference.js b/conference.js index 26f779b26..f698e317b 100644 --- a/conference.js +++ b/conference.js @@ -157,23 +157,6 @@ function createLocalTracks (...devices) { }); } -/** - * Create local screen sharing track. - * Shows UI notification if Firefox extension is required. - * @returns {Promise} - */ -function createDesktopTrack () { - return createLocalTracks('desktop').catch(function (err) { - if (err === TrackErrors.FIREFOX_EXTENSION_NEEDED) { - APP.UI.showExtensionRequiredDialog( - config.desktopSharingFirefoxExtensionURL - ); - } - - return Promise.reject(err); - }); -} - class ConferenceConnector { constructor(resolve, reject) { this._resolve = resolve; @@ -610,7 +593,7 @@ export default { this.videoSwitchInProgress = true; if (shareScreen) { - createDesktopTrack().then(([stream]) => { + createLocalTracks('desktop').then(([stream]) => { stream.on( TrackEvents.TRACK_STOPPED, () => { @@ -636,6 +619,13 @@ export default { console.error('failed to share local desktop', err); + if (err === TrackErrors.FIREFOX_EXTENSION_NEEDED) { + APP.UI.showExtensionRequiredDialog( + config.desktopSharingFirefoxExtensionURL + ); + return; + } + let dialogTxt = APP.translation .generateTranslationHTML("dialog.failtoinstall"); let dialogTitle = APP.translation From 45d997e9f1f4c240ad5969f4e4fb9c39c20456a4 Mon Sep 17 00:00:00 2001 From: damencho Date: Mon, 7 Mar 2016 12:57:12 -0600 Subject: [PATCH 07/10] Adds a comment to default error handling for desktop sharing. --- conference.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/conference.js b/conference.js index f698e317b..a75e1f312 100644 --- a/conference.js +++ b/conference.js @@ -626,6 +626,10 @@ export default { return; } + // Handling: + // TrackErrors.CHROME_EXTENSION_INSTALLATION_ERROR + // TrackErrors.GENERAL + // and any other let dialogTxt = APP.translation .generateTranslationHTML("dialog.failtoinstall"); let dialogTitle = APP.translation From 1c3aafd5c48e31840ebd299b05b0e7d063936406 Mon Sep 17 00:00:00 2001 From: damencho Date: Tue, 8 Mar 2016 17:33:09 -0600 Subject: [PATCH 08/10] Uses the Promise returned on mute/unmute, just prints when calls were canceled due to operation in progress. --- conference.js | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/conference.js b/conference.js index f39ba2e24..82cd01da8 100644 --- a/conference.js +++ b/conference.js @@ -88,9 +88,17 @@ function muteLocalAudio (muted) { } if (muted) { - localAudio.mute(); + localAudio.mute().then(function(value) {}, + function(value) { + console.warn('Audio Mute was rejected:', value); + } + ); } else { - localAudio.unmute(); + localAudio.unmute().then(function(value) {}, + function(value) { + console.warn('Audio unmute was rejected:', value); + } + ); } } @@ -104,9 +112,17 @@ function muteLocalVideo (muted) { } if (muted) { - localVideo.mute(); + localVideo.mute().then(function(value) {}, + function(value) { + console.warn('Video mute was rejected:', value); + } + ); } else { - localVideo.unmute(); + localVideo.unmute().then(function(value) {}, + function(value) { + console.warn('Video unmute was rejected:', value); + } + ); } } From 72a761e80a0a5e9081297d63e1b88bb32953ce6e Mon Sep 17 00:00:00 2001 From: isymchych Date: Fri, 11 Mar 2016 15:04:21 +0200 Subject: [PATCH 09/10] integrate with nwjs --- nwjs-integration/index.html | 68 +++++++++++++++++++++++++++++++++++ nwjs-integration/package.json | 8 +++++ 2 files changed, 76 insertions(+) create mode 100644 nwjs-integration/index.html create mode 100644 nwjs-integration/package.json diff --git a/nwjs-integration/index.html b/nwjs-integration/index.html new file mode 100644 index 000000000..f345d0e4c --- /dev/null +++ b/nwjs-integration/index.html @@ -0,0 +1,68 @@ + + + + + + + + + diff --git a/nwjs-integration/package.json b/nwjs-integration/package.json new file mode 100644 index 000000000..3262d5f2e --- /dev/null +++ b/nwjs-integration/package.json @@ -0,0 +1,8 @@ +{ + "name": "JitsiMeetNW!", + "version": "0.0.1", + "jitsi-url": "https://ivan.jitsi.net/", + "main": "index.html", + "chromium-args": "--ignore-certificate-errors", + "user-agent": "Chrome/%webkit_ver JitsiMeetNW/%ver" +} From 897e7a19250aa126152ba2ee52d31632bf373787 Mon Sep 17 00:00:00 2001 From: Emil Ivov Date: Tue, 15 Mar 2016 16:16:50 -0500 Subject: [PATCH 10/10] Update main.json --- lang/main.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lang/main.json b/lang/main.json index 9c5792827..c2863f3b5 100644 --- a/lang/main.json +++ b/lang/main.json @@ -13,7 +13,7 @@ "welcomepage":{ "go": "GO", "roomname": "Enter room name", - "disable": "Don't show this page the next time I enter", + "disable": "Don't show this page again", "feature1": { "title": "Simple to use", "content": "No downloads required. __app__ works directly within your browser. Simply share your conference URL with others to get started."