Replace chatMessageSuscriptions with delegates in ConversationViewModel

This commit is contained in:
QuentinArguillere 2024-09-27 10:42:46 +02:00
parent 6034d41a10
commit e380431767

View file

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