Refactored ConversationsView

This commit is contained in:
Benoit Martins 2025-06-13 11:56:42 +02:00 committed by MARTINS Benoît
parent 44f8ee4ae1
commit dcd80e14bc
8 changed files with 333 additions and 312 deletions

View file

@ -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()
}
}
}
}

View file

@ -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("")
)

View file

@ -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(""))
}

View file

@ -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))
}

View file

@ -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("")
)

View file

@ -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 {

View file

@ -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)

View file

@ -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