Fix displayed chat room reset

This commit is contained in:
benoit.martins 2025-02-04 17:47:02 +01:00
parent 4641ef680c
commit 0bc9aa977c
7 changed files with 89 additions and 57 deletions

View file

@ -42,7 +42,6 @@ final class CoreContext: ObservableObject {
@Published var loggingInProgress: Bool = false
@Published var coreIsStarted: Bool = false
@Published var accounts: [AccountModel] = []
@Published var enteredForeground = false
@Published var shortcuts: [ShortcutModel] = []
private var mCore: Core!
private var mIterateSuscription: AnyCancellable?

View file

@ -1378,7 +1378,6 @@ struct ContentView: View {
orientation = newOrientation
}
.onChange(of: scenePhase) { newPhase in
CoreContext.shared.enteredForeground = newPhase == .active
orientation = UIDevice.current.orientation
if newPhase == .active {
conversationsListViewModel.computeChatRoomsList(filter: "")

View file

@ -374,10 +374,8 @@ struct ChatBubbleView: View {
}
}
.onTapGesture {
if !CoreContext.shared.enteredForeground {
conversationViewModel.selectedMessageToDisplayDetails = eventLogMessage
conversationViewModel.prepareBottomSheetForDeliveryStatus()
}
conversationViewModel.selectedMessageToDisplayDetails = eventLogMessage
conversationViewModel.prepareBottomSheetForDeliveryStatus()
}
.disabled(conversationViewModel.selectedMessage != nil)
.padding(.top, -4)

View file

@ -24,6 +24,7 @@ import UniformTypeIdentifiers
// swiftlint:disable type_body_length
struct ConversationFragment: View {
@Environment(\.scenePhase) var scenePhase
@State private var orientation = UIDevice.current.orientation
private var idiom: UIUserInterfaceIdiom { UIDevice.current.userInterfaceIdiom }
@ -162,6 +163,11 @@ struct ConversationFragment: View {
.background(Color.gray100.ignoresSafeArea(.keyboard))
}
}
.onChange(of: scenePhase) { newPhase in
if newPhase == .active {
conversationViewModel.resetDisplayedChatRoom()
}
}
}
.navigationViewStyle(.stack)
}
@ -662,7 +668,7 @@ struct ConversationFragment: View {
.focused($isMessageTextFocused)
.padding(.vertical, 5)
.onChange(of: conversationViewModel.messageText) { text in
if !text.isEmpty && !CoreContext.shared.enteredForeground {
if !text.isEmpty {
conversationViewModel.compose()
}
}
@ -675,7 +681,7 @@ struct ConversationFragment: View {
.default_text_style(styleSize: 15)
.focused($isMessageTextFocused)
.onChange(of: conversationViewModel.messageText) { text in
if !text.isEmpty && !CoreContext.shared.enteredForeground {
if !text.isEmpty {
conversationViewModel.compose()
}
}

View file

@ -71,6 +71,14 @@ struct ConversationsListFragment: View {
}
.navigationTitle("")
.navigationBarHidden(true)
.onChange(of: scenePhase) { newPhase in
if newPhase == .active {
if navigationManager.peerAddr != nil {
conversationViewModel.getChatRoomWithStringAddress(conversationsList: conversationsListViewModel.conversationsList, stringAddr: navigationManager.peerAddr!)
navigationManager.peerAddr = nil
}
}
}
}
}
@ -85,8 +93,6 @@ struct ConversationRow: View {
@Binding var text: String
var body: some View {
let pub = NotificationCenter.default
.publisher(for: NSNotification.Name("ChatRoomsComputed"))
HStack {
Avatar(contactAvatarModel: conversation.avatarModel, avatarSize: 50)
@ -189,22 +195,6 @@ struct ConversationRow: View {
.listRowInsets(EdgeInsets(top: 6, leading: 20, bottom: 6, trailing: 20))
.listRowSeparator(.hidden)
.background(.white)
.onReceive(pub) { _ in
if CoreContext.shared.enteredForeground && conversationViewModel.displayedConversation != nil
&& (navigationManager.peerAddr == nil || navigationManager.peerAddr == conversationViewModel.displayedConversation!.remoteSipUri) {
if conversationViewModel.displayedConversation != nil {
conversationViewModel.resetDisplayedChatRoom(conversationsList: conversationsListViewModel.conversationsList)
}
}
CoreContext.shared.enteredForeground = false
if navigationManager.peerAddr != nil
&& conversation.remoteSipUri.contains(navigationManager.peerAddr!) {
conversationViewModel.getChatRoomWithStringAddress(conversationsList: conversationsListViewModel.conversationsList, stringAddr: navigationManager.peerAddr!)
navigationManager.peerAddr = nil
}
}
.onTapGesture {
conversationViewModel.changeDisplayedChatRoom(conversationModel: conversation)
}

View file

@ -165,6 +165,46 @@ class ConversationViewModel: ObservableObject {
}
}
func addConversationDelegate(chatRoom: ChatRoom) {
let chatRoomDelegate = ChatRoomDelegateStub( onIsComposingReceived: { (_: ChatRoom, _: Address, _: Bool) in
self.computeComposingLabel()
}, onChatMessagesReceived: { (_: ChatRoom, eventLogs: [EventLog]) in
self.getNewMessages(eventLogs: eventLogs)
}, onChatMessageSending: { (_: ChatRoom, eventLog: EventLog) in
self.getNewMessages(eventLogs: [eventLog])
}, onParticipantAdded: { (_: ChatRoom, eventLogs: EventLog) in
self.getNewMessages(eventLogs: [eventLogs])
self.getParticipantConversationModel()
}, onParticipantRemoved: { (_: ChatRoom, eventLogs: EventLog) in
self.getNewMessages(eventLogs: [eventLogs])
self.getParticipantConversationModel()
}, onParticipantAdminStatusChanged: { (_: ChatRoom, eventLogs: EventLog) in
self.getNewMessages(eventLogs: [eventLogs])
self.getParticipantConversationModel()
}, onSubjectChanged: { (_: ChatRoom, eventLogs: EventLog) in
self.getNewMessages(eventLogs: [eventLogs])
}, onConferenceJoined: {(_: ChatRoom, eventLog: EventLog) in
self.getNewMessages(eventLogs: [eventLog])
if self.displayedConversation != nil {
DispatchQueue.main.async {
self.displayedConversation!.isReadOnly = false
}
}
}, onConferenceLeft: {(_: ChatRoom, eventLog: EventLog) in
self.getNewMessages(eventLogs: [eventLog])
if self.displayedConversation != nil {
DispatchQueue.main.async {
self.displayedConversation!.isReadOnly = true
}
}
}, onEphemeralEvent: {(_: ChatRoom, eventLogs: EventLog) in
self.getNewMessages(eventLogs: [eventLogs])
}, onEphemeralMessageDeleted: {(_: ChatRoom, eventLog: EventLog) in
self.removeMessage(eventLog)
})
self.chatRoomDelegateHolder = ChatRoomDelegateHolder(chatroom: chatRoom, delegate: chatRoomDelegate)
}
func addChatMessageDelegate(message: ChatMessage) {
if self.displayedConversation != nil {
var statusTmp: Message.Status? = .sending
@ -1740,35 +1780,37 @@ class ConversationViewModel: ObservableObject {
withAnimation {
self.displayedConversation = conversationModel
}
self.addConversationDelegate()
CoreContext.shared.doOnCoreQueue { core in
let nilParams: ConferenceParams? = nil
if let newChatRoom = core.searchChatRoom(params: nilParams, localAddr: nil, remoteAddr: conversationModel.chatRoom.peerAddress, participants: nil) {
self.addConversationDelegate(chatRoom: newChatRoom)
}
}
self.getMessages()
}
func resetDisplayedChatRoom(conversationsList: [ConversationModel]) {
guard !conversationsList.isEmpty else {
Log.info("\(ConversationViewModel.TAG) The conversation list is empty.")
return
}
func resetDisplayedChatRoom() {
if !self.conversationMessagesSection.isEmpty && !self.conversationMessagesSection[0].rows.isEmpty {
if let displayedConversation = self.displayedConversation {
conversationsList.forEach { conversation in
if conversation.id == displayedConversation.id {
self.displayedConversation = conversation
self.computeComposingLabel()
if let updatedDisplayedConversation = self.displayedConversation {
CoreContext.shared.doOnCoreQueue { _ in
let historyEventsSizeTmp = updatedDisplayedConversation.chatRoom.historyEventsSize
if self.displayedConversationHistorySize < historyEventsSizeTmp {
let eventLogList = updatedDisplayedConversation.chatRoom.getHistoryRangeEvents(begin: 0, end: historyEventsSizeTmp - self.displayedConversationHistorySize)
if !eventLogList.isEmpty {
self.getNewMessages(eventLogs: eventLogList)
}
}
CoreContext.shared.doOnCoreQueue { core in
let nilParams: ConferenceParams? = nil
if let newChatRoom = core.searchChatRoom(params: nilParams, localAddr: nil, remoteAddr: displayedConversation.chatRoom.peerAddress, participants: nil) {
if LinphoneUtils.getChatRoomId(room: newChatRoom) == displayedConversation.id {
self.addConversationDelegate(chatRoom: newChatRoom)
let conversation = ConversationModel(chatRoom: newChatRoom)
DispatchQueue.main.async {
self.displayedConversation = conversation
}
self.computeComposingLabel()
let historyEventsSizeTmp = newChatRoom.historyEventsSize
if self.displayedConversationHistorySize < historyEventsSizeTmp {
let eventLogList = newChatRoom.getHistoryRangeEvents(begin: 0, end: historyEventsSizeTmp - self.displayedConversationHistorySize)
self.addConversationDelegate()
if !eventLogList.isEmpty {
self.getNewMessages(eventLogs: eventLogList)
}
}
}
}

View file

@ -61,11 +61,6 @@ class ConversationsListViewModel: ObservableObject {
}
}
DispatchQueue.main.async {
//self.conversationsList = self.conversationsListTmp
NotificationCenter.default.post(name: NSNotification.Name("ChatRoomsComputed"), object: nil)
}
self.updateUnreadMessagesCount()
}
}
@ -132,7 +127,8 @@ class ConversationsListViewModel: ObservableObject {
coreContext.doOnCoreQueue { core in
self.coreConversationDelegate = CoreDelegateStub(onMessagesReceived: { (_: Core, chatRoom: ChatRoom, _: [ChatMessage]) in
let model = ConversationModel(chatRoom: chatRoom)
let index = self.conversationsList.firstIndex(where: { $0.chatRoom === chatRoom })
let idTmp = LinphoneUtils.getChatRoomId(room: chatRoom)
let index = self.conversationsList.firstIndex(where: { $0.id == idTmp })
DispatchQueue.main.async {
if index != nil {
self.conversationsList.remove(at: index!)
@ -142,7 +138,8 @@ class ConversationsListViewModel: ObservableObject {
self.updateUnreadMessagesCount()
}, onMessageSent: { (_: Core, chatRoom: ChatRoom, _: ChatMessage) in
let model = ConversationModel(chatRoom: chatRoom)
let index = self.conversationsList.firstIndex(where: { $0.chatRoom === chatRoom })
let idTmp = LinphoneUtils.getChatRoomId(room: chatRoom)
let index = self.conversationsList.firstIndex(where: { $0.id == idTmp })
DispatchQueue.main.async {
if index != nil {
self.conversationsList.remove(at: index!)
@ -152,7 +149,8 @@ class ConversationsListViewModel: ObservableObject {
self.updateUnreadMessagesCount()
}, onChatRoomRead: { (_: Core, chatRoom: ChatRoom) in
let model = ConversationModel(chatRoom: chatRoom)
let index = self.conversationsList.firstIndex(where: { $0.chatRoom === chatRoom })
let idTmp = LinphoneUtils.getChatRoomId(room: chatRoom)
let index = self.conversationsList.firstIndex(where: { $0.id == idTmp })
DispatchQueue.main.async {
if index != nil {
self.conversationsList.remove(at: index!)