diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index 029260d11b..74e485eb68 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -795,10 +795,10 @@ let scrollToLatestUnread = true; if (newestMessageId) { - const message = await getMessageById(newestMessageId, { + const newestInMemoryMessage = await getMessageById(newestMessageId, { Message: Whisper.Message, }); - if (!message) { + if (!newestInMemoryMessage) { window.log.warn( `loadNewestMessages: did not find message ${newestMessageId}` ); @@ -806,7 +806,9 @@ // If newest in-memory message is unread, scrolling down would mean going to // the very bottom, not the oldest unread. - scrollToLatestUnread = !message.isUnread(); + if (newestInMemoryMessage.isUnread()) { + scrollToLatestUnread = false; + } } const metrics = await getMessageMetricsForConversation(conversationId); diff --git a/ts/state/ducks/conversations.ts b/ts/state/ducks/conversations.ts index 11aec470b2..58f2bc444e 100644 --- a/ts/state/ducks/conversations.ts +++ b/ts/state/ducks/conversations.ts @@ -736,6 +736,21 @@ export function reducer( const lookup = fromPairs(messages.map(message => [message.id, message])); + let { newest, oldest } = metrics; + + // If our metrics are a little out of date, we'll fix them up + if (messages.length > 0) { + const first = messages[0]; + if (first && (!oldest || first.received_at < oldest.received_at)) { + oldest = pick(first, ['id', 'received_at']); + } + + const last = messages[messages.length - 1]; + if (last && (!newest || last.received_at > newest.received_at)) { + newest = pick(last, ['id', 'received_at']); + } + } + return { ...state, selectedMessage: scrollToMessageId, @@ -753,7 +768,11 @@ export function reducer( ? existingConversation.scrollToMessageCounter + 1 : 0, messageIds, - metrics, + metrics: { + ...metrics, + newest, + oldest, + }, resetCounter, heightChangeMessageIds: [], },