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