diff --git a/docs.json b/docs.json
index 96952f214..2deaaeef0 100644
--- a/docs.json
+++ b/docs.json
@@ -1119,6 +1119,7 @@
"ui-kit/react-native/message-information",
"ui-kit/react-native/incoming-call",
"ui-kit/react-native/outgoing-call",
+ "ui-kit/react-native/ongoing-call",
"ui-kit/react-native/call-buttons",
"ui-kit/react-native/call-logs",
"ui-kit/react-native/ai-assistant-chat-history",
@@ -1147,6 +1148,7 @@
"ui-kit/react-native/guide-search-messages",
"ui-kit/react-native/guide-message-privately",
"ui-kit/react-native/guide-block-unblock-user",
+ "ui-kit/react-native/custom-message-types",
"ui-kit/react-native/custom-text-formatter-guide",
"ui-kit/react-native/mentions-formatter-guide",
"ui-kit/react-native/url-formatter-guide",
diff --git a/sdk/react-native/campaigns.mdx b/sdk/react-native/campaigns.mdx
index d31eb9bca..083256278 100644
--- a/sdk/react-native/campaigns.mdx
+++ b/sdk/react-native/campaigns.mdx
@@ -3,6 +3,23 @@ title: "Campaigns"
description: "Fetch notification feed items, listen for real-time delivery, mark items as read/delivered, report engagement, and track push notifications using the CometChat React Native SDK."
---
+{/* TL;DR for Agents and Quick Reference */}
+
+
+| Field | Value |
+| --- | --- |
+| Package | `@cometchat/chat-sdk-react-native` |
+| Import | `import { CometChat } from "@cometchat/chat-sdk-react-native";` |
+| Key Methods | `addNotificationFeedListener()`, `getNotificationFeedItem()`, `getNotificationFeedUnreadCount()`, `markFeedItemAsRead()`, `markFeedItemAsDelivered()`, `markPushNotificationDelivered()`, `markPushNotificationClicked()`, `reportFeedEngagement()` |
+| Key Classes | `NotificationFeedItem`, `NotificationFeedRequest`, `NotificationFeedRequestBuilder`, `NotificationCategoriesRequestBuilder`, `NotificationFeedListener`, `PushNotification` |
+| Prerequisites | SDK initialized via [`CometChat.init()`](/sdk/react-native/setup-sdk) and a logged-in user via [`CometChat.login()`](/sdk/react-native/authentication-overview) · channels, categories, templates and campaigns configured in the [dashboard](/campaigns#setup-flow) |
+| Primary output | `NotificationFeedRequest.fetchNext()` → `Promise`; `getNotificationFeedItem()` → `Promise`; `getNotificationFeedUnreadCount()` → `Promise<{ count: number }>`; the mark and report methods → `Promise` |
+| Constraints | Card messages are receive-only: they are created through the Platform API and the dashboard, never from the SDK. The cards library only renders a card — your own code decides what its actions do. Feed items carry Card Schema JSON, so render them with the cards library rather than reading the payload by hand. |
+| Related | [Notification Feed component](/ui-kit/react-native/notification-feed) · [Dashboard setup](/campaigns#setup-flow) · [Card Builder](/card-builder/overview) · [Real-time Listeners](/sdk/react-native/real-time-listeners#message-listener) |
+| Full reference | [NotificationFeedItem fields](#notificationfeeditem-fields) · [NotificationCategory fields](#notificationcategory-fields) |
+
+
+
CometChat Campaigns lets you deliver targeted, rich notifications to users via an in-app notification feed. Each notification is a **Card Schema JSON** — a structured layout rendered natively by the CometChat Cards library.
The SDK provides APIs to fetch feed items, listen for real-time delivery, mark items as read/delivered, report engagement, and retrieve unread counts.
diff --git a/sdk/react-native/overview.mdx b/sdk/react-native/overview.mdx
index bb6e25856..832738b43 100644
--- a/sdk/react-native/overview.mdx
+++ b/sdk/react-native/overview.mdx
@@ -7,6 +7,18 @@ description: "Add real-time chat, voice, video, users, groups, messages, and pus
{/* TL;DR for Agents and Quick Reference */}
+| Field | Value |
+| --- | --- |
+| Package | `@cometchat/chat-sdk-react-native` |
+| Import | `import { CometChat } from "@cometchat/chat-sdk-react-native";` |
+| Key Methods | `init()`, `login()`, `getLoggedinUser()` |
+| Key Classes | `AppSettings`, `AppSettingsBuilder`, `User`, `CometChatException` |
+| Prerequisites | An App ID, Region and Auth Key from the [CometChat Dashboard](https://app.cometchat.com) · React Native 0.63+, Android `minSdkVersion` 24, iOS 11.0 |
+| Primary output | `init()` → `Promise`; `login()` → `Promise`; `getLoggedinUser()` → `Promise` |
+| Constraints | Call `init()` once, before any other SDK call, and log a user in before sending or fetching anything. `getLoggedinUser()` resolves to `null` when nobody is logged in. Use the Auth Key for development only; log users in with an Auth Token in production. |
+| Related | [Setup SDK](/sdk/react-native/setup-sdk) · [Authentication](/sdk/react-native/authentication-overview) · [Key Concepts](/sdk/react-native/key-concepts) · [Send a Message](/sdk/react-native/send-message) |
+| Full reference | [`User`](/sdk/reference/entities#user) · [`CometChatException`](/sdk/reference/auxiliary#cometchatexception) |
+
```bash
npm install @cometchat/chat-sdk-react-native
```
diff --git a/sdk/react-native/pin-conversation.mdx b/sdk/react-native/pin-conversation.mdx
index a27cffc80..bff2b6d03 100644
--- a/sdk/react-native/pin-conversation.mdx
+++ b/sdk/react-native/pin-conversation.mdx
@@ -7,6 +7,18 @@ description: "Pin and unpin conversations and fetch the pinned conversation list
{/* TL;DR for Agents and Quick Reference */}
+| Field | Value |
+| --- | --- |
+| Package | `@cometchat/chat-sdk-react-native` |
+| Import | `import { CometChat } from "@cometchat/chat-sdk-react-native";` |
+| Key Methods | `pinConversation()`, `unpinConversation()`, `isPinConversationEnabled()`, `getPinConversationLimit()`, `getSystemPinConversationLimit()` |
+| Key Classes | `Conversation`, `ConversationsRequest`, `ConversationsRequestBuilder`, `CometChatException` |
+| Prerequisites | SDK initialized via [`CometChat.init()`](/sdk/react-native/setup-sdk) and a logged-in user via [`CometChat.login()`](/sdk/react-native/authentication-overview) |
+| Primary output | `pinConversation()` and `unpinConversation()` → `Promise`; `isPinConversationEnabled()` → `Promise`; `getPinConversationLimit()` and `getSystemPinConversationLimit()` → `Promise` |
+| Constraints | Pin by the peer's UID or GUID plus the receiver type, not by conversation ID. The feature needs the `features.ux.conversations.pinned.enabled` flag, which no plan seeds — it must be mapped per app. A conversation that has never been messaged, or that is hidden, rejects with `ERR_CONVERSATION_NOT_ACCESSIBLE`. `setPinnedBy()` takes exact, case-sensitive strings and silently drops anything else. This SDK has no `ConversationListener`, so keep the list in sync yourself. |
+| Related | [Retrieve Conversations](/sdk/react-native/retrieve-conversations) · [Pin a Message](/sdk/react-native/pin-message) · [Save a Message](/sdk/react-native/save-message) · [Delete a Conversation](/sdk/react-native/delete-conversation) |
+| Full reference | [`Conversation`](/sdk/reference/entities#conversation) · [`CometChatException`](/sdk/reference/auxiliary#cometchatexception) |
+
```javascript
// Pin / unpin — addressed by peer + type, not by conversationId
await CometChat.pinConversation("UID", CometChat.RECEIVER_TYPE.USER);
diff --git a/sdk/react-native/pin-message.mdx b/sdk/react-native/pin-message.mdx
index a5b713509..2b5c47f27 100644
--- a/sdk/react-native/pin-message.mdx
+++ b/sdk/react-native/pin-message.mdx
@@ -7,6 +7,18 @@ description: "Pin and unpin messages in a conversation, fetch the pinned list, a
{/* TL;DR for Agents and Quick Reference */}
+| Field | Value |
+| --- | --- |
+| Package | `@cometchat/chat-sdk-react-native` |
+| Import | `import { CometChat } from "@cometchat/chat-sdk-react-native";` |
+| Key Methods | `pinMessage()`, `unpinMessage()`, `isPinMessageEnabled()`, `getPinMessageLimit()`, `getSystemPinMessageLimit()`, `addMessageListener()`, `removeMessageListener()` |
+| Key Classes | `BaseMessage`, `MessagesRequest`, `MessagesRequestBuilder`, `MessageListener`, `CometChatException` |
+| Prerequisites | SDK initialized via [`CometChat.init()`](/sdk/react-native/setup-sdk) and a logged-in user via [`CometChat.login()`](/sdk/react-native/authentication-overview) |
+| Primary output | `pinMessage()` and `unpinMessage()` → `Promise`; `isPinMessageEnabled()` → `Promise`; `getPinMessageLimit()` → `Promise` |
+| Constraints | Pinning is a moderation action: only an admin, moderator or group owner may pin or unpin, and the server is the authority. A just-sent message may not be pinnable yet while moderation is pending. On a cap breach the rejection carries the server-owned ceiling in `errorParams.limit`. There is no `isPinned()` or `isSystemPinned()` in this SDK — read `getPinnedAt()`. Fetch the pinned list with `setPinnedOnly(true)`, scoped to one conversation. |
+| Related | [Save a Message](/sdk/react-native/save-message) · [Pin a Conversation](/sdk/react-native/pin-conversation) · [Real-time Listeners](/sdk/react-native/real-time-listeners) · [Message Filtering](/sdk/react-native/additional-message-filtering) |
+| Full reference | [`BaseMessage`](/sdk/reference/messages#basemessage) · [`CometChatException`](/sdk/reference/auxiliary#cometchatexception) |
+
```javascript
// Pin / unpin a message
const pinned = await CometChat.pinMessage(messageId);
diff --git a/sdk/react-native/save-message.mdx b/sdk/react-native/save-message.mdx
index 558dfe91b..45c3f3e6e 100644
--- a/sdk/react-native/save-message.mdx
+++ b/sdk/react-native/save-message.mdx
@@ -7,6 +7,18 @@ description: "Save and unsave messages privately, fetch the saved list across co
{/* TL;DR for Agents and Quick Reference */}
+| Field | Value |
+| --- | --- |
+| Package | `@cometchat/chat-sdk-react-native` |
+| Import | `import { CometChat } from "@cometchat/chat-sdk-react-native";` |
+| Key Methods | `saveMessage()`, `unsaveMessage()`, `isSaveMessageEnabled()`, `getSaveMessageLimit()`, `addMessageListener()`, `removeMessageListener()` |
+| Key Classes | `BaseMessage`, `MessagesRequest`, `MessagesRequestBuilder`, `MessageListener`, `CometChatException` |
+| Prerequisites | SDK initialized via [`CometChat.init()`](/sdk/react-native/setup-sdk) and a logged-in user via [`CometChat.login()`](/sdk/react-native/authentication-overview) |
+| Primary output | `saveMessage()` and `unsaveMessage()` → `Promise`; `isSaveMessageEnabled()` → `Promise`; `getSaveMessageLimit()` → `Promise` |
+| Constraints | Saves are private and per-viewer: `savedAt` is only ever set in the acting user's own context. They are account-wide, so do not combine `setSavedOnly(true)` with `setUID()` or `setGUID()`. There is no `isSaved()` in this SDK — read `getSavedAt()`. The real-time callbacks fire for saves made on your other devices, not on the one that performed the save. |
+| Related | [Pin a Message](/sdk/react-native/pin-message) · [Pin a Conversation](/sdk/react-native/pin-conversation) · [Retrieve Conversations](/sdk/react-native/retrieve-conversations) · [Message Filtering](/sdk/react-native/additional-message-filtering) |
+| Full reference | [`BaseMessage`](/sdk/reference/messages#basemessage) · [`CometChatException`](/sdk/reference/auxiliary#cometchatexception) |
+
```javascript
// Save / unsave a message
const saved = await CometChat.saveMessage(messageId);
diff --git a/sdk/react-native/thread-subscription.mdx b/sdk/react-native/thread-subscription.mdx
index f63f1ced7..9955fb84b 100644
--- a/sdk/react-native/thread-subscription.mdx
+++ b/sdk/react-native/thread-subscription.mdx
@@ -7,6 +7,18 @@ description: "Subscribe and unsubscribe from message threads, read subscription
{/* TL;DR for Agents and Quick Reference */}
+| Field | Value |
+| --- | --- |
+| Package | `@cometchat/chat-sdk-react-native` |
+| Import | `import { CometChat } from "@cometchat/chat-sdk-react-native";` |
+| Key Methods | `subscribeToThread()`, `unsubscribeFromThread()`, `getMessageDetails()`, `addMessageListener()` |
+| Key Classes | `BaseMessage`, `MessageThread`, `ThreadsRequest`, `ThreadsRequestBuilder`, `MessageListener` |
+| Prerequisites | SDK initialized via [`CometChat.init()`](/sdk/react-native/setup-sdk) and a logged-in user via [`CometChat.login()`](/sdk/react-native/authentication-overview) |
+| Primary output | `subscribeToThread()` and `unsubscribeFromThread()` → `Promise`; `ThreadsRequest.fetchNext()` → `Promise` |
+| Constraints | A thread is identified by its parent message ID, passed as a number. Unsubscribing hard-deletes the server row, so a thread inbox must drop that row rather than mark it unfollowed. A message that arrives over the socket carries no subscription flag and reads `false`, which does not mean the user is unsubscribed. `setThreadSubscribed()` only changes the object in memory and sends nothing to the server. `ThreadsRequestBuilder` spells its scope setters `setUid()` and `setGuid()`, unlike `MessagesRequestBuilder`. |
+| Related | [Threaded Messages](/sdk/react-native/threaded-messages) · [Mentions](/sdk/react-native/mentions) · [Real-time Listeners](/sdk/react-native/real-time-listeners) · [Save a Message](/sdk/react-native/save-message) |
+| Full reference | [`BaseMessage`](/sdk/reference/messages#basemessage) · [thread row fields](#reading-a-thread-row) |
+
```javascript
// Subscribe / unsubscribe — a thread is identified by its PARENT message id
await CometChat.subscribeToThread(100);
diff --git a/sdk/react-native/upload-files.mdx b/sdk/react-native/upload-files.mdx
index 3ac362be5..002abe6b6 100644
--- a/sdk/react-native/upload-files.mdx
+++ b/sdk/react-native/upload-files.mdx
@@ -4,6 +4,23 @@ sidebarTitle: "Upload Files"
description: "Upload files directly to storage with per-file progress, remove, and retry through an UploadFileRequest — then send them as one or more media messages with multiple attachments."
---
+{/* TL;DR for Agents and Quick Reference */}
+
+
+| Field | Value |
+| --- | --- |
+| Package | `@cometchat/chat-sdk-react-native` |
+| Import | `import { CometChat } from "@cometchat/chat-sdk-react-native";` |
+| Key Methods | `createUploadFileRequest()`, `getMaxAttachmentCount()`, `sendMediaMessage()` |
+| Key Classes | `UploadFileRequest`, `UploadFileListener`, `Attachment`, `MediaMessage` |
+| Prerequisites | SDK initialized via [`CometChat.init()`](/sdk/react-native/setup-sdk) and a logged-in user via [`CometChat.login()`](/sdk/react-native/authentication-overview) |
+| Primary output | `createUploadFileRequest()` → `UploadFileRequest`, returned synchronously; uploads report through `UploadFileListener`; `getAttachments()` → `Attachment[]`; `getMaxAttachmentCount()` → `Promise`; `sendMediaMessage()` → `Promise` |
+| Constraints | One request covers one destination and one batch, so create a separate request per conversation or thread. `receiverId` and `receiverType` must match the message you eventually send, because the upload-authorization endpoint enforces them. You supply `fileId` yourself; the SDK never generates one. `onFileError` means the request was rejected, which is not the same as an upload that failed midway. The attachment getters return uploaded files only. |
+| Related | [Send a Message](/sdk/react-native/send-message) · [Multiple attachments](/sdk/react-native/send-message#multiple-attachments-in-a-media-message) · [Receive Messages](/sdk/react-native/receive-messages) · [Edit a Message](/sdk/react-native/edit-message) |
+| Full reference | [`Attachment`](/sdk/reference/auxiliary#attachment) · [`MediaMessage`](/sdk/reference/messages#mediamessage) |
+
+
+
`CometChat.createUploadFileRequest(receiverId, receiverType)` returns an **`UploadFileRequest`** — the entry point for uploading files **directly to storage** with **per-file progress, success, and failure**. Upload is **decoupled from sending**: each uploaded file yields an [`Attachment`](/sdk/reference/auxiliary#attachment) (carrying a hosted `url`), which you then attach to a [`MediaMessage`](/sdk/reference/messages#mediamessage) and send with [`sendMediaMessage()`](/sdk/react-native/send-message#media-message).
A request object is scoped to **one destination** (`receiverId` / `receiverType`) and **one upload batch**. This is the recommended way to build a **multi-attachment composer**: create a request, upload a batch of files, show a progress bar per file, let the user remove or retry individual files, then send them as a single media message with multiple attachments (or split across several).
diff --git a/ui-kit/react-native/ai-features.mdx b/ui-kit/react-native/ai-features.mdx
index f033a6ee6..64ef26030 100644
--- a/ui-kit/react-native/ai-features.mdx
+++ b/ui-kit/react-native/ai-features.mdx
@@ -11,6 +11,7 @@ description: "Integrate AI-powered conversation starters, smart replies, and con
| Required setup | `CometChatUIKit.init(UIKitSettings)` then `CometChatUIKit.login("UID")` + AI features enabled in [CometChat Dashboard](/fundamentals/ai-user-copilot/overview) |
| AI features | Conversation Starter, Smart Replies, Conversation Summary |
| Key components | `CometChatMessageList` (Conversation Starter, Smart Replies), `CometChatMessageHeader` + `CometChatConversationSummary` (Conversation Summary) |
+| Standalone components | `CometChatConversationStarter` · `CometChatSmartReplies` · `CometChatConversationSummary` — all exported from the kit root, for custom placement |
| Activation | Enable each AI feature from the CometChat Dashboard, then pass the corresponding prop(s) to the component — Conversation Summary also needs `onConversationSummaryPress` and your own `CometChatConversationSummary` |
@@ -40,6 +41,35 @@ Once you have successfully activated the [Conversation Starter](/fundamentals/ai
+### Rendering the component directly
+
+`CometChatMessageList` renders `CometChatConversationStarter` for you when `showConversationStarters` is set, so most apps never render it themselves. Render it directly when you need the chips somewhere the list does not put them — a custom empty state, or above your own composer.
+
+| Prop | Type | Required | Description |
+| --- | --- | --- | --- |
+| `getConversationStarters` | `() => Promise` | Yes | Returns the suggestions to render. |
+| `onSuggestionClicked` | `(reply: string) => void` | No | Fires with the chip's text when a suggestion is tapped. |
+
+The component has no `style` prop — it takes its colors from the active [theme](/ui-kit/react-native/theme).
+
+```tsx
+import { CometChat } from '@cometchat/chat-sdk-react-native';
+import { CometChatConversationStarter } from '@cometchat/chat-uikit-react-native';
+
+const fetchConversationStarters = () =>
+ CometChat.getConversationStarter(user.getUid(), CometChat.RECEIVER_TYPE.USER);
+
+ sendMessage(text)}
+/>
+```
+
+
+The component fetches once, on mount. To fetch again (for example when the user opens another chat), give it a `key` that changes, such as the chat's UID or GUID.
+
+
## Smart Replies
Smart Replies are AI-generated responses to messages. They predict what a user might want to say next by analyzing the context of the conversation, allowing for quicker and more convenient responses on mobile devices.
@@ -59,6 +89,44 @@ Once you have successfully activated the [Smart Replies](/fundamentals/ai-user-c
+### Rendering the component directly
+
+As with the conversation starter, `CometChatMessageList` renders `CometChatSmartReplies` for you when `showSmartReplies` is set. Render it directly only for custom placement.
+
+| Prop | Type | Required | Description |
+| --- | --- | --- | --- |
+| `getSmartReplies` | `() => Promise` | Yes | Returns the replies to render. |
+| `onSuggestionClicked` | `(reply: string) => void` | No | Fires with the chip's text when a reply is tapped. |
+| `closeCallback` | `() => void` | No | Fires when the user dismisses the panel with its close button. |
+
+The component has no `style` prop — it takes its colors from the active [theme](/ui-kit/react-native/theme).
+
+
+**`CometChat.getSmartReplies()` does not resolve to an array.**
+
+Its SDK signature is `Promise
+
+```tsx
+import { CometChat } from '@cometchat/chat-sdk-react-native';
+import { CometChatSmartReplies } from '@cometchat/chat-uikit-react-native';
+
+const fetchSmartReplies = () =>
+ CometChat.getSmartReplies(user.getUid(), CometChat.RECEIVER_TYPE.USER)
+ .then((res) => Object.values(res) as string[]);
+
+ sendMessage(text)}
+ closeCallback={() => setShowReplies(false)}
+/>
+```
+
+
+The component fetches once, on mount. To fetch again (for example when the user opens another chat), give it a `key` that changes, such as the chat's UID or GUID.
+
+
## Conversation Summary
The Conversation Summary feature provides concise summaries of long conversations, allowing users to catch up quickly on missed chats. This feature uses natural language processing to determine the main points in a conversation.
@@ -93,6 +161,13 @@ const fetchConversationSummary = () =>
Place `CometChatConversationSummary` between the message list and the composer so the panel appears above the composer.
+| Prop | Type | Required | Description |
+| --- | --- | --- | --- |
+| `getConversationSummary` | `() => Promise` | Yes | Returns the summary text to display. |
+| `closeCallback` | `() => void` | No | Fires when the user dismisses the panel with its close button. Use it to clear the state that renders the panel. |
+
+Like the other two AI components, it has no `style` prop and is themed through the active [theme](/ui-kit/react-native/theme).
+
diff --git a/ui-kit/react-native/call-buttons.mdx b/ui-kit/react-native/call-buttons.mdx
index 17bc81534..b42d690de 100644
--- a/ui-kit/react-native/call-buttons.mdx
+++ b/ui-kit/react-native/call-buttons.mdx
@@ -22,7 +22,7 @@ description: "Add voice and video call buttons with CometChatCallButtons compone
## Where It Fits
-`CometChatCallButtons` is a [Component](/ui-kit/react-native/components-overview#components) that provides users with the ability to make calls, access call-related functionalities, and control call settings. Clicking this button typically triggers the call to be placed to the desired recipient.
+`CometChatCallButtons` is a [Component](/ui-kit/react-native/components-overview#component-catalog) that provides users with the ability to make calls, access call-related functionalities, and control call settings. Clicking this button typically triggers the call to be placed to the desired recipient.
@@ -73,7 +73,7 @@ function CallButtonsWithError() {
| Event | Fires when | Payload |
| --- | --- | --- |
-| `ccCallRejected` | Initiated call is rejected by the receiver | `{ call }` |
+| `ccCallRejected` | The local user cancels the outgoing call before it is answered (not when the receiver rejects) | `{ call }` |
| `ccCallFailed` | Error occurs during the initiated call | `{ call }` |
| `ccOutgoingCall` | User initiates a voice/video call | `{ call }` |
@@ -165,28 +165,21 @@ function StylingDemo() {
You can customize the properties of the Outgoing Call component by making use of the `outgoingCallConfiguration` prop:
```tsx lines
-import {
- CometChatCallButtons,
- OutgoingCallConfiguration,
-} from "@cometchat/chat-uikit-react-native";
+import { CometChatCallButtons } from "@cometchat/chat-uikit-react-native";
function OutgoingCallConfigDemo() {
- const getOutgoingCallConfig = () => {
- return new OutgoingCallConfiguration({
- disableSoundForCalls: true,
- });
- };
-
return (
);
}
```
-All exposed properties of `OutgoingCallConfiguration` can be found under [Outgoing Call](/ui-kit/react-native/outgoing-call).
+All properties accepted by `outgoingCallConfiguration` can be found under [Outgoing Call](/ui-kit/react-native/outgoing-call).
---
diff --git a/ui-kit/react-native/compact-message-composer.mdx b/ui-kit/react-native/compact-message-composer.mdx
index f9acd34d2..6e8929198 100644
--- a/ui-kit/react-native/compact-message-composer.mdx
+++ b/ui-kit/react-native/compact-message-composer.mdx
@@ -237,18 +237,18 @@ On React Native, the `showTextSelectionMenuItems` prop controls whether Bold, It
The `enterKeyBehavior` prop controls what happens when the Enter key is pressed on Android. On iOS, Enter always inserts a new line.
```tsx lines
-import { CometChatCompactMessageComposer, EnterKeyBehavior } from "@cometchat/chat-uikit-react-native";
+import { CometChatCompactMessageComposer, CometChatUiKitConstants } from "@cometchat/chat-uikit-react-native";
// Send message on Enter (Android)
// New line on Enter (default)
```
@@ -698,7 +698,7 @@ Using the `style` prop you can customize the look and feel of the component in y
| `initialComposertext` | Set predefined text | `initialComposertext="Your custom text"` |
| `placeHolderText` | Placeholder text for the input | `placeHolderText="Type a message..."` |
| `customSoundForOutgoingMessage` | Custom sound for outgoing messages | `customSoundForOutgoingMessage="your-sound"` |
-| `hideVoiceRecordingButton` | Hide voice recording option | `hideVoiceRecordingButton={true}` |
+| `hideVoiceRecording` | Hide voice recording option | `hideVoiceRecording={true}` |
| `hideCameraOption` | Hide camera option from attachments | `hideCameraOption={true}` |
| `hideImageAttachmentOption` | Hide image attachment option | `hideImageAttachmentOption={true}` |
| `hideVideoAttachmentOption` | Hide video attachment option | `hideVideoAttachmentOption={true}` |
@@ -719,7 +719,7 @@ Using the `style` prop you can customize the look and feel of the component in y
| `enableRichTextEditor` | Enable/disable rich text formatting | `enableRichTextEditor={true}` |
| `hideRichTextFormattingOptions` | Hide the formatting toolbar; formatting stays available from the text selection menu | `hideRichTextFormattingOptions={true}` |
| `showTextSelectionMenuItems` | Formatting in native text selection menu | `showTextSelectionMenuItems={true}` |
-| `enterKeyBehavior` | Android Enter key behavior | `enterKeyBehavior={EnterKeyBehavior.SendMessage}` |
+| `enterKeyBehavior` | Android Enter key behavior | `enterKeyBehavior={CometChatUiKitConstants.EnterKeyBehavior.SendMessage}` |
| `maxLines` | Maximum lines before scrolling | `maxLines={3}` |
| `minInputHeight` | Minimum input height in pixels | `minInputHeight={36}` |
| `maxInputHeight` | Maximum input height in pixels | `maxInputHeight={120}` |
@@ -727,24 +727,6 @@ Using the `style` prop you can customize the look and feel of the component in y
---
-## Configuration
-
-`SingleLineMessageComposerConfiguration` can be used to pass configuration when embedding the CompactMessageComposer inside other components:
-
-```tsx lines
-import { SingleLineMessageComposerConfiguration } from "@cometchat/chat-uikit-react-native";
-
-const config = new SingleLineMessageComposerConfiguration({
- disableTypingEvents: true,
- hideVoiceRecording: true,
- disableMentions: false,
- maxLines: 3,
- placeHolderText: "Write something...",
-});
-```
-
----
-
## Next Steps
diff --git a/ui-kit/react-native/component-styling.mdx b/ui-kit/react-native/component-styling.mdx
index 2865331f8..59d12322e 100644
--- a/ui-kit/react-native/component-styling.mdx
+++ b/ui-kit/react-native/component-styling.mdx
@@ -1374,7 +1374,7 @@ To learn more about such attributes, refer to the [theme interface](https://gith
### Receipts
-The `CometChatReceipts` component indicates message delivery and read statuses using intuitive icons. These can be styled for icon size, tint, and alignment, ensuring they remain clear and consistent with your app's UI.
+Message receipts indicate delivery and read statuses using intuitive icons. The theme's `receiptStyles` controls their icons and icon styles (size, tint) wherever a component renders receipts without its own style — for example the last-message receipt in `CometChatConversations`, shown below. Message bubbles in `CometChatMessageList` apply their own receipt styles, so this top-level override does not change them.
@@ -1382,7 +1382,7 @@ The `CometChatReceipts` component indicates message delivery and read statuses u
```javascript
import {
- CometChatReceipt,
+ CometChatConversations,
CometChatThemeProvider,
} from "@cometchat/chat-uikit-react-native";
import { SafeAreaView } from "react-native-safe-area-context";
@@ -1403,11 +1403,7 @@ return (
},
}}
>
- {loggedIn && (
-
- )}
+ {loggedIn && }
);
diff --git a/ui-kit/react-native/components-overview.mdx b/ui-kit/react-native/components-overview.mdx
index d2cffa3fd..0df41931a 100644
--- a/ui-kit/react-native/components-overview.mdx
+++ b/ui-kit/react-native/components-overview.mdx
@@ -58,21 +58,28 @@ All components are imported from `@cometchat/chat-uikit-react-native`.
| CometChatMessageComposer | Rich text input with attachments, mentions, voice notes | `user`, `group`, `onSendButtonPress`, `placeholderText` | [Message Composer](/ui-kit/react-native/message-composer) |
| CometChatCompactMessageComposer | Compact message input with rich text formatting, auto-expanding input, and attachments | `user`, `group`, `onSendButtonPress`, `enableRichTextEditor` | [Compact Message Composer](/ui-kit/react-native/compact-message-composer) |
| CometChatThreadHeader | Parent message bubble and reply count for threaded view | `parentMessage`, `onClose` | [Thread Header](/ui-kit/react-native/threaded-messages-header) |
+| CometChatReactions | Row of reaction pills under a message bubble | `messageObject`, `onReactionPress`, `alignment` | [Message List](/ui-kit/react-native/message-list#reaction-components) |
+| CometChatQuickReactions | Quick reaction bar shown on long press | `quickReactions`, `onReactionPress`, `onAddReactionPress` | [Message List](/ui-kit/react-native/message-list#reaction-components) |
+| CometChatReactionList | Tabbed sheet listing who reacted with what | `message`, `onPress`, `selectedReaction` | [Message List](/ui-kit/react-native/message-list#reaction-components) |
### Calling
| Component | Purpose | Key Props | Page |
| --- | --- | --- | --- |
-| CometChatCallButtons | Voice and video call initiation buttons | `user`, `group`, `onVoiceCallPress`, `onVideoCallPress` | [Call Buttons](/ui-kit/react-native/call-buttons) |
+| CometChatCallButtons | Voice and video call initiation buttons | `user`, `group`, `hideVoiceCallButton`, `hideVideoCallButton` | [Call Buttons](/ui-kit/react-native/call-buttons) |
| CometChatIncomingCall | Incoming call notification with accept/decline | `call`, `onAccept`, `onDecline` | [Incoming Call](/ui-kit/react-native/incoming-call) |
-| CometChatOutgoingCall | Outgoing call screen with cancel control | `call`, `onClosePress` | [Outgoing Call](/ui-kit/react-native/outgoing-call) |
-| CometChatCallLogs | Scrollable list of call history | `callLogsRequestBuilder`, `onItemPress` | [Call Logs](/ui-kit/react-native/call-logs) |
+| CometChatOutgoingCall | Outgoing call screen with cancel control | `call`, `onEndCallButtonPressed` | [Outgoing Call](/ui-kit/react-native/outgoing-call) |
+| CometChatOngoingCall | In-call screen for an active voice or video call | `sessionID`, `callSettingsBuilder` | [Ongoing Call](/ui-kit/react-native/ongoing-call) |
+| CometChatCallLogs | Scrollable list of call history | `callLogRequestBuilder`, `onItemPress` | [Call Logs](/ui-kit/react-native/call-logs) |
### AI
| Component | Purpose | Key Props | Page |
| --- | --- | --- | --- |
| CometChatAIAssistantChatHistory | AI assistant conversation history | `user`, `onMessageClicked`, `onNewChatButtonClick` | [AI Assistant Chat History](/ui-kit/react-native/ai-assistant-chat-history) |
+| CometChatConversationStarter | AI-generated opening lines as tappable chips | `getConversationStarters`, `onSuggestionClicked` | [Smart Chat Features](/ui-kit/react-native/ai-features#conversation-starter) |
+| CometChatSmartReplies | AI-generated reply suggestions as tappable chips | `getSmartReplies`, `onSuggestionClicked`, `closeCallback` | [Smart Chat Features](/ui-kit/react-native/ai-features#smart-replies) |
+| CometChatConversationSummary | AI-generated summary of a conversation | `getConversationSummary`, `closeCallback` | [Smart Chat Features](/ui-kit/react-native/ai-features#conversation-summary) |
---
diff --git a/ui-kit/react-native/core-features.mdx b/ui-kit/react-native/core-features.mdx
index d2ddfb96d..d227e757c 100644
--- a/ui-kit/react-native/core-features.mdx
+++ b/ui-kit/react-native/core-features.mdx
@@ -139,7 +139,7 @@ CometChat's Reactions feature adds a layer of expressiveness to your chat applic
## Mentions
-Mentions is a feature that enhances the interactivity and clarity of group or 1-on-1 chats by allowing users to directly address or refer to specific individuals in a conversation.
+Mentions is a feature that enhances the interactivity and clarity of group or 1-on-1 chats by allowing users to directly address or refer to specific individuals in a conversation. In group chats, users can also mention everyone at once with `@all` (the label can be changed with `mentionAllLabel` on the [Message Composer](/ui-kit/react-native/message-composer)).
@@ -242,6 +242,8 @@ After implementing moderation rules, users can report messages they find inappro
The Report Message feature allows users to report inappropriate or harmful messages within the chat. Users can choose from predefined reasons and provide additional remarks for detailed context. This feature helps maintain a safe and respectful chat environment.
+The Report option appears only on messages sent by **other** users, never on your own, and is always hidden in conversations with an AI agent. It is also hidden when `hideFlagMessageOption` is set on the [Message List](/ui-kit/react-native/message-list), and the [Pinned Messages](/ui-kit/react-native/pinned-messages) panel does not currently offer it. To test it, long-press a message someone else sent.
+
Learn more about how flagged messages are handled, reviewed, and moderated in the [Flagged Messages](/moderation/flagged-messages) documentation.
diff --git a/ui-kit/react-native/custom-message-types.mdx b/ui-kit/react-native/custom-message-types.mdx
new file mode 100644
index 000000000..5aab848ba
--- /dev/null
+++ b/ui-kit/react-native/custom-message-types.mdx
@@ -0,0 +1,282 @@
+---
+title: "Custom Message Types"
+sidebarTitle: "Custom Message Types"
+description: "Register a custom message type in the CometChat React Native UI Kit using DataSourceDecorator, ChatConfigurator and ExtensionsDataSource — the five required overrides, and the registration timing that makes them stick."
+---
+
+
+
+| Field | Value |
+| --- | --- |
+| Package | `@cometchat/chat-uikit-react-native` |
+| Import | `import { ChatConfigurator, DataSourceDecorator, ExtensionsDataSource } from "@cometchat/chat-uikit-react-native";` |
+| Key classes | `DataSourceDecorator` · `ChatConfigurator` · `ExtensionsDataSource` · `MessageDataSource` |
+| Required overrides | **Five** — `getAllMessageTemplates` · `getMessageTemplate` · `getAllMessageTypes` · `getAllMessageCategories` · `getId` |
+| Register with | `ChatConfigurator.enable(source => new MyDataSource(source))` |
+| Prerequisites | `CometChatUIKit.init()` completed **and** `CometChatUIKit.login()` resolved — [details](#when-to-register) |
+| Constraints | `getId` must not call `super` and must be unique · registration before `login()` is discarded · an `ExtensionsDataSource` must override `enable()` |
+| Primary output | The custom type renders in `CometChatMessageList` **and** survives a reload |
+| Related | [Message List](/ui-kit/react-native/message-list) · [Message Composer](/ui-kit/react-native/message-composer) · [Methods](/ui-kit/react-native/methods) |
+
+
+
+The UI Kit has no plugin API. It customises through a **decorator chain**: you wrap the active data source in your own `DataSourceDecorator`, override the methods you need, and register the result with `ChatConfigurator`.
+
+```mermaid
+graph LR
+ CC["ChatConfigurator.dataSource"] --> D["Your DataSourceDecorator"]
+ D --> M["MessageDataSource (default)"]
+```
+
+`MessageDataSource` is the default implementation `ChatConfigurator` starts from. Every decorator you register wraps whatever is currently active, so calling `enable()` more than once layers decorators rather than replacing them.
+
+---
+
+## The five required overrides
+
+A custom message type has to be declared twice — once so the list knows how to **render** it, and once so the list knows to **fetch** it — plus an identity so `ChatConfigurator` can tell your decorator apart from the others.
+
+| Half | Methods | Why |
+| --- | --- | --- |
+| Render | `getAllMessageTemplates` · `getMessageTemplate` | Maps the type to a bubble |
+| **Fetch** | **`getAllMessageTypes`** · **`getAllMessageCategories`** | `CometChatMessageList` builds `setTypes`/`setCategories` from these |
+| **Identity** | **`getId`** | `ChatConfigurator.enable()` dedupes on it |
+
+Miss the fetch half and the bubble renders optimistically when the message is sent, then disappears on reload — the type is filtered out **server-side**, with no error in the console, on the listener, or in the network response. See [Filtering Messages](/ui-kit/react-native/message-list#filtering-messages).
+
+The four template and type methods must call `super` and extend the result. Returning your own list wholesale drops every built-in type.
+
+
+**`getId` is the exception — it must not call `super`.**
+
+The base implementation on `DataSourceDecorator` throws, it does not delegate:
+
+```ts
+getId(): string {
+ throw new Error("Method not implemented.");
+}
+```
+
+Both ways of getting it wrong fail quietly or confusingly:
+
+| Mistake | What happens |
+| --- | --- |
+| No `getId` override, or `return super.getId()` | Crashes at `ChatConfigurator.enable()` with `Method not implemented.` — a message naming neither `getId` nor your decorator. The class is **not** `abstract`, so TypeScript does not catch it. |
+| `return this.dataSource.getId()` (the wrapped source's id) | `enable()` finds the id already in its `names` list, decides the decorator is registered, and **skips it silently**. Nothing renders and nothing errors. |
+
+Return a string unique to your decorator.
+
+
+---
+
+## When to register
+
+
+**Register after `CometChatUIKit.login()` resolves — not after `init()`.**
+
+`login()` calls `enableExtensions()`, whose first statement re-initialises the data source:
+
+```ts
+private static enableExtensions() {
+ ChatConfigurator.init(); // re-initialize data source
+```
+
+`ChatConfigurator.init()` replaces `dataSource` and resets the `names` dedup list:
+
+```ts
+static init(initialSource?: DataSource) {
+ this.dataSource = initialSource ?? new MessageDataSource();
+ this.names = ["message_utils"];
+ this.names.push(this.dataSource.getId());
+}
+```
+
+`enableExtensions()` runs from every entry point that establishes or changes the session — `init()`, `login()` and `getLoggedInUser()` among them. Anything registered at module scope, or straight after `init()`, is gone by the time the user is logged in.
+
+
+```tsx lines
+import { CometChatUIKit, ChatConfigurator } from "@cometchat/chat-uikit-react-native";
+
+await CometChatUIKit.init(uiKitSettings);
+await CometChatUIKit.login({ uid: "cometchat-uid-1" });
+
+// Only now does the registration survive.
+ChatConfigurator.enable((source) => new PollDataSource(source));
+```
+
+---
+
+## Example: a poll message type
+
+```tsx lines
+import { CometChat } from "@cometchat/chat-sdk-react-native";
+import {
+ ChatConfigurator,
+ CometChatMessageTemplate,
+ CometChatTheme,
+ DataSource,
+ DataSourceDecorator,
+} from "@cometchat/chat-uikit-react-native";
+import { Text } from "react-native";
+
+const POLL_TYPE = "poll";
+
+class PollDataSource extends DataSourceDecorator {
+ // Required. Must be unique and must not delegate to the wrapped source.
+ getId(): string {
+ return "poll_data_source";
+ }
+
+ // Fetch half — without these the bubble vanishes on reload.
+ getAllMessageTypes(): string[] {
+ return [...super.getAllMessageTypes(), POLL_TYPE];
+ }
+
+ getAllMessageCategories(): string[] {
+ return [...super.getAllMessageCategories(), CometChat.CATEGORY_CUSTOM];
+ }
+
+ // Render half.
+ getAllMessageTemplates(
+ theme: CometChatTheme,
+ additionalParams?: any
+ ): CometChatMessageTemplate[] {
+ return [
+ ...super.getAllMessageTemplates(theme, additionalParams),
+ this.getPollTemplate(),
+ ];
+ }
+
+ getMessageTemplate(
+ messageType: string,
+ messageCategory: string,
+ theme: CometChatTheme,
+ additionalParams?: any,
+ message?: CometChat.BaseMessage
+ ): CometChatMessageTemplate | null {
+ if (
+ messageType === POLL_TYPE &&
+ messageCategory === CometChat.CATEGORY_CUSTOM
+ ) {
+ return this.getPollTemplate();
+ }
+ return super.getMessageTemplate(
+ messageType,
+ messageCategory,
+ theme,
+ additionalParams,
+ message
+ );
+ }
+
+ private getPollTemplate(): CometChatMessageTemplate {
+ return new CometChatMessageTemplate({
+ type: POLL_TYPE,
+ category: CometChat.CATEGORY_CUSTOM,
+ ContentView: (message: CometChat.BaseMessage) => {
+ const data = (message as CometChat.CustomMessage).getCustomData() as {
+ question?: string;
+ };
+ return {data?.question ?? "Poll"};
+ },
+ });
+ }
+}
+
+export function registerPollType(source: DataSource) {
+ return new PollDataSource(source);
+}
+```
+
+Register it after login:
+
+```tsx lines
+ChatConfigurator.enable(registerPollType);
+```
+
+---
+
+## Registering through `uiKitSettings.extensions`
+
+`enableExtensions()` re-applies `uiKitSettings.extensions` *after* the reset, so an `ExtensionsDataSource` passed in settings is the one registration route that survives `login()`. It has its own trap.
+
+`ExtensionsDataSource` is abstract. It requires `addExtension()` and `getExtensionId()`, and ships a concrete `enable()`:
+
+```ts
+abstract class ExtensionsDataSource {
+ abstract addExtension(): void;
+ abstract getExtensionId(): string;
+
+ enable(): void {
+ CometChat.isExtensionEnabled(this.getExtensionId()).then((enabled) => {
+ if (enabled) this.addExtension();
+ });
+ }
+}
+```
+
+
+**A custom message type is not a dashboard extension.**
+
+`isExtensionEnabled("poll")` resolves `false` for any type you invented, so the inherited `enable()` never calls `addExtension()` and your decorator is never registered — silently. Override `enable()` as well, and the dashboard check is bypassed.
+
+Both steps or neither: passing the settings without overriding `enable()` fails exactly as quietly as registering before `login()`.
+
+
+```tsx lines
+import {
+ ChatConfigurator,
+ CometChatUIKit,
+ ExtensionsDataSource,
+} from "@cometchat/chat-uikit-react-native";
+// PollDataSource is the decorator from the example above.
+
+class PollExtension extends ExtensionsDataSource {
+ getExtensionId(): string {
+ return "poll";
+ }
+
+ addExtension(): void {
+ ChatConfigurator.enable((source) => new PollDataSource(source));
+ }
+
+ // Required: the inherited enable() gates on a dashboard check that is
+ // false for a custom type, so addExtension() would never run.
+ override enable(): void {
+ this.addExtension();
+ }
+}
+
+CometChatUIKit.init({
+ appId: "APP_ID",
+ region: "REGION",
+ authKey: "AUTH_KEY",
+ // Spread the defaults: `extensions` replaces them, it does not add to them.
+ extensions: [...CometChatUIKit.defaultExtensions, new PollExtension()],
+});
+```
+
+
+`extensions` **replaces** the built-in list. Passing only `[new PollExtension()]` turns off stickers, link preview, translation, polls, collaborative document and whiteboard, and thumbnail generation. Always spread `CometChatUIKit.defaultExtensions` first.
+
+
+Passed this way, the type is re-registered automatically on every `login()`, so you do not have to sequence the call yourself.
+
+---
+
+## Choosing a route
+
+| Route | Survives `login()` | Extra requirement |
+| --- | --- | --- |
+| `ChatConfigurator.enable()` after `login()` resolves | Yes, until the next `login()` / `getLoggedInUser()` | Sequence the call yourself |
+| `ExtensionsDataSource` in `uiKitSettings.extensions` | Yes, re-applied on every session change | Must override `enable()` |
+
+Use the settings route for a type your app always needs. Use the direct call for a type you register conditionally after the user is known.
+
+---
+
+## Related
+
+- [Message List → Filtering Messages](/ui-kit/react-native/message-list#filtering-messages) — why the fetch half matters.
+- [Message Composer](/ui-kit/react-native/message-composer) — sending a custom message.
+- [Methods](/ui-kit/react-native/methods) — `CometChatUIKit.init` and `login`.
diff --git a/ui-kit/react-native/events.mdx b/ui-kit/react-native/events.mdx
index 1db317b8e..a8d3118a4 100644
--- a/ui-kit/react-native/events.mdx
+++ b/ui-kit/react-native/events.mdx
@@ -10,11 +10,11 @@ description: "Listen to UI Kit events for conversations, users, groups, messages
| Package | `@cometchat/chat-uikit-react-native` |
| Import | `import { CometChatUIEventHandler } from "@cometchat/chat-uikit-react-native";` |
| Conversation events | `ccConversationDeleted`, `ccUpdateConversation` |
-| User events | `ccUserBlocked`, `ccUserUnblocked` |
-| Group events | `ccGroupCreated`, `ccGroupDeleted`, `ccGroupLeft`, `ccGroupMemberScopeChanged`, `ccGroupMemberKicked`, `ccGroupMemberBanned`, `ccGroupMemberUnbanned`, `ccGroupMemberJoined`, `ccGroupMemberAdded`, `ccOwnershipChanged` |
-| Message events | `ccMessageSent`, `ccMessageEdited`, `ccMessageDeleted`, `ccMessageRead`, `ccLiveReaction`, plus SDK listener events |
-| Call events | `onIncomingCallAccepted`, `onIncomingCallRejected`, `onCallEnded`, `onCallInitiated`, `onOutgoingCallAccepted`, `onOutgoingCallRejected` |
-| UI events | `ccActiveChatChanged`, `ccCardActionClicked` |
+| User events | `ccUserBlocked`, `ccUserUnBlocked` |
+| Group events | `ccGroupCreated`, `ccGroupDeleted`, `ccGroupLeft`, `ccGroupMemberScopeChanged`, `ccGroupMemberKicked`, `ccGroupMemberBanned`, `ccGroupMemberUnBanned`, `ccGroupMemberJoined`, `ccGroupMemberAdded`, `ccOwnershipChanged` |
+| Message events | `ccMessageSent`, `ccMessageEdited`, `ccMessageDeleted`, `ccMessageRead`, `ccActiveChatChanged`, plus SDK listener events |
+| Call events | `ccCallAccepted`, `ccCallRejected`, `ccCallEnded`, `ccOutgoingCall`, `ccCallFailed` |
+| UI events | `ccCardActionClicked` |
| Purpose | Decoupled communication between UI Kit components — subscribe to events to react to changes without direct component references |
@@ -41,7 +41,7 @@ It consists of the following events:
| Name | Description |
| --------------- | ------------------------------------------------------------------------- |
| ccUserBlocked | This event is triggered when the user successfully blocks another user. |
-| ccUserUnblocked | This event is triggered when the user successfully unblocks another user. |
+| ccUserUnBlocked | This event is triggered when the user successfully unblocks another user. |
### CometChatGroupsEvents
@@ -57,7 +57,7 @@ It consists of the following events:
| ccGroupMemberScopeChanged | This event is triggered when the group member's scope is updated successfully |
| ccGroupMemberKicked | This event is triggered when the group member is kicked |
| ccGroupMemberBanned | This event is triggered when the group member is banned |
-| ccGroupMemberUnbanned | This event is triggered when the group member is un-banned |
+| ccGroupMemberUnBanned | This event is triggered when the group member is un-banned |
| ccGroupMemberJoined | This event is triggered when a user joins the group |
| ccGroupMemberAdded | This event is triggered when a user is added to the group |
| ccOwnershipChanged | This event is triggered when the group ownership is assigned to another group member |
@@ -74,7 +74,11 @@ It consists of the following events:
| ccMessageEdited | This event is triggered when the user successfully edits the message. |
| ccMessageDeleted | This event is triggered when the user successfully deletes the message. |
| ccMessageRead | This event is triggered when the sent message is read by the receiver. |
-| ccLiveReaction | This event is triggered when the user sends a live reaction. |
+| ccActiveChatChanged | This event is triggered when the user navigates to a particular chat window. |
+| ccMessageError | Triggers when the collaborative document or whiteboard extension fails to create its message, or when fetching stickers fails. Payload: the `CometChatException`. |
+| ccMessagePinned / ccMessageUnpinned | Triggers when the user pins or unpins a message from the message list or the Pinned Messages panel. Payload: `{ message }`. |
+| ccMessageSaved / ccMessageUnsaved | Triggers when the user saves or unsaves a message from the message list, Pinned Messages or Saved Messages. Payload: `{ message }`. |
+| ccThreadSubscriptionChanged | Triggers when the user subscribes to or unsubscribes from a thread: on the optimistic change, on the server reply, and on a revert. Payload: `{ parentMessageId, subscribed, inProgress }`. |
| onTextMessageReceived | This event is emitted when the CometChat SDK listener emits a text message. |
| onMediaMessageReceived | This event is emitted when the CometChat SDK listener emits a media message. |
| onCustomMessageReceived | This event is emitted when the CometChat SDK listener emits a custom message. |
@@ -97,16 +101,36 @@ It consists of the following events:
It consists of the following events:
-| Name | Description |
-| ------------------------------------------- | ------------------------------------------------------- |
-| **func** onIncomingCallAccepted(call: Call) | Triggers whenever incoming call is accepted by the user |
-| **func** onIncomingCallRejected(call: Call) | Triggers whenever incoming call is rejected by the user |
-| **func** onCallEnded(call: Call) | Triggers whenever the call is ended |
-| **func** onCallInitiated(call: Call) | Triggers whenever the call is getting initiated |
-| **func** onOutgoingCallAccepted(call: Call) | Triggers whenever outgoing call is accepted by the user |
-| **func** onOutgoingCallRejected(call: Call) | Triggers whenever outgoing call is rejected by the user |
-
-### CometChatUIEventListener
+| Name | Description |
+| -------------- | ------------------------------------------------------------------------------------------------------------------------ |
+| ccCallAccepted | Triggers when the user accepts an incoming call. Payload: `{ call }`. |
+| ccCallRejected | Triggers when the user rejects an incoming call, or cancels an outgoing call before it is answered. Payload: `{ call }`. |
+| ccCallEnded | Triggers when a call ends. Payload: `{ call }`; `call` can be undefined. |
+| ccOutgoingCall | Triggers when the user places a call. Payload: `{ call }`. |
+| ccCallFailed | Triggers when a call cannot start or fails. Payload: `{ call }` from Call Buttons and Call Logs (call could not be placed); `{ error }` from Incoming Call and Outgoing Call (the call session failed). |
+
+Outgoing-call **accepted** and **rejected** are not UI Kit events — the UI Kit never emits them. Listen for them on the Chat SDK's call listener instead:
+
+```tsx lines
+import { CometChat } from "@cometchat/chat-sdk-react-native";
+
+CometChat.addCallListener(
+ "OUTGOING_CALL_LISTENER",
+ new CometChat.CallListener({
+ onOutgoingCallAccepted: (call: CometChat.Call) => {
+ // the callee accepted
+ },
+ onOutgoingCallRejected: (call: CometChat.Call) => {
+ // the callee rejected
+ },
+ })
+);
+
+// Remove it when you no longer need it, e.g. when the screen unmounts
+CometChat.removeCallListener("OUTGOING_CALL_LISTENER");
+```
+
+### UI Events
UI events refer to actions or interactions performed by a user within the CometChat UI Kit. These events are triggered when a user interacts with various UI elements, such as buttons, menus, checkboxes, input fields, or any other interactive components.
@@ -114,8 +138,8 @@ It consists of the following events:
| Name | Description |
| ------------------- | ---------------------------------------------------------------------------- |
-| ccActiveChatChanged | This event is triggered when the user navigates to a particular chat window. |
| ccCardActionClicked | This event is triggered when the user clicks an action on a card message bubble. The event payload contains the `message` and the clicked `action`. |
+| openChat | Triggers when the user picks "Message privately" on a group message. Emitted with `emitUIEvent`. Payload: `{ user }`. |
---
diff --git a/ui-kit/react-native/expo-integration.mdx b/ui-kit/react-native/expo-integration.mdx
index 7cab22bc9..37d8b222b 100644
--- a/ui-kit/react-native/expo-integration.mdx
+++ b/ui-kit/react-native/expo-integration.mdx
@@ -124,8 +124,6 @@ Add required permissions for camera and microphone:
"android.permission.MODIFY_AUDIO_SETTINGS",
"android.permission.RECORD_AUDIO",
"android.permission.ACCESS_NETWORK_STATE",
- "android.permission.WRITE_EXTERNAL_STORAGE",
- "android.permission.READ_EXTERNAL_STORAGE",
"android.permission.VIBRATE"
]
}
@@ -133,6 +131,8 @@ Add required permissions for camera and microphone:
}
```
+The UI Kit declares `READ_EXTERNAL_STORAGE` and `WRITE_EXTERNAL_STORAGE` in its own Android manifest, so you do not need to add them yourself.
+
### Optional: Install Calling SDK
To enable voice/video calling:
diff --git a/ui-kit/react-native/groups.mdx b/ui-kit/react-native/groups.mdx
index c7a645b21..5518feb5a 100644
--- a/ui-kit/react-native/groups.mdx
+++ b/ui-kit/react-native/groups.mdx
@@ -14,7 +14,7 @@ description: "Searchable, scrollable list of all available groups with icon, nam
| Primary output | `onItemPress(group)` — opens the selected group chat |
| Other actions | `onItemLongPress` · `onBack` · `onSelection` · `onSubmit` · `onError` · `onEmpty` · `onLoad` — [details](#actions-and-events) |
| View slots | `ItemView` · `LeadingView` · `TitleView` · `SubtitleView` · `TrailingView` · `LoadingView` · +3 more — [details](#custom-view-slots) |
-| UI events | `ccGroupCreated` · `ccGroupDeleted` · `ccGroupLeft` · `ccGroupMemberScopeChanged` · `ccGroupMemberBanned` · `ccGroupMemberKicked` · `ccGroupMemberUnbanned` · `ccGroupMemberJoined` · `ccGroupMemberAdded` · `ccOwnershipChanged` |
+| UI events | `ccGroupCreated` · `ccGroupDeleted` · `ccGroupLeft` · `ccGroupMemberScopeChanged` · `ccGroupMemberBanned` · `ccGroupMemberKicked` · `ccGroupMemberUnBanned` · `ccGroupMemberJoined` · `ccGroupMemberAdded` · `ccOwnershipChanged` |
| Styling | `style` prop — [tokens and overrides](#styling) |
| Prerequisites | `CometChatUIKit.init()` completed and a user logged in |
| Stitching | onItemPress emits CometChat.Group -> pass to MessageHeader, MessageList, MessageComposer (with `CometChatMessageHeader` · `CometChatMessageList` · `CometChatMessageComposer`) |
@@ -256,7 +256,7 @@ function GroupsWithLoadHandler() {
| `ccGroupMemberScopeChanged` | The logged-in user changes scope of another member | `IGroupMemberScopeChanged` |
| `ccGroupMemberBanned` | The logged-in user bans a group member | `IGroupMemberKickedBanned` |
| `ccGroupMemberKicked` | The logged-in user kicks a group member | `IGroupMemberKickedBanned` |
-| `ccGroupMemberUnbanned` | The logged-in user unbans a group member | `IGroupMemberUnBanned` |
+| `ccGroupMemberUnBanned` | The logged-in user unbans a group member | `IGroupMemberUnBanned` |
| `ccGroupMemberJoined` | The logged-in user joins a group | `IGroupMemberJoined` |
| `ccGroupMemberAdded` | The logged-in user adds members to a group | `IGroupMemberAdded` |
| `ccOwnershipChanged` | The logged-in user transfers group ownership | `IOwnershipChanged` |
diff --git a/ui-kit/react-native/guide-group-chat.mdx b/ui-kit/react-native/guide-group-chat.mdx
index 2f7568856..6fc243b5c 100644
--- a/ui-kit/react-native/guide-group-chat.mdx
+++ b/ui-kit/react-native/guide-group-chat.mdx
@@ -278,7 +278,7 @@ const AddMemberScreen: React.FC = ({ group, onBack }) => {
### 4. View and Manage Group Members
-Use `CometChatGroupMembers` to display members with options for scope changes and removal.
+Use `CometChatGroupMembers` to display members. Owners, admins and moderators get options to change a member's scope, remove them, or ban them.
```tsx
import React from 'react';
@@ -311,6 +311,8 @@ const ViewMembersScreen: React.FC = ({ group }) => {
};
```
+The UI Kit has no screen for listing banned members or unbanning them. To undo a ban from your app, use the Chat SDK: fetch banned members with [`BannedMembersRequestBuilder`](/sdk/react-native/group-kick-ban-members#get-list-of-banned-members-for-a-group), then unban with [`CometChat.unbanGroupMember()`](/sdk/react-native/group-kick-ban-members#unban-a-group-member). To remove the Ban option instead, set [`hideBanMemberOption`](/ui-kit/react-native/group-members).
+
---
### 5. Transfer Ownership
@@ -384,6 +386,8 @@ const TransferOwnershipScreen: React.FC = ({ group, onCl
| Add members | `CometChat.addMembersToGroup()` |
| Remove member | `CometChat.kickGroupMember()` |
| Ban member | `CometChat.banGroupMember()` |
+| Unban member | `CometChat.unbanGroupMember()` |
+| List banned members | `CometChat.BannedMembersRequestBuilder` |
| Change scope | `CometChat.updateGroupMemberScope()` |
| Transfer ownership | `CometChat.transferGroupOwnership()` |
| Group events | `CometChatGroupsEvents` |
diff --git a/ui-kit/react-native/guide-overview.mdx b/ui-kit/react-native/guide-overview.mdx
index 33463da18..eed37a1ce 100644
--- a/ui-kit/react-native/guide-overview.mdx
+++ b/ui-kit/react-native/guide-overview.mdx
@@ -12,7 +12,7 @@ description: "Browse React Native UI Kit feature guides for chat layouts, Expo s
| Purpose | Index of task-oriented feature guides for the React Native UI Kit |
| Sample app | [GitHub](https://github.com/cometchat/cometchat-uikit-react-native/tree/v5/examples/SampleApp) |
| Components | [Components Overview](/ui-kit/react-native/components-overview) |
-| Guides | [AI Agent](/ui-kit/react-native/guide-ai-agent) · [New Chat](/ui-kit/react-native/guide-new-chat) · [Group Chat](/ui-kit/react-native/guide-group-chat) · [Threaded Messages](/ui-kit/react-native/guide-threaded-messages) · [Search Messages](/ui-kit/react-native/guide-search-messages) · [Block/Unblock](/ui-kit/react-native/guide-block-unblock-user) |
+| Guides | [AI Agent](/ui-kit/react-native/guide-ai-agent) · [New Chat](/ui-kit/react-native/guide-new-chat) · [Group Chat](/ui-kit/react-native/guide-group-chat) · [Threaded Messages](/ui-kit/react-native/guide-threaded-messages) · [Search Messages](/ui-kit/react-native/guide-search-messages) · [Block/Unblock](/ui-kit/react-native/guide-block-unblock-user) · [Custom Message Types](/ui-kit/react-native/custom-message-types) |
@@ -32,6 +32,7 @@ Use these guides after completing the base [Getting Started](/ui-kit/react-nativ
| [Threaded Messages](/ui-kit/react-native/guide-threaded-messages) | Threaded replies: open parent context, list replies, compose within focused thread. |
| [Search Messages](/ui-kit/react-native/guide-search-messages) | Add full‑text message search across conversations with result routing into context. |
| [Block/Unblock User](/ui-kit/react-native/guide-block-unblock-user) | Let users block or unblock others in 1:1 chats; hides composer and shows an unblock prompt. |
+| [Custom Message Types](/ui-kit/react-native/custom-message-types) | Render your own message type: a `DataSourceDecorator` with five overrides, registered after `login()` or through `uiKitSettings.extensions`. |
| [Text Color](/ui-kit/react-native/guide-text-color) | Add a color button to the composer toolbar that colors selected text, rendered in the sent message. |
| [Custom Text Formatter](/ui-kit/react-native/guide-custom-text-formatter) | Define your own color marker, write it from a toolbar button, and render it everywhere the message appears. |
| [Text Formatters](/ui-kit/react-native/custom-text-formatter-guide) | Extend the base formatter to implement custom inline patterns (hashtags, keywords) with regex + callbacks. |
diff --git a/ui-kit/react-native/llms-react-native-v5.mdx b/ui-kit/react-native/llms-react-native-v5.mdx
index 0e0233d05..08f121abe 100644
--- a/ui-kit/react-native/llms-react-native-v5.mdx
+++ b/ui-kit/react-native/llms-react-native-v5.mdx
@@ -36,15 +36,14 @@ This kit renders **native views**, not DOM. Code that works in the React UI Kit
- **No CSS, no `className`, no `