BookmarkContents.tsx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import React, { useCallback, useState } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import { apiv3Post } from '~/client/util/apiv3-client';
  4. import { toastError } from '~/client/util/toastr';
  5. import { BookmarkFolderNameInput } from '~/components/Bookmarks/BookmarkFolderNameInput';
  6. import { BookmarkFolderTree } from '~/components/Bookmarks/BookmarkFolderTree';
  7. import { FolderPlusIcon } from '~/components/Icons/FolderPlusIcon';
  8. import { useSWRxBookmarkFolderAndChild } from '~/stores/bookmark-folder';
  9. import { useCurrentUser } from '~/stores/context';
  10. export const BookmarkContents = (): JSX.Element => {
  11. const { t } = useTranslation();
  12. const [isCreateAction, setIsCreateAction] = useState<boolean>(false);
  13. const { data: currentUser } = useCurrentUser();
  14. const { mutate: mutateBookmarkFolders } = useSWRxBookmarkFolderAndChild(currentUser?._id);
  15. const onClickNewBookmarkFolder = useCallback(() => {
  16. setIsCreateAction(true);
  17. }, []);
  18. const onClickonClickOutsideHandler = useCallback(() => {
  19. setIsCreateAction(false);
  20. }, []);
  21. const onPressEnterHandlerForCreate = useCallback(async(folderName: string) => {
  22. try {
  23. await apiv3Post('/bookmark-folder', { name: folderName, parent: null });
  24. await mutateBookmarkFolders();
  25. setIsCreateAction(false);
  26. }
  27. catch (err) {
  28. toastError(err);
  29. }
  30. }, [mutateBookmarkFolders]);
  31. return (
  32. <>
  33. <div className="col-8 mb-2 ">
  34. <button
  35. className="btn btn-block btn-outline-secondary rounded-pill d-flex justify-content-start align-middle"
  36. onClick={onClickNewBookmarkFolder}
  37. >
  38. <FolderPlusIcon />
  39. <span className="mx-2 ">{t('bookmark_folder.new_folder')}</span>
  40. </button>
  41. </div>
  42. {isCreateAction && (
  43. <div className="col-12 mb-2 ">
  44. <BookmarkFolderNameInput
  45. onClickOutside={onClickonClickOutsideHandler}
  46. onPressEnter={onPressEnterHandlerForCreate}
  47. />
  48. </div>
  49. )}
  50. <BookmarkFolderTree isOperable userId={currentUser?._id} />
  51. </>
  52. );
  53. };