From 4cfa4e5451bec6264e3ccfc46a0cbd68d1eb9f8e Mon Sep 17 00:00:00 2001 From: Boris Melnik Date: Fri, 7 Oct 2022 17:17:24 +0300 Subject: [PATCH] fix(replies): Fire dataChanged when contact changed in reply Closes: #7687 --- .../modules/shared_models/message_model.nim | 9 ++++++++- .../Chat/views/ChatMessagesView.qml | 12 +++++++++++ ui/imports/shared/views/chat/MessageView.qml | 20 ++++++++++++++++++- ui/imports/utils/Constants.qml | 4 ++++ 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/app/modules/shared_models/message_model.nim b/src/app/modules/shared_models/message_model.nim index 3247af931b..113a5c6dd3 100644 --- a/src/app/modules/shared_models/message_model.nim +++ b/src/app/modules/shared_models/message_model.nim @@ -430,7 +430,13 @@ QtObject: if(index < 0 or index >= self.items.len): return self.items[index].toJsonNode() - + + proc updateContactInReplies(self: Model, messageId: string) = + for i in 0 ..< self.items.len: + if (self.items[i].responseToMessageWithId == messageId): + let index = self.createIndex(i, 0, nil) + self.dataChanged(index, index, @[ModelRole.ResponseToMessageWithId.int]) + iterator modelContactUpdateIterator*(self: Model, contactId: string): Item = for i in 0 ..< self.items.len: yield self.items[i] @@ -451,6 +457,7 @@ QtObject: if(roles.len > 0): let index = self.createIndex(i, 0, nil) self.dataChanged(index, index, roles) + self.updateContactInReplies(self.items[i].id) proc setEditModeOn*(self: Model, messageId: string) = let ind = self.findIndexForMessageId(messageId) diff --git a/ui/app/AppLayouts/Chat/views/ChatMessagesView.qml b/ui/app/AppLayouts/Chat/views/ChatMessagesView.qml index dbedaf898a..eb785d7e6f 100644 --- a/ui/app/AppLayouts/Chat/views/ChatMessagesView.qml +++ b/ui/app/AppLayouts/Chat/views/ChatMessagesView.qml @@ -240,6 +240,18 @@ Item { // } // } + Connections { + target: chatLogView.model + onDataChanged: { + if (roles.indexOf(Constants.messageModelRoles.responseToMessageWithId) !== -1) { + let item = chatLogView.itemAtIndex(topLeft.row) + if (item) { + item.updateReplyInfo() + } + } + } + } + delegate: MessageView { id: msgDelegate diff --git a/ui/imports/shared/views/chat/MessageView.qml b/ui/imports/shared/views/chat/MessageView.qml index 4ca2cf962f..5e5ed2d927 100644 --- a/ui/imports/shared/views/chat/MessageView.qml +++ b/ui/imports/shared/views/chat/MessageView.qml @@ -233,6 +233,18 @@ Loader { } } + function updateReplyInfo() { + switch(messageContentType) { + case Constants.messageContentType.chatIdentifier: + case Constants.messageContentType.fetchMoreMessagesButton: + case Constants.messageContentType.systemMessagePrivateGroupType: + case Constants.messageContentType.gapType: + return + default: + item.replyMessage = item.getReplyMessage() + } + } + QtObject { id: d @@ -396,9 +408,15 @@ Loader { readonly property int contentType: convertContentType(root.messageContentType) readonly property bool isReply: root.responseTo !== "" - readonly property var replyMessage: root.messageStore && isReply && root.responseToExistingMessage ? root.messageStore.getMessageByIdAsJson(root.responseTo) : null + + property var replyMessage: getReplyMessage() + readonly property string replySenderId: replyMessage ? replyMessage.senderId : "" + function getReplyMessage() { + return root.messageStore && isReply && root.responseToExistingMessage ? root.messageStore.getMessageByIdAsJson(root.responseTo) : null + } + function editCompletedHandler(newMessageText) { const message = root.rootStore.plainText(StatusQUtils.Emoji.deparse(newMessageText)) if (message.length <= 0) diff --git a/ui/imports/utils/Constants.qml b/ui/imports/utils/Constants.qml index ebc00280df..8940ef57a3 100644 --- a/ui/imports/utils/Constants.qml +++ b/ui/imports/utils/Constants.qml @@ -235,6 +235,10 @@ QtObject { readonly property int discordMessageType: 12 } + readonly property QtObject messageModelRoles: QtObject { + readonly property int responseToMessageWithId: 262 // ModelRole.ResponseToMessageWithId + } + readonly property QtObject profilePicturesVisibility: QtObject { readonly property int contactsOnly: 1 readonly property int everyone: 2