diff --git a/Linphone/Localizable.xcstrings b/Linphone/Localizable.xcstrings index 63dbe5d6f..05408cf40 100644 --- a/Linphone/Localizable.xcstrings +++ b/Linphone/Localizable.xcstrings @@ -1742,6 +1742,40 @@ } } }, + "message_reaction_click_to_remove_label" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Click to remove" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cliquez pour supprimer" + } + } + } + }, + "message_reactions_info_all_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reactions" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Réactions" + } + } + } + }, "Messages" : { }, diff --git a/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift b/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift index ccff001b5..2da7dab3e 100644 --- a/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift +++ b/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift @@ -191,6 +191,7 @@ struct ChatBubbleView: View { conversationViewModel.selectedMessageToDisplayDetails = eventLogMessage conversationViewModel.prepareBottomSheetForDeliveryStatus() } + .disabled(conversationViewModel.selectedMessage != nil) .padding(.top, -4) } .padding(.all, 15) @@ -211,18 +212,17 @@ struct ChatBubbleView: View { } } - if ( - (eventLogMessage.message.reactions.contains("👍") ? 1 : 0) + - (eventLogMessage.message.reactions.contains("❤️") ? 1 : 0) + - (eventLogMessage.message.reactions.contains("😂") ? 1 : 0) + - (eventLogMessage.message.reactions.contains("😮") ? 1 : 0) + - (eventLogMessage.message.reactions.contains("😢") ? 1 : 0) - ) != eventLogMessage.message.reactions.count { + if containsDuplicates(strings: eventLogMessage.message.reactions) { Text("\(eventLogMessage.message.reactions.count)") .default_text_style(styleSize: 14) .padding(.horizontal, -2) } } + .onTapGesture { + conversationViewModel.selectedMessageToDisplayDetails = eventLogMessage + conversationViewModel.prepareBottomSheetForReactions() + } + .disabled(conversationViewModel.selectedMessage != nil) .padding(.vertical, 6) .padding(.horizontal, 10) .background(eventLogMessage.message.isOutgoing ? Color.orangeMain100 : Color.grayMain2c100) @@ -285,6 +285,11 @@ struct ChatBubbleView: View { } } + func containsDuplicates(strings: [String]) -> Bool { + let uniqueStrings = Set(strings) + return uniqueStrings.count != strings.count + } + @ViewBuilder func messageAttachments() -> some View { if eventLogMessage.message.attachments.count == 1 { diff --git a/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift b/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift index 16619df4e..41f8073ac 100644 --- a/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift +++ b/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift @@ -73,10 +73,10 @@ struct ConversationFragment: View { .onDisappear { conversationViewModel.removeConversationDelegate() } - .sheet(isPresented: $conversationViewModel.isShowSelectedMessageToDisplayDetailsBottomSheet, onDismiss: { - conversationViewModel.isShowSelectedMessageToDisplayDetailsBottomSheet = false + .sheet(isPresented: $conversationViewModel.isShowSelectedMessageToDisplayDetails, onDismiss: { + conversationViewModel.isShowSelectedMessageToDisplayDetails = false }, content: { - imdnSheet() + imdnOrReactionsSheet() .presentationDetents([.medium]) .presentationDragIndicator(.visible) }) @@ -115,10 +115,10 @@ struct ConversationFragment: View { .onDisappear { conversationViewModel.removeConversationDelegate() } - .halfSheet(showSheet: $conversationViewModel.isShowSelectedMessageToDisplayDetailsBottomSheet) { - imdnSheet() + .halfSheet(showSheet: $conversationViewModel.isShowSelectedMessageToDisplayDetails) { + imdnOrReactionsSheet() } onDismiss: { - conversationViewModel.isShowSelectedMessageToDisplayDetailsBottomSheet = false + conversationViewModel.isShowSelectedMessageToDisplayDetails = false } .sheet(isPresented: $isShowPhotoLibrary, onDismiss: { isShowPhotoLibrary = false @@ -864,42 +864,67 @@ struct ConversationFragment: View { //swiftlint:enable function_body_length @ViewBuilder - func imdnSheet() -> some View { - VStack { - Picker("Categories", selection: $selectedCategoryIndex) { - ForEach(0.. some View { + VStack { + Picker("Categories", selection: $selectedCategoryIndex) { + ForEach(0..