BookmarkContents.tsx 2.3 KB

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