diff --git a/web/src/components/ChatBox/ChatMessageList/useMessageReactions.tsx b/web/src/components/ChatBox/ChatMessageList/useMessageReactions.tsx
index 95a771c2..01d4e383 100644
--- a/web/src/components/ChatBox/ChatMessageList/useMessageReactions.tsx
+++ b/web/src/components/ChatBox/ChatMessageList/useMessageReactions.tsx
@@ -1,4 +1,11 @@
-import { ChatMessage, removeReaction, useUsernames } from 'tailchat-shared';
+import {
+ addReaction,
+ ChatMessage,
+ isValidStr,
+ removeReaction,
+ useUserId,
+ useUsernames,
+} from 'tailchat-shared';
import _groupBy from 'lodash/groupBy';
import _uniqBy from 'lodash/uniqBy';
import { useCallback, useMemo } from 'react';
@@ -22,12 +29,14 @@ const ReactionItem: React.FC<{
const { reaction, onClick } = props;
return (
-
-
-
+
+
+
- {reaction.length > 1 && {reaction.length}}
+ {reaction.length > 1 && (
+ {reaction.length}
+ )}
@@ -41,6 +50,7 @@ ReactionItem.displayName = 'ReactionItem';
export function useMessageReactions(payload: ChatMessage) {
const messageId = payload._id;
const reactions = payload.reactions ?? [];
+ const userId = useUserId();
const groupedReactions: GroupedReaction[] = useMemo(() => {
const groups = _groupBy(reactions, 'name');
@@ -56,10 +66,18 @@ export function useMessageReactions(payload: ChatMessage) {
}, [reactions]);
const handleClick = useCallback(
- (reactionName: string) => {
- removeReaction(messageId, reactionName);
+ (reaction: GroupedReaction) => {
+ if (!isValidStr(userId)) {
+ return;
+ }
+
+ if (reaction.users.includes(userId)) {
+ removeReaction(messageId, reaction.name);
+ } else {
+ addReaction(messageId, reaction.name);
+ }
},
- [messageId]
+ [messageId, userId]
);
return (
@@ -68,7 +86,7 @@ export function useMessageReactions(payload: ChatMessage) {
handleClick(reaction.name)}
+ onClick={() => handleClick(reaction)}
/>
))}