mirror of
https://gitlab.linphone.org/BC/public/linphone-iphone.git
synced 2026-04-17 20:08:31 +00:00
Replace chatMessageSuscriptions with delegates in ConversationViewModel
This commit is contained in:
parent
6034d41a10
commit
e380431767
1 changed files with 40 additions and 24 deletions
|
|
@ -19,13 +19,13 @@
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
import linphonesw
|
import linphonesw
|
||||||
import Combine
|
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
import AVFoundation
|
import AVFoundation
|
||||||
|
|
||||||
// swiftlint:disable line_length
|
// swiftlint:disable line_length
|
||||||
// swiftlint:disable type_body_length
|
// swiftlint:disable type_body_length
|
||||||
// swiftlint:disable cyclomatic_complexity
|
// swiftlint:disable cyclomatic_complexity
|
||||||
|
|
||||||
class ConversationViewModel: ObservableObject {
|
class ConversationViewModel: ObservableObject {
|
||||||
|
|
||||||
private var coreContext = CoreContext.shared
|
private var coreContext = CoreContext.shared
|
||||||
|
|
@ -37,7 +37,25 @@ class ConversationViewModel: ObservableObject {
|
||||||
@Published var messageText: String = ""
|
@Published var messageText: String = ""
|
||||||
|
|
||||||
private var chatRoomDelegate: ChatRoomDelegate?
|
private var chatRoomDelegate: ChatRoomDelegate?
|
||||||
private var chatMessageSuscriptions = Set<AnyCancellable?>()
|
|
||||||
|
// Used to keep track of a ChatMessage callback without having to worry about life cycle
|
||||||
|
// Init will add the delegate, deinit will remove it
|
||||||
|
class ChatMessageDelegateHolder {
|
||||||
|
var chatMessage: ChatMessage
|
||||||
|
var chatMessageDelegate: ChatMessageDelegate
|
||||||
|
|
||||||
|
init (message: ChatMessage, delegate: ChatMessageDelegate) {
|
||||||
|
message.addDelegate(delegate: delegate)
|
||||||
|
chatMessage = message
|
||||||
|
chatMessageDelegate = delegate
|
||||||
|
}
|
||||||
|
|
||||||
|
deinit {
|
||||||
|
chatMessage.removeDelegate(delegate: chatMessageDelegate)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private var chatMessageDelegateHolders: [ChatMessageDelegateHolder] = []
|
||||||
|
|
||||||
@Published var conversationMessagesSection: [MessagesSection] = []
|
@Published var conversationMessagesSection: [MessagesSection] = []
|
||||||
@Published var participantConversationModel: [ContactAvatarModel] = []
|
@Published var participantConversationModel: [ContactAvatarModel] = []
|
||||||
|
|
@ -118,9 +136,9 @@ class ConversationViewModel: ObservableObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
self.coreContext.doOnCoreQueue { _ in
|
self.coreContext.doOnCoreQueue { _ in
|
||||||
self.chatMessageSuscriptions.insert(message.publisher?.onMsgStateChanged?.postOnCoreQueue {(cbValue: (message: ChatMessage, state: ChatMessage.State)) in
|
let chatMessageDelegate = ChatMessageDelegateStub(onMsgStateChanged: { (message: ChatMessage, _: ChatMessage.State) in
|
||||||
var statusTmp: Message.Status? = .sending
|
var statusTmp: Message.Status? = .sending
|
||||||
switch cbValue.message.state {
|
switch message.state {
|
||||||
case .InProgress:
|
case .InProgress:
|
||||||
statusTmp = .sending
|
statusTmp = .sending
|
||||||
case .Delivered:
|
case .Delivered:
|
||||||
|
|
@ -143,27 +161,23 @@ class ConversationViewModel: ObservableObject {
|
||||||
self.conversationMessagesSection[0].rows[indexMessage!].message.status = statusTmp
|
self.conversationMessagesSection[0].rows[indexMessage!].message.status = statusTmp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
}, onNewMessageReaction: { (message: ChatMessage, _: ChatMessageReaction) in
|
||||||
|
|
||||||
self.chatMessageSuscriptions.insert(message.publisher?.onNewMessageReaction?.postOnCoreQueue {(cbValue: (message: ChatMessage, reaction: ChatMessageReaction)) in
|
|
||||||
let indexMessage = self.conversationMessagesSection[0].rows.firstIndex(where: {$0.eventLog.chatMessage?.messageId == message.messageId})
|
let indexMessage = self.conversationMessagesSection[0].rows.firstIndex(where: {$0.eventLog.chatMessage?.messageId == message.messageId})
|
||||||
var reactionsTmp: [String] = []
|
var reactionsTmp: [String] = []
|
||||||
cbValue.message.reactions.forEach({ chatMessageReaction in
|
message.reactions.forEach({ chatMessageReaction in
|
||||||
reactionsTmp.append(chatMessageReaction.body)
|
reactionsTmp.append(chatMessageReaction.body)
|
||||||
})
|
})
|
||||||
|
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
if indexMessage != nil {
|
if indexMessage != nil {
|
||||||
self.objectWillChange.send()
|
self.objectWillChange.send()
|
||||||
self.conversationMessagesSection[0].rows[indexMessage!].message.reactions = reactionsTmp
|
self.conversationMessagesSection[0].rows[indexMessage!].message.reactions = reactionsTmp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
}, onReactionRemoved: { (message: ChatMessage, _: Address) in
|
||||||
|
let indexMessage = self.conversationMessagesSection[0].rows.firstIndex(where: {$0.eventLog.chatMessage?.messageId == message.messageId})
|
||||||
self.chatMessageSuscriptions.insert(message.publisher?.onReactionRemoved?.postOnCoreQueue {(cbValue: (message: ChatMessage, address: Address)) in
|
var reactionsTmp: [String] = []
|
||||||
let indexMessage = self.conversationMessagesSection[0].rows.firstIndex(where: {$0.eventLog.chatMessage?.messageId == message.messageId})
|
message.reactions.forEach({ chatMessageReaction in
|
||||||
var reactionsTmp: [String] = []
|
|
||||||
cbValue.message.reactions.forEach({ chatMessageReaction in
|
|
||||||
reactionsTmp.append(chatMessageReaction.body)
|
reactionsTmp.append(chatMessageReaction.body)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -174,6 +188,8 @@ class ConversationViewModel: ObservableObject {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
message.addDelegate(delegate: chatMessageDelegate)
|
||||||
|
self.chatMessageDelegateHolders.append(ChatMessageDelegateHolder(message: message, delegate: chatMessageDelegate))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -184,7 +200,7 @@ class ConversationViewModel: ObservableObject {
|
||||||
self.displayedConversation?.chatRoom.removeDelegate(delegate: crDelegate)
|
self.displayedConversation?.chatRoom.removeDelegate(delegate: crDelegate)
|
||||||
}
|
}
|
||||||
self.chatRoomDelegate = nil
|
self.chatRoomDelegate = nil
|
||||||
self.chatMessageSuscriptions.removeAll()
|
self.chatMessageDelegateHolders.removeAll()
|
||||||
}
|
}
|
||||||
|
|
||||||
func getHistorySize() {
|
func getHistorySize() {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue