From c3962ec0aadde5b33b33834229a923835d1d4ecf Mon Sep 17 00:00:00 2001
From: Guilherme Gazzo <guilhermegazzo@gmail.com>
Date: Wed, 20 Jan 2021 17:12:43 -0300
Subject: [PATCH] [FIX] Jump to message (#20265)

---
 app/ui-utils/client/lib/RoomHistoryManager.js | 32 +++++++++++++------
 app/ui-utils/client/lib/openRoom.js           |  7 ++--
 2 files changed, 27 insertions(+), 12 deletions(-)

diff --git a/app/ui-utils/client/lib/RoomHistoryManager.js b/app/ui-utils/client/lib/RoomHistoryManager.js
index 0773b4a95d1..dfabe770a9c 100644
--- a/app/ui-utils/client/lib/RoomHistoryManager.js
+++ b/app/ui-utils/client/lib/RoomHistoryManager.js
@@ -33,6 +33,21 @@ export const normalizeThreadMessage = ({ ...message }) => {
 	}
 };
 
+
+const waitUntilWrapperExists = async () => document.querySelector('.messages-box .wrapper') || new Promise((resolve) => {
+	const observer = new MutationObserver(function(mutations, obs) {
+		const element = document.querySelector('.messages-box .wrapper');
+		if (element) {
+			obs.disconnect(); // stop observing
+			return resolve(element);
+		}
+	});
+	observer.observe(document, {
+		childList: true,
+		subtree: true,
+	});
+});
+
 export const upsertMessage = async ({ msg, subscription, uid = Tracker.nonreactive(() => Meteor.userId()) }, collection = ChatMessage) => {
 	const userId = msg.u && msg.u._id;
 
@@ -230,29 +245,26 @@ export const RoomHistoryManager = new class {
 		}
 	}
 
-	getSurroundingMessages(message, limit = defaultLimit) {
+	async getSurroundingMessages(message, limit = defaultLimit) {
 		if (!message || !message.rid) {
 			return;
 		}
 
-		const instance = Blaze.getView($('.messages-box .wrapper')[0]).templateInstance();
+		const w = await waitUntilWrapperExists();
+
+		const instance = Blaze.getView(w).templateInstance();
 
 		if (ChatMessage.findOne({ _id: message._id, _hidden: { $ne: true } })) {
-			const wrapper = $('.messages-box .wrapper');
-			const msgElement = $(`#${ message._id }`, wrapper);
+			const msgElement = $(`#${ message._id }`, w);
 			if (msgElement.length === 0) {
 				return;
 			}
+
+			const wrapper = $('.messages-box .wrapper');
 			const pos = (wrapper.scrollTop() + msgElement.offset().top) - (wrapper.height() / 2);
 			wrapper.animate({
 				scrollTop: pos,
 			}, 500);
-			msgElement.addClass('highlight');
-
-			setTimeout(function() {
-				const messages = wrapper[0];
-				instance.atBottom = messages.scrollTop >= (messages.scrollHeight - messages.clientHeight);
-			});
 
 			return setTimeout(() => msgElement.removeClass('highlight'), 500);
 		}
diff --git a/app/ui-utils/client/lib/openRoom.js b/app/ui-utils/client/lib/openRoom.js
index 2b361485a36..a2fb5a15591 100644
--- a/app/ui-utils/client/lib/openRoom.js
+++ b/app/ui-utils/client/lib/openRoom.js
@@ -79,7 +79,7 @@ export const openRoom = async function(type, name) {
 			}
 
 
-			if (room._id === Session.get('openedRoom')) {
+			if (room._id === Session.get('openedRoom') && !FlowRouter.getQueryParam('msg')) {
 				return;
 			}
 
@@ -125,13 +125,16 @@ export const openRoom = async function(type, name) {
 				const messageId = FlowRouter.getQueryParam('msg');
 				const msg = { _id: messageId, rid: room._id };
 
-				const message = Messages.findOne({ ss_id: msg._id }) || (await call('getMessages', [msg._id]))[0];
+				const message = Messages.findOne({ _id: msg._id }) || (await call('getMessages', [msg._id]))[0];
 
 				if (message && (message.tmid || message.tcount)) {
 					return FlowRouter.setParams({ tab: 'thread', context: message.tmid || message._id });
 				}
 
 				RoomHistoryManager.getSurroundingMessages(msg);
+				FlowRouter.setQueryParams({
+					msg: undefined,
+				});
 			}
 
 			return callbacks.run('enter-room', sub);
-- 
GitLab