import { StreamChat } from 'stream-chat';
import { ChannelList, Chat, OverlayProvider } from 'stream-chat-react-native';
const client = StreamChat.getInstance('api_key');
const filters = { members: { $in: [ 'vishal', 'lucas', 'neil' ] } };
const sort = { last_updated: -1 };
const options = { limit: 20, messages_limit: 30 };
export const App = () => <OverlayProvider>
<Chat client={client}>
<ChannelList
filters={filters}
sort={sort}
options={options}
onSelect={(channel) => /** navigate to channel screen */ }
/>
</Chat>
</OverlayProvider>;
ChannelList
The ChannelList
displays a list of channels using React Native’s FlatList
component.
ChannelList
internally fetches a list of channels using the client’s query channels function; to which you can pass the filters
, sort
and options
parameters via props on ChannelList
.
When a user presses on a channel in the list you can provide navigation logic via the onSelect
prop to navigate to the selected channel.
General Usage
The ChannelList
can be used to display the all the participants in the form of FlatList.
Note: The component should be defined within the
OverlayProvider
andChat
wrappers so that all the contexts are provided to the component internally.
When receiving channel information from channel events, the filters are not respected; the reason for this is that channel filters can get very complex, and implementing that filtering logic that supports all of the custom filter would be very hard to do. Implementing this on the backend side isn’t an option as it is inefficient and has to cater to different filters. So, to help you with it, you will have to override the notification.message_new
event using the onNewMessageNotification
and message.new
event handlers using the onNewMessage
prop of the ChannelList
component.
Context Providers
ChannelList
contains the provider for the ChannelsContext
. This can be accessed using the corresponding hook.
Context | Hook |
---|---|
ChannelsContext | useChannelsContext |
Props
filters
Filter object passed internally to the client query function as a parameter. You can filter a query on built-in and custom fields on a Channel.
For optimal performance you should pass a filter object with a static reference. You can use a filter object that is not created inline; or memoize an inline filter object before passing it to the ChannelList
to achieve this.
Type |
---|
Object |
sort
Sort object passed internally to the client query function as a parameter. You can sort a query on built-in and custom fields on a Channel.
For optimal performance you should pass a sort object with a static reference. You can use a sort object that is not created inline; or memoize an inline sort object before passing it to the ChannelList
to achieve this.
Type |
---|
Object |
options
Options object passed internally to the client query function as a parameter.
Type |
---|
Object |
onSelect
Function called when a user presses an item in the ChannelList
. The function is called with the Channel
instance corresponding to the list item as the only parameter. This callback is often used for navigating to a channel screen.
A Channel
instance is not serializable and will therefore raise warnings if passed as a parameter through navigation to another screen.
Type |
---|
(channel) ⇒ void |
additionalFlatListProps
Additional props provided to the underlying FlatList.
Type |
---|
Object |
loadMoreThreshold
Sets the onEndReachedThreshold
of the underlying FlatList
. We recommend using 0.1
as the default value for this prop, as changing it might hit additional channelQuery
calls, and you might reach the limit.
Type | Default |
---|---|
Number | 0.1 |
lockChannelOrder
Locks the order of the channels in the list so they will not dynamically reorder by most recent message when a new message is received.
Type | Default |
---|---|
Boolean | false |
maxUnreadCount
Max number to display within unread notification badge. The value cannot be higher than 255, which is the limit on backend side.
Type | Default |
---|---|
Number | 255 |
numberOfSkeletons
The number of Skeleton
items to display in the LoadingIndicator
.
Type | Default |
---|---|
Number | 6 |
onAddedToChannel
Override for the default Event Listener behavior when the user is added to a channel. The default behavior adds the channel to the list.
Type |
---|
Function |
Parameter | Description |
---|---|
setChannels | Setter function for the internal channels state |
event | Event Object corresponding to notification.added_to_channel |
options | ChannelListEventListenerOptions object |
onChannelDeleted
Override for the default Event Listener behavior when a channel is deleted. The default behavior removes the channel from the list.
Type |
---|
Function |
Parameter | Description |
---|---|
setChannels | Setter function for the internal channels state |
event | Event Object corresponding to channel.deleted |
onChannelHidden
Override for the default Event Listener behavior when a channel is hidden. The default behavior removes the channel from the list.
Type |
---|
Function |
Parameter | Description |
---|---|
setChannels | Setter function for the internal channels state |
event | Event Object corresponding to channel.deleted |
onChannelMemberUpdated
Override for the default Event Listener behavior when a channel member is updated i.e., member.updated
event is received. This is essential for channel pinning and archiving to work.
Type |
---|
Function |
Parameter | Description |
---|---|
lockChannelOrder | Locks the order of the channels in the list so they will not dynamically reorder by most recent message when a new message is received. |
setChannels | Setter function for the internal channels state. |
event | Event Object corresponding to message.new. |
options | ChannelListEventListenerOptions object |
onChannelVisible
Override for the default Event Listener behavior when a channel is made visible. The default behavior adds the channel to the list.
Type |
---|
Function |
Parameter | Description |
---|---|
setChannels | Setter function for the internal channels state |
event | Event Object corresponding to channel.deleted |
onChannelTruncated
Override for the default Event Listener behavior when a channel is truncated. The default behavior reloads the list.
Type |
---|
Function |
Parameter | Description |
---|---|
setChannels | Setter function for the internal channels state |
event | Event Object corresponding to channel.deleted |
onChannelUpdated
Override for the default Event Listener behavior when a channel is updated. The default behavior updates the data
on a channel with that from the event.
Type |
---|
Function |
Parameter | Description |
---|---|
setChannels | Setter function for the internal channels state |
event | Event Object corresponding to channel.deleted |
onNewMessageNotification
Override for the default Event Listener behavior when a message is received on a channel that is not being watched. The default behavior adds the channel to the list.
Type |
---|
Function |
Parameter | Description |
---|---|
setChannels | Setter function for the internal channels state |
event | Event Object corresponding to channel.deleted |
options | ChannelListEventListenerOptions object |
onNewMessage
Override for the default Event Listener behavior when a message is received on a channel that is being watched. The default behavior moves the channel to the top of the list.
Type |
---|
Function |
Parameter | Description |
---|---|
lockChannelOrder | Locks the order of the channels in the list so they will not dynamically reorder by most recent message when a new message is received. |
setChannels | Setter function for the internal channels state. |
event | Event Object corresponding to message.new. |
options | ChannelListEventListenerOptions object |
onRemovedFromChannel
Override for the default Event Listener behavior when the user is removed from a channel. The default behavior removes the channel from the list.
Type |
---|
Function |
Parameter | Description |
---|---|
setChannels | Setter function for the internal channels state. |
event | Event Object corresponding to channel.deleted. |
setFlatlistRef
Callback function to access the underlying FlatList ref.
Type |
---|
(ref) ⇒ void |
queryChannelsOverride
A function that overrides the default ChannelManager
’s queryChannels
method, which is StreamChat.queryChannels
.
It is particularly useful whenever we want to pass specific cid
s that we want to query but also want to
paginate over them (which is not possible through normal filters
). It comes with with several rules/assumptions:
StreamChat.queryChannels
has to be called inside ofqueryChannelsOverride
(as it updates importantStreamChat
state)- The return type has to be
Channel[]
(which is the return type ofStreamChat.queryChannels
) - The
limit
andoffset
properties need to still be respected (where applicable) so that the underlyingChannelManager
knows how to paginate properly under the hood
Type |
---|
QueryChannelsRequestType |
This prop is available since version 8.2.0
.
The filters
and sort
properties passed to ChannelList
are expected to still be stable and memoized; in other words, do not change filters
in order to pass a different set of cid
s but rather let the queryChannelsOverride
implementation handle that internally (based on the pagination parameters the ChannelManager
calculates internally).
Provided below is an example of what the override might look like:
const cids = Array.from({ length: 25 }, (_, i) => (i + 1).toString());
const queryChannelsOverride = (filters, sort, options, ...restParams) => {
const { limit, offset } = options;
const cidWindow = cids.slice(offset, offset + limit);
const newFilters = { ...filters, cid: { $in: cidWindow } };
return chatClient.queryChannels(newFilters, sort, options, ...restParams);
};
Given the following ChannelList
configuration:
// ... rest of the component
const filters = useMemo(() => ({}), []);
const options = useMemo(() => ({ offset: 0, limit: 10 }));
return <ChannelList filters={stableFilters} options={options} />;
the loading of the pages would work as follows:
- On the first page, 10 items will be loaded, which will be the first 10
cid
s - On the second page,
queryChannelsOverride
will be invoked withoffset: 10
andlimit: 10
, socid
s10
through19
will be loaded - On the last page,
queryChannelsOverride
will be invoked withoffset: 10
andlimit: 10
, and so our implementation will return the last 5cid
s (and theChannelManager
will at this point determine there are no pages left)
UI Component Props
EmptyStateIndicator
Rendered when the channel list is empty and not loading via the ListEmptyComponent
prop on the FlatList
.
Type | Default Value |
---|---|
ComponentType | undefined | EmptyStateIndicator |
FooterLoadingIndicator
Rendered when loadingNextPage
from ChannelsContext
is true via the ListFooterComponent
prop on the FlatList
.
Type | Default Value |
---|---|
ComponentType | undefined | ChannelListFooterLoadingIndicator |
HeaderErrorIndicator
Rendered when error
from ChannelsContext
is true.
Type | Default |
---|---|
ComponentType | undefined | ChannelListHeaderErrorIndicator |
HeaderNetworkDownIndicator
Rendered when isOnline
from ChatContext
is false.
Type | Default |
---|---|
ComponentType | undefined | ChannelListHeaderNetworkDownIndicator |
List
Component to render the list of channels.
Type | Default |
---|---|
ComponentType | undefined | ChannelListMessenger |
ListHeaderComponent
Rendered when provided if the channel list is not empty via the ListHeaderComponent
prop on the FlatList
.
Type |
---|
ComponentType |undefined |
LoadingErrorIndicator
Rendered when error
from ChannelsContext
is true, and the channel list is empty and not loading.
Type | Default |
---|---|
ComponentType | undefined | LoadingErrorIndicator |
LoadingIndicator
Rendered when the channel list is empty and loading via the ListEmptyComponent prop on the FlatList.
Type | Default |
---|---|
ComponentType | undefined | ChannelListLoadingIndicator |
Preview
List item rendered by the underlying FlatList
.
Type | Default |
---|---|
ComponentType | undefined | ChannelPreviewMessenger |
PreviewAvatar
Avatar component rendered within Preview
.
Type | Default |
---|---|
ComponentType | undefined | ChannelAvatar |
PreviewMessage
Message component rendered within Preview
.
Type | Default |
---|---|
ComponentType | undefined | ChannelPreviewMessage |
PreviewMutedStatus
Channel muted status component rendered within Preview
.
Type | Default |
---|---|
ComponentType | undefined | ChannelPreviewMutedStatus |
PreviewStatus
Status component rendered within Preview
.
Type | Default |
---|---|
ComponentType | undefined | ChannelPreviewStatus |
PreviewTitle
Title component rendered within Preview
.
Type | Default |
---|---|
ComponentType | undefined | ChannelPreviewTitle |
PreviewUnreadCount
Unread count component rendered within Preview
.
Type | Default |
---|---|
ComponentType | undefined | ChannelPreviewUnreadCount |
Skeleton
Row item rendered in the LoadingIndicator
.
Type | Default |
---|---|
ComponentType | undefined | Skeleton |
Channel List Event Listener Options
filters
Filter object passed internally to the client query function as a parameter. You can filter a query on built-in and custom fields on a Channel.
Type |
---|
Object |
sort
Sort object passed internally to the client query function as a parameter. You can sort a query on built-in and custom fields on a Channel.
Type |
---|
Object |
- General Usage
- Context Providers
- Props
- filters
- sort
- options
- onSelect
- additionalFlatListProps
- loadMoreThreshold
- lockChannelOrder
- maxUnreadCount
- numberOfSkeletons
- onAddedToChannel
- onChannelDeleted
- onChannelHidden
- onChannelMemberUpdated
- onChannelVisible
- onChannelTruncated
- onChannelUpdated
- onNewMessageNotification
- onNewMessage
- onRemovedFromChannel
- setFlatlistRef
- queryChannelsOverride
- UI Component Props
- Channel List Event Listener Options