Add Require password dialog

This commit is contained in:
Ilya Daynatovich 2016-10-21 17:57:13 +03:00
parent 38e44440d0
commit 257bb49c52
6 changed files with 136 additions and 4 deletions

View File

@ -126,4 +126,5 @@ $selectActiveItemBg: $defaultDarkColor;
$inputControlEmColor: #f29424;
//buttons
$linkFontColor: #489afe;
$linkHoverFontColor: #287ade;
$linkHoverFontColor: #287ade;
$errorColor: #c61600;

View File

@ -20,6 +20,8 @@
}
&__input {
margin-bottom: 8px;
@include transition(all .2s ease-in);
&:last-child {
margin-bottom: inherit;
@ -28,6 +30,11 @@
&::selection {
background-color: $defaultDarkSelectionColor;
}
&.error {
color: $errorColor;
border-color: $errorColor;
}
}
&__em {
@ -41,6 +48,10 @@
span {
vertical-align: middle;
}
&_error {
color: $errorColor;
}
}
&__container {

View File

@ -199,6 +199,7 @@
"passwordError2": "This conversation isn't currently protected by a password. Only the owner of the conference can set a password.",
"connectError": "Oops! Something went wrong and we couldn't connect to the conference.",
"connectErrorWithMsg": "Oops! Something went wrong and we couldn't connect to the conference: __msg__",
"incorrectPassword": "Password is incorrect",
"connecting": "Connecting",
"copy": "Copy",
"error": "Error",

View File

@ -46,6 +46,11 @@ class Invite {
}
});
this.conference.on(ConferenceEvents.CONFERENCE_JOINED, () => {
let roomLocker = this.getRoomLocker();
roomLocker.hideRequirePasswordDialog();
});
APP.UI.addListener( UIEvents.INVITE_CLICKED,
() => { this.openLinkDialog(); });

View File

@ -0,0 +1,110 @@
/* global APP */
import UIUtil from '../util/UIUtil';
/**
* Show dialog which asks for required conference password.
* @returns {Promise<string>} password or nothing if user canceled
*/
export default class RequirePasswordDialog {
constructor() {
this.titleKey = 'dialog.passwordRequired';
this.labelKey = 'dialog.passwordLabel';
this.errorKey = 'dialog.incorrectPassword';
this.errorId = 'passwordRequiredError';
this.inputId = 'passwordRequiredInput';
this.inputErrorClass = 'error';
this.isOpened = false;
}
_registerListeners() {
let el = document.getElementById(this.inputId);
el.addEventListener('keypress', this._hideError.bind(this));
}
_getBodyMessage() {
let passMsg = APP.translation.translateString("dialog.password");
let label = APP.translation.translateString(this.labelKey);
let error = APP.translation.translateString(this.errorKey);
return (
`<div class="input-control">
<label class="input-control__label"
data-i18n="${this.labelKey}">${label}</label>
<input class="input-control__input" name="lockKey" type="text"
data-i18n="[placeholder]dialog.password"
placeholder="${passMsg}" autofocus id="${this.inputId}">
<p class="input-control__hint input-control__hint_error hide"
id="${this.errorId}"
data-i18n="${this.errorKey}">${error}</p>
</div>`
);
}
askForPassword() {
if (!this.isOpened) {
return this.open();
}
return new Promise((resolve, reject) => {
this.resolve = resolve;
this.reject = reject;
this._showError();
});
}
open() {
let { titleKey } = this;
let msgString = this._getBodyMessage();
return new Promise((resolve, reject) => {
this.resolve = resolve;
this.reject = reject;
let submitFunction = this._submitFunction.bind(this);
let closeFunction = this._closeFunction.bind(this);
APP.UI.messageHandler.openTwoButtonDialog({
titleKey,
msgString,
leftButtonKey: "dialog.Ok",
submitFunction,
closeFunction,
focus: ':input:first'
});
this._registerListeners();
this.isOpened = true;
});
}
_submitFunction(e, v, m, f) {
e.preventDefault();
if (v && f.lockKey) {
this.resolve(UIUtil.escapeHtml(f.lockKey));
} else {
this.reject(APP.UI.messageHandler.CANCEL);
}
}
_closeFunction() {
this._hideError();
this.close();
}
_showError() {
let className = this.inputErrorClass;
document.getElementById(this.errorId).classList.remove('hide');
document.getElementById(this.inputId).classList.add(className);
}
_hideError() {
let className = this.inputErrorClass;
document.getElementById(this.errorId).classList.add('hide');
document.getElementById(this.inputId).classList.remove(className);
}
close() {
APP.UI.messageHandler.closeDialog();
this.isOpened = false;
}
}

View File

@ -1,5 +1,5 @@
/* global APP, JitsiMeetJS */
import askForPassword from './AskForPassword';
import RequirePasswordDialog from './RequirePasswordDialog';
/**
* Show notification that user cannot set password for the conference
@ -31,7 +31,7 @@ const ConferenceErrors = JitsiMeetJS.errors.conference;
*/
export default function createRoomLocker (room) {
let password;
let requirePasswordDialog = new RequirePasswordDialog();
/**
* If the room was locked from someone other than us, we indicate it with
* this property in order to have correct roomLocker state of isLocked.
@ -104,7 +104,7 @@ export default function createRoomLocker (room) {
* Asks user for required conference password.
*/
requirePassword () {
return askForPassword().then(
return requirePasswordDialog.askForPassword().then(
newPass => { password = newPass; }
).catch(
reason => {
@ -116,6 +116,10 @@ export default function createRoomLocker (room) {
console.error(reason);
}
);
},
hideRequirePasswordDialog() {
requirePasswordDialog.close();
}
};
}