channelListController
.channelsChangesPublisher
.sink(receiveValue: {
// process the channel changes here
})
.store(in: &cancellables)
Channel Controllers
ChannelListController
ChatChannelListController
allows you to observe a list of chat channels based on the provided query and to paginate channels.
Publishers in ChannelListController
To receive a queried list of channels, you can use the channelsChangesPublisher
provided by the ChatChannelListController
ChannelController
ChatChannelController
allows you to observe and mutate data for one channel.
Publishers in ChannelController
The channelChangePublisher
will emit a new value every time the channel changes.
channelController
.channelChangePublisher
.sink(receiveValue: {
// Process the updated channel data here
})
.store(in: &cancellables)
The messagesChangesPublisher
will emit a new value every time the list of the messages matching the query changes.
channelController
.messagesChangesPublisher
.sink(receiveValue: {
//Process the messages changes here
})
.store(in: &cancellables)
The memberEventPublisher
will emit a new value every time a member event is received.
channelController
.memberEventPublisher
.sink(receiveValue: {
// Process the member events here
})
.store(in: &cancellables)
The typingUsersPublisher
will emit a new value every time typing users change.
channelController
.typingUsersPublisher
.sink(receiveValue: {
// Process the changes related to typing users here
})
.store(in: &cancellables)
Example: Typing Indicator
Let’s build a simple UIView
that shows which user is currently typing in the channel using the typingUsersPublisher
class TypingIndicatorView: UIView {
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) {
fatalError("init(coder:) has not been implemented")
}
func setTypingUsers(_ typingUsers: Set<ChatUser>) {
guard let typingUser = typingUsers.first else {
labelView.text = ""
return
}
labelView.text = "\(typingUser.name ?? typingUser.id) is typing ..."
}
}
class ViewController: UIViewController {
var controller: ChatChannelController!
var cancellables: Set<AnyCancellable> = []
var typingIndicatorView: TypingIndicatorView = {
var view = TypingIndicatorView()
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
let cid = ChannelId.init(type:.messaging, id:"the-id-of-the-channel")
controller = ChatClient.shared.channelController(for: cid)
controller.synchronize()
controller.typingUsersPublisher
.receive(on: RunLoop.main)
.sink { [weak self] typingUsers in
let otherUsersTyping = typingUsers.filter({ $0.id != self?.controller.client.currentUserId })
self?.typingIndicatorView.setTypingUsers(otherUsersTyping)
}.store(in: &cancellables)
navigationItem.titleView = typingIndicatorView
}
}
ChatChannelMemberListController
ChatChannelMemberListController
allows you to observe and mutate data and observing changes for a list of channel members based on the provided query.
Publishers in MemberListController
The membersChanges
publisher will emit a new value whenever the list of channel members based on the provided query changes.
memberListController
.membersChangesPublisher
.sink(receiveValue: {
// Use the member list here
})
.store(in: &cancellables)
Example: Listing Members
This example uses the membersChangesPublisher
to observe the changes to the members on the channel messaging:123
class MembersSearchResultsView: UIView {
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) {
fatalError("init(coder:) has not been implemented")
}
func setMembers(_ members: [ChatChannelMember]) {
let membersStr = members.map { $0.name ?? $0.id }.joined(separator: ", ")
labelView.text = membersStr
}
}
class ViewController: UIViewController {
var controller: ChatChannelMemberListController!
var cancellables: Set<AnyCancellable> = []
var membersSearchResultsView: MembersSearchResultsView = {
var view = MembersSearchResultsView()
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
let cid = ChannelId.init(type:.messaging, id:"123")
let query = ChannelMemberListQuery.init(cid: cid)
controller = ChatClient.shared.memberListController(query: query)
controller.synchronize {error in
if error != nil {
log.assertionFailure(error!)
}
}
controller.membersChangesPublisher
.receive(on: RunLoop.main)
.sink { [weak self] _ in
if let updatedMembers = self?.controller.members {
self?.membersSearchResultsView.setMembers(Array(updatedMembers))
}
}.store(in: &cancellables)
navigationItem.titleView = membersSearchResultsView
}
}
ChannelMemberController
ChatChannelMemberController
allows you to observe and mutate data and observing changes of a specific chat member.
Publishers in ChannelMemberController
The memberChangePublisher
emits a new value protocol every time the member changes.
memberController
.memberChangePublisher
.sink(receiveValue: {
// Process the member changes here.
})
.store(in: &cancellables)