reset-password-form.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import React from 'react'; // jshint ignore:line
  2. import ReactDOM from 'react-dom'; // jshint ignore:line
  3. import misago from 'misago/index';
  4. import Button from 'misago/components/button'; // jshint ignore:line
  5. import Form from 'misago/components/form';
  6. import SignInModal from 'misago/components/sign-in.js';
  7. import ajax from 'misago/services/ajax';
  8. import auth from 'misago/services/auth'; // jshint ignore:line
  9. import modal from 'misago/services/modal';
  10. import snackbar from 'misago/services/snackbar';
  11. import showBannedPage from 'misago/utils/banned-page';
  12. export class ResetPasswordForm extends Form {
  13. constructor(props) {
  14. super(props);
  15. this.state = {
  16. 'isLoading': false,
  17. 'password': ''
  18. };
  19. }
  20. clean() {
  21. if (this.state.password.trim().length) {
  22. return true;
  23. } else {
  24. snackbar.error(gettext("Enter new password."));
  25. return false;
  26. }
  27. }
  28. send() {
  29. return ajax.post(misago.get('CHANGE_PASSWORD_API'), {
  30. 'password': this.state.password
  31. });
  32. }
  33. handleSuccess(apiResponse) {
  34. this.props.callback(apiResponse);
  35. }
  36. handleError(rejection) {
  37. if (rejection.status === 403 && rejection.ban) {
  38. showBannedPage(rejection.ban);
  39. } else {
  40. snackbar.apiError(rejection);
  41. }
  42. }
  43. render() {
  44. /* jshint ignore:start */
  45. return <div className="well well-form well-form-reset-password">
  46. <form onSubmit={this.handleSubmit}>
  47. <div className="form-group">
  48. <div className="control-input">
  49. <input type="password" className="form-control"
  50. placeholder={gettext("Enter new password")}
  51. disabled={this.state.isLoading}
  52. onChange={this.bindInput('password')}
  53. value={this.state.password} />
  54. </div>
  55. </div>
  56. <Button className="btn-primary btn-block"
  57. loading={this.state.isLoading}>
  58. {gettext("Change password")}
  59. </Button>
  60. </form>
  61. </div>;
  62. /* jshint ignore:end */
  63. }
  64. }
  65. export class PasswordChangedPage extends React.Component {
  66. getMessage() {
  67. return interpolate(gettext("%(username)s, your password has been changed successfully."), {
  68. username: this.props.user.username
  69. }, true);
  70. }
  71. showSignIn() {
  72. modal.show(SignInModal);
  73. }
  74. render() {
  75. /* jshint ignore:start */
  76. return <div className="page page-message page-message-success page-forgotten-password-changed">
  77. <div className="container">
  78. <div className="message-panel">
  79. <div className="message-icon">
  80. <span className="material-icon">
  81. check
  82. </span>
  83. </div>
  84. <div className="message-body">
  85. <p className="lead">
  86. {this.getMessage()}
  87. </p>
  88. <p>
  89. {gettext("You will have to sign in using new password before continuing.")}
  90. </p>
  91. <p>
  92. <button type="button" className="btn btn-primary" onClick={this.showSignIn}>
  93. {gettext("Sign in")}
  94. </button>
  95. </p>
  96. </div>
  97. </div>
  98. </div>
  99. </div>;
  100. /* jshint ignore:end */
  101. }
  102. }
  103. export default class extends React.Component {
  104. /* jshint ignore:start */
  105. complete = (apiResponse) => {
  106. auth.softSignOut();
  107. // nuke "redirect_to" field so we don't end
  108. // coming back to error page after sign in
  109. $('#hidden-login-form input[name="redirect_to"]').remove();
  110. ReactDOM.render(
  111. <PasswordChangedPage user={apiResponse} />,
  112. document.getElementById('page-mount')
  113. );
  114. };
  115. /* jshint ignore:end */
  116. render() {
  117. /* jshint ignore:start */
  118. return <ResetPasswordForm callback={this.complete} />;
  119. /* jshint ignore:end */
  120. }
  121. }