|
@@ -2,8 +2,10 @@ import {
|
|
|
FC, useCallback, useState,
|
|
FC, useCallback, useState,
|
|
|
} from 'react';
|
|
} from 'react';
|
|
|
|
|
|
|
|
|
|
+import type { IPageHasId } from '@growi/core';
|
|
|
import { useTranslation } from 'next-i18next';
|
|
import { useTranslation } from 'next-i18next';
|
|
|
import { DropdownToggle } from 'reactstrap';
|
|
import { DropdownToggle } from 'reactstrap';
|
|
|
|
|
+import type { KeyedMutator } from 'swr';
|
|
|
|
|
|
|
|
import {
|
|
import {
|
|
|
addBookmarkToFolder, addNewFolder, hasChildren, updateBookmarkFolder,
|
|
addBookmarkToFolder, addNewFolder, hasChildren, updateBookmarkFolder,
|
|
@@ -12,34 +14,37 @@ import { toastError, toastSuccess } from '~/client/util/toastr';
|
|
|
import { FolderIcon } from '~/components/Icons/FolderIcon';
|
|
import { FolderIcon } from '~/components/Icons/FolderIcon';
|
|
|
import { TriangleIcon } from '~/components/Icons/TriangleIcon';
|
|
import { TriangleIcon } from '~/components/Icons/TriangleIcon';
|
|
|
import {
|
|
import {
|
|
|
- BookmarkFolderItems, DragItemDataType, DragItemType, DRAG_ITEM_TYPE,
|
|
|
|
|
|
|
+ BookmarkFolderItems, DragItemDataType, DragItemType, DRAG_ITEM_TYPE, IBookmarkInfo,
|
|
|
} from '~/interfaces/bookmark-info';
|
|
} from '~/interfaces/bookmark-info';
|
|
|
import { IPageToDeleteWithMeta } from '~/interfaces/page';
|
|
import { IPageToDeleteWithMeta } from '~/interfaces/page';
|
|
|
import { onDeletedBookmarkFolderFunction, OnDeletedFunction } from '~/interfaces/ui';
|
|
import { onDeletedBookmarkFolderFunction, OnDeletedFunction } from '~/interfaces/ui';
|
|
|
-import { useSWRBookmarkInfo, useSWRxCurrentUserBookmarks } from '~/stores/bookmark';
|
|
|
|
|
-import { useSWRxBookmarkFolderAndChild } from '~/stores/bookmark-folder';
|
|
|
|
|
import { useBookmarkFolderDeleteModal, usePageDeleteModal } from '~/stores/modal';
|
|
import { useBookmarkFolderDeleteModal, usePageDeleteModal } from '~/stores/modal';
|
|
|
-import { useSWRxCurrentPage } from '~/stores/page';
|
|
|
|
|
|
|
|
|
|
import { BookmarkFolderItemControl } from './BookmarkFolderItemControl';
|
|
import { BookmarkFolderItemControl } from './BookmarkFolderItemControl';
|
|
|
import { BookmarkFolderNameInput } from './BookmarkFolderNameInput';
|
|
import { BookmarkFolderNameInput } from './BookmarkFolderNameInput';
|
|
|
import { BookmarkItem } from './BookmarkItem';
|
|
import { BookmarkItem } from './BookmarkItem';
|
|
|
import { DragAndDropWrapper } from './DragAndDropWrapper';
|
|
import { DragAndDropWrapper } from './DragAndDropWrapper';
|
|
|
|
|
|
|
|
-
|
|
|
|
|
type BookmarkFolderItemProps = {
|
|
type BookmarkFolderItemProps = {
|
|
|
bookmarkFolder: BookmarkFolderItems
|
|
bookmarkFolder: BookmarkFolderItems
|
|
|
isOpen?: boolean
|
|
isOpen?: boolean
|
|
|
level: number
|
|
level: number
|
|
|
root: string
|
|
root: string
|
|
|
isUserHomePage?: boolean
|
|
isUserHomePage?: boolean
|
|
|
|
|
+ bookmarkFolders: BookmarkFolderItems[]
|
|
|
|
|
+ mutateBookmarkFolders: KeyedMutator<BookmarkFolderItems[]>
|
|
|
|
|
+ userBookmarks: IPageHasId[]
|
|
|
|
|
+ mutateUserBookmarks: KeyedMutator<IPageHasId[]>
|
|
|
|
|
+ bookmarkInfo: IBookmarkInfo
|
|
|
|
|
+ mutateBookmarkInfo: KeyedMutator<IBookmarkInfo>
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
export const BookmarkFolderItem: FC<BookmarkFolderItemProps> = (props: BookmarkFolderItemProps) => {
|
|
export const BookmarkFolderItem: FC<BookmarkFolderItemProps> = (props: BookmarkFolderItemProps) => {
|
|
|
const BASE_FOLDER_PADDING = 15;
|
|
const BASE_FOLDER_PADDING = 15;
|
|
|
const acceptedTypes: DragItemType[] = [DRAG_ITEM_TYPE.FOLDER, DRAG_ITEM_TYPE.BOOKMARK];
|
|
const acceptedTypes: DragItemType[] = [DRAG_ITEM_TYPE.FOLDER, DRAG_ITEM_TYPE.BOOKMARK];
|
|
|
const {
|
|
const {
|
|
|
- bookmarkFolder, isOpen: _isOpen = false, level, root, isUserHomePage,
|
|
|
|
|
|
|
+ bookmarkFolder, isOpen: _isOpen = false, level, root, isUserHomePage, bookmarkFolders,
|
|
|
|
|
+ mutateBookmarkFolders, userBookmarks, mutateUserBookmarks, bookmarkInfo, mutateBookmarkInfo,
|
|
|
} = props;
|
|
} = props;
|
|
|
|
|
|
|
|
const { t } = useTranslation();
|
|
const { t } = useTranslation();
|
|
@@ -49,12 +54,10 @@ export const BookmarkFolderItem: FC<BookmarkFolderItemProps> = (props: BookmarkF
|
|
|
|
|
|
|
|
const [targetFolder, setTargetFolder] = useState<string | null>(folderId);
|
|
const [targetFolder, setTargetFolder] = useState<string | null>(folderId);
|
|
|
const [isOpen, setIsOpen] = useState(_isOpen);
|
|
const [isOpen, setIsOpen] = useState(_isOpen);
|
|
|
- const { mutate: mutateBookmarkData } = useSWRxBookmarkFolderAndChild();
|
|
|
|
|
- const { mutate: mutateUserBookmarks } = useSWRxCurrentUserBookmarks();
|
|
|
|
|
const [isRenameAction, setIsRenameAction] = useState<boolean>(false);
|
|
const [isRenameAction, setIsRenameAction] = useState<boolean>(false);
|
|
|
const [isCreateAction, setIsCreateAction] = useState<boolean>(false);
|
|
const [isCreateAction, setIsCreateAction] = useState<boolean>(false);
|
|
|
- const { data: currentPage } = useSWRxCurrentPage();
|
|
|
|
|
- const { mutate: mutateBookmarkInfo } = useSWRBookmarkInfo(currentPage?._id);
|
|
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
const { open: openDeleteModal } = usePageDeleteModal();
|
|
const { open: openDeleteModal } = usePageDeleteModal();
|
|
|
const { open: openDeleteBookmarkFolderModal } = useBookmarkFolderDeleteModal();
|
|
const { open: openDeleteBookmarkFolderModal } = useBookmarkFolderDeleteModal();
|
|
|
|
|
|
|
@@ -71,13 +74,13 @@ export const BookmarkFolderItem: FC<BookmarkFolderItemProps> = (props: BookmarkF
|
|
|
const onPressEnterHandlerForRename = useCallback(async(folderName: string) => {
|
|
const onPressEnterHandlerForRename = useCallback(async(folderName: string) => {
|
|
|
try {
|
|
try {
|
|
|
await updateBookmarkFolder(folderId, folderName, parent);
|
|
await updateBookmarkFolder(folderId, folderName, parent);
|
|
|
- mutateBookmarkData();
|
|
|
|
|
|
|
+ mutateBookmarkFolders();
|
|
|
setIsRenameAction(false);
|
|
setIsRenameAction(false);
|
|
|
}
|
|
}
|
|
|
catch (err) {
|
|
catch (err) {
|
|
|
toastError(err);
|
|
toastError(err);
|
|
|
}
|
|
}
|
|
|
- }, [folderId, mutateBookmarkData, parent]);
|
|
|
|
|
|
|
+ }, [folderId, mutateBookmarkFolders, parent]);
|
|
|
|
|
|
|
|
// Create new folder / subfolder handler
|
|
// Create new folder / subfolder handler
|
|
|
const onPressEnterHandlerForCreate = useCallback(async(folderName: string) => {
|
|
const onPressEnterHandlerForCreate = useCallback(async(folderName: string) => {
|
|
@@ -85,12 +88,12 @@ export const BookmarkFolderItem: FC<BookmarkFolderItemProps> = (props: BookmarkF
|
|
|
await addNewFolder(folderName, targetFolder);
|
|
await addNewFolder(folderName, targetFolder);
|
|
|
setIsOpen(true);
|
|
setIsOpen(true);
|
|
|
setIsCreateAction(false);
|
|
setIsCreateAction(false);
|
|
|
- mutateBookmarkData();
|
|
|
|
|
|
|
+ mutateBookmarkFolders();
|
|
|
}
|
|
}
|
|
|
catch (err) {
|
|
catch (err) {
|
|
|
toastError(err);
|
|
toastError(err);
|
|
|
}
|
|
}
|
|
|
- }, [mutateBookmarkData, targetFolder]);
|
|
|
|
|
|
|
+ }, [mutateBookmarkFolders, targetFolder]);
|
|
|
|
|
|
|
|
|
|
|
|
|
const onClickPlusButton = useCallback(async(e) => {
|
|
const onClickPlusButton = useCallback(async(e) => {
|
|
@@ -114,16 +117,16 @@ export const BookmarkFolderItem: FC<BookmarkFolderItemProps> = (props: BookmarkF
|
|
|
else {
|
|
else {
|
|
|
toastSuccess(t('deleted_pages', { path }));
|
|
toastSuccess(t('deleted_pages', { path }));
|
|
|
}
|
|
}
|
|
|
- mutateBookmarkData();
|
|
|
|
|
|
|
+ mutateBookmarkFolders();
|
|
|
mutateBookmarkInfo();
|
|
mutateBookmarkInfo();
|
|
|
};
|
|
};
|
|
|
openDeleteModal([pageToDelete], { onDeleted: pageDeletedHandler });
|
|
openDeleteModal([pageToDelete], { onDeleted: pageDeletedHandler });
|
|
|
- }, [mutateBookmarkInfo, mutateBookmarkData, openDeleteModal, t]);
|
|
|
|
|
|
|
+ }, [mutateBookmarkInfo, mutateBookmarkFolders, openDeleteModal, t]);
|
|
|
|
|
|
|
|
const onUnbookmarkHandler = useCallback(() => {
|
|
const onUnbookmarkHandler = useCallback(() => {
|
|
|
- mutateBookmarkData();
|
|
|
|
|
|
|
+ mutateBookmarkFolders();
|
|
|
mutateBookmarkInfo();
|
|
mutateBookmarkInfo();
|
|
|
- }, [mutateBookmarkInfo, mutateBookmarkData]);
|
|
|
|
|
|
|
+ }, [mutateBookmarkInfo, mutateBookmarkFolders]);
|
|
|
|
|
|
|
|
|
|
|
|
|
const itemDropHandler = async(item: DragItemDataType, dragItemType: string | symbol | null) => {
|
|
const itemDropHandler = async(item: DragItemDataType, dragItemType: string | symbol | null) => {
|
|
@@ -131,7 +134,7 @@ export const BookmarkFolderItem: FC<BookmarkFolderItemProps> = (props: BookmarkF
|
|
|
try {
|
|
try {
|
|
|
if (item.bookmarkFolder != null) {
|
|
if (item.bookmarkFolder != null) {
|
|
|
await updateBookmarkFolder(item.bookmarkFolder._id, item.bookmarkFolder.name, bookmarkFolder._id);
|
|
await updateBookmarkFolder(item.bookmarkFolder._id, item.bookmarkFolder.name, bookmarkFolder._id);
|
|
|
- mutateBookmarkData();
|
|
|
|
|
|
|
+ mutateBookmarkFolders();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
catch (err) {
|
|
catch (err) {
|
|
@@ -142,7 +145,7 @@ export const BookmarkFolderItem: FC<BookmarkFolderItemProps> = (props: BookmarkF
|
|
|
try {
|
|
try {
|
|
|
if (item != null) {
|
|
if (item != null) {
|
|
|
await addBookmarkToFolder(item._id, bookmarkFolder._id);
|
|
await addBookmarkToFolder(item._id, bookmarkFolder._id);
|
|
|
- mutateBookmarkData();
|
|
|
|
|
|
|
+ mutateBookmarkFolders();
|
|
|
await mutateUserBookmarks();
|
|
await mutateUserBookmarks();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -184,7 +187,13 @@ export const BookmarkFolderItem: FC<BookmarkFolderItemProps> = (props: BookmarkF
|
|
|
bookmarkFolder={childFolder}
|
|
bookmarkFolder={childFolder}
|
|
|
level={level + 1}
|
|
level={level + 1}
|
|
|
root={root}
|
|
root={root}
|
|
|
- isUserHomePage ={isUserHomePage}
|
|
|
|
|
|
|
+ isUserHomePage={isUserHomePage}
|
|
|
|
|
+ bookmarkFolders={bookmarkFolders}
|
|
|
|
|
+ mutateBookmarkFolders={mutateBookmarkFolders}
|
|
|
|
|
+ userBookmarks={userBookmarks}
|
|
|
|
|
+ mutateUserBookmarks={mutateUserBookmarks}
|
|
|
|
|
+ bookmarkInfo={bookmarkInfo}
|
|
|
|
|
+ mutateBookmarkInfo={mutateBookmarkInfo}
|
|
|
/>
|
|
/>
|
|
|
</div>
|
|
</div>
|
|
|
);
|
|
);
|
|
@@ -198,10 +207,14 @@ export const BookmarkFolderItem: FC<BookmarkFolderItemProps> = (props: BookmarkF
|
|
|
bookmarkedPage={bookmark.page}
|
|
bookmarkedPage={bookmark.page}
|
|
|
key={bookmark._id}
|
|
key={bookmark._id}
|
|
|
onUnbookmarked={onUnbookmarkHandler}
|
|
onUnbookmarked={onUnbookmarkHandler}
|
|
|
- onRenamed={mutateBookmarkData}
|
|
|
|
|
|
|
+ onRenamed={mutateBookmarkFolders}
|
|
|
onClickDeleteMenuItem={onClickDeleteBookmarkHandler}
|
|
onClickDeleteMenuItem={onClickDeleteBookmarkHandler}
|
|
|
parentFolder={bookmarkFolder}
|
|
parentFolder={bookmarkFolder}
|
|
|
level={level + 1}
|
|
level={level + 1}
|
|
|
|
|
+ bookmarkFolders={bookmarkFolders}
|
|
|
|
|
+ mutateBookmarkFolders={mutateBookmarkFolders}
|
|
|
|
|
+ userBookmarks={userBookmarks}
|
|
|
|
|
+ mutateUserBookmarks={mutateUserBookmarks}
|
|
|
/>
|
|
/>
|
|
|
);
|
|
);
|
|
|
});
|
|
});
|
|
@@ -217,24 +230,24 @@ export const BookmarkFolderItem: FC<BookmarkFolderItemProps> = (props: BookmarkF
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
mutateBookmarkInfo();
|
|
mutateBookmarkInfo();
|
|
|
- mutateBookmarkData();
|
|
|
|
|
|
|
+ mutateBookmarkFolders();
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
if (bookmarkFolder == null) {
|
|
if (bookmarkFolder == null) {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
openDeleteBookmarkFolderModal(bookmarkFolder, { onDeleted: bookmarkFolderDeleteHandler });
|
|
openDeleteBookmarkFolderModal(bookmarkFolder, { onDeleted: bookmarkFolderDeleteHandler });
|
|
|
- }, [bookmarkFolder, mutateBookmarkData, mutateBookmarkInfo, openDeleteBookmarkFolderModal]);
|
|
|
|
|
|
|
+ }, [bookmarkFolder, mutateBookmarkFolders, mutateBookmarkInfo, openDeleteBookmarkFolderModal]);
|
|
|
|
|
|
|
|
const onClickMoveToRootHandler = useCallback(async() => {
|
|
const onClickMoveToRootHandler = useCallback(async() => {
|
|
|
try {
|
|
try {
|
|
|
await updateBookmarkFolder(bookmarkFolder._id, bookmarkFolder.name, null);
|
|
await updateBookmarkFolder(bookmarkFolder._id, bookmarkFolder.name, null);
|
|
|
- await mutateBookmarkData();
|
|
|
|
|
|
|
+ await mutateBookmarkFolders();
|
|
|
}
|
|
}
|
|
|
catch (err) {
|
|
catch (err) {
|
|
|
toastError(err);
|
|
toastError(err);
|
|
|
}
|
|
}
|
|
|
- }, [bookmarkFolder._id, bookmarkFolder.name, mutateBookmarkData]);
|
|
|
|
|
|
|
+ }, [bookmarkFolder._id, bookmarkFolder.name, mutateBookmarkFolders]);
|
|
|
|
|
|
|
|
return (
|
|
return (
|
|
|
<div id={`grw-bookmark-folder-item-${folderId}`} className="grw-foldertree-item-container">
|
|
<div id={`grw-bookmark-folder-item-${folderId}`} className="grw-foldertree-item-container">
|