| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 | /* global APP, JitsiMeetJS */
import messageHandler from '../util/MessageHandler';
import UIUtil from '../util/UIUtil';
//FIXME:
import AnalyticsAdapter from '../../statistics/AnalyticsAdapter';
/**
 * Show dialog which asks user for new password for the conference.
 * @returns {Promise<string>} password or nothing if user canceled
 */
function askForNewPassword () {
    let passMsg = APP.translation.generateTranslationHTML("dialog.passwordMsg");
    let yourPassMsg = APP.translation.translateString("dialog.yourPassword");
    let msg = `
        <h2>${passMsg}</h2>
        <input name="lockKey" type="text"
               data-i18n="[placeholder]dialog.yourPassword"
               placeholder="${yourPassMsg}" autofocus>
    `;
    return new Promise(function (resolve, reject) {
        messageHandler.openTwoButtonDialog(
            null, null, null,
            msg, false, "dialog.Save",
            function (e, v, m, f) {
                if (v && f.lockKey) {
                    resolve(UIUtil.escapeHtml(f.lockKey));
                } else {
                    reject();
                }
            },
            null, null, 'input:first'
        );
    });
}
/**
 * Show dialog which asks for required conference password.
 * @returns {Promise<string>} password or nothing if user canceled
 */
function askForPassword () {
    let passRequiredMsg = APP.translation.translateString(
        "dialog.passwordRequired"
    );
    let passMsg = APP.translation.translateString("dialog.password");
    let msg = `
        <h2 data-i18n="dialog.passwordRequired">${passRequiredMsg}</h2>
        <input name="lockKey" type="text"
               data-i18n="[placeholder]dialog.password"
               placeholder="${passMsg}" autofocus>
    `;
    return new Promise(function (resolve, reject) {
        messageHandler.openTwoButtonDialog(
            null, null, null, msg,
            true, "dialog.Ok",
            function (e, v, m, f) {}, null,
            function (e, v, m, f) {
                if (v && f.lockKey) {
                    resolve(UIUtil.escapeHtml(f.lockKey));
                } else {
                    reject();
                }
            },
            ':input:first'
        );
    });
}
/**
 * Show dialog which asks if user want remove password from the conference.
 * @returns {Promise}
 */
function askToUnlock () {
    return new Promise(function (resolve, reject) {
        messageHandler.openTwoButtonDialog(
            null, null, "dialog.passwordCheck",
            null, false, "dialog.Remove",
            function (e, v) {
                if (v) {
                    resolve();
                } else {
                    reject();
                }
            }
        );
    });
}
/**
 * Show notification that user cannot set password for the conference
 * because server doesn't support that.
 */
function notifyPasswordNotSupported () {
    console.warn('room passwords not supported');
    messageHandler.showError("dialog.warning", "dialog.passwordNotSupported");
}
/**
 * Show notification that setting password for the conference failed.
 * @param {Error} err error
 */
function notifyPasswordFailed(err) {
    console.warn('setting password failed', err);
    messageHandler.showError("dialog.lockTitle", "dialog.lockMessage");
}
const ConferenceErrors = JitsiMeetJS.errors.conference;
/**
 * Create new RoomLocker for the conference.
 * It allows to set or remove password for the conference,
 * or ask for required password.
 * @returns {RoomLocker}
 */
export default function createRoomLocker (room) {
    let password;
    function lock (newPass) {
        return room.lock(newPass).then(function () {
            password = newPass;
        }).catch(function (err) {
            console.error(err);
            if (err === ConferenceErrors.PASSWORD_NOT_SUPPORTED) {
                notifyPasswordNotSupported();
            } else {
                notifyPasswordFailed(err);
            }
            throw err;
        });
    }
    /**
     * @class RoomLocker
     */
    return {
        get isLocked () {
            return !!password;
        },
        get password () {
            return password;
        },
        /**
         * Allows to remove password from the conference (asks user first).
         * @returns {Promise}
         */
        askToUnlock () {
            return askToUnlock().then(function () {
                return lock();
            }).then(function () {
                AnalyticsAdapter.sendEvent('toolbar.lock.disabled');
            });
        },
        /**
         * Allows to set password for the conference.
         * It asks user for new password and locks the room.
         * @returns {Promise}
         */
        askToLock () {
            return askForNewPassword().then(function (newPass) {
                return lock(newPass);
            }).then(function () {
                AnalyticsAdapter.sendEvent('toolbar.lock.enabled');
            });
        },
        /**
         * Asks user for required conference password.
         */
        requirePassword () {
            return askForPassword().then(function (newPass) {
                password = newPass;
            });
        },
        /**
         * Show notification that to set/remove password user must be moderator.
         */
        notifyModeratorRequired () {
            if (password) {
                messageHandler.openMessageDialog(null, "dialog.passwordError");
            } else {
                messageHandler.openMessageDialog(null, "dialog.passwordError2");
            }
        }
    };
}
 |