|
@@ -1,9 +1,10 @@
|
|
|
-import React, { FC } from 'react';
|
|
|
|
|
|
|
+import React, { FC, useState } from 'react';
|
|
|
|
|
|
|
|
import { Types } from 'mongoose';
|
|
import { Types } from 'mongoose';
|
|
|
-import { UncontrolledTooltip } from 'reactstrap';
|
|
|
|
|
|
|
+import { UncontrolledTooltip, Popover, PopoverBody } from 'reactstrap';
|
|
|
import { useTranslation } from 'react-i18next';
|
|
import { useTranslation } from 'react-i18next';
|
|
|
|
|
|
|
|
|
|
+import UserPictureList from './User/UserPictureList';
|
|
|
import { toastError } from '~/client/util/apiNotification';
|
|
import { toastError } from '~/client/util/apiNotification';
|
|
|
import { useIsGuestUser } from '~/stores/context';
|
|
import { useIsGuestUser } from '~/stores/context';
|
|
|
import { useSWRxBookmarksInfo } from '~/stores/bookmarks';
|
|
import { useSWRxBookmarksInfo } from '~/stores/bookmarks';
|
|
@@ -17,16 +18,19 @@ const BookmarkButton: FC<Props> = (props: Props) => {
|
|
|
const { t } = useTranslation();
|
|
const { t } = useTranslation();
|
|
|
const { pageId } = props;
|
|
const { pageId } = props;
|
|
|
|
|
|
|
|
|
|
+ const [isPopoverOpen, setIsPopoverOpen] = useState(false);
|
|
|
|
|
+
|
|
|
const { data: isGuestUser } = useIsGuestUser();
|
|
const { data: isGuestUser } = useIsGuestUser();
|
|
|
const { data: bookmarksInfo, mutate } = useSWRxBookmarksInfo(pageId);
|
|
const { data: bookmarksInfo, mutate } = useSWRxBookmarksInfo(pageId);
|
|
|
|
|
|
|
|
const isBookmarked = bookmarksInfo?.isBookmarked != null ? bookmarksInfo.isBookmarked : false;
|
|
const isBookmarked = bookmarksInfo?.isBookmarked != null ? bookmarksInfo.isBookmarked : false;
|
|
|
const sumOfBookmarks = bookmarksInfo?.sumOfBookmarks != null ? bookmarksInfo.sumOfBookmarks : 0;
|
|
const sumOfBookmarks = bookmarksInfo?.sumOfBookmarks != null ? bookmarksInfo.sumOfBookmarks : 0;
|
|
|
-
|
|
|
|
|
- // TODO: To be used in UserPictureList
|
|
|
|
|
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
|
|
|
const bookmarkedUsers = bookmarksInfo?.bookmarkedUsers != null ? bookmarksInfo.bookmarkedUsers : [];
|
|
const bookmarkedUsers = bookmarksInfo?.bookmarkedUsers != null ? bookmarksInfo.bookmarkedUsers : [];
|
|
|
|
|
|
|
|
|
|
+ const togglePopover = () => {
|
|
|
|
|
+ setIsPopoverOpen(!isPopoverOpen);
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
const handleClick = async() => {
|
|
const handleClick = async() => {
|
|
|
if (isGuestUser) {
|
|
if (isGuestUser) {
|
|
|
return;
|
|
return;
|
|
@@ -44,18 +48,15 @@ const BookmarkButton: FC<Props> = (props: Props) => {
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
return (
|
|
return (
|
|
|
- <div>
|
|
|
|
|
|
|
+ <div className="btn-group" role="group" aria-label="Bookmark buttons">
|
|
|
<button
|
|
<button
|
|
|
type="button"
|
|
type="button"
|
|
|
id="bookmark-button"
|
|
id="bookmark-button"
|
|
|
onClick={handleClick}
|
|
onClick={handleClick}
|
|
|
- className={`btn btn-bookmark border-0 btn-md
|
|
|
|
|
- ${isBookmarked ? 'active' : ''} ${isGuestUser ? 'disabled' : ''}`}
|
|
|
|
|
|
|
+ className={`btn btn-bookmark border-0
|
|
|
|
|
+ ${isBookmarked ? 'active' : ''} ${isGuestUser ? 'disabled' : ''}`}
|
|
|
>
|
|
>
|
|
|
- <i className="icon-star mr-3"></i>
|
|
|
|
|
- <span className="total-bookmarks">
|
|
|
|
|
- {sumOfBookmarks}
|
|
|
|
|
- </span>
|
|
|
|
|
|
|
+ <i className="icon-star"></i>
|
|
|
</button>
|
|
</button>
|
|
|
|
|
|
|
|
{isGuestUser && (
|
|
{isGuestUser && (
|
|
@@ -63,6 +64,17 @@ const BookmarkButton: FC<Props> = (props: Props) => {
|
|
|
{t('Not available for guest')}
|
|
{t('Not available for guest')}
|
|
|
</UncontrolledTooltip>
|
|
</UncontrolledTooltip>
|
|
|
)}
|
|
)}
|
|
|
|
|
+
|
|
|
|
|
+ <button type="button" id="po-total-bookmarks" className={`btn btn-bookmark border-0 total-bookmarks ${isBookmarked ? 'active' : ''}`}>
|
|
|
|
|
+ {sumOfBookmarks}
|
|
|
|
|
+ </button>
|
|
|
|
|
+ <Popover placement="bottom" isOpen={isPopoverOpen} target="po-total-bookmarks" toggle={togglePopover} trigger="legacy">
|
|
|
|
|
+ <PopoverBody className="seen-user-popover">
|
|
|
|
|
+ <div className="px-2 text-right user-list-content text-truncate text-muted">
|
|
|
|
|
+ {bookmarkedUsers.length ? <UserPictureList users={bookmarkedUsers} /> : t('No users have bookmarked yet')}
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </PopoverBody>
|
|
|
|
|
+ </Popover>
|
|
|
</div>
|
|
</div>
|
|
|
);
|
|
);
|
|
|
};
|
|
};
|