forked from mirrors/linphone-iphone
Fix displayed chat room reset
This commit is contained in:
parent
4641ef680c
commit
0bc9aa977c
7 changed files with 89 additions and 57 deletions
|
|
@ -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?
|
||||
|
|
|
|||
|
|
@ -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: "")
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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!)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue