diff --git a/src/app/modules/main/activity_center/module.nim b/src/app/modules/main/activity_center/module.nim index 404aac1f90..59d62c6bba 100644 --- a/src/app/modules/main/activity_center/module.nim +++ b/src/app/modules/main/activity_center/module.nim @@ -138,6 +138,8 @@ proc createMessageItemFromDto(self: Module, message: MessageDto, communityId: st message.quotedMessage.deleted, message.quotedMessage.discordMessage, quotedMessageAuthorDetails, + message.quotedMessage.albumImages, + message.quotedMessage.albumImagesCount, message.albumId, imagesAlbum, albumMessageIds, 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 136804184f..18535b0948 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 @@ -137,6 +137,8 @@ proc createFetchMoreMessagesItem(self: Module): Item = quotedMessageDeleted = false, quotedMessageDiscordMessage = DiscordMessage(), quotedMessageAuthorDetails = ContactDetails(), + quotedMessageAlbumMessageImages = @[], + quotedMessageAlbumImagesCount = 0, albumId = "", albumMessageImages = @[], albumMessageIds = @[], @@ -197,6 +199,8 @@ proc createChatIdentifierItem(self: Module): Item = quotedMessageDeleted = false, quotedMessageDiscordMessage = DiscordMessage(), quotedMessageAuthorDetails = ContactDetails(), + quotedMessageAlbumMessageImages = @[], + quotedMessageAlbumImagesCount = 0, albumId = "", albumMessageImages = @[], albumMessageIds = @[], @@ -232,9 +236,41 @@ method reevaluateViewLoadingState*(self: Module) = self.firstUnseenMessageState.fetching or self.view.getMessageSearchOngoing()) +# TODO: Fetch the message from status-go. The generated albumIdToImagesMap is built on the messages received and does not account for +# older messages for which the images would not be found. Ticket https://github.com/status-im/status-desktop/issues/12821 +proc generateAlbumIdToImageMap(self: Module, messages: seq[MessageDto]): Table[string, seq[string]] = + var albumIdToImagesMap = initTable[string, seq[string]]() + + for message in messages: + if message.albumId in albumIdToImagesMap: + albumIdToImagesMap[message.albumId].add(message.image) + else: + albumIdToImagesMap[message.albumId] = @[message.image] + + return albumIdToImagesMap + + +proc setQuotedMessageImages(self: Module, message: MessageDto, items: var seq[Item], albumIdToImagesMap: Table[string, seq[string]]) = + for i in 0 ..< items.len: + let item = items[i] + + var quotedMessageAlbumMessageImages = item.quotedMessageAlbumMessageImages + + if message.id != item.responseToMessageWithId: + continue + if message.albumId notin albumIdToImagesMap: + continue + + quotedMessageAlbumMessageImages = albumIdToImagesMap[message.albumId] + item.quotedMessageAlbumMessageImages = quotedMessageAlbumMessageImages + item.quotedMessageAlbumImagesCount = quotedMessageAlbumMessageImages.len + items[i] = item + method newMessagesLoaded*(self: Module, messages: seq[MessageDto], reactions: seq[ReactionDto]) = var viewItems: seq[Item] + var albumIdToImagesMap = self.generateAlbumIdToImageMap(messages) + if(messages.len > 0): for message in messages: # https://github.com/status-im/status-desktop/issues/7632 will introduce deleteFroMe feature. @@ -260,6 +296,8 @@ method newMessagesLoaded*(self: Module, messages: seq[MessageDto], reactions: se if (self.view.model().updateAlbumIfExists(message.albumId, message.image, message.id)): continue + self.setQuotedMessageImages(message, viewItems, albumIdToImagesMap) + if (self.updateItemsByAlbum(viewItems, message)): continue @@ -318,6 +356,8 @@ method newMessagesLoaded*(self: Module, messages: seq[MessageDto], reactions: se message.quotedMessage.deleted, message.quotedMessage.discordMessage, quotedMessageAuthorDetails, + message.quotedMessage.albumImages, + message.quotedMessage.albumImagesCount, message.albumId, if (len(message.albumId) == 0): @[] else: @[message.image], if (len(message.albumId) == 0): @[] else: @[message.id], @@ -455,6 +495,8 @@ method messagesAdded*(self: Module, messages: seq[MessageDto]) = message.quotedMessage.deleted, message.quotedMessage.discordMessage, quotedMessageAuthorDetails, + message.quotedMessage.albumImages, + message.quotedMessage.albumImagesCount, message.albumId, if (len(message.albumId) == 0): @[] else: @[message.image], if (len(message.albumId) == 0): @[] else: @[message.id], 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 51d116a1ab..5b84e177fb 100644 --- a/src/app/modules/main/chat_section/chat_content/module.nim +++ b/src/app/modules/main/chat_section/chat_content/module.nim @@ -219,6 +219,8 @@ proc buildPinnedMessageItem(self: Module, message: MessageDto, actionInitiatedBy message.quotedMessage.deleted, message.quotedMessage.discordMessage, quotedMessageAuthorDetails, + message.quotedMessage.albumImages, + message.quotedMessage.albumImagesCount, message.albumId, if (len(message.albumId) == 0): @[] else: @[message.image], if (len(message.albumId) == 0): @[] else: @[message.id], diff --git a/src/app/modules/shared_models/message_item.nim b/src/app/modules/shared_models/message_item.nim index 1c8b40ad28..7097a30d5b 100644 --- a/src/app/modules/shared_models/message_item.nim +++ b/src/app/modules/shared_models/message_item.nim @@ -59,6 +59,8 @@ type quotedMessageAuthorDisplayName: string quotedMessageAuthorAvatar: string quotedMessageAuthorDetails: ContactDetails + quotedMessageAlbumMessageImages: seq[string] + quotedMessageAlbumImagesCount: int albumId: string albumMessageImages: seq[string] albumMessageIds: seq[string] @@ -105,6 +107,8 @@ proc initItem*( quotedMessageDeleted: bool, quotedMessageDiscordMessage: DiscordMessage, quotedMessageAuthorDetails: ContactDetails, + quotedMessageAlbumMessageImages: seq[string], + quotedMessageAlbumImagesCount: int, albumId: string, albumMessageImages: seq[string], albumMessageIds: seq[string], @@ -156,6 +160,8 @@ proc initItem*( result.quotedMessageContentType = quotedMessageContentType result.quotedMessageDeleted = quotedMessageDeleted result.quotedMessageAuthorDetails = quotedMessageAuthorDetails + result.quotedMessageAlbumMessageImages = quotedMessageAlbumMessageImages + result.quotedMessageAlbumImagesCount = quotedMessageAlbumImagesCount result.albumId = albumId result.albumMessageImages = albumMessageImages result.albumMessageIds = albumMessageIds @@ -232,6 +238,8 @@ proc initNewMessagesMarkerItem*(clock, timestamp: int64): Item = quotedMessageDeleted = false, quotedMessageDiscordMessage = DiscordMessage(), quotedMessageAuthorDetails = ContactDetails(), + quotedMessageAlbumMessageImages = @[], + quotedMessageAlbumImagesCount = 0, albumId = "", albumMessageImages = @[], albumMessageIds = @[], @@ -504,6 +512,8 @@ proc toJsonNode*(self: Item): JsonNode = "quotedMessageDeleted": self.quotedMessageDeleted, "quotedMessageAuthorDisplayName": self.quotedMessageAuthorDisplayName, "quotedMessageAuthorAvatar": self.quotedMessageAuthorAvatar, + "quotedMessageAlbumMessageImages": self.quotedMessageAlbumMessageImages, + "quotedMessageAlbumImagesCount": self.quotedMessageAlbumImagesCount, "albumId": self.albumId, "albumMessageImages": self.albumMessageImages, "albumMessageIds": self.albumMessageIds, @@ -581,3 +591,15 @@ proc quotedMessageAuthorDetails*(self: Item): ContactDetails {.inline.} = self.quotedMessageAuthorDetails proc `quotedMessageAuthorDetails=`*(self: Item, value: ContactDetails) {.inline.} = self.quotedMessageAuthorDetails = value + +proc quotedMessageAlbumMessageImages*(self: Item): seq[string] {.inline.} = + self.quotedMessageAlbumMessageImages + +proc `quotedMessageAlbumMessageImages=`*(self: Item, value: seq[string]) {.inline.} = + self.quotedMessageAlbumMessageImages = value + +proc quotedMessageAlbumImagesCount*(self: Item): int {.inline.} = + self.quotedMessageAlbumImagesCount + +proc `quotedMessageAlbumImagesCount=`*(self: Item, value: int) {.inline.} = + self.quotedMessageAlbumImagesCount = value \ No newline at end of file diff --git a/src/app/modules/shared_models/message_item_qobject.nim b/src/app/modules/shared_models/message_item_qobject.nim index 8e2d790044..65bc3b19ea 100644 --- a/src/app/modules/shared_models/message_item_qobject.nim +++ b/src/app/modules/shared_models/message_item_qobject.nim @@ -58,6 +58,14 @@ QtObject: QtProperty[string] quotedMessageAuthorAvatar: read = quotedMessageAuthorAvatar + proc quotedMessageAlbumMessageImages*(self: MessageItem): string {.slot.} = result = ?.self.messageItem.quotedMessageAlbumMessageImages.join(" ") + QtProperty[string] quotedMessageAlbumMessageImages: + read = quotedMessageAlbumMessageImages + + proc quotedMessageAlbumImagesCount*(self: MessageItem): int {.slot.} = result = ?.self.messageItem.quotedMessageAlbumImagesCount + QtProperty[int] quotedMessageAlbumImagesCount: + read = quotedMessageAlbumImagesCount + proc senderId*(self: MessageItem): string {.slot.} = result = ?.self.messageItem.senderId QtProperty[string] senderId: read = senderId diff --git a/src/app/modules/shared_models/message_model.nim b/src/app/modules/shared_models/message_model.nim index 9155923708..05820a8e5b 100644 --- a/src/app/modules/shared_models/message_model.nim +++ b/src/app/modules/shared_models/message_model.nim @@ -62,6 +62,8 @@ type QuotedMessageAuthorEnsVerified QuotedMessageAuthorIsContact QuotedMessageAuthorColorHash + QuotedMessageAlbumMessageImages + QuotedMessageAlbumImagesCount AlbumMessageImages AlbumImagesCount @@ -158,6 +160,8 @@ QtObject: ModelRole.QuotedMessageAuthorEnsVerified.int: "quotedMessageAuthorEnsVerified", ModelRole.QuotedMessageAuthorIsContact.int: "quotedMessageAuthorIsContact", ModelRole.QuotedMessageAuthorColorHash.int: "quotedMessageAuthorColorHash", + ModelRole.QuotedMessageAlbumMessageImages.int: "quotedMessageAlbumMessageImages", + ModelRole.QuotedMessageAlbumImagesCount.int: "quotedMessageAlbumImagesCount", ModelRole.AlbumMessageImages.int: "albumMessageImages", ModelRole.AlbumImagesCount.int: "albumImagesCount", }.toTable @@ -253,6 +257,10 @@ QtObject: result = newQVariant(item.quotedMessageAuthorDetails.dto.isContact()) of ModelRole.QuotedMessageAuthorColorHash: result = newQVariant(item.quotedMessageAuthorDetails.colorHash) + of ModelRole.QuotedMessageAlbumMessageImages: + result = newQVariant(item.quotedMessageAlbumMessageImages.join(" ")) + of ModelRole.QuotedMessageAlbumImagesCount: + result = newQVariant(item.quotedMessageAlbumImagesCount) of ModelRole.MessageText: result = newQVariant(item.messageText) of ModelRole.UnparsedText: diff --git a/src/app_service/service/message/dto/message.nim b/src/app_service/service/message/dto/message.nim index 8cf620b12b..f61ee24bd6 100644 --- a/src/app_service/service/message/dto/message.nim +++ b/src/app_service/service/message/dto/message.nim @@ -64,6 +64,8 @@ type QuotedMessage* = object contentType*: ContentType deleted*: bool discordMessage*: DiscordMessage + albumImages*: seq[string] + albumImagesCount*: int type Sticker* = object hash*: string diff --git a/test/nim/message_model_test.nim b/test/nim/message_model_test.nim index 700e7124f7..67d618ec2d 100644 --- a/test/nim/message_model_test.nim +++ b/test/nim/message_model_test.nim @@ -50,6 +50,8 @@ proc createTestMessageItem(id: string, clock: int64): Item = quotedMessageDeleted = false, quotedMessageDiscordMessage = DiscordMessage(), quotedMessageAuthorDetails = ContactDetails(), + quotedMessageAlbumMessageImages = @[], + quotedMessageAlbumImagesCount = 0, albumId = "", albumMessageImages = @[], albumMessageIds = @[], diff --git a/ui/app/AppLayouts/Chat/views/ChatMessagesView.qml b/ui/app/AppLayouts/Chat/views/ChatMessagesView.qml index b7f6bade2c..02a49d8785 100644 --- a/ui/app/AppLayouts/Chat/views/ChatMessagesView.qml +++ b/ui/app/AppLayouts/Chat/views/ChatMessagesView.qml @@ -311,6 +311,8 @@ Item { quotedMessageAuthorDetailsEnsVerified: model.quotedMessageAuthorEnsVerified quotedMessageAuthorDetailsIsContact: model.quotedMessageAuthorIsContact quotedMessageAuthorDetailsColorHash: model.quotedMessageAuthorColorHash + quotedMessageAlbumMessageImages: model.quotedMessageAlbumMessageImages.split(" ") + quotedMessageAlbumImagesCount: model.quotedMessageAlbumImagesCount gapFrom: model.gapFrom gapTo: model.gapTo diff --git a/ui/imports/shared/views/chat/MessageView.qml b/ui/imports/shared/views/chat/MessageView.qml index d6be7b8216..84b513e842 100644 --- a/ui/imports/shared/views/chat/MessageView.qml +++ b/ui/imports/shared/views/chat/MessageView.qml @@ -90,6 +90,9 @@ Loader { property var album: [] property int albumCount: 0 + property var quotedMessageAlbumMessageImages: [] + property var quotedMessageAlbumImagesCount: 0 + // External behavior changers property bool isInPinnedPopup: false // The pinned popup limits the number of buttons shown property bool disableHover: false // Used to force the HoverHandler to be active (useful for messages in popups) @@ -695,6 +698,8 @@ Loader { return qsTr("Unknown message. Try fetching more messages") return root.quotedMessageText } + album: root.quotedMessageAlbumMessageImages + albumCount: root.quotedMessageAlbumImagesCount messageDeleted: root.quotedMessageDeleted contentType: d.convertContentType(root.quotedMessageContentType) amISender: root.quotedMessageFrom === userProfile.pubKey