change-username.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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 Loader from 'misago/components/modal-loader'; // jshint ignore:line
  6. import ModalMessage from 'misago/components/modal-message'; // jshint ignore:line
  7. import { addNameChange } from 'misago/reducers/username-history'; // jshint ignore:line
  8. import { updateUsername } from 'misago/reducers/users'; // jshint ignore:line
  9. import ajax from 'misago/services/ajax';
  10. import snackbar from 'misago/services/snackbar';
  11. import store from 'misago/services/store';
  12. import * as validators from 'misago/utils/validators';
  13. export default class extends Form {
  14. constructor(props) {
  15. super(props);
  16. this.state = {
  17. isLoaded: false,
  18. isLoading: false,
  19. error: null,
  20. username: '',
  21. validators: {
  22. username: [
  23. validators.usernameContent()
  24. ]
  25. }
  26. };
  27. }
  28. componentDidMount() {
  29. ajax.get(this.props.profile.api_url.moderate_username).then(() => {
  30. this.setState({
  31. isLoaded: true
  32. });
  33. }, (rejection) => {
  34. this.setState({
  35. isLoaded: true,
  36. error: rejection.detail
  37. });
  38. });
  39. }
  40. clean() {
  41. if (this.isValid()) {
  42. return true;
  43. } else {
  44. snackbar.error(this.validate().username[0]);
  45. return false;
  46. }
  47. }
  48. send() {
  49. return ajax.post(this.props.profile.api_url.moderate_username, {
  50. username: this.state.username
  51. });
  52. }
  53. handleSuccess(apiResponse) {
  54. this.setState({
  55. username: ''
  56. });
  57. store.dispatch(addNameChange(
  58. apiResponse, this.props.profile, this.props.user));
  59. store.dispatch(updateUsername(
  60. this.props.profile, apiResponse.username, apiResponse.slug));
  61. snackbar.success(gettext("Username has been changed."));
  62. }
  63. getFormBody() {
  64. /* jshint ignore:start */
  65. return <form onSubmit={this.handleSubmit}>
  66. <div className="modal-body">
  67. <FormGroup label={gettext("New username")} for="id_username">
  68. <input type="text" id="id_username" className="form-control"
  69. disabled={this.state.isLoading}
  70. onChange={this.bindInput('username')}
  71. value={this.state.username} />
  72. </FormGroup>
  73. </div>
  74. <div className="modal-footer">
  75. <button
  76. className="btn btn-default"
  77. data-dismiss="modal"
  78. disabled={this.state.isLoading}
  79. type="button"
  80. >
  81. {gettext("Cancel")}
  82. </button>
  83. <Button className="btn-primary" loading={this.state.isLoading}>
  84. {gettext("Change username")}
  85. </Button>
  86. </div>
  87. </form>;
  88. /* jshint ignore:end */
  89. }
  90. getModalBody() {
  91. if (this.state.error) {
  92. /* jshint ignore:start */
  93. return <ModalMessage icon="remove_circle_outline"
  94. message={this.state.error} />;
  95. /* jshint ignore:end */
  96. } else if (this.state.isLoaded) {
  97. return this.getFormBody();
  98. } else {
  99. /* jshint ignore:start */
  100. return <Loader />;
  101. /* jshint ignore:end */
  102. }
  103. }
  104. getClassName() {
  105. if (this.state.error) {
  106. return "modal-dialog modal-message modal-rename-user";
  107. } else {
  108. return "modal-dialog modal-rename-user";
  109. }
  110. }
  111. render() {
  112. /* jshint ignore:start */
  113. return <div className={this.getClassName()}
  114. role="document">
  115. <div className="modal-content">
  116. <div className="modal-header">
  117. <button type="button" className="close" data-dismiss="modal"
  118. aria-label={gettext("Close")}>
  119. <span aria-hidden="true">&times;</span>
  120. </button>
  121. <h4 className="modal-title">{gettext("Change username")}</h4>
  122. </div>
  123. {this.getModalBody()}
  124. </div>
  125. </div>;
  126. /* jshint ignore:end */
  127. }
  128. }