form.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import React from 'react'; // jshint ignore:line
  2. import Button from 'misago/components/button'; // jshint ignore:line
  3. import Form from 'misago/components/form';
  4. import FormGroup from 'misago/components/form-group'; // jshint ignore:line
  5. import ajax from 'misago/services/ajax';
  6. import snackbar from 'misago/services/snackbar';
  7. import * as validators from 'misago/utils/validators';
  8. export default class extends Form {
  9. constructor(props) {
  10. super(props);
  11. this.state = {
  12. username: '',
  13. validators: {
  14. username: [
  15. validators.usernameContent(),
  16. validators.usernameMinLength(props.options.length_min),
  17. validators.usernameMaxLength(props.options.length_max)
  18. ]
  19. },
  20. isLoading: false
  21. };
  22. }
  23. getHelpText() {
  24. let phrases = [];
  25. if (this.props.options.changes_left > 0) {
  26. let message = ngettext(
  27. "You can change your username %(changes_left)s more time.",
  28. "You can change your username %(changes_left)s more times.",
  29. this.props.options.changes_left);
  30. phrases.push(interpolate(message, {
  31. 'changes_left': this.props.options.changes_left
  32. }, true));
  33. }
  34. if (this.props.user.acl.name_changes_expire > 0) {
  35. let message = ngettext(
  36. "Used changes redeem after %(name_changes_expire)s day.",
  37. "Used changes redeem after %(name_changes_expire)s days.",
  38. this.props.user.acl.name_changes_expire);
  39. phrases.push(interpolate(message, {
  40. 'name_changes_expire': this.props.user.acl.name_changes_expire
  41. }, true));
  42. }
  43. return phrases.length ? phrases.join(' ') : null;
  44. }
  45. clean() {
  46. let errors = this.validate();
  47. if (errors.username) {
  48. snackbar.error(errors.username[0]);
  49. return false;
  50. } if (this.state.username.trim() === this.props.user.username) {
  51. snackbar.info(gettext("Your new username is same as current one."));
  52. return false;
  53. } else {
  54. return true;
  55. }
  56. }
  57. send() {
  58. return ajax.post(this.props.user.api_url.username, {
  59. 'username': this.state.username
  60. });
  61. }
  62. handleSuccess(success) {
  63. this.setState({
  64. 'username': ''
  65. });
  66. this.props.complete(success.username, success.slug, success.options);
  67. }
  68. handleError(rejection) {
  69. snackbar.apiError(rejection);
  70. }
  71. render() {
  72. /* jshint ignore:start */
  73. return <form onSubmit={this.handleSubmit} className="form-horizontal">
  74. <div className="panel panel-default panel-form">
  75. <div className="panel-heading">
  76. <h3 className="panel-title">{gettext("Change username")}</h3>
  77. </div>
  78. <div className="panel-body">
  79. <FormGroup label={gettext("New username")} for="id_username"
  80. labelClass="col-sm-4" controlClass="col-sm-8"
  81. helpText={this.getHelpText()}>
  82. <input type="text" id="id_username" className="form-control"
  83. disabled={this.state.isLoading}
  84. onChange={this.bindInput('username')}
  85. value={this.state.username} />
  86. </FormGroup>
  87. </div>
  88. <div className="panel-footer">
  89. <div className="row">
  90. <div className="col-sm-8 col-sm-offset-4">
  91. <Button className="btn-primary" loading={this.state.isLoading}>
  92. {gettext("Change username")}
  93. </Button>
  94. </div>
  95. </div>
  96. </div>
  97. </div>
  98. </form>;
  99. /* jshint ignore:end */
  100. }
  101. }