Skip to content

fix(react-native): UI Kit docs corrections, the Ongoing Call page and SDK contract tables — ENG-39154 - #524

Open
suraj-chauhan-cometchat wants to merge 19 commits into
mainfrom
docs/eng-39154-rn-v5-docs-fixes
Open

suraj-chauhan-cometchat wants to merge 19 commits into
mainfrom
docs/eng-39154-rn-v5-docs-fixes

Conversation

@suraj-chauhan-cometchat

@suraj-chauhan-cometchat suraj-chauhan-cometchat commented Sep 16, 2026 •

Copy link
Copy Markdown
Contributor

Description

Six changes to the React Native docs from the ENG-39154 triage, one commit each. Every claim below was checked against the kit and SDK source, and every changed code block was compiled.

1. Four pages imported names the kit does not export — ENG-39166 (59bac322)

Copied into a TypeScript project, each of these imports failed with TS2305 (no exported member).

Page Before After
call-buttons new OutgoingCallConfiguration({...}) a plain object passed to outgoingCallConfiguration
compact-message-composer EnterKeyBehavior.SendMessage CometChatUiKitConstants.EnterKeyBehavior.SendMessage, which is already public
compact-message-composer a "Configuration" section built from SingleLineMessageComposerConfiguration removed: it is not exported and no component takes it. Every option it showed is already a documented composer prop (hideVoiceRecording under its main name, hideVoiceRecordingButton)
component-styling a standalone <CometChatReceipt> the theme override applied to CometChatConversations
search import { SearchStyle } the type derived from CometChatSearch

The receipts example does not use CometChatMessageList on purpose. Message bubbles pass their own receipt style, which wins the merge. Run against the kit's default theme and its real merge, a read receipt resolves to the override (#FFAB00) in Conversations but stays at the bubble default (#09C26F) in the message list.

2. The events page listed names the kit never emits — ENG-39167 (a0aae25a)

A listener copied from the page silently never fired.

  • ccUserUnblocked → ccUserUnBlocked, and ccGroupMemberUnbanned → ccGroupMemberUnBanned.
  • ccLiveReaction removed; the kit has no such event.
  • The call table listed six on… callbacks (onIncomingCallAccepted, onCallInitiated, …) that are not UI Kit event names. It now lists the four call events the kit emits: ccCallAccepted, ccCallRejected, ccCallEnded, ccOutgoingCall. The kit also declares ccCallInitiated, ccOutgoingCallAccepted and ccOutgoingCallRejected as listener keys, but nothing emits them, so outgoing accept/reject now points to the Chat SDK's call listener.
  • Call handlers receive { call }. ccCallRejected also fires when the user cancels their own outgoing call, and one ccCallEnded path sends no call.
  • ccActiveChatChanged moved to message events: it is emitted with emitMessageEvent, so only addMessageListener receives it.
  • The CometChatUIEventListener heading named a symbol the kit does not have; it is now "UI Events".

3. No documented way to undo a ban — ENG-39170 (aaa21c0f)

CometChatGroupMembers gives owners, admins and moderators a Ban option by default, but the UI Kit has no screen to list banned members or unban them, and guide-group-chat never said so. The Chat SDK page group-kick-ban-members already documents both, and the guide now points to it:

  • Section 4 now says what the members menu offers and to whom.
  • A note after the section 4 example links to listing banned members, unbanning, and hideBanMemberOption.
  • The feature matrix gains "Unban member" and "List banned members".

4. The in-call screen had no page — ENG-39171 (af864950)

The kit exports CometChatOngoingCall, the screen users see during a call, but the React Native v5 docs never had a page for it. Only the v4 page exists, and /ui-kit/react-native/ongoing-call redirects to the docs home. iOS and Vue have current Ongoing Call pages, so the new page follows the iOS structure (Usage, Customization, Common Patterns); Vue's is an older props-only page. It uses React Native code and documents only what the RN kit supports:

  • Props: only sessionID, callSettingsBuilder and onError. There is no style prop and there are no view slots, and the component emits no UI events of its own.
  • Integration: render it with a session ID and a CallSettingsBuilder whose OngoingCallListener ends the session, the same steps CometChatIncomingCall takes. Incoming and Outgoing Call normally render it for you.
  • Filters: a table of CallSettingsBuilder methods and their defaults, taken from the Calls SDK typings. The three methods the SDK marks obsolete are left out.
  • Events: only Incoming and Outgoing Call emit ccCallEnded, so it never fires for a call screen you render yourself.
  • Your own builder on Incoming Call, Outgoing Call or Call Buttons: these components set their own OngoingCallListener on it, and they skip their default layout and audio-only settings.

The page is also added to the nav after Outgoing Call, as on iOS, and to the Calling catalog in components-overview.

5. Seven SDK pages had no contract table — ENG-39176 (f8dd9019)

38 of the 58 React Native SDK pages carry an AI Integration Quick Reference contract table. These seven functional API pages did not, so return types, error behaviour and constraints had to be read out of CometChat.d.ts:

campaigns · upload-files · overview · pin-conversation · pin-message · save-message · thread-subscription

Two had no Quick Reference accordion at all; five had one holding only a code snippet. Those snippets are untouched — the table goes above them, as on 30 of the 38 pages that already had a table. Each table uses the nine rows every existing table uses, and the Constraints row carries the per-page facts that are easy to get wrong: pinning is a moderation action and a cap breach returns the ceiling in errorParams.limit; saves are per-viewer and account-wide; a thread is identified by its parent message ID; an upload request covers one destination and one batch; card messages are receive-only.

The 13 pages still without a table are conceptual and landing pages, where a method contract does not apply.

6. Integration pages repeated storage permissions the kit declares — ENG-39175 (3eba5729)

The Expo and React Native CLI integration pages told integrators to add WRITE_EXTERNAL_STORAGE and READ_EXTERNAL_STORAGE by hand. The UI Kit already declares both in its own manifest, so the instruction was redundant and taught an outdated practice: WRITE_EXTERNAL_STORAGE has had no effect since Android 11, and Android 13 replaced READ_EXTERNAL_STORAGE with the granular media permissions.

Both lines are gone from the two snippets, and each page now says the kit declares them, so nobody adds them back.

This does not change the permissions of a built app, and neither page claims it does: the kit's manifest still declares them and Android's manifest merger unions them in. Removing them for real is a kit change, tracked separately.

7. The tray components were undocumented — ENG-39173 (75e8d6fe)

The Message Composer page described the multi-attachment staging tray only as behaviour. Nothing said which components render it, what props they take, or that two of them are exported under a second name, so anyone replacing the tray had to read the kit source.

"The tray components" now documents them: an alias table (CometChatAttachmentTray ≡ CometChatAttachmentPreview, CometChatAttachmentTile ≡ CometChatAttachmentPreviewItem — the ticket named five components, there are three), prop tables for the Tray, the Tile, CometChatAttachmentViewer and CometChatMediaViewer, and one compiled example.

Two notes carry the facts that are easy to get wrong: these components exist only in the React Native UI Kit, and CometChatMediaViewer supersedes CometChatAttachmentViewer for the attachments of a sent message — the Viewer is still exported, but the composer and the image and video bubbles render MediaViewer. SelectedAttachment, the composer's staging model, is not exported, so the note and the example derive it with React.ComponentProps instead of naming it.

Related Issue(s)

  • Parent: ENG-39154
  • Addressed here: ENG-39166, ENG-39167, ENG-39171, ENG-39176, ENG-39175, ENG-39173, and item 1 of ENG-39170 (the ban round trip). Items 2 and 3 of ENG-39170 stay open as follow-ups.
  • Related kit bug, not part of this PR: ENG-39300. A handler passed by name, like { ccCallAccepted: handleAccept }, never fires even with the right event name, because the kit dispatches by comparing the event name with the function's .name.
  • Kit bug found while writing the Ongoing Call page, not part of this PR and not yet filed: an onError function that changes between renders, such as an inline arrow, makes CometChatOngoingCall request a new call token and fall back to the loading spinner (reproduced in Jest). The page's onError example uses useCallback.

Type of Change

  • Documentation correction/update
  • New documentation
  • Improvement to existing documentation
  • Typo fix
  • Other (please specify)

Checklist

  • I have read the CONTRIBUTING document
  • My branch name follows the naming convention
  • My changes follow the documentation style guide
  • I have checked for spelling and grammar errors
  • All links in my changes are valid and working
  • My changes are accurately described in this pull request

Additional Information

How it was verified. Compile checks used TypeScript 6.0.3 in strict mode against UI Kit 5.4.0, Chat SDK 4.0.28 and Calls SDK 5.0.5. A control file with a deliberate type error was included to prove the checker ran.

  • Changed code blocks (sections 1–3): all five compile. Fragments got only the declarations they reference (user, chatUser, loggedIn). The receipts block was wrapped in a function because it starts at return, and the two alternative composer usages were compiled as separate statements.
  • Misspelling checks (sections 1–3): for each of the four UI Kit blocks, a copy with one misspelled key or member fails to compile, so those blocks really are type-checked. The SDK snippet is different: CometChat.CallListener's constructor takes ...args: any[], so a misspelled handler still compiles. Its two handler names were checked against the CallListener class in the SDK's CometChat.d.ts instead.
  • Old imports: all five fail with TS2305.
  • Unban APIs: CometChat.BannedMembersRequestBuilder and CometChat.unbanGroupMember(), which the guide now names, compile.
  • Events:
    • All 39 names on the page are accepted by their listener types.
    • The old names ccUserUnblocked, ccGroupMemberUnbanned, ccLiveReaction, onIncomingCallAccepted and onCallInitiated are rejected, and so is ccActiveChatChanged on the UI listener.
    • Each of the 39 has at least one emit site in the kit source.
    • All 39 reached a listener through the real CometChatUIEventHandler in Jest.
  • Links (sections 1–3): the four links in the added lines resolve in a local Mintlify preview, and their target headings exist. Each page was also checked in that preview before commit.
  • Ongoing Call page (section 4):
    • The component's source is identical in kit 5.4.0 and 5.5.0, and so are the builder props on Incoming Call, Outgoing Call and Call Buttons.
    • All 8 code blocks compile, and a misspelled copy of each fails.
    • The page's runtime claims ran in Jest against the real component, with the SDKs mocked: the spinner until the token arrives, the full-size root view, the onError codes, only the first render's settings being used, a plain settings object throwing, and the spinner color.
    • All 28 links and anchors resolve in the local preview, and the page was checked there before commit.
    • Not verified: the end-of-call steps in a live call on a device.
  • SDK contract tables (section 5):
    • Checked against @cometchat/chat-sdk-react-native 4.1.0, the published latest, rather than the 4.0.28 harness the other sections used.
    • Every method named exists in the CometChat namespace, and all 40 type-level assertions pass: each "Primary output" return type, plus the negative claims — BaseMessage has getPinnedAt() and getSavedAt() but no isPinned(), isSaved() or isSystemPinned(); CometChat has no ConversationListener; ThreadsRequestBuilder has setUid(), not setUID(). A control file and two deliberately wrong assertions fail, so the check is live.
    • All seven pages render with their nine rows in a local Mintlify preview, and the escaped pipes in union types render as | instead of splitting the cell.
    • Every link in the new tables resolves.
  • Integration pages (section 6): the kit's manifest at v5.5.0 declares INTERNET, WRITE_EXTERNAL_STORAGE and READ_EXTERNAL_STORAGE. Both edited snippets still parse — the app.json block as JSON, the manifest block as XML — and both pages render with the note and no storage permission left in any code block. No other v5 page mentions either permission; the v4 pages are untouched.
  • Tray components (section 7): 19 type-level assertions against kit 5.4.0.
    • The two alias claims hold as type identities, not by name similarity.
    • Every prop table matches its component exactly: the key set, the required set, the callback signatures and the theme style types. CometChatAttachmentTile's attachment is the same type as one element of the Tray's attachments, so a tile takes what the tray holds.
    • Importing SelectedAttachment from the package fails with TS2305, which is why the note and the example derive it.
    • The example compiles. A copy with onRetry misspelled as onRetries fails, a deliberately wrong required-props assertion fails, and a control file fails, so the check is live.
    • The section renders in a local Mintlify preview with its four component headings, prop tables and example. Confirmed by the reporter.
    • Not verified: the runtime defaults read from source rather than types — visible defaulting to true on CometChatAttachmentViewer, and canPreview defaulting to images and videos.
  • Spelling and grammar: proofread by hand; the repo has no spell-check workflow.

Unrelated, not touched:

  • Five SDK pages fail to build in the local preview, none of them changed here: authentication-overview, receive-messages, retrieve-conversations, retrieve-groups and retrieve-users. Each has an unescaped | inside a table cell — for example Promise<CometChat.User | null> at authentication-overview.mdx:16:104 — which splits the cell and leaves the rest to be parsed as JSX. All five serve fine on the live site, and three of them are linked from the new tables in section 5. Escaping those pipes as \|, the way the new tables do, is the fix.
  • Eight React Native pages link to components-overview#components, an anchor that page does not have.
  • The Calling catalog in components-overview lists onClosePress for CometChatOutgoingCall. Kit 5.5.0 has no such prop; the prop is onEndCallButtonPressed.

Screenshots (if applicable)

Text, table and new-page changes only; each page was verified by rendering it locally.

Also in this PR (added after review)

Each one checked against UI Kit 5.5.2 (master-v5), chat SDK 4.1.0 and calls SDK 5.0.6:

  • Custom Message Types (custom-message-types.mdx, new): five required overrides, verified in DataSourceDecorator.tsx / ChatConfigurator.ts:15-22. getId throws when missing or when it calls super, and enable() skips the decorator silently on a duplicate id. extensions replaces defaultExtensions (CometChatUIKit.ts:226).
  • Reactions (message-list.mdx): CometChatReactions reads style directly, with no useTheme(). CometChatQuickReactions merges over theme.quickReactionStyle.
  • AI "render directly" (ai-features.mdx): both components fetch in a useEffect with [] deps, so a changing key is needed to refetch.
  • @ALL mentions (message-composer.mdx): buildGroupMentionItem returns null without a group. Both props are set only inside if (!disableMentions).
  • Events (events.mdx): every row maps to an emit site in the kit. ccMessageDelivered is declared but never emitted, so it is removed.

🤖 Generated with Claude Code

…port

ENG-39166. Five imports on four React Native pages named symbols that
@cometchat/chat-uikit-react-native does not export from its package root, so
copied snippets failed with TS2305 (and EnterKeyBehavior, used as a value, was
undefined at runtime). Each is now fixed with a docs-only change that uses the
kit's public API as it ships today.

call-buttons
  OutgoingCallConfiguration is not exported. outgoingCallConfiguration is spread
  straight into the outgoing call component, so a plain object satisfies it.
  This is also more correct than the class it replaces: that class's
  constructor copies only 3 of its 9 fields and silently drops the rest.

compact-message-composer
  - EnterKeyBehavior is not exported by name, but it is public through the
    exported CometChatUiKitConstants namespace. All four references (two in the
    example, one in the props table) now use
    CometChatUiKitConstants.EnterKeyBehavior.*. A plain "sendMessage" string
    does not work: string enums are nominal, so it fails with TS2322.
  - Removed the "Configuration" section. It built a
    SingleLineMessageComposerConfiguration that no v5 component accepts and
    never used it. Every option it showed is already a direct prop in the props
    table (hideVoiceRecording is an alias of the documented
    hideVoiceRecordingButton). Nothing linked to the section.

component-styling
  CometChatReceipt is not exported, and the snippet also used
  CometChatUiKitConstants without importing it. The theme override is now shown
  on CometChatConversations. It is deliberately not shown on
  CometChatMessageList: message bubbles pass their own receipt style, which wins
  the merge, so a top-level receiptStyles override does not change them. Run
  against the kit's default light theme and its real deepMerge, the read-receipt
  tint resolves to the override (#FFAB00) for Conversations and stays at the
  bubble default (#09C26F) for MessageList. The prose now says exactly that.

search
  SearchStyle was imported only as a type annotation. The type is now derived
  from the component (React.ComponentProps<typeof CometChatSearch>["style"]),
  which also corrects Partial<> to the prop's real DeepPartial<>.

Verified: every edited code block was extracted from the page and compiled
against the published kit; deliberately broken copies (a misspelled theme key,
enum member and component name) fail, so the checks are live. MDX fences and
tags remain balanced on all four pages. Rendered behaviour was confirmed by the
reporter on device before commit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
ENG-39167. The React Native events page listed names the kit never emits, so a
listener copied from it silently never fired. Every name on the corrected page
was checked against the kit source.

Names
  ccUserUnblocked        -> ccUserUnBlocked        (kit spelling, capital B)
  ccGroupMemberUnbanned  -> ccGroupMemberUnBanned
  ccLiveReaction         -> removed; no such event exists

Call events
  onIncomingCallAccepted -> ccCallAccepted
  onIncomingCallRejected -> ccCallRejected
  onCallEnded            -> ccCallEnded
  onCallInitiated        -> ccOutgoingCall. ccCallInitiated is declared but never
                            emitted; ccOutgoingCall is what fires after
                            CometChat.initiateCall() succeeds.
  onOutgoingCallAccepted/Rejected -> removed. ccOutgoingCallAccepted and
                            ccOutgoingCallRejected are declared but never emitted.
                            The page now points to the Chat SDK's call listener,
                            where these callbacks do exist.

  Handlers receive { call }, not a bare call. Two descriptions were also wrong:
  ccCallRejected fires when the user cancels their own outgoing call as well as
  when they reject an incoming one, and ccCallEnded is emitted with no call when
  an answered call ends.

Structure
  ccActiveChatChanged moved from UI events to message events: it is declared on
  the message listener and only fires through addMessageListener. The
  "CometChatUIEventListener" heading is renamed "UI Events"; no such symbol
  exists in the kit.

Verified
  - All 39 names on the page type-check on the listener their section belongs
    to; a known-wrong name fails, so the check is live.
  - All 39 reach an inline listener through the real CometChatUIEventHandler
    dispatcher (39/39), and each has at least one emit site in the kit.
  - The SDK example compiles. CallListener does not key-check its argument, so
    the callback names were confirmed against the SDK's CallListener class and
    five shipped kit call sites, including CometChatOutgoingCall.
  - Rendered in a local Mintlify preview; confirmed by the reporter.

Not addressed here: listeners whose handler is a named function never fire
even with the correct name, because the dispatcher matches on the function's
.name. That is a kit defect, tracked separately as ENG-39300.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
ENG-39170 (ban round trip).

CometChatGroupMembers gives owners, admins and moderators a Ban option by
default, but the UI Kit ships no screen to list banned members or unban them,
and the group chat guide never said so. It listed banGroupMember() in its
feature matrix with no unban counterpart, and described the members list as
offering only "scope changes and removal". A reader following the guide could
ban a member and find no documented way back.

The round trip is already documented, and correct, on the Chat SDK page
sdk/react-native/group-kick-ban-members; the guide simply never pointed to it.

guide-group-chat
  - Section 4 now says what the menu offers and to whom: owners, admins and
    moderators can change scope, remove, or ban (RolePermissions in
    CometChatGroupMembers; participants get no actions).
  - A note after the section 4 example states the UI Kit has no banned-members
    or unban screen, links to the SDK sections for listing banned members
    (BannedMembersRequestBuilder) and unbanning (unbanGroupMember), and to
    hideBanMemberOption for removing the Ban option instead.
  - The feature matrix gains "Unban member" and "List banned members".

Verified
  - The kit on dev-v5 has no unbanGroupMember or BannedMembersRequestBuilder
    usage and exports no banned-members component.
  - The SDK page's ban, unban and banned-members TypeScript examples compile
    against the Chat SDK; misspelled copies of both APIs fail, so the check is
    live.
  - All three new links resolve in a local Mintlify preview: the two SDK anchors
    exist on the rendered page, and group-members renders the
    hideBanMemberOption row. Confirmed by the reporter.

Not in this change: a details-screen recipe and replacement guidance in the
upgrade guide (ENG-39170 items 2 and 3) are left as follow-ups.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@mintlify

mintlify Bot commented Sep 16, 2026 •

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated
cometchat 🟢 Ready View Preview Oct 16, 2026, 12:27 PM

💡 Tip: Enable Automations to automatically generate PRs for you.

ENG-39171. The kit exports CometChatOngoingCall, the in-call screen, but the
React Native v5 docs had no page for it: ui-kit/react-native/ongoing-call has
never existed (only the v4 page does), and the live URL redirects to the docs
home. iOS and Vue have current Ongoing Call pages; the new page follows the iOS
structure (Usage, Customization, Common Patterns), since Vue's is an older
props-only page. It uses React Native code and documents only what the RN kit
supports.

ongoing-call (new)
  - Integration: render it with a session ID and a CallSettingsBuilder whose
    OngoingCallListener ends the session, mirroring CometChatIncomingCall.
    Incoming and Outgoing Call normally render it for you.
  - Actions: onError is the only callback. It fires when the component cannot
    get a call token; a plain Error arrives as a CometChatException with code
    TOKEN_GENERATION_FAILED, and SDK exceptions pass through unchanged.
  - Filters: the CallSettingsBuilder methods and defaults, taken from the Calls
    SDK typings; the three methods the SDK marks obsolete are left out.
  - Events: the component emits none. ccCallEnded comes only from Incoming and
    Outgoing Call.
  - Customization: no style prop and no view slots; the loading spinner uses
    the theme's primary color. The builder must be an instance (its build() is
    called), and only the settings built on the first render are used.
  - Common Patterns: accepting a call, video and audio-only settings, call-end
    handling, and passing a builder to Incoming Call, Outgoing Call or Call
    Buttons. Given a builder, those components set their own
    OngoingCallListener on it and skip their default layout and audio-only
    settings.

docs.json
  Adds the page to the React Native nav after Outgoing Call, as on iOS.

components-overview
  Adds CometChatOngoingCall to the Calling catalog.

Verified
  - The component's source is identical in kit 5.4.0 and 5.5.0, and the builder
    props on Incoming Call, Outgoing Call and Call Buttons are unchanged.
  - All 8 code blocks compile against kit 5.4.0, Chat SDK 4.0.28 and Calls SDK
    5.0.5 under strict TypeScript. A misspelled copy of each fails, and a
    control file with a deliberate error confirms the checker ran.
  - Runtime claims ran in Jest against the real component with the SDKs mocked:
    spinner then call view, full-size root view, the onError codes, first-render
    settings kept, a plain settings object throws, and the spinner color.
  - Rendered in a local Mintlify preview: the section structure matches the iOS
    page, and all 28 links and anchors resolve. Confirmed by the reporter.

Not verified: the end-of-call steps in a live call on a device.

Not in this change: an onError function that changes between renders, such as
an inline arrow, makes the component request a new call token and fall back to
the spinner (reproduced in Jest). That is a kit defect, not documented here as
intended behavior.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@suraj-chauhan-cometchat suraj-chauhan-cometchat changed the title fix(ui-kit/react-native): unexported imports, wrong event names, and the missing unban path — ENG-39154 fix(ui-kit/react-native): unexported imports, wrong event names, the missing unban path and Ongoing Call page — ENG-39154 Sep 16, 2026
ENG-39176. 38 of the 58 React Native SDK pages carry an AI Integration Quick
Reference contract table. These seven functional API pages did not, so return
types, error behaviour and constraints had to be recovered from CometChat.d.ts.

Two had no Quick Reference accordion at all (campaigns, upload-files); five had
one holding only a code snippet (overview, pin-conversation, pin-message,
save-message, thread-subscription). The snippets are untouched — the table goes
above them, as on 30 of the 38 pages that already had a table.

Each table uses the nine rows every existing table uses: Package, Import, Key
Methods, Key Classes, Prerequisites, Primary output, Constraints, Related and
Full reference.

The Constraints rows carry the per-page facts that are easy to get wrong, each
already stated on the page or in the typings:
  - pin-conversation: pin by UID/GUID plus receiver type, not conversation id;
    needs the features.ux.conversations.pinned.enabled flag, which no plan
    seeds; a never-messaged or hidden conversation rejects with
    ERR_CONVERSATION_NOT_ACCESSIBLE; this SDK has no ConversationListener.
  - pin-message: moderation action, the server decides; a cap breach returns the
    ceiling in errorParams.limit; no isPinned()/isSystemPinned() — read
    getPinnedAt().
  - save-message: savedAt is per-viewer; saves are account-wide, so
    setSavedOnly(true) must not be combined with setUID()/setGUID(); no
    isSaved() — read getSavedAt().
  - thread-subscription: a thread is its parent message id, passed as a number;
    unsubscribing hard-deletes the row; setThreadSubscribed() is local only;
    ThreadsRequestBuilder spells its scope setters setUid()/setGuid().
  - upload-files: one request per destination and batch; receiverId and
    receiverType must match the message sent later; fileId is caller-supplied;
    onFileError means rejected, not failed mid-upload.
  - campaigns: card messages are receive-only; the cards library only renders.
  - overview: init() once before anything else; Auth Key for development only.

Verified against @cometchat/chat-sdk-react-native 4.1.0, the published latest,
rather than the 4.0.28 typecheck harness:
  - Every method named exists in the CometChat namespace, and all 40 type-level
    assertions pass: each Primary output return type, plus the negative claims
    (BaseMessage has getPinnedAt and getSavedAt but no isPinned, isSaved or
    isSystemPinned; CometChat has no ConversationListener; ThreadsRequestBuilder
    has setUid, not setUID). A control file and two deliberately wrong
    assertions fail, so the check is live.
  - All seven pages render in a local Mintlify preview with all nine rows, and
    the escaped pipes in union types render as "|" instead of splitting the cell.
  - Every link in the new tables resolves. Three targets redirect in the local
    preview only — authentication-overview, receive-messages and
    retrieve-conversations, which carry a pre-existing MDX parse error from an
    unescaped | inside a table cell. All three return 200 on the live site and
    are untouched here.
  - Confirmed by the reporter.

Not in this change: the 13 remaining pages without a table are conceptual and
landing pages (changelog, key-concepts, rate-limits, the *-overview pages,
llms-react-native-v4, message-structure-and-hierarchy, upgrading-from-v3,
users-overview), where a method-contract table does not apply.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@suraj-chauhan-cometchat suraj-chauhan-cometchat changed the title fix(ui-kit/react-native): unexported imports, wrong event names, the missing unban path and Ongoing Call page — ENG-39154 fix(react-native): UI Kit docs corrections, the Ongoing Call page and SDK contract tables — ENG-39154 Sep 21, 2026
… kit declares

ENG-39175. The Expo and React Native CLI integration pages told integrators to
add WRITE_EXTERNAL_STORAGE and READ_EXTERNAL_STORAGE by hand. The UI Kit already
declares both in its own manifest, so the instruction is redundant and teaches
an outdated practice: WRITE_EXTERNAL_STORAGE has had no effect since Android 11,
and Android 13 replaced READ_EXTERNAL_STORAGE with the granular media
permissions.

expo-integration
  Drops both from the android.permissions array in the app.json snippet, leaving
  INTERNET, CAMERA, MODIFY_AUDIO_SETTINGS, RECORD_AUDIO, ACCESS_NETWORK_STATE
  and VIBRATE.

react-native-cli-integration
  Drops both from the AndroidManifest.xml snippet, leaving VIBRATE, INTERNET,
  CAMERA and RECORD_AUDIO.

Both pages now say the UI Kit declares the two storage permissions in its own
manifest, so nobody adds them back.

This does not change the permissions of a built app, and neither page claims it
does: the kit's manifest still declares them and Android's manifest merger
unions them in. Removing them for real is a kit change, tracked separately.

Verified
  - packages/ChatUiKit/android/src/main/AndroidManifest.xml at v5.5.0 declares
    INTERNET, WRITE_EXTERNAL_STORAGE and READ_EXTERNAL_STORAGE.
  - Both edited snippets still parse: the app.json block as JSON, the manifest
    block as XML.
  - No other v5 React Native page mentions either permission; the v4 pages are
    left as they are.
  - Both pages render in a local Mintlify preview with the note in place and no
    storage permission left in any code block. Confirmed by the reporter.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…r page

ENG-39173. The kit exports the components the staging tray is built from, but
the Message Composer page described the tray only as behaviour: nothing said
which components render it, what props they take, or that two of them are
exported under a second name. Anyone replacing the tray had to read the kit
source.

message-composer
  Adds "The tray components" to the Multi-Attachment Staging Tray section, in
  four parts:

  - An alias table. CometChatAttachmentTray and CometChatAttachmentPreview are
    the same component under two names, as are CometChatAttachmentTile and
    CometChatAttachmentPreviewItem. The ticket named five components; there are
    three, because two of the names are aliases.

  - Prop tables for CometChatAttachmentTray, CometChatAttachmentTile,
    CometChatAttachmentViewer and CometChatMediaViewer, each listing the full
    prop set, which props are required, and the theme style slot.

  - A note that these components exist only in the React Native UI Kit, and
    that CometChatMediaViewer supersedes CometChatAttachmentViewer for the
    attachments of a sent message. The Viewer is still exported, but the kit no
    longer renders it: the composer and the image and video bubbles use
    MediaViewer.

  - A note that SelectedAttachment, the composer's staging model, is not
    exported, with the React.ComponentProps derivation to use instead. The one
    code example uses that derivation rather than naming the type.

Verified against kit 5.4.0 under strict TypeScript, with 19 type-level
assertions:
  - The two alias claims hold as type identities, not by name similarity.
  - Every prop table matches the component's props exactly: the key set, the
    required set (Tray and Tile need attachments/attachment, onRemove and
    onRetry; Viewer needs all but visible; MediaViewer needs all but message
    and canPreview), the callback signatures, and the theme style types.
  - CometChatAttachmentTile's attachment is the same type as one element of
    CometChatAttachmentTray's attachments, so a tile takes what the tray holds.
  - Importing SelectedAttachment from the package fails, which is why the note
    and the example derive it.
  - The documented example compiles. A copy with onRetry misspelled as
    onRetries fails, a deliberately wrong required-props assertion fails, and a
    control file with a plain type error fails, so the check is live.
  - The section renders in a local Mintlify preview: the new heading, the four
    component headings, the prop tables and the example. Confirmed by the
    reporter.

Not verified: the runtime defaults read from the source rather than the types,
namely visible defaulting to true on CometChatAttachmentViewer and canPreview
defaulting to images and videos.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Lucky-Cometchat and others added 3 commits September 21, 2026 17:59
…or chain

ENG-39169. The RN customization API behind custom message types —
DataSourceDecorator -> MessageDataSource / ExtensionsDataSource ->
ChatConfigurator.enable() — had no end-to-end page. MessageDataSource and
ExtensionsDataSource were documented nowhere in v5; the only occurrence of
either name was the LLM context page stating the gap itself.

custom-message-types (new)
  - The decorator chain, with MessageDataSource as the default source and
    enable() layering rather than replacing.
  - The five required overrides. The existing guidance said four and omitted
    getId, which is what produces the broken subclass: the base throws
    "Method not implemented.", the class is not abstract so TypeScript cannot
    force the override, and returning the wrapped source's id is worse still —
    enable() dedupes on the id and skips the decorator silently.
  - Registration timing: after login() resolves, not after init().
    enableExtensions() opens with ChatConfigurator.init(), which replaces
    dataSource and resets the names dedup list.
  - The surviving route, both halves: an ExtensionsDataSource in
    uiKitSettings.extensions is re-applied after the reset, but the base
    enable() gates on isExtensionEnabled(getExtensionId()), false for any
    custom type, so the subclass must override enable() too. Both steps or
    neither.
  - A poll message type worked end to end, and a route-comparison table.

message-list
  The four-method table becomes five with an Identity row for getId, and the
  "each must call super" rule now carves getId out explicitly, with both
  failure modes and a link to the new page.

llms-react-native-v5
  Three sites corrected: the decorator-chain summary said "override what you
  need calling super each time" (getId is neither optional nor delegating),
  the customization entry said four overrides, and the "no dedicated RN page"
  gap note is replaced by a pointer to the page.

docs.json
  Adds the page to the React Native Guides nav after guide-block-unblock-user.

Verified against @cometchat/chat-uikit-react-native 5.2.11 source:
  - DataSourceDecorator.getId() throws and the class is concrete; 48 other
    base methods delegate.
  - ChatConfigurator.enable() dedupes on names via newSource.getId();
    init() replaces dataSource and resets names to ["message_utils"].
  - enableExtensions() opens with ChatConfigurator.init(), then re-applies
    uiKitSettings.extensions, calling enable() on each.
  - ExtensionsDataSource is abstract over addExtension()/getExtensionId()
    with a concrete enable() gating on CometChat.isExtensionEnabled().
  - Every symbol used in the examples is exported from the package root, and
    CometChat.CATEGORY_CUSTOM, getCustomData() and UIKitSettings.extensions
    exist in the SDK typings.
  - mint validate and mint broken-links flag none of the changed files; the
    page and all its link targets render in a local Mintlify preview, and the
    #filtering-messages anchor it links to resolves.

Not verified: the examples were not compiled against the kit. The call-site
count for enableExtensions() is deliberately left unstated — 5.2.11 has four,
and the 5.4/5.5 source reports five.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ies components

ENG-39174. CometChatConversationStarter and CometChatSmartReplies are exported
from the kit root but appeared on no v5 page; their props were documented
nowhere. CometChatConversationSummary, the third component of the same family,
was already shown on ai-features, so the omission read as an oversight rather
than a decision.

ai-features
  - "Rendering the component directly" under both Conversation Starter and
    Smart Replies, each with the full prop set and an example. Both say up
    front that CometChatMessageList renders the component when the matching
    toggle is set, so the standalone component is for custom placement only —
    unlike Conversation Summary, where the header ships no panel and rendering
    it yourself is mandatory.
  - A Warning on Smart Replies: CometChat.getSmartReplies() is declared
    Promise<Object>, but the component's getSmartReplies prop expects
    Promise<string[]>. Without Object.values() no chips render. The kit's own
    MessageList does exactly that mapping. getConversationStarter() needs none,
    being already Promise<Array<string>>.
  - A props table for Conversation Summary. The section documented
    getConversationSummary but not closeCallback, which was undocumented.
  - A "Standalone components" row in the Quick Reference accordion.
  - All three are noted as having no style prop; they theme through useTheme().

components-overview
  The AI catalog listed only CometChatAIAssistantChatHistory. Adds all three,
  as the React UI Kit's catalog already does.

Verified against @cometchat/chat-uikit-react-native 5.5.0, fetched from npm,
rather than the older local copy:
  - Both components are exported from index.ts, imported at :179-180 exactly
    as reported.
  - The prop sets are taken from the source interfaces, not inferred:
    ConversationStarter takes getConversationStarters (required) and
    onSuggestionClicked; SmartReplies adds getSmartReplies (required) and
    closeCallback; ConversationSummary takes getConversationSummary (required)
    and closeCallback. None declares a style prop.
  - The SDK return types are from the 4.x typings: Promise<Array<string>>,
    Promise<Object> and Promise<string> respectively.
  - MessageList renders both components internally behind the two toggles, so
    the "custom placement only" framing is accurate.
  - mint validate and mint broken-links flag neither file; both pages render
    in a local Mintlify preview and the three #conversation-* anchors the new
    catalog rows link to resolve.

Not verified: the examples were not compiled against the kit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…n components

ENG-39172. Reactions are on by default in v5 and the list-level props are
documented, but the three components the list is built from — CometChatReactions,
CometChatQuickReactions and CometChatReactionList — had no props anywhere.
CometChatReactionList appeared only on component-styling, for style keys.

While checking them, the documented type for quickReactionList turned out to be
wrong, on a path that is already documented and in use.

message-list
  - quickReactionList is typed [string, string?, string?, string?, string?] —
    a tuple capped at five — not string[], which both the props table and the
    Quick Reference block claimed. A sixth emoji does not compile, and a value
    typed as string[] is rejected with TS2322 even when it holds five items,
    so the documented type was the one that does not work. The stated default,
    "Predefined reactions", is replaced with the real one.
  - A "Reaction Components" section with prop tables for all three, following
    the shape of "The tray components" on the composer page. It records the
    three things that cannot be guessed from the names:
      · CometChatReactions takes messageObject; CometChatReactionList takes
        message. Both are a CometChat.BaseMessage.
      · CometChatQuickReactionsProps is not exported from the package root,
        unlike CometChatReactionsInterface and CometChatReactionListInterface,
        so it needs the React.ComponentProps derivation the composer page
        already uses for SelectedAttachment.
      · maxContentWidth changes the pill cap from 3 to as many as fit.

components-overview
  Adds the three components to the Messages catalog.

Verified against @cometchat/chat-uikit-react-native 5.5.0 from npm:
  - All three are exported from index.ts; CometChatQuickReactionsProps is not.
  - Every prop, its optionality and its type comes from the source interfaces
    CometChatReactionsInterface, CometChatQuickReactionsProps and
    CometChatReactionListInterface.
  - MessageList declares quickReactionList with the same five-slot tuple the
    component does, and the default emoji set is the component's own literal.
  - mint validate and mint broken-links flag neither file; both pages render
    in a local Mintlify preview, the #reaction-components and
    #quickreactionlist anchors resolve, and the default emoji render as
    characters rather than escapes.

Two notes on the ticket text, for anyone reading it later: v4 had three
reaction pages, not two — reaction-list as well — and component-styling does
carry a working CometChatReactionList usage example, not only style keys.

Not verified: the examples were not compiled against the kit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…rride key — ENG-39154

Verified against the shipped 5.5.0 bundles, not against the page text.

- The override example keyed on "en-US". Under the default autoDetectLanguage
  the kit resolves a device to the bare language code, so an en-US override is
  silently ignored. The example now keys on "en", which works on every version.
- The supported list showed `zh-TW`; the shipped key is lowercase `zh-tw`.
  `zh-TW` is not recognised on 5.5.0 and falls back to English.
- The page claimed 19 languages. The kit ships 21 keys — 18 distinct languages
  plus `en-US`, `en-GB` and `en-IN`, which all alias to `en`. The list also
  omitted `en` and `en-IN`, and `en` is the key auto-detect always lands on.

Callouts are scoped to "v5.5.0 and earlier" and the examples are written to
stay correct once ENG-39523 ships, so the page does not go stale on upgrade.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…39154

Carries over the review points from the closed #161 that
still applied to main, checked against UI Kit 5.5.2 (master-v5):

- core-features: Report option shows only on other users' messages
  (MessageDataSource !isSentByMe) and is hidden for AI agents.
- core-features: mention @ALL under Mentions (group chats only).
- message-composer: @ALL is group-only, label has no leading @,
  default "all", no effect with disableMentions.
- TODO marker: Report screenshot is the Android one, needs an RN capture.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Comment thread ui-kit/react-native/core-features.mdx Outdated
Comment thread ui-kit/react-native/core-features.mdx Outdated
Comment thread ui-kit/react-native/message-composer.mdx Outdated
…-39154

Addresses review on 6cb76c9:
- core-features: Report is also hidden by hideFlagMessageOption and is
  not offered in the Pinned Messages panel.
- message-composer: disableMentionAll has no effect when disableMentions
  is true (both are set only inside the !disableMentions block).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Comment thread ui-kit/react-native/core-features.mdx Outdated
…rrent — ENG-39154

The panel's own source calls the reportMessage exclusion temporary
(CometChatPinnedMessages.tsx:81), so say "currently" and link the page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@raj-dubey1 raj-dubey1 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Docs review: request changes

Most of this PR is correct and well verified. A few statements are still wrong in ways that would mislead people integrating the kit. Checked against the React Native UI Kit source (5.5.1 on master-v5), the published kit 5.5.2, chat SDK 4.1.0 and calls SDK 5.0.6. Structural checks pass: no 404s, no unresolved navigation refs, no broken links in the changed pages.

P0: wrong or misleading

  1. custom-message-types.mdx:248-253 turns off every built-in extension. extensions: [new PollExtension()] replaces the defaults (CometChatUIKit.ts:226: this.uiKitSettings?.extensions || this.defaultExtensions). Stickers, link preview, translation, polls and the others are lost, which contradicts extensions.mdx. Use [...CometChatUIKit.defaultExtensions, new PollExtension()] and add a warning. The snippet also uses CometChatUIKit and PollDataSource without importing them.
  2. events.mdx drops ccCallFailed. The kit emits it from CometChatCallButtons.tsx:198, CometChatCallLogs.tsx:352, CometChatIncomingCall.tsx:213 and CometChatOutgoingCall.tsx:237, and call-buttons.mdx documents it, so the two pages now contradict each other.
  3. The old event names are still used on other pages: users.mdx:17,257,272 (ccUserUnblocked, including a listener example that will never fire) and groups.mdx:17,259 (ccGroupMemberUnbanned). The source names are ccUserUnBlocked and ccGroupMemberUnBanned (CometChatUIEvents.ts).
  4. compact-message-composer.mdx:629 documents hideVoiceRecordingButton, which has no effect. The prop is declared (CometChatCompactMessageComposer.tsx:804), but only hideVoiceRecording is read (:1211, :1274). It is the same in 5.5.2. Document hideVoiceRecording, and file a kit bug for the dead prop.
  5. message-list.mdx:747 says the CometChatReactions style is "DeepPartial, merged over the theme". It isn't: the component never calls useTheme() and reads style directly. The list passes getCurrentBubbleStyle(...).reactionStyles itself (CometChatMessageList.tsx:4433). The page's own example (754-758), which passes no style, renders unstyled pills.

P1: should fix

  • call-buttons.mdx:76: ccCallRejected does not fire when the receiver rejects. CallButtons emits it only when the local user cancels (CometChatCallButtons.tsx:330-334). It now contradicts events.mdx.
  • components-overview.mdx Calling table (edited here): onClosePress should be onEndCallButtonPressed; onVoiceCallPress and onVideoCallPress don't exist; callLogsRequestBuilder should be callLogRequestBuilder.
  • events.mdx presents itself as the full list but misses emitted events: ccMessageError, ccThreadSubscriptionChanged, ccMessagePinned/Unpinned/Saved/Unsaved, and openChat. Separately, message-list.mdx:393 lists ccMessageDelivered, which nothing emits.
  • ongoing-call.mdx:
    • Joining a group call from the meeting bubble also renders the call screen (CallingExtensionDecorator.tsx:308-350, configured with groupCallSettingsBuilder). That path emits no ccCallEnded. Add it to the "Use your own settings" table.
    • Explain why onError must be stable. The token effect is keyed on [sessionID, onError] and its cleanup sets callSettings.current = null, so a changing onError leaves the spinner up for good (the same happens under StrictMode in dev).
  • message-list.mdx:800: Component Styling only covers reactionListStyles. Bubble reactions are on message-bubble-styling.mdx, and quickReactionStyle isn't documented anywhere.
  • The PR description doesn't cover custom-message-types.mdx, the Reactions section, the AI "render directly" sections or the @all mention rows. Those have no verification notes.

P2: nits

  • core-features.mdx:189: a TODO comment left in the published source.
  • ongoing-call.mdx:153: callListener is never defined.
  • search.mdx:221: the prose still says DeepPartial<SearchStyle>, a type that can't be imported.
  • component-styling.mdx:1376: receipt styles have no "alignment" field.
  • call-buttons.mdx:25: links to components-overview#components, an anchor that doesn't exist.
  • llms-react-native-v5.mdx:
    • :357,373: calling super.getId() throws an error, while returning this.dataSource.getId() gets the decorator silently skipped. Say which is which.
    • :39 still says "verified against 5.4.0".
  • SDK Key Methods rows:
    • pin-message.mdx is missing getSystemPinMessageLimit().
    • save-message.mdx is missing removeMessageListener().
  • guide-overview.mdx doesn't list the new Custom Message Types guide.
  • AI components: Smart Replies and Conversation Starter fetch only on mount, so rendering them directly needs a changing key to refetch.

Checked and correct

  • Imports: the names the PR removes really aren't exported (OutgoingCallConfiguration, SingleLineMessageComposerConfiguration, SearchStyle, CometChatReceipt), and the replacements are.
  • Events: the UnBlocked/UnBanned names; ccLiveReaction removed; the declared-but-never-emitted call keys; ccActiveChatChanged emitted through emitMessageEvent.
  • Styling and localization: the receipt-merge example, and the localization behaviour on 5.5.0 vs 5.5.1+.
  • Calls: the CallSettingsBuilder table against calls SDK 5.0.6, and the OngoingCall props.
  • Composer: the tray, tile and viewer prop tables.
  • SDK: every SDK contract table compiles against 4.1.0 under strict tsc.

@jitvarpatil jitvarpatil left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Review Buddy (review-docs-pr)

Recommendation: approve. Automated review; the final decision stays with a maintainer.

TL;DR. Structurally safe: 0 unresolved nav refs (the two new docs.json entries resolve), 0 removed/renamed pages so no redirects needed, 0 broken internal links in ui-kit/react-native/ + sdk/react-native/, and every anchor the PR adds resolves to a real heading. The Mintlify preview for the head SHA (42bb622) built green. I re-checked the kit/SDK claims against the local v5.5.0 tag, the npm tarballs @cometchat/chat-uikit-react-native@5.5.2 (today's latest), @cometchat/chat-sdk-react-native@4.1.0 and @cometchat/calls-sdk-react-native@5.0.5/5.0.6: event names and emit sites, the five "not exported" symbols, CometChatOngoingCall props/onError code, the tray/reaction/AI component props, the quickReactionList tuple, the login()→enableExtensions()→ChatConfigurator.init() chain, getId() throwing, the manifest permissions, mentionAllLabel/disableMentionAll defaults, the Report option's !isSentByMe rule, the 18 locale bundles + en-* aliases, and every SDK return type in the seven new contract tables — all hold. Eight P2s below; none misleads integration, so nothing blocks the merge.

P0 — blockers

None.

P1 — should fix before merge

None.

P2 — nits / follow-ups

  1. ui-kit/react-native/events.mdx:100-105 — ccCallFailed is emitted but not listed. The kit emits it from four sites in both 5.5.0 and 5.5.2 (CometChatIncomingCall.tsx:213 and CometChatOutgoingCall.tsx:237 with { error }, CometChatCallButtons.tsx:198 and CometChatCallLogs.tsx:352 with { call }), and it is a CallUIEventListener key. The call table now says it lists the events the kit emits; add a ccCallFailed row (payload { error } or { call } depending on the emitter). ccShowOngoingCall is also emitted but carries a component, so leaving it out is reasonable.
  2. ui-kit/react-native/ongoing-call.mdx:49 (Integration) — CometChatCalls.endSession() is deprecated in the Calls SDK the page targets. @cometchat/calls-sdk-react-native 5.0.5 and 5.0.6 both mark it @deprecated use leaveSession() instead (dist/index.d.ts:1574). The kit's own CometChatIncomingCall still calls endSession(), so the snippet mirrors the kit, but a new page should not teach a deprecated call: switch to CometChatCalls.leaveSession() or add a one-line note.
  3. ui-kit/react-native/ongoing-call.mdx "Style" section — verified against 5.5.0, but npm latest is 5.5.2 (published today) and the component was rewritten. 5.5.2 wraps the call in a SafeAreaView with backgroundColor: theme.color.background1 and waits 150 ms for the layout to settle before mounting the Calls SDK view, so "the only UI Kit element is the loading spinner" is already stale. Props, onError/TOKEN_GENERATION_FAILED, the first-render-only builder and the [sessionID, onError] dependency all still hold. Suggest a quick re-check against 5.5.2 and dropping the "only element" sentence.
  4. ui-kit/react-native/components-overview.mdx:71 — stale onClosePress on the row directly above the new CometChatOngoingCall row. The PR body already notes the kit has no such prop; 5.5.2 confirms it is onEndCallButtonPressed (CometChatOutgoingCall.tsx:40). Since the table is being edited here, fix it in the same PR.
  5. ui-kit/react-native/core-features.mdx:219 — a {/* TODO … */} comment was added above an Android screenshot (/images/android-flag-message.png) on a React Native page. The comment does not render, but it is a placeholder left in shipped content and the image is still the wrong platform. Either add the RN capture or drop the <Frame> and keep the prose.
  6. Pre-existing broken anchors / stale calls in files this PR touches (not introduced here, but cheap to fix while in the file): methods#how-to-login-a-user-with-auth-token → actual heading is #login-using-auth-token (expo-integration.mdx:71,251; react-native-cli-integration.mdx:67,303); components-overview#components → the page has #component-catalog (call-buttons.mdx:25, compact-message-composer.mdx:27, message-composer.mdx:27); ai-features.mdx:11 Quick Reference shows CometChatUIKit.login("UID") but the kit's signature is login({ uid }) (CometChatUIKit.ts:286), which the new custom-message-types.mdx gets right.
  7. PR description covers 7 of the 14 commits. "Six changes … one commit each" is stale: f6adf2c5 (Custom Message Types page), 45d0a277 (standalone Conversation Starter / Smart Replies / Summary), f98c24ce (quickReactionList tuple + reaction components), df299ed9 (localize codes), 6cb76c9e/4ae201c5/42bb6224 (Report visibility, @all, Pinned Messages link) are not described, though the checklist ticks "accurately described". Worth a short section each so the reviewer and the Linear tickets line up.
  8. ui-kit/react-native/message-composer.mdx tray note — a simpler derivation exists. SelectedAttachment is indeed not exported (true in 5.5.0 and 5.5.2), but CometChatAttachmentTrayProps is exported from the package root in both versions, so CometChatAttachmentTrayProps["attachments"][number] reads better than React.ComponentProps<typeof CometChatAttachmentTray>["attachments"][number]. Optional.

What passed

  • Build: 0 navigation refs that don't resolve; Mintlify preview for 42bb622 is 🟢 Ready (deployed 10:13 UTC, same minute as the head commit).
  • Redirects: 0 files removed or renamed → nothing to redirect; 0 chained 404s. (The script's -22 redirect delta is base drift — the branch is 277 files behind main, and the PR's own docs.json change is exactly the two nav entries.)
  • Links: 0 broken internal links across the 63 UI Kit and 163 SDK pages scanned; all 30+ anchored links the PR adds resolve, including the deep # targets into group-kick-ban-members, real-time-listeners, send-message, sdk/reference/*, message-list#reaction-components and ai-features#*.
  • Orphans: only llms-react-native-v5 / llms-react-native-v4, which are intentionally outside navigation on main too.
  • Images: no new image refs; every existing one in the touched pages exists on the branch.
  • Content integrity vs source: events (ccUserUnBlocked, ccGroupMemberUnBanned, no ccLiveReaction, ccActiveChatChanged via emitMessageEvent, ccOutgoingCallAccepted/Rejected/ccCallInitiated declared but never emitted, ccCallEnded with an empty payload at CometChatIncomingCall.tsx:183, ccCallRejected on outgoing cancel); the five removed imports are absent from the root index.ts in 5.5.0 and 5.5.2; CometChatUiKitConstants.EnterKeyBehavior exists; CometChatOngoingCall props + TOKEN_GENERATION_FAILED; CallSettingsBuilder table defaults (180 s idle, recording off, tile click/drag on) and the three obsolete methods left out; CometChatCallButtons.callSettingsBuilder is a function and Incoming/Outgoing Call overwrite the listener via setCallEventListener; tray/tile/viewer/MediaViewer props, aliases and defaults; CometChatAttachmentViewer is exported but rendered by nothing, MediaViewer by composer + image/video bubbles; reaction component props (messageObject vs message), CometChatQuickReactionsProps not at root; AI component props and getSmartReplies() → Promise<Object>; ChatConfigurator.init/enable, DataSourceDecorator.getId() throws, ExtensionsDataSource.enable() gates on isExtensionEnabled, UIKitSettings.extensions; manifest declares INTERNET/WRITE_EXTERNAL_STORAGE/READ_EXTERNAL_STORAGE; mentionAllLabel = "all"; Report hidden for own messages (!isSentByMe), agentic users and hideFlagMessageOption, absent from Pinned Messages; 18 locale bundles with en-US/en-GB/en-IN aliased to en, and the "v5.5.0 and earlier" caveats are accurate — 5.5.2 switched to case-insensitive, region-then-base resolution; all SDK method names and return types in the seven contract tables, ThreadsRequestBuilder.setUid(), no isPinned()/isSaved()/isSystemPinned(), getConversationStarter() → Promise<Array<string>>.
  • Out of scope, as the PR body says: the five SDK pages with unescaped | in table cells, and the three pre-existing broken links in message-structure-and-hierarchy.mdx / authentication-overview.mdx.

Skipped: on-device run of the end-of-call steps (no device in this environment; the PR notes the same).

jitvarpatil
jitvarpatil previously approved these changes Oct 16, 2026

@jitvarpatil jitvarpatil left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Approved via Review Buddy after an automated review (P0: 0 · P1: 0 · P2: 8).

Findings: #524 (review)

…all prop names — ENG-39154

Review Buddy points checked against UI Kit 5.5.2 (master-v5):
- events: add ccCallFailed ({ call } from Call Buttons/Call Logs,
  { error } from Incoming/Outgoing Call).
- ongoing-call: snippet uses leaveSession() (endSession() is deprecated
  in Calls SDK 5.x); Style now notes the safe-area container and
  background1 fill added in 5.5.2.
- components-overview: real prop names for Outgoing Call
  (onEndCallButtonPressed), Call Buttons (hide*CallButton) and
  Call Logs (callLogRequestBuilder).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he TODO — ENG-39154

Decision: the Report section keeps the Android image; no RN capture planned.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-39154

Checked against UI Kit 5.5.2 (master-v5), chat SDK 4.1.0, calls SDK 5.0.6.

P0
- custom-message-types: extensions REPLACE the defaults; spread
  CometChatUIKit.defaultExtensions, add the missing imports + a warning.
- users/groups: ccUserUnBlocked / ccGroupMemberUnBanned (source names).
- compact-message-composer: document hideVoiceRecording (hideVoiceRecordingButton
  is never read; logged as kit defect D37).
- message-list: CometChatReactions style is NOT merged over the theme; example
  now passes theme.messageBubbleReactionStyles.

P1
- call-buttons: ccCallRejected fires only on local cancel.
- events: add ccMessageError, ccMessagePinned/Unpinned/Saved/Unsaved,
  ccThreadSubscriptionChanged, openChat; message-list drops ccMessageDelivered
  (never emitted) and fixes the openChat payload.
- ongoing-call: meeting-bubble join path (no ccCallEnded); why onError must be stable.
- message-list: where each reaction component is styled; quickReactionStyle.

P2
- ongoing-call: define the listener in the example; search: SearchStyle not exported;
  component-styling: receipts have no alignment; call-buttons: fix anchor;
  llms: getId super vs this.dataSource, peer deps re-verified on 5.5.2;
  pin/save Key Methods; guide-overview lists Custom Message Types;
  AI components fetch on mount, use a changing key.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@suraj-chauhan-cometchat

Copy link
Copy Markdown
Contributor Author

@raj-dubey1 thanks for the thorough review. Everything is addressed in c033251, plus 1c0917d for ccCallFailed and the Calling table, and 554d8ed for the TODO:

  • P0: extensions spread defaultExtensions (with a warning and the missing imports) · ccUserUnBlocked / ccGroupMemberUnBanned · hideVoiceRecording (the dead hideVoiceRecordingButton is logged as a kit defect) · CometChatReactions style is not merged over the theme, so the example now passes theme.messageBubbleReactionStyles.
  • P1: ccCallRejected fires only on local cancel · events page adds ccMessageError, pin/save events, ccThreadSubscriptionChanged and openChat · ccMessageDelivered removed · meeting-bubble join path and onError stability on Ongoing Call · a reaction styling map that includes quickReactionStyle · the PR description now covers the extra sections.
  • P2: all nits fixed. One correction to the getId point: on 5.5.2, both a missing getId and super.getId() throw, and only this.dataSource.getId() is skipped silently. The llms peer-deps list is re-verified on 5.5.2, which dropped datetimepicker, async-storage and dayjs.

Could you take another look?

Conflict in ui-kit/react-native/guide-overview.mdx: kept main's renamed
formatter rows (Text Color, Custom Text Formatter, Text Formatters) and
this branch's new Custom Message Types row.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@raj-dubey1

Copy link
Copy Markdown
Contributor

Thanks for the fixes. Nearly everything from my review is addressed now. Two points are only partly fixed, so I'm leaving this as changes requested for now:

1. P0 #5: CometChatReactions example (ui-kit/react-native/message-list.mdx, ~L738–748)
The prose now correctly says style is not merged over the theme, but the example still passes style={theme.messageBubbleReactionStyles}. The default theme never sets messageBubbleReactionStyles (it isn't in theme/default on 5.5.0, 5.5.2 or master-v5), so the pills still render unstyled.

  • Use the styles the message list itself passes: theme.messageListStyles.outgoingMessageBubbleStyles.reactionStyles (or incomingMessageBubbleStyles.reactionStyles), and update the style row in the table to say the same.
  • Move const theme = useTheme() inside a component. Hooks can't be called at the top level of the snippet.

2. ccMessageDelivered / openChat in the AI quick-reference events block (message-list.mdx, ~L106–111)
ccMessageDelivered was removed from the events table but is still listed in the JSON events block, and nothing emits it. The same block also still gives openChat the payload { user, group }, while the corrected table (~L389) says { user }. Please make the block match the table.

Optional nits:

  • events.mdx: ccMessageError is also emitted when fetching stickers fails (CometChatStickerKeyboard/hooks.ts:50), not only by the collaborative document and whiteboard extensions.
  • llms-react-native-v5.mdx:45 still has the "Android + async-storage v3" Gradle note, but async-storage is no longer a peer dependency in 5.5.2. Please check whether it still applies.

Once 1 and 2 are fixed, this is good to approve.

…; events block matches table — ENG-39154

From raj-dubey1's follow-up on #524:
- message-list: theme.messageBubbleReactionStyles is never set by the default
  theme; use messageListStyles.{outgoing,incoming}MessageBubbleStyles.reactionStyles
  (style.ts:593/389) and call useTheme() inside a component.
- message-list: AI quick-reference events block drops ccMessageDelivered and gives
  openChat { user }, matching the table; listener example updated.
- events: ccMessageError also fires when fetching stickers fails
  (CometChatStickerKeyboard/hooks.ts:50).
- llms: async-storage Gradle note kept (the Chat SDK depends on it) and says so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@suraj-chauhan-cometchat

Copy link
Copy Markdown
Contributor Author

@raj-dubey1 both are fixed in b94fb8a:

  1. The CometChatReactions example now calls useTheme() inside a component and passes theme.messageListStyles.outgoingMessageBubbleStyles.reactionStyles, the value the default theme fills (style.ts:593). The style row says the same and notes that the root messageBubbleReactionStyles is unset.
  2. The quick-reference events block no longer lists ccMessageDelivered, and openChat is now { user }, matching the table. The listener example below it is updated too.

Nits: ccMessageError now mentions the sticker fetch failure. I kept the async-storage Gradle note, because the Chat SDK depends on @react-native-async-storage/async-storage, and it now says so.

This branch was successfully deployed

1 active deployment
staging — b94fb8a3 Deployed Oct 16, 2026 by mintlify[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

4 participants