Skip to main content
FieldValue
Package@cometchat/chat-uikit-react
Key componentsCometChatThreadedMessages, CometChatThreadHeader, CometChatMessageList, CometChatMessageComposer
InitCometChatUIKit.init(UIKitSettings) then CometChatUIKit.login("UID")
Entry pointCometChatMessages.onThreadRepliesClick opens thread view from group messages
Sample appGitHub
RelatedAll Guides
Threaded messages let users create sub-conversations by replying to specific messages in group chats. This reduces clutter and keeps discussions focused. Before starting, complete the Getting Started guide for your framework.

Components

Component / ClassRole
CometChatThreadedMessagesMain container for threaded messages
CometChatThreadHeaderDisplays parent message and controls
CometChatMessageListShows messages filtered by parentMessageId
CometChatMessageComposerInput for composing threaded replies
CometChatMessages.onThreadRepliesClickOpens thread view from group messages

Integration Steps

1. Thread State Management

Store the parent message that the user clicked “Reply in Thread” on. When set, update the app state to show the threaded messages side panel. File: CometChatHome.tsx
const [threadedMessage, setThreadedMsg] = useState<CometChat.BaseMessage | undefined>();

const updateThreadedMessage = (message: CometChat.BaseMessage) => {
    setThreadedMsg(message);
    setAppState({ type: "updateSideComponent", payload: { visible: true, type: "threadedMessage" } });
    setAppState({ type: "updateThreadedMessage", payload: message });
};

2. Thread Trigger in Group Messages

Wire the onThreadRepliesClick callback on CometChatMessages. When a user clicks the thread reply icon on any message, this fires with the parent message object. File: CometChatHome.tsx
<CometChatMessages
    user={messageUser}
    group={messageGroup}
    onThreadRepliesClick={(message) => updateThreadedMessage(message)}
/>

3. Threaded Messages Component

Render the thread panel with the parent message, reply list, and composer. goToMessageId and searchKeyword support in-thread search navigation. File: CometChatHome.tsx
<CometChatThreadedMessages
    message={message}
    requestBuilderState={requestBuilderState}
    selectedItem={selectedItem}
    onClose={onClose}
    showComposer={showComposer}
    goToMessageId={appState.threadSearchMessage && appState.goToMessageId ? appState.goToMessageId : undefined}
    searchKeyword={appState.goToMessageId ? appState.searchKeyword : undefined}
/>

4. App State Management

Add reducer cases to store the threaded message and control the side panel visibility. These are dispatched by updateThreadedMessage in step 1. File: appReducer.ts
case "updateThreadedMessage": {
    return { ...state, ["threadedMessage"]: action.payload };
}
case "updateSideComponent": {
    return { 
        ...state, 
        ["sideComponent"]: action.payload,
        ["sideComponentTop"]: action.payload?.type || ""
    };
}

Implementation Flow

Fetch the parent message, load replies, send new replies, and handle live updates:
const parentMessage = message;
const group = selectedItem as CometChat.Group;
<CometChatMessageList
    parentMessageId={message.getId()}
    group={group}
    messagesRequestBuilder={requestBuilderState}
/>
<CometChatMessageComposer
    parentMessageId={message.getId()}
    group={group}
/>
When the composer is blocked (e.g. permissions), show a fallback:
{showComposer ? (
    <CometChatMessageComposer
        parentMessageId={message.getId()}
        group={group}
    />
) : (
    <div className="message-composer-blocked">
        <div className="message-composer-blocked__text">
            {getLocalizedString("cannot_send_to_group")} 
            <a>{getLocalizedString("check_permissions")}</a>
        </div>
    </div>
)}

Feature Matrix

FeatureComponent / MethodFile
Show thread optiononThreadRepliesClickCometChatMessages.tsx
Display thread msgsThreadedMessageListCometChatThreadedMessages.tsx
Compose replyMessageComposerCometChatThreadedMessages.tsx
Thread headerThreadHeaderCometChatThreadedMessages.tsx
Search in threadsTextHighlightFormatterCometChatThreadedMessages.tsx
Navigate to messagegoToMessageIdCometChatHome.tsx
Thread stateupdateThreadedMessage()CometChatHome.tsx
App contextappReducer.tsappReducer.ts

Next Steps