BookmarkContents.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import React, { useCallback, useState } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import { apiv3Post } from '~/client/util/apiv3-client';
  4. import { toastError, toastSuccess } 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 { useSWRxBookamrkFolderAndChild } from '~/stores/bookmark-folder';
  9. const BookmarkContents = (): JSX.Element => {
  10. const { t } = useTranslation();
  11. const [isCreateAction, setIsCreateAction] = useState<boolean>(false);
  12. const { mutate: mutateChildBookmarkData } = useSWRxBookamrkFolderAndChild(null);
  13. const onClickNewBookmarkFolder = useCallback(() => {
  14. setIsCreateAction(true);
  15. }, []);
  16. const onPressEnterHandlerForCreate = useCallback(async(folderName: string) => {
  17. try {
  18. await apiv3Post('/bookmark-folder', { name: folderName, parent: null });
  19. await mutateChildBookmarkData();
  20. setIsCreateAction(false);
  21. toastSuccess(t('toaster.create_succeeded', { target: t('bookmark_folder.bookmark_folder'), ns: 'commons' }));
  22. }
  23. catch (err) {
  24. toastError(err);
  25. }
  26. }, [mutateChildBookmarkData, t]);
  27. const renderAddNewBookmarkFolder = useCallback(() => (
  28. <>
  29. <div className="col-8 mb-2 ">
  30. <button
  31. className="btn btn-block btn-outline-secondary rounded-pill d-flex justify-content-start align-middle"
  32. onClick={onClickNewBookmarkFolder}
  33. >
  34. <FolderPlusIcon />
  35. <span className="mx-2 ">{t('bookmark_folder.new_folder')}</span>
  36. </button>
  37. </div>
  38. {
  39. isCreateAction && (
  40. <div className="col-12 mb-2 ">
  41. <BookmarkFolderNameInput
  42. onClickOutside={() => setIsCreateAction(false)}
  43. onPressEnter={onPressEnterHandlerForCreate}
  44. />
  45. </div>
  46. )
  47. }
  48. </>
  49. ), [isCreateAction, onClickNewBookmarkFolder, onPressEnterHandlerForCreate, t]);
  50. return (
  51. <>
  52. {
  53. renderAddNewBookmarkFolder()
  54. }
  55. <BookmarkFolderTree />
  56. </>
  57. );
  58. };
  59. export default BookmarkContents;