BookmarkButtons.tsx 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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 { IBookmarkInfo } from '~/interfaces/bookmark-info';
  9. import { useIsGuestUser } from '~/stores/context';
  10. import { IUser } from '../interfaces/user';
  11. import { BookmarkFolderMenu } from './Bookmarks/BookmarkFolderMenu';
  12. import UserPictureList from './User/UserPictureList';
  13. import styles from './BookmarkButtons.module.scss';
  14. interface Props {
  15. bookmarkedUsers?: IUser[]
  16. hideTotalNumber?: boolean
  17. bookmarkInfo? : IBookmarkInfo
  18. }
  19. export const BookmarkButtons: FC<Props> = (props: Props) => {
  20. const { t } = useTranslation();
  21. const {
  22. bookmarkedUsers, hideTotalNumber, bookmarkInfo,
  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. return 'tooltip.bookmark';
  34. }, [isGuestUser]);
  35. return (
  36. <div className={`btn-group btn-group-bookmark ${styles['btn-group-bookmark']}`} role="group" aria-label="Bookmark buttons">
  37. <BookmarkFolderMenu >
  38. <DropdownToggle id='bookmark-dropdown-btn' color="transparent" className={`shadow-none btn btn-bookmark border-0
  39. ${bookmarkInfo?.isBookmarked ? 'active' : ''} ${isGuestUser ? 'disabled' : ''}`}>
  40. <i className={`fa ${bookmarkInfo?.isBookmarked ? 'fa-bookmark' : 'fa-bookmark-o'}`}></i>
  41. </DropdownToggle>
  42. </BookmarkFolderMenu>
  43. <UncontrolledTooltip placement="top" data-testid="bookmark-button-tooltip" target="bookmark-dropdown-btn" fade={false}>
  44. {t(getTooltipMessage())}
  45. </UncontrolledTooltip>
  46. { !hideTotalNumber && (
  47. <>
  48. <button
  49. type="button"
  50. id="po-total-bookmarks"
  51. className={`shadow-none btn btn-bookmark border-0
  52. total-bookmarks ${bookmarkInfo?.isBookmarked ? 'active' : ''}`}
  53. >
  54. {bookmarkInfo?.sumOfBookmarks ?? 0}
  55. </button>
  56. { bookmarkedUsers != null && (
  57. <Popover placement="bottom" isOpen={isPopoverOpen} target="po-total-bookmarks" 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. {bookmarkedUsers.length ? <UserPictureList users={props.bookmarkedUsers} /> : t('No users have bookmarked yet')}
  61. </div>
  62. </PopoverBody>
  63. </Popover>
  64. ) }
  65. </>
  66. ) }
  67. </div>
  68. );
  69. };