BookmarkContents.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. type="button"
  36. className="btn btn-outline-secondary rounded-pill d-flex justify-content-start align-middle"
  37. onClick={onClickNewBookmarkFolder}
  38. >
  39. <FolderPlusIcon />
  40. <span className="mx-2 ">{t('bookmark_folder.new_folder')}</span>
  41. </button>
  42. </div>
  43. {isCreateAction && (
  44. <div className="col-12 mb-2 ">
  45. <BookmarkFolderNameInput
  46. onClickOutside={onClickonClickOutsideHandler}
  47. onPressEnter={onPressEnterHandlerForCreate}
  48. />
  49. </div>
  50. )}
  51. <BookmarkFolderTree isOperable userId={currentUser?._id} />
  52. </>
  53. );
  54. };