import { Channel, useMessageContext } from "stream-chat-react-native";
import { Text, View } from "react-native";
const CustomContentTopView = () => {
const { isMyMessage } = useMessageContext();
return isMyMessage ? null : <Text>Incoming</Text>;
};
const CustomContentBottomView = () => {
const { message } = useMessageContext();
return message.pinned ? <Text>Pinned</Text> : null;
};
const CustomContentLeadingView = () => {
const { alignment } = useMessageContext();
return <View style={{ width: alignment === "left" ? 8 : 0 }} />;
};
const CustomContentTrailingView = () => {
const { alignment } = useMessageContext();
return <View style={{ width: alignment === "right" ? 8 : 0 }} />;
};
<Channel
MessageContentTopView={CustomContentTopView}
MessageContentBottomView={CustomContentBottomView}
MessageContentLeadingView={CustomContentLeadingView}
MessageContentTrailingView={CustomContentTrailingView}
/>;MessageContent
Renders message content inside MessageList. This is the default component for the MessageContent prop.
For lightweight decoration around the main content body, use MessageContentTopView, MessageContentBottomView, MessageContentLeadingView, and MessageContentTrailingView instead of replacing MessageContent entirely.
Best Practices
- Keep content rendering lightweight to avoid list performance issues.
- Prefer the
MessageContent*Viewslot overrides for lightweight decoration around the body instead of replacingMessageContent. - Use
useMessageContext()inside prop-less content slot overrides when you need message state such asalignment,message, orisMyMessage. - Respect
messageContentOrderso attachments, polls, and text appear consistently. - Keep press handlers fast and side-effect free.
- Keep padding overrides predictable across message types.
Props
additionalPressableProps
Extra props passed to the underlying Pressable used in message components like MessageContent.
| Type |
|---|
| object |
enableMessageGroupingByUser
Whether message grouping by user is enabled.
| Type |
|---|
| boolean |
backgroundColor
Message content background color.
| Type |
|---|
ColorValue |
goToMessage
Scrolls to a specific message in the chat.
| Type | Default |
|---|---|
(messageId: string) => void| undefined | undefined |
groupStyles
Position of the message within a group of consecutive messages from the same user. Use groupStyles to style messages based on position (for example, avatars show only on the last message).
| Type |
|---|
| array of enum('top', 'bottom', 'middle', 'single') |
isMessageAIGenerated
Whether a message should be treated as AI-generated.
| Type |
|---|
| function |
isMyMessage
True if the message was sent by the current user.
| Type |
|---|
| boolean |
isMessageReceivedOrErrorType
Whether the message is incoming or in an error state.
| Type |
|---|
| boolean |
message
Message object.
| Type |
|---|
Message type |
messageContentOrder
Order of message content.
Example: ['quoted_reply', 'attachments', 'file', 'gallery', 'text']
| Type |
|---|
| array |
messageGroupedSingleOrBottom
Whether the message group style is single or bottom.
| Type |
|---|
| boolean |
myMessageTheme
Theme applied to the current user’s messages.
| Type |
|---|
| object |
Memoize this object or pass a stable reference.
noBorder
If true, the message content has no border.
| Type | Default |
|---|---|
Boolean| undefined | false |
isVeryLastMessage
Whether the message is the very last item in the list.
| Type |
|---|
| boolean |
onLongPress
Default long press handler for message UI.
| Type |
|---|
| function |
onPress
Default press handler for message UI.
| Type |
|---|
| function |
onPressIn
Default pressIn handler for message UI.
| Type |
|---|
| function |
otherAttachments
All attachments except file and image.
| Type |
|---|
| Array |
preventPress
Disable press interactions for this message content.
| Type |
|---|
| boolean |
threadList
True if the current message is part of a thread.
| Type |
|---|
| Boolean |
hidePaddingTop
Hide top padding in content container.
| Type |
|---|
| boolean |
hidePaddingHorizontal
Hide horizontal padding in content container.
| Type |
|---|
| boolean |
hidePaddingBottom
Hide bottom padding in content container.
| Type |
|---|
| boolean |
Slot Overrides
MessageContentTopView, MessageContentBottomView, MessageContentLeadingView, and MessageContentTrailingView are optional prop-less slots rendered around the main message content body.
If a slot is not provided, nothing is rendered for that position. MessageContent only creates the horizontal wrapper for Leading and Trailing when at least one of those overrides is provided, so the default render tree stays unchanged otherwise.
If your custom slot needs message state such as alignment, message, or isMyMessage, read it with useMessageContext() inside the component.
Example
UI Component Props
MessageContentTopView
Renders an optional prop-less component above the main message content body.
| Type | Default |
|---|---|
ComponentType | undefined | undefined |
MessageContentBottomView
Renders an optional prop-less component below the main message content body.
| Type | Default |
|---|---|
ComponentType | undefined | undefined |
MessageContentLeadingView
Renders an optional prop-less component to the left of the main message content body.
If neither MessageContentLeadingView nor MessageContentTrailingView is provided, MessageContent does not create the horizontal wrapper around the body.
| Type | Default |
|---|---|
ComponentType | undefined | undefined |
MessageContentTrailingView
Renders an optional prop-less component to the right of the main message content body.
If neither MessageContentLeadingView nor MessageContentTrailingView is provided, MessageContent does not create the horizontal wrapper around the body.
| Type | Default |
|---|---|
ComponentType | undefined | undefined |
Attachment
Renders attachments in MessageList.
Available props:
attachment{object}
| Type | Default |
|---|---|
| ComponentType | Attachment |
FileAttachmentGroup
Renders a group of file attachments when a message has multiple files.
| Type | Default |
|---|---|
| ComponentType | FileAttachmentGroup |
Gallery
Renders image attachments in MessageList.
| Type | Default |
|---|---|
| ComponentType | Gallery |
MessageLocation
Renders location content for messages with location attachments.
| Type |
|---|
| ComponentType |
Reply
Renders a preview of the parent message for quoted replies.
| Type | Default |
|---|---|
| ComponentType | Reply |
StreamingMessageView
Renders AI-streamed text when isMessageAIGenerated(message) is true.
| Type |
|---|
| ComponentType |
- Best Practices
- Props
- additionalPressableProps
- enableMessageGroupingByUser
- backgroundColor
- goToMessage
- groupStyles
- isMessageAIGenerated
- isMyMessage
- isMessageReceivedOrErrorType
- message
- messageContentOrder
- messageGroupedSingleOrBottom
- myMessageTheme
- noBorder
- isVeryLastMessage
- onLongPress
- onPress
- onPressIn
- otherAttachments
- preventPress
- threadList
- hidePaddingTop
- hidePaddingHorizontal
- hidePaddingBottom
- Slot Overrides
- Example
- UI Component Props