BookmarkButton.jsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { UncontrolledTooltip } from 'reactstrap';
  4. import { withTranslation } from 'react-i18next';
  5. import { withUnstatedContainers } from './UnstatedUtils';
  6. import { toastError } from '../util/apiNotification';
  7. import PageContainer from '../services/PageContainer';
  8. import AppContainer from '../services/AppContainer';
  9. import NavigationContainer from '../services/NavigationContainer';
  10. class BookmarkButton extends React.Component {
  11. constructor(props) {
  12. super(props);
  13. this.handleClick = this.handleClick.bind(this);
  14. }
  15. async handleClick() {
  16. const { pageContainer } = this.props;
  17. const isGuestUser = pageContainer.state.isGuestUser;
  18. if (isGuestUser) {
  19. return;
  20. }
  21. try {
  22. pageContainer.toggleBookmark();
  23. }
  24. catch (err) {
  25. toastError(err);
  26. }
  27. }
  28. render() {
  29. const {
  30. appContainer, pageContainer, navigationContainer, t,
  31. } = this.props;
  32. const { isGuestUser } = appContainer;
  33. const { editorMode } = navigationContainer.state;
  34. const isViewMode = editorMode === 'view';
  35. return (
  36. <div>
  37. {isViewMode
  38. && (
  39. <button
  40. type="button"
  41. id="bookmark-button"
  42. onClick={this.handleClick}
  43. className={`btn btn-bookmark border-0
  44. ${`btn-${this.props.size}`} ${pageContainer.state.isBookmarked ? 'active' : ''} ${isGuestUser ? 'disabled' : ''}`}
  45. >
  46. <i className="icon-star mr-3"></i>
  47. <span className="total-bookmarks">
  48. {pageContainer.state.sumOfBookmarks}
  49. </span>
  50. </button>
  51. )}
  52. {isGuestUser && (
  53. <UncontrolledTooltip placement="top" target="bookmark-button" fade={false}>
  54. {t('Not available for guest')}
  55. </UncontrolledTooltip>
  56. )}
  57. </div>
  58. );
  59. }
  60. }
  61. /**
  62. * Wrapper component for using unstated
  63. */
  64. const BookmarkButtonWrapper = withUnstatedContainers(BookmarkButton, [AppContainer, NavigationContainer, PageContainer]);
  65. BookmarkButton.propTypes = {
  66. appContainer: PropTypes.instanceOf(PageContainer).isRequired,
  67. navigationContainer: PropTypes.instanceOf(NavigationContainer).isRequired,
  68. pageContainer: PropTypes.instanceOf(AppContainer).isRequired,
  69. pageId: PropTypes.string,
  70. t: PropTypes.func.isRequired,
  71. size: PropTypes.string,
  72. };
  73. BookmarkButton.defaultProps = {
  74. size: 'md',
  75. };
  76. export default withTranslation()(BookmarkButtonWrapper);