Indicators
The Stream Chat React SDK provides components for loading, errors, pagination, and typing indicators:
EmptyStateIndicator- used inMessageList,VirtualizedList, andChannelListcomponents and is rendered when there are no items to display.LoadingChannels- a fancy loading placeholder for theChannelListthat looks like a nice outline of a few preview components.LoadingErrorIndicator- displays an error when the channel query fails inChannel.LoadingIndicator- a simple loading spinner component. This component is used in various places in the SDK library when waiting for a response from the Stream Chat API. It can also be imported individually into a project for use in custom components.LoadMoreButton- a button for pagination when loading more items. Established via theLoadMorePaginatorcomponent and can be used standalone in a custom component.LoadMorePaginator- a paginator component that renders channels in theChannelList.TypingIndicator- lists users currently typing; rendered byMessageListandVirtualizedList
Best Practices
- Keep loading and empty states lightweight to avoid layout shifts.
- Use consistent error messaging across Channel and MessageList indicators.
- Prefer
LoadMorePaginatorfor standard pagination behavior. - Limit typing indicator visibility in busy channels.
- Override indicator components only for UX or brand alignment.
UI Customization
EmptyStateIndicator
You can override this indicator in the ChannelList via the EmptyStateIndicator prop. Use the EmptyStateIndicator prop on Channel to override in the MessageList and VirtualizedList components.
LoadingErrorIndicator
Override this component to display an error message in a way that fits your requirements via the LoadingErrorIndicator prop on Channel.
LoadingIndicator
Override this component in MessageList and VirtualizedList using the LoadingIndicator prop on Channel. This injects the value into ComponentContext for list rendering.
LoadMorePaginator and LoadMoreButton
Override this component in ChannelList using the Paginator prop. You can also customize LoadMoreButton on your custom paginator.
TypingIndicator
Override this component via the TypingIndicator prop on Channel, which injects it into ComponentContext for list rendering.
EmptyStateIndicatorProps
listType
The type of list that will display this indicator, and this type will conditionally render a message.
| Type |
|---|
| 'channel' | 'message' | 'thread' |
LoadingErrorIndicatorProps
error
The error object that is displayed.
| Type |
|---|
| Error |
LoadingIndicatorProps
color
Set the color of the loading icon.
| Type | Default |
|---|---|
| string | #006CFF |
size
The size of the loading icon.
| Type | Default |
|---|---|
| number | 15px |
LoadMoreButtonProps
onClick
The onClick handler. Pagination logic should be executed in this handler.
| Type |
|---|
| React.MouseEventHandler<HTMLButtonElement> |
refreshing
If true, the LoadingIndicator is displayed instead of button.
| Type |
|---|
| boolean |
LoadMorePaginatorProps
loadNextPage
Callback to load the next page, required.
| Type |
|---|
| () => void |
hasNextPage
Boolean for if there is a next page to load.
| Type |
|---|
| boolean |
LoadMoreButton
A UI button component that handles pagination logic.
| Type | Default |
|---|---|
| component | LoadMoreButton |
refreshing
A boolean to indicate if there is currently any refreshing taking place.
| Type |
|---|
| boolean |
reverse
A boolean that indicates if the LoadMoreButton should be displayed at the top of the list of channels instead of the bottom of the list (the default).
| Type |
|---|
| boolean |
TypingIndicatorProps
Avatar
Custom UI component to display user's avatar.
| Type | Default |
|---|---|
| component | Avatar |
threadList
Boolean that signals whether the typing indicator is in a Thread.
| Type |
|---|
| boolean |