Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 2 additions & 2 deletions apps/meteor/app/lib/client/methods/sendMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ Meteor.methods<ServerMethods>({
if (!uid || trim(message.msg) === '') {
return false;
}
const messageAlreadyExists = message._id && Messages.findOne({ _id: message._id });
const messageAlreadyExists = message._id && Messages.state.get(message._id);
if (messageAlreadyExists) {
return dispatchToastMessage({ type: 'error', message: t('Message_Already_Sent') });
}
Expand All @@ -42,7 +42,7 @@ Meteor.methods<ServerMethods>({
}

await onClientMessageReceived(message as IMessage).then((message) => {
Messages.insert(message);
Messages.state.store(message);
return callbacks.run('afterSaveMessage', message, { room });
});
},
Expand Down
2 changes: 1 addition & 1 deletion apps/meteor/app/models/client/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ export {
Rooms,
/** @deprecated new code refer to Minimongo collections like this one; prefer fetching data from the REST API, listening to changes via streamer events, and storing the state in a Tanstack Query */
Subscriptions,
/** @deprecated new code refer to Minimongo collections like this one; prefer fetching data from the REST API, listening to changes via streamer events, and storing the state in a Tanstack Query */
/** @deprecated prefer fetching data from the REST API, listening to changes via streamer events, and storing the state in a Tanstack Query */
Messages,
};
13 changes: 8 additions & 5 deletions apps/meteor/app/models/client/models/Messages.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import type { IMessage } from '@rocket.chat/core-typings';

import { MinimongoCollection } from '../../../../client/lib/cachedCollections/MinimongoCollection';
import { createDocumentMapStore } from '../../../../client/lib/cachedCollections/DocumentMapStore';

/** @deprecated new code refer to Minimongo collections like this one; prefer fetching data from the REST API, listening to changes via streamer events, and storing the state in a Tanstack Query */
export const Messages = new MinimongoCollection<
IMessage & { ignored?: boolean; autoTranslateFetching?: boolean; autoTranslateShowInverse?: boolean }
>();
/** @deprecated prefer fetching data from the REST API, listening to changes via streamer events, and storing the state in a Tanstack Query */
export const Messages = {
use: createDocumentMapStore<IMessage & { ignored?: boolean; autoTranslateFetching?: boolean; autoTranslateShowInverse?: boolean }>(),
get state() {
return Messages.use.getState();
},
};
4 changes: 3 additions & 1 deletion apps/meteor/app/otr/client/OTRRoom.ts
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,9 @@ export class OTRRoom implements IOTRRoom {
}

deleteOTRMessages(): void {
Messages.remove({ t: { $in: ['otr', 'otr-ack', ...Object.values(otrSystemMessages)] }, rid: this._roomId });
Messages.state.remove(
(record) => record.rid === this._roomId && !!record.t && ['otr', 'otr-ack', ...Object.values(otrSystemMessages)].includes(record.t),
);
}

end(): void {
Expand Down
17 changes: 13 additions & 4 deletions apps/meteor/app/reactions/client/methods/setReaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Meteor.methods<ServerMethods>({
return false;
}

const message: IMessage | undefined = Messages.findOne({ _id: messageId });
const message: IMessage | undefined = Messages.state.get(messageId);
if (!message) {
return false;
}
Expand Down Expand Up @@ -53,9 +53,15 @@ Meteor.methods<ServerMethods>({

if (!message.reactions || typeof message.reactions !== 'object' || Object.keys(message.reactions).length === 0) {
delete message.reactions;
Messages.update({ _id: messageId }, { $unset: { reactions: 1 } });
Messages.state.update(
(record) => record._id === messageId,
({ reactions: _, ...record }) => record,
);
} else {
Messages.update({ _id: messageId }, { $set: { reactions: message.reactions } });
Messages.state.update(
(record) => record._id === messageId,
(record) => ({ ...record, reactions: message.reactions }),
);
}
} else {
if (!message.reactions) {
Expand All @@ -68,7 +74,10 @@ Meteor.methods<ServerMethods>({
}
message.reactions[reaction].usernames.push(user.username);

Messages.update({ _id: messageId }, { $set: { reactions: message.reactions } });
Messages.state.update(
(record) => record._id === messageId,
(record) => ({ ...record, reactions: message.reactions }),
);
}
},
});
2 changes: 1 addition & 1 deletion apps/meteor/app/ui-message/client/findParentMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export const findParentMessage = (() => {
};

return async (tmid: IMessage['_id']) => {
const message = Messages.findOne({ _id: tmid });
const message = Messages.state.get(tmid);

if (message) {
return message;
Expand Down
63 changes: 30 additions & 33 deletions apps/meteor/app/ui-utils/client/lib/LegacyRoomManager.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import type { IMessage, IRoom } from '@rocket.chat/core-typings';
import { createPredicateFromFilter } from '@rocket.chat/mongo-adapter';
import type { Filter } from '@rocket.chat/mongo-adapter';
import { ReactiveVar } from 'meteor/reactive-var';
import { Tracker } from 'meteor/tracker';
import type { Filter } from 'mongodb';

import { upsertMessage, RoomHistoryManager } from './RoomHistoryManager';
import { mainReady } from './mainReady';
Expand Down Expand Up @@ -104,7 +105,8 @@ const computation = Tracker.autorun(() => {
// Do not load command messages into channel
if (msg.t !== 'command') {
const subscription = Subscriptions.findOne({ rid: record.rid }, { reactive: false });
const isNew = !Messages.findOne({ _id: msg._id, temp: { $ne: true } });
const isNew = !Messages.state.find((record) => record._id === msg._id && record.temp !== true);
({ _id: msg._id, temp: { $ne: true } });
await upsertMessage({ msg, subscription });

if (isNew) {
Expand Down Expand Up @@ -137,10 +139,13 @@ const computation = Tracker.autorun(() => {
});

sdk.stream('notify-room', [`${record.rid}/deleteMessage`], (msg) => {
Messages.remove({ _id: msg._id });
Messages.state.delete(msg._id);

// remove thread refenrece from deleted message
Messages.update({ tmid: msg._id }, { $unset: { tmid: 1 } }, { multi: true });
Messages.state.update(
(record) => record.tmid === msg._id,
({ tmid: _, ...record }) => record,
);
});

sdk.stream(
Expand All @@ -164,44 +169,36 @@ const computation = Tracker.autorun(() => {
query['u.username'] = { $in: users };
}

const predicate = createPredicateFromFilter(query);

if (showDeletedStatus) {
return Messages.update(
query,
{ $set: { t: 'rm', msg: '', urls: [], mentions: [], attachments: [], reactions: {} } },
{ multi: true },
);
return Messages.state.update(predicate, (record) => ({
...record,
t: 'rm',
msg: '',
urls: [],
mentions: [],
attachments: [],
reactions: {},
}));
}
return Messages.remove(query);

return Messages.state.remove(predicate);
},
);

sdk.stream('notify-room', [`${record.rid}/messagesRead`], ({ tmid, until }) => {
if (tmid) {
return Messages.update(
{
tmid,
unread: true,
},
{ $unset: { unread: 1 } },
{ multi: true },
Messages.state.update(
(record) => record.tmid === tmid && record.unread === true,
({ unread: _, ...record }) => record,
);
return;
}
Messages.update(
{
rid: record.rid,
unread: true,
ts: { $lt: until },
$or: [
{
tmid: { $exists: false },
},
{
tshow: true,
},
],
},
{ $unset: { unread: 1 } },
{ multi: true },
Messages.state.update(
(r) =>
r.rid === record.rid && r.unread === true && r.ts.getTime() < until.getTime() && (r.tmid === undefined || r.tshow === true),
({ unread: _, ...r }) => r,
);
});
}
Expand Down
11 changes: 7 additions & 4 deletions apps/meteor/app/ui-utils/client/lib/RoomHistoryManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,10 @@ class RoomHistoryManagerClass extends Emitter {

room.isLoading.set(true);

const lastMessage = Messages.findOne({ rid, _hidden: { $ne: true } }, { sort: { ts: -1 } });
const lastMessage = Messages.state.findFirst(
(record) => record.rid === rid && record._hidden !== true,
(a, b) => b.ts.getTime() - a.ts.getTime(),
);

const subscription = Subscriptions.findOne({ rid });

Expand Down Expand Up @@ -278,13 +281,13 @@ class RoomHistoryManagerClass extends Emitter {
}

public close(rid: IRoom['_id']) {
Messages.remove({ rid });
Messages.state.remove((record) => record.rid === rid);
delete this.histories[rid];
}

public clear(rid: IRoom['_id']) {
const room = this.getRoom(rid);
Messages.remove({ rid });
Messages.state.remove((record) => record.rid === rid);
room.isLoading.set(false);
room.hasMore.set(true);
room.hasMoreNext.set(false);
Expand All @@ -297,7 +300,7 @@ class RoomHistoryManagerClass extends Emitter {
return;
}

const messageAlreadyLoaded = Boolean(Messages.findOne({ _id: message._id, _hidden: { $ne: true } }));
const messageAlreadyLoaded = Messages.state.some((record) => record._id === message._id && record._hidden !== true);

if (messageAlreadyLoaded) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ export const useTranslateAction = (
[message, language],
);

const updateMessages = Messages.use((state) => state.update);

if (!autoTranslateEnabled || !canAutoTranslate || !user) {
return null;
}
Expand All @@ -48,11 +50,19 @@ export const useTranslateAction = (
action() {
if (!hasTranslations) {
AutoTranslate.messageIdsToWait[message._id] = true;
Messages.update({ _id: message._id }, { $set: { autoTranslateFetching: true } });
updateMessages(
(record) => record._id === message._id,
(record) => ({ ...record, autoTranslateFetching: true }),
);
void translateMessage(message, language);
}
const action = 'autoTranslateShowInverse' in message ? '$unset' : '$set';
Messages.update({ _id: message._id }, { [action]: { autoTranslateShowInverse: true } });

updateMessages(
(record) => record._id === message._id,
'autoTranslateShowInverse' in message
? ({ autoTranslateShowInverse: _, ...record }) => record
: (record) => ({ ...record, autoTranslateShowInverse: true }),
);
},
order: 90,
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ export const useViewOriginalTranslationAction = (
[message, language],
);

const updateMessages = Messages.use((state) => state.update);

if (!autoTranslateEnabled || !canAutoTranslate || !user) {
return null;
}
Expand All @@ -48,11 +50,19 @@ export const useViewOriginalTranslationAction = (
action() {
if (!hasTranslations) {
AutoTranslate.messageIdsToWait[message._id] = true;
Messages.update({ _id: message._id }, { $set: { autoTranslateFetching: true } });
updateMessages(
(record) => record._id === message._id,
(record) => ({ ...record, autoTranslateFetching: true }),
);
void translateMessage(message, language);
}
const action = 'autoTranslateShowInverse' in message ? '$unset' : '$set';
Messages.update({ _id: message._id }, { [action]: { autoTranslateShowInverse: true } });

updateMessages(
(record) => record._id === message._id,
'autoTranslateShowInverse' in message
? ({ autoTranslateShowInverse: _, ...record }) => record
: (record) => ({ ...record, autoTranslateShowInverse: true }),
);
},
order: 90,
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ export abstract class CachedCollection<T extends IRocketChatRecord, U = T> {
}

if (action === 'removed') {
this.collection.state.delete(newRecord);
this.collection.state.delete(newRecord._id);
} else {
const { _id } = newRecord;
if (!_id) return;
Expand Down Expand Up @@ -280,7 +280,7 @@ export abstract class CachedCollection<T extends IRocketChatRecord, U = T> {
const actionTime = newRecord._deletedAt;
changes.push({
action: () => {
this.collection.state.delete(newRecord);
this.collection.state.delete(newRecord._id);
if (actionTime > this.updatedAt) {
this.updatedAt = actionTime;
}
Expand Down
Loading
Loading