Fix(@message) Album of images disappears from reply after reloading the application (#12806)

Fixes #10986

This PR contains 2 changes :

1- Adding of properties for the quotedMessage
2- Update of the view with the properties with Qml binding
This commit is contained in:
Godfrain Jacques 2023-11-22 14:32:50 -08:00 committed by GitHub
parent 4e296d5acf
commit aaa759f70c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 95 additions and 0 deletions

View File

@ -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,

View File

@ -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],

View File

@ -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],

View File

@ -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

View File

@ -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

View File

@ -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:

View File

@ -64,6 +64,8 @@ type QuotedMessage* = object
contentType*: ContentType
deleted*: bool
discordMessage*: DiscordMessage
albumImages*: seq[string]
albumImagesCount*: int
type Sticker* = object
hash*: string

View File

@ -50,6 +50,8 @@ proc createTestMessageItem(id: string, clock: int64): Item =
quotedMessageDeleted = false,
quotedMessageDiscordMessage = DiscordMessage(),
quotedMessageAuthorDetails = ContactDetails(),
quotedMessageAlbumMessageImages = @[],
quotedMessageAlbumImagesCount = 0,
albumId = "",
albumMessageImages = @[],
albumMessageIds = @[],

View File

@ -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

View File

@ -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