LikeButtons.tsx 2.3 KB

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