Channel Controllers
#
ChannelListControllerChatChannelListController
allows you to observe a list of chat channels based on the provided query and to paginate channels.
ChannelListController
#
Publishers in To receive a queried list of channels, you can use the channelsChangesPublisher
provided by the ChatChannelListController
channelListController .channelsChangesPublisher .sink(receiveValue: { // process the channel changes here }) .store(in: &cancellables)
#
ChannelControllerChatChannelController
allows you to observe and mutate data for one channel.
ChannelController
#
Publishers in 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 IndicatorLet'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 }}
#
ChatChannelMemberListControllerChatChannelMemberListController
allows you to observe and mutate data and observing changes for a list of channel members based on the provided query.
MemberListController
#
Publishers in 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 MembersThis 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 }}
#
ChannelMemberControllerChatChannelMemberController
allows you to observe and mutate data and observing changes of a specific chat member.
ChannelMemberController
#
Publishers in The memberChangePublisher
emits a new value protocol every time the member changes.
memberController .memberChangePublisher .sink(receiveValue: { // Process the member changes here. }) .store(in: &cancellables)