@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.
- package/LICENSE +21 -0
- package/README.md +33 -12
- package/bin/install.js +59 -4
- package/package.json +14 -1
- package/skills/cometchat/SKILL.md +460 -77
- package/skills/cometchat/references/asking-questions.md +48 -0
- package/skills/cometchat-a11y/SKILL.md +3 -2
- package/skills/cometchat-android-v5/SKILL.md +2 -1
- package/skills/cometchat-android-v5-calls/SKILL.md +36 -22
- package/skills/cometchat-android-v5-calls/references/README.md +1 -1
- package/skills/cometchat-android-v5-calls/references/add-calls-to-existing-chat.md +7 -5
- package/skills/cometchat-android-v5-calls/references/audio-controls.md +4 -4
- package/skills/cometchat-android-v5-calls/references/call-layouts.md +33 -25
- package/skills/cometchat-android-v5-calls/references/call-session.md +2 -2
- package/skills/cometchat-android-v5-calls/references/custom-ui.md +5 -5
- package/skills/cometchat-android-v5-calls/references/event-listeners.md +2 -2
- package/skills/cometchat-android-v5-calls/references/idle-timeout.md +20 -14
- package/skills/cometchat-android-v5-calls/references/in-call-chat.md +1 -1
- package/skills/cometchat-android-v5-calls/references/migration-v4-to-v5.md +43 -27
- package/skills/cometchat-android-v5-calls/references/participant-management.md +3 -3
- package/skills/cometchat-android-v5-calls/references/raise-hand.md +25 -19
- package/skills/cometchat-android-v5-calls/references/recording.md +2 -2
- package/skills/cometchat-android-v5-calls/references/ringing-integration.md +1 -1
- package/skills/cometchat-android-v5-calls/references/screen-sharing.md +5 -9
- package/skills/cometchat-android-v5-calls/references/session-settings.md +3 -3
- package/skills/cometchat-android-v5-calls/references/setup.md +1 -1
- package/skills/cometchat-android-v5-calls/references/share-invite.md +9 -4
- package/skills/cometchat-android-v5-calls/references/video-controls.md +4 -4
- package/skills/cometchat-android-v5-calls/references/voip-calling.md +2 -2
- package/skills/cometchat-android-v5-components/SKILL.md +4 -3
- package/skills/cometchat-android-v5-core/SKILL.md +20 -2
- package/skills/cometchat-android-v5-customization/SKILL.md +171 -7
- package/skills/cometchat-android-v5-extensions/SKILL.md +7 -4
- package/skills/cometchat-android-v5-features/SKILL.md +5 -4
- package/skills/cometchat-android-v5-placement/SKILL.md +2 -1
- package/skills/cometchat-android-v5-production/SKILL.md +2 -1
- package/skills/cometchat-android-v5-push/SKILL.md +2 -3
- package/skills/cometchat-android-v5-testing/SKILL.md +2 -1
- package/skills/cometchat-android-v5-theming/SKILL.md +2 -1
- package/skills/cometchat-android-v5-troubleshooting/SKILL.md +3 -2
- package/skills/cometchat-android-v6/SKILL.md +2 -1
- package/skills/cometchat-android-v6-builder-settings/SKILL.md +11 -7
- package/skills/cometchat-android-v6-calls/SKILL.md +79 -18
- package/skills/cometchat-android-v6-calls/references/advanced-features.md +87 -0
- package/skills/cometchat-android-v6-calls/references/call-layouts.md +24 -15
- package/skills/cometchat-android-v6-calls/references/call-session.md +2 -2
- package/skills/cometchat-android-v6-calls/references/device-management.md +17 -16
- package/skills/cometchat-android-v6-calls/references/idle-timeout.md +7 -4
- package/skills/cometchat-android-v6-calls/references/in-call-chat.md +13 -8
- package/skills/cometchat-android-v6-calls/references/raise-hand.md +6 -4
- package/skills/cometchat-android-v6-compose-components/SKILL.md +52 -29
- package/skills/cometchat-android-v6-compose-customization/SKILL.md +156 -1
- package/skills/cometchat-android-v6-compose-placement/SKILL.md +129 -40
- package/skills/cometchat-android-v6-compose-theming/SKILL.md +27 -1
- package/skills/cometchat-android-v6-core/SKILL.md +389 -9
- package/skills/cometchat-android-v6-events/SKILL.md +4 -1
- package/skills/cometchat-android-v6-extensions/SKILL.md +2 -1
- package/skills/cometchat-android-v6-features/SKILL.md +26 -2
- package/skills/cometchat-android-v6-kotlin-components/SKILL.md +31 -1
- package/skills/cometchat-android-v6-kotlin-customization/SKILL.md +172 -1
- package/skills/cometchat-android-v6-kotlin-placement/SKILL.md +20 -5
- package/skills/cometchat-android-v6-kotlin-theming/SKILL.md +36 -5
- package/skills/cometchat-android-v6-migration/SKILL.md +44 -42
- package/skills/cometchat-android-v6-production/SKILL.md +6 -3
- package/skills/cometchat-android-v6-push/SKILL.md +43 -2
- package/skills/cometchat-android-v6-testing/SKILL.md +11 -8
- package/skills/cometchat-android-v6-troubleshooting/SKILL.md +26 -5
- package/skills/cometchat-angular-calls/SKILL.md +256 -389
- package/skills/cometchat-angular-calls/references/add-calls-to-existing-chat.md +3 -2
- package/skills/cometchat-angular-calls/references/call-layouts.md +29 -12
- package/skills/cometchat-angular-calls/references/call-session.md +2 -2
- package/skills/cometchat-angular-calls/references/custom-ui.md +18 -10
- package/skills/cometchat-angular-calls/references/device-management.md +53 -34
- package/skills/cometchat-angular-calls/references/group-calls.md +45 -24
- package/skills/cometchat-angular-calls/references/idle-timeout.md +31 -15
- package/skills/cometchat-angular-calls/references/ngzone-and-async-callbacks.md +7 -6
- package/skills/cometchat-angular-calls/references/raise-hand.md +9 -4
- package/skills/cometchat-angular-calls/references/recording-screen-share.md +32 -39
- package/skills/cometchat-angular-calls/references/ringing-integration.md +3 -1
- package/skills/cometchat-angular-calls/references/share-invite.md +11 -5
- package/skills/cometchat-angular-calls/references/virtual-background.md +29 -0
- package/skills/cometchat-angular-components/SKILL.md +149 -620
- package/skills/cometchat-angular-core/SKILL.md +235 -293
- package/skills/cometchat-angular-customization/SKILL.md +415 -223
- package/skills/cometchat-angular-features/SKILL.md +216 -334
- package/skills/cometchat-angular-patterns/SKILL.md +168 -359
- package/skills/cometchat-angular-placement/SKILL.md +189 -560
- package/skills/cometchat-angular-production/SKILL.md +241 -92
- package/skills/cometchat-angular-push/SKILL.md +280 -294
- package/skills/cometchat-angular-testing/SKILL.md +430 -158
- package/skills/cometchat-angular-theming/SKILL.md +190 -265
- package/skills/cometchat-angular-troubleshooting/SKILL.md +192 -157
- package/skills/cometchat-astro-patterns/SKILL.md +22 -1
- package/skills/cometchat-calls/SKILL.md +25 -19
- package/skills/cometchat-calls/references/use-case-broadcast.md +15 -10
- package/skills/cometchat-calls/references/use-case-marketplace.md +2 -3
- package/skills/cometchat-calls/references/use-case-support.md +3 -4
- package/skills/cometchat-calls/references/use-case-team.md +23 -12
- package/skills/cometchat-calls/references/use-case-telehealth.md +3 -4
- package/skills/cometchat-components/SKILL.md +163 -25
- package/skills/cometchat-core/SKILL.md +412 -13
- package/skills/cometchat-customization/SKILL.md +50 -25
- package/skills/cometchat-features/SKILL.md +313 -34
- package/skills/cometchat-flutter-v5/SKILL.md +10 -4
- package/skills/cometchat-flutter-v5-calls/SKILL.md +188 -158
- package/skills/cometchat-flutter-v5-calls/references/add-calls-to-existing-chat.md +48 -24
- package/skills/cometchat-flutter-v5-calls/references/call-layouts.md +20 -15
- package/skills/cometchat-flutter-v5-calls/references/call-session.md +100 -145
- package/skills/cometchat-flutter-v5-calls/references/device-management.md +12 -8
- package/skills/cometchat-flutter-v5-calls/references/group-calls.md +30 -36
- package/skills/cometchat-flutter-v5-calls/references/idle-timeout.md +15 -13
- package/skills/cometchat-flutter-v5-calls/references/in-call-chat.md +12 -9
- package/skills/cometchat-flutter-v5-calls/references/migration-v4-to-v5.md +115 -65
- package/skills/cometchat-flutter-v5-calls/references/raise-hand.md +41 -30
- package/skills/cometchat-flutter-v5-calls/references/ringing-integration.md +17 -14
- package/skills/cometchat-flutter-v5-calls/references/share-invite.md +8 -2
- package/skills/cometchat-flutter-v5-conversations/SKILL.md +2 -1
- package/skills/cometchat-flutter-v5-core/SKILL.md +20 -2
- package/skills/cometchat-flutter-v5-customization/SKILL.md +136 -5
- package/skills/cometchat-flutter-v5-events/SKILL.md +2 -1
- package/skills/cometchat-flutter-v5-messages/SKILL.md +2 -1
- package/skills/cometchat-flutter-v5-production/SKILL.md +15 -6
- package/skills/cometchat-flutter-v5-push/SKILL.md +2 -1
- package/skills/cometchat-flutter-v5-testing/SKILL.md +17 -6
- package/skills/cometchat-flutter-v5-theming/SKILL.md +2 -1
- package/skills/cometchat-flutter-v5-troubleshooting/SKILL.md +7 -6
- package/skills/cometchat-flutter-v5-users-groups/SKILL.md +3 -2
- package/skills/cometchat-flutter-v6/SKILL.md +17 -16
- package/skills/cometchat-flutter-v6-calls/SKILL.md +78 -63
- package/skills/cometchat-flutter-v6-calls/references/add-calls-to-existing-chat.md +8 -6
- package/skills/cometchat-flutter-v6-calls/references/advanced-features.md +89 -0
- package/skills/cometchat-flutter-v6-calls/references/call-layouts.md +15 -12
- package/skills/cometchat-flutter-v6-calls/references/call-session.md +2 -2
- package/skills/cometchat-flutter-v6-calls/references/device-management.md +9 -3
- package/skills/cometchat-flutter-v6-calls/references/group-calls.md +10 -10
- package/skills/cometchat-flutter-v6-calls/references/idle-timeout.md +15 -7
- package/skills/cometchat-flutter-v6-calls/references/in-call-chat.md +6 -3
- package/skills/cometchat-flutter-v6-calls/references/raise-hand.md +23 -16
- package/skills/cometchat-flutter-v6-components/SKILL.md +32 -11
- package/skills/cometchat-flutter-v6-conversations/SKILL.md +39 -11
- package/skills/cometchat-flutter-v6-core/SKILL.md +348 -10
- package/skills/cometchat-flutter-v6-customization/SKILL.md +97 -25
- package/skills/cometchat-flutter-v6-events/SKILL.md +3 -2
- package/skills/cometchat-flutter-v6-features/SKILL.md +15 -6
- package/skills/cometchat-flutter-v6-messages/SKILL.md +111 -60
- package/skills/cometchat-flutter-v6-migration/SKILL.md +18 -25
- package/skills/cometchat-flutter-v6-placement/SKILL.md +79 -50
- package/skills/cometchat-flutter-v6-production/SKILL.md +13 -12
- package/skills/cometchat-flutter-v6-push/SKILL.md +43 -21
- package/skills/cometchat-flutter-v6-testing/SKILL.md +6 -6
- package/skills/cometchat-flutter-v6-theming/SKILL.md +38 -5
- package/skills/cometchat-flutter-v6-troubleshooting/SKILL.md +182 -17
- package/skills/cometchat-flutter-v6-users-groups/SKILL.md +12 -4
- package/skills/cometchat-i18n/SKILL.md +139 -78
- package/skills/cometchat-ios/SKILL.md +4 -2
- package/skills/cometchat-ios-calls/SKILL.md +225 -95
- package/skills/cometchat-ios-calls/references/add-calls-to-existing-chat.md +11 -9
- package/skills/cometchat-ios-calls/references/audio-modes-and-controls.md +45 -0
- package/skills/cometchat-ios-calls/references/avaudiosession-routing.md +6 -7
- package/skills/cometchat-ios-calls/references/call-layouts.md +31 -91
- package/skills/cometchat-ios-calls/references/call-session.md +51 -54
- package/skills/cometchat-ios-calls/references/callkit-and-pushkit.md +33 -29
- package/skills/cometchat-ios-calls/references/custom-ui.md +38 -38
- package/skills/cometchat-ios-calls/references/group-calls.md +33 -70
- package/skills/cometchat-ios-calls/references/idle-timeout.md +24 -25
- package/skills/cometchat-ios-calls/references/in-call-chat.md +19 -23
- package/skills/cometchat-ios-calls/references/migration-v4-to-v5.md +128 -70
- package/skills/cometchat-ios-calls/references/picture-in-picture.md +20 -20
- package/skills/cometchat-ios-calls/references/raise-hand.md +14 -227
- package/skills/cometchat-ios-calls/references/recording-screen-share.md +35 -122
- package/skills/cometchat-ios-calls/references/ringing-integration.md +17 -16
- package/skills/cometchat-ios-calls/references/share-invite.md +8 -12
- package/skills/cometchat-ios-calls/references/swiftui-uikit-hosting.md +4 -4
- package/skills/cometchat-ios-components/SKILL.md +200 -12
- package/skills/cometchat-ios-core/SKILL.md +281 -11
- package/skills/cometchat-ios-customization/SKILL.md +276 -110
- package/skills/cometchat-ios-features/SKILL.md +64 -36
- package/skills/cometchat-ios-placement/SKILL.md +15 -12
- package/skills/cometchat-ios-production/SKILL.md +12 -4
- package/skills/cometchat-ios-push/SKILL.md +53 -19
- package/skills/cometchat-ios-testing/SKILL.md +14 -9
- package/skills/cometchat-ios-theming/SKILL.md +39 -3
- package/skills/cometchat-ios-troubleshooting/SKILL.md +41 -21
- package/skills/cometchat-native-bare-patterns/SKILL.md +56 -18
- package/skills/cometchat-native-calls/SKILL.md +89 -19
- package/skills/cometchat-native-calls/references/add-calls-to-existing-chat.md +2 -2
- package/skills/cometchat-native-calls/references/call-layouts.md +15 -14
- package/skills/cometchat-native-calls/references/call-session.md +2 -2
- package/skills/cometchat-native-calls/references/custom-ui.md +12 -8
- package/skills/cometchat-native-calls/references/device-management.md +53 -30
- package/skills/cometchat-native-calls/references/group-calls.md +35 -30
- package/skills/cometchat-native-calls/references/idle-timeout.md +6 -6
- package/skills/cometchat-native-calls/references/in-call-chat.md +10 -8
- package/skills/cometchat-native-calls/references/migration-v4-to-v5.md +2 -2
- package/skills/cometchat-native-calls/references/raise-hand.md +15 -13
- package/skills/cometchat-native-calls/references/recording-screen-share.md +49 -170
- package/skills/cometchat-native-calls/references/share-invite.md +7 -5
- package/skills/cometchat-native-calls/references/voip-push-end-to-end.md +4 -2
- package/skills/cometchat-native-components/SKILL.md +91 -57
- package/skills/cometchat-native-core/SKILL.md +281 -9
- package/skills/cometchat-native-customization/SKILL.md +150 -28
- package/skills/cometchat-native-expo-patterns/SKILL.md +77 -27
- package/skills/cometchat-native-features/SKILL.md +79 -49
- package/skills/cometchat-native-placement/SKILL.md +19 -10
- package/skills/cometchat-native-production/SKILL.md +9 -3
- package/skills/cometchat-native-push/SKILL.md +2 -1
- package/skills/cometchat-native-testing/SKILL.md +1 -2
- package/skills/cometchat-native-theming/SKILL.md +54 -29
- package/skills/cometchat-native-troubleshooting/SKILL.md +71 -3
- package/skills/cometchat-nextjs-patterns/SKILL.md +48 -6
- package/skills/cometchat-placement/SKILL.md +42 -3
- package/skills/cometchat-production/SKILL.md +12 -5
- package/skills/cometchat-react-calls/SKILL.md +220 -10
- package/skills/cometchat-react-calls/references/add-calls-to-existing-chat.md +4 -3
- package/skills/cometchat-react-calls/references/call-layouts.md +5 -6
- package/skills/cometchat-react-calls/references/call-session.md +1 -1
- package/skills/cometchat-react-calls/references/custom-ui.md +61 -15
- package/skills/cometchat-react-calls/references/device-management.md +55 -51
- package/skills/cometchat-react-calls/references/group-calls.md +18 -23
- package/skills/cometchat-react-calls/references/idle-timeout.md +25 -12
- package/skills/cometchat-react-calls/references/in-call-chat.md +7 -7
- package/skills/cometchat-react-calls/references/migration-v4-to-v5.md +9 -11
- package/skills/cometchat-react-calls/references/raise-hand.md +14 -14
- package/skills/cometchat-react-calls/references/recording-screen-share.md +39 -38
- package/skills/cometchat-react-calls/references/ringing-integration.md +2 -2
- package/skills/cometchat-react-calls/references/share-invite.md +4 -5
- package/skills/cometchat-react-calls/references/testing-calls-on-web.md +20 -2
- package/skills/cometchat-react-calls/references/virtual-background.md +32 -0
- package/skills/cometchat-react-patterns/SKILL.md +57 -4
- package/skills/cometchat-react-push/SKILL.md +258 -72
- package/skills/cometchat-react-router-patterns/SKILL.md +43 -4
- package/skills/cometchat-react-testing/SKILL.md +14 -5
- package/skills/cometchat-theming/SKILL.md +181 -18
- package/skills/cometchat-troubleshooting/SKILL.md +40 -20
|
@@ -3,7 +3,6 @@ name: cometchat-native-theming
|
|
|
3
3
|
description: "CometChatThemeProvider + CometChatI18nProvider — color tokens, typography, dark mode, per-component style overrides, and localization (18 built-in languages + custom translations). The JS theme object replaces CSS variables."
|
|
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"
|
|
@@ -16,7 +15,7 @@ Teaches Claude how to theme and localize the React Native UI Kit via `CometChatT
|
|
|
16
15
|
|
|
17
16
|
**Read `cometchat-native-core` first** (the wrapper chain that includes `CometChatThemeProvider`) before this skill. `cometchat-native-components` § 13 covers per-component `style={}` overrides, which are a sibling concern to theming.
|
|
18
17
|
|
|
19
|
-
Ground truth: `docs/ui-kit/react-native/theme.mdx`, `colors.mdx`, `component-styling.mdx`, `message-bubble-styling.mdx`, and `packages/ChatUiKit/src/theme/type.ts` (the canonical type definitions).
|
|
18
|
+
Ground truth: `docs/ui-kit/react-native/theme.mdx`, `colors.mdx`, `component-styling.mdx`, `message-bubble-styling.mdx`, and `packages/ChatUiKit/src/theme/type.ts` (the canonical type definitions). **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
|
|
|
@@ -308,10 +307,18 @@ The theme has a `typography` block with tokens per role:
|
|
|
308
307
|
theme={{
|
|
309
308
|
light: {
|
|
310
309
|
typography: {
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
310
|
+
fontFamily: "Inter", // flat string — the global family
|
|
311
|
+
// Every role EXCEPT `fontFamily`/`link` is a variant object with
|
|
312
|
+
// `bold` / `medium` / `regular`, each an RN TextStyle:
|
|
313
|
+
heading1: {
|
|
314
|
+
bold: { fontFamily: "Inter-Bold", fontSize: 28, fontWeight: "700" },
|
|
315
|
+
medium: { fontFamily: "Inter-SemiBold", fontSize: 28, fontWeight: "600" },
|
|
316
|
+
regular: { fontFamily: "Inter-Regular", fontSize: 28, fontWeight: "400" },
|
|
317
|
+
},
|
|
318
|
+
body: {
|
|
319
|
+
regular: { fontFamily: "Inter-Regular", fontSize: 15 },
|
|
320
|
+
},
|
|
321
|
+
link: { fontFamily: "Inter-Regular", fontSize: 15 }, // `link` is a flat TextStyle
|
|
315
322
|
// ... etc
|
|
316
323
|
},
|
|
317
324
|
},
|
|
@@ -319,7 +326,7 @@ The theme has a `typography` block with tokens per role:
|
|
|
319
326
|
>
|
|
320
327
|
```
|
|
321
328
|
|
|
322
|
-
Common tokens: `heading1`, `heading2`, `heading3`, `heading4`, `
|
|
329
|
+
Common tokens: `title`, `heading1`, `heading2`, `heading3`, `heading4`, `body`, `caption1`, `caption2`, `button` (there is NO `body1/body2/button1/button2`). Each of these is a **variant object** `{ bold, medium, regular }` where each weight is an RN `TextStyle` (`fontFamily`, `fontSize`, `fontWeight`, `lineHeight`, `letterSpacing`). The two exceptions — `fontFamily` and `link` — are flat (a string and a single `TextStyle` respectively).
|
|
323
330
|
|
|
324
331
|
### Custom font setup
|
|
325
332
|
|
|
@@ -345,18 +352,17 @@ Beyond color / typography, the theme has per-component style blocks for fine con
|
|
|
345
352
|
containerStyle: { backgroundColor: "#FAFAFA" },
|
|
346
353
|
},
|
|
347
354
|
messageHeaderStyles: {
|
|
348
|
-
|
|
355
|
+
titleTextStyle: { fontSize: 18 }, // key is titleTextStyle, NOT titleStyle
|
|
349
356
|
},
|
|
350
357
|
messageListStyles: {
|
|
351
358
|
containerStyle: { padding: 8 },
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
},
|
|
359
|
+
// Bubble styling is NESTED — the keys are `incomingMessageBubbleStyles`
|
|
360
|
+
// and `outgoingMessageBubbleStyles` (each a DeepPartial<BubbleStyles>
|
|
361
|
+
// with `containerStyle`/`textBubbleStyles`/… — there is no flat
|
|
362
|
+
// `sendBubbleStyle`/`receiveBubbleStyle` with backgroundColor+textStyle).
|
|
363
|
+
// For simple bubble color changes, prefer the color tokens in §7
|
|
364
|
+
// (sendBubbleBackground / receiveBubbleBackground) — cleaner than the
|
|
365
|
+
// per-component bubble blocks.
|
|
360
366
|
},
|
|
361
367
|
messageComposerStyles: {
|
|
362
368
|
containerStyle: { backgroundColor: "#FFF", borderTopWidth: 1, borderTopColor: "#E8E8E8" },
|
|
@@ -366,7 +372,7 @@ Beyond color / typography, the theme has per-component style blocks for fine con
|
|
|
366
372
|
>
|
|
367
373
|
```
|
|
368
374
|
|
|
369
|
-
Common component-style keys: `conversationStyles`, `
|
|
375
|
+
Common component-style keys (exact names from `theme/type.ts`): `conversationStyles`, `userStyles`, `groupStyles`, `groupMemberStyle` (singular "Member" + singular "Style"), `messageHeaderStyles`, `messageListStyles`, `messageComposerStyles`, `threadHeaderStyles`, `callButtonStyles` (no "s" after "Button"), `callLogsStyles`. Note the irregular pluralization — `userStyles`/`groupStyles` are singular-noun, and `groupMemberStyle`/`callButtonStyles` don't follow the `*Styles` pattern.
|
|
370
376
|
|
|
371
377
|
Each block has the same nested shape as the component's `style` prop (see `cometchat-native-components` § 13).
|
|
372
378
|
|
|
@@ -436,17 +442,18 @@ Overriding the bubble tokens directly is cleaner than doing it via `messageListS
|
|
|
436
442
|
<CometChatThemeProvider
|
|
437
443
|
theme={{
|
|
438
444
|
light: {
|
|
445
|
+
// Roles: title, heading1-4, body, caption1, caption2, button (NO body1/body2/button1/button2).
|
|
446
|
+
// Each role is a VARIANT object { bold, medium, regular } — not a flat { fontFamily }.
|
|
447
|
+
// Verified vs uikit-react-native-v5 theme/default/typography.ts.
|
|
439
448
|
typography: {
|
|
440
|
-
heading1: { fontFamily: "Inter-Bold" },
|
|
441
|
-
heading2: { fontFamily: "Inter-SemiBold" },
|
|
442
|
-
heading3: { fontFamily: "Inter-SemiBold" },
|
|
443
|
-
heading4: { fontFamily: "Inter-Medium" },
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
button1: { fontFamily: "Inter-SemiBold" },
|
|
449
|
-
button2: { fontFamily: "Inter-Medium" },
|
|
449
|
+
heading1: { bold: { fontFamily: "Inter-Bold" } },
|
|
450
|
+
heading2: { bold: { fontFamily: "Inter-SemiBold" } },
|
|
451
|
+
heading3: { medium: { fontFamily: "Inter-SemiBold" } },
|
|
452
|
+
heading4: { medium: { fontFamily: "Inter-Medium" } },
|
|
453
|
+
body: { regular: { fontFamily: "Inter-Regular" } },
|
|
454
|
+
caption1: { regular: { fontFamily: "Inter-Regular" } },
|
|
455
|
+
caption2: { regular: { fontFamily: "Inter-Regular" } },
|
|
456
|
+
button: { medium: { fontFamily: "Inter-Medium" } },
|
|
450
457
|
},
|
|
451
458
|
},
|
|
452
459
|
}}
|
|
@@ -467,8 +474,9 @@ function CustomTitle({ user }: any) {
|
|
|
467
474
|
return (
|
|
468
475
|
<Text style={{
|
|
469
476
|
color: theme.color.textPrimary,
|
|
470
|
-
|
|
471
|
-
|
|
477
|
+
// heading3 is a variant object — read a weight (regular/medium/bold):
|
|
478
|
+
fontFamily: theme.typography.heading3.regular.fontFamily,
|
|
479
|
+
fontSize: theme.typography.heading3.regular.fontSize,
|
|
472
480
|
}}>
|
|
473
481
|
{user.getName()}
|
|
474
482
|
</Text>
|
|
@@ -597,6 +605,23 @@ Calling `useCometChatTranslation()` from a component rendered OUTSIDE `CometChat
|
|
|
597
605
|
|
|
598
606
|
---
|
|
599
607
|
|
|
608
|
+
## Sound Manager — custom notification & call sounds
|
|
609
|
+
|
|
610
|
+
Sounds are a **behavioral** customization (not styling) — driven by `CometChatSoundManager`, exported from the kit. The UI Kit plays the built-in cues automatically; use this to override or trigger them. Sound-event keys are passed as strings. (Docs: ui-kit/react-native/sound-manager.)
|
|
611
|
+
|
|
612
|
+
```tsx
|
|
613
|
+
import { CometChatSoundManager } from "@cometchat/chat-uikit-react-native";
|
|
614
|
+
|
|
615
|
+
// Play a default cue — keys: incomingMessage | incomingMessageFromOther
|
|
616
|
+
// | outgoingMessage | incomingCall | outgoingCall
|
|
617
|
+
CometChatSoundManager.play("incomingMessage");
|
|
618
|
+
|
|
619
|
+
// Stop whatever is playing
|
|
620
|
+
CometChatSoundManager.pause();
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
> RN audio assets differ from web URLs — for custom sounds, follow the per-platform asset guidance in ui-kit/react-native/sound-manager rather than passing a web URL.
|
|
624
|
+
|
|
600
625
|
## 10. Anti-patterns
|
|
601
626
|
|
|
602
627
|
1. **Don't pass non-hex colors.** `"rgb(...)"`, `"rgba(...)"`, named colors, or `hsl(...)` will break the kit's internal color math (used to derive `extendedPrimary`). Use `"#RRGGBB"` or `"#RRGGBBAA"` (opacity via alpha).
|
|
@@ -3,7 +3,6 @@ name: cometchat-native-troubleshooting
|
|
|
3
3
|
description: "Diagnose CometChat React Native UI Kit integration failures — init/login, gesture handler, pod install, iOS privacy manifest, Android Maven, Metro cache, permissions, calls, extensions, v4-to-v5 upgrade. For push-specific symptoms see cometchat-native-push § 12."
|
|
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"
|
|
@@ -16,7 +15,7 @@ Teaches Claude how to diagnose and fix CometChat React Native integration failur
|
|
|
16
15
|
|
|
17
16
|
**Read `cometchat-native-core` first** — most "why doesn't this work" issues trace to the init/login/wrapper chain explained there.
|
|
18
17
|
|
|
19
|
-
Ground truth: `docs/ui-kit/react-native/troubleshooting.mdx`, `apple-privacy-manifest-guide.mdx`, `upgrading-from-v4.mdx`, and first-hand failure modes from real integrations.
|
|
18
|
+
Ground truth: `docs/ui-kit/react-native/troubleshooting.mdx`, `apple-privacy-manifest-guide.mdx`, `upgrading-from-v4.mdx`, and first-hand failure modes from real integrations. **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
|
|
|
@@ -90,6 +89,9 @@ done
|
|
|
90
89
|
|
|
91
90
|
Missing peer deps → install + `pod install` (bare) or `expo install` (Expo) + rebuild.
|
|
92
91
|
|
|
92
|
+
> ⚠️ **`--legacy-peer-deps` silently DROPS peers.** If the project installed with `npm install --legacy-peer-deps` (common to dodge RN peer-range conflicts), npm **skips** unmet peer deps instead of erroring — you get a "successful" install with `react-native-svg` / `gesture-handler` / `safe-area-context` / async-storage missing, then a runtime crash. Re-run the check above after any `--legacy-peer-deps` install and install the missing ones **explicitly**.
|
|
93
|
+
> ⚠️ **`@cometchat/calls-lib-webrtc` is Cloudsmith-only — NOT on npm** (`npm view @cometchat/calls-lib-webrtc` → 404, verified). If a calls install fails resolving it, add the Cloudsmith tarball/registry per `cometchat-native-calls`; a plain `npm install @cometchat/calls-lib-webrtc` will never work.
|
|
94
|
+
|
|
93
95
|
---
|
|
94
96
|
|
|
95
97
|
## 2. Symptom → fix lookup tables
|
|
@@ -152,6 +154,9 @@ Quick-reference tables. Work through in order; if none match, drop into § 3 dee
|
|
|
152
154
|
| Fast Refresh doesn't pick up new deps | Native dep change (requires rebuild) | Restart Metro + rebuild (iOS/Android) |
|
|
153
155
|
| "Maximum update depth exceeded" after theme change | Theme object recreated each render | Define theme at module scope or in `useMemo(() => ..., [])` |
|
|
154
156
|
| App crashes on first JS load | Entry file error (syntax or import order) | Check `index.js` — `react-native-gesture-handler` should be line 1 |
|
|
157
|
+
| Unhandled promise rejection at startup with `id=0` / module-load TypeError, but chat + calls work fine | Known non-blocking init artifact from the kit/calls-sdk module-level code (F77); source-map unresolvable | **Non-blocking — do NOT chase it.** Chat and calls are fully functional. Documented as a known v4.x artifact. Don't refactor user code to "fix" it. |
|
|
158
|
+
| Error banner shows literal `[object Object]` instead of a message | `setError(String(e))` / `setError(\`${e}\`)` — CometChatException stringifies to `[object Object]` | Use `e.message` (or a `formatCometChatError(e)` helper): `setError(e?.message ?? String(e))`. |
|
|
159
|
+
| (Expo) Credentials/config changes don't take effect after editing app config | `expo.extra` manifest is **cached** | Restart with `npx expo start --clear`; for a dev build, rebuild. The `expo.extra` block is baked into the manifest at build/start time. |
|
|
155
160
|
|
|
156
161
|
### 2f. Theming
|
|
157
162
|
|
|
@@ -286,6 +291,68 @@ After updating:
|
|
|
286
291
|
2. Rebuild the archive
|
|
287
292
|
3. Resubmit
|
|
288
293
|
|
|
294
|
+
### 3bb. `react-native-document-picker` build failure on RN 0.85+ (F70)
|
|
295
|
+
|
|
296
|
+
**Symptom:** Android debug build fails with a hard Java compile error inside `react-native-document-picker`'s source — typically `cannot find symbol class GuardedResultAsyncTask`.
|
|
297
|
+
|
|
298
|
+
**Root cause:** `react-native-document-picker` references `GuardedResultAsyncTask`, which React Native removed from its Android internals in 0.85. The package is unmaintained — the last useful release predates RN 0.85.
|
|
299
|
+
|
|
300
|
+
**Fix:** uninstall it and switch to a maintained alternative if document picking is needed.
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
# Uninstall the broken package
|
|
304
|
+
npm uninstall react-native-document-picker
|
|
305
|
+
|
|
306
|
+
# For Expo apps — official maintained pick
|
|
307
|
+
npx expo install expo-document-picker
|
|
308
|
+
|
|
309
|
+
# For bare RN — maintained community fork
|
|
310
|
+
npm install @react-native-documents/picker
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
`cometchat verify` flags this combination automatically (`rn_doc_picker_compat` check) — runs as part of every verify since v4.3.0.
|
|
314
|
+
|
|
315
|
+
### 3bc. `Cannot read property 'CometChatThemeProvider' of undefined` on bare RN (F78 — chat-sdk 4.0.22 packaging regression)
|
|
316
|
+
|
|
317
|
+
**Symptom (bare RN only):** the app builds cleanly (`BUILD SUCCESSFUL`) but crashes at JS startup with `TypeError: Cannot read property 'CometChatThemeProvider' of undefined`. The error often links to RN's own AsyncStorage troubleshooting text ("Make sure your project's `package.json` depends on `@react-native-async-storage/async-storage`…").
|
|
318
|
+
|
|
319
|
+
**This is NOT the §3b Maven-repo build failure** — that one fails the Gradle build. F78 builds fine, then crashes at runtime.
|
|
320
|
+
|
|
321
|
+
**Root cause (confirmed):** `@cometchat/chat-sdk-react-native` **4.0.22** declares `react`, `react-native@0.64.2`, and `@react-native-async-storage/async-storage@^1.13.4` as **hard `dependencies`** (4.0.21 had none). npm therefore installs **nested duplicate copies inside the SDK**:
|
|
322
|
+
|
|
323
|
+
```
|
|
324
|
+
node_modules/@cometchat/chat-sdk-react-native/node_modules/
|
|
325
|
+
├── react-native/ → 0.64.2 (duplicate of your app's 0.85.x)
|
|
326
|
+
└── @react-native-async-storage/async-storage/ → 1.24.0
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
Two react-native copies = two native-module registries. The SDK's persistence code resolves AsyncStorage against its nested 1.24.0 copy, whose native module isn't the one your app autolinked → `RCTAsyncStorage` not found → the kit's `theme` module throws during evaluation → `CometChatThemeProvider` ends up `undefined`. **Expo is unaffected** because its resolver dedupes react-native to a single copy; bare RN installs the nested copy.
|
|
330
|
+
|
|
331
|
+
Confirm you're hit by it:
|
|
332
|
+
```bash
|
|
333
|
+
ls node_modules/@cometchat/chat-sdk-react-native/node_modules/react-native/package.json && echo "F78: nested RN present"
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
**Fix — pick one (both verified to remove the nested install):**
|
|
337
|
+
|
|
338
|
+
1. **npm `overrides`** (keep chat-sdk 4.0.22) — add to the app's `package.json`, then reinstall:
|
|
339
|
+
```jsonc
|
|
340
|
+
"overrides": {
|
|
341
|
+
"@cometchat/chat-sdk-react-native": {
|
|
342
|
+
"react": "$react",
|
|
343
|
+
"react-native": "$react-native",
|
|
344
|
+
"@react-native-async-storage/async-storage": "$@react-native-async-storage/async-storage"
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
```
|
|
348
|
+
yarn uses the equivalent top-level `resolutions`.
|
|
349
|
+
2. **Pin the known-good SDK:** `npm i @cometchat/chat-sdk-react-native@4.0.21` (zero deps → no nesting).
|
|
350
|
+
3. **Prefer Expo** for greenfield — the Expo cohort is fresh-validated and never hits this.
|
|
351
|
+
|
|
352
|
+
After applying (1) or (2): `rm -rf node_modules && npm install`, then verify the nested `react-native` is gone with the `ls` check above. Tried and confirmed **NOT** to fix it: downgrading async-storage, `newArchEnabled=false`, clean rebuild, Metro `--reset-cache` — none address the duplicate-RN root cause.
|
|
353
|
+
|
|
354
|
+
The permanent fix is SDK-side (move react/react-native to `peerDependencies`) — tracked in **ENG-35653**.
|
|
355
|
+
|
|
289
356
|
### 3c. Metro cache issues (post-dep-install "not found" errors)
|
|
290
357
|
|
|
291
358
|
Happens when you `npm install` a native module and Metro's bundler still has the old module graph cached.
|
|
@@ -398,7 +465,8 @@ cd ios && pod install && cd ..
|
|
|
398
465
|
|
|
399
466
|
If none of the lookup tables or deep dives apply:
|
|
400
467
|
|
|
401
|
-
1. **
|
|
468
|
+
1. **Run `cometchat doctor`** (the structured first pass — combines detect + info + verify + known-issue matching). Start here; it often pinpoints the layer (state / drift / env / deps) before you read logs.
|
|
469
|
+
2. **Read the raw error.** RN errors are usually specific ("Module 'X' not found in app 'Y'" is different from "TurboModuleRegistry.getEnforcing").
|
|
402
470
|
2. **Check the dev console + native logs.** For iOS: Xcode → View → Debug Area → Activate Console. For Android: `adb logcat | grep -E "cometchat|CometChat|ReactNative"`.
|
|
403
471
|
3. **Search the upstream docs MCP** (`cometchat-docs` if installed).
|
|
404
472
|
4. **Search the sample app** (`examples/SampleApp/` or `examples/SampleAppExpo/`) for a working version of the pattern the user is trying.
|
|
@@ -3,13 +3,14 @@ name: cometchat-nextjs-patterns
|
|
|
3
3
|
description: "Framework-specific patterns for integrating CometChat React UI Kit v6 into Next.js projects (App Router and Pages Router). Covers SSR prevention, provider setup, route placement, API routes, and common pitfalls."
|
|
4
4
|
license: "MIT"
|
|
5
5
|
compatibility: "Node.js >=18; React >=18; Next.js >=13; @cometchat/chat-uikit-react ^6; @cometchat/chat-sdk-javascript ^4"
|
|
6
|
-
allowed-tools: "shell, file-read, file-search, file-list"
|
|
7
6
|
metadata:
|
|
8
7
|
author: "CometChat"
|
|
9
8
|
version: "3.0.0"
|
|
10
9
|
tags: "chat cometchat nextjs next react ssr app-router pages-router patterns"
|
|
11
10
|
---
|
|
12
11
|
|
|
12
|
+
> **Ground truth:** `@cometchat/chat-uikit-react@^6` (+ `@cometchat/calls-sdk-javascript@^5`) — installed package types + `ui-kit/react`. **Official docs:** https://www.cometchat.com/docs/ui-kit/react/overview · **Docs MCP:** `claude mcp add --transport http cometchat-docs https://www.cometchat.com/docs/mcp` (or fetch the URL directly without MCP). Verify symbols against the installed package/source before relying on them.
|
|
13
|
+
|
|
13
14
|
## Purpose
|
|
14
15
|
|
|
15
16
|
This skill teaches Claude how to integrate CometChat into a Next.js project. Next.js is the most complex framework to integrate with because of Server-Side Rendering (SSR) and the Server Component / Client Component boundary. Every CometChat component is browser-only -- getting this wrong is the #1 source of integration failures.
|
|
@@ -72,12 +73,13 @@ import React from "react";
|
|
|
72
73
|
import React from "react";
|
|
73
74
|
```
|
|
74
75
|
|
|
75
|
-
### App Router: dynamic import from
|
|
76
|
+
### App Router: dynamic import from a Client Component (Next.js 15+ rule)
|
|
76
77
|
|
|
77
|
-
|
|
78
|
+
> ⚠️ **Next.js 15+ change (verified by runtime smoke 2026-06-02):** `dynamic(..., { ssr: false })` is **FORBIDDEN in Server Components** — Next.js 15+ throws a build error. The page that owns the dynamic-import MUST be a Client Component (`"use client"` at line 1). Otherwise the build fails with `Ecmascript file had an error` even if everything else is correct.
|
|
78
79
|
|
|
79
80
|
```tsx
|
|
80
|
-
// app/messages/page.tsx
|
|
81
|
+
// app/messages/page.tsx
|
|
82
|
+
"use client"; // ← REQUIRED in Next.js 15+ when using `dynamic({ ssr: false })`
|
|
81
83
|
import dynamic from "next/dynamic";
|
|
82
84
|
|
|
83
85
|
const ChatView = dynamic(() => import("../../components/ChatView"), {
|
|
@@ -90,7 +92,11 @@ export default function MessagesPage() {
|
|
|
90
92
|
}
|
|
91
93
|
```
|
|
92
94
|
|
|
93
|
-
The `ChatView` component itself must
|
|
95
|
+
The `ChatView` component file itself must also have `"use client"` at the top. Both ends of the dynamic-import boundary need the directive.
|
|
96
|
+
|
|
97
|
+
**If you cannot make the page a Client Component** (because it needs server data-fetching), wrap your data-fetching in a separate Server Component sibling and pass results down via props to a Client Component that owns the CometChat subtree.
|
|
98
|
+
|
|
99
|
+
**Build still fails after applying both `"use client"` and `dynamic(... ssr:false)`?** Add `export const dynamic = "force-dynamic";` at the top of the page to opt out of static prerendering entirely (or `export const runtime = "edge";` for edge runtime). This is sometimes needed in Next.js 16 even with everything else correct — verified during 2026-06-02 smoke against Next.js 16.2.7. Skill-side suspicion: kit's module-eval-time `window` references still trip static prerender even via dynamic boundary.
|
|
94
100
|
|
|
95
101
|
### Pages Router: dynamic import
|
|
96
102
|
|
|
@@ -190,7 +196,8 @@ export function CometChatProvider({ children }: CometChatProviderProps) {
|
|
|
190
196
|
|
|
191
197
|
setIsReady(true);
|
|
192
198
|
} catch (e) {
|
|
193
|
-
setError(
|
|
199
|
+
setError(formatCometChatError(e)); // from cometchat-core §6 errors.ts — NOT String(e),
|
|
200
|
+
// which renders "[object Object]" on kit errors (ENG-35719)
|
|
194
201
|
}
|
|
195
202
|
}
|
|
196
203
|
|
|
@@ -239,6 +246,13 @@ export default function RootLayout({ children }: { children: React.ReactNode })
|
|
|
239
246
|
|
|
240
247
|
**Note:** Importing a `"use client"` component from a Server Component is fine. Next.js renders the Server Component on the server and defers the Client Component to the browser. The `CometChatProvider` only runs its `useEffect` (and init) in the browser.
|
|
241
248
|
|
|
249
|
+
> ⚠️ **Option A REQUIRES `force-dynamic` on the layout (verified — real build, Next 16.2.9 + kit 6.5.1).** Mounting the provider in `app/layout.tsx` pulls the kit module into the layout's module graph, so `next build` evaluates it during the **static prerender** of *every* route — including `/` (which imports no CometChat code) and the framework-generated `/_not-found` — and crashes with `ReferenceError: window is not defined`. `"use client"` does NOT prevent this in Next 16. The per-page `export const dynamic = "force-dynamic"` from §"Build still fails…" cannot fix it, because `/_not-found` has no page file to annotate. **The fix is to put the directive on the LAYOUT, where it cascades to all routes including `/_not-found`:**
|
|
250
|
+
> ```tsx
|
|
251
|
+
> // app/layout.tsx — add this alongside the provider mount
|
|
252
|
+
> export const dynamic = "force-dynamic";
|
|
253
|
+
> ```
|
|
254
|
+
> If you would rather keep static prerendering for non-chat routes, use **Option B** (scoped route group) so `/` and `/_not-found` never import the kit — that is the cleaner choice for marketing/SSG-heavy sites.
|
|
255
|
+
|
|
242
256
|
### Where to mount: Option B -- Scoped (chat only on chat routes)
|
|
243
257
|
|
|
244
258
|
Use a route group to scope the provider to chat-related routes:
|
|
@@ -855,3 +869,31 @@ If the project has a custom `pages/_document.tsx` for font preloading or third-p
|
|
|
855
869
|
6. Create `pages/messages.tsx` with dynamic import (section 6)
|
|
856
870
|
7. Add a `<Link href="/messages">Messages</Link>` to the layout's nav
|
|
857
871
|
8. Verify: `npm run build` should succeed without SSR errors
|
|
872
|
+
|
|
873
|
+
## 14. Visual Builder integration (v4.3)
|
|
874
|
+
|
|
875
|
+
If the customer picks **Visually** in dispatcher Step 3.1, the Next.js recipe diverges based on App Router vs Pages Router. Skills runs `cometchat builder export --platform react --output <target>` to download the canonical `src/CometChat/` + patch settings in one step.
|
|
876
|
+
|
|
877
|
+
**Full recipe lives in `cometchat-core` §11 "Visual Builder integration".** This section is a pointer + Next.js-specific gotchas:
|
|
878
|
+
|
|
879
|
+
### App Router (recommended for Visual Builder)
|
|
880
|
+
|
|
881
|
+
- Run `cometchat builder export --platform react --output src/app/CometChat --json`.
|
|
882
|
+
- Create `src/app/CometChatNoSSR/CometChatNoSSR.tsx` (client component, init + login + render).
|
|
883
|
+
- Create `src/app/CometChatAppWrapper.tsx` with `"use client"` + `dynamic(() => import("../app/CometChatNoSSR/CometChatNoSSR"), { ssr: false })`.
|
|
884
|
+
- Import the wrapper in `src/app/page.tsx`.
|
|
885
|
+
- **Patch `src/app/CometChat/context/CometChatContext.tsx`** to use `'../../../../package.json'` (4 levels up) instead of canonical's `'../../../package.json'` (3 levels). **Finding F16** — depth differs because the directory moved into `src/app/`.
|
|
886
|
+
|
|
887
|
+
### Pages Router (NOT recommended)
|
|
888
|
+
|
|
889
|
+
**Finding F17** (2026-05-22): Next.js Pages Router enforces "global CSS imports only in `pages/_app.tsx`". The canonical `src/CometChat/` has 25+ component-level CSS imports — Pages Router rejects the build. App Router tolerates this; Pages Router does not. Recommend App Router instead.
|
|
890
|
+
|
|
891
|
+
If a customer insists on Pages Router + Visual Builder, the only workaround is to convert all 25+ canonical CSS files into CSS Modules — heavy customer-side work. Not validated in v4.3.0.
|
|
892
|
+
|
|
893
|
+
### Both routers
|
|
894
|
+
|
|
895
|
+
- Use `process.env.NEXT_PUBLIC_COMETCHAT_*` (NOT `import.meta.env.*` which is Vite-only).
|
|
896
|
+
- Pin `@cometchat/chat-uikit-react@6.4.3` + `@cometchat/calls-sdk-javascript@4.2.5`.
|
|
897
|
+
- `package.json` needs `cometChatCustomConfig` block (Finding F2).
|
|
898
|
+
|
|
899
|
+
If the customer picks **In code**, ignore this section.
|
|
@@ -3,13 +3,14 @@ name: cometchat-placement
|
|
|
3
3
|
description: "Production integration patterns -- how to add CometChat as a route, modal, drawer, embedded panel, or widget in an existing project. Teaches Claude WHERE to put chat."
|
|
4
4
|
license: "MIT"
|
|
5
5
|
compatibility: "@cometchat/chat-uikit-react ^6; @cometchat/chat-sdk-javascript ^4"
|
|
6
|
-
allowed-tools: "shell, file-read, file-search, file-list"
|
|
7
6
|
metadata:
|
|
8
7
|
author: "CometChat"
|
|
9
8
|
version: "3.0.0"
|
|
10
9
|
tags: "chat cometchat react placement route modal drawer widget embedded integration"
|
|
11
10
|
---
|
|
12
11
|
|
|
12
|
+
> **Ground truth:** `@cometchat/chat-uikit-react@^6` components composed for placement + `docs/ui-kit/react`. **Official docs:** https://www.cometchat.com/docs/ui-kit/react/overview · **Docs MCP:** `claude mcp add --transport http cometchat-docs https://www.cometchat.com/docs/mcp` (or fetch the URL directly without MCP). Verify symbols against the installed package/source before relying on them.
|
|
13
|
+
|
|
13
14
|
## Purpose
|
|
14
15
|
|
|
15
16
|
This skill teaches you WHERE to put CometChat in an existing project. It covers five placement patterns: route, modal, drawer, embedded panel, and floating widget. Each pattern includes step-by-step instructions and complete code examples.
|
|
@@ -168,6 +169,30 @@ chat products.
|
|
|
168
169
|
|
|
169
170
|
---
|
|
170
171
|
|
|
172
|
+
> **Composer choice for narrow/two-pane panes:** the canonical React v6 sample apps use **`CometChatCompactMessageComposer`** (not `CometChatMessageComposer`) in the two-pane messages view — it's the kit's space-optimized composer for a sidebar-width pane (`cometchat-uikit-react-v6/sample-app/src/components/CometChatMessages/CometChatMessages.tsx:85`). Both compile and work; prefer `CometChatCompactMessageComposer` for the split/two-pane layouts below and `CometChatMessageComposer` for full-width single-thread layouts.
|
|
173
|
+
|
|
174
|
+
## Height & scroll — the message-view column MUST be bounded
|
|
175
|
+
|
|
176
|
+
Every header+list+composer example below puts the three components as **direct
|
|
177
|
+
flex children** of a `display:flex; flexDirection:column` column. That works ONLY
|
|
178
|
+
if the column has a bounded height — i.e. the full chain (`html`/`body`/`#root` →
|
|
179
|
+
…→ this column) uses a definite **`height`** (e.g. `#root { height: 100vh }`),
|
|
180
|
+
never `min-height`, and every flex ancestor of `CometChatMessageList` has
|
|
181
|
+
`minHeight: 0`. Delete the Vite/CRA starter `#root { min-height: 100vh; max-width: … }`.
|
|
182
|
+
|
|
183
|
+
If the list still won't scroll (most common symptom), or you wrap the list in its
|
|
184
|
+
own `<div>` for custom chrome/tabs, you hit the kit's auto-injected `.cometchat`
|
|
185
|
+
element — see **`cometchat-react-patterns` → "Container height (and the flex-shrink
|
|
186
|
+
trap)" Bug 3**: give the list its own wrapper class with BOTH `.your-list-wrapper
|
|
187
|
+
{ flex: 1 1 0; min-height: 0; height: 100%; overflow: hidden }` (the **explicit
|
|
188
|
+
`height: 100%` is required** — a flex-grow-only height is indefinite, so the kit's
|
|
189
|
+
injected child collapses to content height and clips) AND a child rule
|
|
190
|
+
`.your-list-wrapper > .cometchat { height: 100%; overflow: hidden }` (inline styles
|
|
191
|
+
can't target the injected child). Those two rules are the single most common fix for
|
|
192
|
+
"I set heights everywhere and it still won't scroll."
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
171
196
|
## Thread replies — hidden by default in every example below
|
|
172
197
|
|
|
173
198
|
Every `<CometChatMessageList ...>` in the placement patterns below
|
|
@@ -607,6 +632,17 @@ The `CometChatProvider` (or equivalent init logic) MUST be at the app root, NOT
|
|
|
607
632
|
|
|
608
633
|
A side panel that slides in from the right. Better than a modal for ongoing conversations because the user can keep it open while browsing.
|
|
609
634
|
|
|
635
|
+
> ⚠️ **Known kit-side traps in narrow containers (≤ ~480px). Mitigate, don't ignore (ENG-35702/03/04/06):**
|
|
636
|
+
>
|
|
637
|
+
> 1. **Unread-count badges clip at the right edge in 320px panes** — kit's conversation-list item doesn't reserve trailing padding for the pill. Workaround until the kit fix lands: target `.cometchat-conversation-list-item__badge { margin-right: 8px; flex-shrink: 0; }` in your overrides, OR widen the drawer to ≥ 480px on the inner content (use `width: min(420px, 100vw)` + 8px inner padding).
|
|
638
|
+
> 2. **`Delete Conversation?` confirmation card overflows the list pane** — kit renders the dialog inside the list column instead of portalling to a top-level scrim. There's no clean CSS workaround today; if the integration depends on right-click delete, raise the drawer width above ~480px so the card fits inside.
|
|
639
|
+
> 3. **Composer attachment popover (`+` button) anchors to the wrong ancestor** — opens at viewport bottom-right instead of above the trigger when mounted inside a drawer/modal. Workaround: ensure the drawer container has `position: relative` (NOT just `position: fixed`) on its inner card so absolute popovers anchor correctly. If the popover still misaligns, mount the composer in a full-screen-on-mobile variant (the `right: -100%` recipe from §"Recipe — breakpoint-aware drawer").
|
|
640
|
+
> 4. **Voice recorder bubble UI is broken at kit v6.x** — the in-bubble recorder shows visual artifacts AND the pause-resume timer restarts at 00:00 instead of continuing. There is no client-side workaround; if voice messages are part of the integration's core surface, document the limitation for the customer and consider hiding the voice button (`<CometChatMessageComposer hideVoiceRecordingButton={true} />`) until the kit fix ships.
|
|
641
|
+
> 5. **`CometChatMessageList` does NOT auto-resubscribe on conversation switch** — passing a new `user` or `group` prop keeps the old listeners. **Required workaround when switching conversations inside a single drawer/modal:** pass `key={user?.getUid() ?? group?.getGuid()}` to force a remount + listener re-subscribe. Without it, switching from Alice → Bob silently shows Alice's messages with Bob's header. (ENG-35702)
|
|
642
|
+
> 6. **`CometChatMessageList` may render BLANK on conversations with unread messages** — kit-side data-path bug, no header or empty-state, just blank. No client-side workaround today; if the customer reports a blank list, capture the screenshot + UID/GUID + unread count and file a kit ticket. (ENG-35702 kit-side blocker)
|
|
643
|
+
>
|
|
644
|
+
> These are kit-side bugs filed in Linear (ENG-35702, 35703, 35704, 35706); the workarounds above are interim until the next kit release.
|
|
645
|
+
|
|
610
646
|
### Steps
|
|
611
647
|
|
|
612
648
|
#### 1. Create a ChatDrawer component
|
|
@@ -688,9 +724,12 @@ export function ChatDrawer({ isOpen, onClose, targetUserId, targetGroupId }: Cha
|
|
|
688
724
|
style={{
|
|
689
725
|
position: "fixed",
|
|
690
726
|
top: 0,
|
|
691
|
-
|
|
727
|
+
// Breakpoint-aware: full-width on mobile (≤ 640px), 400px on desktop.
|
|
728
|
+
// The "-100%" closed offset slides the drawer off-screen at any width,
|
|
729
|
+
// so mobile-full-screen works without recomputing the offset (ENG-35715).
|
|
730
|
+
right: isOpen ? 0 : "-100%",
|
|
692
731
|
bottom: 0,
|
|
693
|
-
width: "400px",
|
|
732
|
+
width: "min(400px, 100vw)",
|
|
694
733
|
maxWidth: "100vw",
|
|
695
734
|
zIndex: 1000,
|
|
696
735
|
backgroundColor: "var(--cometchat-background-color-01, #fff)",
|
|
@@ -3,13 +3,14 @@ name: cometchat-production
|
|
|
3
3
|
description: "Production readiness for CometChat — server-side token auth, user management CRUD, environment hardening, and security checklist. Replaces dev-mode authKey with server-side tokens."
|
|
4
4
|
license: "MIT"
|
|
5
5
|
compatibility: "Node.js >=18; @cometchat/chat-uikit-react ^6; @cometchat/chat-sdk-javascript ^4"
|
|
6
|
-
allowed-tools: "shell, file-read, file-search, file-list"
|
|
7
6
|
metadata:
|
|
8
7
|
author: "CometChat"
|
|
9
8
|
version: "3.0.0"
|
|
10
9
|
tags: "cometchat production auth token security user-management rest-api"
|
|
11
10
|
---
|
|
12
11
|
|
|
12
|
+
> **Ground truth:** `docs/fundamentals/user-auth` + per-platform UI Kit. **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). Verify symbols against the installed package/source before relying on them.
|
|
13
|
+
|
|
13
14
|
## Purpose
|
|
14
15
|
|
|
15
16
|
This skill teaches Claude how to harden a CometChat integration for production. It covers two critical areas:
|
|
@@ -71,8 +72,10 @@ The CometChat REST API requires two headers:
|
|
|
71
72
|
|
|
72
73
|
| Key type | Where to find | Purpose | Security |
|
|
73
74
|
|---|---|---|---|
|
|
74
|
-
| **Auth Key** | Dashboard → Your App → API & Auth Keys → "Auth Keys" table | Client-side SDK
|
|
75
|
-
| **REST API Key** | Dashboard → Your App → API & Auth Keys → "Rest API Keys" table | Server-to-server: token generation, user CRUD, message send | Server only. Never expose to client. |
|
|
75
|
+
| **Auth Key** (`authOnly` scope) | Dashboard → Your App → API & Auth Keys → "Auth Keys" table | Client-side SDK `CometChatUIKit.login(uid)` in dev mode; server-side it can **create users + mint auth tokens** (`POST /v3/users`, `POST /v3/users/{uid}/auth_tokens`) but **NOT** update/delete users | Exposed in browser. Dev only. |
|
|
76
|
+
| **REST API Key** (`fullAccess` scope) | Dashboard → Your App → API & Auth Keys → "Rest API Keys" table | Server-to-server: token generation, **full** user CRUD (incl. **update/delete**), message send | Server only. Never expose to client. |
|
|
77
|
+
|
|
78
|
+
> **Scope split (verified against `fundamentals/key-concepts.mdx` + the chat-apis `apikey` scope enum `fullAccess`/`authOnly`):** the Auth Key can *create & login* users and mint tokens, but **`PUT`/`DELETE /v3/users/{uid}` require a `fullAccess` REST API Key** — an `authOnly` Auth Key is rejected. So a user-management endpoint that does update/delete MUST use `COMETCHAT_REST_API_KEY`, not the Auth Key. (Heads-up: the CLI's `add-user-mgmt` / `production-auth` scaffolds currently name the server var `COMETCHAT_AUTH_KEY`; for full CRUD, populate it with — or rename it to — a `fullAccess` REST API Key. Tracked as a CLI-alignment follow-up.)
|
|
76
79
|
|
|
77
80
|
The `.env` should have both for production:
|
|
78
81
|
```env
|
|
@@ -585,8 +588,12 @@ async function refreshSession(uid: string): Promise<void> {
|
|
|
585
588
|
CometChat.addConnectionListener(
|
|
586
589
|
"auth-refresh-listener",
|
|
587
590
|
new CometChat.ConnectionListener({
|
|
588
|
-
onDisconnected: () => {
|
|
589
|
-
|
|
591
|
+
onDisconnected: async () => {
|
|
592
|
+
// Web kit method is getLoggedinUser() (lowercase "i") and is ASYNC —
|
|
593
|
+
// it returns a Promise, so you must await it (you can't chain ?.getUid()
|
|
594
|
+
// on the call directly). The synchronous capital-I form is the Angular kit.
|
|
595
|
+
const me = await CometChatUIKit.getLoggedinUser();
|
|
596
|
+
const uid = me?.getUid();
|
|
590
597
|
if (uid) {
|
|
591
598
|
refreshSession(uid).catch((e) => {
|
|
592
599
|
console.error("CometChat refresh failed; user may need to re-login", e);
|