BookmarkButton.jsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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 '~/client/util/apiNotification';
  7. import { apiv3Put } from '~/client/util/apiv3-client';
  8. import AppContainer from '~/client/services/AppContainer';
  9. class LegacyBookmarkButton extends React.Component {
  10. constructor(props) {
  11. super(props);
  12. this.handleClick = this.handleClick.bind(this);
  13. }
  14. async handleClick() {
  15. if (this.props.onBookMarkClicked == null) {
  16. return;
  17. }
  18. this.props.onBookMarkClicked();
  19. }
  20. render() {
  21. const {
  22. appContainer, t, isBookmarked, sumOfBookmarks,
  23. } = this.props;
  24. const { isGuestUser } = appContainer;
  25. return (
  26. <div>
  27. <button
  28. type="button"
  29. id="bookmark-button"
  30. onClick={this.handleClick}
  31. className={`btn btn-bookmark border-0
  32. ${`btn-${this.props.size}`} ${isBookmarked ? 'active' : ''} ${isGuestUser ? 'disabled' : ''}`}
  33. >
  34. <i className="icon-star mr-3"></i>
  35. <span className="total-bookmarks">
  36. {sumOfBookmarks && (
  37. sumOfBookmarks
  38. )}
  39. </span>
  40. </button>
  41. {isGuestUser && (
  42. <UncontrolledTooltip placement="top" target="bookmark-button" fade={false}>
  43. {t('Not available for guest')}
  44. </UncontrolledTooltip>
  45. )}
  46. </div>
  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. sumOfBookmarks: PropTypes.number,
  58. t: PropTypes.func.isRequired,
  59. size: PropTypes.string,
  60. onBookMarkClicked: PropTypes.func,
  61. };
  62. LegacyBookmarkButton.defaultProps = {
  63. size: 'md',
  64. };
  65. const BookmarkButton = (props) => {
  66. return <LegacyBookmarkButtonWrapper {...props}></LegacyBookmarkButtonWrapper>;
  67. };
  68. export default withTranslation()(BookmarkButton);