Skip to main content

Message Controllers

MessageController#

ChatMessageController allows you to observe and mutate data and observing changes for one message and its replies.

Message Delegate#

Classes that conform to the ChatMessageControllerDelegates protocol will receive data and changes for a message and its replies.

/// The controller observed a change in the `ChatMessage`.
func messageController(
_ controller: ChatMessageController,
didChangeMessage change: EntityChange<ChatMessage>
)

/// The controller observed changes in the replies of the observed `ChatMessage`.
func messageController(
_ controller: ChatMessageController,
didChangeReplies changes: [ListChange<ChatMessage>]
)

Example: Message Detail#

class MessageDetailView: UIView, ChatMessageControllerDelegate {
var message: ChatMessage! {
didSet {
updateContent()
}
}

var labelView: UILabel = {
var label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()

override public init(frame: CGRect) {
super.init(frame: frame)

addSubview(labelView)

NSLayoutConstraint.activate([
labelView.topAnchor.constraint(equalTo: topAnchor),
labelView.bottomAnchor.constraint(equalTo: bottomAnchor),
labelView.leadingAnchor.constraint(equalTo: leadingAnchor),
labelView.trailingAnchor.constraint(equalTo: trailingAnchor)
])
}

required init?(coder: NSCoder) {
super.init(coder: coder)
}

func updateContent() {
let messageText = message?.text ?? ""
let repliesCount = message?.replyCount ?? 0

labelView.text = "Text: \(messageText) Replies: \(repliesCount)"
}

func messageController(_ controller: ChatMessageController, didChangeMessage change: EntityChange<ChatMessage>) {
message = controller.message
}

func messageController(_ controller: ChatMessageController, didChangeReplies changes: [ListChange<ChatMessage>]) {
message = controller.message
print("list of replies for this message changed!")
}
}

class ViewController: UIViewController {
var controller: ChatMessageController!

var messageDetailView: MessageDetailView = {
var view = MessageDetailView()
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()

override func viewDidLoad() {
super.viewDidLoad()

let cid = ChannelId(type: .messaging, id: "E9BF5FCE-1")
controller = ChatClient.shared.messageController(cid: cid, messageId: "91AC67C6-C2AF-486E-8552-08E6F9B48D85")
controller.delegate = messageDetailView

controller.synchronize { error in
if error != nil {
log.assertionFailure(error!)
return
}
/// set the initial state to the delegated view
self.messageDetailView.message = self.controller.message
}

navigationItem.titleView = messageDetailView
}
}

Did you find this page helpful?