CopyDropdown.jsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import Dropdown from 'react-bootstrap/es/Dropdown';
  4. import MenuItem from 'react-bootstrap/es/MenuItem';
  5. import { CopyToClipboard } from 'react-copy-to-clipboard';
  6. export default class CopyDropdown extends React.Component {
  7. constructor(props) {
  8. super(props);
  9. // retrieve xss library from window
  10. this.xss = window.xss;
  11. this.generatePageUrl = this.generatePageUrl.bind(this);
  12. }
  13. showToolTip() {
  14. const buttonId = '#copyPagePathDropdown';
  15. $(buttonId).tooltip('show');
  16. setTimeout(() => {
  17. $(buttonId).tooltip('hide');
  18. }, 1000);
  19. }
  20. generatePageUrl() {
  21. return (this.props.pageId == null)
  22. ? decodeURIComponent(window.location.pathname + window.location.search)
  23. : `${window.location.origin}/${this.props.pageId}`;
  24. }
  25. generateMarkdownLink() {
  26. return;
  27. }
  28. render() {
  29. const safePagePath = this.xss.process(this.props.pagePath);
  30. const url = this.generatePageUrl();
  31. return (
  32. <Dropdown id="copyPagePathDropdown">
  33. <Dropdown.Toggle
  34. className="btn-copy"
  35. style={this.props.buttonStyle}
  36. data-toggle="tooltip"
  37. data-placement="bottom"
  38. data-trigger="manual"
  39. title="copied!"
  40. >
  41. <i className="ti-clipboard"></i>
  42. </Dropdown.Toggle>
  43. <Dropdown.Menu>
  44. <h5 className="ml-4 my-0 text-muted">Copy to clipboard</h5>
  45. <MenuItem divider></MenuItem>
  46. {/* Page path */}
  47. <CopyToClipboard text={this.props.pagePath} onCopy={this.showToolTip}>
  48. <MenuItem>
  49. <div className="d-inline-flex flex-column">
  50. <h6 className="mt-1 mb-2"><strong>Page path</strong></h6>
  51. <span className="small">{safePagePath}</span>
  52. </div>
  53. </MenuItem>
  54. </CopyToClipboard>
  55. {/* Parmanent Link */}
  56. { this.props.pageId && (
  57. <CopyToClipboard text={url} onCopy={this.showToolTip}>
  58. <MenuItem>
  59. <div className="d-inline-flex flex-column">
  60. <h6 className="mt-1 mb-2"><strong>Parmanent link</strong></h6>
  61. <span className="small">{url}</span>
  62. </div>
  63. </MenuItem>
  64. </CopyToClipboard>
  65. )}
  66. {/* Page path + Parmanent Link */}
  67. { this.props.pageId && (
  68. <CopyToClipboard text={`${this.props.pagePath}\n${url}`} onCopy={this.showToolTip}>
  69. <MenuItem>
  70. <div className="d-inline-flex flex-column">
  71. <h6 className="mt-1 mb-2"><strong>Page path and parmanent link</strong></h6>
  72. <span className="small mb-1">{safePagePath}</span><br></br>
  73. <span className="small">{url}</span>
  74. </div>
  75. </MenuItem>
  76. </CopyToClipboard>
  77. )}
  78. {/* Markdown Link */}
  79. { this.props.pageId && (
  80. <CopyToClipboard text={`[${this.props.pagePath}](${url})`} onCopy={this.showToolTip}>
  81. <MenuItem>
  82. <div className="d-inline-flex flex-column">
  83. <h6 className="mt-1 mb-2"><strong>Markdown link</strong></h6>
  84. <span className="small">{`[${safePagePath}](${url})`}</span>
  85. </div>
  86. </MenuItem>
  87. </CopyToClipboard>
  88. )}
  89. </Dropdown.Menu>
  90. </Dropdown>
  91. );
  92. }
  93. }
  94. CopyDropdown.propTypes = {
  95. pagePath: PropTypes.string.isRequired,
  96. pageId: PropTypes.string,
  97. buttonStyle: PropTypes.object,
  98. };