@cometchat/skills 4.4.2 → 5.0.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/.claude-plugin/marketplace.json +55 -0
- package/.claude-plugin/plugin.json +14 -0
- package/CHANGELOG.md +36 -0
- package/LICENSE +21 -0
- package/README.md +41 -163
- package/RULES.md +114 -0
- package/bin/cometchat-skills.mjs +1180 -0
- package/bin/legacy-skills.json +95 -0
- package/catalogs/android-v6.json +1646 -0
- package/catalogs/flutter-v6.json +651 -0
- package/catalogs/ios-v5.json +1383 -0
- package/catalogs/rn-calls-v5.json +134 -0
- package/catalogs/rn-calls-v5.symbols.txt +58 -0
- package/catalogs/rn-sdk-v4.json +672 -0
- package/catalogs/rn-v5.json +449 -0
- package/catalogs/rn-v5.symbols.txt +216 -0
- package/catalogs/sdk-android-v5.json +514 -0
- package/contracts.android-calls-v5.json +122 -0
- package/contracts.android-v6.json +135 -0
- package/contracts.angular-v5.json +694 -0
- package/contracts.flutter-calls-v5.json +77 -0
- package/contracts.flutter-v6.json +126 -0
- package/contracts.ios-calls-v5.json +67 -0
- package/contracts.ios-v5.json +436 -0
- package/contracts.json +82 -0
- package/contracts.rn-calls-v5.json +77 -0
- package/contracts.rn-v5.json +727 -0
- package/contracts.sdk-android-v5.json +15 -0
- package/contracts.web-calls-v5.json +45 -0
- package/features.android-calls-v5.json +246 -0
- package/features.android-v6.json +65 -0
- package/features.angular-v5.json +521 -0
- package/features.flutter-calls-v5.json +286 -0
- package/features.flutter-v6.json +484 -0
- package/features.ios-calls-v5.json +236 -0
- package/features.ios-v5.json +573 -0
- package/features.json +61 -0
- package/features.rn-calls-v5.json +187 -0
- package/features.rn-v5.json +614 -0
- package/features.sdk-android-v5.json +40 -0
- package/features.sdk-jsv4.json +24 -0
- package/features.web-calls-v5.json +108 -0
- package/package.json +151 -74
- package/peers.yaml +312 -0
- package/registry/README.md +31 -0
- package/registry/android-calls-v5.json +54 -0
- package/registry/android-v6.json +137 -0
- package/registry/angular-v5.json +114 -0
- package/registry/flutter-calls-v5.json +54 -0
- package/registry/flutter-v6.json +119 -0
- package/registry/ios-calls-v5.json +59 -0
- package/registry/ios-v5.json +97 -0
- package/registry/rn-calls-v5.json +59 -0
- package/registry/rn-v5.json +129 -0
- package/registry/sdk-android-v5.json +53 -0
- package/registry/sdk-jsv4.json +53 -0
- package/registry/web-calls-v5.json +54 -0
- package/registry/web-v7.json +99 -0
- package/skills/cometchat/SKILL.md +42 -2096
- package/skills/cometchat-android-v5-calls-sdk/SKILL.md +206 -0
- package/skills/cometchat-android-v5-calls-sdk/references/build-truth.md +63 -0
- package/skills/cometchat-android-v5-calls-sdk/references/docs-map.md +119 -0
- package/skills/cometchat-android-v5-calls-sdk/references/method-map.md +53 -0
- package/skills/cometchat-android-v5-calls-sdk/references/pitfalls.md +72 -0
- package/skills/cometchat-android-v5-calls-sdk/references/ringing.md +92 -0
- package/skills/cometchat-android-v5-calls-sdk/references/user-switch.md +90 -0
- package/skills/cometchat-android-v5-sdk/SKILL.md +127 -0
- package/skills/cometchat-android-v5-sdk/references/app-surface.md +88 -0
- package/skills/cometchat-android-v5-sdk/references/docs-map.md +91 -0
- package/skills/cometchat-android-v6-builder-settings/SKILL.md +51 -137
- package/skills/cometchat-android-v6-calls/SKILL.md +128 -413
- package/skills/cometchat-android-v6-compose-components/SKILL.md +84 -194
- package/skills/cometchat-android-v6-compose-customization/SKILL.md +66 -411
- package/skills/cometchat-android-v6-compose-placement/SKILL.md +154 -237
- package/skills/cometchat-android-v6-core/SKILL.md +236 -672
- package/skills/cometchat-android-v6-core/references/anti-patterns.md +31 -0
- package/skills/cometchat-android-v6-core/references/component-props.md +168 -0
- package/skills/cometchat-android-v6-core/references/docs-map.md +153 -0
- package/skills/cometchat-android-v6-core/references/layout.md +112 -0
- package/skills/cometchat-android-v6-core/references/lifecycle.md +75 -0
- package/skills/cometchat-android-v6-core/references/setup-credentials.md +105 -0
- package/skills/cometchat-android-v6-core/references/troubleshooting.md +36 -0
- package/skills/cometchat-android-v6-events/SKILL.md +46 -184
- package/skills/cometchat-android-v6-extensions/SKILL.md +39 -179
- package/skills/cometchat-android-v6-features/SKILL.md +74 -143
- package/skills/cometchat-android-v6-kotlin-components/SKILL.md +75 -193
- package/skills/cometchat-android-v6-kotlin-customization/SKILL.md +67 -419
- package/skills/cometchat-android-v6-kotlin-placement/SKILL.md +77 -223
- package/skills/cometchat-android-v6-migration/SKILL.md +67 -378
- package/skills/cometchat-android-v6-production/SKILL.md +40 -179
- package/skills/cometchat-android-v6-push/SKILL.md +39 -289
- package/skills/cometchat-android-v6-testing/SKILL.md +50 -265
- package/skills/cometchat-android-v6-troubleshooting/SKILL.md +70 -254
- package/skills/cometchat-angular-v5-calls/SKILL.md +193 -0
- package/skills/cometchat-angular-v5-components/SKILL.md +131 -0
- package/skills/cometchat-angular-v5-components/references/catalog.md +111 -0
- package/skills/cometchat-angular-v5-components/references/host-composed.md +46 -0
- package/skills/cometchat-angular-v5-core/SKILL.md +300 -0
- package/skills/cometchat-angular-v5-core/references/anti-patterns.md +49 -0
- package/skills/cometchat-angular-v5-core/references/component-props.md +55 -0
- package/skills/cometchat-angular-v5-core/references/dependencies.md +66 -0
- package/skills/cometchat-angular-v5-core/references/docs-map.md +132 -0
- package/skills/cometchat-angular-v5-core/references/layout.md +64 -0
- package/skills/cometchat-angular-v5-core/references/lifecycle.md +202 -0
- package/skills/cometchat-angular-v5-core/references/setup-credentials.md +137 -0
- package/skills/cometchat-angular-v5-core/references/theming.md +70 -0
- package/skills/cometchat-angular-v5-core/references/troubleshooting.md +27 -0
- package/skills/cometchat-angular-v5-customization/SKILL.md +94 -0
- package/skills/cometchat-angular-v5-features/SKILL.md +107 -0
- package/skills/cometchat-angular-v5-features/references/custom-messages.md +133 -0
- package/skills/cometchat-angular-v5-features/references/formatters.md +28 -0
- package/skills/cometchat-angular-v5-features/references/host-composed-extensions.md +85 -0
- package/skills/cometchat-angular-v5-migration/SKILL.md +40 -0
- package/skills/cometchat-angular-v5-migration/references/migration-guide.md +165 -0
- package/skills/cometchat-angular-v5-patterns/SKILL.md +107 -0
- package/skills/cometchat-angular-v5-placement/SKILL.md +133 -0
- package/skills/cometchat-angular-v5-placement/references/combined-app.md +174 -0
- package/skills/cometchat-angular-v5-placement/references/core-surface.md +199 -0
- package/skills/cometchat-angular-v5-production/SKILL.md +101 -0
- package/skills/cometchat-angular-v5-push/SKILL.md +61 -0
- package/skills/cometchat-angular-v5-testing/SKILL.md +112 -0
- package/skills/cometchat-angular-v5-troubleshooting/SKILL.md +96 -0
- package/skills/cometchat-flutter-v5-sdk/SKILL.md +188 -0
- package/skills/cometchat-flutter-v5-sdk/references/doc-corrections.md +55 -0
- package/skills/cometchat-flutter-v5-sdk/references/docs-map.md +211 -0
- package/skills/cometchat-flutter-v5-sdk/references/platform-notes.md +48 -0
- package/skills/cometchat-flutter-v5-sdk/references/transcription.md +87 -0
- package/skills/cometchat-flutter-v6-calls/SKILL.md +75 -389
- package/skills/cometchat-flutter-v6-components/SKILL.md +88 -361
- package/skills/cometchat-flutter-v6-core/SKILL.md +154 -593
- package/skills/cometchat-flutter-v6-core/references/anti-patterns.md +55 -0
- package/skills/cometchat-flutter-v6-core/references/docs-map.md +143 -0
- package/skills/cometchat-flutter-v6-core/references/layout.md +45 -0
- package/skills/cometchat-flutter-v6-core/references/lifecycle.md +87 -0
- package/skills/cometchat-flutter-v6-core/references/setup-credentials.md +84 -0
- package/skills/cometchat-flutter-v6-core/references/troubleshooting.md +26 -0
- package/skills/cometchat-flutter-v6-customization/SKILL.md +70 -712
- package/skills/cometchat-flutter-v6-events/SKILL.md +79 -174
- package/skills/cometchat-flutter-v6-features/SKILL.md +55 -394
- package/skills/cometchat-flutter-v6-migration/SKILL.md +68 -367
- package/skills/cometchat-flutter-v6-migration/references/migration-guide.md +131 -0
- package/skills/cometchat-flutter-v6-patterns/SKILL.md +61 -0
- package/skills/cometchat-flutter-v6-placement/SKILL.md +94 -381
- package/skills/cometchat-flutter-v6-production/SKILL.md +58 -615
- package/skills/cometchat-flutter-v6-push/SKILL.md +46 -455
- package/skills/cometchat-flutter-v6-testing/SKILL.md +68 -299
- package/skills/cometchat-flutter-v6-troubleshooting/SKILL.md +54 -878
- package/skills/cometchat-ios-calls/SKILL.md +112 -563
- package/skills/cometchat-ios-components/SKILL.md +44 -834
- package/skills/cometchat-ios-core/SKILL.md +181 -1068
- package/skills/cometchat-ios-core/references/anti-patterns.md +80 -0
- package/skills/cometchat-ios-core/references/docs-map.md +123 -0
- package/skills/cometchat-ios-core/references/install.md +23 -0
- package/skills/cometchat-ios-core/references/layout.md +186 -0
- package/skills/cometchat-ios-core/references/setup-credentials.md +197 -0
- package/skills/cometchat-ios-core/references/swiftui.md +91 -0
- package/skills/cometchat-ios-core/references/troubleshooting.md +100 -0
- package/skills/cometchat-ios-customization/SKILL.md +33 -968
- package/skills/cometchat-ios-features/SKILL.md +29 -738
- package/skills/cometchat-ios-migration/SKILL.md +39 -0
- package/skills/cometchat-ios-placement/SKILL.md +51 -729
- package/skills/cometchat-ios-push/SKILL.md +24 -602
- package/skills/cometchat-ios-v5-sdk/SKILL.md +161 -0
- package/skills/cometchat-ios-v5-sdk/references/docs-map.md +326 -0
- package/skills/cometchat-js-v5-sdk/SKILL.md +95 -0
- package/skills/cometchat-js-v5-sdk/references/docs-map.md +114 -0
- package/skills/cometchat-onboarding/SKILL.md +89 -0
- package/skills/cometchat-onboarding/references/archetypes.md +51 -0
- package/skills/cometchat-onboarding/references/calling-first.md +77 -0
- package/skills/cometchat-onboarding/references/not-in-this-pack.md +8 -0
- package/skills/cometchat-onboarding/references/plan-artifact.md +133 -0
- package/skills/cometchat-onboarding/references/platforms.md +90 -0
- package/skills/cometchat-react-native-bare-patterns/SKILL.md +120 -0
- package/skills/cometchat-react-native-calls/SKILL.md +200 -0
- package/skills/cometchat-react-native-components/SKILL.md +142 -0
- package/skills/cometchat-react-native-core/SKILL.md +313 -0
- package/skills/cometchat-react-native-core/references/anti-patterns.md +79 -0
- package/skills/cometchat-react-native-core/references/component-props.md +105 -0
- package/skills/cometchat-react-native-core/references/dependencies.md +62 -0
- package/skills/cometchat-react-native-core/references/docs-map.md +126 -0
- package/skills/cometchat-react-native-core/references/layout.md +61 -0
- package/skills/cometchat-react-native-core/references/lifecycle.md +64 -0
- package/skills/cometchat-react-native-core/references/setup-credentials.md +39 -0
- package/skills/cometchat-react-native-customization/SKILL.md +198 -0
- package/skills/cometchat-react-native-expo-patterns/SKILL.md +116 -0
- package/skills/cometchat-react-native-features/SKILL.md +122 -0
- package/skills/cometchat-react-native-migration/SKILL.md +103 -0
- package/skills/cometchat-react-native-placement/SKILL.md +158 -0
- package/skills/cometchat-react-native-production/SKILL.md +78 -0
- package/skills/cometchat-react-native-push/SKILL.md +88 -0
- package/skills/cometchat-react-native-sdk/SKILL.md +126 -0
- package/skills/cometchat-react-native-sdk/references/method-map.md +239 -0
- package/skills/cometchat-react-native-sdk/references/page-map.md +96 -0
- package/skills/cometchat-react-native-testing/SKILL.md +94 -0
- package/skills/cometchat-react-native-troubleshooting/SKILL.md +116 -0
- package/skills/cometchat-react-native-v5-sdk/SKILL.md +150 -0
- package/skills/cometchat-react-native-v5-sdk/references/docs-map.md +127 -0
- package/skills/cometchat-react-native-v5-sdk/references/ringing-voip.md +369 -0
- package/skills/cometchat-react-v7-calls/SKILL.md +75 -0
- package/skills/cometchat-react-v7-components/SKILL.md +72 -0
- package/skills/cometchat-react-v7-core/SKILL.md +101 -0
- package/skills/cometchat-react-v7-core/references/anti-patterns.md +19 -0
- package/skills/cometchat-react-v7-core/references/component-props.md +82 -0
- package/skills/cometchat-react-v7-core/references/dependencies.md +23 -0
- package/skills/cometchat-react-v7-core/references/docs-map.md +117 -0
- package/skills/cometchat-react-v7-core/references/i18n-rtl-a11y.md +22 -0
- package/skills/cometchat-react-v7-core/references/layout.md +158 -0
- package/skills/cometchat-react-v7-core/references/lifecycle.md +74 -0
- package/skills/cometchat-react-v7-core/references/setup-credentials.md +58 -0
- package/skills/cometchat-react-v7-core/references/ssr.md +11 -0
- package/skills/cometchat-react-v7-core/references/theming.md +52 -0
- package/skills/cometchat-react-v7-core/references/troubleshooting.md +28 -0
- package/skills/cometchat-react-v7-customization/SKILL.md +84 -0
- package/skills/cometchat-react-v7-features/SKILL.md +92 -0
- package/skills/cometchat-react-v7-migration/SKILL.md +39 -0
- package/skills/cometchat-react-v7-migration/references/migration-guide.md +119 -0
- package/skills/cometchat-react-v7-patterns/SKILL.md +43 -0
- package/skills/cometchat-react-v7-placement/SKILL.md +106 -0
- package/skills/cometchat-react-v7-placement/references/recipes.md +354 -0
- package/skills/cometchat-react-v7-push/SKILL.md +53 -0
- package/test-suite/README.md +70 -0
- package/test-suite/catalogs/android-calls-v5.json +830 -0
- package/test-suite/catalogs/android-calls-v5.symbols.txt +499 -0
- package/test-suite/catalogs/android-v6.json +1646 -0
- package/test-suite/catalogs/android-v6.symbols.txt +298 -0
- package/test-suite/catalogs/angular-v5.json +7587 -0
- package/test-suite/catalogs/flutter-calls-v5.json +196 -0
- package/test-suite/catalogs/flutter-calls-v5.symbols.txt +59 -0
- package/test-suite/catalogs/flutter-v6.json +651 -0
- package/test-suite/catalogs/ios-calls-v5.json +158 -0
- package/test-suite/catalogs/ios-calls-v5.symbols.txt +70 -0
- package/test-suite/catalogs/ios-v5.json +1383 -0
- package/test-suite/catalogs/ios-v5.symbols.txt +699 -0
- package/test-suite/catalogs/rn-calls-v5.json +134 -0
- package/test-suite/catalogs/rn-sdk-v4.json +672 -0
- package/test-suite/catalogs/rn-v5.json +449 -0
- package/test-suite/catalogs/sdk-android-v5.json +514 -0
- package/test-suite/catalogs/sdk-android-v5.symbols.txt +254 -0
- package/test-suite/catalogs/sdk-jsv4.json +800 -0
- package/test-suite/catalogs/web-calls-v5.json +195 -0
- package/test-suite/catalogs/web-v7.json +1243 -0
- package/test-suite/scripts/build-registry.mjs +113 -0
- package/test-suite/scripts/catalog-refresh-dart.mjs +151 -0
- package/test-suite/scripts/catalog-refresh.mjs +100 -0
- package/test-suite/scripts/lint-skills.mjs +909 -0
- package/test-suite/scripts/measure-tokens.mjs +169 -0
- package/test-suite/scripts/typecheck-fences-dart.mjs +437 -0
- package/test-suite/scripts/typecheck-fences-kotlin.mjs +269 -0
- package/test-suite/scripts/typecheck-fences.mjs +206 -0
- package/test-suite/scripts/verify-catalog.mjs +242 -0
- package/test-suite/scripts/verify-contract-fences.mjs +94 -0
- package/test-suite/scripts/verify-detection.mjs +178 -0
- package/test-suite/scripts/verify-docs-base.mjs +91 -0
- package/test-suite/scripts/verify-family-agnostic.mjs +130 -0
- package/test-suite/scripts/verify-golden-path.mjs +138 -0
- package/test-suite/scripts/verify-oracle-components.mjs +133 -0
- package/test-suite/scripts/verify-template-bindings.mjs +148 -0
- package/test-suite/typecheck/angular-v5/package.json +21 -0
- package/test-suite/typecheck/angular-v5/tsconfig.json +21 -0
- package/test-suite/typecheck/flutter-v6/analysis_options.yaml +25 -0
- package/test-suite/typecheck/flutter-v6/pubspec.yaml +21 -0
- package/test-suite/typecheck/web-v7/package.json +18 -0
- package/test-suite/typecheck/web-v7/tsconfig.json +19 -0
- package/bin/install.js +0 -1003
- package/skills/.claude-plugin/marketplace.json +0 -86
- package/skills/cometchat/references/asking-questions.md +0 -48
- package/skills/cometchat-a11y/SKILL.md +0 -477
- package/skills/cometchat-android-v5/SKILL.md +0 -121
- package/skills/cometchat-android-v5-calls/SKILL.md +0 -429
- package/skills/cometchat-android-v5-calls/references/README.md +0 -53
- package/skills/cometchat-android-v5-calls/references/add-calls-to-existing-chat.md +0 -197
- package/skills/cometchat-android-v5-calls/references/audio-controls.md +0 -91
- package/skills/cometchat-android-v5-calls/references/background-handling.md +0 -168
- package/skills/cometchat-android-v5-calls/references/call-layouts.md +0 -131
- package/skills/cometchat-android-v5-calls/references/call-logs.md +0 -113
- package/skills/cometchat-android-v5-calls/references/call-session.md +0 -274
- package/skills/cometchat-android-v5-calls/references/custom-ui.md +0 -150
- package/skills/cometchat-android-v5-calls/references/event-listeners.md +0 -123
- package/skills/cometchat-android-v5-calls/references/group-calls.md +0 -205
- package/skills/cometchat-android-v5-calls/references/idle-timeout.md +0 -117
- package/skills/cometchat-android-v5-calls/references/in-call-chat.md +0 -134
- package/skills/cometchat-android-v5-calls/references/join-session.md +0 -120
- package/skills/cometchat-android-v5-calls/references/migration-v4-to-v5.md +0 -222
- package/skills/cometchat-android-v5-calls/references/participant-management.md +0 -110
- package/skills/cometchat-android-v5-calls/references/picture-in-picture.md +0 -106
- package/skills/cometchat-android-v5-calls/references/raise-hand.md +0 -248
- package/skills/cometchat-android-v5-calls/references/recording.md +0 -101
- package/skills/cometchat-android-v5-calls/references/ringing-integration.md +0 -152
- package/skills/cometchat-android-v5-calls/references/screen-sharing.md +0 -78
- package/skills/cometchat-android-v5-calls/references/server-fcm-voip.md +0 -215
- package/skills/cometchat-android-v5-calls/references/session-settings.md +0 -121
- package/skills/cometchat-android-v5-calls/references/setup.md +0 -137
- package/skills/cometchat-android-v5-calls/references/share-invite.md +0 -156
- package/skills/cometchat-android-v5-calls/references/video-controls.md +0 -87
- package/skills/cometchat-android-v5-calls/references/voip-calling.md +0 -526
- package/skills/cometchat-android-v5-components/SKILL.md +0 -431
- package/skills/cometchat-android-v5-core/SKILL.md +0 -486
- package/skills/cometchat-android-v5-customization/SKILL.md +0 -469
- package/skills/cometchat-android-v5-extensions/SKILL.md +0 -127
- package/skills/cometchat-android-v5-features/SKILL.md +0 -131
- package/skills/cometchat-android-v5-placement/SKILL.md +0 -277
- package/skills/cometchat-android-v5-production/SKILL.md +0 -95
- package/skills/cometchat-android-v5-push/SKILL.md +0 -619
- package/skills/cometchat-android-v5-testing/SKILL.md +0 -188
- package/skills/cometchat-android-v5-theming/SKILL.md +0 -167
- package/skills/cometchat-android-v5-troubleshooting/SKILL.md +0 -74
- package/skills/cometchat-android-v6/SKILL.md +0 -108
- package/skills/cometchat-android-v6-calls/references/add-calls-to-existing-chat.md +0 -97
- package/skills/cometchat-android-v6-calls/references/advanced-features.md +0 -87
- package/skills/cometchat-android-v6-calls/references/call-layouts.md +0 -100
- package/skills/cometchat-android-v6-calls/references/call-session.md +0 -163
- package/skills/cometchat-android-v6-calls/references/device-management.md +0 -172
- package/skills/cometchat-android-v6-calls/references/group-calls.md +0 -191
- package/skills/cometchat-android-v6-calls/references/idle-timeout.md +0 -110
- package/skills/cometchat-android-v6-calls/references/in-call-chat.md +0 -141
- package/skills/cometchat-android-v6-calls/references/raise-hand.md +0 -188
- package/skills/cometchat-android-v6-calls/references/ringing-integration.md +0 -176
- package/skills/cometchat-android-v6-calls/references/server-fcm-voip.md +0 -127
- package/skills/cometchat-android-v6-calls/references/share-invite.md +0 -105
- package/skills/cometchat-android-v6-compose-theming/SKILL.md +0 -250
- package/skills/cometchat-android-v6-kotlin-theming/SKILL.md +0 -233
- package/skills/cometchat-angular-calls/SKILL.md +0 -380
- package/skills/cometchat-angular-calls/references/add-calls-to-existing-chat.md +0 -96
- package/skills/cometchat-angular-calls/references/call-layouts.md +0 -123
- package/skills/cometchat-angular-calls/references/call-session.md +0 -167
- package/skills/cometchat-angular-calls/references/custom-ui.md +0 -239
- package/skills/cometchat-angular-calls/references/device-management.md +0 -154
- package/skills/cometchat-angular-calls/references/group-calls.md +0 -433
- package/skills/cometchat-angular-calls/references/idle-timeout.md +0 -161
- package/skills/cometchat-angular-calls/references/in-call-chat.md +0 -148
- package/skills/cometchat-angular-calls/references/lazy-loading-pitfalls.md +0 -205
- package/skills/cometchat-angular-calls/references/migration-v4-to-v5.md +0 -53
- package/skills/cometchat-angular-calls/references/ngzone-and-async-callbacks.md +0 -184
- package/skills/cometchat-angular-calls/references/picture-in-picture.md +0 -285
- package/skills/cometchat-angular-calls/references/raise-hand.md +0 -172
- package/skills/cometchat-angular-calls/references/recording-screen-share.md +0 -260
- package/skills/cometchat-angular-calls/references/ringing-integration.md +0 -133
- package/skills/cometchat-angular-calls/references/server-web-push-vapid.md +0 -100
- package/skills/cometchat-angular-calls/references/share-invite.md +0 -122
- package/skills/cometchat-angular-calls/references/virtual-background.md +0 -29
- package/skills/cometchat-angular-components/SKILL.md +0 -235
- package/skills/cometchat-angular-core/SKILL.md +0 -386
- package/skills/cometchat-angular-customization/SKILL.md +0 -616
- package/skills/cometchat-angular-features/SKILL.md +0 -329
- package/skills/cometchat-angular-patterns/SKILL.md +0 -256
- package/skills/cometchat-angular-placement/SKILL.md +0 -314
- package/skills/cometchat-angular-production/SKILL.md +0 -564
- package/skills/cometchat-angular-push/SKILL.md +0 -389
- package/skills/cometchat-angular-testing/SKILL.md +0 -605
- package/skills/cometchat-angular-theming/SKILL.md +0 -290
- package/skills/cometchat-angular-troubleshooting/SKILL.md +0 -364
- package/skills/cometchat-astro-patterns/SKILL.md +0 -708
- package/skills/cometchat-calls/SKILL.md +0 -364
- package/skills/cometchat-calls/references/use-case-broadcast.md +0 -199
- package/skills/cometchat-calls/references/use-case-marketplace.md +0 -157
- package/skills/cometchat-calls/references/use-case-support.md +0 -189
- package/skills/cometchat-calls/references/use-case-team.md +0 -180
- package/skills/cometchat-calls/references/use-case-telehealth.md +0 -153
- package/skills/cometchat-components/SKILL.md +0 -1142
- package/skills/cometchat-core/SKILL.md +0 -1048
- package/skills/cometchat-customization/SKILL.md +0 -580
- package/skills/cometchat-customization/references/component-catalog.md +0 -236
- package/skills/cometchat-features/SKILL.md +0 -861
- package/skills/cometchat-flutter-v5/SKILL.md +0 -173
- package/skills/cometchat-flutter-v5-calls/SKILL.md +0 -455
- package/skills/cometchat-flutter-v5-calls/references/add-calls-to-existing-chat.md +0 -193
- package/skills/cometchat-flutter-v5-calls/references/call-layouts.md +0 -103
- package/skills/cometchat-flutter-v5-calls/references/call-session.md +0 -285
- package/skills/cometchat-flutter-v5-calls/references/device-management.md +0 -124
- package/skills/cometchat-flutter-v5-calls/references/group-calls.md +0 -181
- package/skills/cometchat-flutter-v5-calls/references/idle-timeout.md +0 -99
- package/skills/cometchat-flutter-v5-calls/references/in-call-chat.md +0 -135
- package/skills/cometchat-flutter-v5-calls/references/migration-v4-to-v5.md +0 -210
- package/skills/cometchat-flutter-v5-calls/references/raise-hand.md +0 -255
- package/skills/cometchat-flutter-v5-calls/references/ringing-integration.md +0 -196
- package/skills/cometchat-flutter-v5-calls/references/server-push-bridge.md +0 -101
- package/skills/cometchat-flutter-v5-calls/references/share-invite.md +0 -148
- package/skills/cometchat-flutter-v5-conversations/SKILL.md +0 -118
- package/skills/cometchat-flutter-v5-core/SKILL.md +0 -239
- package/skills/cometchat-flutter-v5-customization/SKILL.md +0 -358
- package/skills/cometchat-flutter-v5-events/SKILL.md +0 -156
- package/skills/cometchat-flutter-v5-messages/SKILL.md +0 -259
- package/skills/cometchat-flutter-v5-production/SKILL.md +0 -216
- package/skills/cometchat-flutter-v5-push/SKILL.md +0 -285
- package/skills/cometchat-flutter-v5-testing/SKILL.md +0 -401
- package/skills/cometchat-flutter-v5-theming/SKILL.md +0 -161
- package/skills/cometchat-flutter-v5-troubleshooting/SKILL.md +0 -130
- package/skills/cometchat-flutter-v5-users-groups/SKILL.md +0 -152
- package/skills/cometchat-flutter-v6/SKILL.md +0 -446
- package/skills/cometchat-flutter-v6-calls/references/add-calls-to-existing-chat.md +0 -136
- package/skills/cometchat-flutter-v6-calls/references/advanced-features.md +0 -89
- package/skills/cometchat-flutter-v6-calls/references/call-layouts.md +0 -105
- package/skills/cometchat-flutter-v6-calls/references/call-session.md +0 -229
- package/skills/cometchat-flutter-v6-calls/references/device-management.md +0 -105
- package/skills/cometchat-flutter-v6-calls/references/group-calls.md +0 -190
- package/skills/cometchat-flutter-v6-calls/references/idle-timeout.md +0 -88
- package/skills/cometchat-flutter-v6-calls/references/in-call-chat.md +0 -125
- package/skills/cometchat-flutter-v6-calls/references/raise-hand.md +0 -275
- package/skills/cometchat-flutter-v6-calls/references/ringing-integration.md +0 -171
- package/skills/cometchat-flutter-v6-calls/references/server-push-bridge.md +0 -93
- package/skills/cometchat-flutter-v6-calls/references/share-invite.md +0 -102
- package/skills/cometchat-flutter-v6-conversations/SKILL.md +0 -238
- package/skills/cometchat-flutter-v6-messages/SKILL.md +0 -384
- package/skills/cometchat-flutter-v6-theming/SKILL.md +0 -293
- package/skills/cometchat-flutter-v6-users-groups/SKILL.md +0 -224
- package/skills/cometchat-i18n/SKILL.md +0 -419
- package/skills/cometchat-ios/SKILL.md +0 -325
- package/skills/cometchat-ios-calls/references/add-calls-to-existing-chat.md +0 -181
- package/skills/cometchat-ios-calls/references/audio-modes-and-controls.md +0 -45
- package/skills/cometchat-ios-calls/references/avaudiosession-routing.md +0 -188
- package/skills/cometchat-ios-calls/references/call-layouts.md +0 -76
- package/skills/cometchat-ios-calls/references/call-session.md +0 -218
- package/skills/cometchat-ios-calls/references/callkit-and-pushkit.md +0 -357
- package/skills/cometchat-ios-calls/references/custom-ui.md +0 -322
- package/skills/cometchat-ios-calls/references/device-management.md +0 -171
- package/skills/cometchat-ios-calls/references/group-calls.md +0 -359
- package/skills/cometchat-ios-calls/references/idle-timeout.md +0 -184
- package/skills/cometchat-ios-calls/references/in-call-chat.md +0 -179
- package/skills/cometchat-ios-calls/references/migration-v4-to-v5.md +0 -196
- package/skills/cometchat-ios-calls/references/picture-in-picture.md +0 -246
- package/skills/cometchat-ios-calls/references/raise-hand.md +0 -26
- package/skills/cometchat-ios-calls/references/recording-screen-share.md +0 -252
- package/skills/cometchat-ios-calls/references/ringing-integration.md +0 -143
- package/skills/cometchat-ios-calls/references/server-apns-pushkit.md +0 -267
- package/skills/cometchat-ios-calls/references/share-invite.md +0 -148
- package/skills/cometchat-ios-calls/references/swiftui-uikit-hosting.md +0 -246
- package/skills/cometchat-ios-calls/references/voip-cert-setup.md +0 -166
- package/skills/cometchat-ios-production/SKILL.md +0 -738
- package/skills/cometchat-ios-testing/SKILL.md +0 -376
- package/skills/cometchat-ios-theming/SKILL.md +0 -667
- package/skills/cometchat-ios-troubleshooting/SKILL.md +0 -1003
- package/skills/cometchat-native-bare-patterns/SKILL.md +0 -550
- package/skills/cometchat-native-calls/SKILL.md +0 -671
- package/skills/cometchat-native-calls/references/add-calls-to-existing-chat.md +0 -203
- package/skills/cometchat-native-calls/references/call-layouts.md +0 -125
- package/skills/cometchat-native-calls/references/call-session.md +0 -182
- package/skills/cometchat-native-calls/references/custom-ui.md +0 -254
- package/skills/cometchat-native-calls/references/device-management.md +0 -158
- package/skills/cometchat-native-calls/references/expo-vs-bare.md +0 -179
- package/skills/cometchat-native-calls/references/group-calls.md +0 -296
- package/skills/cometchat-native-calls/references/idle-timeout.md +0 -128
- package/skills/cometchat-native-calls/references/in-call-chat.md +0 -145
- package/skills/cometchat-native-calls/references/migration-v4-to-v5.md +0 -72
- package/skills/cometchat-native-calls/references/picture-in-picture.md +0 -276
- package/skills/cometchat-native-calls/references/raise-hand.md +0 -205
- package/skills/cometchat-native-calls/references/recording-screen-share.md +0 -169
- package/skills/cometchat-native-calls/references/ringing-integration.md +0 -118
- package/skills/cometchat-native-calls/references/server-push-bridge.md +0 -135
- package/skills/cometchat-native-calls/references/server-push-payloads.md +0 -193
- package/skills/cometchat-native-calls/references/share-invite.md +0 -146
- package/skills/cometchat-native-calls/references/voip-push-end-to-end.md +0 -319
- package/skills/cometchat-native-components/SKILL.md +0 -628
- package/skills/cometchat-native-core/SKILL.md +0 -679
- package/skills/cometchat-native-customization/SKILL.md +0 -716
- package/skills/cometchat-native-expo-patterns/SKILL.md +0 -552
- package/skills/cometchat-native-features/SKILL.md +0 -638
- package/skills/cometchat-native-placement/SKILL.md +0 -509
- package/skills/cometchat-native-production/SKILL.md +0 -700
- package/skills/cometchat-native-push/SKILL.md +0 -594
- package/skills/cometchat-native-testing/SKILL.md +0 -582
- package/skills/cometchat-native-theming/SKILL.md +0 -681
- package/skills/cometchat-native-troubleshooting/SKILL.md +0 -501
- package/skills/cometchat-nextjs-patterns/SKILL.md +0 -899
- package/skills/cometchat-placement/SKILL.md +0 -1360
- package/skills/cometchat-production/SKILL.md +0 -1027
- package/skills/cometchat-react-calls/SKILL.md +0 -752
- package/skills/cometchat-react-calls/references/add-calls-to-existing-chat.md +0 -146
- package/skills/cometchat-react-calls/references/call-layouts.md +0 -160
- package/skills/cometchat-react-calls/references/call-session.md +0 -235
- package/skills/cometchat-react-calls/references/custom-ui.md +0 -247
- package/skills/cometchat-react-calls/references/device-management.md +0 -210
- package/skills/cometchat-react-calls/references/group-calls.md +0 -257
- package/skills/cometchat-react-calls/references/idle-timeout.md +0 -188
- package/skills/cometchat-react-calls/references/in-call-chat.md +0 -212
- package/skills/cometchat-react-calls/references/migration-v4-to-v5.md +0 -170
- package/skills/cometchat-react-calls/references/picture-in-picture.md +0 -245
- package/skills/cometchat-react-calls/references/raise-hand.md +0 -238
- package/skills/cometchat-react-calls/references/recording-screen-share.md +0 -144
- package/skills/cometchat-react-calls/references/ringing-integration.md +0 -255
- package/skills/cometchat-react-calls/references/server-web-push-vapid.md +0 -241
- package/skills/cometchat-react-calls/references/share-invite.md +0 -175
- package/skills/cometchat-react-calls/references/testing-calls-on-web.md +0 -216
- package/skills/cometchat-react-calls/references/virtual-background.md +0 -32
- package/skills/cometchat-react-calls/references/voip-and-web-push.md +0 -165
- package/skills/cometchat-react-patterns/SKILL.md +0 -628
- package/skills/cometchat-react-push/SKILL.md +0 -634
- package/skills/cometchat-react-router-patterns/SKILL.md +0 -758
- package/skills/cometchat-react-testing/SKILL.md +0 -413
- package/skills/cometchat-theming/SKILL.md +0 -498
- package/skills/cometchat-troubleshooting/SKILL.md +0 -294
|
@@ -1,899 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: cometchat-nextjs-patterns
|
|
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
|
-
license: "MIT"
|
|
5
|
-
compatibility: "Node.js >=18; React >=18; Next.js >=13; @cometchat/chat-uikit-react ^6; @cometchat/chat-sdk-javascript ^4"
|
|
6
|
-
metadata:
|
|
7
|
-
author: "CometChat"
|
|
8
|
-
version: "3.0.0"
|
|
9
|
-
tags: "chat cometchat nextjs next react ssr app-router pages-router patterns"
|
|
10
|
-
---
|
|
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
|
-
|
|
14
|
-
## Purpose
|
|
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.
|
|
17
|
-
|
|
18
|
-
**Read these companion skills first:**
|
|
19
|
-
- `cometchat-core` -- initialization, login, CSS, provider pattern, anti-patterns
|
|
20
|
-
- `cometchat-components` -- component catalog and composition patterns
|
|
21
|
-
- `cometchat-placement` -- WHERE to put chat (route, modal, drawer, embedded)
|
|
22
|
-
|
|
23
|
-
This skill covers the HOW for Next.js specifically.
|
|
24
|
-
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-
## 1. Project detection
|
|
28
|
-
|
|
29
|
-
A project uses Next.js when `package.json` has `next` as a dependency.
|
|
30
|
-
|
|
31
|
-
### Detecting App Router vs Pages Router
|
|
32
|
-
|
|
33
|
-
Both may coexist in a project. Check which is primary:
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
# App Router: look for app/ directory with layout.tsx
|
|
37
|
-
ls app/layout.tsx app/layout.jsx 2>/dev/null
|
|
38
|
-
|
|
39
|
-
# Pages Router: look for pages/ directory with _app.tsx
|
|
40
|
-
ls pages/_app.tsx pages/_app.jsx pages/_app.js 2>/dev/null
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
**If `app/layout.tsx` exists, treat the project as App Router.** Even if `pages/` also exists, App Router is the primary routing mechanism in modern Next.js.
|
|
44
|
-
|
|
45
|
-
**If only `pages/` exists, treat the project as Pages Router.**
|
|
46
|
-
|
|
47
|
-
---
|
|
48
|
-
|
|
49
|
-
## 2. Critical: SSR prevention
|
|
50
|
-
|
|
51
|
-
**Every file that imports from `@cometchat/chat-uikit-react` MUST prevent server-side rendering.** CometChat components access `window`, `document`, and WebSocket APIs during import -- not just during render, but at import time. If Next.js tries to import these modules on the server, the build crashes with `ReferenceError: window is not defined`.
|
|
52
|
-
|
|
53
|
-
### App Router: "use client" directive
|
|
54
|
-
|
|
55
|
-
Add `"use client"` as the FIRST line of every file that imports CometChat:
|
|
56
|
-
|
|
57
|
-
```tsx
|
|
58
|
-
"use client";
|
|
59
|
-
|
|
60
|
-
import { CometChatConversations } from "@cometchat/chat-uikit-react";
|
|
61
|
-
// This file only runs in the browser
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
**Common mistake:** Putting `"use client"` AFTER imports. It must be the very first line, before any import statements.
|
|
65
|
-
|
|
66
|
-
```tsx
|
|
67
|
-
// WRONG -- "use client" is not the first line
|
|
68
|
-
import React from "react";
|
|
69
|
-
"use client"; // too late, has no effect
|
|
70
|
-
|
|
71
|
-
// CORRECT
|
|
72
|
-
"use client";
|
|
73
|
-
import React from "react";
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
### App Router: dynamic import from a Client Component (Next.js 15+ rule)
|
|
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.
|
|
79
|
-
|
|
80
|
-
```tsx
|
|
81
|
-
// app/messages/page.tsx
|
|
82
|
-
"use client"; // ← REQUIRED in Next.js 15+ when using `dynamic({ ssr: false })`
|
|
83
|
-
import dynamic from "next/dynamic";
|
|
84
|
-
|
|
85
|
-
const ChatView = dynamic(() => import("../../components/ChatView"), {
|
|
86
|
-
ssr: false,
|
|
87
|
-
loading: () => <div>Loading chat...</div>,
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
export default function MessagesPage() {
|
|
91
|
-
return <ChatView />;
|
|
92
|
-
}
|
|
93
|
-
```
|
|
94
|
-
|
|
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.
|
|
100
|
-
|
|
101
|
-
### Pages Router: dynamic import
|
|
102
|
-
|
|
103
|
-
In the Pages Router, every page can potentially run on the server. Use `next/dynamic`:
|
|
104
|
-
|
|
105
|
-
```tsx
|
|
106
|
-
// pages/messages.tsx
|
|
107
|
-
import dynamic from "next/dynamic";
|
|
108
|
-
|
|
109
|
-
const ChatView = dynamic(() => import("../components/ChatView"), {
|
|
110
|
-
ssr: false,
|
|
111
|
-
loading: () => <div>Loading chat...</div>,
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
export default function MessagesPage() {
|
|
115
|
-
return <ChatView />;
|
|
116
|
-
}
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
---
|
|
120
|
-
|
|
121
|
-
## 3. CometChatProvider for Next.js (App Router)
|
|
122
|
-
|
|
123
|
-
### Full implementation
|
|
124
|
-
|
|
125
|
-
```tsx
|
|
126
|
-
// app/providers/CometChatProvider.tsx
|
|
127
|
-
"use client";
|
|
128
|
-
|
|
129
|
-
import React, { useEffect, useState, createContext, useContext } from "react";
|
|
130
|
-
import { CometChatUIKit, UIKitSettingsBuilder } from "@cometchat/chat-uikit-react";
|
|
131
|
-
|
|
132
|
-
interface CometChatContextValue {
|
|
133
|
-
isReady: boolean;
|
|
134
|
-
error: string | null;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
const CometChatContext = createContext<CometChatContextValue>({
|
|
138
|
-
isReady: false,
|
|
139
|
-
error: null,
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
export const useCometChat = () => useContext(CometChatContext);
|
|
143
|
-
|
|
144
|
-
// Module-level state prevents both double-init AND double-login in React
|
|
145
|
-
// StrictMode. Without the loginInFlight guard, a second mount calls
|
|
146
|
-
// login() while the first is still pending and the SDK throws
|
|
147
|
-
// "Please wait until the previous login request ends."
|
|
148
|
-
let initialized = false;
|
|
149
|
-
let loginInFlight: Promise<unknown> | null = null;
|
|
150
|
-
|
|
151
|
-
async function ensureLoggedIn(
|
|
152
|
-
uid: string,
|
|
153
|
-
authToken?: string,
|
|
154
|
-
): Promise<void> {
|
|
155
|
-
const existing = await CometChatUIKit.getLoggedinUser();
|
|
156
|
-
if (existing) return;
|
|
157
|
-
if (loginInFlight) {
|
|
158
|
-
await loginInFlight;
|
|
159
|
-
return;
|
|
160
|
-
}
|
|
161
|
-
loginInFlight = authToken
|
|
162
|
-
? CometChatUIKit.loginWithAuthToken(authToken)
|
|
163
|
-
: CometChatUIKit.login(uid);
|
|
164
|
-
try {
|
|
165
|
-
await loginInFlight;
|
|
166
|
-
} finally {
|
|
167
|
-
loginInFlight = null;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
interface CometChatProviderProps {
|
|
172
|
-
children: React.ReactNode;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
export function CometChatProvider({ children }: CometChatProviderProps) {
|
|
176
|
-
const [isReady, setIsReady] = useState(false);
|
|
177
|
-
const [error, setError] = useState<string | null>(null);
|
|
178
|
-
|
|
179
|
-
useEffect(() => {
|
|
180
|
-
async function setup() {
|
|
181
|
-
try {
|
|
182
|
-
if (!initialized) {
|
|
183
|
-
initialized = true;
|
|
184
|
-
|
|
185
|
-
const settings = new UIKitSettingsBuilder()
|
|
186
|
-
.setAppId(process.env.NEXT_PUBLIC_COMETCHAT_APP_ID!)
|
|
187
|
-
.setRegion(process.env.NEXT_PUBLIC_COMETCHAT_REGION!)
|
|
188
|
-
.setAuthKey(process.env.NEXT_PUBLIC_COMETCHAT_AUTH_KEY!)
|
|
189
|
-
.subscribePresenceForAllUsers()
|
|
190
|
-
.build();
|
|
191
|
-
|
|
192
|
-
await CometChatUIKit.init(settings);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
await ensureLoggedIn("cometchat-uid-1"); // DEVELOPMENT ONLY — see cometchat-production skill
|
|
196
|
-
|
|
197
|
-
setIsReady(true);
|
|
198
|
-
} catch (e) {
|
|
199
|
-
setError(formatCometChatError(e)); // from cometchat-core §6 errors.ts — NOT String(e),
|
|
200
|
-
// which renders "[object Object]" on kit errors (ENG-35719)
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
setup();
|
|
205
|
-
}, []);
|
|
206
|
-
|
|
207
|
-
if (error) {
|
|
208
|
-
return (
|
|
209
|
-
<div style={{ color: "red", padding: 16, fontFamily: "monospace" }}>
|
|
210
|
-
CometChat Error: {error}
|
|
211
|
-
</div>
|
|
212
|
-
);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
if (!isReady) return null;
|
|
216
|
-
|
|
217
|
-
return (
|
|
218
|
-
<CometChatContext.Provider value={{ isReady, error }}>
|
|
219
|
-
{children}
|
|
220
|
-
</CometChatContext.Provider>
|
|
221
|
-
);
|
|
222
|
-
}
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
### Where to mount: Option A -- Global (chat available everywhere)
|
|
226
|
-
|
|
227
|
-
Wrap the entire app in `app/layout.tsx`. The layout itself is a Server Component, but the provider is a Client Component via `"use client"` in its file:
|
|
228
|
-
|
|
229
|
-
```tsx
|
|
230
|
-
// app/layout.tsx (Server Component)
|
|
231
|
-
import { CometChatProvider } from "./providers/CometChatProvider";
|
|
232
|
-
import "./globals.css";
|
|
233
|
-
|
|
234
|
-
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
235
|
-
return (
|
|
236
|
-
<html lang="en">
|
|
237
|
-
<body>
|
|
238
|
-
<CometChatProvider>
|
|
239
|
-
{children}
|
|
240
|
-
</CometChatProvider>
|
|
241
|
-
</body>
|
|
242
|
-
</html>
|
|
243
|
-
);
|
|
244
|
-
}
|
|
245
|
-
```
|
|
246
|
-
|
|
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.
|
|
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
|
-
|
|
256
|
-
### Where to mount: Option B -- Scoped (chat only on chat routes)
|
|
257
|
-
|
|
258
|
-
Use a route group to scope the provider to chat-related routes:
|
|
259
|
-
|
|
260
|
-
```
|
|
261
|
-
app/
|
|
262
|
-
layout.tsx <-- no CometChat here
|
|
263
|
-
page.tsx <-- home page, no chat overhead
|
|
264
|
-
(chat)/
|
|
265
|
-
layout.tsx <-- CometChatProvider wraps only this group
|
|
266
|
-
messages/
|
|
267
|
-
page.tsx <-- chat page
|
|
268
|
-
inbox/
|
|
269
|
-
page.tsx <-- another chat page
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
```tsx
|
|
273
|
-
// app/(chat)/layout.tsx
|
|
274
|
-
import { CometChatProvider } from "../providers/CometChatProvider";
|
|
275
|
-
|
|
276
|
-
export default function ChatLayout({ children }: { children: React.ReactNode }) {
|
|
277
|
-
return <CometChatProvider>{children}</CometChatProvider>;
|
|
278
|
-
}
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
Option B is better for performance: CometChat's SDK and WebSocket connection are only loaded when the user visits a chat route. Option A is simpler and ensures incoming call notifications work everywhere.
|
|
282
|
-
|
|
283
|
-
---
|
|
284
|
-
|
|
285
|
-
## 4. CometChatProvider for Next.js (Pages Router)
|
|
286
|
-
|
|
287
|
-
In the Pages Router, mount the provider in `_app.tsx`. Use dynamic import to prevent SSR:
|
|
288
|
-
|
|
289
|
-
```tsx
|
|
290
|
-
// pages/_app.tsx
|
|
291
|
-
import type { AppProps } from "next/app";
|
|
292
|
-
import dynamic from "next/dynamic";
|
|
293
|
-
import "../styles/globals.css";
|
|
294
|
-
|
|
295
|
-
const CometChatProvider = dynamic(
|
|
296
|
-
() => import("../components/CometChatProvider").then((mod) => mod.CometChatProvider),
|
|
297
|
-
{ ssr: false }
|
|
298
|
-
);
|
|
299
|
-
|
|
300
|
-
export default function App({ Component, pageProps }: AppProps) {
|
|
301
|
-
return (
|
|
302
|
-
<CometChatProvider>
|
|
303
|
-
<Component {...pageProps} />
|
|
304
|
-
</CometChatProvider>
|
|
305
|
-
);
|
|
306
|
-
}
|
|
307
|
-
```
|
|
308
|
-
|
|
309
|
-
The provider implementation is the same as section 3, but the file lives at `components/CometChatProvider.tsx` (no `"use client"` needed in Pages Router -- `ssr: false` handles SSR prevention).
|
|
310
|
-
|
|
311
|
-
---
|
|
312
|
-
|
|
313
|
-
## 5. Route placement (App Router)
|
|
314
|
-
|
|
315
|
-
Next.js App Router uses file-system routing. Creating a file at the right path automatically creates the route.
|
|
316
|
-
|
|
317
|
-
### Create the chat page
|
|
318
|
-
|
|
319
|
-
```tsx
|
|
320
|
-
// app/messages/page.tsx
|
|
321
|
-
"use client";
|
|
322
|
-
|
|
323
|
-
import { useState } from "react";
|
|
324
|
-
import {
|
|
325
|
-
CometChatConversations,
|
|
326
|
-
CometChatMessageHeader,
|
|
327
|
-
CometChatMessageList,
|
|
328
|
-
CometChatMessageComposer,
|
|
329
|
-
} from "@cometchat/chat-uikit-react";
|
|
330
|
-
import { CometChat } from "@cometchat/chat-sdk-javascript";
|
|
331
|
-
|
|
332
|
-
export default function MessagesPage() {
|
|
333
|
-
const [selectedUser, setSelectedUser] = useState<CometChat.User>();
|
|
334
|
-
const [selectedGroup, setSelectedGroup] = useState<CometChat.Group>();
|
|
335
|
-
|
|
336
|
-
function handleConversationClick(conversation: CometChat.Conversation) {
|
|
337
|
-
const entity = conversation.getConversationWith();
|
|
338
|
-
if (entity instanceof CometChat.User) {
|
|
339
|
-
setSelectedUser(entity);
|
|
340
|
-
setSelectedGroup(undefined);
|
|
341
|
-
} else if (entity instanceof CometChat.Group) {
|
|
342
|
-
setSelectedUser(undefined);
|
|
343
|
-
setSelectedGroup(entity);
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
return (
|
|
348
|
-
<div style={{ display: "flex", height: "100vh" }}>
|
|
349
|
-
<div style={{ width: "360px", borderRight: "1px solid #eee" }}>
|
|
350
|
-
<CometChatConversations onItemClick={handleConversationClick} />
|
|
351
|
-
</div>
|
|
352
|
-
<div style={{ flex: 1, display: "flex", flexDirection: "column" }}>
|
|
353
|
-
{(selectedUser || selectedGroup) ? (
|
|
354
|
-
<>
|
|
355
|
-
{selectedUser && <CometChatMessageHeader user={selectedUser} />}
|
|
356
|
-
{selectedGroup && <CometChatMessageHeader group={selectedGroup} />}
|
|
357
|
-
{selectedUser && <CometChatMessageList user={selectedUser} hideReplyInThreadOption={true} />}
|
|
358
|
-
{selectedGroup && <CometChatMessageList group={selectedGroup} hideReplyInThreadOption={true} />}
|
|
359
|
-
{selectedUser && <CometChatMessageComposer user={selectedUser} />}
|
|
360
|
-
{selectedGroup && <CometChatMessageComposer group={selectedGroup} />}
|
|
361
|
-
</>
|
|
362
|
-
) : (
|
|
363
|
-
<div style={{ flex: 1, display: "flex", alignItems: "center", justifyContent: "center", color: "#999" }}>
|
|
364
|
-
Select a conversation to start chatting
|
|
365
|
-
</div>
|
|
366
|
-
)}
|
|
367
|
-
</div>
|
|
368
|
-
</div>
|
|
369
|
-
);
|
|
370
|
-
}
|
|
371
|
-
```
|
|
372
|
-
|
|
373
|
-
This page is accessible at `/messages`. No router configuration needed -- Next.js handles it via the file system.
|
|
374
|
-
|
|
375
|
-
### Add a navigation link
|
|
376
|
-
|
|
377
|
-
Find the layout's nav component and add a link:
|
|
378
|
-
|
|
379
|
-
```tsx
|
|
380
|
-
import Link from "next/link";
|
|
381
|
-
|
|
382
|
-
// In the nav, alongside existing links:
|
|
383
|
-
<Link href="/messages">Messages</Link>
|
|
384
|
-
```
|
|
385
|
-
|
|
386
|
-
**Important:** Use Next.js's `<Link>` component (from `next/link`), not a plain `<a>` tag or React Router's `<Link>`. Next.js's Link handles client-side navigation and prefetching.
|
|
387
|
-
|
|
388
|
-
---
|
|
389
|
-
|
|
390
|
-
## 6. Route placement (Pages Router)
|
|
391
|
-
|
|
392
|
-
### Create the chat page
|
|
393
|
-
|
|
394
|
-
```tsx
|
|
395
|
-
// pages/messages.tsx
|
|
396
|
-
import dynamic from "next/dynamic";
|
|
397
|
-
|
|
398
|
-
const ChatView = dynamic(() => import("../components/ChatView"), {
|
|
399
|
-
ssr: false,
|
|
400
|
-
loading: () => (
|
|
401
|
-
<div style={{ display: "flex", alignItems: "center", justifyContent: "center", height: "100vh" }}>
|
|
402
|
-
Loading chat...
|
|
403
|
-
</div>
|
|
404
|
-
),
|
|
405
|
-
});
|
|
406
|
-
|
|
407
|
-
export default function MessagesPage() {
|
|
408
|
-
return <ChatView />;
|
|
409
|
-
}
|
|
410
|
-
```
|
|
411
|
-
|
|
412
|
-
The `ChatView` component contains the actual CometChat composition (see `cometchat-placement` for patterns). It is dynamically imported with `ssr: false` to prevent server rendering.
|
|
413
|
-
|
|
414
|
-
### ChatView implementation
|
|
415
|
-
|
|
416
|
-
```tsx
|
|
417
|
-
// components/ChatView.tsx
|
|
418
|
-
import { useState } from "react";
|
|
419
|
-
import {
|
|
420
|
-
CometChatConversations,
|
|
421
|
-
CometChatMessageHeader,
|
|
422
|
-
CometChatMessageList,
|
|
423
|
-
CometChatMessageComposer,
|
|
424
|
-
} from "@cometchat/chat-uikit-react";
|
|
425
|
-
import { CometChat } from "@cometchat/chat-sdk-javascript";
|
|
426
|
-
|
|
427
|
-
export default function ChatView() {
|
|
428
|
-
const [selectedUser, setSelectedUser] = useState<CometChat.User>();
|
|
429
|
-
const [selectedGroup, setSelectedGroup] = useState<CometChat.Group>();
|
|
430
|
-
|
|
431
|
-
function handleConversationClick(conversation: CometChat.Conversation) {
|
|
432
|
-
const entity = conversation.getConversationWith();
|
|
433
|
-
if (entity instanceof CometChat.User) {
|
|
434
|
-
setSelectedUser(entity);
|
|
435
|
-
setSelectedGroup(undefined);
|
|
436
|
-
} else if (entity instanceof CometChat.Group) {
|
|
437
|
-
setSelectedUser(undefined);
|
|
438
|
-
setSelectedGroup(entity);
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
return (
|
|
443
|
-
<div style={{ display: "flex", height: "100vh" }}>
|
|
444
|
-
<div style={{ width: "360px", borderRight: "1px solid #eee" }}>
|
|
445
|
-
<CometChatConversations onItemClick={handleConversationClick} />
|
|
446
|
-
</div>
|
|
447
|
-
<div style={{ flex: 1, display: "flex", flexDirection: "column" }}>
|
|
448
|
-
{selectedUser && (
|
|
449
|
-
<>
|
|
450
|
-
<CometChatMessageHeader user={selectedUser} />
|
|
451
|
-
<CometChatMessageList user={selectedUser} hideReplyInThreadOption={true} />
|
|
452
|
-
<CometChatMessageComposer user={selectedUser} />
|
|
453
|
-
</>
|
|
454
|
-
)}
|
|
455
|
-
{selectedGroup && (
|
|
456
|
-
<>
|
|
457
|
-
<CometChatMessageHeader group={selectedGroup} />
|
|
458
|
-
<CometChatMessageList group={selectedGroup} hideReplyInThreadOption={true} />
|
|
459
|
-
<CometChatMessageComposer group={selectedGroup} />
|
|
460
|
-
</>
|
|
461
|
-
)}
|
|
462
|
-
</div>
|
|
463
|
-
</div>
|
|
464
|
-
);
|
|
465
|
-
}
|
|
466
|
-
```
|
|
467
|
-
|
|
468
|
-
---
|
|
469
|
-
|
|
470
|
-
## 7. Modal/drawer placement
|
|
471
|
-
|
|
472
|
-
### App Router
|
|
473
|
-
|
|
474
|
-
Create a Client Component for the drawer:
|
|
475
|
-
|
|
476
|
-
```tsx
|
|
477
|
-
// components/ChatDrawer.tsx
|
|
478
|
-
"use client";
|
|
479
|
-
|
|
480
|
-
import { useEffect, useState } from "react";
|
|
481
|
-
import {
|
|
482
|
-
CometChatMessageHeader,
|
|
483
|
-
CometChatMessageList,
|
|
484
|
-
CometChatMessageComposer,
|
|
485
|
-
} from "@cometchat/chat-uikit-react";
|
|
486
|
-
import { CometChat } from "@cometchat/chat-sdk-javascript";
|
|
487
|
-
|
|
488
|
-
interface ChatDrawerProps {
|
|
489
|
-
isOpen: boolean;
|
|
490
|
-
onClose: () => void;
|
|
491
|
-
targetUserId?: string;
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
export function ChatDrawer({ isOpen, onClose, targetUserId }: ChatDrawerProps) {
|
|
495
|
-
const [user, setUser] = useState<CometChat.User>();
|
|
496
|
-
|
|
497
|
-
useEffect(() => {
|
|
498
|
-
if (!isOpen || !targetUserId) return;
|
|
499
|
-
CometChat.getUser(targetUserId).then(setUser);
|
|
500
|
-
}, [isOpen, targetUserId]);
|
|
501
|
-
|
|
502
|
-
if (!isOpen) return null;
|
|
503
|
-
|
|
504
|
-
return (
|
|
505
|
-
<>
|
|
506
|
-
<div onClick={onClose} style={{ position: "fixed", inset: 0, zIndex: 999, backgroundColor: "rgba(0,0,0,0.3)" }} />
|
|
507
|
-
<div style={{
|
|
508
|
-
position: "fixed", top: 0, right: 0, bottom: 0, width: "400px", zIndex: 1000,
|
|
509
|
-
backgroundColor: "#fff", boxShadow: "-4px 0 20px rgba(0,0,0,0.15)",
|
|
510
|
-
display: "flex", flexDirection: "column",
|
|
511
|
-
}}>
|
|
512
|
-
<div style={{ display: "flex", justifyContent: "space-between", padding: "12px", borderBottom: "1px solid #eee" }}>
|
|
513
|
-
<span style={{ fontWeight: 600 }}>Chat</span>
|
|
514
|
-
<button onClick={onClose} style={{ background: "none", border: "none", cursor: "pointer" }}>X</button>
|
|
515
|
-
</div>
|
|
516
|
-
{user && (
|
|
517
|
-
<>
|
|
518
|
-
<CometChatMessageHeader user={user} />
|
|
519
|
-
<div style={{ flex: 1, overflow: "hidden" }}>
|
|
520
|
-
<CometChatMessageList user={user} hideReplyInThreadOption={true} />
|
|
521
|
-
</div>
|
|
522
|
-
<CometChatMessageComposer user={user} />
|
|
523
|
-
</>
|
|
524
|
-
)}
|
|
525
|
-
</div>
|
|
526
|
-
</>
|
|
527
|
-
);
|
|
528
|
-
}
|
|
529
|
-
```
|
|
530
|
-
|
|
531
|
-
**Mounting the drawer:** The drawer component has `"use client"`, so it can be imported from either Server or Client Components. Import it in the layout or any page:
|
|
532
|
-
|
|
533
|
-
```tsx
|
|
534
|
-
// In a Server Component layout -- this works because ChatDrawer is "use client"
|
|
535
|
-
import { ChatDrawer } from "../components/ChatDrawer";
|
|
536
|
-
|
|
537
|
-
// But state management (isOpen) must be in a Client Component.
|
|
538
|
-
// Option 1: wrap in a small client component
|
|
539
|
-
// Option 2: use a client-side context for drawer state
|
|
540
|
-
```
|
|
541
|
-
|
|
542
|
-
For state lifting across the Server/Client boundary, create a small Client Component wrapper:
|
|
543
|
-
|
|
544
|
-
```tsx
|
|
545
|
-
// components/ChatDrawerTrigger.tsx
|
|
546
|
-
"use client";
|
|
547
|
-
|
|
548
|
-
import { useState } from "react";
|
|
549
|
-
import { ChatDrawer } from "./ChatDrawer";
|
|
550
|
-
|
|
551
|
-
export function ChatDrawerTrigger({ targetUserId }: { targetUserId: string }) {
|
|
552
|
-
const [isOpen, setIsOpen] = useState(false);
|
|
553
|
-
|
|
554
|
-
return (
|
|
555
|
-
<>
|
|
556
|
-
<button onClick={() => setIsOpen(true)}>Message</button>
|
|
557
|
-
<ChatDrawer isOpen={isOpen} onClose={() => setIsOpen(false)} targetUserId={targetUserId} />
|
|
558
|
-
</>
|
|
559
|
-
);
|
|
560
|
-
}
|
|
561
|
-
```
|
|
562
|
-
|
|
563
|
-
### Pages Router
|
|
564
|
-
|
|
565
|
-
Use `dynamic` import for the drawer/modal component:
|
|
566
|
-
|
|
567
|
-
```tsx
|
|
568
|
-
import dynamic from "next/dynamic";
|
|
569
|
-
|
|
570
|
-
const ChatDrawer = dynamic(() => import("../components/ChatDrawer").then(m => m.ChatDrawer), {
|
|
571
|
-
ssr: false,
|
|
572
|
-
});
|
|
573
|
-
```
|
|
574
|
-
|
|
575
|
-
See `cometchat-placement` for complete modal and drawer implementations.
|
|
576
|
-
|
|
577
|
-
---
|
|
578
|
-
|
|
579
|
-
## 8. API route for production auth
|
|
580
|
-
|
|
581
|
-
Next.js can serve as both frontend and backend. Use an API route to generate CometChat auth tokens server-side.
|
|
582
|
-
|
|
583
|
-
### App Router API route
|
|
584
|
-
|
|
585
|
-
```tsx
|
|
586
|
-
// app/api/cometchat-token/route.ts
|
|
587
|
-
import { NextRequest, NextResponse } from "next/server";
|
|
588
|
-
|
|
589
|
-
const COMETCHAT_APP_ID = process.env.COMETCHAT_APP_ID!; // server-only, no NEXT_PUBLIC_ prefix
|
|
590
|
-
const COMETCHAT_REGION = process.env.COMETCHAT_REGION!; // server-only
|
|
591
|
-
const COMETCHAT_AUTH_TOKEN = process.env.COMETCHAT_AUTH_TOKEN!; // server-only secret
|
|
592
|
-
|
|
593
|
-
export async function POST(request: NextRequest) {
|
|
594
|
-
try {
|
|
595
|
-
const { uid } = await request.json();
|
|
596
|
-
|
|
597
|
-
if (!uid || typeof uid !== "string") {
|
|
598
|
-
return NextResponse.json({ error: "uid is required" }, { status: 400 });
|
|
599
|
-
}
|
|
600
|
-
|
|
601
|
-
const response = await fetch(
|
|
602
|
-
`https://${COMETCHAT_APP_ID}.api-${COMETCHAT_REGION}.cometchat.io/v3/users/${uid}/auth_tokens`,
|
|
603
|
-
{
|
|
604
|
-
method: "POST",
|
|
605
|
-
headers: {
|
|
606
|
-
"Content-Type": "application/json",
|
|
607
|
-
apiKey: COMETCHAT_AUTH_TOKEN,
|
|
608
|
-
appId: COMETCHAT_APP_ID,
|
|
609
|
-
},
|
|
610
|
-
body: JSON.stringify({}),
|
|
611
|
-
}
|
|
612
|
-
);
|
|
613
|
-
|
|
614
|
-
if (!response.ok) {
|
|
615
|
-
const error = await response.text();
|
|
616
|
-
return NextResponse.json({ error }, { status: response.status });
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
const data = await response.json();
|
|
620
|
-
return NextResponse.json({ token: data.data.authToken });
|
|
621
|
-
} catch (error) {
|
|
622
|
-
return NextResponse.json({ error: String(error) }, { status: 500 });
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
```
|
|
626
|
-
|
|
627
|
-
### Pages Router API route
|
|
628
|
-
|
|
629
|
-
```tsx
|
|
630
|
-
// pages/api/cometchat-token.ts
|
|
631
|
-
import type { NextApiRequest, NextApiResponse } from "next";
|
|
632
|
-
|
|
633
|
-
const COMETCHAT_APP_ID = process.env.COMETCHAT_APP_ID!;
|
|
634
|
-
const COMETCHAT_REGION = process.env.COMETCHAT_REGION!;
|
|
635
|
-
const COMETCHAT_AUTH_TOKEN = process.env.COMETCHAT_AUTH_TOKEN!;
|
|
636
|
-
|
|
637
|
-
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
|
638
|
-
if (req.method !== "POST") {
|
|
639
|
-
return res.status(405).json({ error: "Method not allowed" });
|
|
640
|
-
}
|
|
641
|
-
|
|
642
|
-
try {
|
|
643
|
-
const { uid } = req.body;
|
|
644
|
-
|
|
645
|
-
if (!uid || typeof uid !== "string") {
|
|
646
|
-
return res.status(400).json({ error: "uid is required" });
|
|
647
|
-
}
|
|
648
|
-
|
|
649
|
-
const response = await fetch(
|
|
650
|
-
`https://${COMETCHAT_APP_ID}.api-${COMETCHAT_REGION}.cometchat.io/v3/users/${uid}/auth_tokens`,
|
|
651
|
-
{
|
|
652
|
-
method: "POST",
|
|
653
|
-
headers: {
|
|
654
|
-
"Content-Type": "application/json",
|
|
655
|
-
apiKey: COMETCHAT_AUTH_TOKEN,
|
|
656
|
-
appId: COMETCHAT_APP_ID,
|
|
657
|
-
},
|
|
658
|
-
body: JSON.stringify({}),
|
|
659
|
-
}
|
|
660
|
-
);
|
|
661
|
-
|
|
662
|
-
if (!response.ok) {
|
|
663
|
-
const error = await response.text();
|
|
664
|
-
return res.status(response.status).json({ error });
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
const data = await response.json();
|
|
668
|
-
return res.status(200).json({ token: data.data.authToken });
|
|
669
|
-
} catch (error) {
|
|
670
|
-
return res.status(500).json({ error: String(error) });
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
|
-
```
|
|
674
|
-
|
|
675
|
-
### Environment variables for the API route
|
|
676
|
-
|
|
677
|
-
Add server-only variables to `.env.local` (no `NEXT_PUBLIC_` prefix -- these must NOT be exposed to the browser):
|
|
678
|
-
|
|
679
|
-
```env
|
|
680
|
-
# .env.local -- server-only (no NEXT_PUBLIC_ prefix)
|
|
681
|
-
COMETCHAT_APP_ID=your_app_id
|
|
682
|
-
COMETCHAT_REGION=us
|
|
683
|
-
COMETCHAT_AUTH_TOKEN=your_server_auth_token
|
|
684
|
-
|
|
685
|
-
# Client-side (NEXT_PUBLIC_ prefix)
|
|
686
|
-
NEXT_PUBLIC_COMETCHAT_APP_ID=your_app_id
|
|
687
|
-
NEXT_PUBLIC_COMETCHAT_REGION=us
|
|
688
|
-
NEXT_PUBLIC_COMETCHAT_AUTH_KEY=your_client_auth_key
|
|
689
|
-
```
|
|
690
|
-
|
|
691
|
-
**Note:** `COMETCHAT_AUTH_TOKEN` (server secret) and `COMETCHAT_AUTH_KEY` (client key) are different values from the CometChat dashboard. The auth token has higher privileges. Never prefix it with `NEXT_PUBLIC_`.
|
|
692
|
-
|
|
693
|
-
---
|
|
694
|
-
|
|
695
|
-
## 9. Environment variables
|
|
696
|
-
|
|
697
|
-
### Next.js env var conventions
|
|
698
|
-
|
|
699
|
-
| Variable | Prefix | Accessible from | File |
|
|
700
|
-
|---|---|---|---|
|
|
701
|
-
| Client-side vars | `NEXT_PUBLIC_` | Browser + Server | `.env.local` |
|
|
702
|
-
| Server-only vars | None | Server only (API routes, Server Components) | `.env.local` |
|
|
703
|
-
|
|
704
|
-
### .env.local file
|
|
705
|
-
|
|
706
|
-
```env
|
|
707
|
-
NEXT_PUBLIC_COMETCHAT_APP_ID=your_app_id
|
|
708
|
-
NEXT_PUBLIC_COMETCHAT_REGION=us
|
|
709
|
-
NEXT_PUBLIC_COMETCHAT_AUTH_KEY=your_auth_key
|
|
710
|
-
```
|
|
711
|
-
|
|
712
|
-
**Access in client code:** `process.env.NEXT_PUBLIC_COMETCHAT_APP_ID`
|
|
713
|
-
|
|
714
|
-
**Important:** `.env.local` is gitignored by default in Next.js. Unlike Vite, you do not need to manually add it to `.gitignore`.
|
|
715
|
-
|
|
716
|
-
---
|
|
717
|
-
|
|
718
|
-
## 10. CSS import
|
|
719
|
-
|
|
720
|
-
### App Router
|
|
721
|
-
|
|
722
|
-
Import in `app/globals.css` or `app/layout.tsx`:
|
|
723
|
-
|
|
724
|
-
```css
|
|
725
|
-
/* app/globals.css */
|
|
726
|
-
@import "@cometchat/chat-uikit-react/css-variables.css";
|
|
727
|
-
|
|
728
|
-
/* your styles below */
|
|
729
|
-
```
|
|
730
|
-
|
|
731
|
-
Or as a JS import in the root layout:
|
|
732
|
-
|
|
733
|
-
```tsx
|
|
734
|
-
// app/layout.tsx
|
|
735
|
-
import "@cometchat/chat-uikit-react/css-variables.css";
|
|
736
|
-
import "./globals.css";
|
|
737
|
-
```
|
|
738
|
-
|
|
739
|
-
### Pages Router
|
|
740
|
-
|
|
741
|
-
Import in `pages/_app.tsx` or `styles/globals.css`:
|
|
742
|
-
|
|
743
|
-
```tsx
|
|
744
|
-
// pages/_app.tsx
|
|
745
|
-
import "@cometchat/chat-uikit-react/css-variables.css";
|
|
746
|
-
import "../styles/globals.css";
|
|
747
|
-
```
|
|
748
|
-
|
|
749
|
-
---
|
|
750
|
-
|
|
751
|
-
## 11. Common pitfalls
|
|
752
|
-
|
|
753
|
-
### Missing "use client"
|
|
754
|
-
|
|
755
|
-
**Symptom:** `ReferenceError: window is not defined` or `ReferenceError: document is not defined` during build or at runtime.
|
|
756
|
-
|
|
757
|
-
**Cause:** A file imports from `@cometchat/chat-uikit-react` without `"use client"` at the top. Next.js tries to render it on the server.
|
|
758
|
-
|
|
759
|
-
**Fix:** Add `"use client"` as the first line of the file.
|
|
760
|
-
|
|
761
|
-
### Server/client code mixing
|
|
762
|
-
|
|
763
|
-
**Symptom:** Build errors about `next/headers`, `cookies()`, or `generateMetadata` in the same file as CometChat imports.
|
|
764
|
-
|
|
765
|
-
**Cause:** Server-only APIs and client-only APIs cannot coexist in the same file. CometChat requires `"use client"`, but `next/headers` and `cookies()` are server-only.
|
|
766
|
-
|
|
767
|
-
**Fix:** Split the file. Keep server logic in a Server Component; keep CometChat in a separate `"use client"` component that the Server Component imports.
|
|
768
|
-
|
|
769
|
-
```tsx
|
|
770
|
-
// app/messages/page.tsx (Server Component -- does data fetching)
|
|
771
|
-
import { cookies } from "next/headers";
|
|
772
|
-
import dynamic from "next/dynamic";
|
|
773
|
-
|
|
774
|
-
const ChatView = dynamic(() => import("../../components/ChatView"), { ssr: false });
|
|
775
|
-
|
|
776
|
-
export default async function MessagesPage() {
|
|
777
|
-
const session = cookies().get("session"); // server-only
|
|
778
|
-
if (!session) redirect("/login");
|
|
779
|
-
|
|
780
|
-
return <ChatView />;
|
|
781
|
-
}
|
|
782
|
-
```
|
|
783
|
-
|
|
784
|
-
### Image optimization
|
|
785
|
-
|
|
786
|
-
CometChat renders avatars and media images via its own components. These do not conflict with `next/image`. Do not try to replace CometChat's internal images with `next/image` -- they are managed by the SDK.
|
|
787
|
-
|
|
788
|
-
### Middleware
|
|
789
|
-
|
|
790
|
-
CometChat has no middleware requirements. Do not add CometChat-related middleware. If the project has auth middleware (e.g., protecting routes), just ensure the chat route is behind the same auth as the rest of the app.
|
|
791
|
-
|
|
792
|
-
### ISR/SSG pages with chat
|
|
793
|
-
|
|
794
|
-
If a page uses static generation (`generateStaticParams`) or ISR, you can still add chat. Wrap the CometChat components in a Client Component. The page's static HTML ships without chat, and the Client Component hydrates and renders chat in the browser:
|
|
795
|
-
|
|
796
|
-
```tsx
|
|
797
|
-
// app/products/[id]/page.tsx
|
|
798
|
-
export async function generateStaticParams() {
|
|
799
|
-
// ... returns product IDs for static generation
|
|
800
|
-
}
|
|
801
|
-
|
|
802
|
-
export default async function ProductPage({ params }: { params: { id: string } }) {
|
|
803
|
-
const product = await getProduct(params.id);
|
|
804
|
-
|
|
805
|
-
return (
|
|
806
|
-
<div>
|
|
807
|
-
<h1>{product.name}</h1>
|
|
808
|
-
<p>{product.description}</p>
|
|
809
|
-
{/* ChatPanel is "use client" -- renders only in the browser */}
|
|
810
|
-
<ChatPanel targetUserId={product.sellerId} />
|
|
811
|
-
</div>
|
|
812
|
-
);
|
|
813
|
-
}
|
|
814
|
-
```
|
|
815
|
-
|
|
816
|
-
### Turbopack
|
|
817
|
-
|
|
818
|
-
Next.js's Turbopack (dev mode with `next dev --turbo`) works with CometChat. No special configuration needed. If you encounter issues, fall back to the standard Webpack dev server (`next dev` without `--turbo`).
|
|
819
|
-
|
|
820
|
-
### Pages Router: do NOT use CometChat from `getServerSideProps` / `getStaticProps` / `getInitialProps`
|
|
821
|
-
|
|
822
|
-
**Symptom:** `ReferenceError: window is not defined` or cryptic SDK errors during `next build` or page rendering.
|
|
823
|
-
|
|
824
|
-
**Cause:** The CometChat client SDK needs the browser (localStorage, WebSocket, etc.) and a logged-in user session. It cannot run inside `getServerSideProps`, `getStaticProps`, or `getInitialProps` — those execute on the Node.js server before the browser has hydrated.
|
|
825
|
-
|
|
826
|
-
**Fix:** Do chat-related work in client components only. If you need to pre-seed a conversation from server data, pass just the primitive IDs (user UID, group GUID) as page props and let the client component fetch the CometChat entity on mount:
|
|
827
|
-
|
|
828
|
-
```tsx
|
|
829
|
-
// pages/products/[id].tsx — server-side data fetch, no CometChat
|
|
830
|
-
export async function getServerSideProps({ params }) {
|
|
831
|
-
const product = await fetchProduct(params.id);
|
|
832
|
-
return { props: { product } }; // pass sellerId as string, not a CometChat.User
|
|
833
|
-
}
|
|
834
|
-
|
|
835
|
-
export default function ProductPage({ product }) {
|
|
836
|
-
return (
|
|
837
|
-
<>
|
|
838
|
-
<h1>{product.name}</h1>
|
|
839
|
-
<ChatWithSeller sellerUid={product.sellerId} /> {/* client component */}
|
|
840
|
-
</>
|
|
841
|
-
);
|
|
842
|
-
}
|
|
843
|
-
```
|
|
844
|
-
|
|
845
|
-
### Pages Router: `_document.tsx` doesn't need CometChat changes
|
|
846
|
-
|
|
847
|
-
If the project has a custom `pages/_document.tsx` for font preloading or third-party SSR CSS injection, leave it alone. CometChat CSS variables are client-side only — they don't need `_document.tsx` integration. Mount the CSS import in `_app.tsx` as shown in section 10; `_document.tsx` is the wrong layer.
|
|
848
|
-
|
|
849
|
-
---
|
|
850
|
-
|
|
851
|
-
## 12. Complete integration checklist (App Router)
|
|
852
|
-
|
|
853
|
-
1. Install packages: `npm install @cometchat/chat-uikit-react@^6 @cometchat/chat-sdk-javascript@^4` — **⚠️ keep the `@^6` major pin; never install bare.** v7 is on npm — a bare `npm install @cometchat/chat-uikit-react` pulls it once it's tagged `latest`, and these v6 skills break against the v7 API.
|
|
854
|
-
2. Create `.env.local` with `NEXT_PUBLIC_COMETCHAT_APP_ID`, `NEXT_PUBLIC_COMETCHAT_REGION`, `NEXT_PUBLIC_COMETCHAT_AUTH_KEY`
|
|
855
|
-
3. Import `@cometchat/chat-uikit-react/css-variables.css` in `app/globals.css`
|
|
856
|
-
4. Create `app/providers/CometChatProvider.tsx` with `"use client"` (section 3)
|
|
857
|
-
5. Mount `CometChatProvider` in `app/layout.tsx` wrapping `{children}`
|
|
858
|
-
6. Create `app/messages/page.tsx` with `"use client"` (section 5)
|
|
859
|
-
7. Add a `<Link href="/messages">Messages</Link>` to the layout's nav
|
|
860
|
-
8. Verify: `npm run build` should succeed without SSR errors
|
|
861
|
-
|
|
862
|
-
## 13. Complete integration checklist (Pages Router)
|
|
863
|
-
|
|
864
|
-
1. Install packages: `npm install @cometchat/chat-uikit-react@^6 @cometchat/chat-sdk-javascript@^4` — **⚠️ keep the `@^6` major pin; never install bare.** v7 is on npm — a bare `npm install @cometchat/chat-uikit-react` pulls it once it's tagged `latest`, and these v6 skills break against the v7 API.
|
|
865
|
-
2. Create `.env.local` with `NEXT_PUBLIC_COMETCHAT_APP_ID`, `NEXT_PUBLIC_COMETCHAT_REGION`, `NEXT_PUBLIC_COMETCHAT_AUTH_KEY`
|
|
866
|
-
3. Import `@cometchat/chat-uikit-react/css-variables.css` in `pages/_app.tsx`
|
|
867
|
-
4. Create `components/CometChatProvider.tsx` (section 3 code, without `"use client"`)
|
|
868
|
-
5. Dynamically import `CometChatProvider` in `pages/_app.tsx` with `ssr: false` (section 4)
|
|
869
|
-
6. Create `pages/messages.tsx` with dynamic import (section 6)
|
|
870
|
-
7. Add a `<Link href="/messages">Messages</Link>` to the layout's nav
|
|
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.
|