Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion app/lib/methods/loadMessagesForRoom.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ export function loadMessagesForRoom(args: {
if (data?.length) {
const lastMessage = data[data.length - 1];
const lastMessageRecord = await getMessageById(lastMessage._id as string);
if (!lastMessageRecord && data.length === COUNT) {
const uniqueTmids = [...new Set(data.map(m => m.tmid).filter(Boolean))];
if (!lastMessageRecord && data.length === COUNT && !uniqueTmids) {
const loadMoreMessage = {
_id: generateLoadMoreId(lastMessage._id as string),
rid: lastMessage.rid,
Expand All @@ -52,6 +53,16 @@ export function loadMessagesForRoom(args: {
} as IMessage;
data.push(loadMoreMessage);
}
const onlyThreadMessages = !data.find(item => !item.tmid);
if (uniqueTmids && onlyThreadMessages) {
await Promise.allSettled(
uniqueTmids.map(async tmid => {
const threadMessageRecord = (await sdk.get('chat.getMessage', { msgId: tmid as string })) as any;
data.push(threadMessageRecord?.message as IMessage);
})
);
}

await updateMessages({ rid: args.rid, update: data, loaderItem: args.loaderItem });
return resolve();
}
Expand Down
71 changes: 71 additions & 0 deletions app/lib/methods/loadPreviousMessages.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import { compareServerVersion } from './helpers';
import updateMessages from './updateMessages';
import sdk from '../services/sdk';
import { store } from '../store/auxStore';
import { getSubscriptionByRoomId } from '../database/services/Subscription';

const count = 50;

const syncMessages = async ({ roomId, previous, type }: { roomId: string; previous: number; type: 'UPDATED' | 'DELETED' }) => {
// @ts-ignore // this method dont have type
const { result } = await sdk.get('chat.syncMessages', { roomId, previous, count, type });
return result;
};

const getSyncMessagesFromCursor = async (roomId: string, lastOpen: number) => {
const promises = [];

if (lastOpen) {
promises.push(syncMessages({ roomId, previous: lastOpen, type: 'UPDATED' }));
promises.push(syncMessages({ roomId, previous: lastOpen, type: 'DELETED' }));
}

const [updatedMessages, deletedMessages] = await Promise.all(promises);
return {
deleted: deletedMessages?.deleted ?? [],
deletedNext: deletedMessages?.cursor.next,
updated: updatedMessages?.updated ?? [],
updatedNext: updatedMessages?.cursor.next
};
};

const getLastUpdate = async (rid: string) => {
const sub = await getSubscriptionByRoomId(rid);
if (!sub) {
return null;
}
return sub.lastOpen;
};

async function loadPreviousMessages({ rid: roomId, lastOpen }: { rid: string; lastOpen?: Date }) {
const { version: serverVersion } = store.getState().server;
if (compareServerVersion(serverVersion, 'greaterThanOrEqualTo', '7.1.0')) {
let lastOpenTimestamp;
if (lastOpen) {
lastOpenTimestamp = new Date(lastOpen).getTime();
} else {
const lastUpdate = await getLastUpdate(roomId);
lastOpenTimestamp = lastUpdate?.getTime();
}
if (!lastOpenTimestamp) {
return;
}
const result = await getSyncMessagesFromCursor(roomId, lastOpenTimestamp);

await updateMessages({ rid: roomId, update: result.updated, remove: result.deleted });
}
Comment thread
OtavioStasiak marked this conversation as resolved.
Outdated

let lastOpenISOString;
if (lastOpen) {
lastOpenISOString = new Date(lastOpen).toISOString();
} else {
const lastUpdate = await getLastUpdate(roomId);
lastOpenISOString = lastUpdate?.toISOString();
}
// RC 0.60.0
// @ts-ignore // this method dont have type
const { result } = await sdk.get('chat.syncMessages', { roomId, lastUpdate: lastOpenISOString });
return result;
}

export default loadPreviousMessages;
18 changes: 17 additions & 1 deletion app/views/RoomView/List/hooks/useMessages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { getThreadById } from '../../../../lib/database/services/Thread';
import { compareServerVersion, useDebounce } from '../../../../lib/methods/helpers';
import { Services } from '../../../../lib/services';
import { QUERY_SIZE } from '../constants';
import loadPreviousMessages from '../../../../lib/methods/loadPreviousMessages';

export const useMessages = ({
rid,
Expand All @@ -32,6 +33,7 @@ export const useMessages = ({
const fetchMessages = useCallback(async () => {
unsubscribe();
count.current += QUERY_SIZE;
const prevIds = messagesIds.current;

if (!rid) {
return;
Expand Down Expand Up @@ -66,7 +68,7 @@ export const useMessages = ({
.observe();
}

subscription.current = observable.subscribe(result => {
subscription.current = observable.subscribe(async result => {
let newMessages: TAnyMessageModel[] = result;
if (tmid && thread.current) {
newMessages.push(thread.current);
Expand All @@ -83,6 +85,20 @@ export const useMessages = ({
readThread();
setMessages(newMessages);
messagesIds.current = newMessages.map(m => m.id);

const addedIds = messagesIds.current?.filter(id => !prevIds.includes(id));

if (!addedIds.length) {
const tsNumbers = newMessages.map(m => {
const { ts } = m as any;
return ts?.getTime();
});
const oldestTsNumber = tsNumbers.length > 0 ? Math.min(...tsNumbers) : undefined;
Comment thread
OtavioStasiak marked this conversation as resolved.
Outdated
if (oldestTsNumber) {
console.log('here');
await loadPreviousMessages({ rid, lastOpen: new Date(oldestTsNumber) });
}
}
});
}, [rid, tmid, showMessageInMainThread, serverVersion, hideSystemMessages]);

Expand Down
Loading