|
@@ -51,8 +51,7 @@ import {
|
|
|
usePostGetChatWithQuery,
|
|
|
usePostMessagesReadMutation,
|
|
|
usePostReactToMessageMutation,
|
|
|
- usePostSendMessageMutation,
|
|
|
- usePostUnreactToMessageMutation
|
|
|
+ usePostSendMessageMutation
|
|
|
} from '@api/chat';
|
|
|
import { CustomMessage, Message, Reaction } from '../types';
|
|
|
import { API_HOST, WEBSOCKET_URL } from 'src/constants';
|
|
@@ -66,6 +65,7 @@ import { SheetManager } from 'react-native-actions-sheet';
|
|
|
import { NAVIGATION_PAGES } from 'src/types';
|
|
|
import * as Notifications from 'expo-notifications';
|
|
|
import { usePushNotification } from 'src/contexts/PushNotificationContext';
|
|
|
+import ReactionsListModal from '../Components/ReactionsListModal';
|
|
|
|
|
|
const options = {
|
|
|
enableVibrateFallback: true,
|
|
@@ -112,7 +112,6 @@ 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);
|
|
|
const [isRerendering, setIsRerendering] = useState<boolean>(false);
|
|
@@ -502,32 +501,21 @@ const ChatScreen = ({ route }: { route: any }) => {
|
|
|
closeEmojiSelector();
|
|
|
};
|
|
|
|
|
|
- const handleUnreactToMessage = (messageId: number) => {
|
|
|
- unreactToMessage(
|
|
|
- {
|
|
|
+ const openReactionList = (
|
|
|
+ reactions: { uid: number; name: string; reaction: string }[],
|
|
|
+ messageId: number
|
|
|
+ ) => {
|
|
|
+ SheetManager.show('reactions-list-modal', {
|
|
|
+ payload: {
|
|
|
+ users: reactions,
|
|
|
+ currentUserId: +currentUserId,
|
|
|
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;
|
|
|
- })
|
|
|
- );
|
|
|
- sendWebSocketMessage('new_reaction');
|
|
|
- }
|
|
|
- }
|
|
|
- );
|
|
|
+ messageId,
|
|
|
+ conversation_with_user: id,
|
|
|
+ setMessages,
|
|
|
+ sendWebSocketMessage
|
|
|
+ } as any
|
|
|
+ });
|
|
|
};
|
|
|
|
|
|
const renderTimeContainer = (time: TimeProps<CustomMessage>) => {
|
|
@@ -579,26 +567,26 @@ const ChatScreen = ({ route }: { route: any }) => {
|
|
|
: []
|
|
|
).reduce(
|
|
|
(
|
|
|
- acc: Record<string, { count: number; uids: number[] }>,
|
|
|
+ acc: Record<
|
|
|
+ string,
|
|
|
+ { count: number; users: { uid: number; name: string; reaction: string }[] }
|
|
|
+ >,
|
|
|
{ reaction, uid }: { reaction: string; uid: number }
|
|
|
) => {
|
|
|
if (!acc[reaction]) {
|
|
|
- acc[reaction] = { count: 0, uids: [] };
|
|
|
+ acc[reaction] = { count: 0, users: [] };
|
|
|
}
|
|
|
acc[reaction].count += 1;
|
|
|
- acc[reaction].uids.push(uid);
|
|
|
+ acc[reaction].users.push({ uid, name: uid === id ? name : 'Me', reaction });
|
|
|
return acc;
|
|
|
},
|
|
|
{}
|
|
|
)
|
|
|
- ).map(([emoji, { count, uids }]: any) => {
|
|
|
- const isUserReacted = uids.includes(+currentUserId);
|
|
|
-
|
|
|
+ ).map(([emoji, { count, users }]: any) => {
|
|
|
return (
|
|
|
<TouchableOpacity
|
|
|
key={emoji}
|
|
|
- onPress={() => handleUnreactToMessage(time.currentMessage._id)}
|
|
|
- disabled={!isUserReacted}
|
|
|
+ onPress={() => openReactionList(users, time.currentMessage._id)}
|
|
|
>
|
|
|
<Text style={{}}>
|
|
|
{emoji}
|
|
@@ -1311,6 +1299,7 @@ const ChatScreen = ({ route }: { route: any }) => {
|
|
|
closeModal();
|
|
|
}}
|
|
|
/>
|
|
|
+ <ReactionsListModal />
|
|
|
</GestureHandlerRootView>
|
|
|
<View
|
|
|
style={{
|