BookmarkButton.jsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. onClick={this.handleClick}
  33. className={`btn btn-bookmark border-0
  34. ${`btn-${this.props.size}`}
  35. ${pageContainer.state.isBookmarked ? 'active' : ''}`}
  36. >
  37. <i className="icon-star mr-3"></i>
  38. <span className="total-bookmarks">
  39. {pageContainer.state.sumOfBookmarks}
  40. </span>
  41. </button>
  42. );
  43. }
  44. }
  45. const BookmarkButtonWrapper = withUnstatedContainers(BookmarkButton, [PageContainer]);
  46. BookmarkButton.propTypes = {
  47. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  48. pageId: PropTypes.string,
  49. crowi: PropTypes.object.isRequired,
  50. size: PropTypes.string,
  51. };
  52. BookmarkButton.defaultProps = {
  53. size: 'md',
  54. };
  55. export default BookmarkButtonWrapper;