root.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import React from 'react';
  2. import AvatarIndex from 'misago/components/change-avatar/index'; // jshint ignore:line
  3. import Loader from 'misago/components/modal-loader'; // jshint ignore:line
  4. import misago from 'misago/index';
  5. import { updateAvatar } from 'misago/reducers/users'; // jshint ignore:line
  6. import ajax from 'misago/services/ajax';
  7. import store from 'misago/services/store'; // jshint ignore:line
  8. export class ChangeAvatarError extends React.Component {
  9. getErrorReason() {
  10. if (this.props.reason) {
  11. /* jshint ignore:start */
  12. return <p dangerouslySetInnerHTML={{__html: this.props.reason}} />;
  13. /* jshint ignore:end */
  14. } else {
  15. return null;
  16. }
  17. }
  18. render() {
  19. /* jshint ignore:start */
  20. return <div className="modal-body">
  21. <div className="message-icon">
  22. <span className="material-icon">
  23. remove_circle_outline
  24. </span>
  25. </div>
  26. <div className="message-body">
  27. <p className="lead">
  28. {this.props.message}
  29. </p>
  30. {this.getErrorReason()}
  31. </div>
  32. </div>;
  33. /* jshint ignore:end */
  34. }
  35. }
  36. export default class extends React.Component {
  37. componentDidMount() {
  38. Promise.all([
  39. ajax.get(misago.get('user').avatar_api_url)
  40. ]).then((resolutions) => {
  41. this.setState({
  42. 'component': AvatarIndex,
  43. 'options': resolutions[0]
  44. });
  45. }, (rejection) => {
  46. this.showError(rejection);
  47. });
  48. }
  49. /* jshint ignore:start */
  50. showError = (error) => {
  51. this.setState({
  52. error
  53. });
  54. }
  55. updateAvatar = (avatarHash, options) => {
  56. store.dispatch(updateAvatar(this.props.user, avatarHash));
  57. this.setState({
  58. 'component': AvatarIndex,
  59. options
  60. });
  61. }
  62. showIndex = () => {
  63. this.setState({
  64. 'component': AvatarIndex
  65. });
  66. }
  67. /* jshint ignore:end */
  68. getBody() {
  69. if (this.state) {
  70. if (this.state.error) {
  71. /* jshint ignore:start */
  72. return <ChangeAvatarError message={this.state.error.detail}
  73. reason={this.state.error.reason} />;
  74. /* jshint ignore:end */
  75. } else {
  76. /* jshint ignore:start */
  77. return <this.state.component options={this.state.options}
  78. user={this.props.user}
  79. updateAvatar={this.updateAvatar}
  80. showIndex={this.showIndex} />;
  81. /* jshint ignore:end */
  82. }
  83. } else {
  84. /* jshint ignore:start */
  85. return <Loader />;
  86. /* jshint ignore:end */
  87. }
  88. }
  89. getClassName() {
  90. if (this.state && this.state.error) {
  91. return "modal-dialog modal-message modal-change-avatar";
  92. } else {
  93. return "modal-dialog modal-change-avatar";
  94. }
  95. }
  96. render() {
  97. /* jshint ignore:start */
  98. return <div className={this.getClassName()}
  99. role="document">
  100. <div className="modal-content">
  101. <div className="modal-header">
  102. <button type="button" className="close" data-dismiss="modal"
  103. aria-label={gettext("Close")}>
  104. <span aria-hidden="true">&times;</span>
  105. </button>
  106. <h4 className="modal-title">{gettext("Change your avatar")}</h4>
  107. </div>
  108. {this.getBody()}
  109. </div>
  110. </div>;
  111. /* jshint ignore:end */
  112. }
  113. }
  114. export function select(state) {
  115. return {
  116. 'user': state.auth.user
  117. };
  118. }