SubNavButtons.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import React, {
  2. FC, useCallback,
  3. } from 'react';
  4. import SubscribeButton from '../SubscribeButton';
  5. import PageReactionButtons from '../PageReactionButtons';
  6. import PageManagement from '../Page/PageManagement';
  7. import { useSWRPageInfo } from '../../stores/page';
  8. import { useSWRBookmarkInfo } from '../../stores/bookmark';
  9. import { toastError } from '../../client/util/apiNotification';
  10. import { apiv3Put } from '../../client/util/apiv3-client';
  11. import { useSWRxLikerList } from '../../stores/user';
  12. import { useEditorMode } from '~/stores/ui';
  13. import { useIsGuestUser } from '~/stores/context';
  14. type SubNavButtonsProps= {
  15. isCompactMode?: boolean,
  16. pageId: string,
  17. revisionId: string,
  18. path: string,
  19. willShowPageManagement: boolean,
  20. isDeletable: boolean,
  21. isAbleToDeleteCompletely: boolean,
  22. }
  23. const SubNavButtons: FC<SubNavButtonsProps> = (props: SubNavButtonsProps) => {
  24. const {
  25. isCompactMode, pageId, revisionId, path, willShowPageManagement, isDeletable, isAbleToDeleteCompletely,
  26. } = props;
  27. const { data: editorMode } = useEditorMode();
  28. const isViewMode = editorMode === 'view';
  29. const { data: isGuestUser } = useIsGuestUser();
  30. const { data: pageInfo, error: pageInfoError, mutate: mutatePageInfo } = useSWRPageInfo(pageId);
  31. const { data: likers } = useSWRxLikerList(pageInfo?.likerIds);
  32. const { data: bookmarkInfo, error: bookmarkInfoError, mutate: mutateBookmarkInfo } = useSWRBookmarkInfo(pageId);
  33. const likeClickhandler = useCallback(async() => {
  34. if (isGuestUser == null || isGuestUser) {
  35. return;
  36. }
  37. try {
  38. // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
  39. await apiv3Put('/page/likes', { pageId, bool: !pageInfo!.isLiked });
  40. mutatePageInfo();
  41. }
  42. catch (err) {
  43. toastError(err);
  44. }
  45. }, [isGuestUser, mutatePageInfo, pageId, pageInfo]);
  46. const bookmarkClickHandler = useCallback(async() => {
  47. if (isGuestUser == null || isGuestUser) {
  48. return;
  49. }
  50. try {
  51. // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
  52. await apiv3Put('/bookmarks', { pageId, bool: !bookmarkInfo!.isBookmarked });
  53. mutateBookmarkInfo();
  54. }
  55. catch (err) {
  56. toastError(err);
  57. }
  58. }, [bookmarkInfo, isGuestUser, mutateBookmarkInfo, pageId]);
  59. if (pageInfoError != null || pageInfo == null) {
  60. return <></>;
  61. }
  62. if (bookmarkInfoError != null || bookmarkInfo == null) {
  63. return <></>;
  64. }
  65. const { sumOfLikers, isLiked } = pageInfo;
  66. const { sumOfBookmarks, isBookmarked } = bookmarkInfo;
  67. return (
  68. <div className="d-flex" style={{ gap: '2px' }}>
  69. {isViewMode && (
  70. <>
  71. <span>
  72. <SubscribeButton pageId={props.pageId} />
  73. </span>
  74. <PageReactionButtons
  75. isCompactMode={isCompactMode}
  76. sumOfLikers={sumOfLikers}
  77. isLiked={isLiked}
  78. likers={likers || []}
  79. onLikeClicked={likeClickhandler}
  80. sumOfBookmarks={sumOfBookmarks}
  81. isBookmarked={isBookmarked}
  82. onBookMarkClicked={bookmarkClickHandler}
  83. >
  84. </PageReactionButtons>
  85. </>
  86. )}
  87. {willShowPageManagement && (
  88. <PageManagement
  89. pageId={pageId}
  90. revisionId={revisionId}
  91. path={path}
  92. isCompactMode={isCompactMode}
  93. isDeletable={isDeletable}
  94. isAbleToDeleteCompletely={isAbleToDeleteCompletely}
  95. >
  96. </PageManagement>
  97. )}
  98. </div>
  99. );
  100. };
  101. export default SubNavButtons;