LikeButton.jsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import { withUnstatedContainers } from './UnstatedUtils';
  5. import { toastError } from '../util/apiNotification';
  6. import AppContainer from '../services/AppContainer';
  7. import PageContainer from '../services/PageContainer';
  8. class LikeButton extends React.Component {
  9. constructor(props) {
  10. super(props);
  11. this.handleClick = this.handleClick.bind(this);
  12. }
  13. async handleClick() {
  14. const { pageContainer } = this.props;
  15. try {
  16. pageContainer.toggleLike();
  17. }
  18. catch (err) {
  19. toastError(err);
  20. }
  21. }
  22. render() {
  23. const { pageContainer, t } = this.props;
  24. const isUserLoggedIn = this.props.appContainer.currentUser != null;
  25. return (
  26. <div id="like-button">
  27. <button
  28. type="button"
  29. href="#"
  30. title="Like"
  31. onClick={this.handleClick}
  32. className={`btn btn-like border-0
  33. ${pageContainer.state.isLiked ? 'active' : ''}`}
  34. disabled={!isUserLoggedIn}
  35. >
  36. <i className="icon-like mr-3"></i>
  37. <span className="total-likes">
  38. {pageContainer.state.sumOfLikers}
  39. </span>
  40. </button>
  41. </div>
  42. );
  43. }
  44. }
  45. /**
  46. * Wrapper component for using unstated
  47. */
  48. const LikeButtonWrapper = withUnstatedContainers(LikeButton, [AppContainer, PageContainer]);
  49. LikeButton.propTypes = {
  50. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  51. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  52. t: PropTypes.func.isRequired,
  53. size: PropTypes.string,
  54. };
  55. export default withTranslation()(LikeButtonWrapper);