From 7bdb8fa92dc7454ace8eaa1f90a7819395061729 Mon Sep 17 00:00:00 2001 From: Benoit Martins Date: Wed, 26 Nov 2025 09:47:16 +0100 Subject: [PATCH] Update last message text in conversation list --- .../calendar.imageset/calendar.svg | 2 +- .../trash.imageset/Contents.json | 21 +++++++++ .../Assets.xcassets/trash.imageset/trash.svg | 1 + .../Fragments/ConversationsListFragment.swift | 46 +++++++++++++------ .../Model/ConversationModel.swift | 28 +++++++++-- .../ConversationsListViewModel.swift | 24 ++++------ 6 files changed, 89 insertions(+), 33 deletions(-) create mode 100644 Linphone/Assets.xcassets/trash.imageset/Contents.json create mode 100644 Linphone/Assets.xcassets/trash.imageset/trash.svg diff --git a/Linphone/Assets.xcassets/calendar.imageset/calendar.svg b/Linphone/Assets.xcassets/calendar.imageset/calendar.svg index 5caacdbef..c066f4a4b 100644 --- a/Linphone/Assets.xcassets/calendar.imageset/calendar.svg +++ b/Linphone/Assets.xcassets/calendar.imageset/calendar.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/Linphone/Assets.xcassets/trash.imageset/Contents.json b/Linphone/Assets.xcassets/trash.imageset/Contents.json new file mode 100644 index 000000000..4c3681644 --- /dev/null +++ b/Linphone/Assets.xcassets/trash.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "trash.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Linphone/Assets.xcassets/trash.imageset/trash.svg b/Linphone/Assets.xcassets/trash.imageset/trash.svg new file mode 100644 index 000000000..b2d5dfe18 --- /dev/null +++ b/Linphone/Assets.xcassets/trash.imageset/trash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Linphone/UI/Main/Conversations/Fragments/ConversationsListFragment.swift b/Linphone/UI/Main/Conversations/Fragments/ConversationsListFragment.swift index 40bde0799..d39a0835d 100644 --- a/Linphone/UI/Main/Conversations/Fragments/ConversationsListFragment.swift +++ b/Linphone/UI/Main/Conversations/Fragments/ConversationsListFragment.swift @@ -105,26 +105,46 @@ struct ConversationRow: View { .frame(maxWidth: .infinity, alignment: .leading) .lineLimit(1) - if conversation.lastMessageInItalic { - Text(conversation.lastMessageText) - .italic() - .if(conversation.unreadMessagesCount > 0) { view in - view.bold() - } - .foregroundStyle(Color.grayMain2c400) - .font(.system(size: 14)) - .frame(maxWidth: .infinity, alignment: .leading) - .lineLimit(1) - } else { - Text(conversation.lastMessageText) + HStack(spacing: 0) { + Text(conversation.lastMessagePrefixText) .foregroundStyle(Color.grayMain2c400) .if(conversation.unreadMessagesCount > 0) { view in view.default_text_style_700(styleSize: 14) } .default_text_style(styleSize: 14) - .frame(maxWidth: .infinity, alignment: .leading) .lineLimit(1) + .layoutPriority(1) + + if !conversation.lastMessageIcon.isEmpty { + Image(conversation.lastMessageIcon) + .resizable() + .frame(width: 16, height: 16) + .layoutPriority(0) + .padding(.trailing, 2) + } + + if conversation.lastMessageInItalic { + Text(conversation.lastMessageText) + .italic() + .if(conversation.unreadMessagesCount > 0) { view in + view.bold() + } + .foregroundStyle(Color.grayMain2c400) + .font(.system(size: 14)) + .lineLimit(1) + .layoutPriority(-1) + } else { + Text(conversation.lastMessageText) + .foregroundStyle(Color.grayMain2c400) + .if(conversation.unreadMessagesCount > 0) { view in + view.default_text_style_700(styleSize: 14) + } + .default_text_style(styleSize: 14) + .lineLimit(1) + .layoutPriority(-1) + } } + .frame(maxWidth: .infinity, alignment: .leading) Spacer() } diff --git a/Linphone/UI/Main/Conversations/Model/ConversationModel.swift b/Linphone/UI/Main/Conversations/Model/ConversationModel.swift index a878debe0..8b5bca791 100644 --- a/Linphone/UI/Main/Conversations/Model/ConversationModel.swift +++ b/Linphone/UI/Main/Conversations/Model/ConversationModel.swift @@ -46,7 +46,9 @@ class ConversationModel: ObservableObject, Identifiable { @Published var isMuted: Bool @Published var isEphemeral: Bool @Published var encryptionEnabled: Bool + @Published var lastMessagePrefixText: String @Published var lastMessageText: String + @Published var lastMessageIcon: String @Published var lastMessageIsOutgoing: Bool @Published var lastMessageState: Int @Published var lastMessageInItalic: Bool @@ -139,8 +141,12 @@ class ConversationModel: ObservableObject, Identifiable { self.lastMessage = nil + self.lastMessagePrefixText = "" + self.lastMessageText = "" + self.lastMessageIcon = "" + self.lastMessageIsOutgoing = false self.lastMessageState = 0 @@ -297,9 +303,9 @@ class ConversationModel: ObservableObject, Identifiable { fromAddressFriend = nil } - var lastMessageTextTmp = (fromAddressFriend ?? "") - + (lastMessage!.contents.first(where: {$0.isText == true})?.utf8Text ?? (lastMessage!.contents.first(where: {$0.isFile == true || $0.isFileTransfer == true})?.name ?? "")) - + let lastMessagePrefixTextTmp = (fromAddressFriend ?? "") + var lastMessageTextTmp = (lastMessage!.contents.first(where: {$0.isText == true})?.utf8Text ?? (lastMessage!.contents.first(where: {$0.isFile == true || $0.isFileTransfer == true})?.name ?? "")) + var lastMessageIconTmp = "" var lastMessageInItalicTmp = false if lastMessage!.contents.first != nil && lastMessage!.contents.first!.isIcalendar == true { @@ -314,6 +320,8 @@ class ConversationModel: ObservableObject, Identifiable { lastMessageTextTmp = String(localized: "message_meeting_invitation_cancelled_notification") } + lastMessageIconTmp = "calendar" + lastMessageInItalicTmp = true } } @@ -322,9 +330,19 @@ class ConversationModel: ObservableObject, Identifiable { if lastMessage!.isRetracted { lastMessageTextTmp += lastMessage!.isOutgoing ? String(localized: "conversation_message_content_deleted_by_us_label") : String(localized: "conversation_message_content_deleted_label") + lastMessageIconTmp = "trash" + lastMessageInItalicTmp = true } + if (lastMessage!.contents.first(where: {$0.isFile == true || $0.isFileTransfer == true})?.name != nil) { + lastMessageIconTmp = "file" + } else if lastMessage!.isReply { + lastMessageIconTmp = "reply" + } else if lastMessage!.isForward { + lastMessageIconTmp = "forward" + } + let lastMessageIsOutgoingTmp = lastMessage?.isOutgoing ?? false let lastUpdateTimeTmp = lastMessage?.time ?? chatRoom.lastUpdateTime @@ -332,7 +350,11 @@ class ConversationModel: ObservableObject, Identifiable { let lastMessageStateTmp = lastMessage?.state.rawValue ?? 0 DispatchQueue.main.async { + self.lastMessagePrefixText = lastMessagePrefixTextTmp + self.lastMessageText = lastMessageTextTmp + + self.lastMessageIcon = lastMessageIconTmp self.lastMessageIsOutgoing = lastMessageIsOutgoingTmp diff --git a/Linphone/UI/Main/Conversations/ViewModel/ConversationsListViewModel.swift b/Linphone/UI/Main/Conversations/ViewModel/ConversationsListViewModel.swift index 6b42a64d8..49de08869 100644 --- a/Linphone/UI/Main/Conversations/ViewModel/ConversationsListViewModel.swift +++ b/Linphone/UI/Main/Conversations/ViewModel/ConversationsListViewModel.swift @@ -89,20 +89,16 @@ class ConversationsListViewModel: ObservableObject { fromAddressFriend = nil } - var lastMessageTextTmp = (fromAddressFriend ?? "") + (lastMessage.contents.first(where: { $0.isText })?.utf8Text ?? (lastMessage.contents.first(where: { $0.isFile || $0.isFileTransfer })?.name ?? "")) - - if lastMessage.isRetracted { - lastMessageTextTmp += lastMessage.isOutgoing ? String(localized: "conversation_message_content_deleted_by_us_label") : String(localized: "conversation_message_content_deleted_label") - } + let lastMessagePrefixTextTmp = (fromAddressFriend ?? "") if let index = self.conversationsList.firstIndex(where: { $0.chatRoom === conversationModel.chatRoom }) { DispatchQueue.main.async { - conversationModel.lastMessageText = lastMessageTextTmp - self.conversationsList[index].lastMessageText = lastMessageTextTmp + conversationModel.lastMessagePrefixText = lastMessagePrefixTextTmp + self.conversationsList[index].lastMessagePrefixText = lastMessagePrefixTextTmp } } else { DispatchQueue.main.async { - conversationModel.lastMessageText = lastMessageTextTmp + conversationModel.lastMessagePrefixText = lastMessagePrefixTextTmp } } } @@ -152,20 +148,16 @@ class ConversationsListViewModel: ObservableObject { fromAddressFriend = nil } - var lastMessageTextTmp = (fromAddressFriend ?? "") + (lastMessage.contents.first(where: { $0.isText })?.utf8Text ?? (lastMessage.contents.first(where: { $0.isFile || $0.isFileTransfer })?.name ?? "")) - - if lastMessage.isRetracted { - lastMessageTextTmp += lastMessage.isOutgoing ? String(localized: "conversation_message_content_deleted_by_us_label") : String(localized: "conversation_message_content_deleted_label") - } + let lastMessagePrefixTextTmp = (fromAddressFriend ?? "") if let index = self.conversationsList.firstIndex(where: { $0.chatRoom === conversationModel.chatRoom }) { DispatchQueue.main.async { - conversationModel.lastMessageText = lastMessageTextTmp - self.conversationsList[index].lastMessageText = lastMessageTextTmp + conversationModel.lastMessagePrefixText = lastMessagePrefixTextTmp + self.conversationsList[index].lastMessagePrefixText = lastMessagePrefixTextTmp } } else { DispatchQueue.main.async { - conversationModel.lastMessageText = lastMessageTextTmp + conversationModel.lastMessagePrefixText = lastMessagePrefixTextTmp } } }