root.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import moment from 'moment';
  2. import React from 'react';
  3. import FormLoading from 'misago/components/options/change-username/form-loading'; // jshint ignore:line
  4. import FormLocked from 'misago/components/options/change-username/form-locked'; // jshint ignore:line
  5. import Form from 'misago/components/options/change-username/form'; // jshint ignore:line
  6. import UsernameHistory from 'misago/components/username-history/root'; // jshint ignore:line
  7. import misago from 'misago/index';
  8. import { hydrate, addNameChange } from 'misago/reducers/username-history'; // jshint ignore:line
  9. import { updateUsername } from 'misago/reducers/users'; // jshint ignore:line
  10. import ajax from 'misago/services/ajax';
  11. import title from 'misago/services/page-title';
  12. import snackbar from 'misago/services/snackbar'; // jshint ignore:line
  13. import store from 'misago/services/store';
  14. export default class extends React.Component {
  15. constructor(props) {
  16. super(props);
  17. this.state = {
  18. isLoaded: false,
  19. options: null
  20. };
  21. }
  22. componentDidMount() {
  23. title.set({
  24. title: gettext("Change username"),
  25. parent: gettext("Change your options")
  26. });
  27. Promise.all([
  28. ajax.get(this.props.user.api_url.username),
  29. ajax.get(misago.get('USERNAME_CHANGES_API'), {user: this.props.user.id})
  30. ]).then((data) => {
  31. store.dispatch(hydrate(data[1].results));
  32. this.setState({
  33. isLoaded: true,
  34. options: {
  35. changes_left: data[0].changes_left,
  36. length_min: data[0].length_min,
  37. length_max: data[0].length_max,
  38. next_on: data[0].next_on ? moment(data[0].next_on) : null,
  39. }
  40. });
  41. });
  42. }
  43. /* jshint ignore:start */
  44. onComplete = (username, slug, options) => {
  45. this.setState({
  46. options
  47. });
  48. store.dispatch(
  49. addNameChange({ username, slug }, this.props.user, this.props.user));
  50. store.dispatch(
  51. updateUsername(this.props.user, username, slug));
  52. snackbar.success(gettext("Your username has been changed successfully."));
  53. };
  54. /* jshint ignore:end */
  55. getChangeForm() {
  56. if (!this.state.isLoaded) {
  57. /* jshint ignore:start */
  58. return (
  59. <FormLoading />
  60. );
  61. /* jshint ignore:end */
  62. }
  63. if (this.state.options.changes_left === 0) {
  64. /* jshint ignore:start */
  65. return (
  66. <FormLocked options={this.state.options} />
  67. );
  68. /* jshint ignore:end */
  69. }
  70. /* jshint ignore:start */
  71. return (
  72. <Form
  73. complete={this.onComplete}
  74. options={this.state.options}
  75. user={this.props.user}
  76. />
  77. );
  78. /* jshint ignore:end */
  79. }
  80. render() {
  81. /* jshint ignore:start */
  82. return <div>
  83. {this.getChangeForm()}
  84. <UsernameHistory isLoaded={this.state.isLoaded}
  85. changes={this.props['username-history']} />
  86. </div>
  87. /* jshint ignore:end */
  88. }
  89. }