Przeglądaj źródła

Refactor and clean code

Mudana-Grune 3 lat temu
rodzic
commit
598c0ec9f2
25 zmienionych plików z 223 dodań i 236 usunięć
  1. 5 5
      packages/app/public/static/locales/en_US/commons.json
  2. 5 5
      packages/app/public/static/locales/ja_JP/commons.json
  3. 2 2
      packages/app/public/static/locales/ja_JP/translation.json
  4. 5 5
      packages/app/public/static/locales/zh_CN/commons.json
  5. 2 4
      packages/app/src/components/BookmarkButtons.tsx
  6. 7 14
      packages/app/src/components/Bookmarks/BookmarkFolderItem.tsx
  7. 1 3
      packages/app/src/components/Bookmarks/BookmarkFolderItemControl.tsx
  8. 91 63
      packages/app/src/components/Bookmarks/BookmarkFolderMenu.tsx
  9. 38 41
      packages/app/src/components/Bookmarks/BookmarkFolderMenuItem.tsx
  10. 1 4
      packages/app/src/components/Bookmarks/BookmarkFolderNameInput.tsx
  11. 38 45
      packages/app/src/components/Bookmarks/BookmarkFolderTree.tsx
  12. 1 3
      packages/app/src/components/Bookmarks/BookmarkItem.tsx
  13. 2 2
      packages/app/src/components/DeleteBookmarkFolderModal.tsx
  14. 1 3
      packages/app/src/components/Icons/CompressIcon.tsx
  15. 1 3
      packages/app/src/components/Icons/ExpandIcon.tsx
  16. 1 3
      packages/app/src/components/Icons/FolderIcon.tsx
  17. 1 3
      packages/app/src/components/Icons/FolderPlusIcon.tsx
  18. 1 3
      packages/app/src/components/Icons/TriangleIcon.tsx
  19. 1 1
      packages/app/src/components/Layout/BasicLayout.tsx
  20. 5 6
      packages/app/src/components/Navbar/SubNavButtons.tsx
  21. 3 5
      packages/app/src/components/Sidebar/Bookmarks.tsx
  22. 4 6
      packages/app/src/components/Sidebar/Bookmarks/BookmarkContents.tsx
  23. 1 1
      packages/app/src/components/Sidebar/PageTree/Item.tsx
  24. 1 1
      packages/app/src/components/Sidebar/SidebarContents.tsx
  25. 5 5
      packages/app/src/components/UsersHomePageFooter.tsx

+ 5 - 5
packages/app/public/static/locales/en_US/commons.json

@@ -10,14 +10,14 @@
     "display_name": "English"
     "display_name": "English"
   },
   },
   "toaster": {
   "toaster": {
-    "create_succeeded": "Succeeded to create {{target}}",
+    "add_succeeded": "Succeeded to add {{target}}",
     "create_failed": "Failed to create {{target}}",
     "create_failed": "Failed to create {{target}}",
-    "update_successed": "Succeeded to update {{target}}",
-    "update_failed": "Failed to update {{target}}",
+    "create_succeeded": "Succeeded to create {{target}}",
     "delete_succeeded": "Succeeded to delete {{target}}",
     "delete_succeeded": "Succeeded to delete {{target}}",
-    "remove_share_link_success": "Succeeded to remove {{shareLinkId}}",
     "remove_share_link": "Succeeded to remove {{count}} share links",
     "remove_share_link": "Succeeded to remove {{count}} share links",
-    "add_succeeded": "Succeeded to add {{target}}"
+    "remove_share_link_success": "Succeeded to remove {{shareLinkId}}",
+    "update_failed": "Failed to update {{target}}",
+    "update_successed": "Succeeded to update {{target}}"
   },
   },
   "alert": {
   "alert": {
     "siteUrl_is_not_set": "'Site URL' is NOT set. Set it from the {{link}}",
     "siteUrl_is_not_set": "'Site URL' is NOT set. Set it from the {{link}}",

+ 5 - 5
packages/app/public/static/locales/ja_JP/commons.json

@@ -10,14 +10,14 @@
     "display_name": "日本語"
     "display_name": "日本語"
   },
   },
   "toaster": {
   "toaster": {
-    "create_succeeded": "新しい{{target}}が作成されました",
+    "add_succeeded": "新しい{{target}}が追加されました",
+    "delete_succeeded": "{{target}} の削除に成功しました",
     "create_failed": "{{target}}の作成に失敗しました",
     "create_failed": "{{target}}の作成に失敗しました",
-    "update_successed": "{{target}}を更新しました",
+    "create_succeeded": "新しい{{target}}が作成されました",
     "update_failed": "{{target}}の更新に失敗しました",
     "update_failed": "{{target}}の更新に失敗しました",
-    "delete_succeeded": "{{target}} の削除に成功しました",
-    "remove_share_link_success": "{{shareLinkId}}を削除しました",
+    "update_successed": "{{target}}を更新しました",
     "remove_share_link": "共有リンクを{{count}}件削除しました",
     "remove_share_link": "共有リンクを{{count}}件削除しました",
-    "add_succeeded": "新しい{{target}}が追加されました"
+    "remove_share_link_success": "{{shareLinkId}}を削除しました"
   },
   },
   "alert": {
   "alert": {
     "siteUrl_is_not_set": "'サイトURL' が設定されていません。{{link}} から設定してください。",
     "siteUrl_is_not_set": "'サイトURL' が設定されていません。{{link}} から設定してください。",

+ 2 - 2
packages/app/public/static/locales/ja_JP/translation.json

@@ -817,11 +817,11 @@
     "bookmark": "ブックマーク",
     "bookmark": "ブックマーク",
     "delete_modal": {
     "delete_modal": {
       "modal_header_label": "ブックマークフォルダを削除",
       "modal_header_label": "ブックマークフォルダを削除",
-      "modal_body_description": "このブックマーク フォルダとその内容を削除する",
+      "modal_body_description": "このブックマークフォルダと配下のブックマークを削除する",
       "modal_body_alert": "削除されたフォルダとその内容は復元できません",
       "modal_body_alert": "削除されたフォルダとその内容は復元できません",
       "modal_footer_button": "フォルダを削除"
       "modal_footer_button": "フォルダを削除"
     },
     },
-    "input_placeholder": "フォルダ名を入力してください`",
+    "input_placeholder": "フォルダ名を入力してください",
     "new_folder": "新しいフォルダ",
     "new_folder": "新しいフォルダ",
     "delete": "フォルダを削除",
     "delete": "フォルダを削除",
     "drop_item_here": "ブックマークを解除",
     "drop_item_here": "ブックマークを解除",

+ 5 - 5
packages/app/public/static/locales/zh_CN/commons.json

@@ -10,14 +10,14 @@
     "display_name": "简体中文"
     "display_name": "简体中文"
   },
   },
   "toaster": {
   "toaster": {
-    "create_succeeded": "Succeeded to create {{target}}",
+    "add_succeeded": "Succeeded to add {{target}}",
     "create_failed": "Failed to create {{target}}",
     "create_failed": "Failed to create {{target}}",
-    "update_successed": "Succeeded to update {{target}}",
-    "update_failed": "Failed to update {{target}}",
+    "create_succeeded": "Succeeded to create {{target}}",
     "delete_succeeded": "Succeeded to delete {{target}}",
     "delete_succeeded": "Succeeded to delete {{target}}",
-    "remove_share_link_success": "Succeeded to remove {{shareLinkId}}",
     "remove_share_link": "Succeeded to remove {{count}} share links",
     "remove_share_link": "Succeeded to remove {{count}} share links",
-    "add_succeeded": "Succeeded to add {{target}}"
+    "remove_share_link_success": "Succeeded to remove {{shareLinkId}}",
+    "update_failed": "Failed to update {{target}}",
+    "update_successed": "Succeeded to update {{target}}"
   },
   },
   "alert": {
   "alert": {
     "siteUrl_is_not_set": "主页URL未设置,通过 {{link}} 设置",
     "siteUrl_is_not_set": "主页URL未设置,通过 {{link}} 设置",

+ 2 - 4
packages/app/src/components/BookmarkButtons.tsx

@@ -12,7 +12,7 @@ import { useIsGuestUser } from '~/stores/context';
 
 
 import { IUser } from '../interfaces/user';
 import { IUser } from '../interfaces/user';
 
 
-import BookmarkFolderMenu from './Bookmarks/BookmarkFolderMenu';
+import { BookmarkFolderMenu } from './Bookmarks/BookmarkFolderMenu';
 import UserPictureList from './User/UserPictureList';
 import UserPictureList from './User/UserPictureList';
 
 
 import styles from './BookmarkButtons.module.scss';
 import styles from './BookmarkButtons.module.scss';
@@ -23,7 +23,7 @@ interface Props {
   bookmarkInfo? : IBookmarkInfo
   bookmarkInfo? : IBookmarkInfo
 }
 }
 
 
-const BookmarkButtons: FC<Props> = (props: Props) => {
+export const BookmarkButtons: FC<Props> = (props: Props) => {
   const { t } = useTranslation();
   const { t } = useTranslation();
   const {
   const {
     bookmarkedUsers, hideTotalNumber, bookmarkInfo,
     bookmarkedUsers, hideTotalNumber, bookmarkInfo,
@@ -83,5 +83,3 @@ const BookmarkButtons: FC<Props> = (props: Props) => {
     </div>
     </div>
   );
   );
 };
 };
-
-export default BookmarkButtons;

+ 7 - 14
packages/app/src/components/Bookmarks/BookmarkFolderItem.tsx

@@ -8,8 +8,8 @@ import { DropdownToggle } from 'reactstrap';
 
 
 import { apiv3Post, apiv3Put } from '~/client/util/apiv3-client';
 import { apiv3Post, apiv3Put } from '~/client/util/apiv3-client';
 import { toastError, toastSuccess } from '~/client/util/toastr';
 import { toastError, toastSuccess } from '~/client/util/toastr';
-import FolderIcon from '~/components/Icons/FolderIcon';
-import TriangleIcon from '~/components/Icons/TriangleIcon';
+import { FolderIcon } from '~/components/Icons/FolderIcon';
+import { TriangleIcon } from '~/components/Icons/TriangleIcon';
 import { BookmarkFolderItems, DragItemType, DRAG_ITEM_TYPE } from '~/interfaces/bookmark-info';
 import { BookmarkFolderItems, DragItemType, DRAG_ITEM_TYPE } from '~/interfaces/bookmark-info';
 import { IPageHasId, IPageToDeleteWithMeta } from '~/interfaces/page';
 import { IPageHasId, IPageToDeleteWithMeta } from '~/interfaces/page';
 import { onDeletedBookmarkFolderFunction, OnDeletedFunction } from '~/interfaces/ui';
 import { onDeletedBookmarkFolderFunction, OnDeletedFunction } from '~/interfaces/ui';
@@ -18,9 +18,9 @@ import { useSWRxBookamrkFolderAndChild } from '~/stores/bookmark-folder';
 import { useBookmarkFolderDeleteModal, usePageDeleteModal } from '~/stores/modal';
 import { useBookmarkFolderDeleteModal, usePageDeleteModal } from '~/stores/modal';
 import { useSWRxCurrentPage } from '~/stores/page';
 import { useSWRxCurrentPage } from '~/stores/page';
 
 
-import BookmarkFolderItemControl from './BookmarkFolderItemControl';
-import BookmarkFolderNameInput from './BookmarkFolderNameInput';
-import BookmarkItem from './BookmarkItem';
+import { BookmarkFolderItemControl } from './BookmarkFolderItemControl';
+import { BookmarkFolderNameInput } from './BookmarkFolderNameInput';
+import { BookmarkItem } from './BookmarkItem';
 
 
 
 
 type BookmarkFolderItemProps = {
 type BookmarkFolderItemProps = {
@@ -35,7 +35,7 @@ type DragItemDataType = {
   parentFolder: BookmarkFolderItems
   parentFolder: BookmarkFolderItems
 } & BookmarkFolderItemProps & IPageHasId
 } & BookmarkFolderItemProps & IPageHasId
 
 
-const BookmarkFolderItem: FC<BookmarkFolderItemProps> = (props: BookmarkFolderItemProps) => {
+export const BookmarkFolderItem: FC<BookmarkFolderItemProps> = (props: BookmarkFolderItemProps) => {
   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,
@@ -214,7 +214,6 @@ const BookmarkFolderItem: FC<BookmarkFolderItemProps> = (props: BookmarkFolderIt
     });
     });
   };
   };
 
 
-
   const renderBookmarkItem = () => {
   const renderBookmarkItem = () => {
     return isOpen && bookmarks?.map((bookmark) => {
     return isOpen && bookmarks?.map((bookmark) => {
       return (
       return (
@@ -287,9 +286,7 @@ const BookmarkFolderItem: FC<BookmarkFolderItemProps> = (props: BookmarkFolderIt
               <p className={'text-truncate m-auto '}>{name}</p>
               <p className={'text-truncate m-auto '}>{name}</p>
             </div>
             </div>
           </>
           </>
-        )
-
-        }
+        )}
         <div className="grw-foldertree-control d-flex">
         <div className="grw-foldertree-control d-flex">
           <BookmarkFolderItemControl
           <BookmarkFolderItemControl
             onClickRename={onClickRenameHandler}
             onClickRename={onClickRenameHandler}
@@ -308,9 +305,7 @@ const BookmarkFolderItem: FC<BookmarkFolderItemProps> = (props: BookmarkFolderIt
           >
           >
             <i className="icon-plus d-block p-0" />
             <i className="icon-plus d-block p-0" />
           </button>
           </button>
-
         </div>
         </div>
-
       </li>
       </li>
       {isCreateAction && (
       {isCreateAction && (
         <div className="flex-fill">
         <div className="flex-fill">
@@ -329,5 +324,3 @@ const BookmarkFolderItem: FC<BookmarkFolderItemProps> = (props: BookmarkFolderIt
     </div>
     </div>
   );
   );
 };
 };
-
-export default BookmarkFolderItem;

+ 1 - 3
packages/app/src/components/Bookmarks/BookmarkFolderItemControl.tsx

@@ -11,7 +11,7 @@ type BookmarkFolderItemControlProps = {
   onClickRename: () => void
   onClickRename: () => void
   onClickDelete: () => void
   onClickDelete: () => void
 }
 }
-const BookmarkFolderItemControl = (props: BookmarkFolderItemControlProps): JSX.Element => {
+export const BookmarkFolderItemControl = (props: BookmarkFolderItemControlProps): JSX.Element => {
   const { t } = useTranslation();
   const { t } = useTranslation();
   const { children, onClickRename, onClickDelete } = props;
   const { children, onClickRename, onClickDelete } = props;
   const [isOpen, setIsOpen] = useState(false);
   const [isOpen, setIsOpen] = useState(false);
@@ -46,5 +46,3 @@ const BookmarkFolderItemControl = (props: BookmarkFolderItemControlProps): JSX.E
     </Dropdown>
     </Dropdown>
   );
   );
 };
 };
-
-export default BookmarkFolderItemControl;

+ 91 - 63
packages/app/src/components/Bookmarks/BookmarkFolderMenu.tsx

@@ -14,17 +14,17 @@ import { useSWRBookmarkInfo, useSWRxCurrentUserBookmarks } from '~/stores/bookma
 import { useSWRxBookamrkFolderAndChild } from '~/stores/bookmark-folder';
 import { useSWRxBookamrkFolderAndChild } from '~/stores/bookmark-folder';
 import { useSWRxCurrentPage } from '~/stores/page';
 import { useSWRxCurrentPage } from '~/stores/page';
 
 
-import FolderIcon from '../Icons/FolderIcon';
+import { FolderIcon } from '../Icons/FolderIcon';
 
 
-import BookmarkFolderMenuItem from './BookmarkFolderMenuItem';
-import BookmarkFolderNameInput from './BookmarkFolderNameInput';
+import { BookmarkFolderMenuItem } from './BookmarkFolderMenuItem';
+import { BookmarkFolderNameInput } from './BookmarkFolderNameInput';
 
 
 
 
 type Props = {
 type Props = {
   children?: React.ReactNode
   children?: React.ReactNode
 }
 }
 
 
-const BookmarkFolderMenu = (props: Props): JSX.Element => {
+export const BookmarkFolderMenu = (props: Props): JSX.Element => {
   const { t } = useTranslation();
   const { t } = useTranslation();
   const { children } = props;
   const { children } = props;
   const [isCreateAction, setIsCreateAction] = useState(false);
   const [isCreateAction, setIsCreateAction] = useState(false);
@@ -66,12 +66,10 @@ const BookmarkFolderMenu = (props: Props): JSX.Element => {
     setIsOpen(!isOpen);
     setIsOpen(!isOpen);
     mutateBookmarkFolderData();
     mutateBookmarkFolderData();
     if (isOpen && bookmarkFolders != null) {
     if (isOpen && bookmarkFolders != null) {
-      bookmarkFolders?.forEach((bookmarkFolder) => {
+      bookmarkFolders.forEach((bookmarkFolder) => {
         bookmarkFolder.bookmarks.forEach((bookmark) => {
         bookmarkFolder.bookmarks.forEach((bookmark) => {
           if (bookmark.page._id === currentPage?._id) {
           if (bookmark.page._id === currentPage?._id) {
-            if (bookmark.page._id === currentPage?._id) {
-              setSelectedItem(bookmarkFolder._id);
-            }
+            setSelectedItem(bookmarkFolder._id);
           }
           }
         });
         });
       });
       });
@@ -92,10 +90,7 @@ const BookmarkFolderMenu = (props: Props): JSX.Element => {
 
 
 
 
   const isBookmarkFolderExists = useCallback((): boolean => {
   const isBookmarkFolderExists = useCallback((): boolean => {
-    if (bookmarkFolders && bookmarkFolders.length > 0) {
-      return true;
-    }
-    return false;
+    return bookmarkFolders != null && bookmarkFolders.length > 0;
   }, [bookmarkFolders]);
   }, [bookmarkFolders]);
 
 
   const onPressEnterHandlerForCreate = useCallback(async(folderName: string) => {
   const onPressEnterHandlerForCreate = useCallback(async(folderName: string) => {
@@ -131,59 +126,94 @@ const BookmarkFolderMenu = (props: Props): JSX.Element => {
   }, [currentPage?._id, isBookmarked, mutateBookmarkFolderData, mutateBookmarkInfo, mutateUserBookmarks, toggleBookmarkHandler, t]);
   }, [currentPage?._id, isBookmarked, mutateBookmarkFolderData, mutateBookmarkInfo, mutateUserBookmarks, toggleBookmarkHandler, t]);
 
 
 
 
-  const renderBookmarkMenuItem = (child ?:BookmarkFolderItems[]) => {
-    if (!child) {
+  const renderBookmarkMenuItem = (child?: BookmarkFolderItems[]) => {
+    const renderSubmenu = () => {
+      if (child == null) {
+        return <></>;
+      }
       return (
       return (
-        <>
-          { isBookmarked && (
-            <>
-              <DropdownItem toggle={false} onClick={onUnbookmarkHandler} className={'grw-bookmark-folder-menu-item text-danger'}>
-                <i className="fa fa-bookmark"></i> <span className="mx-2 ">
-                  {t('bookmark_folder.cancel_bookmark') }
-                </span>
-              </DropdownItem>
-              <DropdownItem divider />
-            </>)
-
-          }
-
-          { isCreateAction ? (
-            <div className='mx-2'>
-              <BookmarkFolderNameInput
-                onClickOutside={() => setIsCreateAction(false)}
-                onPressEnter={onPressEnterHandlerForCreate}
-              />
+        <div className="bookmark-folder-submenu">
+          {child.map(folder => (
+            <div key={folder._id}>
+              <div
+                className="dropdown-item grw-bookmark-folder-menu-item"
+                tabIndex={0}
+                role="menuitem"
+                onClick={() => onMenuItemClickHandler(folder._id)}
+              >
+                <BookmarkFolderMenuItem
+                  item={folder}
+                  isSelected={selectedItem === folder._id}
+                  onSelectedChild={() => setSelectedItem(null)}
+                />
+                {isOpen && renderSubmenu()}
+              </div>
             </div>
             </div>
-          ) : (
-            <DropdownItem toggle={false} onClick={onClickNewBookmarkFolder} className='grw-bookmark-folder-menu-item'>
-              <FolderIcon isOpen={false}/>
-              <span className="mx-2 ">{t('bookmark_folder.new_folder')}</span>
+          ))}
+        </div>
+      );
+    };
+
+    return (
+      <>
+        {isBookmarked && (
+          <>
+            <DropdownItem
+              toggle={false}
+              onClick={onUnbookmarkHandler}
+              className={'grw-bookmark-folder-menu-item text-danger'}
+            >
+              <i className="fa fa-bookmark"></i>{' '}
+              <span className="mx-2 ">
+                {t('bookmark_folder.cancel_bookmark')}
+              </span>
             </DropdownItem>
             </DropdownItem>
-          )}
-          {isBookmarkFolderExists() && (
-            <>
-              <DropdownItem divider />
-              {bookmarkFolders?.map(folder => (
-                <div key={folder._id}>
-                  <div className='dropdown-item grw-bookmark-folder-menu-item' tabIndex={0} role="menuitem" onClick={() => onMenuItemClickHandler(folder._id)}>
-                    <BookmarkFolderMenuItem
-                      item={folder}
-                      isSelected={selectedItem === folder._id}
-                      onSelectedChild={() => setSelectedItem(null)}
-                    />
-                    {isOpen && (
-                      <div className="bookmark-folder-submenu">
-                        {renderBookmarkMenuItem(folder.children)}
-                      </div>
-                    )}
-                  </div>
+            <DropdownItem divider />
+          </>
+        )}
+
+        {isCreateAction ? (
+          <div className="mx-2">
+            <BookmarkFolderNameInput
+              onClickOutside={() => setIsCreateAction(false)}
+              onPressEnter={onPressEnterHandlerForCreate}
+            />
+          </div>
+        ) : (
+          <DropdownItem
+            toggle={false}
+            onClick={onClickNewBookmarkFolder}
+            className="grw-bookmark-folder-menu-item"
+          >
+            <FolderIcon isOpen={false} />
+            <span className="mx-2 ">{t('bookmark_folder.new_folder')}</span>
+          </DropdownItem>
+        )}
+
+        {isBookmarkFolderExists() && (
+          <>
+            <DropdownItem divider />
+            {bookmarkFolders?.map(folder => (
+              <div key={folder._id}>
+                <div
+                  className="dropdown-item grw-bookmark-folder-menu-item"
+                  tabIndex={0}
+                  role="menuitem"
+                  onClick={() => onMenuItemClickHandler(folder._id)}
+                >
+                  <BookmarkFolderMenuItem
+                    item={folder}
+                    isSelected={selectedItem === folder._id}
+                    onSelectedChild={() => setSelectedItem(null)}
+                  />
+                  {isOpen && renderSubmenu()}
                 </div>
                 </div>
-              ))}
-            </>
-          )}
-        </>
-      );
-    }
+              </div>
+            ))}
+          </>
+        )}
+      </>
+    );
   };
   };
 
 
   return (
   return (
@@ -202,5 +232,3 @@ const BookmarkFolderMenu = (props: Props): JSX.Element => {
     </UncontrolledDropdown>
     </UncontrolledDropdown>
   );
   );
 };
 };
-
-export default BookmarkFolderMenu;

+ 38 - 41
packages/app/src/components/Bookmarks/BookmarkFolderMenuItem.tsx

@@ -15,10 +15,10 @@ import { useSWRxBookamrkFolderAndChild } from '~/stores/bookmark-folder';
 import { useBookmarkFolderDeleteModal } from '~/stores/modal';
 import { useBookmarkFolderDeleteModal } from '~/stores/modal';
 import { useSWRxCurrentPage } from '~/stores/page';
 import { useSWRxCurrentPage } from '~/stores/page';
 
 
-import FolderIcon from '../Icons/FolderIcon';
-import TriangleIcon from '../Icons/TriangleIcon';
+import { FolderIcon } from '../Icons/FolderIcon';
+import { TriangleIcon } from '../Icons/TriangleIcon';
 
 
-import BookmarkFolderNameInput from './BookmarkFolderNameInput';
+import { BookmarkFolderNameInput } from './BookmarkFolderNameInput';
 
 
 
 
 type Props = {
 type Props = {
@@ -26,7 +26,7 @@ type Props = {
   onSelectedChild: () => void
   onSelectedChild: () => void
   isSelected: boolean
   isSelected: boolean
 }
 }
-const BookmarkFolderMenuItem = (props: Props): JSX.Element => {
+export const BookmarkFolderMenuItem = (props: Props): JSX.Element => {
   const {
   const {
     item, isSelected, onSelectedChild,
     item, isSelected, onSelectedChild,
   } = props;
   } = props;
@@ -124,43 +124,42 @@ const BookmarkFolderMenuItem = (props: Props): JSX.Element => {
   }, [onSelectedChild, isBookmarked, mutateBookamrkData, mutateBookmarkInfo, currentPage?._id, mutateUserBookmarks, t]);
   }, [onSelectedChild, isBookmarked, mutateBookamrkData, mutateBookmarkInfo, currentPage?._id, mutateUserBookmarks, t]);
 
 
   const renderBookmarkSubMenuItem = useCallback(() => {
   const renderBookmarkSubMenuItem = useCallback(() => {
+    if (!isOpen) {
+      return <></>;
+    }
     return (
     return (
-      <>
-        {isOpen && (
-          <DropdownMenu className='m-0'>
-            {isCreateAction ? (
-              <div className='mx-2' onClick={e => e.stopPropagation()}>
-                <BookmarkFolderNameInput
-                  onClickOutside={() => setIsCreateAction(false)}
-                  onPressEnter={onPressEnterHandlerForCreate}
-                />
-              </div>
-            ) : (
-              <DropdownItem toggle={false} onClick={e => onClickNewBookmarkFolder(e)} className='grw-bookmark-folder-menu-item'>
-                <FolderIcon isOpen={false} />
-                <span className="mx-2 ">{t('bookmark_folder.new_folder')}</span>
-              </DropdownItem>
-            )}
-
-            {hasChildren() && (<DropdownItem divider />)}
-
-            {item.children?.map(child => (
-              <div key={child._id} >
-                <div
-                  className='dropdown-item grw-bookmark-folder-menu-item'
-                  tabIndex={0} role="menuitem"
-                  onClick={e => onClickChildMenuItemHandler(e, child)}>
-                  <BookmarkFolderMenuItem
-                    onSelectedChild={() => setSelectedItem(null)}
-                    item={child}
-                    isSelected={selectedItem === child._id}
-                  />
-                </div>
-              </div>
-            ))}
-          </DropdownMenu>
+      <DropdownMenu className='m-0'>
+        {isCreateAction ? (
+          <div className='mx-2' onClick={e => e.stopPropagation()}>
+            <BookmarkFolderNameInput
+              onClickOutside={() => setIsCreateAction(false)}
+              onPressEnter={onPressEnterHandlerForCreate}
+            />
+          </div>
+        ) : (
+          <DropdownItem toggle={false} onClick={e => onClickNewBookmarkFolder(e)} className='grw-bookmark-folder-menu-item'>
+            <FolderIcon isOpen={false} />
+            <span className="mx-2 ">{t('bookmark_folder.new_folder')}</span>
+          </DropdownItem>
         )}
         )}
-      </>
+
+        {hasChildren() && (<DropdownItem divider />)}
+
+        {item.children?.map(child => (
+          <div key={child._id} >
+            <div
+              className='dropdown-item grw-bookmark-folder-menu-item'
+              tabIndex={0} role="menuitem"
+              onClick={e => onClickChildMenuItemHandler(e, child)}>
+              <BookmarkFolderMenuItem
+                onSelectedChild={() => setSelectedItem(null)}
+                item={child}
+                isSelected={selectedItem === child._id}
+              />
+            </div>
+          </div>
+        ))}
+      </DropdownMenu>
     );
     );
   }, [hasChildren,
   }, [hasChildren,
       isCreateAction,
       isCreateAction,
@@ -229,5 +228,3 @@ const BookmarkFolderMenuItem = (props: Props): JSX.Element => {
     </>
     </>
   );
   );
 };
 };
-
-export default BookmarkFolderMenuItem;

+ 1 - 4
packages/app/src/components/Bookmarks/BookmarkFolderNameInput.tsx

@@ -9,7 +9,7 @@ type Props = {
   value?: string
   value?: string
 }
 }
 
 
-const BookmarkFolderNameInput = (props: Props): JSX.Element => {
+export const BookmarkFolderNameInput = (props: Props): JSX.Element => {
   const {
   const {
     onClickOutside, onPressEnter, value,
     onClickOutside, onPressEnter, value,
   } = props;
   } = props;
@@ -38,6 +38,3 @@ const BookmarkFolderNameInput = (props: Props): JSX.Element => {
     </div>
     </div>
   );
   );
 };
 };
-
-
-export default BookmarkFolderNameInput;

+ 38 - 45
packages/app/src/components/Bookmarks/BookmarkFolderTree.tsx

@@ -14,8 +14,8 @@ import { useSWRxBookamrkFolderAndChild } from '~/stores/bookmark-folder';
 import { usePageDeleteModal } from '~/stores/modal';
 import { usePageDeleteModal } from '~/stores/modal';
 import { useSWRxCurrentPage } from '~/stores/page';
 import { useSWRxCurrentPage } from '~/stores/page';
 
 
-import BookmarkFolderItem from './BookmarkFolderItem';
-import BookmarkItem from './BookmarkItem';
+import { BookmarkFolderItem } from './BookmarkFolderItem';
+import { BookmarkItem } from './BookmarkItem';
 
 
 import styles from './BookmarkFolderTree.module.scss';
 import styles from './BookmarkFolderTree.module.scss';
 
 
@@ -30,7 +30,7 @@ type DragItemDataType = {
   parentFolder: BookmarkFolderItems | null
   parentFolder: BookmarkFolderItems | null
  } & IPageHasId
  } & IPageHasId
 
 
-const BookmarkFolderTree = (props: BookmarkFolderTreeProps): JSX.Element => {
+export const BookmarkFolderTree = (props: BookmarkFolderTreeProps): JSX.Element => {
   const acceptedTypes: DragItemType[] = [DRAG_ITEM_TYPE.FOLDER, DRAG_ITEM_TYPE.BOOKMARK];
   const acceptedTypes: DragItemType[] = [DRAG_ITEM_TYPE.FOLDER, DRAG_ITEM_TYPE.BOOKMARK];
   const { t } = useTranslation();
   const { t } = useTranslation();
   const { isUserHomePage } = props;
   const { isUserHomePage } = props;
@@ -117,49 +117,42 @@ const BookmarkFolderTree = (props: BookmarkFolderTreeProps): JSX.Element => {
 
 
 
 
   return (
   return (
-    <>
-      <div className={`grw-folder-tree-container ${styles['grw-folder-tree-container']}` } >
-        <ul className={`grw-foldertree ${styles['grw-foldertree']} list-group px-2 py-2`}>
-          {bookmarkFolderData?.map((item) => {
-            return (
-              <BookmarkFolderItem
-                key={item._id}
-                bookmarkFolder={item}
-                isOpen={false}
-                level={0}
-                root={item._id}
-                isUserHomePage={isUserHomePage}
-              />
-            );
-          })}
-          {userBookmarks?.map(page => (
-            <div key={page._id} className="grw-foldertree-item-container grw-root-bookmarks">
-              <BookmarkItem
-                bookmarkedPage={page}
-                key={page._id}
-                onUnbookmarked={onUnbookmarkHandler}
-                onRenamed={mutateUserBookmarks}
-                onClickDeleteMenuItem={onClickDeleteBookmarkHandler}
-                parentFolder={null}
-              />
-            </div>
-          ))}
-        </ul>
-        {bookmarkFolderData != null && bookmarkFolderData.length > 0 && (
-          <div ref={(c) => { dropRef(c) }} className="grw-drop-item-area">
-            <div className="grw-accept-drop-item">
-              <div className="d-flex flex-column align-items-center">
-                {t('bookmark_folder.drop_item_here')}
-              </div>
+    <div className={`grw-folder-tree-container ${styles['grw-folder-tree-container']}` } >
+      <ul className={`grw-foldertree ${styles['grw-foldertree']} list-group px-2 py-2`}>
+        {bookmarkFolderData?.map((item) => {
+          return (
+            <BookmarkFolderItem
+              key={item._id}
+              bookmarkFolder={item}
+              isOpen={false}
+              level={0}
+              root={item._id}
+              isUserHomePage={isUserHomePage}
+            />
+          );
+        })}
+        {userBookmarks?.map(page => (
+          <div key={page._id} className="grw-foldertree-item-container grw-root-bookmarks">
+            <BookmarkItem
+              bookmarkedPage={page}
+              key={page._id}
+              onUnbookmarked={onUnbookmarkHandler}
+              onRenamed={mutateUserBookmarks}
+              onClickDeleteMenuItem={onClickDeleteBookmarkHandler}
+              parentFolder={null}
+            />
+          </div>
+        ))}
+      </ul>
+      {bookmarkFolderData != null && bookmarkFolderData.length > 0 && (
+        <div ref={(c) => { dropRef(c) }} className="grw-drop-item-area">
+          <div className="grw-accept-drop-item">
+            <div className="d-flex flex-column align-items-center">
+              {t('bookmark_folder.drop_item_here')}
             </div>
             </div>
-
           </div>
           </div>
-        )}
-      </div>
-    </>
+        </div>
+      )}
+    </div>
   );
   );
-
-
 };
 };
-
-export default BookmarkFolderTree;

+ 1 - 3
packages/app/src/components/Bookmarks/BookmarkItem.tsx

@@ -28,7 +28,7 @@ type Props = {
   parentFolder: BookmarkFolderItems | null
   parentFolder: BookmarkFolderItems | null
 }
 }
 
 
-const BookmarkItem = (props: Props): JSX.Element => {
+export const BookmarkItem = (props: Props): JSX.Element => {
   const { t } = useTranslation();
   const { t } = useTranslation();
   const {
   const {
     bookmarkedPage, onUnbookmarked, onRenamed, onClickDeleteMenuItem, parentFolder,
     bookmarkedPage, onUnbookmarked, onRenamed, onClickDeleteMenuItem, parentFolder,
@@ -161,5 +161,3 @@ const BookmarkItem = (props: Props): JSX.Element => {
     </li>
     </li>
   );
   );
 };
 };
-
-export default BookmarkItem;

+ 2 - 2
packages/app/src/components/DeleteBookmarkFolderModal.tsx

@@ -8,7 +8,7 @@ import {
 
 
 import { apiv3Delete } from '~/client/util/apiv3-client';
 import { apiv3Delete } from '~/client/util/apiv3-client';
 import { toastError } from '~/client/util/toastr';
 import { toastError } from '~/client/util/toastr';
-import FolderIcon from '~/components/Icons/FolderIcon';
+import { FolderIcon } from '~/components/Icons/FolderIcon';
 import { useBookmarkFolderDeleteModal } from '~/stores/modal';
 import { useBookmarkFolderDeleteModal } from '~/stores/modal';
 
 
 
 
@@ -67,4 +67,4 @@ const DeleteBookmarkFolderModal: FC = () => {
   );
   );
 };
 };
 
 
-export default DeleteBookmarkFolderModal;
+export { DeleteBookmarkFolderModal };

+ 1 - 3
packages/app/src/components/Icons/CompressIcon.tsx

@@ -1,6 +1,6 @@
 import React from 'react';
 import React from 'react';
 
 
-const CompressIcon = ():JSX.Element => {
+export const CompressIcon = ():JSX.Element => {
   return (
   return (
     <svg xmlns="http://www.w3.org/2000/svg"
     <svg xmlns="http://www.w3.org/2000/svg"
       width="18"
       width="18"
@@ -15,5 +15,3 @@ const CompressIcon = ():JSX.Element => {
     </svg>
     </svg>
   );
   );
 };
 };
-
-export default CompressIcon;

+ 1 - 3
packages/app/src/components/Icons/ExpandIcon.tsx

@@ -1,6 +1,6 @@
 import React from 'react';
 import React from 'react';
 
 
-const ExpandIcon = (): JSX.Element => {
+export const ExpandIcon = (): JSX.Element => {
   return (
   return (
     <svg xmlns="http://www.w3.org/2000/svg"
     <svg xmlns="http://www.w3.org/2000/svg"
       width="18"
       width="18"
@@ -16,5 +16,3 @@ const ExpandIcon = (): JSX.Element => {
     </svg>
     </svg>
   );
   );
 };
 };
-
-export default ExpandIcon;

+ 1 - 3
packages/app/src/components/Icons/FolderIcon.tsx

@@ -3,7 +3,7 @@ import React from 'react';
 type Props = {
 type Props = {
   isOpen: boolean
   isOpen: boolean
 }
 }
-const FolderIcon = (props: Props): JSX.Element => {
+export const FolderIcon = (props: Props): JSX.Element => {
   const { isOpen } = props;
   const { isOpen } = props;
 
 
   return (
   return (
@@ -35,5 +35,3 @@ const FolderIcon = (props: Props): JSX.Element => {
   );
   );
 
 
 };
 };
-
-export default FolderIcon;

+ 1 - 3
packages/app/src/components/Icons/FolderPlusIcon.tsx

@@ -1,6 +1,6 @@
 import React from 'react';
 import React from 'react';
 
 
-const FolderPlusIcon = (): JSX.Element => (
+export const FolderPlusIcon = (): JSX.Element => (
   <svg
   <svg
     width="18"
     width="18"
     height="18"
     height="18"
@@ -14,5 +14,3 @@ const FolderPlusIcon = (): JSX.Element => (
 
 
   </svg>
   </svg>
 );
 );
-
-export default FolderPlusIcon;

+ 1 - 3
packages/app/src/components/Icons/TriangleIcon.tsx

@@ -1,6 +1,6 @@
 import React from 'react';
 import React from 'react';
 
 
-const TriangleIcon = (): JSX.Element => (
+export const TriangleIcon = (): JSX.Element => (
   <svg
   <svg
     xmlns="http://www.w3.org/2000/svg"
     xmlns="http://www.w3.org/2000/svg"
     width="12"
     width="12"
@@ -13,5 +13,3 @@ const TriangleIcon = (): JSX.Element => (
     </g>
     </g>
   </svg>
   </svg>
 );
 );
-
-export default TriangleIcon;

+ 1 - 1
packages/app/src/components/Layout/BasicLayout.tsx

@@ -22,7 +22,7 @@ const PageDeleteModal = dynamic(() => import('../PageDeleteModal'), { ssr: false
 const PageRenameModal = dynamic(() => import('../PageRenameModal'), { ssr: false });
 const PageRenameModal = dynamic(() => import('../PageRenameModal'), { ssr: false });
 const PagePresentationModal = dynamic(() => import('../PagePresentationModal'), { ssr: false });
 const PagePresentationModal = dynamic(() => import('../PagePresentationModal'), { ssr: false });
 const PageAccessoriesModal = dynamic(() => import('../PageAccessoriesModal'), { ssr: false });
 const PageAccessoriesModal = dynamic(() => import('../PageAccessoriesModal'), { ssr: false });
-const DeleteBookmarkFolderModal = dynamic(() => import('../DeleteBookmarkFolderModal'), { ssr: false });
+const DeleteBookmarkFolderModal = dynamic(() => import('../DeleteBookmarkFolderModal').then(mod => mod.DeleteBookmarkFolderModal), { ssr: false });
 // Fab
 // Fab
 const Fab = dynamic(() => import('../Fab').then(mod => mod.Fab), { ssr: false });
 const Fab = dynamic(() => import('../Fab').then(mod => mod.Fab), { ssr: false });
 
 

+ 5 - 6
packages/app/src/components/Navbar/SubNavButtons.tsx

@@ -4,7 +4,7 @@ import { useTranslation } from 'next-i18next';
 import { DropdownItem } from 'reactstrap';
 import { DropdownItem } from 'reactstrap';
 
 
 import {
 import {
-  toggleBookmark, toggleLike, toggleSubscribe,
+  toggleLike, toggleSubscribe,
 } from '~/client/services/page-operation';
 } from '~/client/services/page-operation';
 import { toastError } from '~/client/util/apiNotification';
 import { toastError } from '~/client/util/apiNotification';
 import {
 import {
@@ -13,10 +13,10 @@ import {
 import { useIsGuestUser } from '~/stores/context';
 import { useIsGuestUser } from '~/stores/context';
 import { IPageForPageDuplicateModal } from '~/stores/modal';
 import { IPageForPageDuplicateModal } from '~/stores/modal';
 
 
-import { useSWRBookmarkInfo, useSWRxCurrentUserBookmarks } from '../../stores/bookmark';
+import { useSWRBookmarkInfo } from '../../stores/bookmark';
 import { useSWRxPageInfo } from '../../stores/page';
 import { useSWRxPageInfo } from '../../stores/page';
 import { useSWRxUsersList } from '../../stores/user';
 import { useSWRxUsersList } from '../../stores/user';
-import BookmarkButtons from '../BookmarkButtons';
+import { BookmarkButtons } from '../BookmarkButtons';
 import {
 import {
   AdditionalMenuItemsRendererProps, ForceHideMenuItems, MenuItemType,
   AdditionalMenuItemsRendererProps, ForceHideMenuItems, MenuItemType,
   PageItemControl,
   PageItemControl,
@@ -93,8 +93,7 @@ const SubNavButtonsSubstance = (props: SubNavButtonsSubstanceProps): JSX.Element
 
 
   const { mutate: mutatePageInfo } = useSWRxPageInfo(pageId, shareLinkId);
   const { mutate: mutatePageInfo } = useSWRxPageInfo(pageId, shareLinkId);
 
 
-  const { data: bookmarkInfo, mutate: mutateBookmarkInfo } = useSWRBookmarkInfo(pageId);
-  const { mutate: mutateCurrentUserBookmark } = useSWRxCurrentUserBookmarks();
+  const { data: bookmarkInfo } = useSWRBookmarkInfo(pageId);
 
 
   const likerIds = isIPageInfoForEntity(pageInfo) ? (pageInfo.likerIds ?? []).slice(0, 15) : [];
   const likerIds = isIPageInfoForEntity(pageInfo) ? (pageInfo.likerIds ?? []).slice(0, 15) : [];
   const seenUserIds = isIPageInfoForEntity(pageInfo) ? (pageInfo.seenUserIds ?? []).slice(0, 15) : [];
   const seenUserIds = isIPageInfoForEntity(pageInfo) ? (pageInfo.seenUserIds ?? []).slice(0, 15) : [];
@@ -203,7 +202,7 @@ const SubNavButtonsSubstance = (props: SubNavButtonsSubstanceProps): JSX.Element
   }
   }
 
 
   const {
   const {
-    sumOfLikers, sumOfSeenUsers, isLiked, bookmarkCount, isBookmarked,
+    sumOfLikers, sumOfSeenUsers, isLiked,
   } = pageInfo;
   } = pageInfo;
 
 
   const forceHideMenuItemsWithBookmark = forceHideMenuItems ?? [];
   const forceHideMenuItemsWithBookmark = forceHideMenuItems ?? [];

+ 3 - 5
packages/app/src/components/Sidebar/Bookmarks.tsx

@@ -5,9 +5,9 @@ import { useTranslation } from 'react-i18next';
 
 
 import { useIsGuestUser } from '~/stores/context';
 import { useIsGuestUser } from '~/stores/context';
 
 
-import BookamrkContents from './Bookmarks/BookmarkContents';
+import { BookmarkContents } from './Bookmarks/BookmarkContents';
 
 
-const Bookmarks = () : JSX.Element => {
+export const Bookmarks = () : JSX.Element => {
   const { t } = useTranslation();
   const { t } = useTranslation();
   const { data: isGuestUser } = useIsGuestUser();
   const { data: isGuestUser } = useIsGuestUser();
 
 
@@ -21,10 +21,8 @@ const Bookmarks = () : JSX.Element => {
           { t('Not available for guest') }
           { t('Not available for guest') }
         </h4>
         </h4>
       ) : (
       ) : (
-        <BookamrkContents />
+        <BookmarkContents />
       )}
       )}
     </>
     </>
   );
   );
 };
 };
-
-export default Bookmarks;

+ 4 - 6
packages/app/src/components/Sidebar/Bookmarks/BookmarkContents.tsx

@@ -4,13 +4,13 @@ import { useTranslation } from 'next-i18next';
 
 
 import { apiv3Post } from '~/client/util/apiv3-client';
 import { apiv3Post } from '~/client/util/apiv3-client';
 import { toastError, toastSuccess } from '~/client/util/toastr';
 import { toastError, toastSuccess } from '~/client/util/toastr';
-import BookmarkFolderNameInput from '~/components/Bookmarks/BookmarkFolderNameInput';
-import BookmarkFolderTree from '~/components/Bookmarks/BookmarkFolderTree';
-import FolderPlusIcon from '~/components/Icons/FolderPlusIcon';
+import { BookmarkFolderNameInput } from '~/components/Bookmarks/BookmarkFolderNameInput';
+import { BookmarkFolderTree } from '~/components/Bookmarks/BookmarkFolderTree';
+import { FolderPlusIcon } from '~/components/Icons/FolderPlusIcon';
 import { useSWRxBookamrkFolderAndChild } from '~/stores/bookmark-folder';
 import { useSWRxBookamrkFolderAndChild } from '~/stores/bookmark-folder';
 
 
 
 
-const BookmarkContents = (): JSX.Element => {
+export const BookmarkContents = (): JSX.Element => {
 
 
   const { t } = useTranslation();
   const { t } = useTranslation();
   const [isCreateAction, setIsCreateAction] = useState<boolean>(false);
   const [isCreateAction, setIsCreateAction] = useState<boolean>(false);
@@ -68,5 +68,3 @@ const BookmarkContents = (): JSX.Element => {
     </>
     </>
   );
   );
 };
 };
-
-export default BookmarkContents;

+ 1 - 1
packages/app/src/components/Sidebar/PageTree/Item.tsx

@@ -13,7 +13,7 @@ import { UncontrolledTooltip, DropdownToggle } from 'reactstrap';
 import { bookmark, unbookmark, resumeRenameOperation } from '~/client/services/page-operation';
 import { bookmark, unbookmark, resumeRenameOperation } from '~/client/services/page-operation';
 import { toastWarning, toastError, toastSuccess } from '~/client/util/apiNotification';
 import { toastWarning, toastError, toastSuccess } from '~/client/util/apiNotification';
 import { apiv3Put, apiv3Post } from '~/client/util/apiv3-client';
 import { apiv3Put, apiv3Post } from '~/client/util/apiv3-client';
-import TriangleIcon from '~/components/Icons/TriangleIcon';
+import { TriangleIcon } from '~/components/Icons/TriangleIcon';
 import { NotAvailableForGuest } from '~/components/NotAvailableForGuest';
 import { NotAvailableForGuest } from '~/components/NotAvailableForGuest';
 import {
 import {
   IPageHasId, IPageInfoAll, IPageToDeleteWithMeta,
   IPageHasId, IPageInfoAll, IPageToDeleteWithMeta,

+ 1 - 1
packages/app/src/components/Sidebar/SidebarContents.tsx

@@ -3,7 +3,7 @@ import React, { memo } from 'react';
 import { SidebarContentsType } from '~/interfaces/ui';
 import { SidebarContentsType } from '~/interfaces/ui';
 import { useCurrentSidebarContents } from '~/stores/ui';
 import { useCurrentSidebarContents } from '~/stores/ui';
 
 
-import Bookmarks from './Bookmarks';
+import { Bookmarks } from './Bookmarks';
 import CustomSidebar from './CustomSidebar';
 import CustomSidebar from './CustomSidebar';
 import PageTree from './PageTree';
 import PageTree from './PageTree';
 import RecentChanges from './RecentChanges';
 import RecentChanges from './RecentChanges';

+ 5 - 5
packages/app/src/components/UsersHomePageFooter.tsx

@@ -10,11 +10,11 @@ import { RecentCreated } from '~/components/RecentCreated/RecentCreated';
 import styles from '~/components/UsersHomePageFooter.module.scss';
 import styles from '~/components/UsersHomePageFooter.module.scss';
 import { useSWRxBookamrkFolderAndChild } from '~/stores/bookmark-folder';
 import { useSWRxBookamrkFolderAndChild } from '~/stores/bookmark-folder';
 
 
-import BookmarkFolderNameInput from './Bookmarks/BookmarkFolderNameInput';
-import BookmarkFolderTree from './Bookmarks/BookmarkFolderTree';
-import CompressIcon from './Icons/CompressIcon';
-import ExpandIcon from './Icons/ExpandIcon';
-import FolderPlusIcon from './Icons/FolderPlusIcon';
+import { BookmarkFolderNameInput } from './Bookmarks/BookmarkFolderNameInput';
+import { BookmarkFolderTree } from './Bookmarks/BookmarkFolderTree';
+import { CompressIcon } from './Icons/CompressIcon';
+import { ExpandIcon } from './Icons/ExpandIcon';
+import { FolderPlusIcon } from './Icons/FolderPlusIcon';
 
 
 
 
 export type UsersHomePageFooterProps = {
 export type UsersHomePageFooterProps = {