add-participant.js 2.8 KB

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