LikeButtons.tsx 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import React, { FC, useState, useCallback } from 'react';
  2. import type { IUser } from '@growi/core';
  3. import { useTranslation } from 'next-i18next';
  4. import { UncontrolledTooltip, Popover, PopoverBody } from 'reactstrap';
  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 (isLiked) {
  26. return 'tooltip.cancel_like';
  27. }
  28. return 'tooltip.like';
  29. }, [isLiked]);
  30. return (
  31. <div className={`btn-group btn-group-like ${styles['btn-group-like']}`} role="group" aria-label="Like buttons">
  32. <button
  33. type="button"
  34. id="like-button"
  35. onClick={onLikeClicked}
  36. className={`shadow-none btn btn-like border-0
  37. ${isLiked ? 'active' : ''} ${isGuestUser ? 'disabled' : ''}`}
  38. >
  39. <i className={`fa ${isLiked ? 'fa-heart' : 'fa-heart-o'}`}></i>
  40. </button>
  41. <UncontrolledTooltip data-testid="like-button-tooltip" placement="top" target="like-button" autohide={false} fade={false}>
  42. {t(getTooltipMessage())}
  43. </UncontrolledTooltip>
  44. { !hideTotalNumber && (
  45. <>
  46. <button
  47. type="button"
  48. id="po-total-likes"
  49. className={`shadow-none btn btn-like border-0
  50. total-likes ${isLiked ? 'active' : ''}`}
  51. >
  52. {sumOfLikers}
  53. </button>
  54. <Popover placement="bottom" isOpen={isPopoverOpen} target="po-total-likes" toggle={togglePopover} trigger="legacy">
  55. <PopoverBody className="user-list-popover">
  56. <div className="px-2 text-right user-list-content text-truncate text-muted">
  57. {props.likers?.length ? <UserPictureList users={props.likers} /> : t('No users have liked this yet.')}
  58. </div>
  59. </PopoverBody>
  60. </Popover>
  61. </>
  62. ) }
  63. </div>
  64. );
  65. };
  66. export default LikeButtons;