signin.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. (function (Misago) {
  2. 'use strict';
  3. function persistent(el, isInit, context) {
  4. context.retain = true;
  5. }
  6. var signin = {
  7. controller: function() {
  8. return {
  9. busy: m.prop(false),
  10. showActivation: m.prop(false),
  11. username: m.prop(''),
  12. password: m.prop(''),
  13. validation: {
  14. 'username': [Misago.validators.required()],
  15. 'password': [Misago.validators.required()]
  16. }
  17. };
  18. },
  19. submit: function(ctrl, _) {
  20. if (ctrl.busy()) {
  21. return false;
  22. }
  23. if (_.validate(ctrl).length) {
  24. _.alert.error(gettext("Fill out both fields."));
  25. return false;
  26. }
  27. m.startComputation();
  28. ctrl.busy(true);
  29. m.endComputation();
  30. var credentials = {
  31. username: ctrl.username(),
  32. password: ctrl.password()
  33. };
  34. var self = this;
  35. _.api.endpoint('auth').post(credentials).then(
  36. function() {
  37. self.success(credentials, _);
  38. },
  39. function(error) {
  40. self.error(ctrl, error, _);
  41. }).then(function() {
  42. m.startComputation();
  43. ctrl.busy(false);
  44. m.endComputation();
  45. });
  46. return false;
  47. },
  48. success: function(credentials, _) {
  49. var $form = $('#hidden-login-form');
  50. // refresh CSRF token because parent api call changed it
  51. _.ajax.refreshCsrfToken();
  52. // fill out form with user credentials and submit it, this will tell
  53. // misago to redirect user back to right page, and will trigger browser's
  54. // key ring feature
  55. $form.find('input[name=csrf_token]').val(_.ajax.csrfToken);
  56. $form.find('input[name=redirect_to]').val(window.location.href);
  57. $form.find('input[name=username]').val(credentials.username);
  58. $form.find('input[name=password]').val(credentials.password);
  59. $form.submit();
  60. },
  61. error: function(ctrl, rejection, _) {
  62. if (rejection.status === 400) {
  63. if (rejection.code === 'inactive_admin') {
  64. _.alert.info(rejection.detail);
  65. } else if (rejection.code === 'inactive_user') {
  66. _.alert.info(rejection.detail);
  67. ctrl.showActivation(true);
  68. } else if (rejection.code === 'banned') {
  69. // handle ban!
  70. } else {
  71. _.alert.error(rejection.detail);
  72. }
  73. } else {
  74. _.api.alert(rejection);
  75. }
  76. },
  77. view: function(ctrl, _) {
  78. return m('.modal-dialog.modal-sm.modal-signin[role="document"]',
  79. {config: persistent},
  80. m('.modal-content', [
  81. _.component('modal:header', gettext('Sign in')),
  82. m('form', {onsubmit: this.submit.bind(this, ctrl, _)}, [
  83. m('.modal-body', [
  84. m('.form-group',
  85. m('.control-input',
  86. Misago.input({
  87. disabled: ctrl.busy(),
  88. value: ctrl.username,
  89. placeholder: gettext("Username or e-mail")
  90. })
  91. )
  92. ),
  93. m('.form-group',
  94. m('.control-input',
  95. Misago.input({
  96. type: 'password',
  97. disabled: ctrl.busy(),
  98. value: ctrl.password,
  99. placeholder: gettext("Password")
  100. })
  101. )
  102. )
  103. ]),
  104. m('.modal-footer',
  105. _.component('button', {
  106. class: '.btn-primary.btn-block',
  107. submit: true,
  108. loading: ctrl.busy(),
  109. label: gettext('Sign in')
  110. })
  111. )
  112. ])
  113. ])
  114. );
  115. }
  116. };
  117. Misago.addService('modal:sign-in', {
  118. factory: function(_) {
  119. _.modal('sign-in', signin);
  120. },
  121. after: 'modals'
  122. });
  123. }(Misago.prototype));