Fix displayed chat room reset

This commit is contained in:
Benoit Martins 2025-02-04 17:47:02 +01:00
parent 4641ef680c
commit ad54e09253
6 changed files with 72 additions and 35 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

@ -190,20 +190,13 @@ struct ConversationRow: View {
.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
@ -1744,31 +1784,33 @@ class ConversationViewModel: ObservableObject {
self.getMessages()
}
func resetDisplayedChatRoom(conversationsList: [ConversationModel]) {
func resetDisplayedChatRoom() { //(conversationsList: [ConversationModel]) {
/*
guard !conversationsList.isEmpty else {
Log.info("\(ConversationViewModel.TAG) The conversation list is empty.")
return
}
*/
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)
}
}
//conversationsList.forEach { conversation in
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)
}
}
}
}