2
0

LikeButtons.tsx 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import React, { FC, useState, useCallback } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import { UncontrolledTooltip, Popover, PopoverBody } from 'reactstrap';
  4. import { IUser } from '../interfaces/user';
  5. import UserPictureList from './User/UserPictureList';
  6. import styles from './LikeButtons.module.scss';
  7. type LikeButtonsProps = {
  8. hideTotalNumber?: boolean,
  9. sumOfLikers: number,
  10. likers: IUser[],
  11. isGuestUser?: boolean,
  12. isLiked?: boolean,
  13. onLikeClicked?: ()=>void,
  14. }
  15. const LikeButtons: FC<LikeButtonsProps> = (props: LikeButtonsProps) => {
  16. const { t } = useTranslation();
  17. const [isPopoverOpen, setIsPopoverOpen] = useState(false);
  18. const togglePopover = () => {
  19. setIsPopoverOpen(!isPopoverOpen);
  20. };
  21. const {
  22. hideTotalNumber, isGuestUser, isLiked, sumOfLikers, onLikeClicked,
  23. } = props;
  24. const getTooltipMessage = useCallback(() => {
  25. if (isGuestUser) {
  26. return 'Not available for guest';
  27. }
  28. if (isLiked) {
  29. return 'tooltip.cancel_like';
  30. }
  31. return 'tooltip.like';
  32. }, [isGuestUser, isLiked]);
  33. return (
  34. <div className="btn-group" role="group" aria-label="Like buttons">
  35. <button
  36. type="button"
  37. id="like-button"
  38. onClick={onLikeClicked}
  39. className={`shadow-none btn ${styles['btn-like']} border-0
  40. ${isLiked ? 'active' : ''} ${isGuestUser ? 'disabled' : ''}`}
  41. >
  42. <i className={`fa ${isLiked ? 'fa-heart' : 'fa-heart-o'}`}></i>
  43. </button>
  44. <UncontrolledTooltip placement="top" target="like-button" fade={false}>
  45. {t(getTooltipMessage())}
  46. </UncontrolledTooltip>
  47. { !hideTotalNumber && (
  48. <>
  49. <button
  50. type="button"
  51. id="po-total-likes"
  52. className={`shadow-none btn btn-like border-0
  53. total-likes ${isLiked ? 'active' : ''}`}
  54. >
  55. {sumOfLikers}
  56. </button>
  57. <Popover placement="bottom" isOpen={isPopoverOpen} target="po-total-likes" toggle={togglePopover} trigger="legacy">
  58. <PopoverBody className="user-list-popover">
  59. <div className="px-2 text-right user-list-content text-truncate text-muted">
  60. {props.likers?.length ? <UserPictureList users={props.likers} /> : t('No users have liked this yet.')}
  61. </div>
  62. </PopoverBody>
  63. </Popover>
  64. </>
  65. ) }
  66. </div>
  67. );
  68. };
  69. export default LikeButtons;