Skip to content

Commit 98aab31

Browse files
authored
Merge pull request #2713 from daostack/dev
Sprint 34
2 parents fd6b3ba + 35cb14a commit 98aab31

File tree

9 files changed

+79
-2
lines changed

9 files changed

+79
-2
lines changed

src/pages/commonFeed/components/HeaderContent/components/ActionsButton/ActionsButton.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { CirclesPermissions, Common, CommonMember } from "@/shared/models";
66
import { DesktopMenu, MenuButton } from "@/shared/ui-kit";
77
import { StaticLinkType, generateStaticShareLink } from "@/shared/utils";
88
import { useMenuItems } from "./hooks";
9+
import { useUpdateCommonSeenState } from "@/shared/hooks/useCases";
910

1011
interface ActionsButtonProps {
1112
common: Common;
@@ -22,6 +23,7 @@ const ActionsButton: FC<ActionsButtonProps> = (props) => {
2223
onOpen: onShareModalOpen,
2324
onClose: onShareModalClose,
2425
} = useModal(false);
26+
const { markCommonAsSeen } = useUpdateCommonSeenState();
2527
const items = useMenuItems(
2628
{
2729
common,
@@ -33,6 +35,7 @@ const ActionsButton: FC<ActionsButtonProps> = (props) => {
3335
share: onShareModalOpen,
3436
onFollowToggle: commonFollow.onFollowToggle,
3537
onSearchClick,
38+
markCommonAsSeen
3639
},
3740
);
3841
const shareLink = generateStaticShareLink(StaticLinkType.Common, common);

src/pages/commonFeed/components/HeaderContent/components/ActionsButton/hooks/useMenuItems.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React from "react";
22
import { CommonFollowState } from "@/shared/hooks/useCases";
33
import {
44
FollowIcon,
5+
Message3Icon,
56
SearchIcon,
67
Share3Icon,
78
UnfollowIcon,
@@ -17,14 +18,15 @@ interface Actions {
1718
share: () => void;
1819
onSearchClick?: () => void;
1920
onFollowToggle: CommonFollowState["onFollowToggle"];
21+
markCommonAsSeen: (commonId: string) => void;
2022
}
2123

2224
export const useMenuItems = (
2325
options: GetAllowedItemsOptions,
2426
actions: Actions,
2527
): Item[] => {
2628
const { common } = options;
27-
const { share, onFollowToggle, onSearchClick } = actions;
29+
const { share, onFollowToggle, onSearchClick, markCommonAsSeen } = actions;
2830

2931
const items: Item[] = [
3032
{
@@ -51,6 +53,18 @@ export const useMenuItems = (
5153
onClick: () => onFollowToggle(),
5254
icon: <UnfollowIcon />,
5355
},
56+
{
57+
id: CommonFeedMenuItem.MarkRead,
58+
text: "Mark all as read",
59+
onClick: () => {
60+
if (!common.id) {
61+
return;
62+
}
63+
64+
markCommonAsSeen(common.id);
65+
},
66+
icon: <Message3Icon />,
67+
},
5468
];
5569

5670
return getAllowedItems(items, options);

src/pages/commonFeed/constants/commonFeedMenuItem.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ export enum CommonFeedMenuItem {
33
Share = "share",
44
Follow = "follow",
55
Mute = "mute",
6+
MarkRead = "markRead",
67
}

src/pages/commonFeed/utils/getAllowedItems.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ const MENU_ITEM_TO_CHECK_FUNCTION_MAP: Record<
2020
!isFollowInProgress && Boolean(commonMember && !commonMember.isFollowing),
2121
[CommonFeedMenuItem.Mute]: ({ commonMember, isFollowInProgress }) =>
2222
!isFollowInProgress && Boolean(commonMember?.isFollowing),
23+
[CommonFeedMenuItem.MarkRead]: () => true,
2324
};
2425

2526
export const getAllowedItems = (items: Item[], options: Options): Item[] =>

src/pages/inbox/components/DirectMessageButton/components/DirectMessageModal/hooks/useDMUsers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export const useDMUsers = (): Return => {
5757
}
5858

5959
fetchDMUsers();
60-
},[userId, fetchDMUsers]);
60+
},[userId]);
6161

6262
return {
6363
fetchDMUsers,

src/services/Common.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,19 @@ class CommonService {
609609

610610
return snapshot.data() || null;
611611
};
612+
613+
public markCommonAsSeen = async (
614+
commonId: string,
615+
userId: string,
616+
): Promise<void> => {
617+
await Api.post(
618+
ApiEndpoint.MarkCommonSeenForUser,
619+
{
620+
commonId,
621+
userId
622+
},
623+
);
624+
};
612625
}
613626

614627
export default new CommonService();

src/shared/constants/endpoint.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export const ApiEndpoint = {
88
CreateCommon: "/commons/create",
99
UpdateCommon: "/commons/update",
1010
CreateSubCommon: "/commons/subcommon/create",
11+
MarkCommonSeenForUser: "/commons/mark-seen-for-user",
1112
MarkFeedObjectSeenForUser: "/commons/mark-feed-object-seen-for-user",
1213
MarkFeedObjectUnseenForUser: "/commons/mark-feed-object-unseen-for-user",
1314
LinkStream: "/commons/link-stream",

src/shared/hooks/useCases/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,6 @@ export { useEligibleVoters } from "./useEligibleVoters";
4747
export { useDiscussionMessageReaction } from "./useDiscussionMessageReaction";
4848
export { useChatMessageReaction } from "./useChatMessageReaction";
4949
export { useUserReaction } from "./useUserReaction";
50+
export { useUpdateCommonSeenState } from "./useUpdateCommonSeenState";
5051
export * from "./useCommonFollow";
5152
export * from "./usePreloadDiscussionMessagesById";
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { useCallback } from "react";
2+
import { useSelector } from "react-redux";
3+
import { selectUser } from "@/pages/Auth/store/selectors";
4+
import { CommonService } from "@/services";
5+
import useNotification from "../useNotification";
6+
7+
interface Return {
8+
markCommonAsSeen: (
9+
commonId: string,
10+
delay?: number,
11+
) => ReturnType<typeof setTimeout>;
12+
}
13+
14+
export const useUpdateCommonSeenState = (): Return => {
15+
const user = useSelector(selectUser());
16+
const userId = user?.uid;
17+
const { notify } = useNotification();
18+
19+
const updateSeenState = async (
20+
commonId: string,
21+
) => {
22+
if (!userId) {
23+
return;
24+
}
25+
26+
try {
27+
await CommonService.markCommonAsSeen(commonId, userId);
28+
} catch (error) {
29+
notify("Something went wrong");
30+
}
31+
};
32+
33+
const markCommonAsSeen = useCallback(
34+
(commonId: string, delay = 0) => {
35+
return setTimeout(() => {
36+
updateSeenState(commonId);
37+
}, delay);
38+
},
39+
[userId],
40+
);
41+
42+
return { markCommonAsSeen };
43+
};

0 commit comments

Comments
 (0)