Skip to content
Info:
This is documentation for Stream Chat React SDK v13, which is no longer actively maintained. For up-to-date documentation, see the latest version (v14).

Channel

The Channel component wraps the logic, state, and UI for a single chat channel. It provides four contexts to its children:

Best Practices

  • Use ChannelList to manage active channels unless you need custom switching logic.
  • Pass the channel prop only when you control selection; avoid it when using ChannelList.
  • Keep component overrides focused on UI, and reuse default behaviors where possible.
  • Set channelQueryOptions intentionally to balance initial load time and message history.
  • Access context via hooks inside Channel children to avoid stale or missing data.
Note:

Channel renders a single channel object. For details about channel objects, see the JavaScript docs.

Basic Usage

Channel doesn’t render UI on its own. You can use it with or without ChannelList:

  • If you use ChannelList, don’t pass a channel prop—ChannelList sets the active channel.
  • If you don’t use ChannelList, you must pass the channel prop.

Example 1 - without ChannelList

<Chat client={client}>
  <Channel channel={channel}>
    <MessageList />
    <MessageInput />
  </Channel>
</Chat>

Example 2 - with ChannelList

<Chat client={client}>
  <ChannelList />
  <Channel>
    <MessageList />
    <MessageInput />
  </Channel>
</Chat>

Any child of Channel can access these contexts via hooks:

const { messages } = useChannelStateContext();
const { sendMessage } = useChannelActionContext();
const { Avatar } = useComponentContext();
const { typing } = useTypingContext();

Registering Custom Components

To customize UI, pass custom components as Channel props. Any TitleCase prop overrides the SDK default. See the full list in the ComponentContext docs.

Example of registering custom Avatar component

import {
  Channel,
  ChannelList,
  Chat,
  MessageInput,
  MessageList,
} from "stream-chat-react";
import { CustomTooltip } from "../Tooltip/CustomTooltip";

const Avatar = ({ image, title }) => {
  return (
    <>
      <CustomTooltip>{title}</CustomTooltip>
      <div className="avatar-image">
        <img src={image} alt={title} />
      </div>
    </>
  );
};

export const App = (
  <Chat client={client}>
    <ChannelList />
    <Channel Avatar={Avatar}>
      <MessageList />
      <MessageInput />
    </Channel>
  </Chat>
);

Props

channel

The currently active StreamChat channel instance to be loaded into the Channel component and referenced by its children.

const channel = client.channel("messaging", {
  members: ["nate", "roy"],
});
Warning:

Do not provide this prop if you are using the ChannelList component, as it handles channel setting logic.

Type
object

activeUnreadHandler

Custom handler function that runs when the active channel has unread messages and the app is running on a separate browser tab.

Type
(unread: number, documentTitle: string) => void

allowConcurrentAudioPlayback

Allows multiple audio players to play the audio at the same time. Disabled by default. Present since v13.12.0.

Type
boolean

Attachment

Custom UI component to display a message attachment.

Type Default
component Attachment

AttachmentPreviewList

Custom UI component to display an attachment previews in MessageInput.

Type Default
component AttachmentPreviewList

AttachmentSelector

Custom UI component to control adding attachments to MessageInput, defaults to and accepts same props as:

Type Default
component AttachmentSelector

AttachmentSelectorInitiationButtonContents

Custom UI component for contents of attachment selector initiation button.

Type
component

AudioRecorder

Custom UI component to display AudioRecorder in MessageInput.

Type Default
component AudioRecorder

AutocompleteSuggestionItem

Custom UI component to override the default suggestion Item component.

Type Default
component SuggestionListItem

AutocompleteSuggestionList

Custom UI component to override the default List component that displays suggestions.

Type Default
component SuggestionList

Avatar

Custom UI component to display a user's avatar.

Type Default
component Avatar

channelQueryOptions

Optional configuration parameters used for the initial channel query. Applied only if the value of channel.initialized is false. If the channel instance has already been initialized (channel has been queried), then the channel query will be skipped and channelQueryOptions will not be applied.

In the example below, we specify, that the first page of messages when a channel is queried should have 20 messages (the default is 100). Note that the channel prop has to be passed along channelQueryOptions.

import { ChannelQueryOptions } from "stream-chat";
import { Channel, useChatContext } from "stream-chat-react";

const channelQueryOptions: ChannelQueryOptions = {
  messages: { limit: 20 },
};

type ChannelRendererProps = {
  id: string;
  type: string;
};

const ChannelRenderer = ({ id, type }: ChannelRendererProps) => {
  const { client } = useChatContext();
  return (
    <Channel
      channel={client.channel(type, id)}
      channelQueryOptions={channelQueryOptions}
    >
      {/* Channel children */}
    </Channel>
  );
};
Type
ChannelQueryOptions

CooldownTimer

Custom UI component to display the slow mode cooldown timer.

Type Default
component CooldownTimer

DateSeparator

Custom UI component for date separators.

Type Default
component DateSeparator

doDeleteMessageRequest

Custom action handler to override the default client.deleteMessage(message.id) function.

Type
(message: LocalMessage) => Promise<MessageResponse>

The function can execute different logic for message replies compared to messages in the main message list based on the parent_id property of LocalMessage object:

import { Channel } from 'stream-chat-react';
import type { LocalMessage } from 'stream-chat';

const doDeleteMessageRequest = async (message: LocalMessage) => {
    if (message.parent_id) {
        // do something before / after deleting a message reply
    } else {
        // do something before / after deleting a message
    }
}

const App = () => (
  {/* more components */}
    <Channel doDeleteMessageRequest={ doDeleteMessageRequest }>
        {/* more components */}
    </Channel>
  {/* more components */}
);

doMarkReadRequest

Custom action handler to override the default channel.markRead request function (advanced usage only). The function takes two arguments:

Argument Type Description
channel Channel The current channel object instance
setChannelUnreadUiState (state: ChannelUnreadUiState) => void Function that allows us to set the unread state for the components reflecting the unread message state.
Type
function

doSendMessageRequest

Custom action handler to override the default channel.sendMessage request function (advanced usage only).

Type
function

doUpdateMessageRequest

Custom action handler to override the default client.updateMessage request function (advanced usage only).

Type
function

EditMessageInput

Custom UI component to override default edit message input.

Type Default
component EditMessageForm

EditMessageModal

Custom UI component to override default EditMessageModal component. It is useful when we want to override additionalMessageInputProps, e.g. number of rows in the textarea:

import {
  Channel,
  EditMessageModal,
  EditMessageModalProps,
} from "stream-chat-react";

const CustomEditMessageModal = (props: EditMessageModalProps) => (
  <EditMessageModal
    additionalMessageInputProps={{
      ...props.additionalMessageInputProps,
      maxRows: 10,
    }}
  />
);
const Component = ({ children }) => (
  <Channel EditMessageModal={CustomEditMessageModal}>{children}</Channel>
);
Type Default
component EditMessageModal

emojiSearchIndex

Custom search mechanism instance or object to enable emoji autocomplete.

Type Default
object undefined

EmojiPicker

Custom UI component to be rendered in the MessageInput component, see Emoji Picker guide for more information.

Type Default
component undefined

EmptyPlaceholder

Custom UI component to be shown if no active channel is set, defaults to null and skips rendering the Channel component.

Type Default
component null

EmptyStateIndicator

Custom UI component to be displayed when the MessageList or VirtualizedMessageList is empty.

Type Default
component EmptyStateIndicator

FileUploadIcon

Custom UI component for file upload icon.

Type Default
component FileUploadIcon

GiphyPreviewMessage

Custom UI component to render a Giphy preview in the VirtualizedMessageList.

Type Default
component GiphyPreviewMessage

giphyVersion

The Giphy version to render - check the keys of the Image Object for possible values.

Type Default
string 'fixed_height'

HeaderComponent

Custom UI component to render at the top of the MessageList.

Type Default
component none

imageAttachmentSizeHandler

A custom function to provide size configuration for image attachments

Type
(a: Attachment, e: HTMLElement) => ImageAttachmentConfiguration

initializeOnMount

Allows to prevent triggering the channel.watch() (triggers channel query HTTP request) call when mounting the Channel component (the default behavior) with uninitialized (channel.initialized) Channel instance. That means that no channel data from the back-end will be received neither channel WS events will be delivered to the client. Preventing to initialize the channel on mount allows us to postpone the channel creation in the Stream's DB to a later point in time, for example, when a first message is sent:

import { useCallback } from 'react';
import {
  getChannel,
  MessageInput as StreamMessageInput,
  MessageInputProps,
  useChannelActionContext,
  useChatContext,
} from 'stream-chat-react';
import type { Message, LocalMessage, SendMessageOptions } from 'stream-chat';

import { useChannelInitContext } from '../../context/ChannelInitProvider';

export const MessageInput = (props: MessageInputProps) => {
  const { client } = useChatContext();
  const { sendMessage } = useChannelActionContext();
  const { setInitializedChannelOnMount } = useChannelInitContext();

  const submitHandler: MessageInputProps['overrideSubmitHandler'] = useCallback(
    async (params: {
      cid: string;
      localMessage: LocalMessage;
      message: Message;
      sendOptions: SendMessageOptions;
    }) => {
      const [channelType, channelId] = cid.split(':');
      const channel = client.channel(channelType, channelId);
      if (!channel.initialized) {
        await getChannel({ channel, client });
        setInitializedChannelOnMount(true);
      }

      await sendMessage({localMessage, message, options: sendOptions});
    },
    [client, sendMessage, setInitializedChannelOnMount],
  );

  return <StreamMessageInput {...props} overrideSubmitHandler={submitHandler} />;
};
Type Default
boolean true

Input

Custom UI component handling how the message input is rendered.

Type Default
component MessageInputFlat

LinkPreviewList

Custom component to render link previews in MessageInput.

Type Default
component LinkPreviewList

LoadingErrorIndicator

Custom UI component to be shown if the channel query fails.

Type Default
component LoadingErrorIndicator

LoadingIndicator

Custom UI component to render while the MessageList is loading new messages.

Type Default
component LoadingIndicator

markReadOnMount

Configuration parameter to mark the active channel as read when mounted (opened). By default, the channel is marked read on mount.

Type Default
boolean true

Message

Custom UI component to display a message in the standard MessageList.

Type Default
component MessageSimple

MessageActions

Custom UI component for message actions popup, accepts no props, all the defaults are set within MessageActions (unstable).

Type Default
component MessageActions (unstable)

MessageBlocked

Custom UI component for a moderation-blocked message, defaults to and accepts same props as: MessageBlocked

Type Default
component MessageBlocked

MessageBouncePrompt

Custom UI component for the content of the modal dialog for messages that got bounced by the moderation rules.

Type Default
component MessageBouncePrompt

MessageDeleted

Custom UI component for a deleted message.

Type Default
component MessageDeleted

MessageListNotifications

Custom UI component that displays message and connection status notifications in the MessageList.

Type Default
component DefaultMessageListNotifications

MessageNotification

Custom UI component to display a notification when scrolled up the list and new messages arrive.

Type Default
component MessageNotification

MessageOptions

Custom UI component for message options popup.

Type Default
component MessageOptions

MessageRepliesCountButton

Custom UI component to display message replies.

Type Default
component MessageRepliesCountButton

MessageStatus

Custom UI component to display message delivery status.

Type Default
component MessageStatus

MessageSystem

Custom UI component to display system messages.

Type Default
component EventComponent

MessageTimestamp

Custom UI component to display a timestamp on a message. This does not include a timestamp for edited messages.

Type Default
component MessageTimestamp

See also Timestamp.

Custom UI component for viewing content in a modal, defaults to and accepts the same props as Modal.

It is possible to override the default Modal component with GlobalModal to have the content displayed via React portal at the top of the Chat components tree:

import { GlobalModal } from "stream-chat-react";

const Component = () => <Channel Modal={GlobalModal}></Channel>;

Using the GlobalModal prevents UI glitches in some browsers (e.g. Safari cutting of the modal overlay to the dimensions of the message list).

Type Default
component Modal

ModalGallery

Custom UI component for viewing message's image attachments.

Type Default
component ModalGallery

onMentionsClick

Custom action handler function to run on click of an @mention in a message.

Type
function

onMentionsHover

Custom action handler function to run on hover of an @mention in a message.

Type
function

PinIndicator

Custom UI component to override default pinned message indicator.

Type Default
component PinIndicator

PollActions

Custom UI component to override default poll actions rendering in a message.

Type Default
component PollActions

PollContent

Custom UI component to override default poll rendering in a message.

Type Default
component PollContent

PollCreationDialog

Custom UI component to override default poll creation dialog contents.

Type Default
component PollCreationDialog

PollHeader

Custom UI component to override default poll header in a message.

Type Default
component PollHeader

PollOptionSelector

Custom UI component to override default poll option selector.

Type Default
component PollOptionSelector

QuotedMessage

Custom UI component to override quoted message UI on a sent message.

Type Default
component QuotedMessage

QuotedMessagePreview

Custom UI component to override the message input's quoted message preview.

Type Default
component QuotedMessagePreview

QuotedPoll

Custom UI component to override the rendering of quoted poll.

Type Default
component QuotedPoll

ReactionSelector

Custom UI component to display the reaction selector.

Type Default
component ReactionSelector

ReactionsList

Custom UI component to display the list of reactions on a message.

Type Default
component ReactionsList

ReactionsListModal

Custom UI component to display the modal with detailed listing of reactions. The modal is rendered upon clicking on the ReactionsList.

Type Default
component ReactionsList

ReminderNotification

Custom UI component to display the message reminder information in the Message UI component.

Type Default
component ReminderNotification

SendButton

Custom UI component for send button.

Type Default
component SendButton

shouldGenerateVideoThumbnail

You can turn on/off thumbnail generation for video attachments

Type
boolean

skipMessageDataMemoization

If true, skips the message data string comparison used to memoize the current channel messages (helpful for channels with 1000s of messages).

Type Default
boolean false

TextareaComposer

Custom UI component to handle message text input

Type Default
component TextareaComposer

ThreadHead

Custom UI component to be displayed at the beginning of a thread. By default, it is the thread parent message. It is composed of Message context provider component and ThreadStart component. The latter can be customized by passing custom component to Channel props. The ThreadHead component defaults to and accepts the same props as MessageSimple.

Type Default
component ThreadHead

ThreadHeader

Custom UI component to display the header of a Thread.

Type Default
component DefaultThreadHeader

ThreadInput

Custom UI component to replace the MessageInput of a Thread. The component uses MessageInputFlat by default.

Type Default
component MessageInputFlat

ThreadStart

Custom UI component to display the start of a threaded MessageList.

Type Default
component DefaultThreadStart

Timestamp

Custom UI component to display a date used in timestamps. It's used internally by the default MessageTimestamp, and to display a timestamp for edited messages.

Type Default
component Timestamp

TypingIndicator

Custom UI component for the typing indicator.

Type Default
component TypingIndicator

UnreadMessagesNotification

Custom UI component that indicates a user is viewing unread messages. It disappears once the user scrolls to UnreadMessagesSeparator.

Type Default
component UnreadMessagesNotification

UnreadMessagesSeparator

Custom UI component inserted before the first message marked unread.

Type Default
component UnreadMessagesSeparator

videoAttachmentSizeHandler

A custom function to provide size configuration for video attachments

Type
(a: Attachment, e: HTMLElement) => VideoAttachmentConfiguration

VirtualMessage

Custom UI component to display a message in the VirtualizedMessageList.

Type Default
component MessageSimple

StreamedMessageText

Custom UI component to display an AI generated message.

Type Default
component StreamedMessageText

StopAIGenerationButton

Custom UI component to display the button to stop AI generation instead of the SendButton one in MessageInput.

Type Default
component StopAIGenerationButton