From 0d149c7b54c2428c09c0f9790d412634bc63b9f2 Mon Sep 17 00:00:00 2001 From: Benoit Martins Date: Fri, 13 Jun 2025 18:33:31 +0200 Subject: [PATCH] Refactored ConversationFragment --- Linphone/UI/Call/CallView.swift | 9 +- .../UI/Call/ViewModel/CallViewModel.swift | 27 +++ .../Fragments/ContactsListFragment.swift | 16 +- .../ViewModel/ContactsListViewModel.swift | 25 ++- Linphone/UI/Main/ContentView.swift | 106 +++++------ .../Fragments/ChatBubbleView.swift | 8 +- .../ConversationForwardMessageFragment.swift | 17 +- .../Fragments/ConversationFragment.swift | 98 +++++----- .../Fragments/ConversationInfoFragment.swift | 75 +++----- .../Fragments/EphemeralFragment.swift | 3 +- .../Fragments/StartConversationFragment.swift | 15 +- .../StartGroupConversationFragment.swift | 7 +- .../Main/Conversations/Fragments/UIList.swift | 12 +- .../ConversationForwardMessageViewModel.swift | 5 +- .../ViewModel/ConversationViewModel.swift | 14 +- .../ConversationsListViewModel.swift | 42 ++++- .../StartConversationViewModel.swift | 10 +- .../Fragments/PopupViewWithTextField.swift | 4 +- .../Fragments/HistoryContactFragment.swift | 2 +- .../ViewModel/HistoryListViewModel.swift | 178 ++++++++++++++++++ .../Main/Viewmodel/SharedMainViewModel.swift | 3 + 21 files changed, 456 insertions(+), 220 deletions(-) diff --git a/Linphone/UI/Call/CallView.swift b/Linphone/UI/Call/CallView.swift index 2deb17962..85268c57a 100644 --- a/Linphone/UI/Call/CallView.swift +++ b/Linphone/UI/Call/CallView.swift @@ -2245,7 +2245,7 @@ struct CallView: View { .onDisappear { if SharedMainViewModel.shared.displayedConversation != nil { SharedMainViewModel.shared.changeIndexView(indexViewInt: 2) - //self.conversationViewModel.changeDisplayedChatRoom(conversationModel: SharedMainViewModel.shared.displayedConversation!) + callViewModel.changeDisplayedChatRoom(conversationModel: SharedMainViewModel.shared.displayedConversation!) SharedMainViewModel.shared.displayedConversation = nil withAnimation { telecomManager.callDisplayed = false @@ -2615,7 +2615,12 @@ struct CallView: View { .frame(width: 32, height: 32, alignment: .center) .onDisappear { if SharedMainViewModel.shared.displayedConversation != nil { - //conversationViewModel.changeDisplayedChatRoom(conversationModel: SharedMainViewModel.shared.displayedConversation!) + SharedMainViewModel.shared.changeIndexView(indexViewInt: 2) + callViewModel.changeDisplayedChatRoom(conversationModel: SharedMainViewModel.shared.displayedConversation!) + SharedMainViewModel.shared.displayedConversation = nil + withAnimation { + telecomManager.callDisplayed = false + } } } } diff --git a/Linphone/UI/Call/ViewModel/CallViewModel.swift b/Linphone/UI/Call/ViewModel/CallViewModel.swift index 34948e2d7..c2dd9f1ad 100644 --- a/Linphone/UI/Call/ViewModel/CallViewModel.swift +++ b/Linphone/UI/Call/ViewModel/CallViewModel.swift @@ -32,6 +32,7 @@ class CallViewModel: ObservableObject { var coreContext = CoreContext.shared var telecomManager = TelecomManager.shared + var sharedMainViewModel = SharedMainViewModel.shared @Published var displayName: String = "" @Published var direction: Call.Dir = .Outgoing @@ -1394,6 +1395,32 @@ class CallViewModel: ObservableObject { }) chatRoom.addDelegate(delegate: self.chatRoomDelegate!) } + + 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 { + if self.sharedMainViewModel.displayedConversation == nil { + DispatchQueue.main.async { + withAnimation { + self.sharedMainViewModel.displayedConversation = conversationModel + } + } + } else { + DispatchQueue.main.async { + self.sharedMainViewModel.displayedConversation = nil + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + withAnimation { + self.sharedMainViewModel.displayedConversation = conversationModel + } + } + } + } + } + } + } + } } // swiftlint:enable type_body_length // swiftlint:enable line_length diff --git a/Linphone/UI/Main/Contacts/Fragments/ContactsListFragment.swift b/Linphone/UI/Main/Contacts/Fragments/ContactsListFragment.swift index 0ad6e9b3d..2835c128d 100644 --- a/Linphone/UI/Main/Contacts/Fragments/ContactsListFragment.swift +++ b/Linphone/UI/Main/Contacts/Fragments/ContactsListFragment.swift @@ -94,18 +94,22 @@ struct ContactRow: View { .listRowSeparator(.hidden) .background(.white) .onTapGesture { - withAnimation { - SharedMainViewModel.shared.displayedFriend = contactAvatarModel - } - + if SharedMainViewModel.shared.indexView == 0 { + withAnimation { + SharedMainViewModel.shared.displayedFriend = contactAvatarModel + } + } + if contactAvatarModel.friend != nil && contactAvatarModel.friend!.address != nil { startCallFunc(contactAvatarModel.friend!.address!) } } .onLongPressGesture(minimumDuration: 0.2) { - contactsListViewModel.selectedFriend = contactAvatarModel - showingSheet.toggle() + if SharedMainViewModel.shared.indexView == 0 { + contactsListViewModel.selectedFriend = contactAvatarModel + showingSheet.toggle() + } } } } diff --git a/Linphone/UI/Main/Contacts/ViewModel/ContactsListViewModel.swift b/Linphone/UI/Main/Contacts/ViewModel/ContactsListViewModel.swift index 1f1f2d0ea..10712dec1 100644 --- a/Linphone/UI/Main/Contacts/ViewModel/ContactsListViewModel.swift +++ b/Linphone/UI/Main/Contacts/ViewModel/ContactsListViewModel.swift @@ -31,7 +31,6 @@ class ContactsListViewModel: ObservableObject { var selectedFriendToShare: ContactAvatarModel? var selectedFriendToDelete: ContactAvatarModel? - @Published var operationInProgress: Bool = false @Published var displayedConversation: ConversationModel? private var contactChatRoomDelegate: ChatRoomDelegate? @@ -49,7 +48,7 @@ class ContactsListViewModel: ObservableObject { } DispatchQueue.main.async { - self.operationInProgress = true + SharedMainViewModel.shared.operationInProgress = true } do { @@ -87,7 +86,7 @@ class ContactsListViewModel: ObservableObject { ) DispatchQueue.main.async { - self.operationInProgress = false + SharedMainViewModel.shared.operationInProgress = false ToastViewModel.shared.toastMessage = "Failed_to_create_conversation_error" ToastViewModel.shared.displayToast = true } @@ -113,7 +112,7 @@ class ContactsListViewModel: ObservableObject { let model = ConversationModel(chatRoom: chatRoom) DispatchQueue.main.async { self.displayedConversation = model - self.operationInProgress = false + SharedMainViewModel.shared.operationInProgress = false } } else { Log.info("\(ConversationForwardMessageViewModel.TAG) Conversation isn't in Created state yet (state is \(state)), wait for it") @@ -126,14 +125,14 @@ class ContactsListViewModel: ObservableObject { let model = ConversationModel(chatRoom: chatRoom) DispatchQueue.main.async { self.displayedConversation = model - self.operationInProgress = false + SharedMainViewModel.shared.operationInProgress = false } } } catch { Log.error("\(ConversationForwardMessageViewModel.TAG) Failed to create 1-1 conversation with \(remote.asStringUriOnly())") DispatchQueue.main.async { - self.operationInProgress = false + SharedMainViewModel.shared.operationInProgress = false ToastViewModel.shared.toastMessage = "Failed_to_create_conversation_error" ToastViewModel.shared.displayToast = true } @@ -145,7 +144,7 @@ class ContactsListViewModel: ObservableObject { let model = ConversationModel(chatRoom: existingChatRoom!) DispatchQueue.main.async { self.displayedConversation = model - self.operationInProgress = false + SharedMainViewModel.shared.operationInProgress = false } } } catch { @@ -164,7 +163,7 @@ class ContactsListViewModel: ObservableObject { self.contactChatRoomDelegate = nil } DispatchQueue.main.async { - self.operationInProgress = false + SharedMainViewModel.shared.operationInProgress = false ToastViewModel.shared.toastMessage = "Failed_to_create_conversation_error" ToastViewModel.shared.displayToast = true } @@ -180,18 +179,18 @@ class ContactsListViewModel: ObservableObject { self.contactChatRoomDelegate = nil } let model = ConversationModel(chatRoom: chatRoom) - if self.operationInProgress == false { + if SharedMainViewModel.shared.operationInProgress == false { DispatchQueue.main.async { - self.operationInProgress = true + SharedMainViewModel.shared.operationInProgress = true } DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - self.operationInProgress = false + SharedMainViewModel.shared.operationInProgress = false self.displayedConversation = model } } else { DispatchQueue.main.async { - self.operationInProgress = false + SharedMainViewModel.shared.operationInProgress = false self.displayedConversation = model } } @@ -203,7 +202,7 @@ class ContactsListViewModel: ObservableObject { self.contactChatRoomDelegate = nil } DispatchQueue.main.async { - self.operationInProgress = false + SharedMainViewModel.shared.operationInProgress = false ToastViewModel.shared.toastMessage = "Failed_to_create_conversation_error" ToastViewModel.shared.displayToast = true } diff --git a/Linphone/UI/Main/ContentView.swift b/Linphone/UI/Main/ContentView.swift index 3178f11cf..b3f425dfe 100644 --- a/Linphone/UI/Main/ContentView.swift +++ b/Linphone/UI/Main/ContentView.swift @@ -40,17 +40,13 @@ 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 meetingsListViewModel: MeetingsListViewModel //@ObservedObject var meetingViewModel: MeetingViewModel - //@ObservedObject var conversationForwardMessageViewModel: ConversationForwardMessageViewModel - //@Binding var index: Int @State private var orientation = UIDevice.current.orientation @@ -969,37 +965,30 @@ struct ContentView: View { .frame(maxWidth: .infinity) .background(Color.gray100) .ignoresSafeArea(.keyboard) - } else if let historyListVM = historyListViewModel, let displayedFriend = sharedMainViewModel.displayedFriend, sharedMainViewModel.indexView == 1 { + } else if let historyListVM = historyListViewModel, let displayedCall = sharedMainViewModel.displayedCall, sharedMainViewModel.indexView == 1 { HistoryContactFragment( isShowDeleteAllHistoryPopup: $isShowDeleteAllHistoryPopup, isShowEditContactFragment: $isShowEditContactFragment, isShowEditContactFragmentAddress: $isShowEditContactFragmentAddress ) .environmentObject(historyListVM) - .environmentObject(displayedFriend) + .environmentObject(displayedCall) .frame(maxWidth: .infinity) .background(Color.gray100) .ignoresSafeArea(.keyboard) - } else if sharedMainViewModel.indexView == 2 { - /* + } else if let conversationsListVM = conversationsListViewModel, sharedMainViewModel.indexView == 2 { ConversationFragment( - conversationViewModel: conversationViewModel, - conversationsListViewModel: conversationsListViewModel, - conversationForwardMessageViewModel: conversationForwardMessageViewModel, - contactsListViewModel: contactsListViewModel, - editContactViewModel: editContactViewModel, - meetingViewModel: meetingViewModel, - accountProfileViewModel: accountProfileViewModel, isShowConversationFragment: $isShowConversationFragment, isShowStartCallGroupPopup: $isShowStartCallGroupPopup, isShowEditContactFragment: $isShowEditContactFragment, - indexPage: $index, + isShowEditContactFragmentAddress: $isShowEditContactFragmentAddress, isShowScheduleMeetingFragment: $isShowScheduleMeetingFragment ) + .environmentObject(conversationsListVM) + .environmentObject(accountProfileViewModel) .frame(maxWidth: .infinity) .background(Color.gray100) .ignoresSafeArea(.keyboard) - */ } else if sharedMainViewModel.indexView == 3 { /* MeetingFragment(meetingViewModel: meetingViewModel, meetingsListViewModel: meetingsListViewModel, isShowScheduleMeetingFragment: $isShowScheduleMeetingFragment, isShowSendCancelMeetingNotificationPopup: $isShowSendCancelMeetingNotificationPopup) @@ -1090,17 +1079,14 @@ struct ContentView: View { .transition(.opacity.combined(with: .move(edge: .bottom))) } - /* - if isShowStartConversationFragment { + if let conversationsListVM = conversationsListViewModel, isShowStartConversationFragment { StartConversationFragment( - startConversationViewModel: startConversationViewModel, - conversationViewModel: conversationViewModel, isShowStartConversationFragment: $isShowStartConversationFragment ) + .environmentObject(conversationsListVM) .zIndex(6) .transition(.opacity.combined(with: .move(edge: .bottom))) } - */ if let contactsListVM = contactsListViewModel, isShowDeleteContactPopup { PopupView( @@ -1196,26 +1182,60 @@ struct ContentView: View { } } - /* - if contactsListViewModel.operationInProgress { + if sharedMainViewModel.operationInProgress { PopupLoadingView() .background(.black.opacity(0.65)) .zIndex(3) .onDisappear { - if contactsListViewModel.displayedConversation != nil { + if let contactsListVM = contactsListViewModel, let displayedConversation = contactsListVM.displayedConversation { sharedMainViewModel.displayedFriend = nil sharedMainViewModel.displayedCall = nil sharedMainViewModel.changeIndexView(indexViewInt: 2) - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - withAnimation { - self.conversationViewModel.changeDisplayedChatRoom(conversationModel: contactsListViewModel.displayedConversation!) + + if let conversationsListVM = self.conversationsListViewModel { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + withAnimation { + conversationsListVM.changeDisplayedChatRoom(conversationModel: displayedConversation) + } + contactsListVM.displayedConversation = nil + } + } else { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + if let conversationsListVM = self.conversationsListViewModel { + withAnimation { + conversationsListVM.changeDisplayedChatRoom(conversationModel: displayedConversation) + } + } + contactsListVM.displayedConversation = nil + } + } + } else if let historyListVM = historyListViewModel, let displayedConversation = historyListVM.displayedConversation { + sharedMainViewModel.displayedFriend = nil + sharedMainViewModel.displayedCall = nil + sharedMainViewModel.changeIndexView(indexViewInt: 2) + + if let conversationsListVM = self.conversationsListViewModel { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + withAnimation { + conversationsListVM.changeDisplayedChatRoom(conversationModel: displayedConversation) + } + historyListVM.displayedConversation = nil + } + } else { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + if let conversationsListVM = self.conversationsListViewModel { + withAnimation { + conversationsListVM.changeDisplayedChatRoom(conversationModel: displayedConversation) + } + } + historyListVM.displayedConversation = nil } - contactsListViewModel.displayedConversation = nil } } } } + /* if isShowScheduleMeetingFragment { ScheduleMeetingFragment( meetingViewModel: meetingViewModel, @@ -1282,6 +1302,7 @@ struct ContentView: View { self.isShowSendCancelMeetingNotificationPopup.toggle() } } + */ if isShowStartCallGroupPopup { PopupView( @@ -1307,30 +1328,7 @@ struct ContentView: View { } } - if isShowStartCallGroupPopup { - PopupView( - isShowPopup: $isShowStartCallGroupPopup, - title: Text("conversation_info_confirm_start_group_call_dialog_title"), - content: Text("conversation_info_confirm_start_group_call_dialog_message"), - titleFirstButton: Text("dialog_cancel"), - actionFirstButton: { - self.isShowStartCallGroupPopup.toggle() - }, - titleSecondButton: Text("dialog_ok"), - actionSecondButton: { - if sharedMainViewModel.displayedConversation != nil { - sharedMainViewModel.displayedConversation!.createGroupCall() - } - self.isShowStartCallGroupPopup.toggle() - } - ) - .background(.black.opacity(0.65)) - .zIndex(3) - .onTapGesture { - self.isShowStartCallGroupPopup.toggle() - } - } - + /* if conversationViewModel.isShowConversationInfoPopup { PopupViewWithTextField(conversationViewModel: conversationViewModel) .background(.black.opacity(0.65)) @@ -1453,8 +1451,6 @@ class NavigationManager: ObservableObject { #Preview { ContentView( //meetingWaitingRoomViewModel: MeetingWaitingRoomViewModel(), - //conversationsListViewModel: ConversationsListViewModel(), - //conversationViewModel: ConversationViewModel(), //meetingsListViewModel: MeetingsListViewModel(), //meetingViewModel: MeetingViewModel(), //conversationForwardMessageViewModel: ConversationForwardMessageViewModel(), diff --git a/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift b/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift index e1619273a..a91c22040 100644 --- a/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift +++ b/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift @@ -27,7 +27,7 @@ struct ChatBubbleView: View { private var idiom: UIUserInterfaceIdiom { UIDevice.current.userInterfaceIdiom } - @ObservedObject var conversationViewModel: ConversationViewModel + @EnvironmentObject var conversationViewModel: ConversationViewModel let eventLogMessage: EventLogMessage @@ -603,9 +603,9 @@ struct ChatBubbleView: View { .clipped() } else if eventLogMessage.message.attachments.first!.type == .voiceRecording { CustomSlider( - conversationViewModel: conversationViewModel, eventLogMessage: eventLogMessage ) + .environmentObject(conversationViewModel) .frame(width: geometryProxy.size.width - 160, height: 50) } else { HStack { @@ -990,7 +990,7 @@ extension View { } struct CustomSlider: View { - @ObservedObject var conversationViewModel: ConversationViewModel + @EnvironmentObject var conversationViewModel: ConversationViewModel let eventLogMessage: EventLogMessage @@ -1183,7 +1183,7 @@ struct CachedAsyncImage: View { /* #Preview { - ChatBubbleView(conversationViewModel: ConversationViewModel(), index: 0) + ChatBubbleView(index: 0) } */ diff --git a/Linphone/UI/Main/Conversations/Fragments/ConversationForwardMessageFragment.swift b/Linphone/UI/Main/Conversations/Fragments/ConversationForwardMessageFragment.swift index 65bfa4ee8..d6be4565a 100644 --- a/Linphone/UI/Main/Conversations/Fragments/ConversationForwardMessageFragment.swift +++ b/Linphone/UI/Main/Conversations/Fragments/ConversationForwardMessageFragment.swift @@ -25,9 +25,10 @@ struct ConversationForwardMessageFragment: View { @ObservedObject var contactsManager = ContactsManager.shared @ObservedObject var magicSearch = MagicSearchSingleton.shared - @ObservedObject var conversationViewModel: ConversationViewModel - @ObservedObject var conversationsListViewModel: ConversationsListViewModel - @ObservedObject var conversationForwardMessageViewModel: ConversationForwardMessageViewModel + @EnvironmentObject var conversationViewModel: ConversationViewModel + @EnvironmentObject var conversationsListViewModel: ConversationsListViewModel + + @StateObject private var conversationForwardMessageViewModel: ConversationForwardMessageViewModel @Binding var isShowConversationForwardMessageFragment: Bool @@ -36,6 +37,11 @@ struct ConversationForwardMessageFragment: View { @FocusState var isMessageTextFocused: Bool + init(conversationsList: [ConversationModel], selectedMessage: EventLogMessage?, isShowConversationForwardMessageFragment: Binding) { + _conversationForwardMessageViewModel = StateObject(wrappedValue: ConversationForwardMessageViewModel(conversationsList: conversationsList, selectedMessage: selectedMessage)) + self._isShowConversationForwardMessageFragment = isShowConversationForwardMessageFragment + } + var body: some View { NavigationView { ZStack { @@ -337,11 +343,10 @@ struct ConversationForwardMessageFragment: View { } } +/* #Preview { ConversationForwardMessageFragment( - conversationViewModel: ConversationViewModel(), - conversationsListViewModel: ConversationsListViewModel(), - conversationForwardMessageViewModel: ConversationForwardMessageViewModel(), isShowConversationForwardMessageFragment: .constant(true) ) } +*/ diff --git a/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift b/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift index c5f1f3184..283da640b 100644 --- a/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift +++ b/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift @@ -31,14 +31,11 @@ struct ConversationFragment: View { @EnvironmentObject var navigationManager: NavigationManager @ObservedObject var contactsManager = ContactsManager.shared - - @ObservedObject var conversationViewModel: ConversationViewModel - @ObservedObject var conversationsListViewModel: ConversationsListViewModel - @ObservedObject var conversationForwardMessageViewModel: ConversationForwardMessageViewModel - @ObservedObject var contactsListViewModel: ContactsListViewModel - @ObservedObject var editContactViewModel: EditContactViewModel - @ObservedObject var meetingViewModel: MeetingViewModel - @ObservedObject var accountProfileViewModel: AccountProfileViewModel + + @EnvironmentObject var conversationsListViewModel: ConversationsListViewModel + @EnvironmentObject var accountProfileViewModel: AccountProfileViewModel + + @StateObject private var conversationViewModel = ConversationViewModel() @State var isMenuOpen = false @State private var isMuted: Bool = false @@ -49,9 +46,6 @@ struct ConversationFragment: View { private let ids: [String] = [] - @StateObject private var viewModel = ChatViewModel() - @StateObject private var paginationState = PaginationState() - @State private var displayFloatingButton = false @State private var areFilePickersOpen = false @@ -73,9 +67,11 @@ struct ConversationFragment: View { @State private var selectedCategoryIndex = 0 @Binding var isShowEditContactFragment: Bool - @Binding var indexPage: Int + @Binding var isShowEditContactFragmentAddress: String @Binding var isShowScheduleMeetingFragment: Bool + + @State private var cachedConversation: ConversationModel? var body: some View { NavigationView { @@ -97,7 +93,8 @@ struct ConversationFragment: View { .sheet(isPresented: $conversationViewModel.isShowSelectedMessageToDisplayDetails, onDismiss: { conversationViewModel.isShowSelectedMessageToDisplayDetails = false }, content: { - ImdnOrReactionsSheet(conversationViewModel: conversationViewModel, selectedCategoryIndex: $selectedCategoryIndex) + ImdnOrReactionsSheet(selectedCategoryIndex: $selectedCategoryIndex) + .environmentObject(conversationViewModel) .presentationDetents([.medium]) .presentationDragIndicator(.visible) }) @@ -137,7 +134,8 @@ struct ConversationFragment: View { .edgesIgnoringSafeArea(.all) }) .fullScreenCover(isPresented: $isShowCamera) { - ImagePicker(conversationViewModel: conversationViewModel, selectedMedia: self.$conversationViewModel.mediasToSend) + ImagePicker(selectedMedia: self.$conversationViewModel.mediasToSend) + .environmentObject(conversationViewModel) .edgesIgnoringSafeArea(.all) } .background(Color.gray100.ignoresSafeArea(.keyboard)) @@ -156,7 +154,8 @@ struct ConversationFragment: View { conversationViewModel.removeConversationDelegate() } .halfSheet(showSheet: $conversationViewModel.isShowSelectedMessageToDisplayDetails) { - ImdnOrReactionsSheet(conversationViewModel: conversationViewModel, selectedCategoryIndex: $selectedCategoryIndex) + ImdnOrReactionsSheet(selectedCategoryIndex: $selectedCategoryIndex) + .environmentObject(conversationViewModel) } onDismiss: { conversationViewModel.isShowSelectedMessageToDisplayDetails = false } @@ -179,7 +178,8 @@ struct ConversationFragment: View { .edgesIgnoringSafeArea(.all) }) .fullScreenCover(isPresented: $isShowCamera) { - ImagePicker(conversationViewModel: conversationViewModel, selectedMedia: self.$conversationViewModel.mediasToSend) + ImagePicker(selectedMedia: self.$conversationViewModel.mediasToSend) + .environmentObject(conversationViewModel) } .background(Color.gray100.ignoresSafeArea(.keyboard)) } @@ -193,6 +193,11 @@ struct ConversationFragment: View { } } .navigationViewStyle(.stack) + .onAppear { + if let conv = SharedMainViewModel.shared.displayedConversation { + cachedConversation = conv + } + } } // swiftlint:disable cyclomatic_complexity @@ -201,7 +206,7 @@ struct ConversationFragment: View { func innerView(geometry: GeometryProxy) -> some View { ZStack { VStack(spacing: 1) { - if SharedMainViewModel.shared.displayedConversation != nil { + if SharedMainViewModel.shared.displayedConversation != nil || cachedConversation != nil { Rectangle() .foregroundColor(Color.orangeMain500) .edgesIgnoringSafeArea(.top) @@ -228,11 +233,11 @@ struct ConversationFragment: View { } } - Avatar(contactAvatarModel: SharedMainViewModel.shared.displayedConversation!.avatarModel, avatarSize: 50) + Avatar(contactAvatarModel: SharedMainViewModel.shared.displayedConversation?.avatarModel ?? cachedConversation!.avatarModel, avatarSize: 50) .padding(.top, 4) VStack(spacing: 1) { - Text(SharedMainViewModel.shared.displayedConversation!.subject) + Text(SharedMainViewModel.shared.displayedConversation?.subject ?? cachedConversation!.subject) .default_text_style(styleSize: 16) .frame(maxWidth: .infinity, alignment: .leading) .padding(.top, 4) @@ -276,7 +281,7 @@ struct ConversationFragment: View { Spacer() - if !SharedMainViewModel.shared.displayedConversation!.isReadOnly { + if !(SharedMainViewModel.shared.displayedConversation?.isReadOnly ?? cachedConversation!.isReadOnly) { Button { if SharedMainViewModel.shared.displayedConversation!.isGroup { isShowStartCallGroupPopup.toggle() @@ -313,7 +318,7 @@ struct ConversationFragment: View { } } - if !SharedMainViewModel.shared.displayedConversation!.isReadOnly { + if !(SharedMainViewModel.shared.displayedConversation?.isReadOnly ?? cachedConversation!.isReadOnly) { Button { isMenuOpen = false SharedMainViewModel.shared.displayedConversation!.toggleMute() @@ -375,13 +380,11 @@ struct ConversationFragment: View { if #available(iOS 16.0, *) { ZStack(alignment: .bottomTrailing) { UIList( - viewModel: viewModel, - paginationState: paginationState, - conversationViewModel: conversationViewModel, - conversationsListViewModel: conversationsListViewModel, geometryProxy: geometry, sections: conversationViewModel.conversationMessagesSection ) + .environmentObject(conversationViewModel) + .environmentObject(conversationsListViewModel) } /* .onAppear { @@ -398,7 +401,8 @@ struct ConversationFragment: View { if conversationViewModel.conversationMessagesSection.first != nil { let counter = conversationViewModel.conversationMessagesSection.first!.rows.count ForEach(0..