diff --git a/apps/meteor/app/ui-message/client/popup/messagePopupConfig.ts b/apps/meteor/app/ui-message/client/popup/messagePopupConfig.ts index 1d220f8bce8..1bd9f0171c6 100644 --- a/apps/meteor/app/ui-message/client/popup/messagePopupConfig.ts +++ b/apps/meteor/app/ui-message/client/popup/messagePopupConfig.ts @@ -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(); Meteor.startup(() => { Tracker.autorun(() => { @@ -27,7 +28,7 @@ Meteor.startup(() => { return; } - usersFromRoomMessages.remove({}); + usersFromRoomMessages.clear(); const uniqueMessageUsersControl: Record = {}; @@ -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, - }), - ); + }); + }); }); }); diff --git a/apps/meteor/client/views/room/providers/ComposerPopupProvider.tsx b/apps/meteor/client/views/room/providers/ComposerPopupProvider.tsx index 6293a401da8..42bdb49f43a 100644 --- a/apps/meteor/client/views/room/providers/ComposerPopupProvider.tsx +++ b/apps/meteor/client/views/room/providers/ComposerPopupProvider.tsx @@ -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; });