Unread

The most common use case for client-level events is unread counts. Here’s an example of a complete unread count integration for your chat app. As a first step we get the unread count when the user connects:

let currentUserController = client.currentUserController()

class CurrentUserDelegate: CurrentChatUserControllerDelegate {
  func currentUserController(_ controller: CurrentChatUserController,
                didChangeCurrentUserUnreadCount: UnreadCount) {
    // handle unread count change
  }
}

// We need to keep a strong reference to delegate
// since controller only keeps a weak reference
let delegate = CurrentUserDelegate()
currentUserController.delegate = delegate

currentUserController.synchronize()

By default the UI component SDKs (React, React Native, …) mark messages as read automatically when the channel is visible. You can also make the call manually like this:

let channelController = client.channelController(for: .init(type: .messaging, id: "general"))

channelController.markRead()

While you’re using the app, the unread count can change. A user can be added to a channel, a new message can be created, or the user can mark the messages as seen on another tab/device.

Unread counts are only stored and returned at connection time for channel members.

The markRead function can also be executed server-side by passing a user ID as shown in the example below:

// mark all messages on a channel as read (server side)
await channel.markRead({ user_id: 'foo' });

It’s also possible to mark an already read message as unread:

channelController.markUnread(from: "message-id") { result in
  // …
}

The mark unread operation can also be executed server-side by passing a user ID:

await channel.markUnread({message_id: "<message_id>", user_id: "<user_id>"})

To support updating the unread count in real-time, you can listen to these events:

  • notification.message_new

  • notification.mark_read

  • notification.mark_unread

These two events include the fields total_unread_count and unread_channels. You can listen to them all at once like this:

let currentUserController = client.currentUserController()

class CurrentUserDelegate: CurrentChatUserControllerDelegate {
  func currentUserController(_ controller: CurrentChatUserController,
                didChangeCurrentUserUnreadCount: UnreadCount) {
    // handle unread count change
  }
}

// We need to keep a strong reference to delegate
// since controller only keeps a weak reference
let delegate = CurentUserDelegate()
currentUserController.delegate = delegate

currentUserController.synchronize()

Fetch Unread API

The unread endpoint can fetch unread counts server-side, eliminating the need for a client-side connection. It can also be used client-side without requiring a persistent connection to the chat service. This can be useful for including an unread count in notifications or for gently polling when a user loads the application to keep the client up to date without loading up the entire chat.

A user_id whose unread count is fetched through this method is automatically counted as a Monthly Active User. This may affect your bill.

const response = await client.getUnreadCount(userID);
console.log(response.total_unread_count); // total unread count for user
console.log(response.channels); // distribution of unread counts across channels
console.log(response.channel_type); // distribution of unread counts across channel types
console.log(response.total_unread_threads_count) // total unread threads
console.log(response.threads) // list of unread counts per thread

This endpoint will return the last 100 unread channels, they are sorted by last_message_at.

Batch Fetch Unread API

The batch unread endpoint works the same way as the non-batch version with the exception that it can handle multiple user IDs at once and that it is restricted to server-side only.

const response = await client.getUnreadCountBatch([userID1, userID2]);
console.log(response.counts_by_user[userID1].total_unread_count); // total unread count for userID1
console.log(response.counts_by_user[userID1].channels); // distribution of unread counts across channels for userID1
console.log(response.counts_by_user[userID1].channel_type); // distribution of unread counts across channel types for userID1
console.log(response.counts_by_user[userID1].total_unread_threads_count) // total unread threads count for userID1
console.log(response.counts_by_user[userID1].threads) // list of unread counts per thread for userID1

If a user ID is not returned in the response then the API couldnt find a user with that ID

© Getstream.io, Inc. All Rights Reserved.