CopyDropdown.jsx 4.4 KB

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