CopyDropdown.jsx 4.3 KB

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