204 lines
5.2 KiB
JavaScript
204 lines
5.2 KiB
JavaScript
/* 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.inviteUrl = APP.ConferenceUrl.getInviteUrl();
|
|
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.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();
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 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;
|