change-email.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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 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. new_email: "",
  13. password: "",
  14. validators: {
  15. new_email: [validators.email()],
  16. password: []
  17. },
  18. isLoading: false
  19. }
  20. }
  21. clean() {
  22. let errors = this.validate()
  23. let lengths = [
  24. this.state.new_email.trim().length,
  25. this.state.password.trim().length
  26. ]
  27. if (lengths.indexOf(0) !== -1) {
  28. snackbar.error(gettext("Fill out all fields."))
  29. return false
  30. }
  31. if (errors.new_email) {
  32. snackbar.error(errors.new_email[0])
  33. return false
  34. }
  35. return true
  36. }
  37. send() {
  38. return ajax.post(this.props.user.api.change_email, {
  39. new_email: this.state.new_email,
  40. password: this.state.password
  41. })
  42. }
  43. handleSuccess(response) {
  44. this.setState({
  45. new_email: "",
  46. password: ""
  47. })
  48. snackbar.success(response.detail)
  49. }
  50. handleError(rejection) {
  51. if (rejection.status === 400) {
  52. if (rejection.new_email) {
  53. snackbar.error(rejection.new_email)
  54. } else {
  55. snackbar.error(rejection.password)
  56. }
  57. } else {
  58. snackbar.apiError(rejection)
  59. }
  60. }
  61. render() {
  62. return (
  63. <form onSubmit={this.handleSubmit}>
  64. <input type="type" style={{ display: "none" }} />
  65. <input type="password" style={{ display: "none" }} />
  66. <div className="panel panel-default panel-form">
  67. <div className="panel-heading">
  68. <h3 className="panel-title">{gettext("Change e-mail address")}</h3>
  69. </div>
  70. <div className="panel-body">
  71. <FormGroup label={gettext("New e-mail")} for="id_new_email">
  72. <input
  73. type="text"
  74. id="id_new_email"
  75. className="form-control"
  76. disabled={this.state.isLoading}
  77. onChange={this.bindInput("new_email")}
  78. value={this.state.new_email}
  79. />
  80. </FormGroup>
  81. <hr />
  82. <FormGroup
  83. label={gettext("Your current password")}
  84. for="id_confirm_email"
  85. >
  86. <input
  87. type="password"
  88. id="id_confirm_email"
  89. className="form-control"
  90. disabled={this.state.isLoading}
  91. onChange={this.bindInput("password")}
  92. value={this.state.password}
  93. />
  94. </FormGroup>
  95. </div>
  96. <div className="panel-footer">
  97. <Button className="btn-primary" loading={this.state.isLoading}>
  98. {gettext("Change e-mail")}
  99. </Button>
  100. </div>
  101. </div>
  102. </form>
  103. )
  104. }
  105. }