|
|
@@ -46,7 +46,7 @@ import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context'
|
|
|
import Clipboard from '@react-native-clipboard/clipboard';
|
|
|
import { trigger } from 'react-native-haptic-feedback';
|
|
|
import ReactModal from 'react-native-modal';
|
|
|
-import { checkAndSendSavedMessages, storage, StoreType } from 'src/storage';
|
|
|
+import { storage, StoreType } from 'src/storage';
|
|
|
import {
|
|
|
usePostGetGroupChatQuery,
|
|
|
usePostGetPinnedGroupMessageQuery,
|
|
|
@@ -151,9 +151,10 @@ const GroupChatScreen = ({ route }: { route: any }) => {
|
|
|
const [visibleBeforeId, setVisibleBeforeId] = useState<number | null>(null);
|
|
|
const {
|
|
|
data: chatData,
|
|
|
- refetch: refetch,
|
|
|
- isFetching: isFetching,
|
|
|
- isFetched
|
|
|
+ refetch,
|
|
|
+ isFetching,
|
|
|
+ isFetchedAfterMount,
|
|
|
+ isRefetching
|
|
|
} = usePostGetGroupChatQuery(token, group_token, 50, prevThenMessageId, true);
|
|
|
const [canSeeMembers, setCanSeeMembers] = useState(false);
|
|
|
|
|
|
@@ -331,16 +332,6 @@ const GroupChatScreen = ({ route }: { route: any }) => {
|
|
|
}, [navigation])
|
|
|
);
|
|
|
|
|
|
- useEffect(() => {
|
|
|
- if (netInfo && netInfo.isConnected !== null) {
|
|
|
- setIsConnected(netInfo.isConnected);
|
|
|
- if (netInfo.isConnected) {
|
|
|
- checkAndSendSavedMessages();
|
|
|
- refetch();
|
|
|
- }
|
|
|
- }
|
|
|
- }, [netInfo]);
|
|
|
-
|
|
|
const closeModal = () => {
|
|
|
setModalInfo({ ...modalInfo, visible: false });
|
|
|
};
|
|
|
@@ -768,7 +759,7 @@ const GroupChatScreen = ({ route }: { route: any }) => {
|
|
|
const handleWebSocketMessage = async (data: any) => {
|
|
|
switch (data.action) {
|
|
|
case 'new_message':
|
|
|
- if (data.group_token === group_token && data.message) {
|
|
|
+ if (data.group_token === group_token && data.message && data.uid !== +currentUserId) {
|
|
|
await upsertMessagesIntoDB({
|
|
|
groupToken: group_token,
|
|
|
apiMessages: [data.message],
|
|
|
@@ -779,7 +770,7 @@ const GroupChatScreen = ({ route }: { route: any }) => {
|
|
|
break;
|
|
|
|
|
|
case 'new_reaction':
|
|
|
- if (data.group_token === group_token && data.reaction) {
|
|
|
+ if (data.group_token === group_token && data.reaction && data.uid !== +currentUserId) {
|
|
|
const record = await findGroupMsgRecord(data.reaction.message_id, group_token);
|
|
|
|
|
|
if (!record) return;
|
|
|
@@ -799,7 +790,11 @@ const GroupChatScreen = ({ route }: { route: any }) => {
|
|
|
break;
|
|
|
|
|
|
case 'unreact':
|
|
|
- if (data.group_token === group_token && data.unreacted_message_id) {
|
|
|
+ if (
|
|
|
+ data.group_token === group_token &&
|
|
|
+ data.unreacted_message_id &&
|
|
|
+ data.uid !== +currentUserId
|
|
|
+ ) {
|
|
|
const record = await findGroupMsgRecord(data.unreacted_message_id, group_token);
|
|
|
|
|
|
if (!record) return;
|
|
|
@@ -817,7 +812,11 @@ const GroupChatScreen = ({ route }: { route: any }) => {
|
|
|
break;
|
|
|
|
|
|
case 'delete_message':
|
|
|
- if (data.group_token === group_token && data.deleted_message_id) {
|
|
|
+ if (
|
|
|
+ data.group_token === group_token &&
|
|
|
+ data.deleted_message_id &&
|
|
|
+ data.uid !== +currentUserId
|
|
|
+ ) {
|
|
|
const record = await findGroupMsgRecord(data.deleted_message_id, group_token);
|
|
|
if (!record) return;
|
|
|
|
|
|
@@ -847,7 +846,12 @@ const GroupChatScreen = ({ route }: { route: any }) => {
|
|
|
|
|
|
case 'messages_read':
|
|
|
const readIds = data.read_messages_ids;
|
|
|
- if (data.group_token === group_token && Array.isArray(readIds) && readIds.length) {
|
|
|
+ if (
|
|
|
+ data.group_token === group_token &&
|
|
|
+ Array.isArray(readIds) &&
|
|
|
+ readIds.length &&
|
|
|
+ data.uid !== +currentUserId
|
|
|
+ ) {
|
|
|
const records = await database
|
|
|
.get<Message>('messages')
|
|
|
.query(Q.where('chat_key', 'g:' + group_token), Q.where('message_id', Q.oneOf(readIds)))
|
|
|
@@ -855,18 +859,25 @@ const GroupChatScreen = ({ route }: { route: any }) => {
|
|
|
|
|
|
if (!records.length) return;
|
|
|
|
|
|
- const prepared = records.map((r) =>
|
|
|
- r.prepareUpdate((m) => {
|
|
|
- m.status = 3;
|
|
|
- })
|
|
|
- );
|
|
|
-
|
|
|
- await database.batch(prepared);
|
|
|
+ await database.write(async () => {
|
|
|
+ records.forEach((msg: Message) => {
|
|
|
+ msg.update((r) => {
|
|
|
+ r.status = 3;
|
|
|
+ (r as any)._raw._status = 'synced';
|
|
|
+ (r as any)._raw._changed = '';
|
|
|
+ });
|
|
|
+ });
|
|
|
+ });
|
|
|
}
|
|
|
break;
|
|
|
case 'messages_received':
|
|
|
const receivedIds = data.received_messages_ids;
|
|
|
- if (data.group_token === group_token && Array.isArray(receivedIds) && receivedIds.length) {
|
|
|
+ if (
|
|
|
+ data.group_token === group_token &&
|
|
|
+ Array.isArray(receivedIds) &&
|
|
|
+ receivedIds.length &&
|
|
|
+ data.uid !== +currentUserId
|
|
|
+ ) {
|
|
|
const records = await database
|
|
|
.get<Message>('messages')
|
|
|
.query(
|
|
|
@@ -882,6 +893,8 @@ const GroupChatScreen = ({ route }: { route: any }) => {
|
|
|
r.update((m) => {
|
|
|
m.status = 2;
|
|
|
m.isSending = false;
|
|
|
+ (m as any)._raw._status = 'synced';
|
|
|
+ (m as any)._raw._changed = '';
|
|
|
});
|
|
|
});
|
|
|
});
|
|
|
@@ -889,7 +902,7 @@ const GroupChatScreen = ({ route }: { route: any }) => {
|
|
|
break;
|
|
|
|
|
|
case 'edited_message':
|
|
|
- if (data.group_token === group_token && data.message) {
|
|
|
+ if (data.group_token === group_token && data.message && data.uid !== +currentUserId) {
|
|
|
const record = await findGroupMsgRecord(data.message.id, group_token);
|
|
|
|
|
|
if (!record) return;
|
|
|
@@ -1092,6 +1105,7 @@ const GroupChatScreen = ({ route }: { route: any }) => {
|
|
|
}, [giftedMessages, unreadMessageIndex]);
|
|
|
|
|
|
const reconcileDebounced = useMemo(() => _.debounce(reconcileChatRange, 300), []);
|
|
|
+
|
|
|
useEffect(() => {
|
|
|
return () => {
|
|
|
reconcileDebounced.cancel();
|
|
|
@@ -1099,7 +1113,16 @@ const GroupChatScreen = ({ route }: { route: any }) => {
|
|
|
}, []);
|
|
|
|
|
|
useEffect(() => {
|
|
|
- if (!chatData?.messages?.length) return;
|
|
|
+ if (!isFetchedAfterMount) {
|
|
|
+ if (!isRefetching) {
|
|
|
+ refetch();
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!chatData?.messages?.length) {
|
|
|
+ setHasMoreMessages(false);
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
upsertMessagesIntoDB({ groupToken: group_token, apiMessages: chatData.messages });
|
|
|
|
|
|
@@ -1110,7 +1133,7 @@ const GroupChatScreen = ({ route }: { route: any }) => {
|
|
|
if (chatData.messages.length < 50) {
|
|
|
setHasMoreMessages(false);
|
|
|
}
|
|
|
- }, [chatData]);
|
|
|
+ }, [chatData, isRefetching]);
|
|
|
|
|
|
useEffect(() => {
|
|
|
if (giftedMessages) {
|
|
|
@@ -1701,9 +1724,10 @@ const GroupChatScreen = ({ route }: { route: any }) => {
|
|
|
}
|
|
|
];
|
|
|
|
|
|
+ const newReactions = JSON.stringify(updatedReactions);
|
|
|
await database.write(async () => {
|
|
|
existingMsg.update((r) => {
|
|
|
- r.reactions = JSON.stringify(updatedReactions);
|
|
|
+ r.reactions = newReactions;
|
|
|
addMessageDirtyAction(r, {
|
|
|
type: 'reaction',
|
|
|
value: reaction as string
|