chore: Replace non-reactive collection usage with a `Map` (#35598)

pull/34494/head^2
Tasso Evangelista 10 months ago committed by GitHub
parent c7fe526871
commit 5cd142b798
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 17
      apps/meteor/app/ui-message/client/popup/messagePopupConfig.ts
  2. 36
      apps/meteor/client/views/room/providers/ComposerPopupProvider.tsx

@ -1,19 +1,20 @@
import type { IUser } from '@rocket.chat/core-typings';
import { Meteor } from 'meteor/meteor';
import { Mongo } from 'meteor/mongo';
import { Tracker } from 'meteor/tracker';
import { RoomManager } from '../../../../client/lib/RoomManager';
import { asReactiveSource } from '../../../../client/lib/tracker';
import { Messages } from '../../../models/client';
export const usersFromRoomMessages = new Mongo.Collection<{
type UserFromRoomMessage = {
_id: string;
username: string;
name: string | undefined;
ts: Date;
suggestion?: boolean;
}>(null);
};
export const usersFromRoomMessages = new Map<UserFromRoomMessage['_id'], UserFromRoomMessage>();
Meteor.startup(() => {
Tracker.autorun(() => {
@ -27,7 +28,7 @@ Meteor.startup(() => {
return;
}
usersFromRoomMessages.remove({});
usersFromRoomMessages.clear();
const uniqueMessageUsersControl: Record<string, boolean> = {};
@ -53,13 +54,13 @@ Meteor.startup(() => {
uniqueMessageUsersControl[username] = true;
return notMapped;
})
.forEach(({ u: { username, name, _id }, ts }) =>
usersFromRoomMessages.upsert(_id, {
.forEach(({ u: { username, name, _id }, ts }) => {
usersFromRoomMessages.set(_id, {
_id,
username,
name,
ts,
}),
);
});
});
});
});

@ -64,20 +64,10 @@ const ComposerPopupProvider = ({ children, room }: ComposerPopupProviderProps) =
const filterRegex = filter && new RegExp(escapeRegExp(filter), 'i');
const items: ComposerBoxPopupUserProps[] = [];
const users = usersFromRoomMessages
.find(
{
ts: { $exists: true },
...(filter && {
$or: [{ username: filterRegex }, { name: filterRegex }],
}),
},
{
limit: suggestionsCount ?? 5,
sort: { ts: -1 },
},
)
.fetch()
const users = Array.from(usersFromRoomMessages.values())
.filter((u) => !!u.ts && (filterRegex ? u.username.match(filterRegex) || u.name?.match(filterRegex) : true))
.sort((a, b) => b.ts.getTime() - a.ts.getTime())
.slice(0, suggestionsCount ?? 5)
.map((u) => {
u.suggestion = true;
return u;
@ -106,20 +96,10 @@ const ComposerPopupProvider = ({ children, room }: ComposerPopupProviderProps) =
},
getItemsFromServer: async (filter: string) => {
const filterRegex = filter && new RegExp(escapeRegExp(filter), 'i');
const usernames = usersFromRoomMessages
.find(
{
ts: { $exists: true },
...(filter && {
$or: [{ username: filterRegex }, { name: filterRegex }],
}),
},
{
limit: suggestionsCount ?? 5,
sort: { ts: -1 },
},
)
.fetch()
const usernames = Array.from(usersFromRoomMessages.values())
.filter((u) => !!u.ts && (filterRegex ? u.username.match(filterRegex) || u.name?.match(filterRegex) : true))
.sort((a, b) => b.ts.getTime() - a.ts.getTime())
.slice(0, suggestionsCount ?? 5)
.map((u) => {
return u.username;
});

Loading…
Cancel
Save