BookmarkButtons.tsx 2.8 KB

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