|
|
@@ -1,15 +1,20 @@
|
|
|
-import React, { useState, useCallback, useEffect } from 'react';
|
|
|
+import React, {
|
|
|
+ useState, useCallback, useEffect, useMemo,
|
|
|
+} from 'react';
|
|
|
|
|
|
import { useTranslation } from 'next-i18next';
|
|
|
import {
|
|
|
Dropdown, DropdownMenu, DropdownToggle, DropdownItem,
|
|
|
} from 'reactstrap';
|
|
|
|
|
|
+import { addBookmarkToFolder } from '~/client/util/bookmark-utils';
|
|
|
+import { toastError } from '~/client/util/toastr';
|
|
|
import { NotAvailableForGuest } from '~/components/NotAvailableForGuest';
|
|
|
import {
|
|
|
IPageInfoAll, isIPageInfoForOperation,
|
|
|
} from '~/interfaces/page';
|
|
|
import { IPageOperationProcessData } from '~/interfaces/page-operation';
|
|
|
+import { useSWRxCurrentUserBookmarks } from '~/stores/bookmark';
|
|
|
import { useSWRxPageInfo } from '~/stores/page';
|
|
|
import loggerFactory from '~/utils/logger';
|
|
|
import { shouldRecoverPagePaths } from '~/utils/page-operation';
|
|
|
@@ -19,6 +24,7 @@ const logger = loggerFactory('growi:cli:PageItemControl');
|
|
|
|
|
|
export const MenuItemType = {
|
|
|
BOOKMARK: 'bookmark',
|
|
|
+ BOOKMARKS_TREE_MOVE_TO_ROOT: 'bookmarks_tree_move_to_root',
|
|
|
RENAME: 'rename',
|
|
|
DUPLICATE: 'duplicate',
|
|
|
DELETE: 'delete',
|
|
|
@@ -60,6 +66,8 @@ type DropdownMenuProps = CommonProps & {
|
|
|
const PageItemControlDropdownMenu = React.memo((props: DropdownMenuProps): JSX.Element => {
|
|
|
const { t } = useTranslation('');
|
|
|
|
|
|
+ const { data: userBookmarks, mutate: mutateUserBookmarks } = useSWRxCurrentUserBookmarks();
|
|
|
+
|
|
|
const {
|
|
|
pageId, isLoading, pageInfo, isEnableActions, forceHideMenuItems, operationProcessData,
|
|
|
onClickBookmarkMenuItem, onClickRenameMenuItem, onClickDuplicateMenuItem, onClickDeleteMenuItem,
|
|
|
@@ -77,6 +85,20 @@ const PageItemControlDropdownMenu = React.memo((props: DropdownMenuProps): JSX.E
|
|
|
await onClickBookmarkMenuItem(pageId, !pageInfo.isBookmarked);
|
|
|
}, [onClickBookmarkMenuItem, pageId, pageInfo]);
|
|
|
|
|
|
+ const isMoveToRoot = useMemo(() => {
|
|
|
+ return !userBookmarks?.map(userBookmark => userBookmark._id).includes(pageId);
|
|
|
+ }, [pageId, userBookmarks]);
|
|
|
+
|
|
|
+ const moveToRootClickedHandler = useCallback(async() => {
|
|
|
+ try {
|
|
|
+ await addBookmarkToFolder(pageId, null);
|
|
|
+ await mutateUserBookmarks();
|
|
|
+ }
|
|
|
+ catch (err) {
|
|
|
+ toastError(err);
|
|
|
+ }
|
|
|
+ }, [mutateUserBookmarks, pageId]);
|
|
|
+
|
|
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
|
const renameItemClickedHandler = useCallback(async() => {
|
|
|
if (onClickRenameMenuItem == null) {
|
|
|
@@ -172,6 +194,18 @@ const PageItemControlDropdownMenu = React.memo((props: DropdownMenuProps): JSX.E
|
|
|
</DropdownItem>
|
|
|
) }
|
|
|
|
|
|
+ {/* Bookmarks Tree Move to Root */}
|
|
|
+ { !forceHideMenuItems?.includes(MenuItemType.BOOKMARKS_TREE_MOVE_TO_ROOT) && isEnableActions && isMoveToRoot && (
|
|
|
+ <DropdownItem
|
|
|
+ onClick={moveToRootClickedHandler}
|
|
|
+ className="grw-page-control-dropdown-item"
|
|
|
+ data-testid="add-remove-bookmark-btn"
|
|
|
+ >
|
|
|
+ <i className="fa fa-fw fa-bookmark-o grw-page-control-dropdown-icon"></i>
|
|
|
+ {t('bookmark_folder.move_to_root')}
|
|
|
+ </DropdownItem>
|
|
|
+ ) }
|
|
|
+
|
|
|
{/* Move/Rename */}
|
|
|
{ !forceHideMenuItems?.includes(MenuItemType.RENAME) && isEnableActions && pageInfo.isMovable && (
|
|
|
<DropdownItem
|