@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,170 +0,0 @@
|
|
|
1
|
-
# Calls SDK v4 → v5 migration (web)
|
|
2
|
-
|
|
3
|
-
CometChat Calls SDK v5 is a **drop-in replacement** for v4 — bump the package, your existing code keeps working through deprecation shims. Migrate to v5 APIs to get granular event listeners, simpler init, and strongly-typed enums.
|
|
4
|
-
|
|
5
|
-
**Canonical docs:** https://www.cometchat.com/docs/calls/javascript/migration-guide-v5
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Step 1 — Bump the package
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
npm install @cometchat/calls-sdk-javascript@5
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
If you're using CometChat UI Kits, this is enough — the kit's calls integration uses the v4 deprecated layer. **You can ship to production at this step** and migrate v5 APIs incrementally.
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## Step 2 — Migrate init (optional but cleaner)
|
|
20
|
-
|
|
21
|
-
```diff
|
|
22
|
-
- const callAppSettings = new CometChatCalls.CallAppSettingsBuilder()
|
|
23
|
-
- .setAppId("APP_ID")
|
|
24
|
-
- .setRegion("REGION")
|
|
25
|
-
- .build();
|
|
26
|
-
- await CometChatCalls.init(callAppSettings);
|
|
27
|
-
|
|
28
|
-
+ await CometChatCalls.init({ appId: "APP_ID", region: "REGION" });
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
## Step 3 — Add `login()` after Chat SDK login
|
|
34
|
-
|
|
35
|
-
v5 introduces a dedicated Calls SDK auth step. After the user logs into the Chat SDK, call:
|
|
36
|
-
|
|
37
|
-
```ts
|
|
38
|
-
const authToken = (await CometChat.getLoggedInUser())!.getAuthToken();
|
|
39
|
-
await CometChatCalls.loginWithAuthToken(authToken); // login() takes a uid; use loginWithAuthToken for a token
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
After this, `generateToken()` and `joinSession()` no longer need an authToken parameter.
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## Step 4 — Migrate session settings to plain object
|
|
47
|
-
|
|
48
|
-
```diff
|
|
49
|
-
- const callSettings = new CometChatCalls.CallSettingsBuilder()
|
|
50
|
-
- .setIsAudioOnlyCall(true)
|
|
51
|
-
- .showRecordingButton(true)
|
|
52
|
-
- .startWithAudioMuted(false)
|
|
53
|
-
- .build();
|
|
54
|
-
|
|
55
|
-
+ const sessionSettings = {
|
|
56
|
-
+ sessionType: "VOICE", // was setIsAudioOnlyCall(true)
|
|
57
|
-
+ hideRecordingButton: false, // was showRecordingButton(true) — INVERTED
|
|
58
|
-
+ startAudioMuted: false,
|
|
59
|
-
+ layout: "TILE",
|
|
60
|
-
+ };
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
**Watch out:** the boolean logic is **inverted** for many settings (v4 `show*` → v5 `hide*`). Search-and-replace doesn't work — review each manually.
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## Step 5 — Migrate events to granular listeners
|
|
68
|
-
|
|
69
|
-
```diff
|
|
70
|
-
- const callSettings = new CometChatCalls.CallSettingsBuilder()
|
|
71
|
-
- .setCallListener(new CometChatCalls.OngoingCallListener({
|
|
72
|
-
- onCallEnded: () => { /* ... */ },
|
|
73
|
-
- onUserJoined: (user) => { /* ... */ },
|
|
74
|
-
- onUserLeft: (user) => { /* ... */ },
|
|
75
|
-
- onError: (error) => { /* ... */ },
|
|
76
|
-
- }))
|
|
77
|
-
- .build();
|
|
78
|
-
|
|
79
|
-
+ const unsub1 = CometChatCalls.addEventListener("onSessionLeft", () => { /* ... */ });
|
|
80
|
-
+ const unsub2 = CometChatCalls.addEventListener("onParticipantJoined", (p) => { /* ... */ });
|
|
81
|
-
+ const unsub3 = CometChatCalls.addEventListener("onParticipantLeft", (p) => { /* ... */ });
|
|
82
|
-
+ // Errors now come back via Promise rejection from joinSession() etc.
|
|
83
|
-
+
|
|
84
|
-
+ // Cleanup
|
|
85
|
-
+ return () => { unsub1(); unsub2(); unsub3(); };
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
**Event-name mapping (most common):**
|
|
89
|
-
|
|
90
|
-
| v4 | v5 |
|
|
91
|
-
|---|---|
|
|
92
|
-
| `onCallEnded` | `onSessionLeft` |
|
|
93
|
-
| `onCallEndButtonPressed` | `onLeaveSessionButtonClicked` |
|
|
94
|
-
| `onUserJoined(user)` | `onParticipantJoined(participant)` |
|
|
95
|
-
| `onUserLeft(user)` | `onParticipantLeft(participant)` |
|
|
96
|
-
| `onUserListUpdated(list)` | `onParticipantListChanged(list)` |
|
|
97
|
-
| `onUserMuted(info)` | `onParticipantAudioMuted(participant)` |
|
|
98
|
-
| `onRecordingToggled(info)` | `onRecordingStarted` / `onRecordingStopped` |
|
|
99
|
-
|
|
100
|
-
---
|
|
101
|
-
|
|
102
|
-
## Step 6 — Migrate session control method names
|
|
103
|
-
|
|
104
|
-
```diff
|
|
105
|
-
- CometChatCalls.endSession()
|
|
106
|
-
+ CometChatCalls.leaveSession()
|
|
107
|
-
|
|
108
|
-
- CometChatCalls.muteAudio(true)
|
|
109
|
-
+ CometChatCalls.muteAudio()
|
|
110
|
-
- CometChatCalls.muteAudio(false)
|
|
111
|
-
+ CometChatCalls.unmuteAudio()
|
|
112
|
-
|
|
113
|
-
- CometChatCalls.pauseVideo(true)
|
|
114
|
-
+ CometChatCalls.pauseVideo()
|
|
115
|
-
- CometChatCalls.pauseVideo(false)
|
|
116
|
-
+ CometChatCalls.resumeVideo()
|
|
117
|
-
|
|
118
|
-
- CometChatCalls.setMode(mode)
|
|
119
|
-
+ CometChatCalls.setLayout(layout)
|
|
120
|
-
|
|
121
|
-
- CometChatCalls.startScreenShare()
|
|
122
|
-
+ CometChatCalls.startScreenSharing()
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
> PiP rename: v4's `enterPIPMode()` became the static `CometChatCalls.enablePictureInPictureLayout()` in v5 (paired with `disablePictureInPictureLayout()`). Note the `onPictureInPictureLayoutEnabled` / `...Disabled` **callbacks are on `MobileSDKEvents`, not `WebSDKEvents`** — they are NOT subscribable via `CometChatCalls.addEventListener` on the web SDK (verified in `@cometchat/calls-sdk-javascript` `index.d.ts`: `MobileSDKEvents` vs `WebSDKEvents`). On **web**, prefer browser-native picture-in-picture — see `references/picture-in-picture.md`.
|
|
126
|
-
|
|
127
|
-
---
|
|
128
|
-
|
|
129
|
-
## Step 7 — `startSession` → `joinSession`
|
|
130
|
-
|
|
131
|
-
```diff
|
|
132
|
-
- CometChatCalls.generateToken(sessionId, authToken).then((token) => {
|
|
133
|
-
- CometChatCalls.startSession(token, callSettings, container);
|
|
134
|
-
- });
|
|
135
|
-
|
|
136
|
-
+ CometChatCalls.generateToken(sessionId).then(({ token }) => {
|
|
137
|
-
+ CometChatCalls.joinSession(token, sessionSettings, container);
|
|
138
|
-
+ });
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
> `joinSession`'s first arg is the **callToken** (from `generateToken`), not a sessionId — there is no token-free join. `generateToken` resolves to `{ token }`, so destructure it.
|
|
142
|
-
|
|
143
|
-
---
|
|
144
|
-
|
|
145
|
-
## Removed methods (no v5 replacement)
|
|
146
|
-
|
|
147
|
-
- `CometChatCalls.switchToVideoCall()` — start a fresh session with `sessionType: "VIDEO"` instead
|
|
148
|
-
- `CometChatCalls.getCallDetails()` — track session state via events
|
|
149
|
-
|
|
150
|
-
---
|
|
151
|
-
|
|
152
|
-
## Verification checklist
|
|
153
|
-
|
|
154
|
-
- [ ] `package.json` lists `@cometchat/calls-sdk-javascript@^5`
|
|
155
|
-
- [ ] `await CometChatCalls.loginWithAuthToken(authToken)` called after `CometChat.login`
|
|
156
|
-
- [ ] `OngoingCallListener` removed; granular `addEventListener` calls in place with cleanup
|
|
157
|
-
- [ ] `startSession` replaced with `joinSession`
|
|
158
|
-
- [ ] `endSession` replaced with `leaveSession`
|
|
159
|
-
- [ ] Inverted booleans audited (show* → hide* with `!`)
|
|
160
|
-
- [ ] No use of removed methods (`switchToVideoCall`, `getCallDetails`)
|
|
161
|
-
- [ ] Existing call flows tested end-to-end (incoming, accept, mute, screen-share, end)
|
|
162
|
-
|
|
163
|
-
---
|
|
164
|
-
|
|
165
|
-
## Pointers
|
|
166
|
-
|
|
167
|
-
- Canonical migration guide: https://www.cometchat.com/docs/calls/javascript/migration-guide-v5
|
|
168
|
-
- `cometchat-react-calls/SKILL.md` — current architecture (v5)
|
|
169
|
-
- `cometchat-react-calls/references/call-layouts.md` — layout enum migration
|
|
170
|
-
- `cometchat-react-calls/references/recording-screen-share.md` — recording events migration
|
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
# Picture-in-Picture on web
|
|
2
|
-
|
|
3
|
-
Web has two PiP APIs, used for different things:
|
|
4
|
-
|
|
5
|
-
1. **Video PiP** (`HTMLVideoElement.requestPictureInPicture()`) — lets a single `<video>` element float in a system-managed window above all browser tabs. Standard since Chrome 70 / Safari 13 / Firefox 71. Fine for one remote participant.
|
|
6
|
-
|
|
7
|
-
2. **Document PiP** (`window.documentPictureInPicture.requestWindow()`) — lets you put arbitrary HTML (custom call UI with controls, multi-tile grid, roster) in a floating window. Chrome 116+ only. Falls back gracefully where unsupported.
|
|
8
|
-
|
|
9
|
-
This reference covers both, plus when to pick which.
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## When to use Video PiP vs Document PiP
|
|
14
|
-
|
|
15
|
-
| Scenario | Pick |
|
|
16
|
-
|---|---|
|
|
17
|
-
| 1:1 call, just want the remote face floating while user works | Video PiP |
|
|
18
|
-
| Multi-party call, want the active speaker + a small roster floating | Document PiP if Chrome 116+, else fall back to Video PiP |
|
|
19
|
-
| Want call controls (mute/end) visible in the PiP window | Document PiP only — Video PiP doesn't allow custom controls |
|
|
20
|
-
| Cross-browser support including Safari + Firefox | Video PiP (with fallback when neither works) |
|
|
21
|
-
|
|
22
|
-
The skill defaults to Video PiP for cross-browser compatibility; Document PiP is opt-in for Chromium-only apps.
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## Video PiP — the simple path
|
|
27
|
-
|
|
28
|
-
```tsx
|
|
29
|
-
// CustomOngoingCallView.tsx — extends the version in references/custom-ui.md
|
|
30
|
-
const remoteVideoRef = useRef<HTMLVideoElement>(null);
|
|
31
|
-
const [pipActive, setPipActive] = useState(false);
|
|
32
|
-
|
|
33
|
-
async function enterPiP() {
|
|
34
|
-
const video = remoteVideoRef.current;
|
|
35
|
-
if (!video) return;
|
|
36
|
-
if (!document.pictureInPictureEnabled) {
|
|
37
|
-
setError("Picture-in-Picture isn't supported in this browser");
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
try {
|
|
41
|
-
await video.requestPictureInPicture();
|
|
42
|
-
setPipActive(true);
|
|
43
|
-
} catch (err) {
|
|
44
|
-
// user denied, video not yet playing, etc.
|
|
45
|
-
console.warn("PiP request failed:", err);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
useEffect(() => {
|
|
50
|
-
const video = remoteVideoRef.current;
|
|
51
|
-
if (!video) return;
|
|
52
|
-
const onEnter = () => setPipActive(true);
|
|
53
|
-
const onLeave = () => setPipActive(false);
|
|
54
|
-
video.addEventListener("enterpictureinpicture", onEnter);
|
|
55
|
-
video.addEventListener("leavepictureinpicture", onLeave);
|
|
56
|
-
return () => {
|
|
57
|
-
video.removeEventListener("enterpictureinpicture", onEnter);
|
|
58
|
-
video.removeEventListener("leavepictureinpicture", onLeave);
|
|
59
|
-
};
|
|
60
|
-
}, []);
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
The `<video>` element keeps playing — PiP doesn't pause or remount. CSS doesn't apply (the OS owns the floating window). Hide the in-page video when PiP is active to avoid the "two videos playing" UX:
|
|
64
|
-
|
|
65
|
-
```tsx
|
|
66
|
-
<video
|
|
67
|
-
ref={remoteVideoRef}
|
|
68
|
-
autoPlay
|
|
69
|
-
playsInline
|
|
70
|
-
style={{ display: pipActive ? "none" : "block" }}
|
|
71
|
-
/>
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
---
|
|
75
|
-
|
|
76
|
-
## Document PiP — the rich path (Chrome 116+)
|
|
77
|
-
|
|
78
|
-
```tsx
|
|
79
|
-
const [pipWindow, setPipWindow] = useState<Window | null>(null);
|
|
80
|
-
|
|
81
|
-
async function enterDocumentPiP() {
|
|
82
|
-
// Feature detect
|
|
83
|
-
if (!("documentPictureInPicture" in window)) {
|
|
84
|
-
return enterPiP(); // fall through to video PiP
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const pipWin = await (window as unknown as {
|
|
88
|
-
documentPictureInPicture: { requestWindow: (opts: { width: number; height: number }) => Promise<Window> };
|
|
89
|
-
}).documentPictureInPicture.requestWindow({
|
|
90
|
-
width: 360,
|
|
91
|
-
height: 480,
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
// Copy the call container into the PiP window
|
|
95
|
-
const container = document.getElementById("ongoing-call-root");
|
|
96
|
-
if (container) {
|
|
97
|
-
pipWin.document.body.appendChild(container);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// PiP window has its own document — copy stylesheets so kit styling works
|
|
101
|
-
for (const styleSheet of Array.from(document.styleSheets)) {
|
|
102
|
-
try {
|
|
103
|
-
const cssRules = Array.from(styleSheet.cssRules ?? []).map((r) => r.cssText).join("\n");
|
|
104
|
-
const style = pipWin.document.createElement("style");
|
|
105
|
-
style.textContent = cssRules;
|
|
106
|
-
pipWin.document.head.appendChild(style);
|
|
107
|
-
} catch {
|
|
108
|
-
// cross-origin stylesheets throw — copy <link> href instead
|
|
109
|
-
if (styleSheet.href) {
|
|
110
|
-
const link = pipWin.document.createElement("link");
|
|
111
|
-
link.rel = "stylesheet";
|
|
112
|
-
link.href = styleSheet.href;
|
|
113
|
-
pipWin.document.head.appendChild(link);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// When the user closes the PiP window (system X button), restore the container
|
|
119
|
-
pipWin.addEventListener("pagehide", () => {
|
|
120
|
-
const restored = pipWin.document.getElementById("ongoing-call-root");
|
|
121
|
-
if (restored && document.getElementById("call-host")) {
|
|
122
|
-
document.getElementById("call-host")!.appendChild(restored);
|
|
123
|
-
}
|
|
124
|
-
setPipWindow(null);
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
setPipWindow(pipWin);
|
|
128
|
-
}
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
The `container` keeps its event handlers and React fiber attached — clicking "End" inside the PiP window still calls your React handlers. This is the magic of Document PiP that single-video PiP doesn't give you.
|
|
132
|
-
|
|
133
|
-
**Caveat:** stylesheets are copied at PiP-open time. If you change the theme mid-PiP (light/dark toggle), styles in the PiP window go stale. Add a `MutationObserver` or just don't allow theme switching while PiP is active.
|
|
134
|
-
|
|
135
|
-
---
|
|
136
|
-
|
|
137
|
-
## Browser support matrix
|
|
138
|
-
|
|
139
|
-
| Browser | Video PiP | Document PiP |
|
|
140
|
-
|---|---|---|
|
|
141
|
-
| Chrome 70+ desktop | ✓ | Chrome 116+ |
|
|
142
|
-
| Edge 79+ desktop | ✓ | Edge 116+ |
|
|
143
|
-
| Safari 13+ desktop | ✓ | ✗ (no plans yet) |
|
|
144
|
-
| Firefox 71+ desktop | ✓ (custom toggle UI, not standard API) | ✗ |
|
|
145
|
-
| Chrome mobile (Android) | ✓ system-PiP equivalent | ✗ |
|
|
146
|
-
| Safari iOS | iPad: ✓; iPhone: limited | ✗ |
|
|
147
|
-
|
|
148
|
-
Feature-detect both. Don't render the "Enter PiP" button when neither is supported.
|
|
149
|
-
|
|
150
|
-
```tsx
|
|
151
|
-
const canVideoPiP = typeof document !== "undefined" && document.pictureInPictureEnabled;
|
|
152
|
-
const canDocPiP = typeof window !== "undefined" && "documentPictureInPicture" in window;
|
|
153
|
-
const showPipButton = canVideoPiP || canDocPiP;
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
---
|
|
157
|
-
|
|
158
|
-
## Auto-enter PiP on tab switch
|
|
159
|
-
|
|
160
|
-
A "tab visibility" pattern many call UX teams want — auto-enter PiP when the user switches away from the call tab:
|
|
161
|
-
|
|
162
|
-
```tsx
|
|
163
|
-
useEffect(() => {
|
|
164
|
-
const onVisibilityChange = () => {
|
|
165
|
-
if (document.visibilityState === "hidden" && remoteVideoRef.current) {
|
|
166
|
-
remoteVideoRef.current.requestPictureInPicture().catch(() => {});
|
|
167
|
-
}
|
|
168
|
-
};
|
|
169
|
-
document.addEventListener("visibilitychange", onVisibilityChange);
|
|
170
|
-
return () => document.removeEventListener("visibilitychange", onVisibilityChange);
|
|
171
|
-
}, []);
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
Browsers reject auto-PiP requests not tied to user gestures in some contexts (Safari is strictest). Use `await navigator.mediaSession.setActionHandler("enterpictureinpicture", ...)` for a cleaner API where supported.
|
|
175
|
-
|
|
176
|
-
---
|
|
177
|
-
|
|
178
|
-
## Auto-leave PiP on hangup
|
|
179
|
-
|
|
180
|
-
When the call ends, exit PiP cleanly:
|
|
181
|
-
|
|
182
|
-
```tsx
|
|
183
|
-
function endCall() {
|
|
184
|
-
if (document.pictureInPictureElement) {
|
|
185
|
-
document.exitPictureInPicture();
|
|
186
|
-
}
|
|
187
|
-
if (pipWindow) {
|
|
188
|
-
pipWindow.close();
|
|
189
|
-
setPipWindow(null);
|
|
190
|
-
}
|
|
191
|
-
CometChatCalls.leaveSession();
|
|
192
|
-
// ...rest of cleanup
|
|
193
|
-
}
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
Without this, the PiP window stays floating after the call ends, showing a frozen frame.
|
|
197
|
-
|
|
198
|
-
---
|
|
199
|
-
|
|
200
|
-
## PiP + custom UI integration
|
|
201
|
-
|
|
202
|
-
If you're using `enableDefaultLayout(true)` (kit-rendered call UI), PiP works on the kit's internal `<video>` element. Reach into it via:
|
|
203
|
-
|
|
204
|
-
```ts
|
|
205
|
-
const callContainer = document.getElementById("calls-container");
|
|
206
|
-
const video = callContainer?.querySelector("video"); // kit renders one or more
|
|
207
|
-
if (video instanceof HTMLVideoElement) {
|
|
208
|
-
await video.requestPictureInPicture();
|
|
209
|
-
}
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
Brittle — kit DOM structure can change between versions. Custom UI (Document PiP path above) is more stable.
|
|
213
|
-
|
|
214
|
-
---
|
|
215
|
-
|
|
216
|
-
## Anti-patterns
|
|
217
|
-
|
|
218
|
-
1. **Calling `requestPictureInPicture()` from `useEffect` on mount.** Browsers reject — must be in response to user gesture. Wire to a button.
|
|
219
|
-
2. **Forgetting to hide the in-page `<video>` while PiP is active.** Two videos play, audio doubles, layout breaks.
|
|
220
|
-
3. **Document PiP without copying stylesheets.** PiP window renders unstyled; user sees raw HTML.
|
|
221
|
-
4. **Not exiting PiP on hangup.** Frozen frame floats after call ends.
|
|
222
|
-
5. **Document PiP detection via `'documentPictureInPicture' in document`.** It's on `window`, not `document`. Common typo.
|
|
223
|
-
6. **Auto-PiP on every visibility change, including page reload.** User reloads → unintended PiP. Gate on call active + user-initiated focus loss.
|
|
224
|
-
|
|
225
|
-
---
|
|
226
|
-
|
|
227
|
-
## Verification checklist
|
|
228
|
-
|
|
229
|
-
- [ ] PiP button only renders if `document.pictureInPictureEnabled` OR `'documentPictureInPicture' in window`
|
|
230
|
-
- [ ] PiP request triggered from a click handler, not `useEffect`
|
|
231
|
-
- [ ] In-page video hidden while PiP active (or repositioned)
|
|
232
|
-
- [ ] `enterpictureinpicture` / `leavepictureinpicture` listeners update local state
|
|
233
|
-
- [ ] Hangup path calls `document.exitPictureInPicture()` if active
|
|
234
|
-
- [ ] Document PiP path copies stylesheets to the PiP window's document
|
|
235
|
-
- [ ] Document PiP path restores the container to the main window on `pagehide`
|
|
236
|
-
- [ ] Real-browser smoke: Chrome desktop (both APIs) + Safari desktop (Video PiP) + Firefox (Video PiP)
|
|
237
|
-
|
|
238
|
-
---
|
|
239
|
-
|
|
240
|
-
## Pointers
|
|
241
|
-
|
|
242
|
-
- Custom UI integration: `references/custom-ui.md`
|
|
243
|
-
- Kit-default layout: kit handles internal video PiP via the kit's own controls
|
|
244
|
-
- Document PiP spec: https://wicg.github.io/document-picture-in-picture/
|
|
245
|
-
- `cometchat-react-calls` SKILL.md — base hard rules
|
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
# Raise hand on web
|
|
2
|
-
|
|
3
|
-
Lets participants signal they want to speak without interrupting the current speaker. The SDK ships first-party support — four method calls, two events, one settings flag. No custom signaling needed.
|
|
4
|
-
|
|
5
|
-
**Canonical docs:** https://www.cometchat.com/docs/calls/javascript/raise-hand
|
|
6
|
-
**Use it for:** classrooms, large group calls, town halls, any call with > ~5 participants where verbal turn-taking gets messy.
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## SDK API (web Calls SDK)
|
|
11
|
-
|
|
12
|
-
```ts
|
|
13
|
-
import { CometChatCalls } from "@cometchat/calls-sdk-javascript";
|
|
14
|
-
|
|
15
|
-
// Local user raises hand
|
|
16
|
-
CometChatCalls.raiseHand();
|
|
17
|
-
|
|
18
|
-
// Local user lowers hand
|
|
19
|
-
CometChatCalls.lowerHand();
|
|
20
|
-
|
|
21
|
-
// Subscribe to other participants' hand state
|
|
22
|
-
CometChatCalls.addEventListener("onParticipantHandRaised", (participant) => {
|
|
23
|
-
// participant.uid, participant.name available
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
CometChatCalls.addEventListener("onParticipantHandLowered", (participant) => {
|
|
27
|
-
// ...
|
|
28
|
-
});
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
The SDK ships a built-in raise-hand button in the default control panel. Hide it via call settings if you're rolling custom UI:
|
|
32
|
-
|
|
33
|
-
```ts
|
|
34
|
-
// SessionSettings object passed to joinSession(token, settings, container).
|
|
35
|
-
// hideRaiseHandButton is a SessionSettings field — NOT a CallSettingsBuilder
|
|
36
|
-
// method, and there is no setSessionID (the session is carried by the token
|
|
37
|
-
// from generateToken(sessionId)).
|
|
38
|
-
const settings = { hideRaiseHandButton: true }; // suppress the SDK's button — your UI takes over
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
## When to use built-in vs custom
|
|
44
|
-
|
|
45
|
-
| Scenario | Use |
|
|
46
|
-
|---|---|
|
|
47
|
-
| Default kit UI is fine; just want raise-hand | Built-in (don't pass `hideRaiseHandButton`) |
|
|
48
|
-
| Custom call UI (your own control panel) | Custom — call `raiseHand()` / `lowerHand()` from your buttons |
|
|
49
|
-
| Need different host vs participant UI | Custom — query group scope, render different controls |
|
|
50
|
-
| Need raise-hand list (host sees who's raised) | Custom — maintain local Map<uid, raisedAt> via the listeners |
|
|
51
|
-
|
|
52
|
-
---
|
|
53
|
-
|
|
54
|
-
## Custom raise-hand UX — three pieces
|
|
55
|
-
|
|
56
|
-
### 1. Local participant button (toggle)
|
|
57
|
-
|
|
58
|
-
```tsx
|
|
59
|
-
import { useState } from "react";
|
|
60
|
-
import { CometChatCalls } from "@cometchat/calls-sdk-javascript";
|
|
61
|
-
|
|
62
|
-
function RaiseHandButton() {
|
|
63
|
-
const [raised, setRaised] = useState(false);
|
|
64
|
-
|
|
65
|
-
function toggle() {
|
|
66
|
-
if (raised) {
|
|
67
|
-
CometChatCalls.lowerHand();
|
|
68
|
-
setRaised(false);
|
|
69
|
-
} else {
|
|
70
|
-
CometChatCalls.raiseHand();
|
|
71
|
-
setRaised(true);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
return (
|
|
76
|
-
<button onClick={toggle} aria-pressed={raised}>
|
|
77
|
-
{raised ? "✋ Lower" : "✋ Raise hand"}
|
|
78
|
-
</button>
|
|
79
|
-
);
|
|
80
|
-
}
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
Visual hint: render the icon with `aria-pressed={raised}` so screen readers announce the toggle state. (See `cometchat-a11y` for the broader rule.)
|
|
84
|
-
|
|
85
|
-
### 2. Raised-hands roster (host view)
|
|
86
|
-
|
|
87
|
-
```tsx
|
|
88
|
-
import { useEffect, useState } from "react";
|
|
89
|
-
import { CometChatCalls } from "@cometchat/calls-sdk-javascript";
|
|
90
|
-
|
|
91
|
-
interface RaisedParticipant { uid: string; name: string; raisedAt: number; }
|
|
92
|
-
|
|
93
|
-
function RaisedHandsList() {
|
|
94
|
-
const [raised, setRaised] = useState<Map<string, RaisedParticipant>>(new Map());
|
|
95
|
-
|
|
96
|
-
useEffect(() => {
|
|
97
|
-
const onRaised = (p: { uid: string; name: string }) => {
|
|
98
|
-
setRaised(prev => {
|
|
99
|
-
const next = new Map(prev);
|
|
100
|
-
next.set(p.uid, { ...p, raisedAt: Date.now() });
|
|
101
|
-
return next;
|
|
102
|
-
});
|
|
103
|
-
};
|
|
104
|
-
const onLowered = (p: { uid: string }) => {
|
|
105
|
-
setRaised(prev => {
|
|
106
|
-
const next = new Map(prev);
|
|
107
|
-
next.delete(p.uid);
|
|
108
|
-
return next;
|
|
109
|
-
});
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
// addEventListener returns an unsubscribe fn — there is no removeEventListener.
|
|
113
|
-
const offRaised = CometChatCalls.addEventListener("onParticipantHandRaised", onRaised);
|
|
114
|
-
const offLowered = CometChatCalls.addEventListener("onParticipantHandLowered", onLowered);
|
|
115
|
-
|
|
116
|
-
return () => {
|
|
117
|
-
offRaised();
|
|
118
|
-
offLowered();
|
|
119
|
-
};
|
|
120
|
-
}, []);
|
|
121
|
-
|
|
122
|
-
// Sort oldest-first — fairness queue
|
|
123
|
-
const sorted = Array.from(raised.values()).sort((a, b) => a.raisedAt - b.raisedAt);
|
|
124
|
-
if (sorted.length === 0) return null;
|
|
125
|
-
|
|
126
|
-
return (
|
|
127
|
-
<ul aria-label="Raised hands queue">
|
|
128
|
-
{sorted.map(p => (
|
|
129
|
-
<li key={p.uid}>
|
|
130
|
-
✋ {p.name} <span style={{ color: "#888" }}>{secondsAgo(p.raisedAt)}</span>
|
|
131
|
-
</li>
|
|
132
|
-
))}
|
|
133
|
-
</ul>
|
|
134
|
-
);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
function secondsAgo(t: number) { return `${Math.round((Date.now() - t) / 1000)}s ago`; }
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
Sort by `raisedAt` ascending = first-raised-first-called, which feels fair to participants. Don't sort alphabetically.
|
|
141
|
-
|
|
142
|
-
### 3. Toast notification for the host
|
|
143
|
-
|
|
144
|
-
```tsx
|
|
145
|
-
useEffect(() => {
|
|
146
|
-
const onRaised = (p: { name: string }) => {
|
|
147
|
-
toast.info(`${p.name} raised their hand`, { duration: 4000 });
|
|
148
|
-
};
|
|
149
|
-
const offRaised = CometChatCalls.addEventListener("onParticipantHandRaised", onRaised);
|
|
150
|
-
return () => offRaised();
|
|
151
|
-
}, []);
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
Use `aria-live="polite"` on the toast region so screen readers announce — same a11y pattern as new-message announcements (cf. `cometchat-a11y`).
|
|
155
|
-
|
|
156
|
-
---
|
|
157
|
-
|
|
158
|
-
## Lower-by-host pattern
|
|
159
|
-
|
|
160
|
-
The SDK exposes `lowerHand()` only for the local user. To let a host lower someone else's hand, you need a moderator action via the participant-management API:
|
|
161
|
-
|
|
162
|
-
```ts
|
|
163
|
-
// Host action — requires moderator/admin scope on the group
|
|
164
|
-
async function lowerParticipantHand(uid: string) {
|
|
165
|
-
// SDK doesn't expose remoteLowerHand directly. Two options:
|
|
166
|
-
// A) Send a custom message to the participant; their client lowers itself
|
|
167
|
-
// B) Use the moderator mute/kick API as the boundary
|
|
168
|
-
|
|
169
|
-
// Option A: lightweight, requires the participant's client to listen
|
|
170
|
-
await CometChat.sendCustomMessage(new CometChat.CustomMessage(
|
|
171
|
-
uid, CometChat.RECEIVER_TYPE.USER, "lower_hand", {}
|
|
172
|
-
));
|
|
173
|
-
}
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
On the receiving side:
|
|
177
|
-
|
|
178
|
-
```ts
|
|
179
|
-
CometChat.addMessageListener("raise-hand-control", new CometChat.MessageListener({
|
|
180
|
-
onCustomMessageReceived: (msg) => {
|
|
181
|
-
if (msg.getType() === "lower_hand") {
|
|
182
|
-
CometChatCalls.lowerHand();
|
|
183
|
-
}
|
|
184
|
-
},
|
|
185
|
-
}));
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
This is application-level signaling, not SDK-built-in. Document the contract in your team's call protocols.
|
|
189
|
-
|
|
190
|
-
---
|
|
191
|
-
|
|
192
|
-
## Hide button on rendered surfaces
|
|
193
|
-
|
|
194
|
-
If using the kit's `<CometChatOngoingCall />` and want raise-hand off entirely (e.g. 1:1 calls don't need it):
|
|
195
|
-
|
|
196
|
-
```tsx
|
|
197
|
-
import { CometChatCalls } from "@cometchat/calls-sdk-javascript";
|
|
198
|
-
|
|
199
|
-
// SessionSettings object for joinSession (hideRaiseHandButton is an object field).
|
|
200
|
-
const settings = { hideRaiseHandButton: true };
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
For 1:1 calls, default to hidden. For group calls > 5 participants, default to shown.
|
|
204
|
-
|
|
205
|
-
---
|
|
206
|
-
|
|
207
|
-
## Anti-patterns
|
|
208
|
-
|
|
209
|
-
1. **Polling for raised-hand state.** The SDK fires events on change — listen, don't poll. Polling burns CPU.
|
|
210
|
-
2. **Sorting raised-hands alphabetically.** First-raised-first-called is the fair queue. Sort by `raisedAt` ascending.
|
|
211
|
-
3. **Auto-lowering hands after a timer.** Some people raise their hand and wait. Letting the SDK manage state means the participant lowers when called or via their own button.
|
|
212
|
-
4. **Showing raise-hand button in 1:1 calls.** Visually noisy and pointless. Gate on `participantCount > 2`.
|
|
213
|
-
5. **Skipping the listener cleanup in `useEffect`'s return.** Stacked listeners fire multiple times when the component re-mounts — duplicate toasts, duplicate roster entries.
|
|
214
|
-
6. **Treating "hand raised" as a permission grant.** Raise-hand is a request, not a mute override. The host still has to unmute the participant separately.
|
|
215
|
-
|
|
216
|
-
---
|
|
217
|
-
|
|
218
|
-
## Verification checklist
|
|
219
|
-
|
|
220
|
-
- [ ] `raiseHand()` / `lowerHand()` calls in your code (not just relying on the SDK button)
|
|
221
|
-
- [ ] Both `onParticipantHandRaised` and `onParticipantHandLowered` listeners registered
|
|
222
|
-
- [ ] Listeners cleaned up in component unmount (return from `useEffect`)
|
|
223
|
-
- [ ] Roster sorted by `raisedAt` ascending
|
|
224
|
-
- [ ] `hideRaiseHandButton: true` in call settings IF custom UI is used (otherwise duplicates)
|
|
225
|
-
- [ ] Toast / badge UI uses `aria-live="polite"` (a11y)
|
|
226
|
-
- [ ] Browser smoke: 3 tabs, hand-raise from 2 of them, host's roster shows both in raise-order
|
|
227
|
-
- [ ] Lower-hand smoke: tab A raises, lowers, host's roster updates without page refresh
|
|
228
|
-
|
|
229
|
-
---
|
|
230
|
-
|
|
231
|
-
## Pointers
|
|
232
|
-
|
|
233
|
-
- `cometchat-react-calls` SKILL.md — the seven hard rules (still apply for raise-hand UI)
|
|
234
|
-
- `references/group-calls.md` — group call architecture (raise-hand is a group-call feature)
|
|
235
|
-
- `references/custom-ui.md` — custom call UI patterns
|
|
236
|
-
- `cometchat-a11y` — toast announcements for raised-hand events
|
|
237
|
-
- Canonical docs: https://www.cometchat.com/docs/calls/javascript/raise-hand
|
|
238
|
-
- For deeper SDK reference (other event types, presenter-mode interplay): query the docs MCP at `https://www.cometchat.com/docs/mcp`
|