mirror of
https://gitlab.linphone.org/BC/public/linphone-iphone.git
synced 2026-01-17 11:08:06 +00:00
Add conditions to ensure eventLog.chatMessage is not nil to prevent potential crashes
This commit is contained in:
parent
ac4ea27a78
commit
0c573e6e5c
1 changed files with 169 additions and 265 deletions
|
|
@ -569,13 +569,15 @@ class ConversationViewModel: ObservableObject {
|
||||||
var attachmentList: [Attachment] = []
|
var attachmentList: [Attachment] = []
|
||||||
var contentText = ""
|
var contentText = ""
|
||||||
|
|
||||||
if eventLog.chatMessage != nil && !eventLog.chatMessage!.contents.isEmpty {
|
guard let chatMessage = eventLog.chatMessage else { return }
|
||||||
eventLog.chatMessage!.contents.forEach { content in
|
|
||||||
|
if !chatMessage.contents.isEmpty {
|
||||||
|
chatMessage.contents.forEach { content in
|
||||||
if content.isText && content.name == nil {
|
if content.isText && content.name == nil {
|
||||||
contentText = content.utf8Text ?? ""
|
contentText = content.utf8Text ?? ""
|
||||||
} else if content.name != nil && !content.name!.isEmpty {
|
} else if content.name != nil && !content.name!.isEmpty {
|
||||||
if content.filePath == nil || content.filePath!.isEmpty {
|
if content.filePath == nil || content.filePath!.isEmpty {
|
||||||
// self.downloadContent(chatMessage: eventLog.chatMessage!, content: content)
|
// self.downloadContent(chatMessage: chatMessage, content: content)
|
||||||
let path = URL(string: self.getNewFilePath(name: content.name ?? ""))
|
let path = URL(string: self.getNewFilePath(name: content.name ?? ""))
|
||||||
|
|
||||||
if path != nil {
|
if path != nil {
|
||||||
|
|
@ -662,13 +664,13 @@ class ConversationViewModel: ObservableObject {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let addressPrecCleaned = index > 0 ? historyEvents[index - 1].chatMessage?.fromAddress?.clone() : eventLog.chatMessage?.fromAddress?.clone()
|
let addressPrecCleaned = index > 0 ? historyEvents[index - 1].chatMessage?.fromAddress?.clone() : chatMessage.fromAddress?.clone()
|
||||||
addressPrecCleaned?.clean()
|
addressPrecCleaned?.clean()
|
||||||
|
|
||||||
let addressNextCleaned = index <= historyEvents.count - 2 ? historyEvents[index + 1].chatMessage?.fromAddress?.clone() : eventLog.chatMessage?.fromAddress?.clone()
|
let addressNextCleaned = index <= historyEvents.count - 2 ? historyEvents[index + 1].chatMessage?.fromAddress?.clone() : chatMessage.fromAddress?.clone()
|
||||||
addressNextCleaned?.clean()
|
addressNextCleaned?.clean()
|
||||||
|
|
||||||
let addressCleaned = eventLog.chatMessage?.fromAddress?.clone()
|
let addressCleaned = chatMessage.fromAddress?.clone()
|
||||||
addressCleaned?.clean()
|
addressCleaned?.clean()
|
||||||
|
|
||||||
if addressCleaned != nil && self.participantConversationModel.first(where: {$0.address == addressCleaned!.asStringUriOnly()}) == nil {
|
if addressCleaned != nil && self.participantConversationModel.first(where: {$0.address == addressCleaned!.asStringUriOnly()}) == nil {
|
||||||
|
|
@ -678,10 +680,10 @@ class ConversationViewModel: ObservableObject {
|
||||||
let isFirstMessageIncomingTmp = index > 0 ? addressPrecCleaned?.asStringUriOnly() != addressCleaned?.asStringUriOnly() : true
|
let isFirstMessageIncomingTmp = index > 0 ? addressPrecCleaned?.asStringUriOnly() != addressCleaned?.asStringUriOnly() : true
|
||||||
let isFirstMessageOutgoingTmp = index <= historyEvents.count - 2 ? addressNextCleaned?.asStringUriOnly() != addressCleaned?.asStringUriOnly() : true
|
let isFirstMessageOutgoingTmp = index <= historyEvents.count - 2 ? addressNextCleaned?.asStringUriOnly() != addressCleaned?.asStringUriOnly() : true
|
||||||
|
|
||||||
let isFirstMessageTmp = (eventLog.chatMessage?.isOutgoing ?? false) ? isFirstMessageOutgoingTmp : isFirstMessageIncomingTmp
|
let isFirstMessageTmp = chatMessage.isOutgoing ? isFirstMessageOutgoingTmp : isFirstMessageIncomingTmp
|
||||||
|
|
||||||
var statusTmp: Message.Status? = .sending
|
var statusTmp: Message.Status? = .sending
|
||||||
switch eventLog.chatMessage?.state {
|
switch chatMessage.state {
|
||||||
case .InProgress:
|
case .InProgress:
|
||||||
statusTmp = .sending
|
statusTmp = .sending
|
||||||
case .Delivered:
|
case .Delivered:
|
||||||
|
|
@ -697,7 +699,7 @@ class ConversationViewModel: ObservableObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
var reactionsTmp: [String] = []
|
var reactionsTmp: [String] = []
|
||||||
eventLog.chatMessage?.reactions.forEach({ chatMessageReaction in
|
chatMessage.reactions.forEach({ chatMessageReaction in
|
||||||
reactionsTmp.append(chatMessageReaction.body)
|
reactionsTmp.append(chatMessageReaction.body)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -706,19 +708,19 @@ class ConversationViewModel: ObservableObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
var replyMessageTmp: ReplyMessage?
|
var replyMessageTmp: ReplyMessage?
|
||||||
if eventLog.chatMessage?.replyMessage != nil {
|
if chatMessage.replyMessage != nil {
|
||||||
let addressReplyCleaned = eventLog.chatMessage?.replyMessage?.fromAddress?.clone()
|
let addressReplyCleaned = chatMessage.replyMessage?.fromAddress?.clone()
|
||||||
addressReplyCleaned?.clean()
|
addressReplyCleaned?.clean()
|
||||||
|
|
||||||
if addressReplyCleaned != nil && self.participantConversationModel.first(where: {$0.address == addressReplyCleaned!.asStringUriOnly()}) == nil {
|
if addressReplyCleaned != nil && self.participantConversationModel.first(where: {$0.address == addressReplyCleaned!.asStringUriOnly()}) == nil {
|
||||||
self.addParticipantConversationModel(address: addressReplyCleaned!)
|
self.addParticipantConversationModel(address: addressReplyCleaned!)
|
||||||
}
|
}
|
||||||
|
|
||||||
let contentReplyText = eventLog.chatMessage?.replyMessage?.utf8Text ?? ""
|
let contentReplyText = chatMessage.replyMessage?.utf8Text ?? ""
|
||||||
|
|
||||||
var attachmentNameReplyList: String = ""
|
var attachmentNameReplyList: String = ""
|
||||||
|
|
||||||
eventLog.chatMessage?.replyMessage?.contents.forEach { content in
|
chatMessage.replyMessage?.contents.forEach { content in
|
||||||
if !content.isText {
|
if !content.isText {
|
||||||
attachmentNameReplyList += ", \(content.name!)"
|
attachmentNameReplyList += ", \(content.name!)"
|
||||||
}
|
}
|
||||||
|
|
@ -729,7 +731,7 @@ class ConversationViewModel: ObservableObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
replyMessageTmp = ReplyMessage(
|
replyMessageTmp = ReplyMessage(
|
||||||
id: eventLog.chatMessage?.replyMessage!.messageId ?? UUID().uuidString,
|
id: chatMessage.replyMessage!.messageId,
|
||||||
address: addressReplyCleaned?.asStringUriOnly() ?? "",
|
address: addressReplyCleaned?.asStringUriOnly() ?? "",
|
||||||
isFirstMessage: false,
|
isFirstMessage: false,
|
||||||
text: contentReplyText,
|
text: contentReplyText,
|
||||||
|
|
@ -740,53 +742,33 @@ class ConversationViewModel: ObservableObject {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if eventLog.chatMessage != nil {
|
conversationMessage.append(
|
||||||
conversationMessage.append(
|
EventLogMessage(
|
||||||
EventLogMessage(
|
eventModel: EventModel(eventLog: eventLog),
|
||||||
eventModel: EventModel(eventLog: eventLog),
|
message: Message(
|
||||||
message: Message(
|
id: !chatMessage.messageId.isEmpty ? chatMessage.messageId : UUID().uuidString,
|
||||||
id: !eventLog.chatMessage!.messageId.isEmpty ? eventLog.chatMessage!.messageId : UUID().uuidString,
|
status: statusTmp,
|
||||||
status: statusTmp,
|
isOutgoing: chatMessage.isOutgoing,
|
||||||
isOutgoing: eventLog.chatMessage?.isOutgoing ?? false,
|
dateReceived: chatMessage.time,
|
||||||
dateReceived: eventLog.chatMessage?.time ?? 0,
|
address: addressCleaned?.asStringUriOnly() ?? "",
|
||||||
address: addressCleaned?.asStringUriOnly() ?? "",
|
isFirstMessage: isFirstMessageTmp,
|
||||||
isFirstMessage: isFirstMessageTmp,
|
text: contentText,
|
||||||
text: contentText,
|
attachmentsNames: attachmentNameList,
|
||||||
attachmentsNames: attachmentNameList,
|
attachments: attachmentList,
|
||||||
attachments: attachmentList,
|
replyMessage: replyMessageTmp,
|
||||||
replyMessage: replyMessageTmp,
|
isForward: chatMessage.isForward,
|
||||||
isForward: eventLog.chatMessage?.isForward ?? false,
|
ownReaction: chatMessage.ownReaction?.body ?? "",
|
||||||
ownReaction: eventLog.chatMessage?.ownReaction?.body ?? "",
|
reactions: reactionsTmp,
|
||||||
reactions: reactionsTmp,
|
isEphemeral: chatMessage.isEphemeral,
|
||||||
isEphemeral: eventLog.chatMessage?.isEphemeral ?? false,
|
ephemeralExpireTime: chatMessage.ephemeralExpireTime,
|
||||||
ephemeralExpireTime: eventLog.chatMessage?.ephemeralExpireTime ?? 0,
|
ephemeralLifetime: chatMessage.ephemeralLifetime,
|
||||||
ephemeralLifetime: eventLog.chatMessage?.ephemeralLifetime ?? 0,
|
isIcalendar: chatMessage.contents.first?.isIcalendar ?? false,
|
||||||
isIcalendar: eventLog.chatMessage?.contents.first?.isIcalendar ?? false,
|
messageConferenceInfo: chatMessage.contents.first != nil && chatMessage.contents.first!.isIcalendar == true ? self.parseConferenceInvite(content: chatMessage.contents.first!) : nil
|
||||||
messageConferenceInfo: eventLog.chatMessage != nil && eventLog.chatMessage!.contents.first != nil && eventLog.chatMessage!.contents.first!.isIcalendar == true ? self.parseConferenceInvite(content: eventLog.chatMessage!.contents.first!) : nil
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
)
|
||||||
self.addChatMessageDelegate(message: eventLog.chatMessage!)
|
|
||||||
} else {
|
self.addChatMessageDelegate(message: chatMessage)
|
||||||
conversationMessage.append(
|
|
||||||
EventLogMessage(
|
|
||||||
eventModel: EventModel(eventLog: eventLog),
|
|
||||||
message: Message(
|
|
||||||
id: UUID().uuidString,
|
|
||||||
status: nil,
|
|
||||||
isOutgoing: false,
|
|
||||||
dateReceived: 0,
|
|
||||||
address: "",
|
|
||||||
isFirstMessage: false,
|
|
||||||
text: "",
|
|
||||||
attachments: [],
|
|
||||||
ownReaction: "",
|
|
||||||
reactions: []
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
|
|
@ -812,13 +794,15 @@ class ConversationViewModel: ObservableObject {
|
||||||
var attachmentList: [Attachment] = []
|
var attachmentList: [Attachment] = []
|
||||||
var contentText = ""
|
var contentText = ""
|
||||||
|
|
||||||
if eventLog.chatMessage != nil && !eventLog.chatMessage!.contents.isEmpty {
|
guard let chatMessage = eventLog.chatMessage else { return }
|
||||||
eventLog.chatMessage!.contents.forEach { content in
|
|
||||||
|
if !chatMessage.contents.isEmpty {
|
||||||
|
chatMessage.contents.forEach { content in
|
||||||
if content.isText && content.name == nil {
|
if content.isText && content.name == nil {
|
||||||
contentText = content.utf8Text ?? ""
|
contentText = content.utf8Text ?? ""
|
||||||
} else if content.name != nil && !content.name!.isEmpty {
|
} else if content.name != nil && !content.name!.isEmpty {
|
||||||
if content.filePath == nil || content.filePath!.isEmpty {
|
if content.filePath == nil || content.filePath!.isEmpty {
|
||||||
// self.downloadContent(chatMessage: eventLog.chatMessage!, content: content)
|
// self.downloadContent(chatMessage: chatMessage, content: content)
|
||||||
let path = URL(string: self.getNewFilePath(name: content.name ?? ""))
|
let path = URL(string: self.getNewFilePath(name: content.name ?? ""))
|
||||||
|
|
||||||
if path != nil {
|
if path != nil {
|
||||||
|
|
@ -904,13 +888,13 @@ class ConversationViewModel: ObservableObject {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let addressPrecCleaned = index > 0 ? historyEvents[index - 1].chatMessage?.fromAddress?.clone() : eventLog.chatMessage?.fromAddress?.clone()
|
let addressPrecCleaned = index > 0 ? historyEvents[index - 1].chatMessage?.fromAddress?.clone() : chatMessage.fromAddress?.clone()
|
||||||
addressPrecCleaned?.clean()
|
addressPrecCleaned?.clean()
|
||||||
|
|
||||||
let addressNextCleaned = index <= historyEvents.count - 2 ? historyEvents[index + 1].chatMessage?.fromAddress?.clone() : eventLog.chatMessage?.fromAddress?.clone()
|
let addressNextCleaned = index <= historyEvents.count - 2 ? historyEvents[index + 1].chatMessage?.fromAddress?.clone() : chatMessage.fromAddress?.clone()
|
||||||
addressNextCleaned?.clean()
|
addressNextCleaned?.clean()
|
||||||
|
|
||||||
let addressCleaned = eventLog.chatMessage?.fromAddress?.clone()
|
let addressCleaned = chatMessage.fromAddress?.clone()
|
||||||
addressCleaned?.clean()
|
addressCleaned?.clean()
|
||||||
|
|
||||||
if addressCleaned != nil && self.participantConversationModel.first(where: {$0.address == addressCleaned!.asStringUriOnly()}) == nil {
|
if addressCleaned != nil && self.participantConversationModel.first(where: {$0.address == addressCleaned!.asStringUriOnly()}) == nil {
|
||||||
|
|
@ -920,10 +904,10 @@ class ConversationViewModel: ObservableObject {
|
||||||
let isFirstMessageIncomingTmp = index > 0 ? addressPrecCleaned?.asStringUriOnly() != addressCleaned?.asStringUriOnly() : true
|
let isFirstMessageIncomingTmp = index > 0 ? addressPrecCleaned?.asStringUriOnly() != addressCleaned?.asStringUriOnly() : true
|
||||||
let isFirstMessageOutgoingTmp = index <= historyEvents.count - 2 ? addressNextCleaned?.asStringUriOnly() != addressCleaned?.asStringUriOnly() : true
|
let isFirstMessageOutgoingTmp = index <= historyEvents.count - 2 ? addressNextCleaned?.asStringUriOnly() != addressCleaned?.asStringUriOnly() : true
|
||||||
|
|
||||||
let isFirstMessageTmp = (eventLog.chatMessage?.isOutgoing ?? false) ? isFirstMessageOutgoingTmp : isFirstMessageIncomingTmp
|
let isFirstMessageTmp = chatMessage.isOutgoing ? isFirstMessageOutgoingTmp : isFirstMessageIncomingTmp
|
||||||
|
|
||||||
var statusTmp: Message.Status? = .sending
|
var statusTmp: Message.Status? = .sending
|
||||||
switch eventLog.chatMessage?.state {
|
switch chatMessage.state {
|
||||||
case .InProgress:
|
case .InProgress:
|
||||||
statusTmp = .sending
|
statusTmp = .sending
|
||||||
case .Delivered:
|
case .Delivered:
|
||||||
|
|
@ -939,7 +923,7 @@ class ConversationViewModel: ObservableObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
var reactionsTmp: [String] = []
|
var reactionsTmp: [String] = []
|
||||||
eventLog.chatMessage?.reactions.forEach({ chatMessageReaction in
|
chatMessage.reactions.forEach({ chatMessageReaction in
|
||||||
reactionsTmp.append(chatMessageReaction.body)
|
reactionsTmp.append(chatMessageReaction.body)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -948,19 +932,19 @@ class ConversationViewModel: ObservableObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
var replyMessageTmp: ReplyMessage?
|
var replyMessageTmp: ReplyMessage?
|
||||||
if eventLog.chatMessage?.replyMessage != nil {
|
if chatMessage.replyMessage != nil {
|
||||||
let addressReplyCleaned = eventLog.chatMessage?.replyMessage?.fromAddress?.clone()
|
let addressReplyCleaned = chatMessage.replyMessage?.fromAddress?.clone()
|
||||||
addressReplyCleaned?.clean()
|
addressReplyCleaned?.clean()
|
||||||
|
|
||||||
if addressReplyCleaned != nil && self.participantConversationModel.first(where: {$0.address == addressReplyCleaned!.asStringUriOnly()}) == nil {
|
if addressReplyCleaned != nil && self.participantConversationModel.first(where: {$0.address == addressReplyCleaned!.asStringUriOnly()}) == nil {
|
||||||
self.addParticipantConversationModel(address: addressReplyCleaned!)
|
self.addParticipantConversationModel(address: addressReplyCleaned!)
|
||||||
}
|
}
|
||||||
|
|
||||||
let contentReplyText = eventLog.chatMessage?.replyMessage?.utf8Text ?? ""
|
let contentReplyText = chatMessage.replyMessage?.utf8Text ?? ""
|
||||||
|
|
||||||
var attachmentNameReplyList: String = ""
|
var attachmentNameReplyList: String = ""
|
||||||
|
|
||||||
eventLog.chatMessage?.replyMessage?.contents.forEach { content in
|
chatMessage.replyMessage?.contents.forEach { content in
|
||||||
if !content.isText {
|
if !content.isText {
|
||||||
attachmentNameReplyList += ", \(content.name!)"
|
attachmentNameReplyList += ", \(content.name!)"
|
||||||
}
|
}
|
||||||
|
|
@ -971,7 +955,7 @@ class ConversationViewModel: ObservableObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
replyMessageTmp = ReplyMessage(
|
replyMessageTmp = ReplyMessage(
|
||||||
id: eventLog.chatMessage?.replyMessage!.messageId ?? UUID().uuidString,
|
id: chatMessage.replyMessage!.messageId,
|
||||||
address: addressReplyCleaned?.asStringUriOnly() ?? "",
|
address: addressReplyCleaned?.asStringUriOnly() ?? "",
|
||||||
isFirstMessage: false,
|
isFirstMessage: false,
|
||||||
text: contentReplyText,
|
text: contentReplyText,
|
||||||
|
|
@ -982,53 +966,33 @@ class ConversationViewModel: ObservableObject {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if eventLog.chatMessage != nil {
|
conversationMessagesTmp.insert(
|
||||||
conversationMessagesTmp.insert(
|
EventLogMessage(
|
||||||
EventLogMessage(
|
eventModel: EventModel(eventLog: eventLog),
|
||||||
eventModel: EventModel(eventLog: eventLog),
|
message: Message(
|
||||||
message: Message(
|
id: !chatMessage.messageId.isEmpty ? chatMessage.messageId : UUID().uuidString,
|
||||||
id: !eventLog.chatMessage!.messageId.isEmpty ? eventLog.chatMessage!.messageId : UUID().uuidString,
|
status: statusTmp,
|
||||||
status: statusTmp,
|
isOutgoing: chatMessage.isOutgoing,
|
||||||
isOutgoing: eventLog.chatMessage?.isOutgoing ?? false,
|
dateReceived: chatMessage.time,
|
||||||
dateReceived: eventLog.chatMessage?.time ?? 0,
|
address: addressCleaned?.asStringUriOnly() ?? "",
|
||||||
address: addressCleaned?.asStringUriOnly() ?? "",
|
isFirstMessage: isFirstMessageTmp,
|
||||||
isFirstMessage: isFirstMessageTmp,
|
text: contentText,
|
||||||
text: contentText,
|
attachmentsNames: attachmentNameList,
|
||||||
attachmentsNames: attachmentNameList,
|
attachments: attachmentList,
|
||||||
attachments: attachmentList,
|
replyMessage: replyMessageTmp,
|
||||||
replyMessage: replyMessageTmp,
|
isForward: chatMessage.isForward,
|
||||||
isForward: eventLog.chatMessage?.isForward ?? false,
|
ownReaction: chatMessage.ownReaction?.body ?? "",
|
||||||
ownReaction: eventLog.chatMessage?.ownReaction?.body ?? "",
|
reactions: reactionsTmp,
|
||||||
reactions: reactionsTmp,
|
isEphemeral: chatMessage.isEphemeral,
|
||||||
isEphemeral: eventLog.chatMessage?.isEphemeral ?? false,
|
ephemeralExpireTime: chatMessage.ephemeralExpireTime,
|
||||||
ephemeralExpireTime: eventLog.chatMessage?.ephemeralExpireTime ?? 0,
|
ephemeralLifetime: chatMessage.ephemeralLifetime,
|
||||||
ephemeralLifetime: eventLog.chatMessage?.ephemeralLifetime ?? 0,
|
isIcalendar: chatMessage.contents.first?.isIcalendar ?? false,
|
||||||
isIcalendar: eventLog.chatMessage?.contents.first?.isIcalendar ?? false,
|
messageConferenceInfo: chatMessage.contents.first != nil && chatMessage.contents.first!.isIcalendar == true ? self.parseConferenceInvite(content: chatMessage.contents.first!) : nil
|
||||||
messageConferenceInfo: eventLog.chatMessage != nil && eventLog.chatMessage!.contents.first != nil && eventLog.chatMessage!.contents.first!.isIcalendar == true ? self.parseConferenceInvite(content: eventLog.chatMessage!.contents.first!) : nil
|
)
|
||||||
)
|
), at: 0
|
||||||
), at: 0
|
)
|
||||||
)
|
|
||||||
|
self.addChatMessageDelegate(message: chatMessage)
|
||||||
self.addChatMessageDelegate(message: eventLog.chatMessage!)
|
|
||||||
} else {
|
|
||||||
conversationMessagesTmp.insert(
|
|
||||||
EventLogMessage(
|
|
||||||
eventModel: EventModel(eventLog: eventLog),
|
|
||||||
message: Message(
|
|
||||||
id: UUID().uuidString,
|
|
||||||
status: nil,
|
|
||||||
isOutgoing: false,
|
|
||||||
dateReceived: 0,
|
|
||||||
address: "",
|
|
||||||
isFirstMessage: false,
|
|
||||||
text: "",
|
|
||||||
attachments: [],
|
|
||||||
ownReaction: "",
|
|
||||||
reactions: []
|
|
||||||
)
|
|
||||||
), at: 0
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if !conversationMessagesTmp.isEmpty {
|
if !conversationMessagesTmp.isEmpty {
|
||||||
|
|
@ -1075,7 +1039,7 @@ class ConversationViewModel: ObservableObject {
|
||||||
contentText = content.utf8Text ?? ""
|
contentText = content.utf8Text ?? ""
|
||||||
} else {
|
} else {
|
||||||
if content.filePath == nil || content.filePath!.isEmpty {
|
if content.filePath == nil || content.filePath!.isEmpty {
|
||||||
// self.downloadContent(chatMessage: eventLog.chatMessage!, content: content)
|
// self.downloadContent(chatMessage: chatMessage, content: content)
|
||||||
let path = URL(string: self.getNewFilePath(name: content.name ?? ""))
|
let path = URL(string: self.getNewFilePath(name: content.name ?? ""))
|
||||||
|
|
||||||
if path != nil {
|
if path != nil {
|
||||||
|
|
@ -1255,80 +1219,52 @@ class ConversationViewModel: ObservableObject {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if eventLog.chatMessage != nil {
|
let message = EventLogMessage(
|
||||||
|
eventModel: EventModel(eventLog: eventLog),
|
||||||
let message = EventLogMessage(
|
message: Message(
|
||||||
eventModel: EventModel(eventLog: eventLog),
|
id: !chatMessage.messageId.isEmpty ? chatMessage.messageId : UUID().uuidString,
|
||||||
message: Message(
|
appData: chatMessage.appdata ?? "",
|
||||||
id: !chatMessage.messageId.isEmpty ? chatMessage.messageId : UUID().uuidString,
|
status: statusTmp,
|
||||||
appData: chatMessage.appdata ?? "",
|
isOutgoing: chatMessage.isOutgoing,
|
||||||
status: statusTmp,
|
dateReceived: chatMessage.time,
|
||||||
isOutgoing: chatMessage.isOutgoing,
|
address: addressCleaned != nil ? addressCleaned!.asStringUriOnly() : "",
|
||||||
dateReceived: chatMessage.time,
|
isFirstMessage: isFirstMessageTmp,
|
||||||
address: addressCleaned != nil ? addressCleaned!.asStringUriOnly() : "",
|
text: contentText,
|
||||||
isFirstMessage: isFirstMessageTmp,
|
attachmentsNames: attachmentNameList,
|
||||||
text: contentText,
|
attachments: attachmentList,
|
||||||
attachmentsNames: attachmentNameList,
|
replyMessage: replyMessageTmp,
|
||||||
attachments: attachmentList,
|
isForward: chatMessage.isForward,
|
||||||
replyMessage: replyMessageTmp,
|
ownReaction: chatMessage.ownReaction?.body ?? "",
|
||||||
isForward: chatMessage.isForward,
|
reactions: reactionsTmp,
|
||||||
ownReaction: chatMessage.ownReaction?.body ?? "",
|
isEphemeral: chatMessage.isEphemeral,
|
||||||
reactions: reactionsTmp,
|
ephemeralExpireTime: chatMessage.ephemeralExpireTime,
|
||||||
isEphemeral: chatMessage.isEphemeral,
|
ephemeralLifetime: chatMessage.ephemeralLifetime,
|
||||||
ephemeralExpireTime: chatMessage.ephemeralExpireTime,
|
isIcalendar: chatMessage.contents.first?.isIcalendar ?? false,
|
||||||
ephemeralLifetime: chatMessage.ephemeralLifetime,
|
messageConferenceInfo: chatMessage.contents.first != nil && chatMessage.contents.first!.isIcalendar == true ? self.parseConferenceInvite(content: chatMessage.contents.first!) : nil
|
||||||
isIcalendar: chatMessage.contents.first?.isIcalendar ?? false,
|
|
||||||
messageConferenceInfo: chatMessage.contents.first != nil && chatMessage.contents.first!.isIcalendar == true ? self.parseConferenceInvite(content: chatMessage.contents.first!) : nil
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
if self.conversationMessagesSection[0].rows.first?.eventModel.eventLogId != chatMessage.messageId {
|
|
||||||
self.addChatMessageDelegate(message: chatMessage)
|
|
||||||
|
|
||||||
DispatchQueue.main.async {
|
|
||||||
Log.info("[ConversationViewModel] Get new Messages \(self.conversationMessagesSection.count)")
|
|
||||||
if !self.conversationMessagesSection.isEmpty
|
|
||||||
&& !self.conversationMessagesSection[0].rows.isEmpty
|
|
||||||
&& self.conversationMessagesSection[0].rows[0].message.isOutgoing
|
|
||||||
&& (self.conversationMessagesSection[0].rows[0].message.address == message.message.address) {
|
|
||||||
self.conversationMessagesSection[0].rows[0].message.isFirstMessage = false
|
|
||||||
}
|
|
||||||
|
|
||||||
if self.conversationMessagesSection.isEmpty && self.displayedConversation != nil {
|
|
||||||
self.conversationMessagesSection.append(MessagesSection(date: Date(), chatRoomID: self.displayedConversation!.id, rows: [message]))
|
|
||||||
} else {
|
|
||||||
self.conversationMessagesSection[0].rows.insert(message, at: 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
if !message.message.isOutgoing {
|
|
||||||
self.displayedConversationUnreadMessagesCount = unreadMessagesCount
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
let message = EventLogMessage(
|
|
||||||
eventModel: EventModel(eventLog: eventLog),
|
|
||||||
message: Message(
|
|
||||||
id: UUID().uuidString,
|
|
||||||
status: nil,
|
|
||||||
isOutgoing: false,
|
|
||||||
dateReceived: 0,
|
|
||||||
address: "",
|
|
||||||
isFirstMessage: false,
|
|
||||||
text: "",
|
|
||||||
attachments: [],
|
|
||||||
ownReaction: "",
|
|
||||||
reactions: []
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if self.conversationMessagesSection[0].rows.first?.eventModel.eventLogId != chatMessage.messageId {
|
||||||
|
self.addChatMessageDelegate(message: chatMessage)
|
||||||
|
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
Log.info("[ConversationViewModel] Get new Messages (message nil) \(self.conversationMessagesSection.count)")
|
Log.info("[ConversationViewModel] Get new Messages \(self.conversationMessagesSection.count)")
|
||||||
|
if !self.conversationMessagesSection.isEmpty
|
||||||
|
&& !self.conversationMessagesSection[0].rows.isEmpty
|
||||||
|
&& self.conversationMessagesSection[0].rows[0].message.isOutgoing
|
||||||
|
&& (self.conversationMessagesSection[0].rows[0].message.address == message.message.address) {
|
||||||
|
self.conversationMessagesSection[0].rows[0].message.isFirstMessage = false
|
||||||
|
}
|
||||||
|
|
||||||
if self.conversationMessagesSection.isEmpty && self.displayedConversation != nil {
|
if self.conversationMessagesSection.isEmpty && self.displayedConversation != nil {
|
||||||
self.conversationMessagesSection.append(MessagesSection(date: Date(), chatRoomID: self.displayedConversation!.id, rows: [message]))
|
self.conversationMessagesSection.append(MessagesSection(date: Date(), chatRoomID: self.displayedConversation!.id, rows: [message]))
|
||||||
} else {
|
} else {
|
||||||
self.conversationMessagesSection[0].rows.insert(message, at: 0)
|
self.conversationMessagesSection[0].rows.insert(message, at: 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !message.message.isOutgoing {
|
||||||
|
self.displayedConversationUnreadMessagesCount = unreadMessagesCount
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1389,13 +1325,15 @@ class ConversationViewModel: ObservableObject {
|
||||||
var attachmentList: [Attachment] = []
|
var attachmentList: [Attachment] = []
|
||||||
var contentText = ""
|
var contentText = ""
|
||||||
|
|
||||||
if eventLog.chatMessage != nil && !eventLog.chatMessage!.contents.isEmpty {
|
guard let chatMessage = eventLog.chatMessage else { return }
|
||||||
eventLog.chatMessage!.contents.forEach { content in
|
|
||||||
|
if !chatMessage.contents.isEmpty {
|
||||||
|
chatMessage.contents.forEach { content in
|
||||||
if content.isText && content.name == nil {
|
if content.isText && content.name == nil {
|
||||||
contentText = content.utf8Text ?? ""
|
contentText = content.utf8Text ?? ""
|
||||||
} else if content.name != nil && !content.name!.isEmpty {
|
} else if content.name != nil && !content.name!.isEmpty {
|
||||||
if content.filePath == nil || content.filePath!.isEmpty {
|
if content.filePath == nil || content.filePath!.isEmpty {
|
||||||
// self.downloadContent(chatMessage: eventLog.chatMessage!, content: content)
|
// self.downloadContent(chatMessage: chatMessage, content: content)
|
||||||
let path = URL(string: self.getNewFilePath(name: content.name ?? ""))
|
let path = URL(string: self.getNewFilePath(name: content.name ?? ""))
|
||||||
|
|
||||||
if path != nil {
|
if path != nil {
|
||||||
|
|
@ -1481,13 +1419,13 @@ class ConversationViewModel: ObservableObject {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let addressPrecCleaned = index > 0 ? historyEvents[index - 1].chatMessage?.fromAddress?.clone() : eventLog.chatMessage?.fromAddress?.clone()
|
let addressPrecCleaned = index > 0 ? historyEvents[index - 1].chatMessage?.fromAddress?.clone() : chatMessage.fromAddress?.clone()
|
||||||
addressPrecCleaned?.clean()
|
addressPrecCleaned?.clean()
|
||||||
|
|
||||||
let addressNextCleaned = index <= historyEvents.count - 2 ? historyEvents[index + 1].chatMessage?.fromAddress?.clone() : eventLog.chatMessage?.fromAddress?.clone()
|
let addressNextCleaned = index <= historyEvents.count - 2 ? historyEvents[index + 1].chatMessage?.fromAddress?.clone() : chatMessage.fromAddress?.clone()
|
||||||
addressNextCleaned?.clean()
|
addressNextCleaned?.clean()
|
||||||
|
|
||||||
let addressCleaned = eventLog.chatMessage?.fromAddress?.clone()
|
let addressCleaned = chatMessage.fromAddress?.clone()
|
||||||
addressCleaned?.clean()
|
addressCleaned?.clean()
|
||||||
|
|
||||||
if addressCleaned != nil && self.participantConversationModel.first(where: {$0.address == addressCleaned!.asStringUriOnly()}) == nil {
|
if addressCleaned != nil && self.participantConversationModel.first(where: {$0.address == addressCleaned!.asStringUriOnly()}) == nil {
|
||||||
|
|
@ -1497,10 +1435,10 @@ class ConversationViewModel: ObservableObject {
|
||||||
let isFirstMessageIncomingTmp = index > 0 ? addressPrecCleaned?.asStringUriOnly() != addressCleaned?.asStringUriOnly() : true
|
let isFirstMessageIncomingTmp = index > 0 ? addressPrecCleaned?.asStringUriOnly() != addressCleaned?.asStringUriOnly() : true
|
||||||
let isFirstMessageOutgoingTmp = index <= historyEvents.count - 2 ? addressNextCleaned?.asStringUriOnly() != addressCleaned?.asStringUriOnly() : true
|
let isFirstMessageOutgoingTmp = index <= historyEvents.count - 2 ? addressNextCleaned?.asStringUriOnly() != addressCleaned?.asStringUriOnly() : true
|
||||||
|
|
||||||
let isFirstMessageTmp = (eventLog.chatMessage?.isOutgoing ?? false) ? isFirstMessageOutgoingTmp : isFirstMessageIncomingTmp
|
let isFirstMessageTmp = chatMessage.isOutgoing ? isFirstMessageOutgoingTmp : isFirstMessageIncomingTmp
|
||||||
|
|
||||||
var statusTmp: Message.Status? = .sending
|
var statusTmp: Message.Status? = .sending
|
||||||
switch eventLog.chatMessage?.state {
|
switch chatMessage.state {
|
||||||
case .InProgress:
|
case .InProgress:
|
||||||
statusTmp = .sending
|
statusTmp = .sending
|
||||||
case .Delivered:
|
case .Delivered:
|
||||||
|
|
@ -1516,7 +1454,7 @@ class ConversationViewModel: ObservableObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
var reactionsTmp: [String] = []
|
var reactionsTmp: [String] = []
|
||||||
eventLog.chatMessage?.reactions.forEach({ chatMessageReaction in
|
chatMessage.reactions.forEach({ chatMessageReaction in
|
||||||
reactionsTmp.append(chatMessageReaction.body)
|
reactionsTmp.append(chatMessageReaction.body)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -1525,19 +1463,19 @@ class ConversationViewModel: ObservableObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
var replyMessageTmp: ReplyMessage?
|
var replyMessageTmp: ReplyMessage?
|
||||||
if eventLog.chatMessage?.replyMessage != nil {
|
if chatMessage.replyMessage != nil {
|
||||||
let addressReplyCleaned = eventLog.chatMessage?.replyMessage?.fromAddress?.clone()
|
let addressReplyCleaned = chatMessage.replyMessage?.fromAddress?.clone()
|
||||||
addressReplyCleaned?.clean()
|
addressReplyCleaned?.clean()
|
||||||
|
|
||||||
if addressReplyCleaned != nil && self.participantConversationModel.first(where: {$0.address == addressReplyCleaned!.asStringUriOnly()}) == nil {
|
if addressReplyCleaned != nil && self.participantConversationModel.first(where: {$0.address == addressReplyCleaned!.asStringUriOnly()}) == nil {
|
||||||
self.addParticipantConversationModel(address: addressReplyCleaned!)
|
self.addParticipantConversationModel(address: addressReplyCleaned!)
|
||||||
}
|
}
|
||||||
|
|
||||||
let contentReplyText = eventLog.chatMessage?.replyMessage?.utf8Text ?? ""
|
let contentReplyText = chatMessage.replyMessage?.utf8Text ?? ""
|
||||||
|
|
||||||
var attachmentNameReplyList: String = ""
|
var attachmentNameReplyList: String = ""
|
||||||
|
|
||||||
eventLog.chatMessage?.replyMessage?.contents.forEach { content in
|
chatMessage.replyMessage?.contents.forEach { content in
|
||||||
if !content.isText {
|
if !content.isText {
|
||||||
attachmentNameReplyList += ", \(content.name!)"
|
attachmentNameReplyList += ", \(content.name!)"
|
||||||
}
|
}
|
||||||
|
|
@ -1548,7 +1486,7 @@ class ConversationViewModel: ObservableObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
replyMessageTmp = ReplyMessage(
|
replyMessageTmp = ReplyMessage(
|
||||||
id: eventLog.chatMessage?.replyMessage!.messageId ?? UUID().uuidString,
|
id: chatMessage.replyMessage!.messageId,
|
||||||
address: addressReplyCleaned?.asStringUriOnly() ?? "",
|
address: addressReplyCleaned?.asStringUriOnly() ?? "",
|
||||||
isFirstMessage: false,
|
isFirstMessage: false,
|
||||||
text: contentReplyText,
|
text: contentReplyText,
|
||||||
|
|
@ -1559,53 +1497,33 @@ class ConversationViewModel: ObservableObject {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if eventLog.chatMessage != nil {
|
conversationMessagesTmp.insert(
|
||||||
conversationMessagesTmp.insert(
|
EventLogMessage(
|
||||||
EventLogMessage(
|
eventModel: EventModel(eventLog: eventLog),
|
||||||
eventModel: EventModel(eventLog: eventLog),
|
message: Message(
|
||||||
message: Message(
|
id: !chatMessage.messageId.isEmpty ? chatMessage.messageId : UUID().uuidString,
|
||||||
id: !eventLog.chatMessage!.messageId.isEmpty ? eventLog.chatMessage!.messageId : UUID().uuidString,
|
status: statusTmp,
|
||||||
status: statusTmp,
|
isOutgoing: chatMessage.isOutgoing,
|
||||||
isOutgoing: eventLog.chatMessage?.isOutgoing ?? false,
|
dateReceived: chatMessage.time,
|
||||||
dateReceived: eventLog.chatMessage?.time ?? 0,
|
address: addressCleaned?.asStringUriOnly() ?? "",
|
||||||
address: addressCleaned?.asStringUriOnly() ?? "",
|
isFirstMessage: isFirstMessageTmp,
|
||||||
isFirstMessage: isFirstMessageTmp,
|
text: contentText,
|
||||||
text: contentText,
|
attachmentsNames: attachmentNameList,
|
||||||
attachmentsNames: attachmentNameList,
|
attachments: attachmentList,
|
||||||
attachments: attachmentList,
|
replyMessage: replyMessageTmp,
|
||||||
replyMessage: replyMessageTmp,
|
isForward: chatMessage.isForward,
|
||||||
isForward: eventLog.chatMessage?.isForward ?? false,
|
ownReaction: chatMessage.ownReaction?.body ?? "",
|
||||||
ownReaction: eventLog.chatMessage?.ownReaction?.body ?? "",
|
reactions: reactionsTmp,
|
||||||
reactions: reactionsTmp,
|
isEphemeral: chatMessage.isEphemeral,
|
||||||
isEphemeral: eventLog.chatMessage?.isEphemeral ?? false,
|
ephemeralExpireTime: chatMessage.ephemeralExpireTime,
|
||||||
ephemeralExpireTime: eventLog.chatMessage?.ephemeralExpireTime ?? 0,
|
ephemeralLifetime: chatMessage.ephemeralLifetime,
|
||||||
ephemeralLifetime: eventLog.chatMessage?.ephemeralLifetime ?? 0,
|
isIcalendar: chatMessage.contents.first?.isIcalendar ?? false,
|
||||||
isIcalendar: eventLog.chatMessage?.contents.first?.isIcalendar ?? false,
|
messageConferenceInfo: chatMessage.contents.first != nil && chatMessage.contents.first!.isIcalendar == true ? self.parseConferenceInvite(content: chatMessage.contents.first!) : nil
|
||||||
messageConferenceInfo: eventLog.chatMessage != nil && eventLog.chatMessage!.contents.first != nil && eventLog.chatMessage!.contents.first!.isIcalendar == true ? self.parseConferenceInvite(content: eventLog.chatMessage!.contents.first!) : nil
|
)
|
||||||
)
|
), at: 0
|
||||||
), at: 0
|
)
|
||||||
)
|
|
||||||
|
self.addChatMessageDelegate(message: chatMessage)
|
||||||
self.addChatMessageDelegate(message: eventLog.chatMessage!)
|
|
||||||
} else {
|
|
||||||
conversationMessagesTmp.insert(
|
|
||||||
EventLogMessage(
|
|
||||||
eventModel: EventModel(eventLog: eventLog),
|
|
||||||
message: Message(
|
|
||||||
id: UUID().uuidString,
|
|
||||||
status: nil,
|
|
||||||
isOutgoing: false,
|
|
||||||
dateReceived: 0,
|
|
||||||
address: "",
|
|
||||||
isFirstMessage: false,
|
|
||||||
text: "",
|
|
||||||
attachments: [],
|
|
||||||
ownReaction: "",
|
|
||||||
reactions: []
|
|
||||||
)
|
|
||||||
), at: 0
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if !conversationMessagesTmp.isEmpty {
|
if !conversationMessagesTmp.isEmpty {
|
||||||
|
|
@ -1629,24 +1547,10 @@ class ConversationViewModel: ObservableObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
func removeMessage(_ eventLog: EventLog) {
|
func removeMessage(_ eventLog: EventLog) {
|
||||||
/*
|
|
||||||
if let found = self.conversationMessagesSection[0].rows.first(where: { $0.message.id == eventLog.chatMessage?.messageId }) {
|
|
||||||
var updatedList = self.conversationMessagesSection[0].rows
|
|
||||||
|
|
||||||
print("Removing message from conversation events list")
|
|
||||||
if let index = updatedList.firstIndex(where: { $0.message.id == found.message.id }) {
|
|
||||||
updatedList.remove(at: index)
|
|
||||||
}
|
|
||||||
|
|
||||||
DispatchQueue.main.async {
|
|
||||||
self.conversationMessagesSection[0].rows = updatedList
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
print("Failed to find matching message in conversation events list")
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
if let index = self.conversationMessagesSection[0].rows.firstIndex(where: { $0.message.id == eventLog.chatMessage?.messageId }) {
|
guard let chatMessage = eventLog.chatMessage else { return }
|
||||||
|
|
||||||
|
if let index = self.conversationMessagesSection[0].rows.firstIndex(where: { $0.message.id == chatMessage.messageId }) {
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
if index > 0 && self.conversationMessagesSection[0].rows[index - 1].message.address == self.conversationMessagesSection[0].rows[index].message.address {
|
if index > 0 && self.conversationMessagesSection[0].rows[index - 1].message.address == self.conversationMessagesSection[0].rows[index].message.address {
|
||||||
self.conversationMessagesSection[0].rows[index - 1].message.isFirstMessage = self.conversationMessagesSection[0].rows[index].message.isFirstMessage
|
self.conversationMessagesSection[0].rows[index - 1].message.isFirstMessage = self.conversationMessagesSection[0].rows[index].message.isFirstMessage
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue