diff --git a/conference.js b/conference.js index 57547e5b4..cccf571db 100644 --- a/conference.js +++ b/conference.js @@ -312,6 +312,11 @@ class ConferenceConnector { room.join(); }, 5000); + const { password } + = APP.store.getState()['features/base/conference']; + + AuthHandler.requireAuth(room, password); + break; } @@ -2278,7 +2283,7 @@ export default { }); APP.UI.addListener(UIEvents.AUTH_CLICKED, () => { - AuthHandler.authenticateExternal(room); + AuthHandler.authenticate(room); }); APP.UI.addListener( diff --git a/connection.js b/connection.js index 12b268df5..2baf47ca5 100644 --- a/connection.js +++ b/connection.js @@ -4,7 +4,6 @@ import { jitsiLocalStorage } from '@jitsi/js-utils'; import Logger from 'jitsi-meet-logger'; import { redirectToTokenAuthService } from './modules/UI/authentication/AuthHandler'; -import { hideLoginDialog } from './react/features/authentication/actions.web'; import { LoginDialog } from './react/features/authentication/components'; import { isTokenAuthEnabled } from './react/features/authentication/functions'; import { @@ -243,7 +242,6 @@ function requestAuth(roomName) { return new Promise(resolve => { const onSuccess = connection => { - APP.store.dispatch(hideLoginDialog()); resolve(connection); }; diff --git a/lang/main.json b/lang/main.json index 32f176b01..a3293cb43 100644 --- a/lang/main.json +++ b/lang/main.json @@ -259,6 +259,7 @@ "muteParticipantsVideoTitle": "Disable camera of this participant?", "muteParticipantsVideoBody": "You won't be able to turn the camera back on, but they can turn it back on at any time.", "Ok": "OK", + "password": "Password", "passwordLabel": "The meeting has been locked by a participant. Please enter the $t(lockRoomPassword) to join.", "passwordNotSupported": "Setting a meeting $t(lockRoomPassword) is not supported.", "passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) not supported", diff --git a/modules/UI/authentication/AuthHandler.js b/modules/UI/authentication/AuthHandler.js index a88254ac8..b3d79cba0 100644 --- a/modules/UI/authentication/AuthHandler.js +++ b/modules/UI/authentication/AuthHandler.js @@ -3,15 +3,21 @@ import Logger from 'jitsi-meet-logger'; import { openConnection } from '../../../connection'; +import { + openAuthDialog, + openLoginDialog } from '../../../react/features/authentication/actions.web'; +import { WaitForOwnerDialog } from '../../../react/features/authentication/components'; import { isTokenAuthEnabled, getTokenAuthUrl } from '../../../react/features/authentication/functions'; +import { isDialogOpen } from '../../../react/features/base/dialog'; import { setJWT } from '../../../react/features/base/jwt'; import UIUtil from '../util/UIUtil'; import LoginDialog from './LoginDialog'; + let externalAuthWindow; declare var APP: Object; @@ -33,6 +39,7 @@ function doExternalAuth(room, lockPassword) { return; } + if (room.isJoined()) { let getUrl; @@ -158,18 +165,37 @@ function initJWTTokenListener(room) { } /** + * Authenticate for the conference. * Uses external service for auth if conference supports that. * @param {JitsiConference} room * @param {string} [lockPassword] password to use if the conference is locked */ -function authenticateExternal(room: Object, lockPassword: string) { +function authenticate(room: Object, lockPassword: string) { const config = APP.store.getState()['features/base/config']; if (isTokenAuthEnabled(config) || room.isExternalAuthEnabled()) { doExternalAuth(room, lockPassword); + } else { + APP.store.dispatch(openLoginDialog()); } } +/** + * Notify user that authentication is required to create the conference. + * @param {JitsiConference} room + * @param {string} [lockPassword] password to use if the conference is locked + */ +function requireAuth(room: Object, lockPassword: string) { + if (!isDialogOpen(APP.store, WaitForOwnerDialog)) { + return; + } + + APP.store.dispatch( + openAuthDialog( + room.getName(), authenticate.bind(null, room, lockPassword)) + ); +} + /** * De-authenticate local user. * @@ -191,6 +217,7 @@ function logout(room: Object) { } export default { - authenticateExternal, - logout + authenticate, + logout, + requireAuth }; diff --git a/modules/UI/authentication/LoginDialog.js b/modules/UI/authentication/LoginDialog.js index fb1a92dfd..f544e0809 100644 --- a/modules/UI/authentication/LoginDialog.js +++ b/modules/UI/authentication/LoginDialog.js @@ -1,202 +1,16 @@ -/* global $, APP, config */ +// @flow -import { toJid } from '../../../react/features/base/connection/functions'; -import { - JitsiConnectionErrors -} from '../../../react/features/base/lib-jitsi-meet'; - -/** - * Build html for "password required" dialog. - * @returns {string} html string - */ -function getPasswordInputHtml() { - const placeholder = config.hosts.authdomain - ? 'user identity' - : 'user@domain.net'; - - return ` - - `; -} - -/** - * Generate cancel button config for the dialog. - * @returns {Object} - */ -function cancelButton() { - return { - title: APP.translation.generateTranslationHTML('dialog.Cancel'), - value: false - }; -} - -/** - * Auth dialog for JitsiConnection which supports retries. - * If no cancelCallback provided then there will be - * no cancel button on the dialog. - * - * @class LoginDialog - * @constructor - * - * @param {function(jid, password)} successCallback - * @param {function} [cancelCallback] callback to invoke if user canceled. - */ -function LoginDialog(successCallback, cancelCallback) { - const loginButtons = [ { - title: APP.translation.generateTranslationHTML('dialog.Ok'), - value: true - } ]; - const finishedButtons = [ { - title: APP.translation.generateTranslationHTML('dialog.retry'), - value: 'retry' - } ]; - - // show "cancel" button only if cancelCallback provided - if (cancelCallback) { - loginButtons.push(cancelButton()); - finishedButtons.push(cancelButton()); - } - - const states = { - login: { - buttons: loginButtons, - focus: ':input:first', - html: getPasswordInputHtml(), - titleKey: 'dialog.passwordRequired', - - submit(e, v, m, f) { // eslint-disable-line max-params - e.preventDefault(); - if (v) { - const jid = f.username; - const password = f.password; - - if (jid && password) { - // eslint-disable-next-line no-use-before-define - connDialog.goToState('connecting'); - successCallback(toJid(jid, config.hosts), password); - } - } else { - // User cancelled - cancelCallback(); - } - } - }, - connecting: { - buttons: [], - defaultButton: 0, - html: '
', - titleKey: 'dialog.connecting' - }, - finished: { - buttons: finishedButtons, - defaultButton: 0, - html: '
', - titleKey: 'dialog.error', - - submit(e, v) { - e.preventDefault(); - if (v === 'retry') { - // eslint-disable-next-line no-use-before-define - connDialog.goToState('login'); - } else { - // User cancelled - cancelCallback(); - } - } - } - }; - const connDialog = APP.UI.messageHandler.openDialogWithStates( - states, - { - closeText: '', - persistent: true, - zIndex: 1020 - }, - null - ); - - /** - * Displays error message in 'finished' state which allows either to cancel - * or retry. - * @param error the key to the error to be displayed. - * @param options the options to the error message (optional) - */ - this.displayError = function(error, options) { - - const finishedState = connDialog.getState('finished'); - - const errorMessageElem = finishedState.find('#errorMessage'); - - let messageKey; - - if (error === JitsiConnectionErrors.PASSWORD_REQUIRED) { - // this is a password required error, as login window was already - // open once, this means username or password is wrong - messageKey = 'dialog.incorrectPassword'; - } else { - messageKey = 'dialog.connectErrorWithMsg'; - - if (!options) { - options = {};// eslint-disable-line no-param-reassign - } - - options.msg = error; - } - - errorMessageElem.attr('data-i18n', messageKey); - - APP.translation.translateElement($(errorMessageElem), options); - - connDialog.goToState('finished'); - }; - - /** - * Show message as connection status. - * @param {string} messageKey the key to the message - */ - this.displayConnectionStatus = function(messageKey) { - const connectingState = connDialog.getState('connecting'); - - const connectionStatus = connectingState.find('#connectionStatus'); - - connectionStatus.attr('data-i18n', messageKey); - APP.translation.translateElement($(connectionStatus)); - }; - - /** - * Closes LoginDialog. - */ - this.close = function() { - connDialog.close(); - }; -} +declare var APP: Object; export default { - /** - * Show new auth dialog for JitsiConnection. - * - * @param {function(jid, password)} successCallback - * @param {function} [cancelCallback] callback to invoke if user canceled. - * - * @returns {LoginDialog} - */ - showAuthDialog(successCallback, cancelCallback) { - return new LoginDialog(successCallback, cancelCallback); - }, - /** * Show notification that external auth is required (using provided url). - * @param {string} url URL to use for external auth. - * @param {function} callback callback to invoke when auth popup is closed. + * @param {string} url - URL to use for external auth. + * @param {function} callback - callback to invoke when auth popup is closed. * @returns auth dialog */ - showExternalAuthDialog(url, callback) { + showExternalAuthDialog(url: string, callback: ?Function) { const dialog = APP.UI.messageHandler.openCenteredPopup( url, 910, 660, diff --git a/react/features/authentication/actions.any.js b/react/features/authentication/actions.any.js new file mode 100644 index 000000000..5dce52cf1 --- /dev/null +++ b/react/features/authentication/actions.any.js @@ -0,0 +1,182 @@ +// @flow + +import type { Dispatch } from 'redux'; + +import { checkIfCanJoin } from '../base/conference'; +import { openDialog } from '../base/dialog'; + +import { + STOP_WAIT_FOR_OWNER, + UPGRADE_ROLE_FINISHED, + UPGRADE_ROLE_STARTED, WAIT_FOR_OWNER +} from './actionTypes'; +import { LoginDialog, WaitForOwnerDialog } from './components'; +import logger from './logger'; + +/** + * Initiates authenticating and upgrading the role of the local participant to + * moderator which will allow to create and join a new conference on an XMPP + * password + guest access configuration. Refer to {@link LoginDialog} for more + * info. + * + * @param {string} id - The XMPP user's ID (e.g. {@code user@domain.com}). + * @param {string} password - The XMPP user's password. + * @param {JitsiConference} conference - The conference for which the local + * participant's role will be upgraded. + * @returns {Function} + */ +export function authenticateAndUpgradeRole( + id: string, + password: string, + conference: Object) { + return (dispatch: Dispatch, getState: Function) => { + const { password: roomPassword } + = getState()['features/base/conference']; + const process + = conference.authenticateAndUpgradeRole({ + id, + password, + roomPassword, + + onLoginSuccessful() { + // When the login succeeds, the process has completed half + // of its job (i.e. 0.5). + return dispatch(_upgradeRoleFinished(process, 0.5)); + } + }); + + dispatch(_upgradeRoleStarted(process)); + process.then( + /* onFulfilled */ () => dispatch(_upgradeRoleFinished(process, 1)), + /* onRejected */ error => { + // The lack of an error signals a cancellation. + if (error.authenticationError || error.connectionError) { + logger.error('authenticateAndUpgradeRole failed', error); + } + + dispatch(_upgradeRoleFinished(process, error)); + }); + + return process; + }; +} + + +/** + * Signals that the process of authenticating and upgrading the local + * participant's role has finished either with success or with a specific error. + * + * @param {Object} thenableWithCancel - The process of authenticating and + * upgrading the local participant's role. + * @param {Object} progressOrError - If the value is a {@code number}, then the + * process of authenticating and upgrading the local participant's role has + * succeeded in one of its two/multiple steps; otherwise, it has failed with the + * specified error. Refer to {@link JitsiConference#authenticateAndUpgradeRole} + * in lib-jitsi-meet for the error details. + * @private + * @returns {{ + * type: UPGRADE_ROLE_FINISHED, + * error: ?Object, + * progress: number + * }} + */ +function _upgradeRoleFinished( + thenableWithCancel, + progressOrError: number | Object) { + let error; + let progress; + + if (typeof progressOrError === 'number') { + progress = progressOrError; + } else { + // Make the specified error object resemble an Error instance (to the + // extent that jitsi-meet needs it). + const { + authenticationError, + connectionError, + ...other + } = progressOrError; + + error = { + name: authenticationError || connectionError, + ...other + }; + progress = authenticationError ? 0.5 : 0; + } + + return { + type: UPGRADE_ROLE_FINISHED, + error, + progress, + thenableWithCancel + }; +} + +/** + * Signals that a process of authenticating and upgrading the local + * participant's role has started. + * + * @param {Object} thenableWithCancel - The process of authenticating and + * upgrading the local participant's role. + * @private + * @returns {{ + * type: UPGRADE_ROLE_STARTED, + * thenableWithCancel: Object + * }} + */ +function _upgradeRoleStarted(thenableWithCancel) { + return { + type: UPGRADE_ROLE_STARTED, + thenableWithCancel + }; +} + +/** + * Opens {@link WaitForOnwerDialog}. + * + * @protected + * @returns {Action} + */ +export function openWaitForOwnerDialog() { + return openDialog(WaitForOwnerDialog); +} + +/** + * Stops waiting for the conference owner. + * + * @returns {{ + * type: STOP_WAIT_FOR_OWNER + * }} + */ +export function stopWaitForOwner() { + return { + type: STOP_WAIT_FOR_OWNER + }; +} + +/** + * Called when Jicofo rejects to create the room for anonymous user. Will + * start the process of "waiting for the owner" by periodically trying to join + * the room every five seconds. + * + * @returns {Function} + */ +export function waitForOwner() { + return (dispatch: Dispatch) => + dispatch({ + type: WAIT_FOR_OWNER, + handler: () => dispatch(checkIfCanJoin()), + timeoutMs: 5000 + }); +} + +/** + * Opens {@link LoginDialog} which will ask to enter username and password + * for the current conference. + * + * @protected + * @returns {Action} + */ +export function openLoginDialog() { + return openDialog(LoginDialog); +} diff --git a/react/features/authentication/actions.native.js b/react/features/authentication/actions.native.js index 0c6e3389c..e0719e6c3 100644 --- a/react/features/authentication/actions.native.js +++ b/react/features/authentication/actions.native.js @@ -3,68 +3,14 @@ import type { Dispatch } from 'redux'; import { appNavigate } from '../app/actions'; -import { checkIfCanJoin, conferenceLeft } from '../base/conference/actions'; +import { conferenceLeft } from '../base/conference/actions'; import { connectionFailed } from '../base/connection/actions.native'; -import { openDialog } from '../base/dialog/actions'; import { set } from '../base/redux'; -import { - CANCEL_LOGIN, - STOP_WAIT_FOR_OWNER, - UPGRADE_ROLE_FINISHED, - UPGRADE_ROLE_STARTED, - WAIT_FOR_OWNER -} from './actionTypes'; -import { LoginDialog, WaitForOwnerDialog } from './components'; -import logger from './logger'; +import { CANCEL_LOGIN } from './actionTypes'; +import { stopWaitForOwner } from './actions.any'; -/** - * Initiates authenticating and upgrading the role of the local participant to - * moderator which will allow to create and join a new conference on an XMPP - * password + guest access configuration. Refer to {@link LoginDialog} for more - * info. - * - * @param {string} id - The XMPP user's ID (e.g. {@code user@domain.com}). - * @param {string} password - The XMPP user's password. - * @param {JitsiConference} conference - The conference for which the local - * participant's role will be upgraded. - * @returns {Function} - */ -export function authenticateAndUpgradeRole( - id: string, - password: string, - conference: Object) { - return (dispatch: Dispatch, getState: Function) => { - const { password: roomPassword } - = getState()['features/base/conference']; - const process - = conference.authenticateAndUpgradeRole({ - id, - password, - roomPassword, - - onLoginSuccessful() { - // When the login succeeds, the process has completed half - // of its job (i.e. 0.5). - return dispatch(_upgradeRoleFinished(process, 0.5)); - } - }); - - dispatch(_upgradeRoleStarted(process)); - process.then( - /* onFulfilled */ () => dispatch(_upgradeRoleFinished(process, 1)), - /* onRejected */ error => { - // The lack of an error signals a cancellation. - if (error.authenticationError || error.connectionError) { - logger.error('authenticateAndUpgradeRole failed', error); - } - - dispatch(_upgradeRoleFinished(process, error)); - }); - - return process; - }; -} +export * from './actions.any'; /** * Cancels {@ink LoginDialog}. @@ -118,121 +64,4 @@ export function cancelWaitForOwner() { }; } -/** - * Opens {@link LoginDialog} which will ask to enter username and password - * for the current conference. - * - * @protected - * @returns {Action} - */ -export function _openLoginDialog() { - return openDialog(LoginDialog); -} -/** - * Opens {@link WaitForOnwerDialog}. - * - * @protected - * @returns {Action} - */ -export function _openWaitForOwnerDialog() { - return openDialog(WaitForOwnerDialog); -} - -/** - * Stops waiting for the conference owner. - * - * @returns {{ - * type: STOP_WAIT_FOR_OWNER - * }} - */ -export function stopWaitForOwner() { - return { - type: STOP_WAIT_FOR_OWNER - }; -} - -/** - * Signals that the process of authenticating and upgrading the local - * participant's role has finished either with success or with a specific error. - * - * @param {Object} thenableWithCancel - The process of authenticating and - * upgrading the local participant's role. - * @param {Object} progressOrError - If the value is a {@code number}, then the - * process of authenticating and upgrading the local participant's role has - * succeeded in one of its two/multiple steps; otherwise, it has failed with the - * specified error. Refer to {@link JitsiConference#authenticateAndUpgradeRole} - * in lib-jitsi-meet for the error details. - * @private - * @returns {{ - * type: UPGRADE_ROLE_FINISHED, - * error: ?Object, - * progress: number - * }} - */ -function _upgradeRoleFinished( - thenableWithCancel, - progressOrError: number | Object) { - let error; - let progress; - - if (typeof progressOrError === 'number') { - progress = progressOrError; - } else { - // Make the specified error object resemble an Error instance (to the - // extent that jitsi-meet needs it). - const { - authenticationError, - connectionError, - ...other - } = progressOrError; - - error = { - name: authenticationError || connectionError, - ...other - }; - progress = authenticationError ? 0.5 : 0; - } - - return { - type: UPGRADE_ROLE_FINISHED, - error, - progress, - thenableWithCancel - }; -} - -/** - * Signals that a process of authenticating and upgrading the local - * participant's role has started. - * - * @param {Object} thenableWithCancel - The process of authenticating and - * upgrading the local participant's role. - * @private - * @returns {{ - * type: UPGRADE_ROLE_STARTED, - * thenableWithCancel: Object - * }} - */ -function _upgradeRoleStarted(thenableWithCancel) { - return { - type: UPGRADE_ROLE_STARTED, - thenableWithCancel - }; -} - -/** - * Called when Jicofo rejects to create the room for anonymous user. Will - * start the process of "waiting for the owner" by periodically trying to join - * the room every five seconds. - * - * @returns {Function} - */ -export function waitForOwner() { - return (dispatch: Dispatch) => - dispatch({ - type: WAIT_FOR_OWNER, - handler: () => dispatch(checkIfCanJoin()), - timeoutMs: 5000 - }); -} diff --git a/react/features/authentication/actions.web.js b/react/features/authentication/actions.web.js index 3ecef5de5..13a8f906e 100644 --- a/react/features/authentication/actions.web.js +++ b/react/features/authentication/actions.web.js @@ -8,6 +8,8 @@ import { } from './actionTypes'; import { WaitForOwnerDialog, LoginDialog } from './components'; +export * from './actions.any'; + /** * Cancels {@ink LoginDialog}. * @@ -43,25 +45,21 @@ export function hideLoginDialog() { return hideDialog(LoginDialog); } -/** - * Shows a authentication dialog where the local participant - * should authenticate. - * - * @returns {Function}. - */ -export function openLoginDialog() { - return openDialog(LoginDialog); -} - /** * Shows a notification dialog that authentication is required to create the. - * Conference, so the local participant should authenticate or wait for a - * host. + * Conference. + * This is used for external auth. + * + * @param {string} room - The room name. + * @param {Function} onAuthNow - The function to be invoked when external authentication. * * @returns {Function}. */ -export function openWaitForOwnerDialog() { - return openDialog(WaitForOwnerDialog); +export function openAuthDialog(room: String, onAuthNow: ?Function) { + return openDialog(WaitForOwnerDialog, { + room, + onAuthNow + }); } diff --git a/react/features/authentication/components/native/WaitForOwnerDialog.js b/react/features/authentication/components/native/WaitForOwnerDialog.js index d2458e727..4e618f635 100644 --- a/react/features/authentication/components/native/WaitForOwnerDialog.js +++ b/react/features/authentication/components/native/WaitForOwnerDialog.js @@ -6,7 +6,7 @@ import type { Dispatch } from 'redux'; import { ConfirmDialog } from '../../../base/dialog'; import { translate } from '../../../base/i18n'; import { connect } from '../../../base/redux'; -import { cancelWaitForOwner, _openLoginDialog } from '../../actions.native'; +import { openLoginDialog, cancelWaitForOwner } from '../../actions.native'; /** * The type of the React {@code Component} props of {@link WaitForOwnerDialog}. @@ -97,7 +97,7 @@ class WaitForOwnerDialog extends Component { * @returns {void} */ _onLogin() { - this.props.dispatch(_openLoginDialog()); + this.props.dispatch(openLoginDialog()); } } diff --git a/react/features/authentication/components/web/LoginDialog.js b/react/features/authentication/components/web/LoginDialog.js index c0c066ab8..b515e9877 100644 --- a/react/features/authentication/components/web/LoginDialog.js +++ b/react/features/authentication/components/web/LoginDialog.js @@ -10,8 +10,7 @@ import { Dialog } from '../../../base/dialog'; import { translate, translateToHTML } from '../../../base/i18n'; import { JitsiConnectionErrors } from '../../../base/lib-jitsi-meet'; import { connect as reduxConnect } from '../../../base/redux'; -import { authenticateAndUpgradeRole } from '../../actions.native'; -import { cancelLogin } from '../../actions.web'; +import { authenticateAndUpgradeRole, cancelLogin } from '../../actions.web'; /** * The type of the React {@code Component} props of {@link LoginDialog}. @@ -197,7 +196,7 @@ class LoginDialog extends Component { const messageOptions = {}; let messageKey; - if (progress && progress >= 0.5) { + if (progress && progress < 1) { messageKey = t('connection.FETCH_SESSION_ID'); } else if (error) { const { name } = error; @@ -271,6 +270,7 @@ class LoginDialog extends Component { label = { t('dialog.userPassword') } name = 'password' onChange = { this._onChange } + placeholder = { t('dialog.password') } shouldFitContainer = { true } type = 'password' value = { password } /> diff --git a/react/features/authentication/components/web/WaitForOwnerDialog.js b/react/features/authentication/components/web/WaitForOwnerDialog.js index 207cc7fc0..4666674a5 100644 --- a/react/features/authentication/components/web/WaitForOwnerDialog.js +++ b/react/features/authentication/components/web/WaitForOwnerDialog.js @@ -6,7 +6,7 @@ import type { Dispatch } from 'redux'; import { Dialog } from '../../../base/dialog'; import { translate, translateToHTML } from '../../../base/i18n'; import { connect } from '../../../base/redux'; -import { openLoginDialog, cancelWaitForOwner } from '../../actions.web'; +import { cancelWaitForOwner } from '../../actions.web'; /** * The type of the React {@code Component} props of {@link WaitForOwnerDialog}. @@ -76,9 +76,9 @@ class WaitForOwnerDialog extends PureComponent { * @returns {void} */ _onIAmHost() { - const { dispatch } = this.props; + const { onAuthNow } = this.props; - dispatch(openLoginDialog()); + onAuthNow && onAuthNow(); } /** @@ -88,7 +88,7 @@ class WaitForOwnerDialog extends PureComponent { */ render() { const { - _room, + _room: room, t } = this.props; @@ -102,7 +102,7 @@ class WaitForOwnerDialog extends PureComponent { { translateToHTML( - t, 'dialog.WaitForHostMsg', { room: _room }) + t, 'dialog.WaitForHostMsg', { room }) } diff --git a/react/features/authentication/middleware.native.js b/react/features/authentication/middleware.native.js index 8b3477b14..c67be2889 100644 --- a/react/features/authentication/middleware.native.js +++ b/react/features/authentication/middleware.native.js @@ -22,11 +22,10 @@ import { WAIT_FOR_OWNER } from './actionTypes'; import { - _openLoginDialog, - _openWaitForOwnerDialog, + openLoginDialog, + openWaitForOwnerDialog, stopWaitForOwner, - waitForOwner -} from './actions.native'; + waitForOwner } from './actions.native'; import { LoginDialog, WaitForOwnerDialog } from './components'; /** @@ -54,7 +53,7 @@ MiddlewareRegistry.register(store => next => action => { // Instead of hiding show the new one. const result = next(action); - dispatch(_openWaitForOwnerDialog()); + dispatch(openWaitForOwnerDialog()); return result; } @@ -114,7 +113,7 @@ MiddlewareRegistry.register(store => next => action => { && error.name === JitsiConnectionErrors.PASSWORD_REQUIRED && typeof error.recoverable === 'undefined') { error.recoverable = true; - store.dispatch(_openLoginDialog()); + store.dispatch(openLoginDialog()); } break; } @@ -134,7 +133,7 @@ MiddlewareRegistry.register(store => next => action => { // The WAIT_FOR_OWNER action is cyclic and we don't want to hide the // login dialog every few seconds. isDialogOpen(store, LoginDialog) - || store.dispatch(_openWaitForOwnerDialog()); + || store.dispatch(openWaitForOwnerDialog()); break; } } diff --git a/react/features/authentication/middleware.web.js b/react/features/authentication/middleware.web.js index 715eda087..c43738fcb 100644 --- a/react/features/authentication/middleware.web.js +++ b/react/features/authentication/middleware.web.js @@ -19,12 +19,10 @@ import { WAIT_FOR_OWNER } from './actionTypes'; import { + hideLoginDialog, + openWaitForOwnerDialog, stopWaitForOwner, waitForOwner -} from './actions.native'; -import { - hideLoginDialog, - openWaitForOwnerDialog } from './actions.web'; import { LoginDialog, WaitForOwnerDialog } from './components'; @@ -42,7 +40,7 @@ MiddlewareRegistry.register(store => next => action => { case CANCEL_LOGIN: { if (!isDialogOpen(store, WaitForOwnerDialog)) { - if (isWaitingForOwner(store)) { + if (_isWaitingForOwner(store)) { store.dispatch(openWaitForOwnerDialog()); return next(action); @@ -74,10 +72,10 @@ MiddlewareRegistry.register(store => next => action => { } case CONFERENCE_JOINED: - if (isWaitingForOwner(store)) { + if (_isWaitingForOwner(store)) { store.dispatch(stopWaitForOwner()); } - store.dispatch(hideLoginDialog); + store.dispatch(hideLoginDialog()); break; case CONFERENCE_LEFT: @@ -85,16 +83,16 @@ MiddlewareRegistry.register(store => next => action => { break; case CONNECTION_ESTABLISHED: - store.dispatch(hideLoginDialog); + store.dispatch(hideLoginDialog()); break; case STOP_WAIT_FOR_OWNER: - clearExistingWaitForOwnerTimeout(store); + _clearExistingWaitForOwnerTimeout(store); store.dispatch(hideDialog(WaitForOwnerDialog)); break; case WAIT_FOR_OWNER: { - clearExistingWaitForOwnerTimeout(store); + _clearExistingWaitForOwnerTimeout(store); const { handler, timeoutMs } = action; @@ -116,7 +114,7 @@ MiddlewareRegistry.register(store => next => action => { * @param {Object} store - The redux store. * @returns {void} */ -function clearExistingWaitForOwnerTimeout( +function _clearExistingWaitForOwnerTimeout( { getState }: { getState: Function }) { const { waitForOwnerTimeoutID } = getState()['features/authentication']; @@ -129,6 +127,6 @@ function clearExistingWaitForOwnerTimeout( * @param {Object} store - The redux store. * @returns {void} */ -function isWaitingForOwner({ getState }: { getState: Function }) { +function _isWaitingForOwner({ getState }: { getState: Function }) { return getState()['features/authentication'].waitForOwnerTimeoutID; }