From dcd80e14bce573de4c13ac69edec96d9484bbeb6 Mon Sep 17 00:00:00 2001 From: Benoit Martins Date: Fri, 13 Jun 2025 11:56:42 +0200 Subject: [PATCH] Refactored ConversationsView --- Linphone/UI/Main/ContentView.swift | 179 ++++++++------- .../Conversations/ConversationsView.swift | 8 +- .../Fragments/ConversationsFragment.swift | 13 +- .../ConversationsListBottomSheet.swift | 173 +++++++-------- .../Fragments/ConversationsListFragment.swift | 15 +- .../Main/Conversations/Fragments/UIList.swift | 6 +- .../ViewModel/ConversationViewModel.swift | 208 ++++++++---------- .../ConversationsListViewModel.swift | 43 +++- 8 files changed, 333 insertions(+), 312 deletions(-) diff --git a/Linphone/UI/Main/ContentView.swift b/Linphone/UI/Main/ContentView.swift index 223234fb2..3178f11cf 100644 --- a/Linphone/UI/Main/ContentView.swift +++ b/Linphone/UI/Main/ContentView.swift @@ -39,13 +39,12 @@ struct ContentView: View { @State private var contactsListViewModel: ContactsListViewModel? @State private var historyListViewModel: HistoryListViewModel? + @State private var conversationsListViewModel: ConversationsListViewModel? + //@ObservedObject var conversationViewModel: ConversationViewModel //@ObservedObject var startConversationViewModel: StartConversationViewModel - //@ObservedObject var meetingWaitingRoomViewModel: MeetingWaitingRoomViewModel - //@ObservedObject var conversationsListViewModel: ConversationsListViewModel - //@ObservedObject var conversationViewModel: ConversationViewModel //@ObservedObject var meetingsListViewModel: MeetingsListViewModel //@ObservedObject var meetingViewModel: MeetingViewModel @@ -170,12 +169,12 @@ struct ContentView: View { .frame(height: geometry.size.height/4) ZStack { - if historyListViewModel != nil && historyListViewModel!.missedCallsCount > 0 { + if let historyListVM = historyListViewModel, historyListVM.missedCallsCount > 0 { VStack { HStack { Text( - historyListViewModel!.missedCallsCount < 99 - ? String(historyListViewModel!.missedCallsCount) + historyListVM.missedCallsCount < 99 + ? String(historyListVM.missedCallsCount) : "99+" ) .foregroundStyle(.white) @@ -189,13 +188,14 @@ struct ContentView: View { .padding(.bottom, 30) .padding(.leading, 30) } + Button(action: { sharedMainViewModel.changeIndexView(indexViewInt: 1) sharedMainViewModel.displayedFriend = nil sharedMainViewModel.displayedConversation = nil sharedMainViewModel.displayedMeeting = nil - if historyListViewModel != nil && historyListViewModel!.missedCallsCount > 0 { - historyListViewModel!.resetMissedCallsCount() + if let historyListVM = historyListViewModel, historyListVM.missedCallsCount > 0 { + historyListVM.resetMissedCallsCount() } }, label: { VStack { @@ -218,13 +218,12 @@ struct ContentView: View { .frame(height: geometry.size.height/4) ZStack { - /* - if conversationsListViewModel.unreadMessages > 0 { + if let contactsListVM = conversationsListViewModel, contactsListVM.unreadMessages > 0 { VStack { HStack { Text( - conversationsListViewModel.unreadMessages < 99 - ? String(conversationsListViewModel.unreadMessages) + contactsListVM.unreadMessages < 99 + ? String(contactsListVM.unreadMessages) : "99+" ) .foregroundStyle(.white) @@ -238,7 +237,7 @@ struct ContentView: View { .padding(.bottom, 30) .padding(.leading, 30) } - */ + Button(action: { sharedMainViewModel.changeIndexView(indexViewInt: 2) sharedMainViewModel.displayedFriend = nil @@ -514,10 +513,10 @@ struct ContentView: View { magicSearch.currentFilter = "" magicSearch.searchForContacts( sourceFlags: MagicSearch.Source.Friends.rawValue | MagicSearch.Source.LdapServers.rawValue) - } else if sharedMainViewModel.indexView == 1 && historyListViewModel != nil { - historyListViewModel!.resetFilterCallLogs() - } else if sharedMainViewModel.indexView == 2 { - //conversationsListViewModel.resetFilterConversations() + } else if let historyListVM = historyListViewModel, sharedMainViewModel.indexView == 1 { + historyListVM.resetFilterCallLogs() + } else if let conversationsListVM = conversationsListViewModel, sharedMainViewModel.indexView == 2 { + conversationsListVM.resetFilterConversations() } else if sharedMainViewModel.indexView == 3 { //meetingsListViewModel.currentFilter = "" //meetingsListViewModel.computeMeetingsList() @@ -560,17 +559,17 @@ struct ContentView: View { magicSearch.currentFilter = newValue magicSearch.searchForContacts( sourceFlags: MagicSearch.Source.Friends.rawValue | MagicSearch.Source.LdapServers.rawValue) - } else if sharedMainViewModel.indexView == 1 { - if text.isEmpty && historyListViewModel != nil { - historyListViewModel!.resetFilterCallLogs() - } else if historyListViewModel != nil { - historyListViewModel!.filterCallLogs(filter: text) - } - } else if sharedMainViewModel.indexView == 2 { + } else if let historyListVM = historyListViewModel, sharedMainViewModel.indexView == 1 { if text.isEmpty { - //conversationsListViewModel.resetFilterConversations() + historyListVM.resetFilterCallLogs() } else { - //conversationsListViewModel.filterConversations(filter: text) + historyListVM.filterCallLogs(filter: text) + } + } else if let conversationsListVM = conversationsListViewModel, sharedMainViewModel.indexView == 2 { + if text.isEmpty { + conversationsListVM.resetFilterConversations() + } else { + conversationsListVM.filterConversations(filter: text) } } else if sharedMainViewModel.indexView == 3 { //meetingsListViewModel.currentFilter = text @@ -603,10 +602,10 @@ struct ContentView: View { magicSearch.currentFilter = newValue magicSearch.searchForContacts( sourceFlags: MagicSearch.Source.Friends.rawValue | MagicSearch.Source.LdapServers.rawValue) - } else if sharedMainViewModel.indexView == 1 && historyListViewModel != nil { - historyListViewModel!.filterCallLogs(filter: text) - } else if sharedMainViewModel.indexView == 2 { - //conversationsListViewModel.filterConversations(filter: text) + } else if let historyListVM = historyListViewModel, sharedMainViewModel.indexView == 1 { + historyListVM.filterCallLogs(filter: text) + } else if let conversationsListVM = conversationsListViewModel, sharedMainViewModel.indexView == 2 { + conversationsListVM.filterConversations(filter: text) } else if sharedMainViewModel.indexView == 3 { //meetingsListViewModel.currentFilter = text //meetingsListViewModel.computeMeetingsList() @@ -700,29 +699,36 @@ struct ContentView: View { } } } else if sharedMainViewModel.indexView == 2 { - //TODO a changer - NavigationView { - ZStack(alignment: .bottomTrailing) { + if let conversationsListVM = conversationsListViewModel { + ConversationsView( + text: $text, + isShowStartConversationFragment: $isShowStartConversationFragment + ) + .environmentObject(conversationsListVM) + .roundedCorner(25, corners: [.topRight, .topLeft]) + .shadow( + color: (orientation == .landscapeLeft + || orientation == .landscapeRight + || UIScreen.main.bounds.size.width > UIScreen.main.bounds.size.height) + ? .white.opacity(0.0) + : .black.opacity(0.2), + radius: 25 + ) + } else { + NavigationView { + VStack { + Spacer() + + ProgressView() + .controlSize(.large) + + Spacer() + } + .onAppear { + conversationsListViewModel = ConversationsListViewModel() + } } } - .navigationViewStyle(.stack) - /* - ConversationsView( - conversationViewModel: conversationViewModel, - conversationsListViewModel: conversationsListViewModel, - text: $text, - isShowStartConversationFragment: $isShowStartConversationFragment - ) - .roundedCorner(25, corners: [.topRight, .topLeft]) - .shadow( - color: (orientation == .landscapeLeft - || orientation == .landscapeRight - || UIScreen.main.bounds.size.width > UIScreen.main.bounds.size.height) - ? .white.opacity(0.0) - : .black.opacity(0.2), - radius: 25 - ) - */ } else if sharedMainViewModel.indexView == 3 { //TODO a changer NavigationView { @@ -805,12 +811,12 @@ struct ContentView: View { Spacer() ZStack { - if historyListViewModel != nil && historyListViewModel!.missedCallsCount > 0 { + if let historyListVM = historyListViewModel, historyListVM.missedCallsCount > 0 { VStack { HStack { Text( - historyListViewModel!.missedCallsCount < 99 - ? String(historyListViewModel!.missedCallsCount) + historyListVM.missedCallsCount < 99 + ? String(historyListVM.missedCallsCount) : "99+" ) .foregroundStyle(.white) @@ -824,13 +830,14 @@ struct ContentView: View { .padding(.bottom, 30) .padding(.leading, 30) } + Button(action: { sharedMainViewModel.changeIndexView(indexViewInt: 1) sharedMainViewModel.displayedFriend = nil sharedMainViewModel.displayedConversation = nil sharedMainViewModel.displayedMeeting = nil - if historyListViewModel != nil && historyListViewModel!.missedCallsCount > 0 { - historyListViewModel!.resetMissedCallsCount() + if let historyListVM = historyListViewModel, historyListVM.missedCallsCount > 0 { + historyListVM.resetMissedCallsCount() } }, label: { VStack { @@ -855,13 +862,12 @@ struct ContentView: View { Spacer() ZStack { - /* - if conversationsListViewModel.unreadMessages > 0 { + if let conversationsListVM = conversationsListViewModel, conversationsListVM.unreadMessages > 0 { VStack { HStack { Text( - conversationsListViewModel.unreadMessages < 99 - ? String(conversationsListViewModel.unreadMessages) + conversationsListVM.unreadMessages < 99 + ? String(conversationsListVM.unreadMessages) : "99+" ) .foregroundStyle(.white) @@ -875,7 +881,7 @@ struct ContentView: View { .padding(.bottom, 30) .padding(.leading, 30) } - */ + Button(action: { sharedMainViewModel.changeIndexView(indexViewInt: 2) sharedMainViewModel.displayedFriend = nil @@ -950,7 +956,7 @@ struct ContentView: View { ? (geometry.size.width/100*40) + 75 : 0 ) - if sharedMainViewModel.indexView == 0 && sharedMainViewModel.displayedFriend != nil && contactsListViewModel != nil { + if let contactsListVM = contactsListViewModel, let displayedFriend = sharedMainViewModel.displayedFriend, sharedMainViewModel.indexView == 0 { ContactFragment( isShowDeletePopup: $isShowDeleteContactPopup, isShowDismissPopup: $isShowDismissPopup, @@ -958,19 +964,19 @@ struct ContentView: View { isShowSipAddressesPopupType: $isShowSipAddressesPopupType, isShowEditContactFragmentInContactDetails: $isShowEditContactFragmentInContactDetails ) - .environmentObject(contactsListViewModel!) - .environmentObject(sharedMainViewModel.displayedFriend!) + .environmentObject(contactsListVM) + .environmentObject(displayedFriend) .frame(maxWidth: .infinity) .background(Color.gray100) .ignoresSafeArea(.keyboard) - } else if sharedMainViewModel.indexView == 1 && sharedMainViewModel.displayedCall != nil && historyListViewModel != nil { + } else if let historyListVM = historyListViewModel, let displayedFriend = sharedMainViewModel.displayedFriend, sharedMainViewModel.indexView == 1 { HistoryContactFragment( isShowDeleteAllHistoryPopup: $isShowDeleteAllHistoryPopup, isShowEditContactFragment: $isShowEditContactFragment, isShowEditContactFragmentAddress: $isShowEditContactFragmentAddress ) - .environmentObject(historyListViewModel!) - .environmentObject(sharedMainViewModel.displayedCall!) + .environmentObject(historyListVM) + .environmentObject(displayedFriend) .frame(maxWidth: .infinity) .background(Color.gray100) .ignoresSafeArea(.keyboard) @@ -1096,13 +1102,13 @@ struct ContentView: View { } */ - if isShowDeleteContactPopup { + if let contactsListVM = contactsListViewModel, isShowDeleteContactPopup { PopupView( isShowPopup: $isShowDeleteContactPopup, title: Text( String( format: String(localized: "contact_dialog_delete_title"), - contactsListViewModel!.selectedFriend?.name + contactsListVM.selectedFriend?.name ?? (SharedMainViewModel.shared.displayedFriend!.name ?? "Unknown Contact") ) ), @@ -1112,7 +1118,7 @@ struct ContentView: View { self.isShowDeleteContactPopup.toggle()}, titleSecondButton: Text("dialog_ok"), actionSecondButton: { - self.contactsListViewModel!.deleteSelectedContact() + contactsListVM.deleteSelectedContact() self.isShowDeleteContactPopup.toggle() }) .background(.black.opacity(0.65)) @@ -1121,7 +1127,7 @@ struct ContentView: View { self.isShowDeleteContactPopup.toggle() } .onAppear { - self.contactsListViewModel!.changeSelectedFriendToDelete() + contactsListVM.changeSelectedFriendToDelete() } } @@ -1132,14 +1138,14 @@ struct ContentView: View { titleFirstButton: Text("dialog_cancel"), actionFirstButton: { self.isShowDeleteAllHistoryPopup.toggle() - if historyListViewModel != nil { - historyListViewModel!.callLogsAddressToDelete = "" + if let historyListVM = historyListViewModel { + historyListVM.callLogsAddressToDelete = "" } }, titleSecondButton: Text("dialog_ok"), actionSecondButton: { - if historyListViewModel != nil { - historyListViewModel!.removeCallLogs() + if let historyListVM = historyListViewModel { + historyListVM.removeCallLogs() } self.isShowDeleteAllHistoryPopup.toggle() sharedMainViewModel.displayedCall = nil @@ -1176,13 +1182,13 @@ struct ContentView: View { } } - if isShowSipAddressesPopup && sharedMainViewModel.displayedFriend != nil { + if let contactsListVM = contactsListViewModel, let displayedFriend = sharedMainViewModel.displayedFriend, isShowSipAddressesPopup { SipAddressesPopup( isShowSipAddressesPopup: $isShowSipAddressesPopup, isShowSipAddressesPopupType: $isShowSipAddressesPopupType ) - .environmentObject(contactsListViewModel!) - .environmentObject(sharedMainViewModel.displayedFriend!) + .environmentObject(contactsListVM) + .environmentObject(displayedFriend) .background(.black.opacity(0.65)) .zIndex(3) .onTapGesture { @@ -1380,13 +1386,18 @@ struct ContentView: View { } } .onReceive(contactLoaded) { _ in - //conversationsListViewModel.updateChatRoomsList() - if historyListViewModel != nil { - historyListViewModel!.refreshHistoryAvatarModel() + if let conversationsListVM = conversationsListViewModel { + conversationsListVM.updateChatRoomsList() + } + + if let historyListVM = historyListViewModel { + historyListVM.refreshHistoryAvatarModel() } } .onReceive(contactAdded) { address in - //conversationsListViewModel.updateChatRoom(address: address) + if let conversationsListVM = conversationsListViewModel { + conversationsListVM.updateChatRoom(address: address) + } } .onReceive(coreStarted) { _ in accountProfileViewModel.setAvatarModel() @@ -1413,7 +1424,9 @@ struct ContentView: View { .onChange(of: scenePhase) { newPhase in orientation = UIDevice.current.orientation if newPhase == .active { - //conversationsListViewModel.computeChatRoomsList() + if let conversationsListVM = conversationsListViewModel { + conversationsListVM.computeChatRoomsList() + } } } } diff --git a/Linphone/UI/Main/Conversations/ConversationsView.swift b/Linphone/UI/Main/Conversations/ConversationsView.swift index 3918ed6c8..521204e21 100644 --- a/Linphone/UI/Main/Conversations/ConversationsView.swift +++ b/Linphone/UI/Main/Conversations/ConversationsView.swift @@ -21,8 +21,8 @@ import SwiftUI struct ConversationsView: View { - @ObservedObject var conversationViewModel: ConversationViewModel - @ObservedObject var conversationsListViewModel: ConversationsListViewModel + @EnvironmentObject var conversationsListViewModel: ConversationsListViewModel + @Binding var text: String @Binding var isShowStartConversationFragment: Bool @@ -30,7 +30,7 @@ struct ConversationsView: View { var body: some View { NavigationView { ZStack(alignment: .bottomTrailing) { - ConversationsFragment(conversationViewModel: conversationViewModel, conversationsListViewModel: conversationsListViewModel, text: $text) + ConversationsFragment(text: $text) Button { withAnimation { @@ -59,8 +59,6 @@ struct ConversationsView: View { #Preview { ConversationsListFragment( - conversationViewModel: ConversationViewModel(), - conversationsListViewModel: ConversationsListViewModel(), showingSheet: .constant(false), text: .constant("") ) diff --git a/Linphone/UI/Main/Conversations/Fragments/ConversationsFragment.swift b/Linphone/UI/Main/Conversations/Fragments/ConversationsFragment.swift index 4b321f3c5..444147746 100644 --- a/Linphone/UI/Main/Conversations/Fragments/ConversationsFragment.swift +++ b/Linphone/UI/Main/Conversations/Fragments/ConversationsFragment.swift @@ -21,8 +21,7 @@ import SwiftUI struct ConversationsFragment: View { - @ObservedObject var conversationViewModel: ConversationViewModel - @ObservedObject var conversationsListViewModel: ConversationsListViewModel + @EnvironmentObject var conversationsListViewModel: ConversationsListViewModel private var idiom: UIUserInterfaceIdiom { UIDevice.current.userInterfaceIdiom } @@ -32,11 +31,9 @@ struct ConversationsFragment: View { var body: some View { ZStack { if #available(iOS 16.0, *), idiom != .pad { - ConversationsListFragment(conversationViewModel: conversationViewModel, - conversationsListViewModel: conversationsListViewModel, showingSheet: $showingSheet, text: $text) + ConversationsListFragment(showingSheet: $showingSheet, text: $text) .sheet(isPresented: $showingSheet) { ConversationsListBottomSheet( - conversationsListViewModel: conversationsListViewModel, showingSheet: $showingSheet ) .presentationDetents( @@ -46,11 +43,9 @@ struct ConversationsFragment: View { ) } } else { - ConversationsListFragment(conversationViewModel: conversationViewModel, - conversationsListViewModel: conversationsListViewModel, showingSheet: $showingSheet, text: $text) + ConversationsListFragment(showingSheet: $showingSheet, text: $text) .halfSheet(showSheet: $showingSheet) { ConversationsListBottomSheet( - conversationsListViewModel: conversationsListViewModel, showingSheet: $showingSheet ) } onDismiss: {} @@ -60,5 +55,5 @@ struct ConversationsFragment: View { } #Preview { - ConversationsFragment(conversationViewModel: ConversationViewModel(), conversationsListViewModel: ConversationsListViewModel(), text: .constant("")) + ConversationsFragment(text: .constant("")) } diff --git a/Linphone/UI/Main/Conversations/Fragments/ConversationsListBottomSheet.swift b/Linphone/UI/Main/Conversations/Fragments/ConversationsListBottomSheet.swift index c3473cafa..645c819e3 100644 --- a/Linphone/UI/Main/Conversations/Fragments/ConversationsListBottomSheet.swift +++ b/Linphone/UI/Main/Conversations/Fragments/ConversationsListBottomSheet.swift @@ -27,8 +27,8 @@ struct ConversationsListBottomSheet: View { private var idiom: UIUserInterfaceIdiom { UIDevice.current.userInterfaceIdiom } @State private var orientation = UIDevice.current.orientation - - @ObservedObject var conversationsListViewModel: ConversationsListViewModel + + @EnvironmentObject var conversationsListViewModel: ConversationsListViewModel @Binding var showingSheet: Bool @@ -54,12 +54,10 @@ struct ConversationsListBottomSheet: View { Spacer() - if conversationsListViewModel.selectedConversation != nil && !conversationsListViewModel.selectedConversation!.isReadOnly { + if let selectedConversation = conversationsListViewModel.selectedConversation, !selectedConversation.isReadOnly { Button { - if conversationsListViewModel.selectedConversation != nil { - conversationsListViewModel.markAsReadSelectedConversation() - conversationsListViewModel.updateUnreadMessagesCount() - } + conversationsListViewModel.markAsReadSelectedConversation() + conversationsListViewModel.updateUnreadMessagesCount() if #available(iOS 16.0, *) { if idiom != .pad { @@ -95,9 +93,7 @@ struct ConversationsListBottomSheet: View { .frame(maxWidth: .infinity) Button { - if conversationsListViewModel.selectedConversation != nil { - conversationsListViewModel.selectedConversation!.toggleMute() - } + selectedConversation.toggleMute() if #available(iOS 16.0, *) { if idiom != .pad { @@ -112,13 +108,13 @@ struct ConversationsListBottomSheet: View { } } label: { HStack { - Image(conversationsListViewModel.selectedConversation!.isMuted ? "bell" : "bell-slash") + Image(selectedConversation.isMuted ? "bell" : "bell-slash") .renderingMode(.template) .resizable() .foregroundStyle(Color.grayMain2c500) .frame(width: 25, height: 25, alignment: .leading) .padding(.all, 10) - Text(conversationsListViewModel.selectedConversation!.isMuted ? "conversation_action_unmute" : "conversation_action_mute") + Text(selectedConversation.isMuted ? "conversation_action_unmute" : "conversation_action_mute") .default_text_style(styleSize: 16) Spacer() } @@ -132,11 +128,10 @@ struct ConversationsListBottomSheet: View { } .frame(maxWidth: .infinity) - if conversationsListViewModel.selectedConversation != nil - && !conversationsListViewModel.selectedConversation!.isGroup { + if !selectedConversation.isGroup { Button { - if !conversationsListViewModel.selectedConversation!.isGroup { - conversationsListViewModel.selectedConversation!.call() + if !selectedConversation.isGroup { + selectedConversation.call() } if #available(iOS 16.0, *) { @@ -173,79 +168,77 @@ struct ConversationsListBottomSheet: View { } .frame(maxWidth: .infinity) } - } - - Button { - conversationsListViewModel.selectedConversation!.deleteChatRoom() - - if #available(iOS 16.0, *) { - if idiom != .pad { - showingSheet.toggle() - } else { - showingSheet.toggle() - dismiss() - } - } else { - showingSheet.toggle() - dismiss() - } - } label: { - HStack { - Image("trash-simple") - .renderingMode(.template) - .resizable() - .foregroundStyle(Color.redDanger500) - .frame(width: 25, height: 25, alignment: .leading) - .padding(.all, 10) - Text("conversation_action_delete") - .foregroundStyle(Color.redDanger500) - .default_text_style(styleSize: 16) - Spacer() - } - .frame(maxHeight: .infinity) - } - .padding(.horizontal, 30) - .background(Color.gray100) - - if conversationsListViewModel.selectedConversation != nil && !conversationsListViewModel.selectedConversation!.isReadOnly { - VStack { - Divider() - } - .frame(maxWidth: .infinity) - - Button { - if conversationsListViewModel.selectedConversation != nil { - conversationsListViewModel.selectedConversation!.leave() - conversationsListViewModel.selectedConversation!.isReadOnly = true - } - - if #available(iOS 16.0, *) { - if idiom != .pad { - showingSheet.toggle() - } else { - showingSheet.toggle() - dismiss() - } - } else { - showingSheet.toggle() - dismiss() - } - } label: { - HStack { - Image("sign-out") - .renderingMode(.template) - .resizable() - .foregroundStyle(Color.grayMain2c500) - .frame(width: 25, height: 25, alignment: .leading) - .padding(.all, 10) - Text("conversation_action_leave_group") - .default_text_style(styleSize: 16) - Spacer() - } - .frame(maxHeight: .infinity) - } - .padding(.horizontal, 30) - .background(Color.gray100) + + Button { + selectedConversation.deleteChatRoom() + + if #available(iOS 16.0, *) { + if idiom != .pad { + showingSheet.toggle() + } else { + showingSheet.toggle() + dismiss() + } + } else { + showingSheet.toggle() + dismiss() + } + } label: { + HStack { + Image("trash-simple") + .renderingMode(.template) + .resizable() + .foregroundStyle(Color.redDanger500) + .frame(width: 25, height: 25, alignment: .leading) + .padding(.all, 10) + Text("conversation_action_delete") + .foregroundStyle(Color.redDanger500) + .default_text_style(styleSize: 16) + Spacer() + } + .frame(maxHeight: .infinity) + } + .padding(.horizontal, 30) + .background(Color.gray100) + + if !selectedConversation.isReadOnly { + VStack { + Divider() + } + .frame(maxWidth: .infinity) + + Button { + selectedConversation.leave() + selectedConversation.isReadOnly = true + + if #available(iOS 16.0, *) { + if idiom != .pad { + showingSheet.toggle() + } else { + showingSheet.toggle() + dismiss() + } + } else { + showingSheet.toggle() + dismiss() + } + } label: { + HStack { + Image("sign-out") + .renderingMode(.template) + .resizable() + .foregroundStyle(Color.grayMain2c500) + .frame(width: 25, height: 25, alignment: .leading) + .padding(.all, 10) + Text("conversation_action_leave_group") + .default_text_style(styleSize: 16) + Spacer() + } + .frame(maxHeight: .infinity) + } + .padding(.horizontal, 30) + .background(Color.gray100) + } } } .background(Color.gray100) @@ -257,5 +250,5 @@ struct ConversationsListBottomSheet: View { } #Preview { - ConversationsListBottomSheet(conversationsListViewModel: ConversationsListViewModel(), showingSheet: .constant(true)) + ConversationsListBottomSheet(showingSheet: .constant(true)) } diff --git a/Linphone/UI/Main/Conversations/Fragments/ConversationsListFragment.swift b/Linphone/UI/Main/Conversations/Fragments/ConversationsListFragment.swift index e8e64a21e..53cc30dbb 100644 --- a/Linphone/UI/Main/Conversations/Fragments/ConversationsListFragment.swift +++ b/Linphone/UI/Main/Conversations/Fragments/ConversationsListFragment.swift @@ -26,8 +26,7 @@ struct ConversationsListFragment: View { @EnvironmentObject var navigationManager: NavigationManager - @ObservedObject var conversationViewModel: ConversationViewModel - @ObservedObject var conversationsListViewModel: ConversationsListViewModel + @EnvironmentObject var conversationsListViewModel: ConversationsListViewModel @Binding var showingSheet: Bool @Binding var text: String @@ -39,8 +38,6 @@ struct ConversationsListFragment: View { ConversationRow( navigationManager: _navigationManager, conversation: conversation, - conversationViewModel: conversationViewModel, - conversationsListViewModel: conversationsListViewModel, showingSheet: $showingSheet, text: $text ) @@ -74,7 +71,7 @@ struct ConversationsListFragment: View { .onChange(of: scenePhase) { newPhase in if newPhase == .active { if navigationManager.peerAddr != nil { - conversationViewModel.getChatRoomWithStringAddress(conversationsList: conversationsListViewModel.conversationsList, stringAddr: navigationManager.peerAddr!) + conversationsListViewModel.getChatRoomWithStringAddress(stringAddr: navigationManager.peerAddr!) navigationManager.peerAddr = nil } } @@ -85,9 +82,9 @@ struct ConversationsListFragment: View { struct ConversationRow: View { @EnvironmentObject var navigationManager: NavigationManager + @EnvironmentObject var conversationsListViewModel: ConversationsListViewModel + @ObservedObject var conversation: ConversationModel - @ObservedObject var conversationViewModel: ConversationViewModel - @ObservedObject var conversationsListViewModel: ConversationsListViewModel @Binding var showingSheet: Bool @Binding var text: String @@ -196,7 +193,7 @@ struct ConversationRow: View { .listRowSeparator(.hidden) .background(.white) .onTapGesture { - conversationViewModel.changeDisplayedChatRoom(conversationModel: conversation) + conversationsListViewModel.changeDisplayedChatRoom(conversationModel: conversation) } .onLongPressGesture(minimumDuration: 0.2) { conversationsListViewModel.selectedConversation = conversation @@ -207,8 +204,6 @@ struct ConversationRow: View { #Preview { ConversationsListFragment( - conversationViewModel: ConversationViewModel(), - conversationsListViewModel: ConversationsListViewModel(), showingSheet: .constant(false), text: .constant("") ) diff --git a/Linphone/UI/Main/Conversations/Fragments/UIList.swift b/Linphone/UI/Main/Conversations/Fragments/UIList.swift index ea99d9286..1b9f58603 100644 --- a/Linphone/UI/Main/Conversations/Fragments/UIList.swift +++ b/Linphone/UI/Main/Conversations/Fragments/UIList.swift @@ -376,7 +376,7 @@ struct UIList: UIViewRepresentable { guard !self.sections.isEmpty, let firstSection = self.sections.first, let firstConversationSection = parent.conversationViewModel.conversationMessagesSection.first, - let displayedConversation = parent.conversationViewModel.displayedConversation, + let displayedConversation = SharedMainViewModel.shared.displayedConversation, let tableView = self.tableView, firstSection.chatRoomID == displayedConversation.id, firstSection.rows.count == firstConversationSection.rows.count else { @@ -391,8 +391,8 @@ struct UIList: UIViewRepresentable { if !self.sections.isEmpty { if self.sections.first != nil && parent.conversationViewModel.conversationMessagesSection.first != nil - && parent.conversationViewModel.displayedConversation != nil - && self.sections.first!.chatRoomID == parent.conversationViewModel.displayedConversation!.id + && SharedMainViewModel.shared.displayedConversation != nil + && self.sections.first!.chatRoomID == SharedMainViewModel.shared.displayedConversation!.id && self.sections.first!.rows.count == parent.conversationViewModel.conversationMessagesSection.first!.rows.count { if let dict = notification.userInfo as NSDictionary? { if let index = dict["index"] as? Int { diff --git a/Linphone/UI/Main/Conversations/ViewModel/ConversationViewModel.swift b/Linphone/UI/Main/Conversations/ViewModel/ConversationViewModel.swift index d7f188188..c766f5532 100644 --- a/Linphone/UI/Main/Conversations/ViewModel/ConversationViewModel.swift +++ b/Linphone/UI/Main/Conversations/ViewModel/ConversationViewModel.swift @@ -32,8 +32,8 @@ class ConversationViewModel: ObservableObject { static let TAG = "[ConversationViewModel]" private var coreContext = CoreContext.shared + private var sharedMainViewModel = SharedMainViewModel.shared - @Published var displayedConversation: ConversationModel? @Published var displayedConversationHistorySize: Int = 0 @Published var displayedConversationUnreadMessagesCount: Int = 0 @@ -119,11 +119,20 @@ class ConversationViewModel: ObservableObject { var isMe: Bool = false } - init() {} + init() { + // TODO a check si utile + /* + self.selectedMessage = nil + self.resetMessage() + self.removeConversationDelegate() + self.addConversationDelegate(chatRoom: newChatRoom) + self.getMessages() + */ + } func addConversationDelegate() { coreContext.doOnCoreQueue { _ in - if let chatroom = self.displayedConversation?.chatRoom { + if let chatroom = self.sharedMainViewModel.displayedConversation?.chatRoom { let chatRoomDelegate = ChatRoomDelegateStub( onIsComposingReceived: { (_: ChatRoom, _: Address, _: Bool) in self.computeComposingLabel() }, onChatMessagesReceived: { (_: ChatRoom, eventLogs: [EventLog]) in @@ -143,16 +152,16 @@ class ConversationViewModel: ObservableObject { self.getNewMessages(eventLogs: [eventLogs]) }, onConferenceJoined: {(_: ChatRoom, eventLog: EventLog) in self.getNewMessages(eventLogs: [eventLog]) - if self.displayedConversation != nil { + if self.sharedMainViewModel.displayedConversation != nil { DispatchQueue.main.async { - self.displayedConversation!.isReadOnly = false + self.sharedMainViewModel.displayedConversation!.isReadOnly = false } } }, onConferenceLeft: {(_: ChatRoom, eventLog: EventLog) in self.getNewMessages(eventLogs: [eventLog]) - if self.displayedConversation != nil { + if self.sharedMainViewModel.displayedConversation != nil { DispatchQueue.main.async { - self.displayedConversation!.isReadOnly = true + self.sharedMainViewModel.displayedConversation!.isReadOnly = true } } }, onEphemeralEvent: {(_: ChatRoom, eventLogs: EventLog) in @@ -189,16 +198,16 @@ class ConversationViewModel: ObservableObject { self.getEventMessage(eventLog: eventLog) }, onConferenceJoined: {(_: ChatRoom, eventLog: EventLog) in self.getEventMessage(eventLog: eventLog) - if self.displayedConversation != nil { + if self.sharedMainViewModel.displayedConversation != nil { DispatchQueue.main.async { - self.displayedConversation!.isReadOnly = false + self.sharedMainViewModel.displayedConversation!.isReadOnly = false } } }, onConferenceLeft: {(_: ChatRoom, eventLog: EventLog) in self.getEventMessage(eventLog: eventLog) - if self.displayedConversation != nil { + if self.sharedMainViewModel.displayedConversation != nil { DispatchQueue.main.async { - self.displayedConversation!.isReadOnly = true + self.sharedMainViewModel.displayedConversation!.isReadOnly = true } } }, onEphemeralEvent: {(_: ChatRoom, eventLog: EventLog) in @@ -210,7 +219,7 @@ class ConversationViewModel: ObservableObject { } func addChatMessageDelegate(message: ChatMessage) { - if self.displayedConversation != nil { + if self.sharedMainViewModel.displayedConversation != nil { var statusTmp: Message.Status? = .sending switch message.state { case .InProgress: @@ -452,8 +461,8 @@ class ConversationViewModel: ObservableObject { } func getHistorySize() { - if self.displayedConversation != nil { - let historySize = self.displayedConversation!.chatRoom.historyEventsSize + if self.sharedMainViewModel.displayedConversation != nil { + let historySize = self.sharedMainViewModel.displayedConversation!.chatRoom.historyEventsSize DispatchQueue.main.async { self.displayedConversationHistorySize = historySize } @@ -461,8 +470,8 @@ class ConversationViewModel: ObservableObject { } func getUnreadMessagesCount() { - if self.displayedConversation != nil { - let unreadMessagesCount = self.displayedConversation!.chatRoom.unreadMessagesCount + if self.sharedMainViewModel.displayedConversation != nil { + let unreadMessagesCount = self.sharedMainViewModel.displayedConversation!.chatRoom.unreadMessagesCount DispatchQueue.main.async { self.displayedConversationUnreadMessagesCount = unreadMessagesCount } @@ -471,11 +480,11 @@ class ConversationViewModel: ObservableObject { func markAsRead() { coreContext.doOnCoreQueue { _ in - if self.displayedConversation != nil { - let unreadMessagesCount = self.displayedConversation!.chatRoom.unreadMessagesCount + if self.sharedMainViewModel.displayedConversation != nil { + let unreadMessagesCount = self.sharedMainViewModel.displayedConversation!.chatRoom.unreadMessagesCount if unreadMessagesCount > 0 { - self.displayedConversation!.chatRoom.markAsRead() + self.sharedMainViewModel.displayedConversation!.chatRoom.markAsRead() DispatchQueue.main.async { self.displayedConversationUnreadMessagesCount = 0 @@ -486,13 +495,13 @@ class ConversationViewModel: ObservableObject { } func getParticipantConversationModel() { - if self.displayedConversation != nil { + if self.sharedMainViewModel.displayedConversation != nil { DispatchQueue.main.async { self.isUserAdmin = false self.participantConversationModelAdmin.removeAll() self.participantConversationModel.removeAll() } - self.displayedConversation!.chatRoom.participants.forEach { participant in + self.sharedMainViewModel.displayedConversation!.chatRoom.participants.forEach { participant in if participant.address != nil { ContactAvatarModel.getAvatarModelFromAddress(address: participant.address!) { avatarResult in let avatarModelTmp = avatarResult @@ -510,8 +519,8 @@ class ConversationViewModel: ObservableObject { } } - if !self.displayedConversation!.isReadOnly { - if let currentUser = self.displayedConversation?.chatRoom.me, + if !self.sharedMainViewModel.displayedConversation!.isReadOnly { + if let currentUser = self.sharedMainViewModel.displayedConversation?.chatRoom.me, let address = currentUser.address { ContactAvatarModel.getAvatarModelFromAddress(address: address) { avatarResult in let avatarModelTmp = avatarResult @@ -546,7 +555,7 @@ class ConversationViewModel: ObservableObject { self.mediasToSend.removeAll() self.messageToReply = nil - self.conversationInfoPopupText = displayedConversation?.subject ?? "" + self.conversationInfoPopupText = self.sharedMainViewModel.displayedConversation?.subject ?? "" self.attachments.removeAll() @@ -557,8 +566,8 @@ class ConversationViewModel: ObservableObject { self.computeComposingLabel() self.getEphemeralTime() - if self.displayedConversation != nil { - let historyEvents = self.displayedConversation!.chatRoom.getHistoryRangeEvents(begin: 0, end: 30) + if self.sharedMainViewModel.displayedConversation != nil { + let historyEvents = self.sharedMainViewModel.displayedConversation!.chatRoom.getHistoryRangeEvents(begin: 0, end: 30) var conversationMessage: [EventLogMessage] = [] historyEvents.enumerated().forEach { index, eventLog in @@ -789,9 +798,9 @@ class ConversationViewModel: ObservableObject { } DispatchQueue.main.async { - if self.conversationMessagesSection.isEmpty && self.displayedConversation != nil { + if self.conversationMessagesSection.isEmpty && self.sharedMainViewModel.displayedConversation != nil { Log.info("[ConversationViewModel] Get Messages \(self.conversationMessagesSection.count)") - self.conversationMessagesSection.append(MessagesSection(date: Date(), chatRoomID: self.displayedConversation!.id, rows: conversationMessage.reversed())) + self.conversationMessagesSection.append(MessagesSection(date: Date(), chatRoomID: self.sharedMainViewModel.displayedConversation!.id, rows: conversationMessage.reversed())) } } } @@ -800,10 +809,10 @@ class ConversationViewModel: ObservableObject { func getOldMessages() { coreContext.doOnCoreQueue { _ in - if self.displayedConversation != nil && !self.conversationMessagesSection.isEmpty + if self.sharedMainViewModel.displayedConversation != nil && !self.conversationMessagesSection.isEmpty && self.displayedConversationHistorySize > self.conversationMessagesSection[0].rows.count && !self.oldMessageReceived { self.oldMessageReceived = true - let historyEvents = self.displayedConversation!.chatRoom.getHistoryRangeEvents(begin: self.conversationMessagesSection[0].rows.count, end: self.conversationMessagesSection[0].rows.count + 30) + let historyEvents = self.sharedMainViewModel.displayedConversation!.chatRoom.getHistoryRangeEvents(begin: self.conversationMessagesSection[0].rows.count, end: self.conversationMessagesSection[0].rows.count + 30) var conversationMessagesTmp: [EventLogMessage] = [] historyEvents.enumerated().reversed().forEach { index, eventLog in @@ -1058,7 +1067,7 @@ class ConversationViewModel: ObservableObject { var conversationMessagesTmp: [EventLogMessage] = [] - let unreadMessagesCount = self.displayedConversation != nil ? self.displayedConversation!.chatRoom.unreadMessagesCount : 0 + let unreadMessagesCount = self.sharedMainViewModel.displayedConversation != nil ? self.sharedMainViewModel.displayedConversation!.chatRoom.unreadMessagesCount : 0 if let firstEventLogId = self.conversationMessagesSection[0].rows.first?.eventModel.eventLogId, let lastMessageId = eventLogs.last?.chatMessage?.messageId, @@ -1317,8 +1326,8 @@ class ConversationViewModel: ObservableObject { self.conversationMessagesSection[0].rows[0].message.isFirstMessage = false } - if self.conversationMessagesSection.isEmpty && self.displayedConversation != nil { - self.conversationMessagesSection.append(MessagesSection(date: Date(), chatRoomID: self.displayedConversation!.id, rows: conversationMessagesTmp)) + if self.conversationMessagesSection.isEmpty && self.sharedMainViewModel.displayedConversation != nil { + self.conversationMessagesSection.append(MessagesSection(date: Date(), chatRoomID: self.sharedMainViewModel.displayedConversation!.id, rows: conversationMessagesTmp)) } else { self.conversationMessagesSection[0].rows.insert(contentsOf: conversationMessagesTmp, at: 0) } @@ -1337,7 +1346,7 @@ class ConversationViewModel: ObservableObject { func sendFirstMessage(eventLog: EventLog) { var conversationMessagesTmp: [EventLogMessage] = [] - let unreadMessagesCount = self.displayedConversation != nil ? self.displayedConversation!.chatRoom.unreadMessagesCount : 0 + let unreadMessagesCount = self.sharedMainViewModel.displayedConversation != nil ? self.sharedMainViewModel.displayedConversation!.chatRoom.unreadMessagesCount : 0 var attachmentNameList: String = "" var attachmentList: [Attachment] = [] var contentText = "" @@ -1539,8 +1548,8 @@ class ConversationViewModel: ObservableObject { if let eventLogMessage = conversationMessagesTmp.last { DispatchQueue.main.async { Log.info("[ConversationViewModel] Send first message") - if self.conversationMessagesSection.isEmpty && self.displayedConversation != nil { - self.conversationMessagesSection.append(MessagesSection(date: Date(), chatRoomID: self.displayedConversation!.id, rows: conversationMessagesTmp)) + if self.conversationMessagesSection.isEmpty && self.sharedMainViewModel.displayedConversation != nil { + self.conversationMessagesSection.append(MessagesSection(date: Date(), chatRoomID: self.sharedMainViewModel.displayedConversation!.id, rows: conversationMessagesTmp)) } else { self.conversationMessagesSection[0].rows.append(eventLogMessage) } @@ -1569,8 +1578,8 @@ class ConversationViewModel: ObservableObject { DispatchQueue.main.async { Log.info("[ConversationViewModel] Get event message") - if self.conversationMessagesSection.isEmpty && self.displayedConversation != nil { - self.conversationMessagesSection.append(MessagesSection(date: Date(), chatRoomID: self.displayedConversation!.id, rows: [eventLogMessage])) + if self.conversationMessagesSection.isEmpty && self.sharedMainViewModel.displayedConversation != nil { + self.conversationMessagesSection.append(MessagesSection(date: Date(), chatRoomID: self.sharedMainViewModel.displayedConversation!.id, rows: [eventLogMessage])) } else { self.conversationMessagesSection[0].rows.insert(eventLogMessage, at: 0) } @@ -1601,19 +1610,19 @@ class ConversationViewModel: ObservableObject { NotificationCenter.default.post(name: NSNotification.Name(rawValue: "onScrollToIndex"), object: nil, userInfo: ["index": indexMessage, "animated": true]) } else { if self.conversationMessagesSection[0].rows.last != nil { - let firstEventLog = self.displayedConversation?.chatRoom.getHistoryRangeEvents( + let firstEventLog = self.sharedMainViewModel.displayedConversation?.chatRoom.getHistoryRangeEvents( begin: self.conversationMessagesSection[0].rows.count - 1, end: self.conversationMessagesSection[0].rows.count ) - let lastEventLog = self.displayedConversation!.chatRoom.findEventLog(messageId: message.replyMessage!.id) + let lastEventLog = self.sharedMainViewModel.displayedConversation!.chatRoom.findEventLog(messageId: message.replyMessage!.id) - var historyEvents = self.displayedConversation!.chatRoom.getHistoryRangeBetween( + var historyEvents = self.sharedMainViewModel.displayedConversation!.chatRoom.getHistoryRangeBetween( firstEvent: firstEventLog!.first, lastEvent: lastEventLog, filters: UInt(ChatRoom.HistoryFilter([.ChatMessage, .InfoNoDevice]).rawValue) ) - let historyEventsAfter = self.displayedConversation!.chatRoom.getHistoryRangeEvents( + let historyEventsAfter = self.sharedMainViewModel.displayedConversation!.chatRoom.getHistoryRangeEvents( begin: self.conversationMessagesSection[0].rows.count + historyEvents.count + 1, end: self.conversationMessagesSection[0].rows.count + historyEvents.count + 30 ) @@ -1884,17 +1893,17 @@ class ConversationViewModel: ObservableObject { } func sendMessage(audioRecorder: AudioRecorder? = nil) { - if self.displayedConversation != nil { + if self.sharedMainViewModel.displayedConversation != nil { coreContext.doOnCoreQueue { _ in do { var message: ChatMessage? if self.messageToReply != nil { - let chatMessageToReply = self.displayedConversation!.chatRoom.findEventLog(messageId: self.messageToReply!.eventModel.eventLogId)?.chatMessage + let chatMessageToReply = self.sharedMainViewModel.displayedConversation!.chatRoom.findEventLog(messageId: self.messageToReply!.eventModel.eventLogId)?.chatMessage if chatMessageToReply != nil { - message = try self.displayedConversation!.chatRoom.createReplyMessage(message: chatMessageToReply!) + message = try self.sharedMainViewModel.displayedConversation!.chatRoom.createReplyMessage(message: chatMessageToReply!) } } else { - message = try self.displayedConversation!.chatRoom.createEmptyMessage() + message = try self.sharedMainViewModel.displayedConversation!.chatRoom.createEmptyMessage() } let toSend = self.messageText.trimmingCharacters(in: .whitespacesAndNewlines) @@ -2015,7 +2024,7 @@ class ConversationViewModel: ObservableObject { self.addConversationDelegate(chatRoom: newChatRoom) DispatchQueue.main.async { withAnimation { - self.displayedConversation = conversationModel + self.sharedMainViewModel.displayedConversation = conversationModel } self.getMessages() } @@ -2026,7 +2035,7 @@ class ConversationViewModel: ObservableObject { func resetDisplayedChatRoom() { if !self.conversationMessagesSection.isEmpty && !self.conversationMessagesSection[0].rows.isEmpty { - if let displayedConversation = self.displayedConversation { + if let displayedConversation = self.sharedMainViewModel.displayedConversation { CoreContext.shared.doOnCoreQueue { core in let nilParams: ConferenceParams? = nil if let newChatRoom = core.searchChatRoom(params: nilParams, localAddr: nil, remoteAddr: displayedConversation.chatRoom.peerAddress, participants: nil) { @@ -2034,7 +2043,7 @@ class ConversationViewModel: ObservableObject { self.addConversationDelegate(chatRoom: newChatRoom) let conversation = ConversationModel(chatRoom: newChatRoom) DispatchQueue.main.async { - self.displayedConversation = conversation + self.sharedMainViewModel.displayedConversation = conversation } self.computeComposingLabel() let historyEventsSizeTmp = newChatRoom.historyEventsSize @@ -2054,7 +2063,7 @@ class ConversationViewModel: ObservableObject { func downloadContent(chatMessage: ChatMessage, content: Content) { // Log.debug("[ConversationViewModel] Starting downloading content for file \(model.fileName)") - if self.displayedConversation != nil { + if self.sharedMainViewModel.displayedConversation != nil { if let contentName = content.name { var file = FileUtil.sharedContainerUrl().appendingPathComponent("Library/Images").absoluteString + (contentName.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? "") var fileExists = FileUtil.sharedContainerUrl() @@ -2076,7 +2085,7 @@ class ConversationViewModel: ObservableObject { Log.info( "[ConversationViewModel] File \(contentName) will be downloaded at \(content.filePath ?? "NIL")" ) - self.displayedConversation!.downloadContent(chatMessage: chatMessage, content: content) + self.sharedMainViewModel.displayedConversation!.downloadContent(chatMessage: chatMessage, content: content) } else { Log.error("[ConversationViewModel] Content name is null, can't download it!") } @@ -2158,11 +2167,11 @@ class ConversationViewModel: ObservableObject { } func removeReaction() { - if self.displayedConversation != nil { + if self.sharedMainViewModel.displayedConversation != nil { coreContext.doOnCoreQueue { _ in if self.selectedMessageToDisplayDetails != nil { Log.info("[ConversationViewModel] Remove reaction to message with ID \(self.selectedMessageToDisplayDetails!.message.id)") - let messageToSendReaction = self.displayedConversation!.chatRoom.findEventLog(messageId: self.selectedMessageToDisplayDetails!.eventModel.eventLogId)?.chatMessage + let messageToSendReaction = self.sharedMainViewModel.displayedConversation!.chatRoom.findEventLog(messageId: self.selectedMessageToDisplayDetails!.eventModel.eventLogId)?.chatMessage if messageToSendReaction != nil { do { let reaction = try messageToSendReaction!.createReaction(utf8Reaction: "") @@ -2190,7 +2199,7 @@ class ConversationViewModel: ObservableObject { coreContext.doOnCoreQueue { _ in if self.selectedMessage != nil { Log.info("[ConversationViewModel] Sending reaction \(emoji) to message with ID \(self.selectedMessage!.message.id)") - let messageToSendReaction = self.displayedConversation!.chatRoom.findEventLog(messageId: self.selectedMessage!.eventModel.eventLogId)?.chatMessage + let messageToSendReaction = self.sharedMainViewModel.displayedConversation!.chatRoom.findEventLog(messageId: self.selectedMessage!.eventModel.eventLogId)?.chatMessage if messageToSendReaction != nil { do { let reaction = try messageToSendReaction!.createReaction(utf8Reaction: messageToSendReaction?.ownReaction?.body == emoji ? "" : emoji) @@ -2214,7 +2223,7 @@ class ConversationViewModel: ObservableObject { func resend() { coreContext.doOnCoreQueue { _ in - let chatMessageToResend = self.displayedConversation!.chatRoom.findEventLog(messageId: self.selectedMessage!.eventModel.eventLogId)?.chatMessage + let chatMessageToResend = self.sharedMainViewModel.displayedConversation!.chatRoom.findEventLog(messageId: self.selectedMessage!.eventModel.eventLogId)?.chatMessage if self.selectedMessage != nil && chatMessageToResend != nil { Log.info("[ConversationViewModel] Re-sending message with ID \(chatMessageToResend!)") chatMessageToResend!.send() @@ -2225,7 +2234,7 @@ class ConversationViewModel: ObservableObject { func prepareBottomSheetForDeliveryStatus() { self.sheetCategories.removeAll() coreContext.doOnCoreQueue { _ in - let chatMessageToDisplay = self.displayedConversation!.chatRoom.findEventLog(messageId: self.selectedMessageToDisplayDetails!.eventModel.eventLogId)?.chatMessage + let chatMessageToDisplay = self.sharedMainViewModel.displayedConversation!.chatRoom.findEventLog(messageId: self.selectedMessageToDisplayDetails!.eventModel.eventLogId)?.chatMessage if self.selectedMessageToDisplayDetails != nil && chatMessageToDisplay != nil { let participantsImdnDisplayed = chatMessageToDisplay!.getParticipantsByImdnState(state: .Displayed) @@ -2287,7 +2296,7 @@ class ConversationViewModel: ObservableObject { func prepareBottomSheetForReactions() { self.sheetCategories.removeAll() coreContext.doOnCoreQueue { core in - let chatMessageToDisplay = self.displayedConversation!.chatRoom.findEventLog(messageId: self.selectedMessageToDisplayDetails!.eventModel.eventLogId)?.chatMessage + let chatMessageToDisplay = self.sharedMainViewModel.displayedConversation!.chatRoom.findEventLog(messageId: self.selectedMessageToDisplayDetails!.eventModel.eventLogId)?.chatMessage if self.selectedMessageToDisplayDetails != nil && chatMessageToDisplay != nil { let dispatchGroup = DispatchGroup() @@ -2388,15 +2397,15 @@ class ConversationViewModel: ObservableObject { func compose() { coreContext.doOnCoreQueue { _ in - if self.displayedConversation != nil { - self.displayedConversation!.chatRoom.compose() + if self.sharedMainViewModel.displayedConversation != nil { + self.sharedMainViewModel.displayedConversation!.chatRoom.compose() } } } func computeComposingLabel() { - if self.displayedConversation != nil { - let composing = self.displayedConversation!.chatRoom.isRemoteComposing + if self.sharedMainViewModel.displayedConversation != nil { + let composing = self.sharedMainViewModel.displayedConversation!.chatRoom.isRemoteComposing if !composing { DispatchQueue.main.async { @@ -2410,7 +2419,7 @@ class ConversationViewModel: ObservableObject { var composingFriends: [String] = [] var label = "" - for address in self.displayedConversation!.chatRoom.composingAddresses { + for address in self.sharedMainViewModel.displayedConversation!.chatRoom.composingAddresses { if let addressCleaned = address.clone() { addressCleaned.clean() @@ -2444,29 +2453,6 @@ class ConversationViewModel: ObservableObject { } } - func getChatRoomWithStringAddress(conversationsList: [ConversationModel], stringAddr: String) { - CoreContext.shared.doOnCoreQueue { _ in - do { - let stringAddrCleaned = stringAddr.components(separatedBy: ";gr=") - let address = try Factory.Instance.createAddress(addr: stringAddrCleaned[0]) - if let dispChatRoom = conversationsList.first(where: {$0.chatRoom.peerAddress != nil && $0.chatRoom.peerAddress!.equal(address2: address)}) { - if self.displayedConversation != nil { - if dispChatRoom.id != self.displayedConversation!.id { - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - self.changeDisplayedChatRoom(conversationModel: dispChatRoom) - } - } - } else { - DispatchQueue.main.async { - self.changeDisplayedChatRoom(conversationModel: dispChatRoom) - } - } - } - } catch { - } - } - } - func parseConferenceInvite(content: Content) -> MessageConferenceInfo? { var meetingConferenceUriTmp: String = "" var meetingSubjectTmp: String = "" @@ -2549,7 +2535,7 @@ class ConversationViewModel: ObservableObject { func setEphemeralTime(lifetimeString: String) { coreContext.doOnCoreQueue { _ in - if self.displayedConversation != nil { + if self.sharedMainViewModel.displayedConversation != nil { var lifetime: Int = 0 switch lifetimeString { @@ -2568,11 +2554,11 @@ class ConversationViewModel: ObservableObject { } if lifetime == 0 { - self.displayedConversation!.chatRoom.ephemeralEnabled = false - self.displayedConversation!.chatRoom.ephemeralLifetime = lifetime + self.sharedMainViewModel.displayedConversation!.chatRoom.ephemeralEnabled = false + self.sharedMainViewModel.displayedConversation!.chatRoom.ephemeralLifetime = lifetime } else { - self.displayedConversation!.chatRoom.ephemeralEnabled = true - self.displayedConversation!.chatRoom.ephemeralLifetime = lifetime + self.sharedMainViewModel.displayedConversation!.chatRoom.ephemeralEnabled = true + self.sharedMainViewModel.displayedConversation!.chatRoom.ephemeralLifetime = lifetime } self.getEphemeralTime() @@ -2581,9 +2567,9 @@ class ConversationViewModel: ObservableObject { } func getEphemeralTime() { - if self.displayedConversation != nil { + if self.sharedMainViewModel.displayedConversation != nil { - let lifetime = self.displayedConversation!.chatRoom.ephemeralLifetime + let lifetime = self.sharedMainViewModel.displayedConversation!.chatRoom.ephemeralLifetime DispatchQueue.main.async { switch lifetime { case 60: @@ -2610,17 +2596,17 @@ class ConversationViewModel: ObservableObject { } func setNewChatRoomSubject() { - if self.displayedConversation != nil && self.conversationInfoPopupText != self.displayedConversation!.subject { + if self.sharedMainViewModel.displayedConversation != nil && self.conversationInfoPopupText != self.sharedMainViewModel.displayedConversation!.subject { coreContext.doOnCoreQueue { _ in - self.displayedConversation!.chatRoom.subject = self.conversationInfoPopupText + self.sharedMainViewModel.displayedConversation!.chatRoom.subject = self.conversationInfoPopupText } - self.displayedConversation!.subject = self.conversationInfoPopupText - self.displayedConversation!.avatarModel = ContactAvatarModel( - friend: self.displayedConversation!.avatarModel.friend, + self.sharedMainViewModel.displayedConversation!.subject = self.conversationInfoPopupText + self.sharedMainViewModel.displayedConversation!.avatarModel = ContactAvatarModel( + friend: self.sharedMainViewModel.displayedConversation!.avatarModel.friend, name: self.conversationInfoPopupText, - address: self.displayedConversation!.avatarModel.address, + address: self.sharedMainViewModel.displayedConversation!.avatarModel.address, withPresence: false ) self.isShowConversationInfoPopup = false @@ -2638,7 +2624,7 @@ class ConversationViewModel: ObservableObject { continue } - if self.displayedConversation!.chatRoom.me != nil && self.displayedConversation!.chatRoom.me!.address != nil && !self.displayedConversation!.chatRoom.me!.address!.weakEqual(address2: addr!) { + if self.sharedMainViewModel.displayedConversation!.chatRoom.me != nil && self.sharedMainViewModel.displayedConversation!.chatRoom.me!.address != nil && !self.sharedMainViewModel.displayedConversation!.chatRoom.me!.address!.weakEqual(address2: addr!) { list.append(SelectedAddressModel(addr: addr!, avModel: participant)) Log.info("\(ConversationViewModel.TAG) Added participant \(addr!.asStringUriOnly())") } @@ -2662,7 +2648,7 @@ class ConversationViewModel: ObservableObject { Log.info("\(ConversationViewModel.TAG) Added participant \(selectedAddr.address.asStringUriOnly())") } - let participantsAddress = self.displayedConversation!.chatRoom.participants.map { $0.address?.asStringUriOnly() } + let participantsAddress = self.sharedMainViewModel.displayedConversation!.chatRoom.participants.map { $0.address?.asStringUriOnly() } let listAddress = list.map { $0.address.asStringUriOnly() } let differences = participantsAddress.difference(from: listAddress) @@ -2675,17 +2661,17 @@ class ConversationViewModel: ObservableObject { } } - let filteredParticipants = self.displayedConversation!.chatRoom.participants.filter { participant in + let filteredParticipants = self.sharedMainViewModel.displayedConversation!.chatRoom.participants.filter { participant in differenceAddresses.contains(participant.address!.asStringUriOnly()) } coreContext.doOnCoreQueue { _ in - _ = self.displayedConversation!.chatRoom.addParticipants(addresses: list.map { $0.address }) - self.displayedConversation!.chatRoom.removeParticipants(participants: filteredParticipants) + _ = self.sharedMainViewModel.displayedConversation!.chatRoom.addParticipants(addresses: list.map { $0.address }) + self.sharedMainViewModel.displayedConversation!.chatRoom.removeParticipants(participants: filteredParticipants) } } else { coreContext.doOnCoreQueue { _ in - _ = self.displayedConversation!.chatRoom.addParticipants(addresses: list.map { $0.address }) + _ = self.sharedMainViewModel.displayedConversation!.chatRoom.addParticipants(addresses: list.map { $0.address }) } } @@ -2693,10 +2679,10 @@ class ConversationViewModel: ObservableObject { } func toggleAdminRights(address: String) { - if self.displayedConversation != nil { + if self.sharedMainViewModel.displayedConversation != nil { coreContext.doOnCoreQueue { _ in - if let participant = self.displayedConversation!.chatRoom.participants.first(where: {$0.address?.asStringUriOnly() == address}) { - self.displayedConversation!.chatRoom.setParticipantAdminStatus(participant: participant, isAdmin: !participant.isAdmin) + if let participant = self.sharedMainViewModel.displayedConversation!.chatRoom.participants.first(where: {$0.address?.asStringUriOnly() == address}) { + self.sharedMainViewModel.displayedConversation!.chatRoom.setParticipantAdminStatus(participant: participant, isAdmin: !participant.isAdmin) } } @@ -2704,10 +2690,10 @@ class ConversationViewModel: ObservableObject { } func removeParticipant(address: String) { - if self.displayedConversation != nil { + if self.sharedMainViewModel.displayedConversation != nil { coreContext.doOnCoreQueue { _ in - if let participant = self.displayedConversation!.chatRoom.participants.first(where: {$0.address?.asStringUriOnly() == address}) { - self.displayedConversation!.chatRoom.removeParticipant(participant: participant) + if let participant = self.sharedMainViewModel.displayedConversation!.chatRoom.participants.first(where: {$0.address?.asStringUriOnly() == address}) { + self.sharedMainViewModel.displayedConversation!.chatRoom.removeParticipant(participant: participant) } } @@ -2720,7 +2706,7 @@ class ConversationViewModel: ObservableObject { func deleteMessage() { coreContext.doOnCoreQueue { _ in - if let displayedConversation = self.displayedConversation, + if let displayedConversation = self.sharedMainViewModel.displayedConversation, let selectedMessage = self.selectedMessage, let chatMessage = selectedMessage.eventModel.eventLog.chatMessage { displayedConversation.chatRoom.deleteMessage(message: chatMessage) diff --git a/Linphone/UI/Main/Conversations/ViewModel/ConversationsListViewModel.swift b/Linphone/UI/Main/Conversations/ViewModel/ConversationsListViewModel.swift index 1d480c823..ceef5c918 100644 --- a/Linphone/UI/Main/Conversations/ViewModel/ConversationsListViewModel.swift +++ b/Linphone/UI/Main/Conversations/ViewModel/ConversationsListViewModel.swift @@ -29,6 +29,7 @@ class ConversationsListViewModel: ObservableObject { private var coreContext = CoreContext.shared private var contactsManager = ContactsManager.shared + private var sharedMainViewModel = SharedMainViewModel.shared private var coreConversationDelegate: CoreDelegate? @@ -402,7 +403,9 @@ class ConversationsListViewModel: ObservableObject { if unreadMessagesCount > 0 { self.selectedConversation!.chatRoom.markAsRead() - self.selectedConversation!.unreadMessagesCount = 0 + DispatchQueue.main.async { + self.selectedConversation!.unreadMessagesCount = 0 + } } } } @@ -428,5 +431,43 @@ class ConversationsListViewModel: ObservableObject { func resetFilterConversations() { filterConversations(filter: "") } + + func getChatRoomWithStringAddress(stringAddr: String) { + CoreContext.shared.doOnCoreQueue { _ in + do { + let stringAddrCleaned = stringAddr.components(separatedBy: ";gr=") + let address = try Factory.Instance.createAddress(addr: stringAddrCleaned[0]) + if let dispChatRoom = self.conversationsList.first(where: {$0.chatRoom.peerAddress != nil && $0.chatRoom.peerAddress!.equal(address2: address)}) { + if self.sharedMainViewModel.displayedConversation != nil { + if dispChatRoom.id != self.sharedMainViewModel.displayedConversation!.id { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + self.changeDisplayedChatRoom(conversationModel: dispChatRoom) + } + } + } else { + DispatchQueue.main.async { + self.changeDisplayedChatRoom(conversationModel: dispChatRoom) + } + } + } + } catch { + } + } + } + + func changeDisplayedChatRoom(conversationModel: ConversationModel) { + CoreContext.shared.doOnCoreQueue { core in + let nilParams: ConferenceParams? = nil + if let newChatRoom = core.searchChatRoom(params: nilParams, localAddr: nil, remoteAddr: conversationModel.chatRoom.peerAddress, participants: nil) { + if LinphoneUtils.getChatRoomId(room: newChatRoom) == conversationModel.id { + DispatchQueue.main.async { + withAnimation { + self.sharedMainViewModel.displayedConversation = conversationModel + } + } + } + } + } + } } // swiftlint:enable line_length