From 3e3c9e7bdf4a798e8c99b5fe0af80028759c7c4d Mon Sep 17 00:00:00 2001 From: Patryk Osmaczko Date: Thu, 6 Apr 2023 19:16:56 +0200 Subject: [PATCH] fix(chat): use `scrollTo` mechanism for `firstUnseenMessage` - it ensures enough messages are loaded when `firstUnseenMessage` is not within the range of initially loaded messages fixes: #10197 --- .../chat_content/messages/io_interface.nim | 3 +++ .../chat_section/chat_content/messages/module.nim | 13 ++++++++++--- .../chat_section/chat_content/messages/view.nim | 4 ---- .../main/chat_section/chat_content/module.nim | 2 +- ui/app/AppLayouts/Chat/views/ChatMessagesView.qml | 6 ------ 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/app/modules/main/chat_section/chat_content/messages/io_interface.nim b/src/app/modules/main/chat_section/chat_content/messages/io_interface.nim index 018b0f4cf3..10048e0b2f 100644 --- a/src/app/modules/main/chat_section/chat_content/messages/io_interface.nim +++ b/src/app/modules/main/chat_section/chat_content/messages/io_interface.nim @@ -153,6 +153,9 @@ method resendChatMessage*(self: AccessInterface, messageId: string): string = method resetNewMessagesMarker*(self: AccessInterface) = raise newException(ValueError, "No implementation available") +method resetAndScrollToNewMessagesMarker*(self: AccessInterface) = + raise newException(ValueError, "No implementation available") + method markAllMessagesRead*(self: AccessInterface) = raise newException(ValueError, "No implementation available") diff --git a/src/app/modules/main/chat_section/chat_content/messages/module.nim b/src/app/modules/main/chat_section/chat_content/messages/module.nim index 591f2f87b4..2f6e305362 100644 --- a/src/app/modules/main/chat_section/chat_content/messages/module.nim +++ b/src/app/modules/main/chat_section/chat_content/messages/module.nim @@ -32,6 +32,7 @@ type viewVariant: QVariant controller: Controller moduleLoaded: bool + scrollToFirstUnseenMessageWhenLoaded: bool proc newModule*(delegate: delegate_interface.AccessInterface, events: EventEmitter, sectionId: string, chatId: string, belongsToCommunity: bool, contactService: contact_service.Service, communityService: community_service.Service, @@ -44,6 +45,7 @@ proc newModule*(delegate: delegate_interface.AccessInterface, events: EventEmitt result.controller = controller.newController(result, events, sectionId, chatId, belongsToCommunity, contactService, communityService, chatService, messageService, mailserversService) result.moduleLoaded = false + result.scrollToFirstUnseenMessageWhenLoaded = true # Forward declaration proc createChatIdentifierItem(self: Module): Item @@ -682,6 +684,12 @@ method resendChatMessage*(self: Module, messageId: string): string = return self.controller.resendChatMessage(messageId) method resetNewMessagesMarker*(self: Module) = + self.scrollToFirstUnseenMessageWhenLoaded = false + self.view.setFirstUnseenMessageLoaded(false) + self.controller.getAsyncFirstUnseenMessageId() + +method resetAndScrollToNewMessagesMarker*(self: Module) = + self.scrollToFirstUnseenMessageWhenLoaded = true self.view.setFirstUnseenMessageLoaded(false) self.controller.getAsyncFirstUnseenMessageId() @@ -723,7 +731,6 @@ proc updateItemsByAlbum(self: Module, items: var seq[Item], message: MessageDto) method onFirstUnseenMessageLoaded*(self: Module, messageId: string) = self.view.model().setFirstUnseenMessageId(messageId) self.view.model().resetNewMessagesMarker() - let index = self.view.model().findIndexForMessageId(messageId) - if (index != -1): - self.view.emitScrollToFirstUnreadMessageSignal(index) + if self.scrollToFirstUnseenMessageWhenLoaded: + self.scrollToMessage(messageId) self.view.setFirstUnseenMessageLoaded(true) diff --git a/src/app/modules/main/chat_section/chat_content/messages/view.nim b/src/app/modules/main/chat_section/chat_content/messages/view.nim index 1086611161..c9aa15fda0 100644 --- a/src/app/modules/main/chat_section/chat_content/messages/view.nim +++ b/src/app/modules/main/chat_section/chat_content/messages/view.nim @@ -246,7 +246,3 @@ QtObject: QtProperty[bool] firstUnseenMessageLoaded: read = getFirstUnseenMessageLoaded notify = firstUnseenMessageLoadedChanged - - proc scrollToFirstUnreadMessage(self: View, messageIndex: int) {.signal.} - proc emitScrollToFirstUnreadMessageSignal*(self: View, messageIndex: int) = - self.scrollToFirstUnreadMessage(messageIndex) \ No newline at end of file diff --git a/src/app/modules/main/chat_section/chat_content/module.nim b/src/app/modules/main/chat_section/chat_content/module.nim index d790fb0c16..745e1ebe48 100644 --- a/src/app/modules/main/chat_section/chat_content/module.nim +++ b/src/app/modules/main/chat_section/chat_content/module.nim @@ -387,7 +387,7 @@ method contactTrustStatusChanged*(self: Module, publicKey: string, isUntrustwort self.view.updateTrustStatus(isUntrustworthy) method onMadeActive*(self: Module) = - self.messagesModule.resetNewMessagesMarker() + self.messagesModule.resetAndScrollToNewMessagesMarker() self.view.setActive() method onMadeInactive*(self: Module) = diff --git a/ui/app/AppLayouts/Chat/views/ChatMessagesView.qml b/ui/app/AppLayouts/Chat/views/ChatMessagesView.qml index 32f3e59e5f..03148e931b 100644 --- a/ui/app/AppLayouts/Chat/views/ChatMessagesView.qml +++ b/ui/app/AppLayouts/Chat/views/ChatMessagesView.qml @@ -87,12 +87,6 @@ Item { function onScrollToMessage(messageIndex) { d.goToMessage(messageIndex) } - - function onScrollToFirstUnreadMessage(messageIndex) { - if (d.isMostRecentMessageInViewport) { - d.goToMessage(messageIndex) - } - } } Connections {