SlackNotification.jsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. /**
  4. *
  5. * @author Yuki Takei <yuki@weseek.co.jp>
  6. *
  7. * @export
  8. * @class SlackNotification
  9. * @extends {React.Component}
  10. */
  11. export default class SlackNotification extends React.Component {
  12. constructor(props) {
  13. super(props);
  14. this.state = {
  15. isSlackEnabled: this.props.isSlackEnabled,
  16. slackChannels: this.props.slackChannels,
  17. };
  18. this.updateState = this.updateState.bind(this);
  19. this.updateStateCheckbox = this.updateStateCheckbox.bind(this);
  20. }
  21. componentWillReceiveProps(nextProps) {
  22. this.setState({
  23. isSlackEnabled: nextProps.isSlackEnabled,
  24. slackChannels: nextProps.slackChannels,
  25. });
  26. }
  27. getCurrentOptionsToSave() {
  28. return Object.assign({}, this.state);
  29. }
  30. updateState(value) {
  31. this.setState({ slackChannels: value });
  32. // dispatch event
  33. if (this.props.onChannelChange != null) {
  34. this.props.onChannelChange(value);
  35. }
  36. }
  37. updateStateCheckbox(event) {
  38. const value = event.target.checked;
  39. this.setState({ isSlackEnabled: value });
  40. // dispatch event
  41. if (this.props.onEnabledFlagChange != null) {
  42. this.props.onEnabledFlagChange(value);
  43. }
  44. }
  45. render() {
  46. return (
  47. <div className="input-group input-group-sm input-group-slack extended-setting">
  48. <label className="input-group-addon">
  49. <img id="slack-mark-white" src="/images/icons/slack/mark-monochrome_white.svg" width="18" height="18" />
  50. <img id="slack-mark-black" src="/images/icons/slack/mark-monochrome_black.svg" width="18" height="18" />
  51. <input type="checkbox" value="1" checked={this.state.isSlackEnabled} onChange={this.updateStateCheckbox} />
  52. </label>
  53. <input
  54. className="form-control"
  55. type="text"
  56. value={this.state.slackChannels}
  57. placeholder="slack channel name"
  58. data-toggle="popover"
  59. title="Slack通知"
  60. data-content="通知するにはチェックを入れてください。カンマ区切りで複数チャンネルに通知することができます。"
  61. data-trigger="focus"
  62. data-placement="top"
  63. onChange={(e) => { return this.updateState(e.target.value) }}
  64. />
  65. </div>
  66. );
  67. }
  68. }
  69. SlackNotification.propTypes = {
  70. crowi: PropTypes.object.isRequired,
  71. pageId: PropTypes.string,
  72. pagePath: PropTypes.string,
  73. isSlackEnabled: PropTypes.bool,
  74. slackChannels: PropTypes.string,
  75. onChannelChange: PropTypes.func,
  76. onEnabledFlagChange: PropTypes.func,
  77. };
  78. SlackNotification.defaultProps = {
  79. slackChannels: '',
  80. };