diff --git a/apps/meteor/client/views/root/hooks/useLoadMissedMessages.ts b/apps/meteor/client/views/root/hooks/useLoadMissedMessages.ts index 631a7c107e0a9..9578f57931673 100644 --- a/apps/meteor/client/views/root/hooks/useLoadMissedMessages.ts +++ b/apps/meteor/client/views/root/hooks/useLoadMissedMessages.ts @@ -3,8 +3,7 @@ import { useConnectionStatus } from '@rocket.chat/ui-contexts'; import { useEffect, useRef } from 'react'; import { LegacyRoomManager, upsertMessage } from '../../../../app/ui-utils/client'; -import { sdk } from '../../../../app/utils/client/lib/SDKClient'; -import { mapMessageFromApi } from '../../../lib/utils/mapMessageFromApi'; +import { callWithErrorHandling } from '../../../lib/utils/callWithErrorHandling'; import { Messages, Subscriptions } from '../../../stores'; /** @@ -22,33 +21,15 @@ const loadMissedMessages = async (rid: IRoom['_id']): Promise => { } try { - const { result } = await sdk.rest.get('/v1/chat.syncMessages', { - roomId: rid, - lastUpdate: lastMessage.ts.toISOString(), - }); - - if (result?.updated?.length) { + // TODO(ddp-removal): this should move to `/v1/chat.syncMessages` so reconnect + // also reconciles edits/deletions made while offline, but that endpoint queries + // by `_updatedAt` (+ trash collection) and is currently too slow for this path. + // Evaluate/optimize the query before migrating; for now keep the DDP method. + const result = await callWithErrorHandling('loadMissedMessages', rid, lastMessage.ts); + if (result) { const subscription = Subscriptions.state.find((record) => record.rid === rid); - // `/v1/chat.syncMessages` returns everything changed since `lastUpdate` by - // `_updatedAt`, which includes edits to older messages. We only want to - // upsert messages that are genuinely new (created after our newest loaded - // message) or that are already loaded (so edits stay in sync), otherwise we - // would inject stale messages into the room history. - await Promise.all( - result.updated - .map(mapMessageFromApi) - .filter((msg) => msg.ts.getTime() > lastMessage.ts.getTime() || Messages.state.has(msg._id)) - .map((msg) => upsertMessage({ msg, subscription })), - ); + await Promise.all(Array.from(result).map((msg) => upsertMessage({ msg, subscription }))); } - - // Drop messages that were deleted while the connection was down, but only if - // they are currently loaded. - result?.deleted?.forEach(({ _id }) => { - if (Messages.state.has(_id)) { - Messages.state.delete(_id); - } - }); } catch (error) { console.error('Error loading missed messages:', error); } diff --git a/apps/meteor/server/methods/loadMissedMessages.ts b/apps/meteor/server/methods/loadMissedMessages.ts index 30f45f5fcefca..4a4b535fec099 100644 --- a/apps/meteor/server/methods/loadMissedMessages.ts +++ b/apps/meteor/server/methods/loadMissedMessages.ts @@ -5,7 +5,6 @@ import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { canAccessRoomIdAsync } from '../../app/authorization/server/functions/canAccessRoom'; -import { methodDeprecationLogger } from '../../app/lib/server/lib/deprecationWarningLogger'; declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention @@ -16,7 +15,6 @@ declare module '@rocket.chat/ddp-client' { Meteor.methods({ async loadMissedMessages(rid, start) { - methodDeprecationLogger.method('loadMissedMessages', '9.0.0', '/v1/chat.syncMessages'); check(rid, String); check(start, Date);