BookmarkButtons.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import React, {
  2. FC, useState, useCallback,
  3. } from 'react';
  4. import { useTranslation } from 'next-i18next';
  5. import {
  6. UncontrolledTooltip, Popover, PopoverBody, DropdownToggle,
  7. } from 'reactstrap';
  8. import { useSWRBookmarkInfo } from '~/stores/bookmark';
  9. import { useIsGuestUser } from '~/stores/context';
  10. import { useSWRxCurrentPage } from '~/stores/page';
  11. import { IUser } from '../interfaces/user';
  12. import BookmarkFolderMenu from './Bookmarks/BookmarkFolderMenu';
  13. import UserPictureList from './User/UserPictureList';
  14. import styles from './BookmarkButtons.module.scss';
  15. interface Props {
  16. bookmarkedUsers?: IUser[]
  17. hideTotalNumber?: boolean
  18. }
  19. const BookmarkButtons: FC<Props> = (props: Props) => {
  20. const { t } = useTranslation();
  21. const { data } = useSWRxCurrentPage();
  22. const { data: bookmarkInfo } = useSWRBookmarkInfo(data?._id);
  23. const {
  24. bookmarkedUsers, hideTotalNumber,
  25. } = props;
  26. const [isPopoverOpen, setIsPopoverOpen] = useState(false);
  27. const { data: isGuestUser } = useIsGuestUser();
  28. const togglePopover = () => {
  29. setIsPopoverOpen(!isPopoverOpen);
  30. };
  31. const getTooltipMessage = useCallback(() => {
  32. if (isGuestUser) {
  33. return 'Not available for guest';
  34. }
  35. if (bookmarkInfo?.isBookmarked) {
  36. return 'tooltip.cancel_bookmark';
  37. }
  38. return 'tooltip.bookmark';
  39. }, [isGuestUser, bookmarkInfo]);
  40. return (
  41. <div className={`btn-group btn-group-bookmark ${styles['btn-group-bookmark']}`} role="group" aria-label="Bookmark buttons">
  42. <BookmarkFolderMenu >
  43. <DropdownToggle id='bookmark-dropdown-btn' color="transparent" className={`shadow-none btn btn-bookmark border-0
  44. ${bookmarkInfo?.isBookmarked ? 'active' : ''} ${isGuestUser ? 'disabled' : ''}`}>
  45. <i className={`fa ${bookmarkInfo?.isBookmarked ? 'fa-bookmark' : 'fa-bookmark-o'}`}></i>
  46. </DropdownToggle>
  47. </BookmarkFolderMenu>
  48. <UncontrolledTooltip placement="top" data-testid="bookmark-button-tooltip" target="bookmark-dropdown-btn" fade={false}>
  49. {t(getTooltipMessage())}
  50. </UncontrolledTooltip>
  51. { !hideTotalNumber && (
  52. <>
  53. <button
  54. type="button"
  55. id="po-total-bookmarks"
  56. className={`shadow-none btn btn-bookmark border-0
  57. total-bookmarks ${bookmarkInfo?.isBookmarked ? 'active' : ''}`}
  58. >
  59. {bookmarkInfo?.sumOfBookmarks ?? 0}
  60. </button>
  61. { bookmarkedUsers != null && (
  62. <Popover placement="bottom" isOpen={isPopoverOpen} target="po-total-bookmarks" toggle={togglePopover} trigger="legacy">
  63. <PopoverBody className="user-list-popover">
  64. <div className="px-2 text-right user-list-content text-truncate text-muted">
  65. {bookmarkedUsers.length ? <UserPictureList users={props.bookmarkedUsers} /> : t('No users have bookmarked yet')}
  66. </div>
  67. </PopoverBody>
  68. </Popover>
  69. ) }
  70. </>
  71. ) }
  72. </div>
  73. );
  74. };
  75. export default BookmarkButtons;