You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

LoginDialog.js 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. /* global $, APP, config*/
  2. var messageHandler = require('../util/MessageHandler');
  3. function getPasswordInputHtml() {
  4. let placeholder = config.hosts.authdomain
  5. ? "user identity"
  6. : "user@domain.net";
  7. let passRequiredMsg = APP.translation.translateString(
  8. "dialog.passwordRequired"
  9. );
  10. return `
  11. <h2 data-i18n="dialog.passwordRequired">${passRequiredMsg}</h2>
  12. <input name="username" type="text" placeholder=${placeholder} autofocus>
  13. <input name="password" type="password"
  14. data-i18n="[placeholder]dialog.userPassword"
  15. placeholder="user password">
  16. `;
  17. }
  18. function toJid(id) {
  19. if (id.indexOf("@") >= 0) {
  20. return id;
  21. }
  22. let jid = id.concat('@');
  23. if (config.hosts.authdomain) {
  24. jid += config.hosts.authdomain;
  25. } else {
  26. jid += config.hosts.domain;
  27. }
  28. return jid;
  29. }
  30. function cancelButton() {
  31. return {
  32. title: APP.translation.generateTranslationHTML("dialog.Cancel"),
  33. value: false
  34. };
  35. }
  36. function Dialog(successCallback, cancelCallback) {
  37. let loginButtons = [{
  38. title: APP.translation.generateTranslationHTML("dialog.Ok"),
  39. value: true
  40. }];
  41. let finishedButtons = [{
  42. title: APP.translation.translateString('dialog.retry'),
  43. value: 'retry'
  44. }];
  45. // show "cancel" button only if cancelCallback provided
  46. if (cancelCallback) {
  47. loginButtons.push(cancelButton());
  48. finishedButtons.push(cancelButton());
  49. }
  50. const states = {
  51. login: {
  52. html: getPasswordInputHtml(),
  53. buttons: loginButtons,
  54. focus: ':input:first',
  55. submit: function (e, v, m, f) {
  56. e.preventDefault();
  57. if (v) {
  58. let jid = f.username;
  59. let password = f.password;
  60. if (jid && password) {
  61. connDialog.goToState('connecting');
  62. successCallback(toJid(jid), password);
  63. }
  64. } else {
  65. // User cancelled
  66. cancelCallback();
  67. }
  68. }
  69. },
  70. connecting: {
  71. title: APP.translation.translateString('dialog.connecting'),
  72. html: '<div id="connectionStatus"></div>',
  73. buttons: [],
  74. defaultButton: 0
  75. },
  76. finished: {
  77. title: APP.translation.translateString('dialog.error'),
  78. html: '<div id="errorMessage"></div>',
  79. buttons: finishedButtons,
  80. defaultButton: 0,
  81. submit: function (e, v, m, f) {
  82. e.preventDefault();
  83. if (v === 'retry') {
  84. connDialog.goToState('login');
  85. } else {
  86. // User cancelled
  87. cancelCallback();
  88. }
  89. }
  90. }
  91. };
  92. var connDialog = messageHandler.openDialogWithStates(
  93. states, { persistent: true, closeText: '' }, null
  94. );
  95. /**
  96. * Displays error message in 'finished' state which allows either to cancel
  97. * or retry.
  98. * @param message the final message to be displayed.
  99. */
  100. this.displayError = function (message) {
  101. var finishedState = connDialog.getState('finished');
  102. var errorMessageElem = finishedState.find('#errorMessage');
  103. errorMessageElem.text(message);
  104. connDialog.goToState('finished');
  105. };
  106. /**
  107. * Closes LoginDialog.
  108. */
  109. this.close = function () {
  110. connDialog.close();
  111. };
  112. }
  113. const LoginDialog = {
  114. showAuthDialog: function (successCallback, cancelCallback) {
  115. return new Dialog(successCallback, cancelCallback);
  116. },
  117. showExternalAuthDialog: function (url, callback) {
  118. var dialog = messageHandler.openCenteredPopup(
  119. url, 910, 660,
  120. // On closed
  121. callback
  122. );
  123. if (!dialog) {
  124. messageHandler.openMessageDialog(null, "dialog.popupError");
  125. }
  126. return dialog;
  127. },
  128. showAuthRequiredDialog: function (roomName, onAuthNow) {
  129. var title = APP.translation.generateTranslationHTML(
  130. "dialog.WaitingForHost"
  131. );
  132. var msg = APP.translation.generateTranslationHTML(
  133. "dialog.WaitForHostMsg", {room: roomName}
  134. );
  135. var buttonTxt = APP.translation.generateTranslationHTML(
  136. "dialog.IamHost"
  137. );
  138. var buttons = [{title: buttonTxt, value: "authNow"}];
  139. return APP.UI.messageHandler.openDialog(
  140. title,
  141. msg,
  142. true,
  143. buttons,
  144. function (e, submitValue) {
  145. // Do not close the dialog yet
  146. e.preventDefault();
  147. // Open login popup
  148. if (submitValue === 'authNow') {
  149. onAuthNow();
  150. }
  151. }
  152. );
  153. }
  154. };
  155. export default LoginDialog;