avatar-controls.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. import React from "react"
  2. import Button from "misago/components/button"
  3. import Form from "misago/components/form"
  4. import FormGroup from "misago/components/form-group"
  5. import Loader from "misago/components/modal-loader"
  6. import YesNoSwitch from "misago/components/yes-no-switch"
  7. import ModalMessage from "misago/components/modal-message"
  8. import { updateAvatar } from "misago/reducers/users"
  9. import ajax from "misago/services/ajax"
  10. import snackbar from "misago/services/snackbar"
  11. import store from "misago/services/store"
  12. export default class extends Form {
  13. constructor(props) {
  14. super(props)
  15. this.state = {
  16. isLoaded: false,
  17. isLoading: false,
  18. error: null,
  19. is_avatar_locked: "",
  20. avatar_lock_user_message: "",
  21. avatar_lock_staff_message: ""
  22. }
  23. }
  24. componentDidMount() {
  25. ajax.get(this.props.profile.api.moderate_avatar).then(
  26. options => {
  27. this.setState({
  28. isLoaded: true,
  29. is_avatar_locked: options.is_avatar_locked,
  30. avatar_lock_user_message: options.avatar_lock_user_message || "",
  31. avatar_lock_staff_message: options.avatar_lock_staff_message || ""
  32. })
  33. },
  34. rejection => {
  35. this.setState({
  36. isLoaded: true,
  37. error: rejection.detail
  38. })
  39. }
  40. )
  41. }
  42. clean() {
  43. if (this.isValid()) {
  44. return true
  45. } else {
  46. snackbar.error(this.validate().username[0])
  47. return false
  48. }
  49. }
  50. send() {
  51. return ajax.post(this.props.profile.api.moderate_avatar, {
  52. is_avatar_locked: this.state.is_avatar_locked,
  53. avatar_lock_user_message: this.state.avatar_lock_user_message,
  54. avatar_lock_staff_message: this.state.avatar_lock_staff_message
  55. })
  56. }
  57. handleSuccess(apiResponse) {
  58. store.dispatch(updateAvatar(this.props.profile, apiResponse.avatar_hash))
  59. snackbar.success(gettext("Avatar controls have been changed."))
  60. }
  61. getFormBody() {
  62. return (
  63. <form onSubmit={this.handleSubmit}>
  64. <div className="modal-body">
  65. <FormGroup
  66. label={gettext("Lock avatar")}
  67. helpText={gettext(
  68. "Locking user avatar will prohibit user from changing his avatar and will reset his/her avatar to default one."
  69. )}
  70. for="id_is_avatar_locked"
  71. >
  72. <YesNoSwitch
  73. id="id_is_avatar_locked"
  74. disabled={this.state.isLoading}
  75. iconOn="lock_outline"
  76. iconOff="lock_open"
  77. labelOn={gettext("Disallow user from changing avatar")}
  78. labelOff={gettext("Allow user to change avatar")}
  79. onChange={this.bindInput("is_avatar_locked")}
  80. value={this.state.is_avatar_locked}
  81. />
  82. </FormGroup>
  83. <FormGroup
  84. label={gettext("User message")}
  85. helpText={gettext(
  86. "Optional message for user explaining why he/she is prohibited form changing avatar."
  87. )}
  88. for="id_avatar_lock_user_message"
  89. >
  90. <textarea
  91. id="id_avatar_lock_user_message"
  92. className="form-control"
  93. rows="4"
  94. disabled={this.state.isLoading}
  95. onChange={this.bindInput("avatar_lock_user_message")}
  96. value={this.state.avatar_lock_user_message}
  97. />
  98. </FormGroup>
  99. <FormGroup
  100. label={gettext("Staff message")}
  101. helpText={gettext(
  102. "Optional message for forum team members explaining why user is prohibited form changing avatar."
  103. )}
  104. for="id_avatar_lock_staff_message"
  105. >
  106. <textarea
  107. id="id_avatar_lock_staff_message"
  108. className="form-control"
  109. rows="4"
  110. disabled={this.state.isLoading}
  111. onChange={this.bindInput("avatar_lock_staff_message")}
  112. value={this.state.avatar_lock_staff_message}
  113. />
  114. </FormGroup>
  115. </div>
  116. <div className="modal-footer">
  117. <button
  118. type="button"
  119. className="btn btn-default"
  120. data-dismiss="modal"
  121. >
  122. {gettext("Close")}
  123. </button>
  124. <Button className="btn-primary" loading={this.state.isLoading}>
  125. {gettext("Save changes")}
  126. </Button>
  127. </div>
  128. </form>
  129. )
  130. }
  131. getModalBody() {
  132. if (this.state.error) {
  133. return (
  134. <ModalMessage icon="remove_circle_outline" message={this.state.error} />
  135. )
  136. } else if (this.state.isLoaded) {
  137. return this.getFormBody()
  138. } else {
  139. return <Loader />
  140. }
  141. }
  142. getClassName() {
  143. if (this.state.error) {
  144. return "modal-dialog modal-message modal-avatar-controls"
  145. } else {
  146. return "modal-dialog modal-avatar-controls"
  147. }
  148. }
  149. render() {
  150. return (
  151. <div className={this.getClassName()} role="document">
  152. <div className="modal-content">
  153. <div className="modal-header">
  154. <button
  155. type="button"
  156. className="close"
  157. data-dismiss="modal"
  158. aria-label={gettext("Close")}
  159. >
  160. <span aria-hidden="true">&times;</span>
  161. </button>
  162. <h4 className="modal-title">{gettext("Avatar controls")}</h4>
  163. </div>
  164. {this.getModalBody()}
  165. </div>
  166. </div>
  167. )
  168. }
  169. }