add-participant.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import React from "react"
  2. import Form from "./form"
  3. import FormGroup from "misago/components/form-group"
  4. import * as participants from "misago/reducers/participants"
  5. import { updateAcl } from "misago/reducers/thread"
  6. import ajax from "misago/services/ajax"
  7. import modal from "misago/services/modal"
  8. import snackbar from "misago/services/snackbar"
  9. import store from "misago/services/store"
  10. export default class extends Form {
  11. constructor(props) {
  12. super(props)
  13. this.state = {
  14. isLoading: false,
  15. username: ""
  16. }
  17. }
  18. onUsernameChange = event => {
  19. this.changeValue("username", event.target.value)
  20. }
  21. clean() {
  22. if (!this.state.username.trim().length) {
  23. snackbar.error(gettext("You have to enter user name."))
  24. return false
  25. }
  26. return true
  27. }
  28. send() {
  29. return ajax.patch(this.props.thread.api.index, [
  30. { op: "add", path: "participants", value: this.state.username },
  31. { op: "add", path: "acl", value: 1 }
  32. ])
  33. }
  34. handleSuccess(data) {
  35. store.dispatch(updateAcl(data))
  36. store.dispatch(participants.replace(data.participants))
  37. snackbar.success(gettext("New participant has been added to thread."))
  38. modal.hide()
  39. }
  40. render() {
  41. return (
  42. <div className="modal-dialog modal-sm" role="document">
  43. <form onSubmit={this.handleSubmit}>
  44. <div className="modal-content">
  45. <ModalHeader />
  46. <div className="modal-body">
  47. <FormGroup for="id_username" label={gettext("User to add")}>
  48. <input
  49. id="id_username"
  50. className="form-control"
  51. disabled={this.state.isLoading}
  52. onChange={this.onUsernameChange}
  53. type="text"
  54. value={this.state.username}
  55. />
  56. </FormGroup>
  57. </div>
  58. <div className="modal-footer">
  59. <button
  60. className="btn btn-block btn-primary"
  61. disabled={this.state.isLoading}
  62. >
  63. {gettext("Add participant")}
  64. </button>
  65. <button
  66. className="btn btn-block btn-default"
  67. data-dismiss="modal"
  68. disabled={this.state.isLoading}
  69. type="button"
  70. >
  71. {gettext("Cancel")}
  72. </button>
  73. </div>
  74. </div>
  75. </form>
  76. </div>
  77. )
  78. }
  79. }
  80. export function ModalHeader(props) {
  81. return (
  82. <div className="modal-header">
  83. <button
  84. aria-label={gettext("Close")}
  85. className="close"
  86. data-dismiss="modal"
  87. type="button"
  88. >
  89. <span aria-hidden="true">&times;</span>
  90. </button>
  91. <h4 className="modal-title">{gettext("Add participant")}</h4>
  92. </div>
  93. )
  94. }