Fix updateUIView crash when get old messages in ConversationViewModel

This commit is contained in:
Benoit Martins 2024-08-12 17:33:38 +02:00
parent 5c82815644
commit f5c074e0bc

View file

@ -62,65 +62,64 @@ class ConversationViewModel: ObservableObject {
} }
func addChatMessageDelegate(message: ChatMessage) { func addChatMessageDelegate(message: ChatMessage) {
coreContext.doOnCoreQueue { _ in DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
if self.displayedConversation != nil { if self.displayedConversation != nil {
/* self.coreContext.doOnCoreQueue { _ in
self.chatMessageSuscriptions.insert(message.publisher?.onMsgStateChanged?.postOnCoreQueue {(cbValue: (message: ChatMessage, state: ChatMessage.State)) in self.chatMessageSuscriptions.insert(message.publisher?.onMsgStateChanged?.postOnCoreQueue {(cbValue: (message: ChatMessage, state: ChatMessage.State)) in
var statusTmp: Message.Status? = .sending var statusTmp: Message.Status? = .sending
switch cbValue.message.state { switch cbValue.message.state {
case .InProgress: case .InProgress:
statusTmp = .sending statusTmp = .sending
case .Delivered: case .Delivered:
statusTmp = .sent statusTmp = .sent
case .DeliveredToUser: case .DeliveredToUser:
statusTmp = .received statusTmp = .received
case .Displayed: case .Displayed:
statusTmp = .read statusTmp = .read
default: default:
statusTmp = nil statusTmp = nil
} }
let indexMessage = self.conversationMessagesSection[0].rows.firstIndex(where: {$0.id == message.messageId}) let indexMessage = self.conversationMessagesSection[0].rows.firstIndex(where: {$0.id == message.messageId})
DispatchQueue.main.async { DispatchQueue.main.async {
if indexMessage != nil { if indexMessage != nil {
self.objectWillChange.send() self.objectWillChange.send()
self.conversationMessagesSection[0].rows[indexMessage!].status = statusTmp self.conversationMessagesSection[0].rows[indexMessage!].status = statusTmp
}
} }
}
})
*/
self.chatMessageSuscriptions.insert(message.publisher?.onNewMessageReaction?.postOnCoreQueue {(cbValue: (message: ChatMessage, reaction: ChatMessageReaction)) in
let indexMessage = self.conversationMessagesSection[0].rows.firstIndex(where: {$0.id == message.messageId})
var reactionsTmp: [String] = []
cbValue.message.reactions.forEach({ chatMessageReaction in
reactionsTmp.append(chatMessageReaction.body)
}) })
DispatchQueue.main.async { self.chatMessageSuscriptions.insert(message.publisher?.onNewMessageReaction?.postOnCoreQueue {(cbValue: (message: ChatMessage, reaction: ChatMessageReaction)) in
if indexMessage != nil { let indexMessage = self.conversationMessagesSection[0].rows.firstIndex(where: {$0.id == message.messageId})
self.objectWillChange.send() var reactionsTmp: [String] = []
self.conversationMessagesSection[0].rows[indexMessage!].reactions = reactionsTmp cbValue.message.reactions.forEach({ chatMessageReaction in
reactionsTmp.append(chatMessageReaction.body)
})
DispatchQueue.main.async {
if indexMessage != nil {
self.objectWillChange.send()
self.conversationMessagesSection[0].rows[indexMessage!].reactions = reactionsTmp
}
} }
}
})
self.chatMessageSuscriptions.insert(message.publisher?.onReactionRemoved?.postOnCoreQueue {(cbValue: (message: ChatMessage, address: Address)) in
let indexMessage = self.conversationMessagesSection[0].rows.firstIndex(where: {$0.id == message.messageId})
var reactionsTmp: [String] = []
cbValue.message.reactions.forEach({ chatMessageReaction in
reactionsTmp.append(chatMessageReaction.body)
}) })
DispatchQueue.main.async { self.chatMessageSuscriptions.insert(message.publisher?.onReactionRemoved?.postOnCoreQueue {(cbValue: (message: ChatMessage, address: Address)) in
if indexMessage != nil { let indexMessage = self.conversationMessagesSection[0].rows.firstIndex(where: {$0.id == message.messageId})
self.objectWillChange.send() var reactionsTmp: [String] = []
self.conversationMessagesSection[0].rows[indexMessage!].reactions = reactionsTmp cbValue.message.reactions.forEach({ chatMessageReaction in
reactionsTmp.append(chatMessageReaction.body)
})
DispatchQueue.main.async {
if indexMessage != nil {
self.objectWillChange.send()
self.conversationMessagesSection[0].rows[indexMessage!].reactions = reactionsTmp
}
} }
} })
}) }
} }
} }
} }
@ -312,7 +311,7 @@ class ConversationViewModel: ObservableObject {
func getOldMessages() { func getOldMessages() {
coreContext.doOnCoreQueue { _ in coreContext.doOnCoreQueue { _ in
if self.displayedConversation != nil { if self.displayedConversation != nil && self.displayedConversationHistorySize > self.conversationMessagesSection[0].rows.count{
let historyEvents = self.displayedConversation!.chatRoom.getHistoryRangeEvents(begin: self.conversationMessagesSection[0].rows.count, end: self.conversationMessagesSection[0].rows.count + 30) let historyEvents = self.displayedConversation!.chatRoom.getHistoryRangeEvents(begin: self.conversationMessagesSection[0].rows.count, end: self.conversationMessagesSection[0].rows.count + 30)
var conversationMessagesTmp: [Message] = [] var conversationMessagesTmp: [Message] = []