@cometchat/skills 4.3.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/LICENSE +21 -0
  2. package/bin/install.js +27 -0
  3. package/package.json +14 -1
  4. package/skills/cometchat/SKILL.md +233 -69
  5. package/skills/cometchat/references/asking-questions.md +48 -0
  6. package/skills/cometchat-a11y/SKILL.md +3 -2
  7. package/skills/cometchat-android-v5/SKILL.md +2 -1
  8. package/skills/cometchat-android-v5-calls/SKILL.md +36 -22
  9. package/skills/cometchat-android-v5-calls/references/README.md +1 -1
  10. package/skills/cometchat-android-v5-calls/references/add-calls-to-existing-chat.md +7 -5
  11. package/skills/cometchat-android-v5-calls/references/audio-controls.md +4 -4
  12. package/skills/cometchat-android-v5-calls/references/call-layouts.md +33 -25
  13. package/skills/cometchat-android-v5-calls/references/call-session.md +2 -2
  14. package/skills/cometchat-android-v5-calls/references/custom-ui.md +5 -5
  15. package/skills/cometchat-android-v5-calls/references/event-listeners.md +2 -2
  16. package/skills/cometchat-android-v5-calls/references/idle-timeout.md +20 -14
  17. package/skills/cometchat-android-v5-calls/references/in-call-chat.md +1 -1
  18. package/skills/cometchat-android-v5-calls/references/migration-v4-to-v5.md +43 -27
  19. package/skills/cometchat-android-v5-calls/references/participant-management.md +3 -3
  20. package/skills/cometchat-android-v5-calls/references/raise-hand.md +25 -19
  21. package/skills/cometchat-android-v5-calls/references/recording.md +2 -2
  22. package/skills/cometchat-android-v5-calls/references/ringing-integration.md +1 -1
  23. package/skills/cometchat-android-v5-calls/references/screen-sharing.md +5 -9
  24. package/skills/cometchat-android-v5-calls/references/session-settings.md +3 -3
  25. package/skills/cometchat-android-v5-calls/references/setup.md +1 -1
  26. package/skills/cometchat-android-v5-calls/references/share-invite.md +9 -4
  27. package/skills/cometchat-android-v5-calls/references/video-controls.md +4 -4
  28. package/skills/cometchat-android-v5-calls/references/voip-calling.md +2 -2
  29. package/skills/cometchat-android-v5-components/SKILL.md +4 -3
  30. package/skills/cometchat-android-v5-core/SKILL.md +5 -3
  31. package/skills/cometchat-android-v5-customization/SKILL.md +171 -7
  32. package/skills/cometchat-android-v5-extensions/SKILL.md +7 -4
  33. package/skills/cometchat-android-v5-features/SKILL.md +5 -4
  34. package/skills/cometchat-android-v5-placement/SKILL.md +2 -1
  35. package/skills/cometchat-android-v5-production/SKILL.md +2 -1
  36. package/skills/cometchat-android-v5-push/SKILL.md +2 -3
  37. package/skills/cometchat-android-v5-testing/SKILL.md +2 -1
  38. package/skills/cometchat-android-v5-theming/SKILL.md +2 -1
  39. package/skills/cometchat-android-v5-troubleshooting/SKILL.md +3 -2
  40. package/skills/cometchat-android-v6/SKILL.md +2 -1
  41. package/skills/cometchat-android-v6-builder-settings/SKILL.md +11 -7
  42. package/skills/cometchat-android-v6-calls/SKILL.md +79 -18
  43. package/skills/cometchat-android-v6-calls/references/advanced-features.md +87 -0
  44. package/skills/cometchat-android-v6-calls/references/call-layouts.md +24 -15
  45. package/skills/cometchat-android-v6-calls/references/call-session.md +2 -2
  46. package/skills/cometchat-android-v6-calls/references/device-management.md +17 -16
  47. package/skills/cometchat-android-v6-calls/references/idle-timeout.md +7 -4
  48. package/skills/cometchat-android-v6-calls/references/in-call-chat.md +13 -8
  49. package/skills/cometchat-android-v6-calls/references/raise-hand.md +6 -4
  50. package/skills/cometchat-android-v6-compose-components/SKILL.md +52 -29
  51. package/skills/cometchat-android-v6-compose-customization/SKILL.md +156 -1
  52. package/skills/cometchat-android-v6-compose-placement/SKILL.md +129 -40
  53. package/skills/cometchat-android-v6-compose-theming/SKILL.md +27 -1
  54. package/skills/cometchat-android-v6-core/SKILL.md +208 -28
  55. package/skills/cometchat-android-v6-events/SKILL.md +4 -1
  56. package/skills/cometchat-android-v6-extensions/SKILL.md +2 -1
  57. package/skills/cometchat-android-v6-features/SKILL.md +26 -2
  58. package/skills/cometchat-android-v6-kotlin-components/SKILL.md +31 -1
  59. package/skills/cometchat-android-v6-kotlin-customization/SKILL.md +172 -1
  60. package/skills/cometchat-android-v6-kotlin-placement/SKILL.md +20 -5
  61. package/skills/cometchat-android-v6-kotlin-theming/SKILL.md +36 -5
  62. package/skills/cometchat-android-v6-migration/SKILL.md +44 -42
  63. package/skills/cometchat-android-v6-production/SKILL.md +6 -3
  64. package/skills/cometchat-android-v6-push/SKILL.md +43 -2
  65. package/skills/cometchat-android-v6-testing/SKILL.md +11 -8
  66. package/skills/cometchat-android-v6-troubleshooting/SKILL.md +26 -5
  67. package/skills/cometchat-angular-calls/SKILL.md +256 -389
  68. package/skills/cometchat-angular-calls/references/add-calls-to-existing-chat.md +3 -2
  69. package/skills/cometchat-angular-calls/references/call-layouts.md +29 -12
  70. package/skills/cometchat-angular-calls/references/call-session.md +2 -2
  71. package/skills/cometchat-angular-calls/references/custom-ui.md +18 -10
  72. package/skills/cometchat-angular-calls/references/device-management.md +53 -34
  73. package/skills/cometchat-angular-calls/references/group-calls.md +45 -24
  74. package/skills/cometchat-angular-calls/references/idle-timeout.md +31 -15
  75. package/skills/cometchat-angular-calls/references/ngzone-and-async-callbacks.md +7 -6
  76. package/skills/cometchat-angular-calls/references/raise-hand.md +9 -4
  77. package/skills/cometchat-angular-calls/references/recording-screen-share.md +32 -39
  78. package/skills/cometchat-angular-calls/references/ringing-integration.md +3 -1
  79. package/skills/cometchat-angular-calls/references/share-invite.md +11 -5
  80. package/skills/cometchat-angular-calls/references/virtual-background.md +29 -0
  81. package/skills/cometchat-angular-components/SKILL.md +149 -620
  82. package/skills/cometchat-angular-core/SKILL.md +232 -312
  83. package/skills/cometchat-angular-customization/SKILL.md +415 -223
  84. package/skills/cometchat-angular-features/SKILL.md +216 -334
  85. package/skills/cometchat-angular-patterns/SKILL.md +168 -359
  86. package/skills/cometchat-angular-placement/SKILL.md +189 -560
  87. package/skills/cometchat-angular-production/SKILL.md +241 -92
  88. package/skills/cometchat-angular-push/SKILL.md +280 -294
  89. package/skills/cometchat-angular-testing/SKILL.md +430 -158
  90. package/skills/cometchat-angular-theming/SKILL.md +190 -265
  91. package/skills/cometchat-angular-troubleshooting/SKILL.md +192 -157
  92. package/skills/cometchat-astro-patterns/SKILL.md +2 -1
  93. package/skills/cometchat-calls/SKILL.md +25 -19
  94. package/skills/cometchat-calls/references/use-case-broadcast.md +15 -10
  95. package/skills/cometchat-calls/references/use-case-marketplace.md +2 -3
  96. package/skills/cometchat-calls/references/use-case-support.md +3 -4
  97. package/skills/cometchat-calls/references/use-case-team.md +23 -12
  98. package/skills/cometchat-calls/references/use-case-telehealth.md +3 -4
  99. package/skills/cometchat-components/SKILL.md +163 -25
  100. package/skills/cometchat-core/SKILL.md +255 -19
  101. package/skills/cometchat-customization/SKILL.md +50 -25
  102. package/skills/cometchat-features/SKILL.md +313 -34
  103. package/skills/cometchat-flutter-v5/SKILL.md +10 -4
  104. package/skills/cometchat-flutter-v5-calls/SKILL.md +188 -158
  105. package/skills/cometchat-flutter-v5-calls/references/add-calls-to-existing-chat.md +48 -24
  106. package/skills/cometchat-flutter-v5-calls/references/call-layouts.md +20 -15
  107. package/skills/cometchat-flutter-v5-calls/references/call-session.md +100 -145
  108. package/skills/cometchat-flutter-v5-calls/references/device-management.md +12 -8
  109. package/skills/cometchat-flutter-v5-calls/references/group-calls.md +30 -36
  110. package/skills/cometchat-flutter-v5-calls/references/idle-timeout.md +15 -13
  111. package/skills/cometchat-flutter-v5-calls/references/in-call-chat.md +12 -9
  112. package/skills/cometchat-flutter-v5-calls/references/migration-v4-to-v5.md +115 -65
  113. package/skills/cometchat-flutter-v5-calls/references/raise-hand.md +41 -30
  114. package/skills/cometchat-flutter-v5-calls/references/ringing-integration.md +17 -14
  115. package/skills/cometchat-flutter-v5-calls/references/share-invite.md +8 -2
  116. package/skills/cometchat-flutter-v5-conversations/SKILL.md +2 -1
  117. package/skills/cometchat-flutter-v5-core/SKILL.md +5 -4
  118. package/skills/cometchat-flutter-v5-customization/SKILL.md +136 -5
  119. package/skills/cometchat-flutter-v5-events/SKILL.md +2 -1
  120. package/skills/cometchat-flutter-v5-messages/SKILL.md +2 -1
  121. package/skills/cometchat-flutter-v5-production/SKILL.md +15 -6
  122. package/skills/cometchat-flutter-v5-push/SKILL.md +2 -1
  123. package/skills/cometchat-flutter-v5-testing/SKILL.md +17 -6
  124. package/skills/cometchat-flutter-v5-theming/SKILL.md +2 -1
  125. package/skills/cometchat-flutter-v5-troubleshooting/SKILL.md +7 -6
  126. package/skills/cometchat-flutter-v5-users-groups/SKILL.md +3 -2
  127. package/skills/cometchat-flutter-v6/SKILL.md +17 -16
  128. package/skills/cometchat-flutter-v6-calls/SKILL.md +72 -57
  129. package/skills/cometchat-flutter-v6-calls/references/add-calls-to-existing-chat.md +5 -3
  130. package/skills/cometchat-flutter-v6-calls/references/advanced-features.md +89 -0
  131. package/skills/cometchat-flutter-v6-calls/references/call-layouts.md +15 -12
  132. package/skills/cometchat-flutter-v6-calls/references/call-session.md +2 -2
  133. package/skills/cometchat-flutter-v6-calls/references/device-management.md +9 -3
  134. package/skills/cometchat-flutter-v6-calls/references/group-calls.md +10 -10
  135. package/skills/cometchat-flutter-v6-calls/references/idle-timeout.md +15 -7
  136. package/skills/cometchat-flutter-v6-calls/references/in-call-chat.md +6 -3
  137. package/skills/cometchat-flutter-v6-calls/references/raise-hand.md +23 -16
  138. package/skills/cometchat-flutter-v6-components/SKILL.md +32 -11
  139. package/skills/cometchat-flutter-v6-conversations/SKILL.md +39 -11
  140. package/skills/cometchat-flutter-v6-core/SKILL.md +182 -21
  141. package/skills/cometchat-flutter-v6-customization/SKILL.md +97 -25
  142. package/skills/cometchat-flutter-v6-events/SKILL.md +3 -2
  143. package/skills/cometchat-flutter-v6-features/SKILL.md +15 -6
  144. package/skills/cometchat-flutter-v6-messages/SKILL.md +111 -60
  145. package/skills/cometchat-flutter-v6-migration/SKILL.md +18 -25
  146. package/skills/cometchat-flutter-v6-placement/SKILL.md +79 -50
  147. package/skills/cometchat-flutter-v6-production/SKILL.md +13 -12
  148. package/skills/cometchat-flutter-v6-push/SKILL.md +41 -19
  149. package/skills/cometchat-flutter-v6-testing/SKILL.md +4 -4
  150. package/skills/cometchat-flutter-v6-theming/SKILL.md +38 -5
  151. package/skills/cometchat-flutter-v6-troubleshooting/SKILL.md +182 -17
  152. package/skills/cometchat-flutter-v6-users-groups/SKILL.md +12 -4
  153. package/skills/cometchat-i18n/SKILL.md +139 -78
  154. package/skills/cometchat-ios/SKILL.md +4 -2
  155. package/skills/cometchat-ios-calls/SKILL.md +225 -95
  156. package/skills/cometchat-ios-calls/references/add-calls-to-existing-chat.md +11 -9
  157. package/skills/cometchat-ios-calls/references/audio-modes-and-controls.md +45 -0
  158. package/skills/cometchat-ios-calls/references/avaudiosession-routing.md +6 -7
  159. package/skills/cometchat-ios-calls/references/call-layouts.md +31 -91
  160. package/skills/cometchat-ios-calls/references/call-session.md +51 -54
  161. package/skills/cometchat-ios-calls/references/callkit-and-pushkit.md +33 -29
  162. package/skills/cometchat-ios-calls/references/custom-ui.md +38 -38
  163. package/skills/cometchat-ios-calls/references/group-calls.md +33 -70
  164. package/skills/cometchat-ios-calls/references/idle-timeout.md +24 -25
  165. package/skills/cometchat-ios-calls/references/in-call-chat.md +19 -23
  166. package/skills/cometchat-ios-calls/references/migration-v4-to-v5.md +128 -70
  167. package/skills/cometchat-ios-calls/references/picture-in-picture.md +20 -20
  168. package/skills/cometchat-ios-calls/references/raise-hand.md +14 -227
  169. package/skills/cometchat-ios-calls/references/recording-screen-share.md +35 -122
  170. package/skills/cometchat-ios-calls/references/ringing-integration.md +17 -16
  171. package/skills/cometchat-ios-calls/references/share-invite.md +8 -12
  172. package/skills/cometchat-ios-calls/references/swiftui-uikit-hosting.md +4 -4
  173. package/skills/cometchat-ios-components/SKILL.md +200 -12
  174. package/skills/cometchat-ios-core/SKILL.md +173 -45
  175. package/skills/cometchat-ios-customization/SKILL.md +276 -110
  176. package/skills/cometchat-ios-features/SKILL.md +64 -36
  177. package/skills/cometchat-ios-placement/SKILL.md +15 -12
  178. package/skills/cometchat-ios-production/SKILL.md +12 -4
  179. package/skills/cometchat-ios-push/SKILL.md +53 -19
  180. package/skills/cometchat-ios-testing/SKILL.md +14 -9
  181. package/skills/cometchat-ios-theming/SKILL.md +39 -3
  182. package/skills/cometchat-ios-troubleshooting/SKILL.md +41 -21
  183. package/skills/cometchat-native-bare-patterns/SKILL.md +34 -17
  184. package/skills/cometchat-native-calls/SKILL.md +28 -16
  185. package/skills/cometchat-native-calls/references/add-calls-to-existing-chat.md +2 -2
  186. package/skills/cometchat-native-calls/references/call-layouts.md +15 -14
  187. package/skills/cometchat-native-calls/references/call-session.md +2 -2
  188. package/skills/cometchat-native-calls/references/custom-ui.md +12 -8
  189. package/skills/cometchat-native-calls/references/device-management.md +53 -30
  190. package/skills/cometchat-native-calls/references/group-calls.md +35 -30
  191. package/skills/cometchat-native-calls/references/idle-timeout.md +6 -6
  192. package/skills/cometchat-native-calls/references/in-call-chat.md +10 -8
  193. package/skills/cometchat-native-calls/references/migration-v4-to-v5.md +2 -2
  194. package/skills/cometchat-native-calls/references/raise-hand.md +15 -13
  195. package/skills/cometchat-native-calls/references/recording-screen-share.md +49 -170
  196. package/skills/cometchat-native-calls/references/share-invite.md +7 -5
  197. package/skills/cometchat-native-calls/references/voip-push-end-to-end.md +4 -2
  198. package/skills/cometchat-native-components/SKILL.md +84 -52
  199. package/skills/cometchat-native-core/SKILL.md +101 -32
  200. package/skills/cometchat-native-customization/SKILL.md +150 -28
  201. package/skills/cometchat-native-expo-patterns/SKILL.md +57 -26
  202. package/skills/cometchat-native-features/SKILL.md +23 -16
  203. package/skills/cometchat-native-placement/SKILL.md +19 -10
  204. package/skills/cometchat-native-production/SKILL.md +9 -3
  205. package/skills/cometchat-native-push/SKILL.md +2 -1
  206. package/skills/cometchat-native-testing/SKILL.md +1 -2
  207. package/skills/cometchat-native-theming/SKILL.md +54 -29
  208. package/skills/cometchat-native-troubleshooting/SKILL.md +9 -3
  209. package/skills/cometchat-nextjs-patterns/SKILL.md +20 -6
  210. package/skills/cometchat-placement/SKILL.md +42 -3
  211. package/skills/cometchat-production/SKILL.md +12 -5
  212. package/skills/cometchat-react-calls/SKILL.md +220 -10
  213. package/skills/cometchat-react-calls/references/add-calls-to-existing-chat.md +4 -3
  214. package/skills/cometchat-react-calls/references/call-layouts.md +5 -6
  215. package/skills/cometchat-react-calls/references/call-session.md +1 -1
  216. package/skills/cometchat-react-calls/references/custom-ui.md +61 -15
  217. package/skills/cometchat-react-calls/references/device-management.md +55 -51
  218. package/skills/cometchat-react-calls/references/group-calls.md +18 -23
  219. package/skills/cometchat-react-calls/references/idle-timeout.md +25 -12
  220. package/skills/cometchat-react-calls/references/in-call-chat.md +7 -7
  221. package/skills/cometchat-react-calls/references/migration-v4-to-v5.md +9 -11
  222. package/skills/cometchat-react-calls/references/raise-hand.md +14 -14
  223. package/skills/cometchat-react-calls/references/recording-screen-share.md +39 -38
  224. package/skills/cometchat-react-calls/references/ringing-integration.md +2 -2
  225. package/skills/cometchat-react-calls/references/share-invite.md +4 -5
  226. package/skills/cometchat-react-calls/references/testing-calls-on-web.md +20 -2
  227. package/skills/cometchat-react-calls/references/virtual-background.md +32 -0
  228. package/skills/cometchat-react-patterns/SKILL.md +44 -4
  229. package/skills/cometchat-react-push/SKILL.md +258 -72
  230. package/skills/cometchat-react-router-patterns/SKILL.md +10 -4
  231. package/skills/cometchat-react-testing/SKILL.md +14 -5
  232. package/skills/cometchat-theming/SKILL.md +181 -18
  233. package/skills/cometchat-troubleshooting/SKILL.md +40 -20
@@ -3,7 +3,6 @@ name: cometchat-native-core
3
3
  description: "Shared rules for CometChat React Native UI Kit v5. Always loaded alongside framework (expo/bare) and placement skills. Read this first."
4
4
  license: "MIT"
5
5
  compatibility: "Node.js >=18; React Native >=0.70; @cometchat/chat-uikit-react-native ^5; @cometchat/chat-sdk-react-native ^4"
6
- allowed-tools: "shell, file-read, file-search, file-list"
7
6
  metadata:
8
7
  author: "CometChat"
9
8
  version: "3.0.0"
@@ -16,7 +15,7 @@ This is the foundational skill for every CometChat React Native UI Kit v5 integr
16
15
 
17
16
  **Read this skill first, before any framework (`cometchat-native-expo-patterns` / `cometchat-native-bare-patterns`) or placement skill.**
18
17
 
19
- Ground-truth sources: `docs/ui-kit/react-native/overview.mdx`, `react-native-cli-integration.mdx`, `expo-integration.mdx`, `methods.mdx`, and `@cometchat/chat-uikit-react-native@5.3.3`'s `src/index.ts`.
18
+ Ground-truth sources: `docs/ui-kit/react-native/overview.mdx`, `react-native-cli-integration.mdx`, `expo-integration.mdx`, `methods.mdx`, and `@cometchat/chat-uikit-react-native@5.3.8`'s `src/index.ts` (file-based `initFromSettings` GA). **Official docs:** https://www.cometchat.com/docs/ui-kit/react-native/overview · **Docs MCP:** `claude mcp add --transport http cometchat-docs https://www.cometchat.com/docs/mcp` (or fetch the URL directly without MCP).
20
19
 
21
20
  ---
22
21
 
@@ -30,7 +29,55 @@ CometChatUIKit.init(settings) → CometChatUIKit.login({ uid }) → rend
30
29
 
31
30
  Breaking this order produces a blank screen, a "CometChat is not initialized" runtime error, or a hung login. No exceptions.
32
31
 
33
- ### UIKitSettings the init object
32
+ ### File-based init with `cometchat-settings.json` (recommended)
33
+
34
+ > **Version requirement (ENG-35866 — Skills Telemetry).** `CometChatUIKit.initFromSettings(settings)` reads a `cometchat-settings.json` object and lets the SDK self-report `integrationSource = "ai-agent"` to `/user_sessions`. It ships GA in **`@cometchat/chat-uikit-react-native >= 5.3.8`** + **`@cometchat/chat-sdk-react-native >= 4.0.25`** (npm `latest`). On an older UI Kit the method does not exist — use the flat-object `init()` **fallback** below.
35
+
36
+ **Step 1 — create `cometchat-settings.json` at the project root.** Fill `appId` / `region` / `credentials.authKey` from the CLI `provision setup` output; leave everything else at the defaults below. Single source of credentials — no second copy to keep in sync.
37
+
38
+ ```json
39
+ {
40
+ "appId": "APP_ID_HERE",
41
+ "region": "us",
42
+ "credentials": {
43
+ "authKey": "AUTH_KEY_HERE"
44
+ },
45
+ "chatSDK": {
46
+ "presenceSubscription": {
47
+ "type": "ALL_USERS",
48
+ "roles": []
49
+ },
50
+ "autoEstablishSocketConnection": true,
51
+ "adminHost": null,
52
+ "clientHost": null
53
+ },
54
+ "callsSDK": {
55
+ "host": null,
56
+ "adminHost": null,
57
+ "clientHost": null,
58
+ "callsHost": null
59
+ },
60
+ "uiKit": {
61
+ "subscribePresenceForAllUsers": true
62
+ }
63
+ }
64
+ ```
65
+
66
+ **Step 2 — init by importing the JSON.** Metro bundles JSON imports natively (no extra config), so the file is read at build time exactly like the web kit:
67
+
68
+ ```tsx
69
+ // initFromSettings ships GA in @cometchat/chat-uikit-react-native >= 5.3.8 (ENG-35866)
70
+ import { CometChatUIKit } from "@cometchat/chat-uikit-react-native";
71
+ import cometchatSettings from "../cometchat-settings.json"; // adjust path to the file's location
72
+
73
+ await CometChatUIKit.initFromSettings(cometchatSettings);
74
+ // then: CometChatUIKit.login({ uid }) — see §2
75
+ ```
76
+
77
+ - **Do NOT gitignore `cometchat-settings.json`.** The dev-mode `authKey` ships in the JS bundle either way; production integrations use server-minted auth tokens.
78
+ - The init-once flag + "init before first render" rules below apply unchanged — just swap the `init({...})` call for `initFromSettings(cometchatSettings)`.
79
+
80
+ ### UIKitSettings — the init object (fallback — UI Kit before file-based init)
34
81
 
35
82
  The v5 RN UI Kit's `init()` takes a flat `UIKitSettings` object (NOT a `UIKitSettingsBuilder` like the web kit). Pass fields directly:
36
83
 
@@ -60,6 +107,16 @@ async function initCometChat(): Promise<void> {
60
107
  if (initialized) return;
61
108
  initialized = true;
62
109
 
110
+ // Fail loud if env vars didn't load (EXPO_PUBLIC_* not set, or a config
111
+ // module returning undefined). Empty creds otherwise surface later as a
112
+ // cryptic init/login failure that's hard to trace. (audit P0-5)
113
+ if (!APP_ID || !REGION || !AUTH_KEY) {
114
+ throw new Error(
115
+ "CometChat credentials are empty — check your EXPO_PUBLIC_* env (or config module) " +
116
+ "and restart Metro with --reset-cache after editing it.",
117
+ );
118
+ }
119
+
63
120
  await CometChatUIKit.init({
64
121
  appId: APP_ID,
65
122
  region: REGION,
@@ -394,24 +451,33 @@ npm install \
394
451
  @cometchat/chat-uikit-react-native \
395
452
  react-native-gesture-handler \
396
453
  react-native-safe-area-context \
454
+ @react-native-clipboard/clipboard \
455
+ react-native-svg \
456
+ react-native-video \
457
+ react-native-localize \
397
458
  punycode
398
459
  ```
399
460
 
400
- > **Why `punycode`?** The kit's `CometChatAIAssistantMessageBubble` pulls in `markdown-it`, which does `require('punycode')`. Node 22+ removed `punycode` from core, so Metro can't resolve it without the userland package. Missing it = bundle 500 with `Unable to resolve module punycode`. (Validated 2026-05-26 on `@cometchat/chat-uikit-react-native@5.3.5` + Expo SDK 56 + RN 0.85.3.)
461
+ > The kit's declared peer deps include `@react-native-clipboard/clipboard`, `react-native-svg`, `react-native-video`, and `react-native-localize` (it imports all four) install them or the bundle fails at runtime. `react-native-safe-area-context` is also required (imported by several components) though not formally declared.
462
+
463
+ > **Why `punycode` — still REQUIRED on 5.3.7 (kit 5.3.7's markdown path needs it).** The kit's `CometChatAIAssistantMessageBubble` pulls in `react-native-markdown-display` → `markdown-it@^10` → `linkify-it@^2`, which does `require('punycode')`. **React Native / Metro does not bundle Node core modules**, so Metro can't resolve `punycode` unless you install the userland package → otherwise the bundle fails with `Unable to resolve module punycode`. (This is NOT version-gone-from-Node — it's RN not shipping Node core libs; affects any kit whose markdown/AI path is reachable, incl. 5.3.5 AND 5.3.7.) **Verified 2026-06-14 on a real `expo export`: Expo SDK 56 + RN 0.85.3 + kit 5.3.7 FAILED on `punycode` until the userland package was installed**, then bundled clean (5.5 MB Hermes). Keep `punycode` in the install list — it is load-bearing whenever any feature that renders markdown / the AI Assistant bubble is reachable.
401
464
 
402
465
  > Note: `react-native-reanimated` is NOT a peer dependency of the kit (verified against `@cometchat/chat-uikit-react-native@5.x` `peerDependencies`). Add it only if your own app uses it for other animations.
403
466
 
404
- Expo adds `expo-av` / `expo-image-picker` depending on which features you enable. Calls require the separate package PLUS four polyfill peers the calls-sdk imports but doesn't declare:
467
+ Expo adds `expo-av` / `expo-image-picker` depending on which features you enable. Calls require the separate package PLUS the WebRTC native peers AND the polyfill peers the calls-sdk imports but doesn't declare:
405
468
 
406
469
  ```bash
407
470
  npm install @cometchat/calls-sdk-react-native \
471
+ @react-native-community/netinfo \
472
+ react-native-callstats \
473
+ react-native-webrtc \
408
474
  react-native-background-timer \
409
475
  react-native-url-polyfill \
410
476
  react-native-performance \
411
477
  valibot
412
478
  ```
413
479
 
414
- > The calls-sdk `dist/polyfills/browser.js` imports `react-native-background-timer`, `react-native-url-polyfill/auto`, and `react-native-performance` at module top; `valibot` is consumed deeper in the calls state machine. None are in the calls-sdk `peerDependencies` array — they fail at bundle resolution if missing. (Validated 2026-05-26 on `@cometchat/calls-sdk-react-native@5.0.0`.) Then run `npx expo prebuild` (Expo) or `cd ios && pod install` (bare) so the three native modules get autolinked into the next debug build.
480
+ > `@react-native-community/netinfo`, `react-native-callstats`, and `react-native-webrtc` are the WebRTC native peers; `react-native-background-timer`, `react-native-url-polyfill/auto`, and `react-native-performance` are imported at the top of the calls-sdk `dist/polyfills/browser.js`, and `valibot` is consumed deeper in the calls state machine. The polyfill peers + valibot are NOT in the calls-sdk `peerDependencies` array — they fail at bundle resolution if missing. (Validated 2026-05-26 on `@cometchat/calls-sdk-react-native@5.0.0`.) Then run `npx expo prebuild` (Expo) or `cd ios && pod install` (bare) so the native modules get autolinked into the next debug build. This mirrors the lists in `cometchat-native-features` / `cometchat-native-expo-patterns` / `cometchat-native-bare-patterns` — see `cometchat-native-calls` for full calls setup.
415
481
 
416
482
  See `cometchat-native-features` for when to add the calls SDK.
417
483
 
@@ -436,7 +502,7 @@ See `cometchat-native-features` for when to add the calls SDK.
436
502
 
437
503
  When the dispatcher's Step 3.1 sets `customize=visual` and the framework maps to builder platform `react-native`, skills runs **`cometchat builder export --platform react-native`** — a single CLI command that downloads the canonical static template ZIP from `preview.cometchat.com/downloads/cometchat-builder-react-native.zip`, fetches the per-builder settings JSON via `GET /vcb/builders/{id}`, applies F3 + F10 missing-field defaults, and writes the result to `--output` (default: `src/config/`).
438
504
 
439
- The canonical app uses a **Zustand-backed config store** (`src/config/store.ts`) that exposes `useConfig(selector)` — components read theme tokens and feature flags reactively. The exported `config.json` carries the **envelope shape** `{ builderId, name, settings: {...} }` — the store reads `config.settings.*` from it (F9 envelope finding, verified 2026-05-22 against the canonical Zustand store).
505
+ The canonical app uses a **Zustand-backed config store** (`src/config/store.ts`) that exposes `useConfig(selector)` — components read theme tokens and feature flags reactively. The exported `config.json` carries the **envelope shape** `{ builderId, name, type, createdAt, updatedAt, expiresAt, settings: { chatFeatures, callFeatures, layout, style, noCode, agent } }` — the store reads `config.settings.*` from it (verified 2026-06-14 against a live `builder export --platform react-native`). Theme tokens live under `settings.style` (`{ theme, color, typography }`) — there is **no `settings.theme`** key. `settings.agent` (`{ chatHistory, newChat, agentIcon, showAgentIcon }`) IS present (AI-agent config).
440
506
 
441
507
  This is intentionally lighter than the React web copy (full `src/CometChat/` directory). The RN builder repo is a QR-driven sample with custom navigation that doesn't fit cleanly into the customer's existing navigator. So `builder export` extracts the **configuration plumbing only** (per the repo's own README §"Integration in Your Existing React Native App"), then skills writes a minimal wrapper that consumes the config in the customer's existing four-wrapper chain.
442
508
 
@@ -451,7 +517,7 @@ Defaults to `--output src/config/`. The command writes:
451
517
  | File | Content |
452
518
  |---|---|
453
519
  | `src/config/store.ts` | Zustand store with full `AppConfig` typings, AsyncStorage persistence, `useConfig<T>(selector)` hook, `useConfigStore`. Verbatim from canonical ZIP. |
454
- | `src/config/config.json` | **Envelope-shape JSON** `{ builderId, name: ..., settings: { chatFeatures: ..., callFeatures: ..., theme: ..., agent: ... } }`. Settings come from `GET /vcb/builders/{id}`; missing fields (`inAppSounds`, `mentionAll`) defaulted by the CLI. **No SKILLS-AUTO-GENERATED sentinel** (JSON forbids `//` comments). |
520
+ | `src/config/config.json` | **Envelope-shape JSON** `{ builderId, name, type, createdAt, updatedAt, expiresAt, settings: { chatFeatures, callFeatures, layout, style, noCode, agent } }`. There is **no `theme` key** (theme tokens live under `settings.style.{theme,color,typography}`); `settings.agent` (`{chatHistory,newChat,agentIcon,showAgentIcon}`) IS present (verified live 2026-06-14). Settings come from `GET /vcb/builders/{id}`. `inAppSounds` / `mentionAll` are **CLI-injected defaults** (not returned by the builder). **No SKILLS-AUTO-GENERATED sentinel** (JSON forbids `//` comments). |
455
521
 
456
522
  Resync = re-run the same command with `--force` (full re-download + replace). See `cometchat-core` §11.6 for the resync contract.
457
523
 
@@ -460,8 +526,9 @@ Resync = re-run the same command with `--force` (full re-download + replace). Se
460
526
  | Path | Patch |
461
527
  |---|---|
462
528
  | `package.json` | `npm install zustand @react-native-async-storage/async-storage` — required by the copied `store.ts`. Then the normal `cometchat-native-{bare,expo}-patterns` deps (11 explicit peers on bare, `npx expo install` list on Expo). If `useConfig(state => state.settings.callFeatures.*).oneOnOne*` returns true, also add `@cometchat/calls-sdk-react-native@5.0.0` + the Cloudsmith `@cometchat/calls-lib-webrtc` tarball per `cometchat-native-calls`. |
463
- | Entry — `App.tsx` (bare) / `app/_layout.tsx` (Expo Router) | Init UI Kit + wrap the four-wrapper chain with `<CometChatThemeProvider theme={builderTheme}>` derived from `useConfig`. Template below. |
464
- | `index.js` (bare) or app entry (Expo Router managed) | `import 'react-native-gesture-handler';` on line 1 (this skill's four-wrapper rulenon-negotiable, applies to every RN integration regardless of customization mode). |
529
+ | Entry — `App.tsx` (bare) / `app/_layout.tsx` (Expo Router) | Init UI Kit + wrap the provider chain (`SafeAreaProvider → SafeAreaView → CometChatThemeProvider → CometChatI18nProvider`) with `theme` derived from `useConfig`. Template below. |
530
+ | `App.tsx` line 1 (bare) / app entry (Expo Router) | Gesture-handler side-effect import. The reference app uses `import './gesture-handler';` (a local shim file) as the **first import in `App.tsx`** not in `index.js`. Bare CLI projects without that shim use `import 'react-native-gesture-handler';` instead. Either form must be the top-of-file side-effect import. |
531
+ | `index.js` (bare) | App registration. The reference wraps `<App />` in `<AppErrorBoundary><ActiveChatProvider>` before `AppRegistry.registerComponent`. Preserve the customer's existing `index.js` registration; only add these wrappers if you also copy the corresponding files. |
465
532
  | `src/utils/AppConstants.tsx` (canonical pattern) OR `.env` (Step 2c convention) | Credentials. Skills writes the canonical path the customer already had from §2 (Expo: `process.env.EXPO_PUBLIC_*`; bare: `@env` via `react-native-dotenv`). |
466
533
  | `ios/Podfile` + `ios/<App>/Info.plist` (bare) or `app.json` plugins (Expo) | Camera + microphone usage descriptions if any `callFeatures.voiceAndVideoCalling.*` is true. |
467
534
 
@@ -469,11 +536,11 @@ Resync = re-run the same command with `--force` (full re-download + replace). Se
469
536
 
470
537
  ```tsx
471
538
  // App.tsx
472
- import './gesture-handler'; // bare RN: line 1, before any other import
539
+ import './gesture-handler'; // line 1, before any other import — gesture-handler side-effect
540
+ // (bare CLI w/o the shim file: `import 'react-native-gesture-handler';`)
473
541
  import React, { useEffect, useState } from 'react';
474
542
  import { Platform } from 'react-native';
475
543
  import { SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context';
476
- import { GestureHandlerRootView } from 'react-native-gesture-handler';
477
544
  import {
478
545
  CometChatUIKit,
479
546
  UIKitSettings,
@@ -513,13 +580,15 @@ export default function App() {
513
580
  const [isReady, setIsReady] = useState(false);
514
581
 
515
582
  useEffect(() => {
516
- const settings = new UIKitSettings.UIKitSettingsBuilder()
517
- .setAppId(process.env.EXPO_PUBLIC_COMETCHAT_APP_ID!)
518
- .setRegion(process.env.EXPO_PUBLIC_COMETCHAT_REGION!)
519
- .setAuthKey(process.env.EXPO_PUBLIC_COMETCHAT_AUTH_KEY!)
520
- .subscribePresenceForAllUsers()
521
- .build();
522
- CometChatUIKit.init(settings).then(() => setIsReady(true)).catch(console.error);
583
+ // RN kit takes a FLAT UIKitSettings object — there is NO UIKitSettingsBuilder
584
+ // on react-native (see §1; the builder is web-only). Using it throws
585
+ // "UIKitSettingsBuilder is not a constructor".
586
+ CometChatUIKit.init({
587
+ appId: process.env.EXPO_PUBLIC_COMETCHAT_APP_ID!,
588
+ region: process.env.EXPO_PUBLIC_COMETCHAT_REGION!,
589
+ authKey: process.env.EXPO_PUBLIC_COMETCHAT_AUTH_KEY!,
590
+ subscriptionType: "ALL_USERS",
591
+ }).then(() => setIsReady(true)).catch(console.error);
523
592
  }, []);
524
593
 
525
594
  const fontKey = styleConfig.typography.font.toLowerCase().trim();
@@ -547,17 +616,15 @@ export default function App() {
547
616
  if (!isReady) return null;
548
617
 
549
618
  return (
550
- <GestureHandlerRootView style={{ flex: 1 }}>
551
- <SafeAreaProvider>
552
- <SafeAreaView edges={['top', 'bottom']} style={{ flex: 1 }}>
553
- <CometChatThemeProvider theme={theme}>
554
- <CometChatI18nProvider>
555
- <RootStackNavigator />
556
- </CometChatI18nProvider>
557
- </CometChatThemeProvider>
558
- </SafeAreaView>
559
- </SafeAreaProvider>
560
- </GestureHandlerRootView>
619
+ <SafeAreaProvider>
620
+ <SafeAreaView edges={['top', 'bottom']} style={{ flex: 1 }}>
621
+ <CometChatThemeProvider theme={theme}>
622
+ <CometChatI18nProvider>
623
+ <RootStackNavigator />
624
+ </CometChatI18nProvider>
625
+ </CometChatThemeProvider>
626
+ </SafeAreaView>
627
+ </SafeAreaProvider>
561
628
  );
562
629
  }
563
630
  ```
@@ -566,7 +633,7 @@ export default function App() {
566
633
 
567
634
  - `useConfig(state => state.settings.style)` is the canonical hook — **not** a static `import` of the JSON. The store hydrates from AsyncStorage on first read; importing the JSON directly would freeze the initial values and skip QR-update / resync flows that may follow.
568
635
  - `CometChatThemeProvider`'s `theme` prop takes a `{ light, dark }` object (NOT a string like `"dark"`). The string-form `theme="dark"` was a v4-era shape and was removed in `chat-uikit-react-native@5+`.
569
- - The four-wrapper rule still applies: `GestureHandlerRootViewSafeAreaProvider → CometChatThemeProvider → CometChatI18nProvider`. Skipping any of the four breaks gestures, safe areas, theming, or i18n — and fails silently in dev.
636
+ - The reference app's provider chain is `SafeAreaProviderSafeAreaView → CometChatThemeProvider → CometChatI18nProvider`, and gesture-handler is wired as a **top-of-file side-effect import** (`import './gesture-handler';` on App.tsx line 1) — **not** as a `<GestureHandlerRootView>` wrapper. Match this. (If you deliberately add `<GestureHandlerRootView style={{ flex: 1 }}>` as the outermost wrapper for extra hardening, that is also valid — but it is not what the reference ships, so don't present it as required.) Skipping safe areas, theming, i18n, or the gesture-handler import breaks gestures, safe areas, theming, or i18n — and fails silently in dev.
570
637
  - `CometChatUIKit.init(settings)` returns a Promise — `isReady` gate before render prevents `RootStackNavigator` from mounting chat components before init resolves.
571
638
  - The canonical RN builder app also registers a `CometChat.addCallListener` at the App level (handles incoming calls / busy / cancelled / ended). When `callFeatures.voiceAndVideoCalling.*` is true, copy that listener block verbatim from the canonical `App.tsx` inside the React Native Visual Builder ZIP (download from https://preview.cometchat.com/downloads/cometchat-builder-react-native.zip) (look for `'app'` listener id).
572
639
 
@@ -575,7 +642,7 @@ export default function App() {
575
642
  Components throughout the customer's app can read flags reactively:
576
643
 
577
644
  ```tsx
578
- const reactionsEnabled = useConfig(s => s.settings.chatFeatures.deeperEngagement.reactions);
645
+ const reactionsEnabled = useConfig(s => s.settings.chatFeatures.deeperUserEngagement.reactions);
579
646
  const audioCallsEnabled = useConfig(
580
647
  s => s.settings.callFeatures.voiceAndVideoCalling.oneOnOneVoiceCalling,
581
648
  );
@@ -599,6 +666,8 @@ The customer reloads the dev build (`r` in Metro) — `useConfig` rehydrates fro
599
666
 
600
667
  ### Calls + builder
601
668
 
669
+ > **Version note (intentional divergence):** the reference builder app `builder-apps/uikit-builder-app-react-native` still ships `@cometchat/calls-sdk-react-native@^4.3.0` (no `@cometchat/calls-lib-webrtc`; it uses `react-native-webrtc` directly). Skills intentionally targets **calls SDK v5** per the calls-v5-canonical policy. If you diff the reference app, don't "correct" the skill back to 4.3.0 — the v5 guidance below is deliberate.
670
+
602
671
  If `callFeatures.voiceAndVideoCalling.*` is true:
603
672
  1. Add `@cometchat/calls-sdk-react-native@5.0.0` + the Cloudsmith `@cometchat/calls-lib-webrtc` tarball (per `cometchat-native-calls`).
604
673
  2. Wire `CometChat.addCallListener` + `CometChatUIEventHandler.addCallListener` in `App.tsx` — copy the listener block verbatim from the canonical app's `App.tsx`.
@@ -3,7 +3,6 @@ name: cometchat-native-customization
3
3
  description: "Customize the CometChat React Native UI Kit without forking — four-tier model: props → request builders → text formatters + message templates → DataSource decorators + event bus."
4
4
  license: "MIT"
5
5
  compatibility: "Node.js >=18; React Native >=0.70; @cometchat/chat-uikit-react-native ^5"
6
- allowed-tools: "shell, file-read, file-search, file-list, ask-user"
7
6
  metadata:
8
7
  author: "CometChat"
9
8
  version: "3.0.0"
@@ -25,7 +24,7 @@ Tier 4 — DataSource decorators + Events (last resort, powerful)
25
24
 
26
25
  **Read `cometchat-native-components` first** — the catalog is the source of truth for prop names, slot views, and event listener names that this skill builds on.
27
26
 
28
- Ground truth: `docs/ui-kit/react-native/custom-text-formatter-guide.mdx`, `mentions-formatter-guide.mdx`, `shortcut-formatter-guide.mdx`, `url-formatter-guide.mdx`, `events.mdx`, `methods.mdx`, `property-changes.mdx`, and the kit's source at `packages/ChatUiKit/src/shared/formatters/` and `packages/ChatUiKit/src/shared/events/`.
27
+ Ground truth: `docs/ui-kit/react-native/custom-text-formatter-guide.mdx`, `mentions-formatter-guide.mdx`, `shortcut-formatter-guide.mdx`, `url-formatter-guide.mdx`, `events.mdx`, `methods.mdx`, `property-changes.mdx`, and the kit's source at `packages/ChatUiKit/src/shared/formatters/` and `packages/ChatUiKit/src/shared/events/`. **Official docs:** https://www.cometchat.com/docs/ui-kit/react-native/overview · **Docs MCP:** `claude mcp add --transport http cometchat-docs https://www.cometchat.com/docs/mcp` (or fetch the URL directly without MCP).
29
28
 
30
29
  ---
31
30
 
@@ -96,8 +95,10 @@ function CustomTitle({ user }: any) {
96
95
  return (
97
96
  <Text style={{
98
97
  color: theme.color.textPrimary,
99
- fontFamily: theme.typography.heading3.fontFamily,
100
- fontSize: theme.typography.heading3.fontSize,
98
+ // heading3 is a VARIANT { bold, medium, regular } — read a weight, not a flat field
99
+ // (verified vs uikit-react-native-v5 theme/default/typography.ts)
100
+ fontFamily: theme.typography.heading3.regular.fontFamily,
101
+ fontSize: theme.typography.heading3.regular.fontSize,
101
102
  }}>
102
103
  {user?.getName()}
103
104
  </Text>
@@ -213,7 +214,7 @@ class HashtagFormatter extends CometChatTextFormatter {
213
214
  constructor() {
214
215
  super();
215
216
  this.setTrackingCharacter("#"); // optional — triggers suggestion list
216
- this.setRegexPatterns([/\B#(\w+)\b/g]); // all matches get formatted
217
+ this.setRegexPatterns(/\B#(\w+)\b/g); // takes a SINGLE RegExp, not an array (verified vs CometChatTextFormatter.ts: setRegexPatterns(regexPattern: RegExp))
217
218
  }
218
219
 
219
220
  // Called for each bubble's text; return string | JSX
@@ -273,7 +274,11 @@ const formatters = [
273
274
 
274
275
  ### 3b. Custom message template — entire custom bubble
275
276
 
276
- For rendering a totally custom message type (interactive cards, scheduling, forms), use `CometChatMessageTemplate`.
277
+ For rendering a totally custom message type (interactive cards, scheduling, forms), use the kit's `CometChatMessageTemplate`.
278
+
279
+ > **Wrong-namespace trap (verified against kit source):** the template class is `CometChatMessageTemplate`, exported from `@cometchat/chat-uikit-react-native` (`packages/ChatUiKit/src/shared/modals/CometChatMessageTemplate.ts:116`; re-exported at `src/index.ts:47`). **There is NO `CometChat.MessageTemplate`** on the Chat SDK — `new CometChat.MessageTemplate(...)` does not exist. Always import the class from the UI Kit.
280
+
281
+ The constructor takes a **single options object** (`packages/ChatUiKit/src/shared/modals/CometChatMessageTemplate.ts:213-237`). View slots are **PascalCase** (`ContentView`, `BottomView`, `BubbleView`, `HeaderView`, `LeadingView`, `StatusInfoView`, `FooterView`, `ReplyView`); `options` is lowercase. The `options` callback signature is `(loggedInUser, message, theme, group?)` — note the **`theme` argument** before `group` (`CometChatMessageTemplate.ts:202-207`, invoked at `CometChatMessageList.tsx:3484` as `template.options(loggedInUser, item, mergedTheme, group)`).
277
282
 
278
283
  ```tsx
279
284
  import {
@@ -290,26 +295,116 @@ const pollTemplate = new CometChatMessageTemplate({
290
295
  BottomView: (message, alignment) => (
291
296
  <PollVoteCounts message={message} />
292
297
  ),
293
- options: (loggedInUser, message, group) => [
298
+ options: (loggedInUser, message, theme, group) => [
294
299
  /* CometChatMessageOption[] — custom long-press menu items */
295
300
  ],
296
301
  });
302
+ ```
297
303
 
298
- <CometChatMessageList
299
- user={selectedUser}
300
- templates={[pollTemplate, ...defaultTemplates]} // merge with defaults
301
- hideReplyInThreadOption
302
- />
304
+ **Register by MERGING with the defaults — never replace.** The defaults accessor is `getAllMessageTemplates(theme, additionalParams?)` and it **requires the kit theme** (`packages/ChatUiKit/src/shared/framework/DataSource.ts:168`; impl at `MessageDataSource.tsx:1732`). The data source is reached via either `ChatConfigurator.getDataSource()` (`ChatConfigurator.ts:24`) or the equivalent `CometChatUIKit.getDataSource()` (`CometChatUIKit.ts:380`). Pass the theme from `useTheme()`:
305
+
306
+ ```tsx
307
+ import {
308
+ ChatConfigurator,
309
+ useTheme,
310
+ } from "@cometchat/chat-uikit-react-native";
311
+
312
+ function Chat({ selectedUser }: any) {
313
+ const theme = useTheme();
314
+ // getAllMessageTemplates REQUIRES the theme arg
315
+ const defaults = ChatConfigurator.getDataSource().getAllMessageTemplates(theme);
316
+
317
+ return (
318
+ <CometChatMessageList
319
+ user={selectedUser}
320
+ templates={[pollTemplate, ...defaults]} // append your type, keep all built-ins
321
+ hideReplyInThreadOption
322
+ />
323
+ );
324
+ }
303
325
  ```
304
326
 
305
- Getting the default templates to merge with:
327
+ If you pass only `templates={[pollTemplate]}` you will REPLACE the built-in text/image/video/file/group-action templates and the conversation will render blank for every non-custom message. Always spread `...defaults`.
328
+
329
+ ### 3c. Override an existing type's bubble (text / image)
330
+
331
+ To change how a *built-in* type renders (e.g. a custom text bubble), don't write a new type — get the default templates, find the matching one by `type`, swap its `ContentView`, and pass the whole array back via `templates`. This preserves every other type and keeps the type's default `options`, `ReplyView`, etc.
306
332
 
307
333
  ```tsx
308
- import { ChatConfigurator } from "@cometchat/chat-uikit-react-native";
309
- const defaults = ChatConfigurator.getDataSource().getAllMessageTemplates();
310
- <CometChatMessageList templates={[pollTemplate, ...defaults]} />
334
+ import { ChatConfigurator, useTheme, CometChatUiKitConstants } from "@cometchat/chat-uikit-react-native";
335
+
336
+ function Chat({ selectedUser }: any) {
337
+ const theme = useTheme();
338
+ const templates = ChatConfigurator.getDataSource().getAllMessageTemplates(theme);
339
+
340
+ // type values come from CometChatUiKitConstants.MessageTypeConstants
341
+ const textTemplate = templates.find(
342
+ (t) => t.type === CometChatUiKitConstants.MessageTypeConstants.text,
343
+ );
344
+ if (textTemplate) {
345
+ textTemplate.ContentView = (message, alignment) => (
346
+ <MyCustomTextBubble message={message} alignment={alignment} />
347
+ );
348
+ }
349
+
350
+ return (
351
+ <CometChatMessageList
352
+ user={selectedUser}
353
+ templates={templates} // mutated-in-place array — full default set, one view swapped
354
+ hideReplyInThreadOption
355
+ />
356
+ );
357
+ }
311
358
  ```
312
359
 
360
+ `ContentView`'s signature is `(messageObject: CometChat.BaseMessage, alignment: MessageBubbleAlignmentType) => JSX.Element | null` (`CometChatMessageTemplate.ts:131-134`). Branch on `alignment === "left" | "right"` if you want incoming-vs-outgoing variants.
361
+
362
+ ### 3d. Add a Forward-style long-press option to an existing type
363
+
364
+ A long-press menu item is a **`CometChatMessageOption`** — a plain object type (`id`, `title`, optional `icon`, `onPress`, `CustomView`, `style`), defined at `packages/ChatUiKit/src/shared/modals/CometChatMessageOption.ts:6-18`, exported from `src/index.ts:45`.
365
+
366
+ > **Wrong-namespace trap:** there is **no `CometChatActionsIcon` / `CometChatActionsView`** in the RN kit (that is the web kit's class — grep of `packages/ChatUiKit/src` returns zero hits). In RN, an option is the `CometChatMessageOption` object literal.
367
+
368
+ Append yours by overriding the type's template `options` callback. Call the default-options accessor first, then add your item — append, don't replace:
369
+
370
+ ```tsx
371
+ import {
372
+ ChatConfigurator,
373
+ useTheme,
374
+ CometChatUiKitConstants,
375
+ } from "@cometchat/chat-uikit-react-native";
376
+ import type { CometChatMessageOption } from "@cometchat/chat-uikit-react-native";
377
+
378
+ function Chat({ selectedUser }: any) {
379
+ const theme = useTheme();
380
+ const templates = ChatConfigurator.getDataSource().getAllMessageTemplates(theme);
381
+
382
+ const textTemplate = templates.find(
383
+ (t) => t.type === CometChatUiKitConstants.MessageTypeConstants.text,
384
+ );
385
+ if (textTemplate) {
386
+ textTemplate.options = (loggedInUser, message, t, group) => {
387
+ // default long-press options for this message (reply, edit, delete, copy, ...)
388
+ const defaults = ChatConfigurator.getDataSource().getMessageOptions(
389
+ loggedInUser, message, t, group,
390
+ );
391
+ const forward: CometChatMessageOption = {
392
+ id: "forward",
393
+ title: "Forward",
394
+ onPress: (msg) => forwardMessage(msg),
395
+ };
396
+ return [...defaults, forward]; // append, keep the built-ins
397
+ };
398
+ }
399
+
400
+ return (
401
+ <CometChatMessageList user={selectedUser} templates={templates} hideReplyInThreadOption />
402
+ );
403
+ }
404
+ ```
405
+
406
+ The default-options accessor is `getMessageOptions(loggedInUser, messageObject, theme, group?, additionalParams?)` (`DataSource.ts:57-63`; impl `MessageDataSource.tsx:587`). It returns `CometChatMessageOption[]`. The template's `options` callback is invoked by the list as `template.options(loggedInUser, item, mergedTheme, group)` (`CometChatMessageList.tsx:3484`).
407
+
313
408
  ### When to use text formatter vs message template
314
409
 
315
410
  | Use formatter (Tier 3a) | Use template (Tier 3b) |
@@ -395,8 +490,11 @@ class MyDataSource extends DataSourceDecorator {
395
490
  return builder;
396
491
  }
397
492
 
398
- getMessageTemplate() {
399
- const defaults = super.getMessageTemplate();
493
+ // To register a custom type kit-wide, override getAllMessageTemplates —
494
+ // it returns the ARRAY. (getMessageTemplate(type, category, theme, ...)
495
+ // returns a SINGLE template-or-null, so don't merge an array there.)
496
+ getAllMessageTemplates(theme: any, additionalParams?: any) {
497
+ const defaults = super.getAllMessageTemplates(theme, additionalParams);
400
498
  return [myCustomTemplate, ...defaults];
401
499
  }
402
500
  }
@@ -488,19 +586,39 @@ You can also use `WebFetch` on the URLs above. The docs MCP does NOT index the s
488
586
  ### "Render custom avatars for all users based on their department"
489
587
  **Tier 1** — `LeadingView` slot on `CometChatConversations` + `CometChatUsers` + `CometChatMessageHeader`.
490
588
 
491
- ### "Disable the file attachment option"
492
- **Tier 1** — filter the `attachmentOptions` prop on `CometChatMessageComposer`:
589
+ ### "Add a custom attachment option (or remove one)"
590
+ **Tier 1** — the `attachmentOptions` prop on `CometChatMessageComposer`. **RN's signature is a single destructured object** `({ user, group, composerId }) => CometChatMessageComposerAction[]` (`CometChatMessageComposer.tsx:237-245`) — NOT the web kit's `(user, group) => ...`. Each action is a `CometChatMessageComposerAction` (a type, not a class: `id`, `title`, `icon`, `onPress`, `CustomView`, `style` — `shared/helper/types/index.ts:17`, exported as a type at `src/index.ts:43`).
591
+
592
+ Get the defaults to append to / filter from via `getAttachmentOptions(theme, user, group, composerId?, additionalParams?)` (`DataSource.ts:215`; impl `MessageDataSource.tsx:2123`):
493
593
 
494
594
  ```tsx
495
- <CometChatMessageComposer
496
- user={user}
497
- attachmentOptions={(user, group) => {
498
- const defaults = /* default actions from ChatConfigurator */;
499
- return defaults.filter((opt) => opt.id !== "attachment-file");
500
- }}
501
- />
595
+ import { ChatConfigurator, useTheme } from "@cometchat/chat-uikit-react-native";
596
+ import type { CometChatMessageComposerAction } from "@cometchat/chat-uikit-react-native";
597
+
598
+ function Composer({ user, group }: any) {
599
+ const theme = useTheme();
600
+ return (
601
+ <CometChatMessageComposer
602
+ user={user}
603
+ group={group}
604
+ attachmentOptions={({ user, group, composerId }) => {
605
+ const defaults = ChatConfigurator.getDataSource().getAttachmentOptions(
606
+ theme, user, group, composerId,
607
+ );
608
+ const custom: CometChatMessageComposerAction = {
609
+ id: "send-location",
610
+ title: "Location",
611
+ onPress: (u, g) => sendLocation(u, g),
612
+ };
613
+ return [...defaults, custom]; // append; or .filter(...) to remove one
614
+ }}
615
+ />
616
+ );
617
+ }
502
618
  ```
503
619
 
620
+ To **disable** an option instead, return `defaults.filter((opt) => opt.id !== "...")`.
621
+
504
622
  ### "Show only message types that contain the word 'urgent'"
505
623
  **Tier 2** — `messageRequestBuilder` with `.setSearchKeyword("urgent")`.
506
624
 
@@ -548,7 +666,7 @@ const EMOJI_MAP: Record<string, string> = {
548
666
  class EmojiShortcodeFormatter extends CometChatTextFormatter {
549
667
  constructor() {
550
668
  super();
551
- this.setRegexPatterns([/:[a-z_]+:/g]);
669
+ this.setRegexPatterns(/:[a-z_]+:/g); // SINGLE RegExp, not an array
552
670
  }
553
671
 
554
672
  getFormattedText(input: string | null | React.ReactNode) {
@@ -592,3 +710,7 @@ import { TEXT_FORMATTERS } from "./formatters";
592
710
  | `cometchat-native-customization` | This skill — four-tier triage + custom formatters / templates / DataSource / events |
593
711
  | `cometchat-native-production` | When customization depends on production auth (token refresh, user-ID mapping) |
594
712
  | `cometchat-native-troubleshooting` | Formatter doesn't apply, listener fires twice, slot view renders nothing, template not showing |
713
+
714
+ ## Sound (in-app message + call sounds)
715
+
716
+ Sound is a customization sub-dimension. The UI Kit plays incoming/outgoing message + call sounds via `CometChatSoundManager` — mute it, swap custom audio, or play a specific sound. The full API + recipe lives in **`cometchat-native-theming`** (Sound section). Verify the access path against the installed kit before relying on it.