Add IMDN sheet to selected message view

This commit is contained in:
Benoit Martins 2025-07-15 10:51:54 +02:00
parent c6179c973c
commit abe0f2db1b
5 changed files with 65 additions and 9 deletions

View file

@ -244,6 +244,7 @@
"meeting_waiting_room_joining_title" = "Probíhá připojování";
"meetings_list_no_meeting_for_today" = "Dnes není naplánována žádná schůzka";
"menu_see_existing_contact" = "Zobrazit kontakt";
"menu_show_imdn" = "Stav doručení";
"message_delivery_info_error_title" = "Chyba";
"message_forwarded_label" = "Přeposláno";
"message_reaction_click_to_remove_label" = "Klepnutím odstranit";

View file

@ -390,6 +390,7 @@
"menu_reply_to_chat_message" = "Reply";
"menu_resend_chat_message" = "Re-send";
"menu_see_existing_contact" = "See contact";
"menu_show_imdn" = "Delivery status";
"message_copied_to_clipboard_toast" = "Message copied into clipboard";
"message_delivery_info_error_title" = "Error";
"message_delivery_info_read_title" = "Read";

View file

@ -390,6 +390,7 @@
"menu_reply_to_chat_message" = "Répondre";
"menu_resend_chat_message" = "Ré-envoyer";
"menu_see_existing_contact" = "Voir le contact";
"menu_show_imdn" = "Info de réception";
"message_copied_to_clipboard_toast" = "Message copié dans le presse-papier";
"message_delivery_info_error_title" = "En erreur";
"message_delivery_info_read_title" = "Lu";

View file

@ -189,6 +189,7 @@
"menu_reply_to_chat_message" = "Відповісти";
"menu_resend_chat_message" = "Надіслати повторно";
"menu_see_existing_contact" = "Переглянути контакт";
"menu_show_imdn" = "Статус доставки";
"message_delivery_info_error_title" = "Помилка";
"message_forwarded_label" = "Перенаправлено";
"message_reaction_click_to_remove_label" = "Натисніть, щоб видалити";

View file

@ -86,6 +86,8 @@ struct ConversationFragment: View {
@State private var showPicker = false
@State private var isSheetVisible = false
@State private var isImdnOrReactionsSheetVisible = false
var body: some View {
NavigationView {
GeometryReader { geometry in
@ -106,7 +108,7 @@ struct ConversationFragment: View {
.sheet(isPresented: $conversationViewModel.isShowSelectedMessageToDisplayDetails, onDismiss: {
conversationViewModel.isShowSelectedMessageToDisplayDetails = false
}, content: {
ImdnOrReactionsSheet(selectedCategoryIndex: $selectedCategoryIndex)
ImdnOrReactionsSheet(selectedCategoryIndex: $selectedCategoryIndex, isImdnOrReactionsSheetVisible: $isImdnOrReactionsSheetVisible)
.environmentObject(conversationViewModel)
.presentationDetents([.medium])
.presentationDragIndicator(.visible)
@ -178,7 +180,7 @@ struct ConversationFragment: View {
conversationViewModel.removeConversationDelegate()
}
.halfSheet(showSheet: $conversationViewModel.isShowSelectedMessageToDisplayDetails) {
ImdnOrReactionsSheet(selectedCategoryIndex: $selectedCategoryIndex)
ImdnOrReactionsSheet(selectedCategoryIndex: $selectedCategoryIndex, isImdnOrReactionsSheetVisible: $isImdnOrReactionsSheetVisible)
.environmentObject(conversationViewModel)
} onDismiss: {
conversationViewModel.isShowSelectedMessageToDisplayDetails = false
@ -918,7 +920,7 @@ struct ConversationFragment: View {
Spacer()
VStack {
if !isSheetVisible {
if !isSheetVisible && !isImdnOrReactionsSheetVisible {
HStack {
if conversationViewModel.selectedMessage!.message.isOutgoing {
Spacer()
@ -1010,15 +1012,35 @@ struct ConversationFragment: View {
.padding(.horizontal, 10)
.padding(.vertical, 1)
.shadow(color: .black.opacity(0.1), radius: 10)
.offset(y: isSheetVisible ? -(UIScreen.main.bounds.height * 0.5) - 10 : 0)
.offset(y: isSheetVisible || isImdnOrReactionsSheetVisible ? -(UIScreen.main.bounds.height * 0.5) - 10 : 0)
if !isSheetVisible {
if !isSheetVisible && !isImdnOrReactionsSheetVisible {
HStack {
if conversationViewModel.selectedMessage!.message.isOutgoing {
Spacer()
}
VStack {
if !(CoreContext.shared.imdnToEverybodyThreshold && !conversationViewModel.selectedMessage!.message.isOutgoing) {
Button {
conversationViewModel.selectedMessageToDisplayDetails = conversationViewModel.selectedMessage
conversationViewModel.prepareBottomSheetForDeliveryStatus()
} label: {
HStack {
Text("menu_show_imdn")
.default_text_style(styleSize: 15)
Spacer()
Image("info")
.resizable()
.frame(width: 20, height: 20, alignment: .leading)
}
.padding(.vertical, 5)
.padding(.horizontal, 20)
}
Divider()
}
Button {
let indexMessage = conversationViewModel.conversationMessagesSection[0].rows.firstIndex(where: {$0.message.id == conversationViewModel.selectedMessage!.message.id})
conversationViewModel.selectedMessage = nil
@ -1190,6 +1212,7 @@ struct ImdnOrReactionsSheet: View {
@EnvironmentObject var conversationViewModel: ConversationViewModel
@Binding var selectedCategoryIndex: Int
@Binding var isImdnOrReactionsSheetVisible: Bool
var body: some View {
VStack {
@ -1246,9 +1269,15 @@ struct ImdnOrReactionsSheet: View {
}
}
.listStyle(.plain)
WillDisappearNotifierView {
isImdnOrReactionsSheetVisible = false
}
.frame(width: 0, height: 0)
}
.onAppear {
selectedCategoryIndex = 0
isImdnOrReactionsSheetVisible = true
}
.padding(.top)
.background(.white)
@ -1518,11 +1547,34 @@ struct VoiceRecorderPlayer: View {
timer = nil
}
}
/*
#Preview {
ConversationFragment(sections: [MessagesSection], ids: [""])
struct WillDisappearNotifierView: UIViewControllerRepresentable {
let onWillDisappear: () -> Void
func makeUIViewController(context: Context) -> UIViewController {
Controller(onWillDisappear: onWillDisappear)
}
func updateUIViewController(_ uiViewController: UIViewController, context: Context) {}
class Controller: UIViewController {
let onWillDisappearCallback: () -> Void
init(onWillDisappear: @escaping () -> Void) {
self.onWillDisappearCallback = onWillDisappear
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
onWillDisappearCallback()
}
}
}
*/
// swiftlint:enable type_body_length
// swiftlint:enable line_length