Skip to content

Commit 365f816

Browse files
committed
Extend the default ExyteChat MessageView with an MLMessage @StateObject
Thanks to ObservableKVOWrapper, and to MLMessage being a model class, this gives us automatic view updates when an MLMessage object changes, while still using the default MessageView.
1 parent fe88a1a commit 365f816

1 file changed

Lines changed: 37 additions & 6 deletions

File tree

Monal/Classes/ChatView.swift

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,9 @@ struct ChatView: View {
200200
guard let newMLMessage = MLXMPPManager.sharedInstance().sendMessageAndAddToHistory(message: draft.text, havingType: kMessageTypeText, toContact: self.contact.obj, isEncrypted: self.contact.isEncrypted, uploadInfo: nil) else {
201201
return
202202
}
203-
messages.append(ChatViewMessage(newMLMessage))
203+
messages.append(ChatViewMessage(ObservableKVOWrapper(newMLMessage)))
204+
} messageBuilder: { message, viewModel, positionInUserGroup, positionInMessagesSection, positionInCommentsGroup, showContextMenuClosure, messageActionClosure, showAttachmentClosure in
205+
MessageView(message: (message as! ChatViewMessage).message, viewModel: viewModel, positionInUserGroup: positionInUserGroup, positionInMessagesSection: positionInMessagesSection)
204206
}
205207
.showNetworkConnectionProblem(false)
206208
// .enableLoadMore(pageSize: 3) { message in
@@ -350,7 +352,7 @@ struct ChatView: View {
350352
if messages.isEmpty {
351353
let dbMessages = DataLayer.sharedInstance().messages(forContact:contact.contactJid, forAccount:contact.accountID) as! [MLMessage]
352354
for msg in dbMessages {
353-
messages.append(ChatViewMessage(msg))
355+
messages.append(ChatViewMessage(ObservableKVOWrapper(msg)))
354356
}
355357
}
356358
ChatViewHelpers.refreshCounter(for: self.contact.obj)
@@ -408,7 +410,7 @@ struct ChatView: View {
408410
if message.isEqual(to: self.contact.obj) {
409411
// Do not insert based on delay timestamp because that
410412
// would make it possible to fake history entries.
411-
messages.append(ChatViewMessage(message))
413+
messages.append(ChatViewMessage(ObservableKVOWrapper(message)))
412414
}
413415
ChatViewHelpers.refreshCounter(for: self.contact.obj)
414416
}
@@ -419,9 +421,9 @@ struct ChatView: View {
419421
}
420422

421423
class ChatViewMessage: ExyteChat.Message {
422-
@Published public var message: MLMessage
423-
424-
init(_ message: MLMessage) {
424+
let message: ObservableKVOWrapper<MLMessage>
425+
426+
init(_ message: ObservableKVOWrapper<MLMessage>) {
425427
self.message = message
426428
let user = ExyteChat.User(id: message.senderID, name: message.contactDisplayName, avatarURL: nil, isCurrentUser: !message.inbound)
427429
super.init(id: message.id, user: user, createdAt: message.timestamp, text: message.messageText)
@@ -481,3 +483,32 @@ public extension ExyteChat.MessageView {
481483
// }
482484
}
483485
}*/
486+
struct MessageView: View {
487+
@StateObject var message: ObservableKVOWrapper<MLMessage>
488+
@ObservedObject var viewModel: ExyteChat.ChatViewModel
489+
let positionInUserGroup: PositionInUserGroup
490+
let positionInMessagesSection: PositionInMessagesSection
491+
init(message: ObservableKVOWrapper<MLMessage>, viewModel: ChatViewModel, positionInUserGroup: PositionInUserGroup, positionInMessagesSection: PositionInMessagesSection) {
492+
_message = StateObject(wrappedValue: message)
493+
self.viewModel = viewModel
494+
self.positionInUserGroup = positionInUserGroup
495+
self.positionInMessagesSection = positionInMessagesSection
496+
}
497+
var body: some View {
498+
ExyteChat.MessageView(
499+
viewModel: viewModel,
500+
message: ChatViewMessage(message),
501+
positionInUserGroup: positionInUserGroup,
502+
positionInMessagesSection: positionInMessagesSection,
503+
chatType: .conversation,
504+
avatarSize: 32,
505+
tapAvatarClosure: nil,
506+
messageStyler: AttributedString.init,
507+
shouldShowLinkPreview: { _ in true },
508+
isDisplayingMessageMenu: false,
509+
showMessageTimeView: true,
510+
messageLinkPreviewLimit: 8,
511+
font: UIFontMetrics.default.scaledFont(for: UIFont.systemFont(ofSize: 15))
512+
)
513+
}
514+
}

0 commit comments

Comments
 (0)