|
@@ -49,7 +49,8 @@ import {
|
|
|
usePostGetChatWithQuery,
|
|
|
usePostMessagesReadMutation,
|
|
|
usePostReactToMessageMutation,
|
|
|
- usePostSendMessageMutation
|
|
|
+ usePostSendMessageMutation,
|
|
|
+ usePostUnreactToMessageMutation
|
|
|
} from '@api/chat';
|
|
|
import { CustomMessage, Message, Reaction } from '../types';
|
|
|
import { API_HOST } from 'src/constants';
|
|
@@ -100,6 +101,7 @@ const ChatScreen = ({ route }: { route: any }) => {
|
|
|
const { mutateAsync: markMessagesAsRead } = usePostMessagesReadMutation();
|
|
|
const { mutateAsync: deleteMessage } = usePostDeleteMessageMutation();
|
|
|
const { mutateAsync: reactToMessage } = usePostReactToMessageMutation();
|
|
|
+ const { mutateAsync: unreactToMessage } = usePostUnreactToMessageMutation();
|
|
|
|
|
|
const [highlightedMessageId, setHighlightedMessageId] = useState<number | null>(null);
|
|
|
|
|
@@ -304,6 +306,33 @@ const ChatScreen = ({ route }: { route: any }) => {
|
|
|
closeEmojiSelector();
|
|
|
};
|
|
|
|
|
|
+ const handleUnreactToMessage = (messageId: number) => {
|
|
|
+ unreactToMessage(
|
|
|
+ {
|
|
|
+ token,
|
|
|
+ message_id: messageId,
|
|
|
+ conversation_with_user: id
|
|
|
+ },
|
|
|
+ {
|
|
|
+ onSuccess: () => {
|
|
|
+ setMessages((prevMessages) =>
|
|
|
+ prevMessages.map((msg) => {
|
|
|
+ if (msg._id === messageId) {
|
|
|
+ return {
|
|
|
+ ...msg,
|
|
|
+ reactions: Array.isArray(msg.reactions)
|
|
|
+ ? msg.reactions.filter((r) => r.uid !== +currentUserId)
|
|
|
+ : []
|
|
|
+ };
|
|
|
+ }
|
|
|
+ return msg;
|
|
|
+ })
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ );
|
|
|
+ };
|
|
|
+
|
|
|
const renderTimeContainer = (time: TimeProps<CustomMessage>) => {
|
|
|
const createdAt = new Date(time.currentMessage.createdAt);
|
|
|
|
|
@@ -351,16 +380,36 @@ const ChatScreen = ({ route }: { route: any }) => {
|
|
|
(Array.isArray(time.currentMessage.reactions)
|
|
|
? time.currentMessage.reactions
|
|
|
: []
|
|
|
- ).reduce((acc: Record<string, number>, { reaction }: { reaction: string }) => {
|
|
|
- acc[reaction] = (acc[reaction] || 0) + 1;
|
|
|
- return acc;
|
|
|
- }, {})
|
|
|
- ).map(([emoji, count]) => (
|
|
|
- <Text key={emoji} style={{}}>
|
|
|
- {emoji}
|
|
|
- {(count as number) > 1 ? ` ${count}` : ''}
|
|
|
- </Text>
|
|
|
- ))}
|
|
|
+ ).reduce(
|
|
|
+ (
|
|
|
+ acc: Record<string, { count: number; uids: number[] }>,
|
|
|
+ { reaction, uid }: { reaction: string; uid: number }
|
|
|
+ ) => {
|
|
|
+ if (!acc[reaction]) {
|
|
|
+ acc[reaction] = { count: 0, uids: [] };
|
|
|
+ }
|
|
|
+ acc[reaction].count += 1;
|
|
|
+ acc[reaction].uids.push(uid);
|
|
|
+ return acc;
|
|
|
+ },
|
|
|
+ {}
|
|
|
+ )
|
|
|
+ ).map(([emoji, { count, uids }]: any) => {
|
|
|
+ const isUserReacted = uids.includes(+currentUserId);
|
|
|
+
|
|
|
+ return (
|
|
|
+ <TouchableOpacity
|
|
|
+ key={emoji}
|
|
|
+ onPress={() => handleUnreactToMessage(time.currentMessage._id)}
|
|
|
+ disabled={!isUserReacted}
|
|
|
+ >
|
|
|
+ <Text style={{}}>
|
|
|
+ {emoji}
|
|
|
+ {(count as number) > 1 ? ` ${count}` : ''}
|
|
|
+ </Text>
|
|
|
+ </TouchableOpacity>
|
|
|
+ );
|
|
|
+ })}
|
|
|
</View>
|
|
|
)}
|
|
|
<View
|