/* global JitsiMeetJS, APP */ import InviteDialogView from './InviteDialogView'; import createRoomLocker from './RoomLocker'; import UIEvents from '../../../service/UI/UIEvents'; const ConferenceEvents = JitsiMeetJS.events.conference; /** * Invite module * Constructor takes conference object giving * ability to subscribe on its events */ class Invite { constructor(conference) { this.conference = conference; this.createRoomLocker(conference); this.registerListeners(); } /** * Registering listeners. * Primarily listeners for conference events. */ registerListeners() { this.conference.on(ConferenceEvents.LOCK_STATE_CHANGED, (locked, error) => { console.log("Received channel password lock change: ", locked, error); if (!locked) { this.roomLocker.resetPassword(); } this.setLockedFromElsewhere(locked); }); this.conference.on(ConferenceEvents.USER_ROLE_CHANGED, (id) => { if (APP.conference.isLocalId(id) && this.isModerator !== this.conference.isModerator) { this.setModerator(this.conference.isModerator); } }); APP.UI.addListener( UIEvents.INVITE_CLICKED, () => { this.openLinkDialog(); }); APP.UI.addListener( UIEvents.INVITE_URL_INITIALISED, (inviteUrl) => { this.updateInviteUrl(inviteUrl); }); APP.UI.addListener( UIEvents.PASSWORD_REQUIRED, () => { this.setLockedFromElsewhere(true); this.roomLocker.requirePassword().then(() => { let pass = this.roomLocker.password; // we received that password is required, but user is trying // anyway to login without a password, mark room as not // locked in case he succeeds (maybe someone removed the // password meanwhile), if it is still locked another // password required will be received and the room again // will be marked as locked. if (!pass) this.setLockedFromElsewhere(false); this.conference.join(this.roomLocker.password); }); }); } /** * Updates the view. * If dialog hasn't been defined - * creates it and updates */ updateView() { if (!this.view) { this.initDialog(); } this.view.updateView(); } /** * Room locker factory * @param room * @returns {Object} RoomLocker * @factory */ createRoomLocker(room = this.conference) { let roomLocker = createRoomLocker(room); this.roomLocker = roomLocker; return this.getRoomLocker(); } /** * Room locker getter * @returns {Object} RoomLocker */ getRoomLocker() { return this.roomLocker; } /** * Opens the invite link dialog. */ openLinkDialog () { if (!this.view) { this.initDialog(); } this.view.open(); } /** * Dialog initialization. * creating view object using as a model this module */ initDialog() { this.password = this.getPassword(); this.view = new InviteDialogView(this); } /** * Password getter * @returns {String} password */ getPassword() { return this.roomLocker.password; } /** * Switches between the moderator view and normal view. * * @param isModerator indicates if the participant is moderator */ setModerator(isModerator) { this.isModerator = isModerator; this.updateView(); } /** * Allows to unlock the room. * If the current user is moderator. */ setRoomUnlocked() { if (this.isModerator) { this.roomLocker.lock().then(() => { APP.UI.emitEvent(UIEvents.TOGGLE_ROOM_LOCK); this.updateView(); }); } } /** * Allows to lock the room if * the current user is moderator. * Takes the password. * @param {String} newPass */ setRoomLocked(newPass) { let isModerator = this.isModerator; if (isModerator && (newPass || !this.roomLocker.isLocked)) { this.roomLocker.lock(newPass).then(() => { APP.UI.emitEvent(UIEvents.TOGGLE_ROOM_LOCK); this.updateView(); }); } } /** * Updates the room invite url. */ updateInviteUrl (newInviteUrl) { this.inviteUrl = newInviteUrl; this.updateView(); } /** * Helper method for encoding * Invite URL * @returns {string} */ getEncodedInviteUrl() { return encodeURI(this.inviteUrl); } /** * Is locked flag. * Delegates to room locker * @returns {Boolean} isLocked */ isLocked() { return this.roomLocker.isLocked; } /** * Set flag locked from elsewhere to room locker. * @param isLocked */ setLockedFromElsewhere(isLocked) { let oldLockState = this.roomLocker.lockedElsewhere; if (oldLockState !== isLocked) { this.roomLocker.lockedElsewhere = isLocked; APP.UI.emitEvent(UIEvents.TOGGLE_ROOM_LOCK); this.updateView(); } } } export default Invite;