BookmarkButton.jsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { toastError } from '../util/apiNotification';
  4. import { withUnstatedContainers } from './UnstatedUtils';
  5. import PageContainer from '../services/PageContainer';
  6. class BookmarkButton extends React.Component {
  7. constructor(props) {
  8. super(props);
  9. this.handleClick = this.handleClick.bind(this);
  10. }
  11. async handleClick() {
  12. const { pageContainer } = this.props;
  13. try {
  14. pageContainer.toggleBookmark();
  15. }
  16. catch (err) {
  17. toastError(err);
  18. }
  19. }
  20. render() {
  21. const { pageContainer } = this.props;
  22. const isUserLoggedIn = this.props.crowi.currentUserId != null;
  23. return (
  24. <button
  25. type="button"
  26. href="#"
  27. title="Bookmark"
  28. onClick={this.handleClick}
  29. className={`btn btn-bookmark border-0
  30. ${`btn-${this.props.size}`}
  31. ${pageContainer.state.isBookmarked ? 'active' : ''}`}
  32. disabled={!isUserLoggedIn}
  33. >
  34. <i className="icon-star mr-3"></i>
  35. <span className="total-bookmarks">
  36. {pageContainer.state.sumOfBookmarks}
  37. </span>
  38. </button>
  39. );
  40. }
  41. }
  42. const BookmarkButtonWrapper = withUnstatedContainers(BookmarkButton, [PageContainer]);
  43. BookmarkButton.propTypes = {
  44. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  45. pageId: PropTypes.string,
  46. crowi: PropTypes.object.isRequired,
  47. size: PropTypes.string,
  48. };
  49. BookmarkButton.defaultProps = {
  50. size: 'md',
  51. };
  52. export default BookmarkButtonWrapper;