BookmarkButton.jsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { UncontrolledTooltip } from 'reactstrap';
  4. import { useTranslation } from 'react-i18next';
  5. import { withUnstatedContainers } from './UnstatedUtils';
  6. import AppContainer from '~/client/services/AppContainer';
  7. class LegacyBookmarkButton extends React.Component {
  8. constructor(props) {
  9. super(props);
  10. this.handleClick = this.handleClick.bind(this);
  11. }
  12. async handleClick() {
  13. if (this.props.onBookMarkClicked == null) {
  14. return;
  15. }
  16. this.props.onBookMarkClicked();
  17. }
  18. render() {
  19. const {
  20. appContainer, t, isBookmarked, hideTotalNumber, sumOfBookmarks,
  21. } = this.props;
  22. const { isGuestUser } = appContainer;
  23. return (
  24. <>
  25. <button
  26. type="button"
  27. id="bookmark-button"
  28. onClick={this.handleClick}
  29. className={`btn btn-bookmark border-0
  30. ${`btn-${this.props.size}`} ${isBookmarked ? 'active' : ''} ${isGuestUser ? 'disabled' : ''}`}
  31. >
  32. <i className="icon-star"></i>
  33. { !hideTotalNumber && (
  34. <span className="total-bookmarks ml-3">
  35. {sumOfBookmarks && (
  36. sumOfBookmarks
  37. )}
  38. </span>
  39. ) }
  40. </button>
  41. {isGuestUser && (
  42. <UncontrolledTooltip placement="top" target="bookmark-button" fade={false}>
  43. {t('Not available for guest')}
  44. </UncontrolledTooltip>
  45. )}
  46. </>
  47. );
  48. }
  49. }
  50. /**
  51. * Wrapper component for using unstated
  52. */
  53. const LegacyBookmarkButtonWrapper = withUnstatedContainers(LegacyBookmarkButton, [AppContainer]);
  54. LegacyBookmarkButton.propTypes = {
  55. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  56. isBookmarked: PropTypes.bool.isRequired,
  57. hideTotalNumber: PropTypes.bool,
  58. sumOfBookmarks: PropTypes.number,
  59. t: PropTypes.func.isRequired,
  60. size: PropTypes.string,
  61. onBookMarkClicked: PropTypes.func,
  62. };
  63. LegacyBookmarkButton.defaultProps = {
  64. size: 'md',
  65. };
  66. // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
  67. const BookmarkButton = (props) => {
  68. const { t } = useTranslation();
  69. return <LegacyBookmarkButtonWrapper t={t} {...props}></LegacyBookmarkButtonWrapper>;
  70. };
  71. export default BookmarkButton;