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:

final response = await client.setUser(user, "{{ chat_user_token }}");

print("There are ${response.me.unreadChannels} unread channels");
print("There are ${response.me.totalUnreadCount} unread messages");

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:

await channel.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:

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

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:

client.on().where((Event event) => event.unreadChannels != null).listen((Event event) {
 print("Unread channels count changed to:${event.unreadChannels}");
});

client.on().where((Event event) => event.totalUnreadCount != null).listen((Event event) {
 print("Unread messages count changed to:${event.totalUnreadCount}");
});

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.