@cometchat/skills 4.4.2 → 5.0.1
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 +44 -0
- package/LICENSE +21 -0
- package/MIGRATING.md +187 -0
- package/README.md +52 -156
- package/RULES.md +125 -0
- package/bin/cometchat-skills.mjs +1280 -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 +156 -74
- package/peers.yaml +355 -0
- package/registry/README.md +31 -0
- package/registry/android-calls-v5.json +94 -0
- package/registry/android-v6.json +177 -0
- package/registry/angular-v5.json +154 -0
- package/registry/flutter-calls-v5.json +94 -0
- package/registry/flutter-v6.json +159 -0
- package/registry/ios-calls-v5.json +99 -0
- package/registry/ios-v5.json +152 -0
- package/registry/rn-calls-v5.json +99 -0
- package/registry/rn-v5.json +169 -0
- package/registry/sdk-android-v5.json +93 -0
- package/registry/sdk-jsv4.json +93 -0
- package/registry/web-calls-v5.json +94 -0
- package/registry/web-v7.json +154 -0
- package/skills/cometchat/SKILL.md +47 -2096
- package/skills/cometchat-a11y/SKILL.md +44 -472
- package/skills/cometchat-analytics/SKILL.md +61 -0
- 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 +41 -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 +102 -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-audit/SKILL.md +61 -0
- package/skills/cometchat-compliance/SKILL.md +63 -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 +132 -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 +59 -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-i18n/SKILL.md +35 -404
- 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 +182 -1068
- package/skills/cometchat-ios-core/references/anti-patterns.md +113 -0
- package/skills/cometchat-ios-core/references/docs-map.md +124 -0
- package/skills/cometchat-ios-core/references/install.md +23 -0
- package/skills/cometchat-ios-core/references/layout.md +219 -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-production/SKILL.md +67 -723
- package/skills/cometchat-ios-push/SKILL.md +24 -602
- package/skills/cometchat-ios-testing/SKILL.md +36 -355
- package/skills/cometchat-ios-troubleshooting/SKILL.md +31 -989
- 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-migrate-from-getstream/SKILL.md +65 -0
- package/skills/cometchat-migrate-from-getstream/references/concept-map.md +98 -0
- package/skills/cometchat-migrate-from-getstream/references/data-migration.md +74 -0
- package/skills/cometchat-migrate-from-getstream/references/feature-map.md +108 -0
- package/skills/cometchat-migrate-from-getstream/references/inventory.md +82 -0
- package/skills/cometchat-migrate-from-getstream/references/native-build.md +9 -0
- package/skills/cometchat-migrate-from-getstream/references/report-template.md +59 -0
- package/skills/cometchat-migrate-from-sendbird/SKILL.md +64 -0
- package/skills/cometchat-migrate-from-sendbird/references/concept-map.md +99 -0
- package/skills/cometchat-migrate-from-sendbird/references/data-migration.md +74 -0
- package/skills/cometchat-migrate-from-sendbird/references/feature-map.md +104 -0
- package/skills/cometchat-migrate-from-sendbird/references/inventory.md +86 -0
- package/skills/cometchat-migrate-from-sendbird/references/native-build.md +10 -0
- package/skills/cometchat-migrate-from-sendbird/references/report-template.md +59 -0
- package/skills/cometchat-migrate-from-twilio/SKILL.md +52 -0
- package/skills/cometchat-migrate-from-twilio/references/concept-map.md +49 -0
- package/skills/cometchat-migrate-from-twilio/references/data-migration.md +50 -0
- package/skills/cometchat-migrate-from-twilio/references/feature-map.md +27 -0
- package/skills/cometchat-migrate-from-twilio/references/inventory.md +53 -0
- package/skills/cometchat-migrate-from-twilio/references/report-template.md +52 -0
- package/skills/cometchat-moderation/SKILL.md +58 -0
- package/skills/cometchat-onboarding/SKILL.md +92 -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 +105 -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 +335 -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 +127 -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 +79 -0
- package/skills/cometchat-react-native-push/SKILL.md +88 -0
- package/skills/cometchat-react-native-sdk/SKILL.md +133 -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 +174 -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/layout.md +150 -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-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-production/SKILL.md +84 -0
- package/skills/cometchat-react-v7-push/SKILL.md +53 -0
- package/skills/cometchat-react-v7-testing/SKILL.md +60 -0
- package/skills/cometchat-react-v7-troubleshooting/SKILL.md +47 -0
- package/skills/cometchat-security/SKILL.md +80 -0
- package/skills/cometchat-self-host/SKILL.md +56 -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 +932 -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 +134 -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-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-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-theming/SKILL.md +0 -667
- 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,257 +0,0 @@
|
|
|
1
|
-
# Group calls — broadcast meeting pattern (web)
|
|
2
|
-
|
|
3
|
-
Group calls in CometChat use a **different signaling channel than 1:1 user calls**. The Ringing flow (Chat SDK `initiateCall` → `onIncomingCallReceived` on peer) fires for **1:1 user calls only**. For groups, the kit broadcasts a **custom message** of type `meeting` to the group; receivers see a "Join meeting" card in their message list (kit-based) OR need an explicit message listener (custom UI).
|
|
4
|
-
|
|
5
|
-
This is by-design kit behavior — not a bug. Documented across all platform kits.
|
|
6
|
-
|
|
7
|
-
**Canonical docs:** https://www.cometchat.com/docs/calls/javascript/group-calls
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Architecture
|
|
12
|
-
|
|
13
|
-
```
|
|
14
|
-
Caller (uid-A, member of group-X) CometChat Receivers (all other members of group-X)
|
|
15
|
-
│ │ │
|
|
16
|
-
│ <CometChatCallButtons group={x}> │ │
|
|
17
|
-
│ → CometChatUIKit.sendCustomMessage( │ │
|
|
18
|
-
│ CustomMessage(GUID, GROUP, │ │
|
|
19
|
-
│ "meeting", │ │
|
|
20
|
-
│ { callType, sessionId })) │ │
|
|
21
|
-
├─────────────────────────────────────────>│ │
|
|
22
|
-
│ │ onCustomMessageReceived │
|
|
23
|
-
│ ├─────────────────────────────>│ (each member's
|
|
24
|
-
│ │ │ MessageListener
|
|
25
|
-
│ │ │ fires if they're
|
|
26
|
-
│ │ │ in the group)
|
|
27
|
-
│ │ │
|
|
28
|
-
│ caller jumps straight to OngoingCall │ │
|
|
29
|
-
│ (joins session GUID directly) │ receiver taps "Join" │
|
|
30
|
-
│ │ → joinSession(GUID) │
|
|
31
|
-
│ CometChatCalls.joinSession(token, GUID) │ <─────────────────────────── │
|
|
32
|
-
├─────────────────────────────────────────>│ │
|
|
33
|
-
│ ───── WebRTC session active (sessionId = group GUID) ───── │
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
Key contrast with 1:1 ringing:
|
|
37
|
-
|
|
38
|
-
| Channel | 1:1 user calls | Group calls |
|
|
39
|
-
|---|---|---|
|
|
40
|
-
| Signaling API | `CometChat.initiateCall(call)` | `CometChatUIKit.sendCustomMessage(meetingMessage)` |
|
|
41
|
-
| Receiver event | `CallListener.onIncomingCallReceived` | `MessageListener.onCustomMessageReceived` (category=CATEGORY_CUSTOM + type="meeting") |
|
|
42
|
-
| Session ID | server-generated unique per call | the group's GUID |
|
|
43
|
-
| Ring/decline semantics | yes — `acceptCall` / `rejectCall` | no — receivers just tap to join (or ignore) |
|
|
44
|
-
| Auto-cancel timeout | yes (45s default) | no — meeting card persists in chat history |
|
|
45
|
-
|
|
46
|
-
---
|
|
47
|
-
|
|
48
|
-
## Hard rules
|
|
49
|
-
|
|
50
|
-
1. **Group calls broadcast a custom message; they do NOT use the call listener.** If your custom UI only registers `addCallListener`, group-call recipients will see NOTHING. Add a `MessageListener` that handles `category === CATEGORY_CUSTOM && type === 'meeting'`.
|
|
51
|
-
2. **The session ID equals the group's GUID** — not a generated unique ID like 1:1 calls. Anyone with the GUID can join the session at any time (it's persistent, not auto-cancelled).
|
|
52
|
-
3. **Anyone can join, including after the meeting started.** Late joiners are normal — the WebRTC session is open until all participants leave. UI must handle "joining an already-active meeting" as a valid state.
|
|
53
|
-
4. **Joining = `CometChatCalls.joinSession(token, sessionSettings, container)` with sessionId set to the group GUID.** Same `generateToken(sessionId)` step as 1:1 ringing — auth is internal after `CometChatCalls.login()`.
|
|
54
|
-
5. **No `CometChat.endCall(sessionId)` on the chat side for groups** — the meeting message is the persistent record, not a call entity. Each participant just calls `CometChatCalls.leaveSession()` when they hang up.
|
|
55
|
-
6. **`onCallEndedMessageReceived` does NOT fire for group sessions.** The session persists as long as anyone's in it. Use `CometChatCalls.OngoingCallListener.onCallEnded` to detect when YOUR client's session ends.
|
|
56
|
-
|
|
57
|
-
---
|
|
58
|
-
|
|
59
|
-
## Caller side — kit-based
|
|
60
|
-
|
|
61
|
-
If you're using `<CometChatMessageHeader>` + `<CometChatCallButtons>`, the kit handles everything:
|
|
62
|
-
|
|
63
|
-
```tsx
|
|
64
|
-
import { CometChatCallButtons } from "@cometchat/chat-uikit-react";
|
|
65
|
-
|
|
66
|
-
<CometChatCallButtons group={group} />
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
Tapping voice/video automatically:
|
|
70
|
-
1. Sends a `CustomMessage` of type `meeting` to the group
|
|
71
|
-
2. Opens `<CometChatOutgoingCall>` UI (which transitions to `<CometChatOngoingCall>`)
|
|
72
|
-
3. Joins the WebRTC session with `sessionId = group.getGuid()`
|
|
73
|
-
|
|
74
|
-
No additional code on the caller side.
|
|
75
|
-
|
|
76
|
-
## Caller side — custom UI
|
|
77
|
-
|
|
78
|
-
If you don't use kit components and want full control:
|
|
79
|
-
|
|
80
|
-
```ts
|
|
81
|
-
import { CometChat } from "@cometchat/chat-sdk-javascript";
|
|
82
|
-
import { CometChatCalls } from "@cometchat/calls-sdk-javascript";
|
|
83
|
-
|
|
84
|
-
async function startGroupCall(guid: string, callType: "audio" | "video") {
|
|
85
|
-
const loggedInUser = await CometChat.getLoggedInUser();
|
|
86
|
-
if (!loggedInUser) throw new Error("Not logged in");
|
|
87
|
-
|
|
88
|
-
// 1. Broadcast the meeting message to the group
|
|
89
|
-
const sessionId = guid; // group GUID becomes the session ID
|
|
90
|
-
const customData = { callType, sessionId };
|
|
91
|
-
const meetingMessage = new CometChat.CustomMessage(
|
|
92
|
-
guid,
|
|
93
|
-
CometChat.RECEIVER_TYPE.GROUP,
|
|
94
|
-
"meeting",
|
|
95
|
-
customData,
|
|
96
|
-
);
|
|
97
|
-
meetingMessage.setCategory(CometChat.CATEGORY_CUSTOM);
|
|
98
|
-
meetingMessage.setMetadata({
|
|
99
|
-
incrementUnreadCount: true,
|
|
100
|
-
pushNotification: "meeting",
|
|
101
|
-
...customData,
|
|
102
|
-
});
|
|
103
|
-
await CometChat.sendCustomMessage(meetingMessage);
|
|
104
|
-
|
|
105
|
-
// 2. Generate a call token + join the session
|
|
106
|
-
const authToken = loggedInUser.getAuthToken();
|
|
107
|
-
const { token: callToken } = await CometChatCalls.generateToken(sessionId);
|
|
108
|
-
|
|
109
|
-
// joinSession takes a SessionSettings OBJECT (NOT CallSettingsBuilder.build() —
|
|
110
|
-
// that CallSettings is for the deprecated startSession). Events come from the
|
|
111
|
-
// static addEventListener bus, not OngoingCallListener.
|
|
112
|
-
const settings = { sessionType: callType === "audio" ? "VOICE" : "VIDEO" };
|
|
113
|
-
const offClosed = CometChatCalls.addEventListener("onConnectionClosed", () => {
|
|
114
|
-
/* hangup UI */
|
|
115
|
-
});
|
|
116
|
-
// later, on teardown: offClosed();
|
|
117
|
-
|
|
118
|
-
// 3. Mount the WebRTC view into your container element
|
|
119
|
-
await CometChatCalls.joinSession(callToken, settings, containerElement);
|
|
120
|
-
}
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
The `meeting` message lands in the group's chat history immediately; other members get `onCustomMessageReceived` if they have a listener.
|
|
124
|
-
|
|
125
|
-
---
|
|
126
|
-
|
|
127
|
-
## Receiver side — kit-based (auto-renders meeting card)
|
|
128
|
-
|
|
129
|
-
If your app uses `<CometChatMessageList />` to render the group's messages, the kit auto-renders the meeting message as a **"Join meeting" card** with a tap target. No additional code needed:
|
|
130
|
-
|
|
131
|
-
```tsx
|
|
132
|
-
<CometChatMessageList group={group} />
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
When a user taps the meeting card, the kit:
|
|
136
|
-
1. Calls `CometChatCalls.generateToken(sessionId, authToken)`
|
|
137
|
-
2. Opens `<CometChatOngoingCall>` with `sessionID={group.getGuid()}`
|
|
138
|
-
3. Joins the WebRTC session
|
|
139
|
-
|
|
140
|
-
The receiver is now in the same WebRTC session as the caller (and any other members who joined).
|
|
141
|
-
|
|
142
|
-
## Receiver side — custom UI (needs a message listener)
|
|
143
|
-
|
|
144
|
-
If you DON'T use `<CometChatMessageList />` — e.g. you have a custom chat surface, OR you want incoming-meeting notifications globally — register a `MessageListener` and handle the meeting message yourself:
|
|
145
|
-
|
|
146
|
-
```ts
|
|
147
|
-
import { CometChat } from "@cometchat/chat-sdk-javascript";
|
|
148
|
-
|
|
149
|
-
const GROUP_MEETING_LISTENER_ID = "APP_GROUP_MEETING_LISTENER";
|
|
150
|
-
|
|
151
|
-
CometChat.addMessageListener(
|
|
152
|
-
GROUP_MEETING_LISTENER_ID,
|
|
153
|
-
new CometChat.MessageListener({
|
|
154
|
-
onCustomMessageReceived: (msg: CometChat.CustomMessage) => {
|
|
155
|
-
if (msg.getCategory() !== CometChat.CATEGORY_CUSTOM) return;
|
|
156
|
-
if (msg.getType() !== "meeting") return;
|
|
157
|
-
|
|
158
|
-
const customData = msg.getCustomData() as { callType?: "audio" | "video"; sessionId?: string };
|
|
159
|
-
const sessionId = customData.sessionId ?? msg.getReceiverId();
|
|
160
|
-
const callType = customData.callType ?? "video";
|
|
161
|
-
const fromUid = msg.getSender().getUid();
|
|
162
|
-
const groupGuid = msg.getReceiverId();
|
|
163
|
-
|
|
164
|
-
// Show YOUR group-call incoming UI here
|
|
165
|
-
// (e.g. toast notification with "Join" button, badge on the group, etc.)
|
|
166
|
-
showIncomingGroupCallUI({ sessionId, callType, fromUid, groupGuid });
|
|
167
|
-
},
|
|
168
|
-
}),
|
|
169
|
-
);
|
|
170
|
-
|
|
171
|
-
// On hangup or logout:
|
|
172
|
-
CometChat.removeMessageListener(GROUP_MEETING_LISTENER_ID);
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
Tap-to-join from your custom UI:
|
|
176
|
-
|
|
177
|
-
```ts
|
|
178
|
-
async function joinGroupCall(sessionId: string, callType: "audio" | "video", container: HTMLElement) {
|
|
179
|
-
const loggedInUser = await CometChat.getLoggedInUser();
|
|
180
|
-
const authToken = loggedInUser!.getAuthToken();
|
|
181
|
-
const { token: callToken } = await CometChatCalls.generateToken(sessionId);
|
|
182
|
-
|
|
183
|
-
// SessionSettings OBJECT for joinSession (not CallSettingsBuilder output).
|
|
184
|
-
const settings = { sessionType: callType === "audio" ? "VOICE" : "VIDEO" };
|
|
185
|
-
const offClosed = CometChatCalls.addEventListener("onConnectionClosed", () => {
|
|
186
|
-
/* hangup UI */
|
|
187
|
-
});
|
|
188
|
-
// later, on teardown: offClosed();
|
|
189
|
-
|
|
190
|
-
await CometChatCalls.joinSession(callToken, settings, container);
|
|
191
|
-
}
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
No `acceptCall` step — receivers just join the session. The meeting message remains in the chat history regardless of who joins.
|
|
195
|
-
|
|
196
|
-
---
|
|
197
|
-
|
|
198
|
-
## Edge cases
|
|
199
|
-
|
|
200
|
-
### Late joining
|
|
201
|
-
|
|
202
|
-
A meeting can be active for an hour before a member opens the app. The custom message persists in chat history; tapping the card joins the live session.
|
|
203
|
-
|
|
204
|
-
**UI implication:** the meeting card should reflect live state. Listen for `MessageListener.onCustomMessageReceived` to add new cards; poll or use presence to know if the session is currently active. There's no built-in "meeting is live" signal — apps typically render the card with a "Join meeting" CTA regardless and let the WebRTC layer fail gracefully if everyone has left.
|
|
205
|
-
|
|
206
|
-
### Cancelling / leaving
|
|
207
|
-
|
|
208
|
-
There's no "cancel the meeting" — the meeting message is permanent in chat history. Each participant leaves independently:
|
|
209
|
-
|
|
210
|
-
```ts
|
|
211
|
-
CometChatCalls.leaveSession(); // your local WebRTC session (v5 — endSession() is deprecated)
|
|
212
|
-
// No CometChat.endCall — meetings don't have a call entity.
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
If you want to mark a meeting as "ended" UX-wise, send a follow-up message (e.g. another custom message of type `meeting_ended`) and have the receiver UI update its cards based on it. Not built into the SDK.
|
|
216
|
-
|
|
217
|
-
### Push notifications
|
|
218
|
-
|
|
219
|
-
The meeting `CustomMessage` carries `metadata.pushNotification = "meeting"`. The CometChat push system can route this to a "meeting started in your group" push. Configure on the dashboard side under Notifications → Push Notification.
|
|
220
|
-
|
|
221
|
-
### Missed meetings
|
|
222
|
-
|
|
223
|
-
Since meetings don't ring, there's no "missed call" entity. If you want missed-meeting UI, derive it from message history: list meeting messages where the current user has NOT joined the session.
|
|
224
|
-
|
|
225
|
-
---
|
|
226
|
-
|
|
227
|
-
## Anti-patterns
|
|
228
|
-
|
|
229
|
-
1. **Registering only `addCallListener` and expecting group calls to ring.** They won't. Group calls fire `onCustomMessageReceived`, not `onIncomingCallReceived`. Always add both listeners if you support both 1:1 and group calling.
|
|
230
|
-
2. **Treating `sessionId` as ephemeral for groups.** It's the group GUID — persistent. Don't generate a new sessionId per group call; the kit uses the GUID intentionally so all joiners hit the same WebRTC session.
|
|
231
|
-
3. **Calling `CometChat.endCall(sessionId)` after a group hangup.** Meetings have no call entity to end; the API returns an error. Use `CometChatCalls.leaveSession()` (local) only.
|
|
232
|
-
4. **Using `acceptCall` / `rejectCall` on the meeting message.** Those only work on 1:1 call entities. For meetings, you just join (no accept) or ignore (no reject).
|
|
233
|
-
5. **Assuming all group members ring simultaneously.** Only members with an active `MessageListener` get `onCustomMessageReceived`. Offline members see the meeting card when they next open the group.
|
|
234
|
-
6. **Sending the meeting message without `metadata.pushNotification`.** Offline members won't get a push. The kit handles this for you when you use `<CometChatCallButtons>`; if you're building custom, copy the metadata pattern in §"Caller side — custom UI".
|
|
235
|
-
|
|
236
|
-
---
|
|
237
|
-
|
|
238
|
-
## Verification checklist
|
|
239
|
-
|
|
240
|
-
- [ ] If using kit components: `<CometChatCallButtons group={g}>` renders + tap initiates a meeting message
|
|
241
|
-
- [ ] If using custom caller UI: `CometChat.sendCustomMessage` is called with `type: "meeting"`, `category: CATEGORY_CUSTOM`, `customData: { callType, sessionId: groupGuid }`
|
|
242
|
-
- [ ] If using kit receiver: `<CometChatMessageList group={g}>` renders the meeting card with a "Join" button
|
|
243
|
-
- [ ] If using custom receiver: `addMessageListener` registers `onCustomMessageReceived` and filters by category + type
|
|
244
|
-
- [ ] On hangup, `CometChatCalls.leaveSession()` is called (NOT `CometChat.endCall`)
|
|
245
|
-
- [ ] Late-joining works — open app while meeting is live; tap card; join session
|
|
246
|
-
- [ ] Push notifications fire for offline group members (server-side configured)
|
|
247
|
-
- [ ] Both listeners (`addCallListener` + `addMessageListener`) wired if app supports both 1:1 and group calls
|
|
248
|
-
|
|
249
|
-
---
|
|
250
|
-
|
|
251
|
-
## Pointers
|
|
252
|
-
|
|
253
|
-
- `ringing-integration.md` — the 1:1 user-call flow (different channel — call listener, not message listener)
|
|
254
|
-
- `call-session.md` — pure session-mode (URL-based, no chat-side signaling at all)
|
|
255
|
-
- `cometchat-react-calls/SKILL.md` rule 1.7 — IncomingCall mount (1:1 only; group calls don't use this)
|
|
256
|
-
- Canonical docs: https://www.cometchat.com/docs/calls/javascript/group-calls
|
|
257
|
-
- Kit source (web React): `@cometchat/chat-uikit-react` → `src/components/Calling/CometChatCallButtons/CometChatCallButtons.tsx` (group call buttons send the `meeting` custom message)
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
# Idle timeout on web
|
|
2
|
-
|
|
3
|
-
Auto-ends calls where the local user is the only remaining participant. Two timers: a "you're alone, are you still there?" prompt fires after the first interval, then the session ends if the user doesn't respond before the second interval. SDK first-party — just two settings keys + one event.
|
|
4
|
-
|
|
5
|
-
**Canonical docs:** https://www.cometchat.com/docs/calls/javascript/idle-timeout
|
|
6
|
-
**Use it for:** any group call (preventing zombie sessions when everyone else hangs up), waiting rooms (auto-close empty rooms), classroom calls (instructor's screen doesn't stay live overnight).
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## SDK API
|
|
11
|
-
|
|
12
|
-
> ⚠️ **VALUES ARE IN MILLISECONDS.** `idleTimeoutPeriodBeforePrompt: 180` is **180 ms**, not 180 seconds — so the prompt fires the instant you join alone and the call exits in a fraction of a second (real customer bug, 2026-06). Always `* 1000`: 3 minutes = `180_000`.
|
|
13
|
-
|
|
14
|
-
Two equivalent ways to set it — **match whichever your join path uses:**
|
|
15
|
-
|
|
16
|
-
```ts
|
|
17
|
-
// (a) SessionSettings OBJECT — the session-mode path: joinSession(token, settings, container)
|
|
18
|
-
const settings = {
|
|
19
|
-
idleTimeoutPeriodBeforePrompt: 180_000, // 180s before the "still there?" prompt
|
|
20
|
-
idleTimeoutPeriodAfterPrompt: 60_000, // 60s grace (this is the SDK MINIMUM)
|
|
21
|
-
};
|
|
22
|
-
await CometChatCalls.joinSession(token, settings, containerRef.current);
|
|
23
|
-
|
|
24
|
-
// (b) Builder — the kit's callSettingsBuilder prop. ⚠️ The builder has ONLY a
|
|
25
|
-
// single .setIdleTimeoutPeriod(ms) — there are NO setIdleTimeoutPeriodBeforePrompt /
|
|
26
|
-
// setIdleTimeoutPeriodAfterPrompt builder methods. The before/after-prompt SPLIT
|
|
27
|
-
// exists only as the SessionSettings object fields in form (a) above.
|
|
28
|
-
const builder = new CometChatCalls.CallSettingsBuilder()
|
|
29
|
-
.setIdleTimeoutPeriod(180_000);
|
|
30
|
-
|
|
31
|
-
CometChatCalls.addEventListener("onSessionTimedOut", () => {
|
|
32
|
-
// Navigate away, show "session ended" UI
|
|
33
|
-
});
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
| Setting | Default | Min | Unit |
|
|
37
|
-
|---|---|---|---|
|
|
38
|
-
| `idleTimeoutPeriodBeforePrompt` | 60_000 (60s) | — (don't use 0 / tiny — instant prompt) | **milliseconds** |
|
|
39
|
-
| `idleTimeoutPeriodAfterPrompt` | 120_000 (120s) | **60_000 (60s)** — smaller is silently clamped to 60s | **milliseconds** |
|
|
40
|
-
|
|
41
|
-
The SDK shows the prompt overlay automatically (kit's default UI). For custom UI you handle the prompt yourself.
|
|
42
|
-
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
## Recommended timeouts per app archetype
|
|
46
|
-
|
|
47
|
-
| App | Before-prompt | After-prompt | Why |
|
|
48
|
-
|---|---|---|---|
|
|
49
|
-
| Marketplace 1:1 | 30s | 60s | Buyers lose interest fast; reclaim resources |
|
|
50
|
-
| Telehealth (provider waiting) | 5min | 5min | Patients run late; don't punish them |
|
|
51
|
-
| Classroom / instructor | 10min | 10min | Instructor may step away; don't interrupt class |
|
|
52
|
-
| Internal team meeting | 60s | 120s | Default — meetings end abruptly anyway |
|
|
53
|
-
| Customer support | 30s | 60s | Agent moves to next ticket; reclaim |
|
|
54
|
-
|
|
55
|
-
---
|
|
56
|
-
|
|
57
|
-
## Custom prompt UI (when default isn't enough)
|
|
58
|
-
|
|
59
|
-
The kit's default prompt is functional but plain. Custom UI uses `enableDefaultLayout(false)` + listens for the prompt internally — though the SDK doesn't expose a direct "prompt fired" event. Two patterns:
|
|
60
|
-
|
|
61
|
-
### Pattern A — Track time-since-alone yourself
|
|
62
|
-
|
|
63
|
-
```tsx
|
|
64
|
-
import { useEffect, useRef, useState } from "react";
|
|
65
|
-
import { CometChatCalls } from "@cometchat/calls-sdk-javascript";
|
|
66
|
-
|
|
67
|
-
function useIdleTimeoutPrompt({
|
|
68
|
-
beforePromptMs = 60_000,
|
|
69
|
-
afterPromptMs = 120_000,
|
|
70
|
-
}: { beforePromptMs?: number; afterPromptMs?: number; }) {
|
|
71
|
-
const [showPrompt, setShowPrompt] = useState(false);
|
|
72
|
-
const aloneSinceRef = useRef<number | null>(null);
|
|
73
|
-
const promptTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
74
|
-
const sessionTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
75
|
-
|
|
76
|
-
useEffect(() => {
|
|
77
|
-
const listener = new CometChatCalls.OngoingCallListener({
|
|
78
|
-
onUserListUpdated: (users: { uid: string }[]) => {
|
|
79
|
-
const localUid = CometChat.getLoggedinUser()?.getUid();
|
|
80
|
-
const remoteCount = users.filter(u => u.uid !== localUid).length;
|
|
81
|
-
|
|
82
|
-
if (remoteCount === 0 && aloneSinceRef.current === null) {
|
|
83
|
-
// Just became alone
|
|
84
|
-
aloneSinceRef.current = Date.now();
|
|
85
|
-
promptTimerRef.current = setTimeout(() => {
|
|
86
|
-
setShowPrompt(true);
|
|
87
|
-
sessionTimerRef.current = setTimeout(() => {
|
|
88
|
-
CometChatCalls.leaveSession();
|
|
89
|
-
}, afterPromptMs);
|
|
90
|
-
}, beforePromptMs);
|
|
91
|
-
} else if (remoteCount > 0) {
|
|
92
|
-
// Someone joined — clear timers
|
|
93
|
-
aloneSinceRef.current = null;
|
|
94
|
-
if (promptTimerRef.current) clearTimeout(promptTimerRef.current);
|
|
95
|
-
if (sessionTimerRef.current) clearTimeout(sessionTimerRef.current);
|
|
96
|
-
setShowPrompt(false);
|
|
97
|
-
}
|
|
98
|
-
},
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
// Attach listener... (see custom-ui.md for the full setup)
|
|
102
|
-
|
|
103
|
-
return () => {
|
|
104
|
-
if (promptTimerRef.current) clearTimeout(promptTimerRef.current);
|
|
105
|
-
if (sessionTimerRef.current) clearTimeout(sessionTimerRef.current);
|
|
106
|
-
};
|
|
107
|
-
}, [beforePromptMs, afterPromptMs]);
|
|
108
|
-
|
|
109
|
-
function dismiss() {
|
|
110
|
-
setShowPrompt(false);
|
|
111
|
-
if (sessionTimerRef.current) clearTimeout(sessionTimerRef.current);
|
|
112
|
-
aloneSinceRef.current = null;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
return { showPrompt, dismiss };
|
|
116
|
-
}
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
Usage:
|
|
120
|
-
|
|
121
|
-
```tsx
|
|
122
|
-
function CustomCallView() {
|
|
123
|
-
const { showPrompt, dismiss } = useIdleTimeoutPrompt({
|
|
124
|
-
beforePromptMs: 30_000,
|
|
125
|
-
afterPromptMs: 60_000,
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
return (
|
|
129
|
-
<>
|
|
130
|
-
{/* call UI */}
|
|
131
|
-
{showPrompt && (
|
|
132
|
-
<div role="alertdialog" aria-modal="true" aria-labelledby="idle-title">
|
|
133
|
-
<h2 id="idle-title">Still there?</h2>
|
|
134
|
-
<p>You're alone in this call. It'll end in 60 seconds.</p>
|
|
135
|
-
<button onClick={dismiss}>Stay</button>
|
|
136
|
-
<button onClick={() => CometChatCalls.leaveSession()}>End now</button>
|
|
137
|
-
</div>
|
|
138
|
-
)}
|
|
139
|
-
</>
|
|
140
|
-
);
|
|
141
|
-
}
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
### Pattern B — Long timeouts + custom prompt only
|
|
145
|
-
|
|
146
|
-
```ts
|
|
147
|
-
// SessionSettings object for joinSession (these before/after fields are object-only).
|
|
148
|
-
const settings = {
|
|
149
|
-
idleTimeoutPeriodBeforePrompt: 86_400_000, // 24 hours — effectively disabled
|
|
150
|
-
idleTimeoutPeriodAfterPrompt: 86_400_000,
|
|
151
|
-
};
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
Then implement your own timeout via Pattern A. Useful when you want UX-customized prompts instead of the SDK's default overlay.
|
|
155
|
-
|
|
156
|
-
---
|
|
157
|
-
|
|
158
|
-
## Anti-patterns
|
|
159
|
-
|
|
160
|
-
1. **`idleTimeoutPeriodAfterPrompt < 60_000` (60s).** SDK rejects values below 60s. Setting it lower silently fails — the SDK uses 60s instead.
|
|
161
|
-
2. **Disabling idle timeout entirely** by setting both timers to `Infinity`. Sessions hang forever, server-side resources leak, billing dings you. Always set a reasonable upper bound.
|
|
162
|
-
3. **Showing the prompt at the same time as call notifications/banners.** Stacks on top of incoming-message notifications. Z-index conflicts. Render the idle prompt at the highest z-level for the call surface.
|
|
163
|
-
4. **Auto-ending without a goodbye animation.** Jarring. Fade-out the call surface over 500ms before disconnecting.
|
|
164
|
-
5. **Prompt UI without `role="alertdialog"`.** Screen readers don't pause to announce; user gets disconnected mid-listen. Use `role="alertdialog"` + `aria-modal="true"`.
|
|
165
|
-
6. **Restarting `aloneSinceRef.current` on EVERY participant change.** Want to track "alone since" only when transitioning from N>0 to 0. Don't reset when participants join/leave while still N>0.
|
|
166
|
-
|
|
167
|
-
---
|
|
168
|
-
|
|
169
|
-
## Verification checklist
|
|
170
|
-
|
|
171
|
-
- [ ] `setIdleTimeoutPeriodBeforePrompt` + `setIdleTimeoutPeriodAfterPrompt` set on CallSettings
|
|
172
|
-
- [ ] After-prompt period ≥ 60_000 (60s)
|
|
173
|
-
- [ ] `onSessionTimedOut` event handler navigates away cleanly (not just `console.log`)
|
|
174
|
-
- [ ] Custom prompt UI uses `role="alertdialog"` + `aria-modal="true"`
|
|
175
|
-
- [ ] Custom prompt has both "Stay" and "End now" buttons
|
|
176
|
-
- [ ] Timer cleanup in `useEffect` return — no leaked setTimeout
|
|
177
|
-
- [ ] Browser smoke: 2 tabs in call, close tab B, watch tab A's timer fire (set short timeouts for testing)
|
|
178
|
-
- [ ] After-prompt smoke: dismiss the prompt → timer clears → no auto-disconnect
|
|
179
|
-
|
|
180
|
-
---
|
|
181
|
-
|
|
182
|
-
## Pointers
|
|
183
|
-
|
|
184
|
-
- `cometchat-react-calls` SKILL.md — the seven hard rules
|
|
185
|
-
- `references/group-calls.md` — group call architecture (idle-timeout matters most for groups)
|
|
186
|
-
- `references/custom-ui.md` — custom call UI integration
|
|
187
|
-
- `cometchat-a11y` — `role="alertdialog"` patterns
|
|
188
|
-
- Canonical docs: https://www.cometchat.com/docs/calls/javascript/idle-timeout
|
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
# In-call chat on web
|
|
2
|
-
|
|
3
|
-
Text messaging during a video/voice call. SDK provides the chat button in the control panel + events; the actual chat UI is yours to build (the kit's existing `<CometChatMessageList>` + `<CometChatMessageComposer>` work great here).
|
|
4
|
-
|
|
5
|
-
**Canonical docs:** https://www.cometchat.com/docs/calls/javascript/in-call-chat
|
|
6
|
-
**Use it for:** classroom side chat, team meeting links/notes, customer support secondary channel, AV-impaired participant text fallback.
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## SDK API
|
|
11
|
-
|
|
12
|
-
```ts
|
|
13
|
-
// SessionSettings object passed to joinSession(token, settings, container).
|
|
14
|
-
// hideChatButton is a SessionSettings field, not a CallSettingsBuilder method.
|
|
15
|
-
const settings = { hideChatButton: false }; // show the kit's built-in chat button
|
|
16
|
-
|
|
17
|
-
CometChatCalls.addEventListener("onChatButtonClicked", () => {
|
|
18
|
-
// Open your chat panel
|
|
19
|
-
setChatOpen(true);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
// Update unread badge
|
|
23
|
-
CometChatCalls.setChatButtonUnreadCount(5);
|
|
24
|
-
CometChatCalls.setChatButtonUnreadCount(0); // clear
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
The button + badge live on the SDK's control panel. Your job is to render the chat UI when the button is tapped.
|
|
28
|
-
|
|
29
|
-
---
|
|
30
|
-
|
|
31
|
-
## Architecture: group-as-session
|
|
32
|
-
|
|
33
|
-
The recommended pattern: use a CometChat **group** keyed to the call session. Every participant joins the group when they join the call; messages flow through the group's normal CometChat Chat SDK channel. When the call ends, the group either persists (logged history) or is deleted (ephemeral).
|
|
34
|
-
|
|
35
|
-
```ts
|
|
36
|
-
import { CometChat } from "@cometchat/chat-sdk-javascript";
|
|
37
|
-
|
|
38
|
-
async function ensureCallGroup(sessionId: string): Promise<CometChat.Group> {
|
|
39
|
-
// Try to get existing
|
|
40
|
-
try {
|
|
41
|
-
return await CometChat.getGroup(sessionId);
|
|
42
|
-
} catch {
|
|
43
|
-
// Create
|
|
44
|
-
const group = new CometChat.Group(
|
|
45
|
-
sessionId, // GUID == session ID
|
|
46
|
-
`Call ${sessionId}`, // display name
|
|
47
|
-
CometChat.GROUP_TYPE.PUBLIC, // anyone in the call can join
|
|
48
|
-
);
|
|
49
|
-
return await CometChat.createGroup(group);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
async function joinCallGroup(sessionId: string): Promise<void> {
|
|
54
|
-
await CometChat.joinGroup(sessionId, CometChat.GROUP_TYPE.PUBLIC, "");
|
|
55
|
-
}
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
Wire this into your call-start flow: after `joinSession` succeeds, `joinCallGroup`.
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
## Chat panel UI
|
|
63
|
-
|
|
64
|
-
```tsx
|
|
65
|
-
import { useState, useEffect } from "react";
|
|
66
|
-
import { CometChat } from "@cometchat/chat-sdk-javascript";
|
|
67
|
-
import { CometChatCalls } from "@cometchat/calls-sdk-javascript";
|
|
68
|
-
import {
|
|
69
|
-
CometChatMessageList,
|
|
70
|
-
CometChatMessageComposer,
|
|
71
|
-
} from "@cometchat/chat-uikit-react";
|
|
72
|
-
|
|
73
|
-
interface InCallChatPanelProps {
|
|
74
|
-
sessionId: string;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
function InCallChatPanel({ sessionId }: InCallChatPanelProps) {
|
|
78
|
-
const [open, setOpen] = useState(false);
|
|
79
|
-
const [unread, setUnread] = useState(0);
|
|
80
|
-
const [group, setGroup] = useState<CometChat.Group>();
|
|
81
|
-
|
|
82
|
-
// Listen for the SDK's button click
|
|
83
|
-
useEffect(() => {
|
|
84
|
-
const handler = () => setOpen(true);
|
|
85
|
-
// addEventListener returns an unsubscribe fn — there is no removeEventListener.
|
|
86
|
-
const off = CometChatCalls.addEventListener("onChatButtonClicked", handler);
|
|
87
|
-
return () => off();
|
|
88
|
-
}, []);
|
|
89
|
-
|
|
90
|
-
// Resolve the group object for the message list
|
|
91
|
-
useEffect(() => {
|
|
92
|
-
CometChat.getGroup(sessionId).then(setGroup).catch(() => {});
|
|
93
|
-
}, [sessionId]);
|
|
94
|
-
|
|
95
|
-
// Track unread when panel is closed
|
|
96
|
-
useEffect(() => {
|
|
97
|
-
const listenerId = `in-call-chat-${sessionId}`;
|
|
98
|
-
const messageListener = new CometChat.MessageListener({
|
|
99
|
-
onTextMessageReceived: (msg: CometChat.TextMessage) => {
|
|
100
|
-
if (
|
|
101
|
-
msg.getReceiverType() === CometChat.RECEIVER_TYPE.GROUP &&
|
|
102
|
-
msg.getReceiverId() === sessionId &&
|
|
103
|
-
!open
|
|
104
|
-
) {
|
|
105
|
-
setUnread((u) => {
|
|
106
|
-
const next = u + 1;
|
|
107
|
-
CometChatCalls.setChatButtonUnreadCount(next);
|
|
108
|
-
return next;
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
},
|
|
112
|
-
});
|
|
113
|
-
CometChat.addMessageListener(listenerId, messageListener);
|
|
114
|
-
return () => CometChat.removeMessageListener(listenerId);
|
|
115
|
-
}, [sessionId, open]);
|
|
116
|
-
|
|
117
|
-
// Clear badge on open
|
|
118
|
-
useEffect(() => {
|
|
119
|
-
if (open) {
|
|
120
|
-
setUnread(0);
|
|
121
|
-
CometChatCalls.setChatButtonUnreadCount(0);
|
|
122
|
-
}
|
|
123
|
-
}, [open]);
|
|
124
|
-
|
|
125
|
-
if (!open || !group) return null;
|
|
126
|
-
|
|
127
|
-
return (
|
|
128
|
-
<div
|
|
129
|
-
role="dialog"
|
|
130
|
-
aria-label="In-call chat"
|
|
131
|
-
style={{
|
|
132
|
-
position: "fixed",
|
|
133
|
-
right: 0,
|
|
134
|
-
top: 0,
|
|
135
|
-
bottom: 0,
|
|
136
|
-
width: 360,
|
|
137
|
-
background: "var(--cometchat-background-color-01)",
|
|
138
|
-
borderLeft: "1px solid var(--cometchat-border-color-light)",
|
|
139
|
-
display: "flex",
|
|
140
|
-
flexDirection: "column",
|
|
141
|
-
zIndex: 200,
|
|
142
|
-
}}
|
|
143
|
-
>
|
|
144
|
-
<div style={{ padding: "12px 16px", borderBottom: "1px solid var(--cometchat-border-color-light)", display: "flex", justifyContent: "space-between", alignItems: "center" }}>
|
|
145
|
-
<strong>Chat</strong>
|
|
146
|
-
<button onClick={() => setOpen(false)} aria-label="Close chat">×</button>
|
|
147
|
-
</div>
|
|
148
|
-
{/* The flex-1 + minHeight:0 dance applies here too — long chat → composer would push down */}
|
|
149
|
-
<div style={{ flex: "1 1 0", minHeight: 0, overflow: "hidden" }}>
|
|
150
|
-
<CometChatMessageList group={group} hideReplyInThreadOption />
|
|
151
|
-
</div>
|
|
152
|
-
<div style={{ flex: "0 0 auto" }}>
|
|
153
|
-
<CometChatMessageComposer group={group} />
|
|
154
|
-
</div>
|
|
155
|
-
</div>
|
|
156
|
-
);
|
|
157
|
-
}
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
The flex-1 + minHeight:0 + wrap-each-component pattern from `cometchat-react-patterns` rule 6a applies inside the chat panel too.
|
|
161
|
-
|
|
162
|
-
---
|
|
163
|
-
|
|
164
|
-
## Compact UX patterns
|
|
165
|
-
|
|
166
|
-
For 1:1 calls or small groups, an in-call chat panel is overkill. Two lighter patterns:
|
|
167
|
-
|
|
168
|
-
### A — Floating message strip (top of call)
|
|
169
|
-
|
|
170
|
-
Show only the latest message inline; tap to open full chat. Minimal UI for "just the gist."
|
|
171
|
-
|
|
172
|
-
### B — System-toast on each message
|
|
173
|
-
|
|
174
|
-
`onTextMessageReceived` → toast at top of call. Auto-dismiss after 4s. No persistent panel.
|
|
175
|
-
|
|
176
|
-
The full panel pattern above is for 5+-person calls or when chat is a load-bearing part of the experience (e.g. classroom Q&A).
|
|
177
|
-
|
|
178
|
-
---
|
|
179
|
-
|
|
180
|
-
## Anti-patterns
|
|
181
|
-
|
|
182
|
-
1. **Polling for unread count.** SDK's `setChatButtonUnreadCount` is push-based; respond to message events.
|
|
183
|
-
2. **Chat panel grows past viewport on long sessions.** flex-shrink trap (see `cometchat-react-patterns` rule 6a).
|
|
184
|
-
3. **Forgetting to clear the unread badge on panel open.** User opens, sees "12 new" badge that doesn't update — looks broken.
|
|
185
|
-
4. **Persisting the call group forever.** For ephemeral calls (consultations, support), delete the group on call end. Hosts of recurring meetings keep groups.
|
|
186
|
-
5. **Sending messages without auth.** Make sure CometChat.login resolved before joining the group. Race conditions on early call accept.
|
|
187
|
-
6. **Reusing one chat-panel instance across multiple calls.** Group reference goes stale. Re-mount per call.
|
|
188
|
-
|
|
189
|
-
---
|
|
190
|
-
|
|
191
|
-
## Verification checklist
|
|
192
|
-
|
|
193
|
-
- [ ] `hideChatButton: false` in CallSettings
|
|
194
|
-
- [ ] `onChatButtonClicked` listener opens the panel
|
|
195
|
-
- [ ] CometChat group created/resolved with sessionId as GUID
|
|
196
|
-
- [ ] Local user joins the group on call start
|
|
197
|
-
- [ ] Unread badge updates from `onTextMessageReceived` only when panel closed
|
|
198
|
-
- [ ] Badge cleared on panel open
|
|
199
|
-
- [ ] Chat panel uses flex-1 + minHeight:0 + wrap-each-component pattern
|
|
200
|
-
- [ ] `role="dialog"` + `aria-label` on the panel container
|
|
201
|
-
- [ ] Cleanup: remove message + chat-button listeners on call end
|
|
202
|
-
- [ ] Browser smoke: 2 tabs in call, send message from A → unread badge in B → tap → message visible
|
|
203
|
-
|
|
204
|
-
---
|
|
205
|
-
|
|
206
|
-
## Pointers
|
|
207
|
-
|
|
208
|
-
- `cometchat-react-calls` SKILL.md
|
|
209
|
-
- `cometchat-react-patterns` — minHeight:0 rule 6a (applies to in-call chat panel)
|
|
210
|
-
- `references/group-calls.md` — group call architecture
|
|
211
|
-
- `cometchat-android-v5-calls/references/in-call-chat.md` — Android V5 sibling reference
|
|
212
|
-
- Canonical docs: https://www.cometchat.com/docs/calls/javascript/in-call-chat
|