| title | Message List |
|---|---|
| description | Display sent and received messages with text, media, reactions, read receipts, threaded replies, and AI features. |
CometChatMessageList renders a scrollable, real-time message feed for a user or group conversation. Wire it alongside CometChatMessageHeader and CometChatMessageComposer to build a standard chat view.
import { useState, useEffect } from "react";
import { View, StyleSheet } from "react-native";
import { GestureHandlerRootView } from "react-native-gesture-handler";
import { SafeAreaProvider } from "react-native-safe-area-context";
import {
CometChatMessageHeader,
CometChatMessageList,
CometChatMessageComposer,
CometChatThemeProvider,
} from "@cometchat/chat-uikit-react-native";
import { CometChat } from "@cometchat/chat-sdk-react-native";
function ChatView() {
const [chatUser, setChatUser] = useState<CometChat.User>();
useEffect(() => {
CometChat.getUser("uid").then((user) => setChatUser(user));
}, []);
return chatUser ? (
<GestureHandlerRootView style={{ flex: 1 }}>
<SafeAreaProvider>
<CometChatThemeProvider>
<View style={styles.container}>
<CometChatMessageHeader user={chatUser} />
<CometChatMessageList user={chatUser} />
<CometChatMessageComposer user={chatUser} />
</View>
</CometChatThemeProvider>
</SafeAreaProvider>
</GestureHandlerRootView>
) : null;
}
const styles = StyleSheet.create({
container: { flex: 1 },
});import { CometChatMessageList } from "@cometchat/chat-uikit-react-native";
function MessageListDemo() {
return <CometChatMessageList user={chatUser} />;
}
export default MessageListDemo;Pass a CometChat.MessagesRequestBuilder to messageRequestBuilder. The UID/GUID parameters are always overridden internally based on the user/group prop.
import { CometChatMessageList } from "@cometchat/chat-uikit-react-native";
import { CometChat } from "@cometchat/chat-sdk-react-native";
function FilteredMessageList() {
return (
<CometChatMessageList
user={chatUser}
messageRequestBuilder={
new CometChat.MessagesRequestBuilder().setLimit(5)
}
/>
);
}Refer to MessagesRequestBuilder for the full builder API.
Fires when you press on the threaded message bubble.
import { CometChatMessageList } from "@cometchat/chat-uikit-react-native";
import { CometChat } from "@cometchat/chat-sdk-react-native";
function MessageListWithThreads() {
const handleThreadReplies = (
msg: CometChat.BaseMessage,
messageBubbleView: () => JSX.Element | null
) => {
console.log("Thread replies pressed:", msg.getId());
};
return (
<CometChatMessageList
user={chatUser}
onThreadRepliesPress={handleThreadReplies}
/>
);
}Fires on internal errors (network failure, auth issue, SDK exception).
import { CometChatMessageList } from "@cometchat/chat-uikit-react-native";
import { CometChat } from "@cometchat/chat-sdk-react-native";
function MessageListWithErrorHandler() {
return (
<CometChatMessageList
user={chatUser}
onError={(error: CometChat.CometChatException) => {
console.error("MessageList error:", error);
}}
/>
);
}Fires when a reaction on a message bubble is clicked.
import { CometChatMessageList } from "@cometchat/chat-uikit-react-native";
import { CometChat } from "@cometchat/chat-sdk-react-native";
function MessageListWithReactions() {
const handleReactionPress = (
reaction: CometChat.ReactionCount,
messageObject: CometChat.BaseMessage
) => {
console.log("Reaction pressed:", reaction, messageObject.getId());
};
return (
<CometChatMessageList
user={chatUser}
onReactionPress={handleReactionPress}
/>
);
}Fires when messages are successfully fetched and loaded.
import { CometChatMessageList } from "@cometchat/chat-uikit-react-native";
import { CometChat } from "@cometchat/chat-sdk-react-native";
function MessageListWithLoadHandler() {
const handleLoad = (messageList: CometChat.BaseMessage[]) => {
console.log("Messages loaded:", messageList.length);
};
return <CometChatMessageList user={chatUser} onLoad={handleLoad} />;
}CometChatUIEventHandler emits events subscribable from anywhere in the application. Subscribe in a useEffect and unsubscribe on cleanup.
| Event | Fires when | Payload |
|---|---|---|
openChat |
User opens a user or group chat | { user, group } |
ccMessageEdited |
Message edited by logged-in user | { message } |
ccMessageDeleted |
Message deleted by logged-in user | { message } |
ccActiveChatChanged |
User navigates to a different chat | chat details |
ccMessageRead |
Message read by logged-in user | { message } |
ccMessageDelivered |
Messages marked as delivered | { message } |
import { useEffect } from "react";
import { CometChatUIEventHandler } from "@cometchat/chat-uikit-react-native";
function useMessageListEvents() {
useEffect(() => {
const uiListenerId = "UI_LISTENER_" + Date.now();
const messageListenerId = "MESSAGE_LISTENER_" + Date.now();
CometChatUIEventHandler.addUIListener(uiListenerId, {
openChat: ({ user, group }) => {
console.log("Chat opened:", user || group);
},
});
CometChatUIEventHandler.addMessageListener(messageListenerId, {
ccMessageEdited: ({ message }) => {
console.log("Message edited:", message.getId());
},
ccMessageDeleted: ({ message }) => {
console.log("Message deleted:", message.getId());
},
});
return () => {
CometChatUIEventHandler.removeUIListener(uiListenerId);
CometChatUIEventHandler.removeMessageListener(messageListenerId);
};
}, []);
}The component listens to these SDK events internally. No manual attachment needed unless additional side effects are required.
| SDK Listener | Internal behavior |
|---|---|
onTextMessageReceived / onMediaMessageReceived / onCustomMessageReceived |
Appends new message to list |
onMessageEdited / onMessageDeleted |
Updates/removes message in list |
onTypingStarted / onTypingEnded |
Shows/hides typing indicator |
onMessagesDelivered / onMessagesRead |
Updates receipt ticks |
Each slot replaces a section of the default UI.
| Slot | Signature | Replaces |
|---|---|---|
HeaderView |
({ user, group, id }) => JSX.Element |
Area above the message list |
FooterView |
({ user, group, id }) => JSX.Element |
Area below the message list |
LoadingView |
() => JSX.Element |
Loading state |
EmptyView |
() => JSX.Element |
Empty state |
ErrorView |
() => JSX.Element |
Error state |
NewMessageIndicatorView |
() => JSX.Element |
New messages indicator |
templates |
CometChatMessageTemplate[] |
Message bubble rendering |
textFormatters |
CometChatTextFormatter[] |
Text formatting in messages |
Custom view above the message list.
import { CometChatMessageList } from "@cometchat/chat-uikit-react-native";
import { CometChat } from "@cometchat/chat-sdk-react-native";
import { View, Text, TouchableOpacity } from "react-native";
function MessageListWithHeader() {
const getHeaderView = ({
user,
group,
id,
}: {
user?: CometChat.User;
group?: CometChat.Group;
id?: { uid?: string; guid?: string; parentMessageId?: string };
}) => {
return (
<View style={{ flexDirection: "row", padding: 10, backgroundColor: "#edeafa", gap: 8 }}>
<TouchableOpacity style={{ backgroundColor: "#fafafa", paddingHorizontal: 12, paddingVertical: 6, borderRadius: 16 }}>
<Text style={{ color: "#6852D6" }}>Notes</Text>
</TouchableOpacity>
<TouchableOpacity style={{ backgroundColor: "#fafafa", paddingHorizontal: 12, paddingVertical: 6, borderRadius: 16 }}>
<Text style={{ color: "#6852D6" }}>Pinned</Text>
</TouchableOpacity>
</View>
);
};
return <CometChatMessageList user={chatUser} HeaderView={getHeaderView} />;
}Custom view below the message list.
import { CometChatMessageList } from "@cometchat/chat-uikit-react-native";
import { CometChat } from "@cometchat/chat-sdk-react-native";
import { View, Text, TouchableOpacity } from "react-native";
function MessageListWithFooter() {
const getFooterView = ({
user,
group,
id,
}: {
user?: CometChat.User;
group?: CometChat.Group;
id?: { uid?: string; guid?: string; parentMessageId?: string };
}) => {
return (
<View style={{ flexDirection: "row", padding: 10, backgroundColor: "#edeafa", gap: 8 }}>
<TouchableOpacity style={{ backgroundColor: "#fafafa", paddingHorizontal: 12, paddingVertical: 6, borderRadius: 16 }}>
<Text style={{ color: "#6852D6" }}>Ice Breakers</Text>
</TouchableOpacity>
</View>
);
};
return <CometChatMessageList user={chatUser} FooterView={getFooterView} />;
}Custom message bubble templates via CometChatMessageTemplate.
import { CometChatMessageList, ChatConfigurator, CometChatMessageTemplate } from "@cometchat/chat-uikit-react-native";
import { CometChat } from "@cometchat/chat-sdk-react-native";
import { Text } from "react-native";
function MessageListCustomTemplates() {
const getTemplates = () => {
let templates: CometChatMessageTemplate[] = ChatConfigurator.getDataSource().getAllMessageTemplates(theme);
templates.map((data) => {
if (data.type === "text") {
data.ContentView = (messageObject: CometChat.BaseMessage) => {
const textMessage = messageObject as CometChat.TextMessage;
return (
<Text style={{ backgroundColor: "#fff5fd", padding: 10 }}>
{textMessage.getText()}
</Text>
);
};
}
});
return templates;
};
return <CometChatMessageList user={chatUser} templates={getTemplates()} />;
}Custom format for displaying sticky date separators.
import { CometChatMessageList } from "@cometchat/chat-uikit-react-native";
function MessageListCustomDateSeparator() {
const customDateSeparatorPattern = (date: number) => {
const timeStampInSeconds = new Date(date * 1000);
const day = String(timeStampInSeconds.getUTCDate()).padStart(2, "0");
const month = String(timeStampInSeconds.getUTCMonth() + 1).padStart(2, "0");
const year = timeStampInSeconds.getUTCFullYear();
return `${day}/${month}/${year}`;
};
return (
<CometChatMessageList
user={chatUser}
dateSeperatorPattern={customDateSeparatorPattern}
/>
);
}Custom format for message timestamps.
import { CometChatMessageList } from "@cometchat/chat-uikit-react-native";
import { CometChat } from "@cometchat/chat-sdk-react-native";
function MessageListCustomDatePattern() {
const generateDateString = (message: CometChat.BaseMessage) => {
const days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
const timeStamp = message.getSentAt();
if (timeStamp) {
const date = new Date(timeStamp * 1000);
const day = days[date.getUTCDay()];
const hours = date.getUTCHours();
const minutes = String(date.getUTCMinutes()).padStart(2, "0");
return `${day}, ${hours}:${minutes}`;
}
return "---, --:--";
};
return (
<CometChatMessageList
user={chatUser}
datePattern={generateDateString}
/>
);
}Custom text formatters for message content.
import {
CometChatMessageList,
CometChatTextFormatter,
CometChatMentionsFormatter,
} from "@cometchat/chat-uikit-react-native";
function MessageListWithFormatters() {
const getTextFormatters = () => {
const textFormatters: CometChatTextFormatter[] = [];
const mentionsFormatter = new CometChatMentionsFormatter();
mentionsFormatter.setMentionsStyle({
textStyle: { color: "#D6409F" },
selfTextStyle: { color: "#30A46C" },
});
textFormatters.push(mentionsFormatter);
return textFormatters;
};
return (
<CometChatMessageList
user={chatUser}
textFormatters={getTextFormatters()}
/>
);
}See CometChatMentionsFormatter for mention formatting.
import { CometChatMessageList } from "@cometchat/chat-uikit-react-native";
function ThreadedMessageList() {
return (
<CometChatMessageList
user={chatUser}
parentMessageId={parentMessage.getId()}
/>
);
}import { CometChatMessageList } from "@cometchat/chat-uikit-react-native";
function MinimalMessageList() {
return (
<CometChatMessageList
user={chatUser}
receiptsVisibility={false}
avatarVisibility={false}
hideTimestamp={true}
hideGroupActionMessages={true}
/>
);
}import { CometChatMessageList } from "@cometchat/chat-uikit-react-native";
function LeftAlignedList() {
return (
<CometChatMessageList
user={chatUser}
alignment="leftAligned"
/>
);
}import { CometChatMessageList } from "@cometchat/chat-uikit-react-native";
function AIMessageList() {
const suggestedMessages = [
"How can I help you today?",
"Tell me more about your issue.",
"What would you like to achieve?",
];
return (
<CometChatMessageList
user={chatUser}
suggestedMessages={suggestedMessages}
onSuggestedMessageClick={(suggestion) => console.log("Clicked:", suggestion)}
/>
);
}import { CometChatMessageList } from "@cometchat/chat-uikit-react-native";
function NavigateToMessage() {
return (
<CometChatMessageList
user={chatUser}
goToMessageId="message_id_123"
/>
);
}Resume the most recent AI agent conversation on start:
import { CometChatMessageList } from "@cometchat/chat-uikit-react-native";
function AgentChat() {
return (
<CometChatMessageList
user={agentUser}
loadLastAgentConversation={true}
/>
);
}The component uses the theme system from CometChatThemeProvider. Pass a style prop to customize the appearance.
import { CometChatMessageList } from "@cometchat/chat-uikit-react-native";
function StyledMessageList() {
return (
<CometChatMessageList
user={chatUser}
style={{
containerStyle: {
backgroundColor: "#FEEDE1",
},
outgoingMessageBubbleStyles: {
containerStyle: {
backgroundColor: "#F76808",
},
},
}}
/>
);
}| Property | Type | Description |
|---|---|---|
containerStyle |
ViewStyle |
Style for the root container |
incomingMessageBubbleStyles |
object |
Style for incoming message bubbles |
outgoingMessageBubbleStyles |
object |
Style for outgoing message bubbles |
dateSeparatorStyle |
object |
Style for date separators |
actionSheetStyle |
object |
Style for the action sheet |
All props are optional unless noted. Either user or group is required.
Controls message alignment.
| Type | "leftAligned" | "standard" |
| Default | "standard" |
Shows/hides avatars on messages.
| Type | boolean |
| Default | true |
Custom sound file for incoming message notifications.
| Type | audio source |
| Default | Built-in sound |
Custom function to format message timestamps.
| Type | (message: CometChat.BaseMessage) => string |
| Default | Component default |
Custom function to format date separator timestamps.
| Type | (date: number) => string |
| Default | Component default |
Disables the notification sound for incoming messages.
| Type | boolean |
| Default | false |
Custom component displayed when there are no messages.
| Type | () => JSX.Element |
| Default | Built-in empty state |
Custom component displayed when an error occurs.
| Type | () => JSX.Element |
| Default | Built-in error state |
Custom component displayed below the message list.
| Type | ({ user, group, id }) => JSX.Element |
| Default | undefined |
Scrolls to the specified message on initial load.
| Type | string |
| Default | undefined |
The group for group conversation messages.
| Type | CometChat.Group |
| Default | undefined |
Custom component displayed above the message list.
| Type | ({ user, group, id }) => JSX.Element |
| Default | undefined |
Hides the copy message option.
| Type | boolean |
| Default | false |
Hides the delete message option.
| Type | boolean |
| Default | false |
Hides the edit message option.
| Type | boolean |
| Default | false |
Hides the error state view.
| Type | boolean |
| Default | false |
Hides the "Report Message" option.
| Type | boolean |
| Default | false |
Hides the remark text area in the flag message dialog.
| Type | boolean |
| Default | false |
Hides group action messages (join, leave, kick, etc.).
| Type | boolean |
| Default | false |
Hides the message info option.
| Type | boolean |
| Default | false |
Hides the "Message Privately" option.
| Type | boolean |
| Default | false |
Hides the moderation status UI.
| Type | boolean |
| Default | false |
Hides the reaction option.
| Type | boolean |
| Default | false |
Hides the "Reply in Thread" option.
| Type | boolean |
| Default | false |
Hides the reply option.
| Type | boolean |
| Default | false |
Hides the share message option.
| Type | boolean |
| Default | false |
Hides suggested messages in AI view.
| Type | boolean |
| Default | false |
Hides timestamps on messages.
| Type | boolean |
| Default | false |
Hides the translate message option.
| Type | boolean |
| Default | false |
Automatically loads the most recent agent conversation when set to true.
| Type | boolean |
| Default | false |
Custom component displayed during the loading state.
| Type | () => JSX.Element |
| Default | Built-in loading indicator |
Controls which messages load and in what order.
| Type | CometChat.MessagesRequestBuilder |
| Default | SDK default |
UID/GUID are always overridden internally.
Custom view for the "New Messages" indicator.
| Type | () => JSX.Element |
| Default | Built-in indicator |
Callback fired when the "Add More Reactions" button is clicked.
| Type | () => void |
| Default | undefined |
Callback fired when the message list is empty.
| Type | () => void |
| Default | undefined |
Callback fired when the component encounters an error.
| Type | (error: CometChat.CometChatException) => void |
| Default | undefined |
Callback fired when messages are loaded.
| Type | (messageList: CometChat.BaseMessage[]) => void |
| Default | undefined |
Callback fired when a reaction is long-pressed.
| Type | (reaction: CometChat.ReactionCount, messageObject: CometChat.BaseMessage) => void |
| Default | undefined |
Callback fired when a reaction is clicked.
| Type | (reaction: CometChat.ReactionCount, messageObject: CometChat.BaseMessage) => void |
| Default | undefined |
Callback fired when a suggested message is clicked.
| Type | (suggestion: string) => void |
| Default | undefined |
Callback fired when a threaded message reply count is clicked.
| Type | (messageObject: CometChat.BaseMessage, messageBubbleView: () => JSX.Element | null) => void |
| Default | undefined |
Displays threaded conversation for the specified parent message.
| Type | number |
| Default | undefined |
Custom list of quick reactions.
| Type | string[] |
| Default | Predefined reactions |
Shows/hides read/delivery receipt indicators.
| Type | boolean |
| Default | true |
Auto-scrolls to bottom when new messages arrive.
| Type | boolean |
| Default | false |
Keyword to highlight in message text.
| Type | string |
| Default | undefined |
Shows "Mark Unread" option in message actions.
| Type | boolean |
| Default | false |
Loads from the first unread message if available.
| Type | boolean |
| Default | false |
Predefined prompts for AI assistant chats.
| Type | string[] |
| Default | undefined |
Custom message bubble templates. Replaces all default templates.
| Type | CometChatMessageTemplate[] |
| Default | SDK defaults |
Additional message templates to append to the default templates.
| Type | CometChatMessageTemplate[] |
| Default | [] |
Custom styles for the "New Messages" indicator.
| Type | NewMessageIndicatorStyle |
| Default | Built-in style |
Custom text for the "New Messages" indicator.
| Type | string |
| Default | Built-in text |
Speed in milliseconds for AI response streaming animation.
| Type | number |
| Default | undefined |
Tool actions for AI assistant functionality.
| Type | CometChatAIAssistantTools |
| Default | undefined |
Custom text formatters for message content.
| Type | CometChatTextFormatter[] |
| Default | Default formatters from data source |
The user for 1-on-1 conversation messages.
| Type | CometChat.User |
| Default | undefined |
Display user or group details in the chat toolbar Compose and send messages in a chat Complete messaging interface with header, list, and composer Customize the appearance of UI Kit components




