BookmarkButton.jsx 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. isUserLoggedIn() {
  21. return this.props.crowi.currentUserId != null;
  22. }
  23. render() {
  24. const { pageContainer } = this.props;
  25. // if guest user
  26. if (!this.isUserLoggedIn()) {
  27. return <div></div>;
  28. }
  29. return (
  30. <button
  31. type="button"
  32. href="#"
  33. title="Bookmark"
  34. onClick={this.handleClick}
  35. className={`btn btn-bookmark border-0
  36. ${`btn-${this.props.size}`}
  37. ${pageContainer.state.isBookmarked ? 'active' : ''}`}
  38. >
  39. <i className="icon-star mr-3"></i>
  40. <span className="total-bookmarks">
  41. {pageContainer.state.sumOfBookmarks}
  42. </span>
  43. </button>
  44. );
  45. }
  46. }
  47. const BookmarkButtonWrapper = withUnstatedContainers(BookmarkButton, [PageContainer]);
  48. BookmarkButton.propTypes = {
  49. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  50. pageId: PropTypes.string,
  51. crowi: PropTypes.object.isRequired,
  52. size: PropTypes.string,
  53. };
  54. BookmarkButton.defaultProps = {
  55. size: 'md',
  56. };
  57. export default BookmarkButtonWrapper;