CopyButton.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import ClipboardButton from 'react-clipboard.js';
  4. export default class CopyButton extends React.Component {
  5. constructor(props) {
  6. super(props);
  7. this.showToolTip = this.showToolTip.bind(this);
  8. // retrieve xss library from window
  9. this.xss = window.xss;
  10. }
  11. showToolTip() {
  12. const buttonId = `#${this.props.buttonId}`;
  13. $(buttonId).tooltip('show');
  14. setTimeout(() => {
  15. $(buttonId).tooltip('hide');
  16. }, 1000);
  17. }
  18. render() {
  19. const containerStyle = {
  20. lineHeight: 0,
  21. };
  22. const style = Object.assign({
  23. padding: '0 2px',
  24. verticalAlign: 'text-top',
  25. }, this.props.buttonStyle);
  26. const text = this.xss.process(this.props.text);
  27. return (
  28. <span className="btn-copy-container" style={containerStyle}>
  29. <ClipboardButton
  30. className={this.props.buttonClassName}
  31. button-id={this.props.buttonId}
  32. button-data-toggle="tooltip"
  33. button-data-container="body"
  34. button-title="copied!"
  35. button-data-placement="bottom"
  36. button-data-trigger="manual"
  37. button-style={style}
  38. data-clipboard-text={text}
  39. onSuccess={this.showToolTip}
  40. >
  41. <i className={this.props.iconClassName} />
  42. </ClipboardButton>
  43. </span>
  44. );
  45. }
  46. }
  47. CopyButton.propTypes = {
  48. text: PropTypes.string.isRequired,
  49. buttonId: PropTypes.string.isRequired,
  50. buttonClassName: PropTypes.string.isRequired,
  51. buttonStyle: PropTypes.object,
  52. iconClassName: PropTypes.string.isRequired,
  53. };
  54. CopyButton.defaultProps = {
  55. buttonStyle: {},
  56. };