@cometchat/skills 4.2.1 → 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 (234) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +33 -12
  3. package/bin/install.js +59 -4
  4. package/package.json +14 -1
  5. package/skills/cometchat/SKILL.md +460 -77
  6. package/skills/cometchat/references/asking-questions.md +48 -0
  7. package/skills/cometchat-a11y/SKILL.md +3 -2
  8. package/skills/cometchat-android-v5/SKILL.md +2 -1
  9. package/skills/cometchat-android-v5-calls/SKILL.md +36 -22
  10. package/skills/cometchat-android-v5-calls/references/README.md +1 -1
  11. package/skills/cometchat-android-v5-calls/references/add-calls-to-existing-chat.md +7 -5
  12. package/skills/cometchat-android-v5-calls/references/audio-controls.md +4 -4
  13. package/skills/cometchat-android-v5-calls/references/call-layouts.md +33 -25
  14. package/skills/cometchat-android-v5-calls/references/call-session.md +2 -2
  15. package/skills/cometchat-android-v5-calls/references/custom-ui.md +5 -5
  16. package/skills/cometchat-android-v5-calls/references/event-listeners.md +2 -2
  17. package/skills/cometchat-android-v5-calls/references/idle-timeout.md +20 -14
  18. package/skills/cometchat-android-v5-calls/references/in-call-chat.md +1 -1
  19. package/skills/cometchat-android-v5-calls/references/migration-v4-to-v5.md +43 -27
  20. package/skills/cometchat-android-v5-calls/references/participant-management.md +3 -3
  21. package/skills/cometchat-android-v5-calls/references/raise-hand.md +25 -19
  22. package/skills/cometchat-android-v5-calls/references/recording.md +2 -2
  23. package/skills/cometchat-android-v5-calls/references/ringing-integration.md +1 -1
  24. package/skills/cometchat-android-v5-calls/references/screen-sharing.md +5 -9
  25. package/skills/cometchat-android-v5-calls/references/session-settings.md +3 -3
  26. package/skills/cometchat-android-v5-calls/references/setup.md +1 -1
  27. package/skills/cometchat-android-v5-calls/references/share-invite.md +9 -4
  28. package/skills/cometchat-android-v5-calls/references/video-controls.md +4 -4
  29. package/skills/cometchat-android-v5-calls/references/voip-calling.md +2 -2
  30. package/skills/cometchat-android-v5-components/SKILL.md +4 -3
  31. package/skills/cometchat-android-v5-core/SKILL.md +20 -2
  32. package/skills/cometchat-android-v5-customization/SKILL.md +171 -7
  33. package/skills/cometchat-android-v5-extensions/SKILL.md +7 -4
  34. package/skills/cometchat-android-v5-features/SKILL.md +5 -4
  35. package/skills/cometchat-android-v5-placement/SKILL.md +2 -1
  36. package/skills/cometchat-android-v5-production/SKILL.md +2 -1
  37. package/skills/cometchat-android-v5-push/SKILL.md +2 -3
  38. package/skills/cometchat-android-v5-testing/SKILL.md +2 -1
  39. package/skills/cometchat-android-v5-theming/SKILL.md +2 -1
  40. package/skills/cometchat-android-v5-troubleshooting/SKILL.md +3 -2
  41. package/skills/cometchat-android-v6/SKILL.md +2 -1
  42. package/skills/cometchat-android-v6-builder-settings/SKILL.md +11 -7
  43. package/skills/cometchat-android-v6-calls/SKILL.md +79 -18
  44. package/skills/cometchat-android-v6-calls/references/advanced-features.md +87 -0
  45. package/skills/cometchat-android-v6-calls/references/call-layouts.md +24 -15
  46. package/skills/cometchat-android-v6-calls/references/call-session.md +2 -2
  47. package/skills/cometchat-android-v6-calls/references/device-management.md +17 -16
  48. package/skills/cometchat-android-v6-calls/references/idle-timeout.md +7 -4
  49. package/skills/cometchat-android-v6-calls/references/in-call-chat.md +13 -8
  50. package/skills/cometchat-android-v6-calls/references/raise-hand.md +6 -4
  51. package/skills/cometchat-android-v6-compose-components/SKILL.md +52 -29
  52. package/skills/cometchat-android-v6-compose-customization/SKILL.md +156 -1
  53. package/skills/cometchat-android-v6-compose-placement/SKILL.md +129 -40
  54. package/skills/cometchat-android-v6-compose-theming/SKILL.md +27 -1
  55. package/skills/cometchat-android-v6-core/SKILL.md +389 -9
  56. package/skills/cometchat-android-v6-events/SKILL.md +4 -1
  57. package/skills/cometchat-android-v6-extensions/SKILL.md +2 -1
  58. package/skills/cometchat-android-v6-features/SKILL.md +26 -2
  59. package/skills/cometchat-android-v6-kotlin-components/SKILL.md +31 -1
  60. package/skills/cometchat-android-v6-kotlin-customization/SKILL.md +172 -1
  61. package/skills/cometchat-android-v6-kotlin-placement/SKILL.md +20 -5
  62. package/skills/cometchat-android-v6-kotlin-theming/SKILL.md +36 -5
  63. package/skills/cometchat-android-v6-migration/SKILL.md +44 -42
  64. package/skills/cometchat-android-v6-production/SKILL.md +6 -3
  65. package/skills/cometchat-android-v6-push/SKILL.md +43 -2
  66. package/skills/cometchat-android-v6-testing/SKILL.md +11 -8
  67. package/skills/cometchat-android-v6-troubleshooting/SKILL.md +26 -5
  68. package/skills/cometchat-angular-calls/SKILL.md +256 -389
  69. package/skills/cometchat-angular-calls/references/add-calls-to-existing-chat.md +3 -2
  70. package/skills/cometchat-angular-calls/references/call-layouts.md +29 -12
  71. package/skills/cometchat-angular-calls/references/call-session.md +2 -2
  72. package/skills/cometchat-angular-calls/references/custom-ui.md +18 -10
  73. package/skills/cometchat-angular-calls/references/device-management.md +53 -34
  74. package/skills/cometchat-angular-calls/references/group-calls.md +45 -24
  75. package/skills/cometchat-angular-calls/references/idle-timeout.md +31 -15
  76. package/skills/cometchat-angular-calls/references/ngzone-and-async-callbacks.md +7 -6
  77. package/skills/cometchat-angular-calls/references/raise-hand.md +9 -4
  78. package/skills/cometchat-angular-calls/references/recording-screen-share.md +32 -39
  79. package/skills/cometchat-angular-calls/references/ringing-integration.md +3 -1
  80. package/skills/cometchat-angular-calls/references/share-invite.md +11 -5
  81. package/skills/cometchat-angular-calls/references/virtual-background.md +29 -0
  82. package/skills/cometchat-angular-components/SKILL.md +149 -620
  83. package/skills/cometchat-angular-core/SKILL.md +235 -293
  84. package/skills/cometchat-angular-customization/SKILL.md +415 -223
  85. package/skills/cometchat-angular-features/SKILL.md +216 -334
  86. package/skills/cometchat-angular-patterns/SKILL.md +168 -359
  87. package/skills/cometchat-angular-placement/SKILL.md +189 -560
  88. package/skills/cometchat-angular-production/SKILL.md +241 -92
  89. package/skills/cometchat-angular-push/SKILL.md +280 -294
  90. package/skills/cometchat-angular-testing/SKILL.md +430 -158
  91. package/skills/cometchat-angular-theming/SKILL.md +190 -265
  92. package/skills/cometchat-angular-troubleshooting/SKILL.md +192 -157
  93. package/skills/cometchat-astro-patterns/SKILL.md +22 -1
  94. package/skills/cometchat-calls/SKILL.md +25 -19
  95. package/skills/cometchat-calls/references/use-case-broadcast.md +15 -10
  96. package/skills/cometchat-calls/references/use-case-marketplace.md +2 -3
  97. package/skills/cometchat-calls/references/use-case-support.md +3 -4
  98. package/skills/cometchat-calls/references/use-case-team.md +23 -12
  99. package/skills/cometchat-calls/references/use-case-telehealth.md +3 -4
  100. package/skills/cometchat-components/SKILL.md +163 -25
  101. package/skills/cometchat-core/SKILL.md +412 -13
  102. package/skills/cometchat-customization/SKILL.md +50 -25
  103. package/skills/cometchat-features/SKILL.md +313 -34
  104. package/skills/cometchat-flutter-v5/SKILL.md +10 -4
  105. package/skills/cometchat-flutter-v5-calls/SKILL.md +188 -158
  106. package/skills/cometchat-flutter-v5-calls/references/add-calls-to-existing-chat.md +48 -24
  107. package/skills/cometchat-flutter-v5-calls/references/call-layouts.md +20 -15
  108. package/skills/cometchat-flutter-v5-calls/references/call-session.md +100 -145
  109. package/skills/cometchat-flutter-v5-calls/references/device-management.md +12 -8
  110. package/skills/cometchat-flutter-v5-calls/references/group-calls.md +30 -36
  111. package/skills/cometchat-flutter-v5-calls/references/idle-timeout.md +15 -13
  112. package/skills/cometchat-flutter-v5-calls/references/in-call-chat.md +12 -9
  113. package/skills/cometchat-flutter-v5-calls/references/migration-v4-to-v5.md +115 -65
  114. package/skills/cometchat-flutter-v5-calls/references/raise-hand.md +41 -30
  115. package/skills/cometchat-flutter-v5-calls/references/ringing-integration.md +17 -14
  116. package/skills/cometchat-flutter-v5-calls/references/share-invite.md +8 -2
  117. package/skills/cometchat-flutter-v5-conversations/SKILL.md +2 -1
  118. package/skills/cometchat-flutter-v5-core/SKILL.md +20 -2
  119. package/skills/cometchat-flutter-v5-customization/SKILL.md +136 -5
  120. package/skills/cometchat-flutter-v5-events/SKILL.md +2 -1
  121. package/skills/cometchat-flutter-v5-messages/SKILL.md +2 -1
  122. package/skills/cometchat-flutter-v5-production/SKILL.md +15 -6
  123. package/skills/cometchat-flutter-v5-push/SKILL.md +2 -1
  124. package/skills/cometchat-flutter-v5-testing/SKILL.md +17 -6
  125. package/skills/cometchat-flutter-v5-theming/SKILL.md +2 -1
  126. package/skills/cometchat-flutter-v5-troubleshooting/SKILL.md +7 -6
  127. package/skills/cometchat-flutter-v5-users-groups/SKILL.md +3 -2
  128. package/skills/cometchat-flutter-v6/SKILL.md +17 -16
  129. package/skills/cometchat-flutter-v6-calls/SKILL.md +78 -63
  130. package/skills/cometchat-flutter-v6-calls/references/add-calls-to-existing-chat.md +8 -6
  131. package/skills/cometchat-flutter-v6-calls/references/advanced-features.md +89 -0
  132. package/skills/cometchat-flutter-v6-calls/references/call-layouts.md +15 -12
  133. package/skills/cometchat-flutter-v6-calls/references/call-session.md +2 -2
  134. package/skills/cometchat-flutter-v6-calls/references/device-management.md +9 -3
  135. package/skills/cometchat-flutter-v6-calls/references/group-calls.md +10 -10
  136. package/skills/cometchat-flutter-v6-calls/references/idle-timeout.md +15 -7
  137. package/skills/cometchat-flutter-v6-calls/references/in-call-chat.md +6 -3
  138. package/skills/cometchat-flutter-v6-calls/references/raise-hand.md +23 -16
  139. package/skills/cometchat-flutter-v6-components/SKILL.md +32 -11
  140. package/skills/cometchat-flutter-v6-conversations/SKILL.md +39 -11
  141. package/skills/cometchat-flutter-v6-core/SKILL.md +348 -10
  142. package/skills/cometchat-flutter-v6-customization/SKILL.md +97 -25
  143. package/skills/cometchat-flutter-v6-events/SKILL.md +3 -2
  144. package/skills/cometchat-flutter-v6-features/SKILL.md +15 -6
  145. package/skills/cometchat-flutter-v6-messages/SKILL.md +111 -60
  146. package/skills/cometchat-flutter-v6-migration/SKILL.md +18 -25
  147. package/skills/cometchat-flutter-v6-placement/SKILL.md +79 -50
  148. package/skills/cometchat-flutter-v6-production/SKILL.md +13 -12
  149. package/skills/cometchat-flutter-v6-push/SKILL.md +43 -21
  150. package/skills/cometchat-flutter-v6-testing/SKILL.md +6 -6
  151. package/skills/cometchat-flutter-v6-theming/SKILL.md +38 -5
  152. package/skills/cometchat-flutter-v6-troubleshooting/SKILL.md +182 -17
  153. package/skills/cometchat-flutter-v6-users-groups/SKILL.md +12 -4
  154. package/skills/cometchat-i18n/SKILL.md +139 -78
  155. package/skills/cometchat-ios/SKILL.md +4 -2
  156. package/skills/cometchat-ios-calls/SKILL.md +225 -95
  157. package/skills/cometchat-ios-calls/references/add-calls-to-existing-chat.md +11 -9
  158. package/skills/cometchat-ios-calls/references/audio-modes-and-controls.md +45 -0
  159. package/skills/cometchat-ios-calls/references/avaudiosession-routing.md +6 -7
  160. package/skills/cometchat-ios-calls/references/call-layouts.md +31 -91
  161. package/skills/cometchat-ios-calls/references/call-session.md +51 -54
  162. package/skills/cometchat-ios-calls/references/callkit-and-pushkit.md +33 -29
  163. package/skills/cometchat-ios-calls/references/custom-ui.md +38 -38
  164. package/skills/cometchat-ios-calls/references/group-calls.md +33 -70
  165. package/skills/cometchat-ios-calls/references/idle-timeout.md +24 -25
  166. package/skills/cometchat-ios-calls/references/in-call-chat.md +19 -23
  167. package/skills/cometchat-ios-calls/references/migration-v4-to-v5.md +128 -70
  168. package/skills/cometchat-ios-calls/references/picture-in-picture.md +20 -20
  169. package/skills/cometchat-ios-calls/references/raise-hand.md +14 -227
  170. package/skills/cometchat-ios-calls/references/recording-screen-share.md +35 -122
  171. package/skills/cometchat-ios-calls/references/ringing-integration.md +17 -16
  172. package/skills/cometchat-ios-calls/references/share-invite.md +8 -12
  173. package/skills/cometchat-ios-calls/references/swiftui-uikit-hosting.md +4 -4
  174. package/skills/cometchat-ios-components/SKILL.md +200 -12
  175. package/skills/cometchat-ios-core/SKILL.md +281 -11
  176. package/skills/cometchat-ios-customization/SKILL.md +276 -110
  177. package/skills/cometchat-ios-features/SKILL.md +64 -36
  178. package/skills/cometchat-ios-placement/SKILL.md +15 -12
  179. package/skills/cometchat-ios-production/SKILL.md +12 -4
  180. package/skills/cometchat-ios-push/SKILL.md +53 -19
  181. package/skills/cometchat-ios-testing/SKILL.md +14 -9
  182. package/skills/cometchat-ios-theming/SKILL.md +39 -3
  183. package/skills/cometchat-ios-troubleshooting/SKILL.md +41 -21
  184. package/skills/cometchat-native-bare-patterns/SKILL.md +56 -18
  185. package/skills/cometchat-native-calls/SKILL.md +89 -19
  186. package/skills/cometchat-native-calls/references/add-calls-to-existing-chat.md +2 -2
  187. package/skills/cometchat-native-calls/references/call-layouts.md +15 -14
  188. package/skills/cometchat-native-calls/references/call-session.md +2 -2
  189. package/skills/cometchat-native-calls/references/custom-ui.md +12 -8
  190. package/skills/cometchat-native-calls/references/device-management.md +53 -30
  191. package/skills/cometchat-native-calls/references/group-calls.md +35 -30
  192. package/skills/cometchat-native-calls/references/idle-timeout.md +6 -6
  193. package/skills/cometchat-native-calls/references/in-call-chat.md +10 -8
  194. package/skills/cometchat-native-calls/references/migration-v4-to-v5.md +2 -2
  195. package/skills/cometchat-native-calls/references/raise-hand.md +15 -13
  196. package/skills/cometchat-native-calls/references/recording-screen-share.md +49 -170
  197. package/skills/cometchat-native-calls/references/share-invite.md +7 -5
  198. package/skills/cometchat-native-calls/references/voip-push-end-to-end.md +4 -2
  199. package/skills/cometchat-native-components/SKILL.md +91 -57
  200. package/skills/cometchat-native-core/SKILL.md +281 -9
  201. package/skills/cometchat-native-customization/SKILL.md +150 -28
  202. package/skills/cometchat-native-expo-patterns/SKILL.md +77 -27
  203. package/skills/cometchat-native-features/SKILL.md +79 -49
  204. package/skills/cometchat-native-placement/SKILL.md +19 -10
  205. package/skills/cometchat-native-production/SKILL.md +9 -3
  206. package/skills/cometchat-native-push/SKILL.md +2 -1
  207. package/skills/cometchat-native-testing/SKILL.md +1 -2
  208. package/skills/cometchat-native-theming/SKILL.md +54 -29
  209. package/skills/cometchat-native-troubleshooting/SKILL.md +71 -3
  210. package/skills/cometchat-nextjs-patterns/SKILL.md +48 -6
  211. package/skills/cometchat-placement/SKILL.md +42 -3
  212. package/skills/cometchat-production/SKILL.md +12 -5
  213. package/skills/cometchat-react-calls/SKILL.md +220 -10
  214. package/skills/cometchat-react-calls/references/add-calls-to-existing-chat.md +4 -3
  215. package/skills/cometchat-react-calls/references/call-layouts.md +5 -6
  216. package/skills/cometchat-react-calls/references/call-session.md +1 -1
  217. package/skills/cometchat-react-calls/references/custom-ui.md +61 -15
  218. package/skills/cometchat-react-calls/references/device-management.md +55 -51
  219. package/skills/cometchat-react-calls/references/group-calls.md +18 -23
  220. package/skills/cometchat-react-calls/references/idle-timeout.md +25 -12
  221. package/skills/cometchat-react-calls/references/in-call-chat.md +7 -7
  222. package/skills/cometchat-react-calls/references/migration-v4-to-v5.md +9 -11
  223. package/skills/cometchat-react-calls/references/raise-hand.md +14 -14
  224. package/skills/cometchat-react-calls/references/recording-screen-share.md +39 -38
  225. package/skills/cometchat-react-calls/references/ringing-integration.md +2 -2
  226. package/skills/cometchat-react-calls/references/share-invite.md +4 -5
  227. package/skills/cometchat-react-calls/references/testing-calls-on-web.md +20 -2
  228. package/skills/cometchat-react-calls/references/virtual-background.md +32 -0
  229. package/skills/cometchat-react-patterns/SKILL.md +57 -4
  230. package/skills/cometchat-react-push/SKILL.md +258 -72
  231. package/skills/cometchat-react-router-patterns/SKILL.md +43 -4
  232. package/skills/cometchat-react-testing/SKILL.md +14 -5
  233. package/skills/cometchat-theming/SKILL.md +181 -18
  234. package/skills/cometchat-troubleshooting/SKILL.md +40 -20
@@ -3,7 +3,6 @@ name: cometchat-native-expo-patterns
3
3
  description: "Integration patterns for Expo managed workflow — app.json config, permissions, gesture handler setup, env vars, Expo Router file-based routing subsection."
4
4
  license: "MIT"
5
5
  compatibility: "Node.js >=18; Expo SDK >=50; @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"
@@ -24,7 +23,7 @@ Teaches Claude how to integrate CometChat into an Expo managed workflow project.
24
23
 
25
24
  **Read `cometchat-native-core` first** (init/login/wrapper chain + anti-patterns), then `cometchat-native-components` (prop reference), then `cometchat-native-placement` (where chat goes).
26
25
 
27
- Ground truth: `docs/ui-kit/react-native/expo-integration.mdx`, `expo-conversation.mdx`, `expo-one-to-one-chat.mdx`, `expo-tab-based-chat.mdx`, and `examples/SampleAppExpo/`.
26
+ Ground truth: `docs/ui-kit/react-native/expo-integration.mdx`, `expo-conversation.mdx`, `expo-one-to-one-chat.mdx`, `expo-tab-based-chat.mdx`, and `examples/SampleAppExpo/`. **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).
28
27
 
29
28
  ---
30
29
 
@@ -81,8 +80,18 @@ npx expo install \
81
80
 
82
81
  # dayjs + punycode — no native code but required by the kit
83
82
  npm install dayjs punycode
83
+
84
+ # Navigation — REQUIRED if you follow cometchat-native-placement's stack pattern
85
+ # (createNativeStackNavigator + NavigationContainer). Not transitive — add them:
86
+ npx expo install \
87
+ @react-navigation/native \
88
+ @react-navigation/native-stack \
89
+ react-native-screens \
90
+ expo-constants
84
91
  ```
85
92
 
93
+ > **`expo-constants` is also imported directly** by Step 3 / Step 4 Option A (`import Constants from "expo-constants"`). It ships transitively with Expo, but importing it directly is a direct-dependency contract — the `expo install` line above lists it explicitly so a fresh install doesn't break.
94
+
86
95
  **Why `npx expo install` for the natively-linked deps?** `expo install` picks versions compatible with the project's Expo SDK. Using `npm install` directly can land incompatible versions that break prebuild.
87
96
 
88
97
  ### Optional — calling SDK
@@ -90,7 +99,10 @@ npm install dayjs punycode
90
99
  If the user's flow includes voice / video calls (the `cometchat-native-features` skill's § Calls gates this):
91
100
 
92
101
  ```bash
93
- npm install @cometchat/calls-sdk-react-native
102
+ npm install @cometchat/calls-sdk-react-native \
103
+ react-native-url-polyfill \
104
+ react-native-performance \
105
+ valibot
94
106
  npx expo install \
95
107
  @react-native-community/netinfo \
96
108
  react-native-background-timer \
@@ -98,6 +110,8 @@ npx expo install \
98
110
  react-native-webrtc
99
111
  ```
100
112
 
113
+ > **`react-native-url-polyfill`, `react-native-performance`, and `valibot` are not in the calls-sdk `peerDependencies` array** — but the calls-sdk's `dist/polyfills/browser.js` imports them at module top, so Metro fails the bundle without them. Omitting any of the three yields `Unable to resolve module …` at startup with no app render. (Validated 2026-05-26 on `@cometchat/calls-sdk-react-native@5.0.0` + Expo SDK 56.)
114
+
101
115
  Skip these until the user actually wants calls. Adding WebRTC to an Expo project bloats the prebuild and requires extra permissions — don't speculatively enable it.
102
116
 
103
117
  ---
@@ -153,8 +167,8 @@ Expo projects use the same four-wrapper chain as bare RN (see `cometchat-native-
153
167
  import "react-native-gesture-handler"; // MUST be the first import
154
168
  import React from "react";
155
169
  import { GestureHandlerRootView } from "react-native-gesture-handler";
156
- import { SafeAreaProvider } from "react-native-safe-area-context";
157
- import { CometChatThemeProvider } from "@cometchat/chat-uikit-react-native";
170
+ import { SafeAreaProvider, SafeAreaView } from "react-native-safe-area-context";
171
+ import { CometChatThemeProvider, CometChatI18nProvider } from "@cometchat/chat-uikit-react-native";
158
172
  import { CometChatProvider } from "./src/providers/CometChatProvider";
159
173
  import { AppNavigator } from "./src/navigation/AppNavigator";
160
174
  import Constants from "expo-constants";
@@ -166,14 +180,18 @@ export default function App() {
166
180
  <GestureHandlerRootView style={{ flex: 1 }}>
167
181
  <SafeAreaProvider>
168
182
  <CometChatThemeProvider>
169
- <CometChatProvider
170
- appId={extra.COMETCHAT_APP_ID}
171
- region={extra.COMETCHAT_REGION}
172
- authKey={extra.COMETCHAT_AUTH_KEY}
173
- uid="cometchat-uid-1" // dev mode only
174
- >
175
- <AppNavigator />
176
- </CometChatProvider>
183
+ <CometChatI18nProvider>
184
+ <CometChatProvider
185
+ appId={extra.COMETCHAT_APP_ID}
186
+ region={extra.COMETCHAT_REGION}
187
+ authKey={extra.COMETCHAT_AUTH_KEY}
188
+ uid="cometchat-uid-1" // dev mode only
189
+ >
190
+ <SafeAreaView edges={["top", "bottom"]} style={{ flex: 1 }}>
191
+ <AppNavigator />
192
+ </SafeAreaView>
193
+ </CometChatProvider>
194
+ </CometChatI18nProvider>
177
195
  </CometChatThemeProvider>
178
196
  </SafeAreaProvider>
179
197
  </GestureHandlerRootView>
@@ -181,7 +199,7 @@ export default function App() {
181
199
  }
182
200
  ```
183
201
 
184
- The `CometChatProvider` itself is defined per `cometchat-native-core` § 6 — reuse that implementation; don't invent another one.
202
+ The provider chain matches the kit sample app (`examples/SampleApp/App.tsx`): `CometChatI18nProvider` sits inside `CometChatThemeProvider`, and a root `SafeAreaView edges={["top", "bottom"]}` wraps the navigator. The `CometChatProvider` itself is defined per `cometchat-native-core` § 6 — reuse that implementation; don't invent another one.
185
203
 
186
204
  ### `import "react-native-gesture-handler"` must be first
187
205
 
@@ -275,8 +293,8 @@ In Expo Router, the `app/_layout.tsx` file is the root layout — wrap the provi
275
293
  // app/_layout.tsx
276
294
  import "react-native-gesture-handler";
277
295
  import { GestureHandlerRootView } from "react-native-gesture-handler";
278
- import { SafeAreaProvider } from "react-native-safe-area-context";
279
- import { CometChatThemeProvider } from "@cometchat/chat-uikit-react-native";
296
+ import { SafeAreaProvider, SafeAreaView } from "react-native-safe-area-context";
297
+ import { CometChatThemeProvider, CometChatI18nProvider } from "@cometchat/chat-uikit-react-native";
280
298
  import { CometChatProvider } from "../src/providers/CometChatProvider";
281
299
  import { Slot } from "expo-router";
282
300
  import Constants from "expo-constants";
@@ -288,14 +306,18 @@ export default function RootLayout() {
288
306
  <GestureHandlerRootView style={{ flex: 1 }}>
289
307
  <SafeAreaProvider>
290
308
  <CometChatThemeProvider>
291
- <CometChatProvider
292
- appId={extra.COMETCHAT_APP_ID}
293
- region={extra.COMETCHAT_REGION}
294
- authKey={extra.COMETCHAT_AUTH_KEY}
295
- uid="cometchat-uid-1"
296
- >
297
- <Slot /> {/* Expo Router renders child routes here */}
298
- </CometChatProvider>
309
+ <CometChatI18nProvider>
310
+ <CometChatProvider
311
+ appId={extra.COMETCHAT_APP_ID}
312
+ region={extra.COMETCHAT_REGION}
313
+ authKey={extra.COMETCHAT_AUTH_KEY}
314
+ uid="cometchat-uid-1"
315
+ >
316
+ <SafeAreaView edges={["top", "bottom"]} style={{ flex: 1 }}>
317
+ <Slot /> {/* Expo Router renders child routes here */}
318
+ </SafeAreaView>
319
+ </CometChatProvider>
320
+ </CometChatI18nProvider>
299
321
  </CometChatThemeProvider>
300
322
  </SafeAreaProvider>
301
323
  </GestureHandlerRootView>
@@ -339,7 +361,7 @@ export default function Home() {
339
361
  // app/messages/[uid].tsx
340
362
  import { useLocalSearchParams, router } from "expo-router";
341
363
  import { useEffect, useState } from "react";
342
- import { View } from "react-native";
364
+ import { Platform, View } from "react-native";
343
365
  import { CometChat } from "@cometchat/chat-sdk-react-native";
344
366
  import {
345
367
  CometChatMessageHeader,
@@ -363,7 +385,10 @@ export default function ChatScreen() {
363
385
  <View style={{ flex: 1 }}>
364
386
  <CometChatMessageHeader user={user} onBack={() => router.back()} showBackButton />
365
387
  <CometChatMessageList user={user} hideReplyInThreadOption />
366
- <CometChatMessageComposer user={user} />
388
+ <CometChatMessageComposer
389
+ user={user}
390
+ keyboardAvoidingViewProps={Platform.OS === "android" ? {} : { behavior: "padding" }}
391
+ />
367
392
  </View>
368
393
  );
369
394
  }
@@ -443,7 +468,17 @@ Subsequent runs use `npx expo start` with the dev client — no rebuild needed u
443
468
  ## Step 7 — Verify integration
444
469
 
445
470
  ```bash
446
- npx tsc --noEmit # TypeScript check
471
+ # ⚠️ Plain `npx tsc --noEmit` will report DOZENS of errors that are NOT yours.
472
+ # The kit (@cometchat/chat-uikit-react-native) ships raw uncompiled .tsx and
473
+ # points "types" at src/index, so tsc compiles the kit's own source into your
474
+ # program. `skipLibCheck` (only skips .d.ts) and `exclude: [node_modules]`
475
+ # (imported files are still checked) do NOT silence it. Verified on a clean
476
+ # Expo SDK 56 + kit 5.3.7 + chat-sdk 4.0.24 install: 32 kit-internal errors.
477
+ #
478
+ # PASS CRITERION = zero errors OUTSIDE node_modules. Filter the kit noise:
479
+ npx tsc --noEmit 2>&1 | grep -v node_modules | grep 'error TS'
480
+ # ^ EMPTY output = your integration type-checks clean (PASS).
481
+ # Any line here = a real error in YOUR code — fix it.
447
482
  ```
448
483
 
449
484
  Then in the running app:
@@ -500,3 +535,18 @@ Push notifications need additional setup (APNs + FCM + maybe `expo-notifications
500
535
  | `cometchat-native-customization` | Text formatters, events, custom views |
501
536
  | `cometchat-native-production` | Server-side auth tokens + user management |
502
537
  | `cometchat-native-troubleshooting` | Prebuild failures, Expo Go errors, keyboard issues, blank chat |
538
+
539
+ ## Visual Builder integration (v4.3)
540
+
541
+ If the customer picks **Visually** in dispatcher Step 3.1, the Expo recipe diverges from the standard provider chain. Skills runs `cometchat builder export --platform react-native --json` to emit `src/config/{store.ts, config.json}` (the Zustand-backed config store + 7-field envelope JSON), then patches `App.tsx` with `useConfig` + theme derivation.
542
+
543
+ **Full recipe lives in `cometchat-native-core` §"Visual Builder integration".** Expo-specific notes:
544
+
545
+ - Use `npx expo install` for the deps (not raw `npm install`) — Expo SDK pins compatible versions.
546
+ - Env via `process.env.EXPO_PUBLIC_COMETCHAT_*` (no extra Babel plugin needed; Expo handles this).
547
+ - Required additional deps beyond the standard provider set: `zustand`, `@react-native-async-storage/async-storage`.
548
+ - `useConfig(s => s.settings.style)` — note the selector takes `AppConfig` directly, NOT `s.config.settings.style` (the `.config.` wrapper is internal to the Zustand store — Finding F6, 2026-05-21).
549
+ - Envelope is `settings: { chatFeatures, callFeatures, layout, style, noCode }` — theme tokens live under `settings.style` (there's no `settings.theme`/`settings.agent`); the engagement feature group is `chatFeatures.deeperUserEngagement` (not `deeperEngagement`). See core §"Feature flag access".
550
+ - A2 smoke validated: Metro bundles 10.8 MB iOS export clean on Expo SDK 54.
551
+
552
+ If the customer picks **In code**, ignore this section — the standard four-wrapper chain + provider pattern from §"Provider chain" applies.
@@ -3,7 +3,6 @@ name: cometchat-native-features
3
3
  description: "Feature catalog for React Native — calls (separate SDK + WebRTC), extensions (polls / stickers / translation / link preview / collaborative doc / whiteboard / smart replies), AI agent, in-call chat. When to toggle, install, or swap."
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"
@@ -22,7 +21,7 @@ Ground truth: `docs/ui-kit/react-native/core-features.mdx`, `calling-integration
22
21
 
23
22
  ## 1. Feature taxonomy
24
23
 
25
- Every CometChat feature falls into exactly one of four categories. The category determines the recipe:
24
+ Every CometChat feature falls into exactly one of these five **mechanism** categories — these tell you *how* to wire each feature (the actionable RN view). They map onto the product's canonical **5-tier "work-needed" model** (Core Zero-Setup → Builder-Enabled → Config-Only → Config+Settings → SDK-Integrated; see `cometchat-features` §3 + `packages/registry/v6/features/catalog.json`; canonical public matrix → [Features & Extensions Guide](https://www.cometchat.com/docs/fundamentals/features-and-extensions-guide), which outranks this snapshot on conflict): Default ≈ Core; Extension/AI ≈ Config-Only / Config+Settings; Package-install + Component-swap ≈ SDK-Integrated. The category determines the recipe:
26
25
 
27
26
  | Category | What it means | Example features | How to enable |
28
27
  |---|---|---|---|
@@ -207,63 +206,92 @@ android {
207
206
  }
208
207
  ```
209
208
 
210
- ### 3d — Register the call listener at app root
209
+ ### 3d — Register the call listeners at app root (incoming + outgoing + ongoing)
211
210
 
212
- The incoming-call UI only shows up if you've registered a listener to pick up call events. Add this once at the app root (typically in `App.tsx` or Expo Router's `_layout.tsx`):
211
+ All three call surfaces — `<CometChatIncomingCall>`, `<CometChatOutgoingCall>`, `<CometChatOngoingCall>` — are parent-controlled. None auto-mount the others. The parent must register **both** `CometChat.addCallListener` (SDK socket; surfaces incoming calls from the network) **and** `CometChatUIEventHandler.addCallListener` (UI event bus; surfaces outgoing calls fired by `<CometChatCallButtons>` / `<CometChatMessageHeader>`). Add this once at the app root (typically in `App.tsx` or Expo Router's `_layout.tsx`). Validated 2026-05-26 against `@cometchat/chat-uikit-react-native@5.3.5` end-to-end on Pixel 3 ([[project_v4_3_f75_rn_call_ui_missing]]).
213
212
 
214
213
  ```tsx
215
- import React, { useEffect, useRef, useState } from "react";
214
+ import React, { useEffect, useState } from "react";
215
+ import { StyleSheet, View } from "react-native";
216
216
  import { CometChat } from "@cometchat/chat-sdk-react-native";
217
- import { CometChatIncomingCall } from "@cometchat/chat-uikit-react-native";
217
+ import { CometChatCalls } from "@cometchat/calls-sdk-react-native";
218
+ import {
219
+ CometChatIncomingCall,
220
+ CometChatOutgoingCall,
221
+ CometChatOngoingCall,
222
+ CometChatUIEventHandler,
223
+ } from "@cometchat/chat-uikit-react-native";
224
+
225
+ const CALL_LISTENER_ID = "APP_CALL_LISTENER";
218
226
 
219
227
  function CallEventsProvider({ children }: { children: React.ReactNode }) {
220
- const [callReceived, setCallReceived] = useState(false);
221
- const incomingCall = useRef<CometChat.Call | null>(null);
222
- const LISTENER_ID = "APP_CALL_LISTENER";
228
+ const [incomingCall, setIncomingCall] = useState<CometChat.Call | null>(null);
229
+ const [outgoingCall, setOutgoingCall] = useState<CometChat.Call | null>(null);
230
+ const [ongoingCall, setOngoingCall] = useState<CometChat.Call | null>(null);
223
231
 
224
232
  useEffect(() => {
233
+ // SDK socket — incoming side
225
234
  CometChat.addCallListener(
226
- LISTENER_ID,
235
+ CALL_LISTENER_ID,
227
236
  new CometChat.CallListener({
228
- onIncomingCallReceived: (call) => {
229
- incomingCall.current = call;
230
- setCallReceived(true);
231
- },
232
- onOutgoingCallAccepted: (call) => {
233
- // navigate to the ongoing-call screen
234
- },
235
- onOutgoingCallRejected: () => {
236
- incomingCall.current = null;
237
- setCallReceived(false);
238
- },
239
- onIncomingCallCancelled: () => {
240
- incomingCall.current = null;
241
- setCallReceived(false);
242
- },
243
- onCallEndedMessageReceived: () => {
244
- incomingCall.current = null;
245
- setCallReceived(false);
246
- },
237
+ onIncomingCallReceived: (call: CometChat.Call) => setIncomingCall(call),
238
+ onIncomingCallCancelled: () => setIncomingCall(null),
239
+ onOutgoingCallAccepted: () => {}, // kit owns the transition
240
+ onOutgoingCallRejected: () => setOutgoingCall(null),
247
241
  })
248
242
  );
249
- return () => CometChat.removeCallListener(LISTENER_ID);
243
+ // UI event bus — outgoing side (fired by CallButtons / MessageHeader)
244
+ CometChatUIEventHandler.addCallListener(CALL_LISTENER_ID, {
245
+ ccOutgoingCall: ({ call }) => setOutgoingCall(call),
246
+ ccCallEnded: () => {
247
+ setOutgoingCall(null);
248
+ setIncomingCall(null);
249
+ setOngoingCall(null);
250
+ },
251
+ ccShowOngoingCall: ({ call }) => setOngoingCall(call),
252
+ });
253
+ return () => {
254
+ CometChat.removeCallListener(CALL_LISTENER_ID);
255
+ CometChatUIEventHandler.removeCallListener(CALL_LISTENER_ID);
256
+ };
250
257
  }, []);
251
258
 
252
259
  return (
253
260
  <>
254
261
  {children}
255
- {callReceived && incomingCall.current && (
256
- <CometChatIncomingCall
257
- call={incomingCall.current}
258
- onAccept={() => { /* navigate to ongoing-call screen */ }}
259
- onDecline={() => setCallReceived(false)}
260
- />
262
+ {incomingCall && (
263
+ <View style={StyleSheet.absoluteFill}>
264
+ <CometChatIncomingCall
265
+ call={incomingCall}
266
+ onDecline={() => setIncomingCall(null)}
267
+ onError={() => setIncomingCall(null)}
268
+ />
269
+ </View>
270
+ )}
271
+ {outgoingCall && (
272
+ <View style={StyleSheet.absoluteFill}>
273
+ <CometChatOutgoingCall call={outgoingCall} />
274
+ </View>
275
+ )}
276
+ {ongoingCall && (
277
+ <View style={StyleSheet.absoluteFill}>
278
+ {/* CometChatOngoingCallInterface = { sessionID (required), callSettingsBuilder (required), onError? } — there is NO `call` prop (verified vs uikit-react-native-v5 CometChatOngoingCall.tsx) */}
279
+ <CometChatOngoingCall
280
+ sessionID={ongoingCall.getSessionId()}
281
+ callSettingsBuilder={new CometChatCalls.CallSettingsBuilder().setIsAudioOnlyCall(ongoingCall.getType() === "audio")}
282
+ onError={() => setOngoingCall(null)}
283
+ />
284
+ </View>
261
285
  )}
262
286
  </>
263
287
  );
264
288
  }
265
289
  ```
266
290
 
291
+ > **DO NOT pass `onAccept` to `<CometChatIncomingCall>`** — short-circuits the kit's internal `acceptCall` + OngoingCall transition. The kit fires `ccShowOngoingCall` after `acceptCall` resolves; the listener above wires that into `setOngoingCall`, which mounts `<CometChatOngoingCall>`. Handle only `onDecline` + `onError` here. See `cometchat-native-calls` §1.8.c.
292
+
293
+ > **DO NOT skip `CometChatUIEventHandler.addCallListener`.** Without it, tapping video/voice on `<CometChatMessageHeader>` fires WebRTC + camera at the native layer but no overlay UI ever mounts — the user sees nothing change after the tap. This was [[project_v4_3_f75_rn_call_ui_missing]] (F75).
294
+
267
295
  Wrap the app (inside the existing provider chain, below `CometChatProvider`):
268
296
 
269
297
  ```tsx
@@ -283,13 +311,12 @@ Once the calls SDK is installed, `CometChatMessageHeader` auto-renders voice + v
283
311
  user={selectedUser}
284
312
  hideVoiceCallButton={false}
285
313
  hideVideoCallButton={false}
286
- AuxiliaryButtonView={(user, group) => (
287
- <CometChatCallButtons
288
- user={user}
289
- group={group}
290
- onVoiceCallPress={(session) => navigation.navigate("OngoingCall", { session })}
291
- onVideoCallPress={(session) => navigation.navigate("OngoingCall", { session })}
292
- />
314
+ AuxiliaryButtonView={({ user, group }) => (
315
+ // Slot views receive ONE destructured object ({ user, group }) — NOT positional args.
316
+ // CometChatCallButtons has NO onVoiceCallPress/onVideoCallPress — it initiates the call
317
+ // itself and emits ccOutgoingCall / ccShowOngoingCall on the UI event bus. Mount the
318
+ // in-call surface from those listeners (§3d), not from a press callback.
319
+ <CometChatCallButtons user={user} group={group} />
293
320
  )}
294
321
  />
295
322
  ```
@@ -307,9 +334,12 @@ export function OngoingCallScreen({ route, navigation }: any) {
307
334
  return (
308
335
  <CometChatOngoingCall
309
336
  sessionID={session.sessionId}
310
- callType={session.type} // "audio" | "video"
311
- onCallEnded={() => navigation.goBack()}
337
+ // REQUIRED: a CometChatCalls.CallSettingsBuilder instance (the kit calls .build() on it).
338
+ callSettingsBuilder={new CometChatCalls.CallSettingsBuilder().setIsAudioOnlyCall(session.type === "audio")}
339
+ onError={() => navigation.goBack()}
312
340
  />
341
+ // There is no `callType`/`onCallEnded` prop. End-of-call navigation is driven by the
342
+ // ccCallEnded listener (§3d) resetting the parent's state.
313
343
  );
314
344
  }
315
345
  ```
@@ -365,9 +395,9 @@ During an active call, users can chat without leaving the call UI. This is a tog
365
395
  ```tsx
366
396
  <CometChatOngoingCall
367
397
  sessionID={session.sessionId}
368
- callType={session.type}
369
- callSettingsBuilder={/* ... with enableInCallChat(true) */}
370
- onCallEnded={() => navigation.goBack()}
398
+ // REQUIRED — a CometChatCalls.CallSettingsBuilder (enable in-call chat via its setter).
399
+ callSettingsBuilder={callSettingsBuilder}
400
+ onError={() => navigation.goBack()}
371
401
  />
372
402
  ```
373
403
 
@@ -565,7 +595,7 @@ When a user asks for a feature, use this flow:
565
595
  2. **Is it voice / video / call history?** → Calls (§ 3). Package install.
566
596
  3. **Is it polls, stickers, message translation, link preview, collaborative doc / whiteboard, thumbnails?** → Extension (§ 2). Run `cometchat apply-feature <id>`.
567
597
  3a. **Is it smart replies, conversation summary, or conversation starter?** → AI feature (§ 2). Run `cometchat apply-feature <id> --openai-key sk-...`.
568
- 3b. **Is it Giphy / Stipop / Tenor / Chatwoot / Intercom / Disappearing Messages / Message Shortcuts?** → Dashboard-only (§ 2). User must enter third-party config in https://app.cometchat.com → Extensions.
598
+ 3b. **Is it Giphy / Stipop / Tenor / Chatwoot / Intercom / Disappearing Messages / Message Shortcuts?** → Dashboard-only (§ 2). User must enter third-party config in https://app.cometchat.com → Chat & Messaging → Features.
569
599
  4. **Is it AI agent?** → § 5.
570
600
  5. **Is it custom text formatting, custom message templates, custom slot views, custom theme?** → This is **customization**, not a feature. Route to `cometchat-native-customization` or `cometchat-native-theming`.
571
601
  6. **Not on this list?** → Check `docs/ui-kit/react-native/guide-overview.mdx` + the kit's `src/index.ts` exports. If still nothing, tell the user the feature isn't in the UI Kit; they may need to build it with the SDK directly.
@@ -3,7 +3,6 @@ name: cometchat-native-placement
3
3
  description: "Where to put chat in a React Native app — Stack screen, BottomTab, Modal, BottomSheet, Embedded. Maps each to CometChat component composition with ASCII layout references."
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"
@@ -19,7 +18,7 @@ Teaches Claude the five canonical placement patterns for putting chat inside a R
19
18
  3. Platform gotchas (safe-area, keyboard avoiding, gesture handling)
20
19
  4. When to choose this placement over the alternatives
21
20
 
22
- Ground truth: `docs/ui-kit/react-native/react-native-conversation.mdx`, `react-native-one-to-one-chat.mdx`, `react-native-tab-based-chat.mdx`, their `expo-*.mdx` equivalents, and the `examples/SampleApp/` + `examples/SampleAppExpo/` sample apps.
21
+ Ground truth: `docs/ui-kit/react-native/react-native-conversation.mdx`, `react-native-one-to-one-chat.mdx`, `react-native-tab-based-chat.mdx`, their `expo-*.mdx` equivalents, and the `examples/SampleApp/` + `examples/SampleAppExpo/` sample apps. **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).
23
22
 
24
23
  **Read `cometchat-native-core` and `cometchat-native-components` before this skill** — the provider wrapper chain and component catalog are prerequisites.
25
24
 
@@ -155,7 +154,7 @@ export function ConversationsScreen({ navigation }: { navigation: NativeStackNav
155
154
 
156
155
  ```tsx
157
156
  // MessagesScreen.tsx
158
- import { View } from "react-native";
157
+ import { Platform, View } from "react-native";
159
158
  import {
160
159
  CometChatMessageHeader,
161
160
  CometChatMessageList,
@@ -168,7 +167,11 @@ export function MessagesScreen({ route, navigation }: any) {
168
167
  <View style={{ flex: 1 }}>
169
168
  <CometChatMessageHeader user={user} group={group} onBack={() => navigation.goBack()} showBackButton />
170
169
  <CometChatMessageList user={user} group={group} hideReplyInThreadOption />
171
- <CometChatMessageComposer user={user} group={group} />
170
+ <CometChatMessageComposer
171
+ user={user}
172
+ group={group}
173
+ keyboardAvoidingViewProps={Platform.OS === "android" ? {} : { behavior: "padding" }}
174
+ />
172
175
  </View>
173
176
  );
174
177
  }
@@ -176,13 +179,19 @@ export function MessagesScreen({ route, navigation }: any) {
176
179
 
177
180
  ```tsx
178
181
  // AppNavigator.tsx
182
+ import { NavigationContainer } from "@react-navigation/native";
179
183
  import { createNativeStackNavigator } from "@react-navigation/native-stack";
180
184
  const Stack = createNativeStackNavigator();
181
185
 
182
- <Stack.Navigator screenOptions={{ headerShown: false }}>
183
- <Stack.Screen name="Conversations" component={ConversationsScreen} />
184
- <Stack.Screen name="Messages" component={MessagesScreen} />
185
- </Stack.Navigator>
186
+ // The <Stack.Navigator> MUST be wrapped in <NavigationContainer> (react-navigation
187
+ // throws "Couldn't find a navigation object" at runtime without it). One container
188
+ // per app, at the root.
189
+ <NavigationContainer>
190
+ <Stack.Navigator screenOptions={{ headerShown: false }}>
191
+ <Stack.Screen name="Conversations" component={ConversationsScreen} />
192
+ <Stack.Screen name="Messages" component={MessagesScreen} />
193
+ </Stack.Navigator>
194
+ </NavigationContainer>
186
195
  ```
187
196
 
188
197
  ### Pattern B — Single thread (no conversation list)
@@ -220,7 +229,7 @@ export function SupportChatScreen() {
220
229
 
221
230
  - The screen is wrapped in a `<View style={{ flex: 1 }}>` so the composer sits at the bottom and the list fills the middle.
222
231
  - `CometChatMessageHeader`'s `onBack` should call `navigation.goBack()`. Set `showBackButton` explicitly so the header knows to render it.
223
- - **Keyboard avoiding**: when the composer is visible, RN needs `KeyboardAvoidingView` on iOS or `android:windowSoftInputMode="adjustResize"` on Android. The framework patterns (`cometchat-native-expo-patterns`, `cometchat-native-bare-patterns`) cover the platform-specific wiring.
232
+ - **Keyboard avoiding**: do **not** wrap Header/List/Composer in an external `KeyboardAvoidingView`. The kit composer owns keyboard avoidance via its own `keyboardAvoidingViewProps` pass `keyboardAvoidingViewProps={Platform.OS === 'android' ? {} : { behavior: 'padding' }}` on `<CometChatMessageComposer>` (this is what the kit sample app does). Android relies on the standard `android:windowSoftInputMode="adjustResize"` in the manifest, not the prop.
224
233
 
225
234
  ---
226
235
 
@@ -452,7 +461,7 @@ export function ProductDetailScreen({ product }: any) {
452
461
 
453
462
  - **Fixed height required.** CometChat components fill 100% of their parent. If you put them inside a `ScrollView` without a bounded height, the list collapses to zero height. Wrap in a `<View style={{ height: NNN }}>` or flex container with an explicit height.
454
463
  - **Scroll conflict.** If the parent is a `ScrollView`, the message list's internal scroll competes with the parent's scroll. Consider the single-thread-as-stack-screen pattern instead if the chat is a primary UX.
455
- - **Composer focus.** When the user taps the composer, the keyboard rises and can push the embedded chat off-screen on iOS. `keyboardShouldPersistTaps="handled"` on the parent ScrollView + `KeyboardAvoidingView` at the root help.
464
+ - **Composer focus.** When the user taps the composer, the keyboard rises and can push the embedded chat off-screen on iOS. Set `keyboardShouldPersistTaps="handled"` on the parent ScrollView, and let the kit composer handle avoidance via `keyboardAvoidingViewProps={Platform.OS === 'android' ? {} : { behavior: 'padding' }}` don't add your own root `KeyboardAvoidingView`.
456
465
 
457
466
  Usually the embedded pattern is the wrong default — prefer a Modal or BottomSheet trigger from a button on the screen, which gives users a dedicated surface for chatting.
458
467
 
@@ -3,7 +3,6 @@ name: cometchat-native-production
3
3
  description: "Production-readiness for React Native — server-minted auth tokens, user management CRUD, external-backend recipes (Express / Hono / Firebase Functions / Vercel Serverless). RN has no API routes, so the backend is always external."
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"
@@ -23,7 +22,7 @@ Teaches Claude how to move a React Native CometChat integration from dev-mode Au
23
22
 
24
23
  **Read `cometchat-native-core` first** (init/login/wrapper chain) before this skill — production just swaps one prop on the provider, but understanding the provider lifecycle is the prerequisite.
25
24
 
26
- Ground truth: `docs/ui-kit/react-native/methods.mdx`, and the cross-platform REST API at `https://{APP_ID}.api-{REGION}.cometchat.io/v3/`.
25
+ Ground truth: `docs/ui-kit/react-native/methods.mdx`, and the cross-platform REST API at `https://{APP_ID}.api-{REGION}.cometchat.io/v3/`. **Official docs:** https://www.cometchat.com/docs/fundamentals/user-auth · **Docs MCP:** `claude mcp add --transport http cometchat-docs https://www.cometchat.com/docs/mcp` (or fetch the URL directly without MCP).
27
26
 
28
27
  ---
29
28
 
@@ -253,7 +252,14 @@ let initialized = false;
253
252
  let loginInFlight: Promise<unknown> | null = null;
254
253
 
255
254
  async function ensureLoggedIn(authToken?: string, uid?: string): Promise<void> {
256
- const existing = await CometChatUIKit.getLoggedInUser();
255
+ // getLoggedInUser() THROWS { code: "NOT_FOUND" } when there's no session — it does NOT
256
+ // return null. An uncaught throw here leaves the app stuck on splash (see core §2/§6).
257
+ let existing;
258
+ try {
259
+ existing = await CometChatUIKit.getLoggedInUser();
260
+ } catch (e: any) {
261
+ if (e?.code !== "NOT_FOUND") throw e; // no-session is the expected first-run path
262
+ }
257
263
  if (existing) return;
258
264
  if (loginInFlight) {
259
265
  await loginInFlight;
@@ -3,7 +3,6 @@ name: cometchat-native-push
3
3
  description: "Push notifications for React Native CometChat — APNs + FCM setup, dashboard provider configuration, client registration, token lifecycle, foreground display, background wake, tap-to-deep-link, and the Expo Go / APNs-environment traps that silently break production."
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; @react-native-firebase/messaging ^18"
6
- allowed-tools: "shell, file-read, file-search, file-list"
7
6
  metadata:
8
7
  author: "CometChat"
9
8
  version: "3.0.0"
@@ -112,6 +111,8 @@ The p8 auth key you generated in 3a works for **both** environments. But CometCh
112
111
 
113
112
  This JSON file is what CometChat's dashboard needs.
114
113
 
114
+ > **Coexistence check first (P0-10).** If `detect` reported `coexistence.existing_firebase: true` (a `firebase` / `@react-native-firebase/*` dep, an existing `google-services.json`, or a `GoogleService-Info.plist`), the app already uses Firebase. Reuse that **same** Firebase project + config files — don't add a second `google-services.json`/`initializeApp` or a duplicate `@react-native-firebase/app` plugin entry, which causes "Default FirebaseApp is not initialized" / duplicate-plugin prebuild failures. If a competing push provider (e.g. OneSignal) was listed in `coexistence.competing_sdks`, confirm with the user whether both should register for notifications before wiring CometChat's token registration — two providers fighting over the device token leads to dropped notifications.
115
+
115
116
  ### 4b. Add Android app to Firebase + download google-services.json
116
117
 
117
118
  1. Project Overview → **Add app** → Android
@@ -3,7 +3,6 @@ name: cometchat-native-testing
3
3
  description: "Testing patterns for CometChat React Native — Jest + React Native Testing Library setup, mocking the UI Kit + SDK, testing custom bubbles / headers / composer actions, snapshot pitfalls, E2E with Detox vs Maestro, and CI integration. Covers what to test vs what to skip."
4
4
  license: "MIT"
5
5
  compatibility: "Node.js >=18; React Native >=0.70; @cometchat/chat-uikit-react-native ^5; Jest ^29; @testing-library/react-native ^12"
6
- allowed-tools: "shell, file-read, file-search, file-list"
7
6
  metadata:
8
7
  author: "CometChat"
9
8
  version: "3.0.0"
@@ -21,7 +20,7 @@ Teaches Claude how to write and run tests against a CometChat React Native integ
21
20
  - E2E with Detox (iOS + Android native drivers) vs Maestro (declarative YAML)
22
21
  - Which tests catch real regressions vs which are flaky churn
23
22
 
24
- Ground truth: `@cometchat/chat-uikit-react-native@5.3.3`'s example jest config (`examples/SampleAppWithPushNotifications/jest.config.js`) and the standard RN testing toolkit docs (callstack.github.io/react-native-testing-library, wix.github.io/Detox, maestro.mobile.dev).
23
+ Ground truth: `@cometchat/chat-uikit-react-native@5.3.3`'s example jest config (`examples/SampleAppWithPushNotifications/jest.config.js`) and the standard RN testing toolkit docs (callstack.github.io/react-native-testing-library, wix.github.io/Detox, maestro.mobile.dev). **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).
25
24
 
26
25
  ---
27
26