MessageContext
MessageContext holds one message and the handlers that act on it. Message provides it, and the message UI and its parts (MessageText, MessageStatus, MessageActions, MessageReactions and the others) read it. A message explains how they fit together.
Best practices
- Read the context with
useMessageContext()in a custom message UI. The SDK renders the UI with no props. - Use the handlers instead of calling the client yourself. They update the message in the list, and inside a thread they act on the thread.
useMessageContext()throws outside aMessage. A component that also renders outside a message can readuseContext(MessageContext), which returnsundefinedthere.
Basic usage
This message UI shows the text and a button that toggles a 👍 reaction:
import { MessageText, useMessageContext } from "stream-chat-react";
export const MessageWithLike = () => {
const { handleReaction, isMyMessage, message } = useMessageContext();
const liked = message.own_reactions?.some(({ type }) => type === "like");
return (
<div className={isMyMessage() ? "message message--mine" : "message"}>
<MessageText />
<button
aria-pressed={liked}
onClick={(event) => handleReaction("like", event)}
type="button"
>
👍
</button>
</div>
);
};handleReaction adds the reaction, or removes it when the user already gave it. Register the component as the MessageUI override, as Message shows.
Values
Message fills every handler. The other values come from its props, which the lists set; Message says which list sets which.
| Value | Type | Description |
|---|---|---|
autoscrollToBottom |
() => void |
Keeps VirtualizedMessageList at the bottom after the message grows. Set only in that list. |
closeReactionSelectorOnClick |
boolean |
Whether the reaction selector closes after a pick. |
deliveredTo |
UserResponse[] |
The users the message was delivered to. |
endOfGroup |
boolean |
Read by the default MessageUI, which shows the metadata only on the last message of a group. The SDK's lists don't set it. |
firstOfGroup |
boolean |
Read by the default MessageUI for a class name. The SDK's lists don't set it. |
formatDate |
(date: Date) => string |
Formats the message's time and its edited-at tooltip. |
groupedByUser |
boolean |
Read by the default MessageUI together with endOfGroup. The SDK's lists don't set it. |
groupStyles |
GroupStyle[] |
The message's place in a run of messages from one sender. |
handleAction |
(dataOrName?: string | FormData, value?: string, event?: BaseSyntheticEvent) => Promise<void> | void |
Runs an attachment action, such as a Giphy preview's send, shuffle or cancel. |
handleDelete |
(options?: DeleteMessageOptions) => Promise<void> | void |
Deletes the message through the message operations of the channel or thread. options go to the request. |
handleFetchReactions |
(reactionType?: string, sort?: SortParamRequest[]) => Promise<ReactionResponse[]> |
Loads the message's reactions, 25 at a time, up to 1000. Pass a type to load only that type. |
handleFlag |
ReactEventHandler |
Flags the message for moderation. |
handleMarkUnread |
ReactEventHandler |
Marks the channel unread from this message on. Throws when the request fails. |
handleMute |
ReactEventHandler |
Mutes the sender, or unmutes them when they're muted. |
handleOpenThread |
ReactEventHandler |
Opens the message's thread through workspace navigation, or calls Message's openThread prop when set. |
handlePin |
ReactEventHandler |
Pins the message, or unpins it when it's pinned. The list shows the change at once, and undoes it when the request fails. |
handleReaction |
(reactionType: string, event: BaseSyntheticEvent) => Promise<void> |
Adds the reaction, or removes it when the user already gave it. The list shows the change at once, and undoes it when the request fails. |
handleRetry |
(message: LocalMessage) => Promise<void> | void |
Sends a failed message again through the message operations of the channel or thread. |
highlighted |
boolean |
Whether the message is the target of a jump. |
initialMessage |
boolean |
Whether the message is a thread's parent, shown above the replies. |
isMessageAIGenerated |
(message: LocalMessage) => boolean |
The isMessageAIGenerated prop of Chat. The default MessageUI renders AI-generated text with StreamedMessageText. |
isMyMessage |
() => boolean |
Whether the current user sent the message. |
lastOwnMessage |
LocalMessage |
The user's latest message in the list. |
lastReceivedId |
string | null |
The id of the latest message in the list with the status received. |
message |
LocalMessage |
The message. |
messageListRect |
DOMRect |
The bounding box of MessageList. |
onMentionsClickMessage |
ReactEventHandler |
Calls the list's onMentionsClick with the message's mentions. MessageText attaches it. |
onMentionsHoverMessage |
ReactEventHandler |
The same for onMentionsHover. |
onUserClick |
ReactEventHandler |
Calls the list's onUserClick with the sender. The default MessageUI attaches it to the avatar. |
onUserHover |
ReactEventHandler |
The same for onUserHover. |
reactionDetailsSort |
SortParamRequest[] |
The order of users in the reactions dialog. |
readBy |
UserResponse[] |
The users who read the message. |
renderText |
RenderTextFunction |
Renders the text. MessageText, QuotedMessage and StreamedMessageText use it. |
returnAllReadData |
boolean |
Whether every own message shows read and delivery state. |
setTranslationView |
(view: 'original' | 'translated') => void |
Shows the original text or the translation, for this user only. MessageTranslationIndicator uses it. |
showAvatar |
boolean | 'incoming' | 'outgoing' |
Which messages get the avatar column. Message doesn't set it; the default MessageUI falls back to 'incoming'. |
sortReactions |
ReactionsComparator |
Orders the reaction types on the message. |
threadList |
boolean |
Whether the message is in a thread's reply list. The SDK's lists don't set it. |
translationView |
'original' | 'translated' |
Which text MessageText shows. Defaults to the translation when the message has one. |
unsafeHTML |
boolean |
Whether MessageText renders message.html instead of the text. |
ReactEventHandler is (event: BaseSyntheticEvent) => Promise<void> | void. handleFlag, handleMarkUnread, handleMute and handlePin call preventDefault() on it, so pass them the event of a click.
Hooks
useMessageContext()returns the value. It throws outside aMessage.- Message hooks has the hooks the handlers are built from, for use outside a message.