This is beta documentation for Stream Chat React Native SDK v9. For the latest stable version, see the latest version (v8) .

Channel

Channel is the main entry point for customization and hosts most of the contexts and logic used by the React Native SDK. MessageList, MessageInput, and Thread require it.

Best Practices

  • Create and watch channels once, then reuse the instance across renders.
  • Render Channel under OverlayProvider and Chat to ensure all contexts are available.
  • Customize UI by replacing specific components instead of re-implementing core logic.
  • Keep custom components lightweight to avoid performance regressions in lists.
  • Use channel props for behavior changes before reaching for custom overrides.

Basic Usage

Channel takes a StreamChat channel instance. Create one via creating channels or read it from ChannelList via the onSelect callback.

import { useEffect, useState } from "react";
import { StreamChat } from "stream-chat";
import {
  Channel,
  Chat,
  MessageInput,
  MessageList,
  OverlayProvider,
} from "stream-chat-react-native";

const client = StreamChat.getInstance("api_key");

export const App = () => {
  const [channel, setChannel] = useState();

  useEffect(() => {
    const createAndWatchChannel = async () => {
      const newChannel = client.channel("messaging", "channel_id");
      await newChannel.watch();
      setChannel(newChannel);
    };

    createAndWatchChannel();
  }, []);

  return (
    <OverlayProvider>
      <Chat client={client}>
        <Channel channel={channel}>
          <MessageList />
          <MessageInput />
        </Channel>
      </Chat>
    </OverlayProvider>
  );
};

Context Providers

Channel provides ChannelContext, KeyboardContext, MessageInputContext, MessagesContext, PaginatedMessageListContext, AttachmentPickerContext, MessageComposerContext, ThreadContext, and TypingContext via their hooks.

ContextHook
ChannelContextuseChannelContext
KeyboardContextuseKeyboardContext
MessageInputContextuseMessageInputContext
MessagesContextuseMessagesContext
PaginatedMessageListContextusePaginatedMessageListContext
AttachmentPickerContextuseAttachmentPickerContext
MessageComposerContextuseMessageComposerAPIContext
ThreadContextuseThreadContext
TypingContextuseTypingContext

UI Customizations

Channel is the entry point for most UI customization. Replace components via props and they will be used throughout the SDK where applicable.

Customizing the message avatar can be done easily by providing a custom component to the appropriate prop.

import { Image } from "react-native";
import { Channel, useMessageContext } from "stream-chat-react-native";

const CustomAvatar = () => {
  const { message } = useMessageContext();

  return <Image source={{ uri: message.user?.image }} />;
};

<Channel MessageAvatar={CustomAvatar} />;

Props

channel

Channel instance from the Stream Chat client.

keyboardVerticalOffset

Distance from the top of the screen to the top of the Channel component (often your header height).

Type
number

additionalKeyboardAvoidingViewProps

Extra props passed to KeyboardAvoidingView.

Type
Object

additionalTextInputProps

Extra props passed to the underlying TextInput in MessageInput.

Type
object

additionalPressableProps

Extra props passed to the underlying Pressable used in message components like MessageContent.

Type
object

allowConcurrentAudioPlayback

Allow multiple audio players to play at once.

TypeDefault
Booleanfalse

allowSendBeforeAttachmentsUpload

When enabled, the user can send a message before all attachments have finished uploading. Defaults to the value of enableOfflineSupport from the Chat component.

Type
Boolean

allowThreadMessagesInChannel

Show the Show thread message in channel button in thread MessageInput.

TypeDefault
booleantrue

asyncMessagesLockDistance

Pixels the user must drag upward to lock recording and lift their finger without stopping it.

TypeDefault
Number50

asyncMessagesMinimumPressDuration

Minimum press duration (ms) on the record button to start voice recording.

TypeDefault
Number500

asyncMessagesMultiSendEnabled

When enabled, recordings don't send immediately. They stack in the composer so users can send multiple voice recordings in one message.

TypeDefault
Booleantrue

asyncMessagesSlideToCancelDistance

Pixels the user must drag toward the leading side to cancel voice recording.

TypeDefault
Number75

audioRecordingEnabled

Enable or disable audio recording.

TypeDefault
Booleanfalse

attachmentPickerBottomSheetHeight

Height of the attachment picker bottom sheet when open.

TypeDefault
Number333

attachmentSelectionBarHeight

Height of the attachment selection bar in the attachment picker.

TypeDefault
Number72

bottomInset

Height of items located below the MessageInput when present. This inset determines the underlying shift to the MessageList when it is opened.

This can also be set via the setBottomInset function provided by the useAttachmentPickerContext hook.

TypeDefault
Number0

compressImageQuality

Image compression quality before upload.

On iOS, values >= 0.8 usually keep quality while reducing size. A value of 0.8 can roughly halve file size vs 1.0.

TypeDefault
number 0 to 1
(1 is best quality)
iOS: 0.8
Android: 1

createPollOptionGap

Gap between options in the poll creation dialog.

TypeDefault
Number8

customMessageSwipeAction

Custom action executed when the user swipes a message.

TypeDefault
({channel, message}: {channel: Channel, message: LocalMessage}) => voidThe default action is swipe to reply.

deletedMessagesVisibilityType

Controls visibility of deleted messages in the channel.

  • always: Visible to both sender and receiver.
  • never: Visible to no one.
  • sender: Visible only to the sender.
  • receiver: Visible only to the receiver.
TypeDefault
enum('always', 'never', 'receiver', 'sender')'always'

disableAttachmentPicker

When true, the attachment picker is hidden. Defaults to true when the image media library is not available.

Type
Boolean

disableKeyboardCompatibleView

Enable or disable the underlying KeyboardAvoidingView.

TypeDefault
booleanfalse

disableTypingIndicator

Disable the typing indicator in MessageList.

TypeDefault
booleanfalse

dismissKeyboardOnMessageTouch

Dismiss the keyboard when the user touches a message in the list.

TypeDefault
booleantrue

doFileUploadRequest

Override the file upload request when a user selects a file. Must return a Promise.

Use this to store files in your own CDN.

Type
Function

This matches the definition of UploadRequestFn from the stream-chat package.

export type UploadRequestFn = (
  fileLike: FileReference | FileLike,
) => Promise<MinimumUploadRequestResult>;

doMarkReadRequest

Override the mark read request.

This prop should only be used for advanced functionality in which you want to conditionally allow mark-read requests.

Do not use this function to disable read receipts. If you would like to disable read-receipts, this can be done via Read Events on the dashboard.

Example

const doMarkReadRequest = (channel) => {
  if (/** Some custom logic here */) {
    channel.markRead();
  }
};
Type
Function
ParameterDescription
channelchannel instance
setChannelUnreadUiState | undefined(state) =>void

doSendMessageRequest

Override the send message request. This function must return a Promise equivalent to client.sendMessage.

Use this only if you need to alter the message object before sending.

Example

const doSendMessageRequest = (channelId, messageObject) => {
  if (/** Some custom logic here */) {
    messageObject.isSpecial = true;
  }
  return channel.sendMessage(messageObject);
}
Type
function
ParameterDescription
channelIdstring
messageObjectobject
optionsobject | undefined

preSendMessageRequest

A method invoked just after the first optimistic update of a new message, but before any other HTTP requests happen. Can be used to do extra work (such as creating a channel, or editing a message) before the local message is sent.

Type
function
ParameterDescription
options.localMessageThe local message object (LocalMessage)
options.messageThe message payload (StreamMessage)
options.optionsOptional send message options (SendMessageOptions)

doUpdateMessageRequest

Override the update message request. This function must return a Promise equivalent to client.updateMessage.

Use this only if you need to alter the message object before updating.

const doUpdateMessageRequest = (channelId, messageObject) => {
  const numberOfUpdates = (messageObject.numberOfUpdates ?? 0) + 1;
  const messageToSend = { ...messageObject, numberOfUpdates };
  return client.updateMessage(messageToSend);
};
Type
function
ParameterDescription
channelIdstring
messageObjectobject
optionsobject | undefined

enableMessageGroupingByUser

If false, consecutive messages from the same user won't be grouped.

TypeDefault
booleantrue

enableSwipeToReply

If true, users can swipe to reply to a message.

TypeDefault
Booleantrue

enforceUniqueReaction

Limits reactions to one per user. Selecting a new reaction replaces the previous one (similar to iMessage).

TypeDefault
booleanfalse

forceAlignMessages

Forces all messages to align left or right. By default, received messages are left and sent messages are right.

TypeDefault
'left' | 'right' | falsefalse

getMessageGroupStyle

Messages are grouped so UI elements like avatars only appear for the last message in a group. Messages are grouped when the same user sends them within a time window (controlled by maxTimeBetweenGroupedMessages on Channel). Use getMessageGroupStyle to override group position logic (top, bottom, middle, single), which affects UI like timestamps and avatars.

Default logic lives in getGroupStyles. Access the computed styles via MessageContext.groupStyles in custom components.

Type
function

giphyVersion

Giphy image version to render. See the Image Object keys for options.

TypeDefault
string'fixed_height'

handleAttachButtonPress

Customize behavior when the AttachButton is pressed in the message input.

Type
() => void

handleBan

Called when the Ban User action is triggered. It does not override default behavior. See customize message actions.

Type
function
ParameterDescription
messagemessage the action is called on

handleBlockUser

Called when the Block User action is triggered. It does not override default behavior. See customize message actions.

Type
function
ParameterDescription
messagemessage the action is called on

handleCopy

Called when the Copy Message action is triggered. It does not override default behavior. See customize message actions.

Type
function
ParameterDescription
messagemessage the action is called on

handleDelete

Called when the Delete Message action is triggered. It does not override default behavior. See customize message actions.

Type
function
ParameterDescription
messagemessage the action is called on

handleDeleteForMe

Called when the Delete Message for me action is triggered. It does not override default behavior. See customize message actions.

Type
function
ParameterDescription
messagemessage the action is called on

handleEdit

Called when the Edit Message action is triggered. It does not override default behavior. See customize message actions.

Type
function
ParameterDescription
messagemessage the action is called on

handleFlag

Called when the Flag Message action is triggered. It does not override default behavior. See customize message actions.

Type
function
ParameterDescription
messagemessage the action is called on

handleMarkUnread

Called when the Mark Unread action is triggered. It does not override default behavior. See customize message actions.

Type
function
ParameterDescription
messagemessage the action is called on

handleMute

Called when the Mute User action is triggered from the message actions list. It does not override default behavior. See customize message actions.

Type
function
ParameterDescription
messagemessage the action is called on

handlePinMessage

Called when the Pin to Conversation or Unpin from Conversation action is triggered. It does not override default behavior. See customize message actions.

Type
function
ParameterDescription
messagemessage the action is called on

handleReaction

Called when a reaction is selected in the message menu (add or remove). It does not override default behavior. See customize message actions.

Type
Function
ParameterDescription
messageMessage the action is called on.
reactionTypeString designating the type of reaction.

handleQuotedReply

Called when the Reply action is triggered. It does not override default behavior. See customize message actions.

Type
function
ParameterDescription
messagemessage the action is called on

handleRetry

Called when the Retry action is triggered. It does not override default behavior. See customize message actions.

Type
function
ParameterDescription
messagemessage the action is called on

handleThreadReply

Called when the Thread Reply action is triggered. It does not override default behavior. See customize message actions.

Type
function
ParameterDescription
messagemessage the action is called on

hasCameraPicker

Enable the camera picker in MessageInput.

TypeDefault
Booleantrue

hasCommands

Enable commands in MessageInput.

TypeDefault
booleantrue

hasFilePicker

Enable the file picker in MessageInput.

TypeDefault
Booleantrue

hasImagePicker

Enable the image picker in MessageInput.

TypeDefault
Booleantrue

hideDateSeparators

Hide inline date separators in MessageList.

TypeDefault
booleanfalse

hideStickyDateHeader

Hide the sticky date header in MessageList.

TypeDefault
booleanfalse

initialScrollToFirstUnreadMessage

Load the channel starting at the first unread message.

TypeDefault
booleanfalse

initializeOnMount

Controls whether Channel should run channel.watch() whenever it mounts a new channel. When set to false, it is the integrator's responsibility to run channel.watch() to receive WebSocket events for that channel.

Useful when viewing channels in a read-only mode or for ephemeral channels that should not be created until the first message is sent.

TypeDefault
booleantrue

isAttachmentEqual

Returns true if rendering nextAttachment would produce the same result as prevAttachment, otherwise false.

Type
function
ParameterDescription
prevAttachmentprevious message attachment to be compared
nextAttachmentnext message attachment to be compared

isMessageAIGenerated

A function that determines whether a message was AI-generated. Used to enable streaming message rendering via StreamingMessageView.

TypeDefault
(message: MessageType) => boolean() => false

keyboardBehavior

Behavior for the keyboard passed to the underlying KeyboardAvoidingView.

Type
'height' | 'position' | 'padding'

loadingMore

Override the loadingMore value supplied by the channel query logic.

Type
Boolean

loadingMoreRecent

Override the loadingMoreRecent value supplied by the channel query logic.

Type
Boolean

markdownRules

Rules for simple-markdown.

Type
object

markReadOnMount

Enable/disable marking the channel as read when Channel mounts.

TypeDefault
Booleantrue

maxTimeBetweenGroupedMessages

Maximum time (ms) between consecutive messages from the same user to keep them grouped.

TypeDefault
numberinfinite

messageId

Load the channel at a specified message instead of the most recent message.

Type
string

messageActions

An array of actions, or a function returning an array, shown in the message menu. See customize message actions.

TypeDefault
Array | FunctionmessageActions
ParameterDescription
actionInfoAn object containing the original actions and relevant message data

messageContentOrder

Order for rendering message content.

TypeDefault
array['quoted_reply', 'gallery', 'files', 'poll', 'ai_text', 'attachments', 'text', 'location']

messageInputFloating

When true, renders the message input in a floating style.

TypeDefault
booleanfalse

messageSwipeToReplyHitSlop

Defines the hitSlop area for the message swipe-to-reply gesture.

TypeDefault
Object{ top: number, left: number, bottom: number, right: number }{left: screenWidth, right: screenWidth}

messageTextNumberOfLines

Number of lines for message text in the Message Overlay.

TypeDefault
number5

myMessageTheme

Theme applied to the current user’s messages.

Type
object

Memoize this object or pass a stable reference.

newMessageStateUpdateThrottleInterval

This prop is deprecated.

Throttle interval (ms) for channel state updates when new messages arrive. Default is 500 ms. For high concurrency, increase (for example 1000 ms) to reduce JS thread load.

TypeDefault
number500

numberOfAttachmentImagesToLoadPerCall

Number of images loaded per CameraRoll.getPhotos call.

TypeDefault
Number25

numberOfAttachmentPickerImageColumns

Number of columns in the image picker.

TypeDefault
Number3

onAlsoSentToChannelHeaderPress

Called when the "Also sent to channel" header is pressed in a thread message.

Type
function

onLongPressMessage

Called when a user long-presses a message. The default opens the message menu.

Type
function
ParameterDescription
payload{ actionHandlers, message }

onPressMessage

Called when a user presses a message.

The default handler behaves differently for reactions and attachments. Handle those cases if you override it.

Type
function
ParameterDescription
payload{ additionalInfo, actionHandlers, message }

additionalInfo provides extra data for certain emitters (for example, user details for textMention).

For example:

<Channel
      onPressMessage={({ additionalInfo, defaultHandler, emitter }) => {

          if (emitter === 'textMention') {
            console.log(additionalInfo?.user);
            return;
          }

          if (emitter === 'card' || emitter === 'textLink') {
            console.log(additionalInfo?.url);
            return;
          }

          if (emitter === 'fileAttachment') {
            console.log(additionalInfo?.attachment);
            return;
          }

          defaultHandler?.();
      }}
    >

additionalInfo may change as we add more emitter use cases.

onPressInMessage

Called on touch start, before onPressMessage.

Type
function
ParameterDescription
payload{ actionHandlers, message }

overrideOwnCapabilities

Override the current user's capabilities (normally derived from permissions, channel type, and channel settings). These capabilities enable or disable UI features. See:

/chat/docs/javascript/chat_permission_policies/

Example:

<Channel
  overrideOwnCapabilities={{
    uploadFile: false,
    sendLinks: false
  }}

Available keys:

  • banChannelMembers When false, "Block User" is hidden in the message menu.
  • deleteAnyMessage When false, "Delete Message" is hidden for received messages.
  • deleteOwnMessage When false, "Delete Message" is hidden for own messages.
  • flagMessage When false, "Flag Message" is hidden.
  • pinMessage When false, "Pin Message" is hidden.
  • quoteMessage When false, "Reply" is hidden.
  • readEvents When false, read receipts aren't rendered.
  • sendLinks When false, users can't send URLs.
  • sendMessage When false, SendMessageDisallowedIndicator replaces the input.
  • sendReaction When false, the reaction selector is hidden.
  • sendReply When false, "Thread Reply" is hidden.
  • sendTypingEvents When false, typing events aren't sent.
  • updateAnyMessage When false, "Edit Message" is hidden for received messages.
  • updateOwnMessage When false, "Edit Message" is hidden for own messages.
  • uploadFile When false, AttachButton is hidden in MessageInput.
Type
object

reactionListPosition

Position of the reaction list in the message component. Default is above the message content.

TypeDefault value
top | bottom'top'

reactionListType

Type of reaction list to render. Controls the visual style of the reaction list.

TypeDefault
'clustered' | 'simple''clustered'

selectReaction

Full override of the message reaction handler. It must return a function that accepts reactionType (string). See customize message actions.

Type
function | null
ParameterDescription
messagemessage the action is called on

setInputRef

Callback function to set the ref on the underlying TextInput in MessageInput.

Type
function
ParameterDescription
refref of the TextInput

shouldShowUnreadUnderlay

Enable/disable the unread underlay background in the message list.

TypeDefault
boolean|undefinedtrue

stateUpdateThrottleInterval

Throttle interval (ms) for channel state updates (excluding new messages). Default is 500 ms. For high concurrency, increase (for example 1000 ms) to reduce JS thread load.

TypeDefault
number500

supportedReactions

List of reactions users can add to messages. See customizing reactions.

TypeDefault
ArrayreactionData

thread

Can be a LocalMessage or ThreadType. Setting it indicates a thread is open. Both types are interchangeable.

With Thread, this displays the thread. With the standard MessageList, it keeps singleton components in OverlayProvider in sync.

Set thread on all Channel components when a thread is open.

Type
object

threadList

Indicates the Channel is rendering a thread. Used to avoid concurrency issues between the main channel and thread.

Type
boolean

openPollCreationDialog

Called when the poll creation button is clicked in the attachment picker. Use it to override the default modal UI.

If overridden, a payload is passed with sendMessage from MessageInputContext for use in CreatePoll.

Type
function
ParameterDescription
payload{ sendMessage }

hasCreatePoll

Controls whether the poll creation button is visible.

Type
boolean

topInset

Distance from the top of the screen the attachment picker should open to when expanded. This is often set to the header height.

This can also be set via the setTopInset function provided by the useAttachmentPickerContext hook.

TypeDefault
Number0

urlPreviewType

Controls the type of URL preview shown for messages with links.

TypeDefault
'full' | 'compact''full'

maximumMessageLimit

A prop that limits how many messages are kept in memory.

Useful for high-traffic channels (for example, a livestream) where retaining every message in memory is unnecessary.

Behavior notes:

  • It affects how the underlying MessageList works
  • When the limit is exceeded, the oldest messages are pruned (in memory only)
  • Messages are not pruned if you are near the top of the MessageList
  • Pagination still works for messages removed from memory
Type
number

UI Components Props

AttachButton

Renders the attach button next to the input box.

TypeDefault
ComponentTypeAttachButton

Attachment

Renders attachments in MessageList.

Available props:

  • attachment {object}
TypeDefault
ComponentTypeAttachment

AudioAttachment

Renders the audio attachment.

TypeDefault
ComponentTypeAudioAttachment

AudioAttachmentUploadPreview

Customize the audio attachment upload preview in MessageInput.

TypeDefault
ComponentTypeAudioAttachmentUploadPreview

AudioRecorder

Custom UI for audio recorder controls in MessageInput.

TypeDefault
ComponentTypeAudioRecorder

AudioRecordingInProgress

Custom UI for an in-progress audio recording in MessageInput (waveform, duration, etc.).

TypeDefault
ComponentTypeAudioRecordingInProgress

AudioRecordingLockIndicator

Custom lock indicator for audio recording in MessageInput.

TypeDefault
ComponentTypeAudioRecordingLockIndicator

AudioRecordingPreview

Custom UI to preview and play an audio recording in MessageInput.

TypeDefault
ComponentTypeAudioRecordingPreview

AudioRecordingWaveform

Custom waveform UI for audio recording in MessageInput.

TypeDefault
ComponentTypeAudioRecordingWaveform

AutoCompleteSuggestionHeader

Renders the autocomplete suggestion header.

TypeDefault
ComponentTypeAutoCompleteSuggestionHeader

AutoCompleteSuggestionItem

Renders an autocomplete suggestion item.

TypeDefault
ComponentTypeAutoCompleteSuggestionItem

AutoCompleteSuggestionList

Renders the autocomplete suggestion list.

TypeDefault
ComponentTypeAutoCompleteSuggestionList

AttachmentPickerContent

Renders the content of the attachment picker bottom sheet.

TypeDefault
ComponentTypeAttachmentPickerContent

AttachmentPickerSelectionBar

Renders the attachment picker selection bar (image, file, camera icons).

TypeDefault
ComponentTypeAttachmentPickerSelectionBar

AttachmentPickerIOSSelectMorePhotos

Renders the "select more photos" option for limited gallery access on iOS.

TypeDefault
ComponentTypeundefined | AttachmentPickerIOSSelectMorePhotos

AttachmentUploadPreviewList

Renders previews of attached files and images in MessageInput.

TypeDefault
ComponentTypeAttachmentUploadPreviewList

CooldownTimer

Renders a countdown timer for message send cooldowns in MessageInput.

TypeDefault
ComponentTypeCooldownTimer

DateHeader

Renders the sticky date header in MessageList.

TypeDefault
ComponentTypeDateHeader

EmptyStateIndicator

Renders when the channel has no messages.

TypeDefault
ComponentTypeEmptyStateIndicator

FileAttachmentIcon

Renders the file icon for file attachments.

TypeDefault
ComponentTypeFileIcon

FileAttachment

Renders file attachments in MessageList.

TypeDefault
ComponentTypeFileAttachment

FileAttachmentGroup

Renders a group of file attachments when a message has multiple files.

TypeDefault
ComponentTypeFileAttachmentGroup

FilePreview

Renders a preview of a file attachment.

TypeDefault
ComponentTypeFilePreview

FileAttachmentUploadPreview

Customize the file attachment upload preview in MessageInput.

TypeDefault
ComponentTypeFileAttachmentUploadPreview

FileUploadInProgressIndicator

Renders the progress indicator shown while a file is being uploaded.

TypeDefault
ComponentTypeFileUploadInProgressIndicator

FileUploadRetryIndicator

Renders the retry indicator shown when a file upload fails.

TypeDefault
ComponentTypeFileUploadRetryIndicator

FileUploadNotSupportedIndicator

Renders an indicator when file upload is not supported.

TypeDefault
ComponentTypeFileUploadNotSupportedIndicator

ImageAttachmentUploadPreview

Customize the image attachment upload preview in MessageInput.

TypeDefault
ComponentTypeImageAttachmentUploadPreview

ImageUploadInProgressIndicator

Renders the progress indicator shown while an image is being uploaded.

TypeDefault
ComponentTypeImageUploadInProgressIndicator

ImageUploadRetryIndicator

Renders the retry indicator shown when an image upload fails.

TypeDefault
ComponentTypeImageUploadRetryIndicator

ImageUploadNotSupportedIndicator

Renders an indicator when image upload is not supported.

TypeDefault
ComponentTypeImageUploadNotSupportedIndicator

VideoAttachmentUploadPreview

Customize the video attachment upload preview in MessageInput.

TypeDefault
ComponentTypeVideoAttachmentUploadPreview

ImageOverlaySelectedComponent

Indicator shown for selected images in the image picker.

TypeDefault
ComponentTypeundefined | ImageOverlaySelectedComponent

FlatList

FlatList component used by MessageList.

TypeDefault
ComponentTypeflat-list-mvcp

Renders image attachments in MessageList.

TypeDefault
ComponentTypeGallery

Giphy

Renders Giphy attachments in MessageList.

TypeDefault
ComponentTypeGiphy

ImageLoadingFailedIndicator

Renders when an image fails to load in Gallery.

TypeDefault
ComponentTypeImageLoadingFailedIndicator

ImageLoadingIndicator

Renders while an image is loading in Gallery.

TypeDefault
ComponentTypeImageLoadingIndicator

InlineDateSeparator

Renders inline date separators between messages more than a day apart.

TypeDefault
ComponentTypeInlineDateSeparator

InlineUnreadIndicator

Renders an inline separator in MessageList to mark the last read message.

TypeDefault
ComponentTypeInlineUnreadIndicator

Input

Renders the UI for the enclosed MessageInput. See Customizing Message Input.

Type
ComponentType

InputButtons

Renders action buttons (AttachButton) on the left side of the MessageInput.

TypeDefault
ComponentTypeInputButtons

KeyboardCompatibleView

Override the default KeyboardCompatibleView. You likely won't need this; use these props instead:

TypeDefault
ComponentTypeKeyboardCompatibleView

LoadingErrorIndicator

Full-screen error indicator when the channel fails to load.

TypeDefault
ComponentTypeLoadingErrorIndicator

LoadingIndicator

Renders a full-screen loading indicator when a channel is loading.

TypeDefault
ComponentTypeLoadingIndicator

Message

Renders a message wrapper component in MessageList.

TypeDefault
ComponentTypeMessage

MessageActionList

Renders the message action list in the message menu.

TypeDefault
ComponentTypeMessageActionList

MessageActionListItem

Renders a message action item within the action list.

TypeDefault
ComponentTypeMessageActionListItem

MessageAvatar

Renders the sender avatar in MessageList. Only shown for other users’ messages.

TypeDefault
ComponentTypeMessageAvatar

MessageBlocked

Renders a blocked message indicator in MessageList.

TypeDefault
ComponentTypeMessageBlocked

MessageBounce

Renders the bounce action handler for bounced messages in MessageList.

TypeDefault
ComponentTypeMessageBounce

MessageComposerLeadingView

Renders the leading (left) view in the message composer.

TypeDefault
ComponentTypeMessageComposerLeadingView

MessageComposerTrailingView

Renders the trailing (right) view in the message composer.

TypeDefault
ComponentTypeMessageComposerTrailingView

MessageContent

Renders message content (status, attachments, reactions, etc.) in MessageList.

TypeDefault
ComponentTypeMessageContent

MessageDeleted

Renders a deleted message.

TypeDefault
ComponentTypeMessageDeleted

MessageError

Customize the message error component.

TypeDefault
ComponentTypeMessageError

MessageFooter

Renders the message footer in MessageList.

TypeDefault
ComponentTypeMessageFooter

MessageHeader

Renders the header for a message in MessageList.

TypeDefault
ComponentTypeMessageHeader

MessageInputHeaderView

Renders the header view of the message input area (for example, reply preview or editing state).

TypeDefault
ComponentTypeMessageInputHeaderView

MessageInputLeadingView

Renders the leading (left) view of the message input area.

TypeDefault
ComponentTypeMessageInputLeadingView

MessageInputTrailingView

Renders the trailing (right) view of the message input area.

TypeDefault
ComponentTypeMessageInputTrailingView

MessageList

Renders the list of messages in the channel.

TypeDefault
ComponentTypeMessageList

MessageLocation

Renders location attachments in messages.

Type
ComponentType

MessageMenu

Legacy placeholder for the long-press context menu container.

The active runtime overlay path is composed directly from MessageReactionPicker, MessageActionList, and MessageUserReactions. Overriding MessageMenu does not affect the current long-press UI.

TypeDefault
ComponentTypeMessageMenu

MessagePinnedHeader

Renders the pinned message label in MessageList.

TypeDefault
ComponentTypeMessagePinnedHeader

MessageReminderHeader

Renders the reminder header for messages that have reminders set.

TypeDefault
ComponentTypeMessageReminderHeader

MessageSavedForLaterHeader

Renders the "saved for later" header for bookmarked messages.

TypeDefault
ComponentTypeMessageSavedForLaterHeader

SentToChannelHeader

Renders the "also sent to channel" header for thread messages shown in the main channel.

TypeDefault
ComponentTypeSentToChannelHeader

MessageReplies

Shows thread reply count and avatars of users who replied.

TypeDefault
ComponentTypeMessageReplies

MessageRepliesAvatars

Renders avatars of users who replied in the thread.

TypeDefault
ComponentTypeMessageRepliesAvatars

MessageSimple

Renders a message in MessageList.

See Customizing Message UI.

TypeDefault
ComponentTypeMessageSimple

MessageStatus

Renders message status (time and read receipts).

TypeDefault
ComponentTypeMessageStatus

MessageSwipeContent

Renders content when the user swipes a message.

TypeDefault
ComponentTypeMessageSwipeContent

MessageSystem

Renders system messages that inform users about channel changes. System messages are part of history and have type: "system".

System messages appear when:

TypeDefault
ComponentTypeMessageSystem

MessageText

Renders message text. By default, the SDK uses Simple Markdown. If you override this, you must handle markdown rendering yourself.

TypeDefault
ComponentTyperenderText

MessageTimestamp

Renders the timestamp for a message.

TypeDefault
ComponentTypeMessageTimestamp

MessageReactionPicker

Reaction selector shown in the long-press overlay.

TypeDefault
ComponentTypeMessageReactionPicker

MessageUserReactionsAvatar

Renders an avatar in the user reactions sheet shown from the long-press overlay.

TypeDefault
ComponentTypeMessageUserReactionsAvatar

MessageUserReactionsItem

Customize an individual item in MessageUserReactions (avatar, reaction type, user name, etc.).

TypeDefault
ComponentTypeMessageUserReactionsItem

MessageUserReactions

Renders the reactions list shown from the long-press overlay.

TypeDefault
ComponentTypeMessageUserReactions

NetworkDownIndicator

Renders an indicator at the top of the channel when the network/connection is down.

TypeDefault
ComponentTypeNetworkDownIndicator

ReactionListBottom

Renders the reactions list below the message bubble.

TypeDefault
ComponentTypeReactionListBottom

ReactionListTop

Renders the reactions list above the message bubble.

TypeDefault
ComponentTypeReactionListTop

ReactionListClustered

Renders a clustered reaction list that groups reactions together.

TypeDefault
ComponentTypeReactionListClustered

ReactionListItem

Renders an individual reaction item in the reaction list.

TypeDefault
ComponentTypeReactionListItem

ReactionListItemWrapper

Renders a wrapper around each reaction item in the reaction list.

TypeDefault
ComponentTypeReactionListItemWrapper

ReactionListCountItem

Renders the count badge for a reaction type in the reaction list.

TypeDefault
ComponentTypeReactionListCountItem

Reply

Renders a preview of the parent message for quoted replies.

TypeDefault
ComponentTypeReply

ScrollToBottomButton

Renders a button that scrolls the message list to the bottom.

TypeDefault
ComponentTypeScrollToBottomButton

SendButton

Renders the send message button inside MessageInput.

TypeDefault
ComponentTypeSendButton

SendMessageDisallowedIndicator

Renders an indicator when the current user can't send messages.

TypeDefault
ComponentTypeSendMessageDisallowedIndicator

ShowThreadMessageInChannelButton

Renders a checkbox in Thread that sets show_in_channel to true when checked.

TypeDefault
ComponentTypeShowThreadMessageInChannelButton

StartAudioRecordingButton

Custom mic button for audio recording in MessageInput.

TypeDefault
ComponentTypeStartAudioRecordingButton

Renders the sticky date header component in MessageList.

TypeDefault
ComponentTypeStickyHeader

TypingIndicator

Renders the typing indicator in MessageList.

TypeDefault
ComponentTypeTypingIndicator

TypingIndicatorContainer

Renders the container for the typing indicator in MessageList.

TypeDefault
ComponentTypeTypingIndicatorContainer

UnreadMessagesNotification

Renders the floating unread indicator when the first unread message is off-screen.

TypeDefault
ComponentTypeUnreadMessagesNotification

UnsupportedAttachment

Renders a fallback for attachment types that are not natively supported by the SDK.

TypeDefault
ComponentTypeUnsupportedAttachment

UrlPreview

Renders URL previews in MessageList.

TypeDefault
ComponentTypeUrlPreview

URLPreviewCompact

Renders compact URL previews in MessageList when urlPreviewType is set to 'compact'.

TypeDefault
ComponentTypeURLPreviewCompact

VideoThumbnail

Renders video thumbnails for video attachments in MessageList.

TypeDefault
ComponentTypeVideoThumbnail

CreatePollContent

A custom UI component used to render the entire poll creation form. It has access to the CreatePollContext values by default through the useCreatePollContext hook.

TypeDefault
ComponentTypeCreatePollContent

PollContent

A Component prop used to render the content of the Poll component in MessageList.

The component has full access to the entire Poll reactive state through the usePollState hook.

TypeDefault
ComponentTypePollContent

Props

PollHeader

A Component prop used to render the header of the PollContent component.

TypeDefault
ComponentTypePollHeader
PollButtons

A Component prop used to render the buttons of the PollContent component.

TypeDefault
ComponentTypePollButtons

StreamingMessageView

Custom UI for an AI-generated message.

TypeDefault
componentStreamingMessageView

StopMessageStreamingButton

Custom button to stop AI generation, shown instead of SendButton in MessageInput.

TypeDefault
componentStopMessageStreamingButton