LikeButton.jsx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { toastError } from '../util/apiNotification';
  4. import { withUnstatedContainers } from './UnstatedUtils';
  5. import AppContainer from '../services/AppContainer';
  6. import PageContainer from '../services/PageContainer';
  7. class LikeButton extends React.Component {
  8. constructor(props) {
  9. super(props);
  10. this.handleClick = this.handleClick.bind(this);
  11. }
  12. async handleClick() {
  13. const { appContainer, pageContainer } = this.props;
  14. const pageId = pageContainer.state.pageId;
  15. const bool = !pageContainer.state.isLiked;
  16. try {
  17. await appContainer.apiv3.put('/page/likes', { pageId, bool });
  18. if (pageContainer.state.isLiked) {
  19. pageContainer.setState({ sumOfLikers: pageContainer.state.sumOfLikers - 1 });
  20. }
  21. else {
  22. pageContainer.setState({ sumOfLikers: pageContainer.state.sumOfLikers + 1 });
  23. }
  24. pageContainer.setState({ isLiked: bool });
  25. }
  26. catch (err) {
  27. toastError(err);
  28. }
  29. }
  30. isUserLoggedIn() {
  31. return this.props.appContainer.currentUserId != null;
  32. }
  33. render() {
  34. const { pageContainer } = this.props;
  35. // if guest user
  36. if (!this.isUserLoggedIn()) {
  37. return <div></div>;
  38. }
  39. return (
  40. <div className="d-flex">
  41. <button
  42. type="button"
  43. onClick={this.handleClick}
  44. className={`btn rounded-circle btn-like border-0 d-edit-none
  45. ${pageContainer.state.isLiked ? 'active' : ''}`}
  46. >
  47. <i className="icon-like"></i>
  48. </button>
  49. <div className="total-likes">
  50. {pageContainer.state.sumOfLikers}
  51. </div>
  52. </div>
  53. );
  54. }
  55. }
  56. /**
  57. * Wrapper component for using unstated
  58. */
  59. const LikeButtonWrapper = withUnstatedContainers(LikeButton, [AppContainer, PageContainer]);
  60. LikeButton.propTypes = {
  61. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  62. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  63. size: PropTypes.string,
  64. };
  65. export default LikeButtonWrapper;