SlackNotification.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. updateState(value) {
  28. this.setState({slackChannels: value});
  29. this.props.onChannelChange(value);
  30. }
  31. updateStateCheckbox(event) {
  32. const value = event.target.checked;
  33. this.setState({isSlackEnabled: value});
  34. this.props.onSlackOnChange(value);
  35. }
  36. render() {
  37. const formNameSlackOn = this.props.formName && this.props.formName + '[notify][slack][on]';
  38. const formNameChannels = this.props.formName && this.props.formName + '[notify][slack][channel]';
  39. return (
  40. <div className="input-group input-group-sm input-group-slack extended-setting">
  41. <label className="input-group-addon">
  42. <img id="slack-mark-white" src="/images/icons/slack/mark-monochrome_white.svg" width="18" height="18"/>
  43. <img id="slack-mark-black" src="/images/icons/slack/mark-monochrome_black.svg" width="18" height="18"/>
  44. <input type="checkbox" name={formNameSlackOn} value="1" checked={this.state.isSlackEnabled} onChange={this.updateStateCheckbox}/>
  45. </label>
  46. <input className="form-control" type="text" name={formNameChannels} value={this.state.slackChannels} placeholder="slack channel name"
  47. data-toggle="popover"
  48. title="Slack通知"
  49. data-content="通知するにはチェックを入れてください。カンマ区切りで複数チャンネルに通知することができます。"
  50. data-trigger="focus"
  51. data-placement="top"
  52. onChange={e => this.updateState(e.target.value)}
  53. />
  54. </div>
  55. );
  56. }
  57. }
  58. SlackNotification.propTypes = {
  59. crowi: PropTypes.object.isRequired,
  60. pageId: PropTypes.string,
  61. pagePath: PropTypes.string,
  62. onChannelChange: PropTypes.func,
  63. onSlackOnChange: PropTypes.func,
  64. isSlackEnabled: PropTypes.bool,
  65. slackChannels: PropTypes.string,
  66. formName: PropTypes.string,
  67. };
  68. SlackNotification.defaultProps = {
  69. slackChannels: '',
  70. };