|
|
@@ -1,38 +1,68 @@
|
|
|
import React, { useCallback } from 'react';
|
|
|
|
|
|
-import SubscribeButton from '../SubscribeButton';
|
|
|
-import PageReactionButtons from '../PageReactionButtons';
|
|
|
-import { useSWRPageInfo } from '../../stores/page';
|
|
|
-import { useSWRBookmarkInfo } from '../../stores/bookmark';
|
|
|
import { toastError } from '../../client/util/apiNotification';
|
|
|
import { apiv3Put } from '../../client/util/apiv3-client';
|
|
|
-import { useSWRxLikerList } from '../../stores/user';
|
|
|
+
|
|
|
+import { IPageInfo, isExistPageInfo } from '~/interfaces/page';
|
|
|
+
|
|
|
+import { useSWRPageInfo } from '../../stores/page';
|
|
|
+import { useSWRBookmarkInfo } from '../../stores/bookmark';
|
|
|
+import { useSWRxUsersList } from '../../stores/user';
|
|
|
import { useIsGuestUser } from '~/stores/context';
|
|
|
|
|
|
+import SubscribeButton from '../SubscribeButton';
|
|
|
+import LikeButtons from '../LikeButtons';
|
|
|
+import BookmarkButtons from '../BookmarkButtons';
|
|
|
+import { SubscriptionStatusType } from '~/interfaces/subscription';
|
|
|
|
|
|
-type SubNavButtonsSubstanceProps= {
|
|
|
+
|
|
|
+type CommonProps = {
|
|
|
isCompactMode?: boolean,
|
|
|
showPageControlDropdown?: boolean,
|
|
|
}
|
|
|
-const SubNavButtonsSubstance = (props: { pageId: string } & SubNavButtonsSubstanceProps): JSX.Element => {
|
|
|
+
|
|
|
+type SubNavButtonsSubstanceProps= CommonProps & {
|
|
|
+ pageId: string,
|
|
|
+ pageInfo: IPageInfo,
|
|
|
+}
|
|
|
+
|
|
|
+const SubNavButtonsSubstance = (props: SubNavButtonsSubstanceProps): JSX.Element => {
|
|
|
const {
|
|
|
- isCompactMode, pageId, showPageControlDropdown,
|
|
|
+ pageInfo, pageId, isCompactMode, showPageControlDropdown,
|
|
|
} = props;
|
|
|
|
|
|
const { data: isGuestUser } = useIsGuestUser();
|
|
|
|
|
|
- const { data: pageInfo, error: pageInfoError, mutate: mutatePageInfo } = useSWRPageInfo(pageId);
|
|
|
- const { data: likers } = useSWRxLikerList(pageInfo?.likerIds);
|
|
|
+ const { mutate: mutatePageInfo } = useSWRPageInfo(pageId);
|
|
|
+
|
|
|
+ const { data: likers } = useSWRxUsersList(pageInfo.likerIds);
|
|
|
const { data: bookmarkInfo, error: bookmarkInfoError, mutate: mutateBookmarkInfo } = useSWRBookmarkInfo(pageId, true);
|
|
|
|
|
|
+ const subscribeClickhandler = useCallback(async() => {
|
|
|
+ if (isGuestUser == null || isGuestUser) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const newStatus = pageInfo.subscriptionStatus === SubscriptionStatusType.SUBSCRIBE
|
|
|
+ ? SubscriptionStatusType.UNSUBSCRIBE
|
|
|
+ : SubscriptionStatusType.SUBSCRIBE;
|
|
|
+
|
|
|
+ try {
|
|
|
+ await apiv3Put('/page/subscribe', { pageId, status: newStatus });
|
|
|
+ mutatePageInfo();
|
|
|
+ }
|
|
|
+ catch (err) {
|
|
|
+ toastError(err);
|
|
|
+ }
|
|
|
+ }, [isGuestUser, mutatePageInfo, pageId, pageInfo]);
|
|
|
+
|
|
|
const likeClickhandler = useCallback(async() => {
|
|
|
if (isGuestUser == null || isGuestUser) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
|
- await apiv3Put('/page/likes', { pageId, bool: !pageInfo!.isLiked });
|
|
|
+ await apiv3Put('/page/likes', { pageId, bool: !pageInfo.isLiked });
|
|
|
mutatePageInfo();
|
|
|
}
|
|
|
catch (err) {
|
|
|
@@ -41,12 +71,11 @@ const SubNavButtonsSubstance = (props: { pageId: string } & SubNavButtonsSubstan
|
|
|
}, [isGuestUser, mutatePageInfo, pageId, pageInfo]);
|
|
|
|
|
|
const bookmarkClickHandler = useCallback(async() => {
|
|
|
- if (isGuestUser == null || isGuestUser) {
|
|
|
+ if (isGuestUser == null || isGuestUser || bookmarkInfo == null) {
|
|
|
return;
|
|
|
}
|
|
|
try {
|
|
|
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
|
- await apiv3Put('/bookmarks', { pageId, bool: !bookmarkInfo!.isBookmarked });
|
|
|
+ await apiv3Put('/bookmarks', { pageId, bool: !bookmarkInfo.isBookmarked });
|
|
|
mutateBookmarkInfo();
|
|
|
}
|
|
|
catch (err) {
|
|
|
@@ -55,10 +84,6 @@ const SubNavButtonsSubstance = (props: { pageId: string } & SubNavButtonsSubstan
|
|
|
}, [bookmarkInfo, isGuestUser, mutateBookmarkInfo, pageId]);
|
|
|
|
|
|
|
|
|
- if (pageInfoError != null || pageInfo == null) {
|
|
|
- return <></>;
|
|
|
- }
|
|
|
-
|
|
|
if (bookmarkInfoError != null || bookmarkInfo == null) {
|
|
|
return <></>;
|
|
|
}
|
|
|
@@ -69,21 +94,25 @@ const SubNavButtonsSubstance = (props: { pageId: string } & SubNavButtonsSubstan
|
|
|
return (
|
|
|
<div className="d-flex" style={{ gap: '2px' }}>
|
|
|
<span>
|
|
|
- <SubscribeButton pageId={props.pageId} />
|
|
|
+ <SubscribeButton
|
|
|
+ status={pageInfo.subscriptionStatus}
|
|
|
+ onClick={subscribeClickhandler}
|
|
|
+ />
|
|
|
</span>
|
|
|
- <PageReactionButtons
|
|
|
- isCompactMode={isCompactMode}
|
|
|
+ <LikeButtons
|
|
|
+ hideTotalNumber={isCompactMode}
|
|
|
+ onLikeClicked={likeClickhandler}
|
|
|
sumOfLikers={sumOfLikers}
|
|
|
isLiked={isLiked}
|
|
|
- likers={likers || []}
|
|
|
- onLikeClicked={likeClickhandler}
|
|
|
+ likers={likers}
|
|
|
+ />
|
|
|
+ <BookmarkButtons
|
|
|
+ hideTotalNumber={isCompactMode}
|
|
|
sumOfBookmarks={sumOfBookmarks}
|
|
|
isBookmarked={isBookmarked}
|
|
|
bookmarkedUsers={bookmarkedUsers}
|
|
|
onBookMarkClicked={bookmarkClickHandler}
|
|
|
- >
|
|
|
- </PageReactionButtons>
|
|
|
-
|
|
|
+ />
|
|
|
{ showPageControlDropdown && (
|
|
|
/*
|
|
|
TODO:
|
|
|
@@ -104,16 +133,22 @@ const SubNavButtonsSubstance = (props: { pageId: string } & SubNavButtonsSubstan
|
|
|
);
|
|
|
};
|
|
|
|
|
|
-type SubNavButtonsProps= SubNavButtonsSubstanceProps & {
|
|
|
+type SubNavButtonsProps= CommonProps & {
|
|
|
pageId?: string | null,
|
|
|
};
|
|
|
|
|
|
export const SubNavButtons = (props: SubNavButtonsProps): JSX.Element => {
|
|
|
const { pageId, isCompactMode } = props;
|
|
|
|
|
|
- if (pageId == null) {
|
|
|
+ const { data: pageInfo, error } = useSWRPageInfo(pageId ?? null);
|
|
|
+
|
|
|
+ if (pageId == null || pageInfo == null || error != null) {
|
|
|
+ return <></>;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!isExistPageInfo(pageInfo)) {
|
|
|
return <></>;
|
|
|
}
|
|
|
|
|
|
- return <SubNavButtonsSubstance pageId={pageId} isCompactMode={isCompactMode} />;
|
|
|
+ return <SubNavButtonsSubstance pageInfo={pageInfo} pageId={pageId} isCompactMode={isCompactMode} />;
|
|
|
};
|