@cometchat/skills 4.4.2 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +55 -0
- package/.claude-plugin/plugin.json +14 -0
- package/CHANGELOG.md +36 -0
- package/LICENSE +21 -0
- package/README.md +41 -163
- package/RULES.md +114 -0
- package/bin/cometchat-skills.mjs +1180 -0
- package/bin/legacy-skills.json +95 -0
- package/catalogs/android-v6.json +1646 -0
- package/catalogs/flutter-v6.json +651 -0
- package/catalogs/ios-v5.json +1383 -0
- package/catalogs/rn-calls-v5.json +134 -0
- package/catalogs/rn-calls-v5.symbols.txt +58 -0
- package/catalogs/rn-sdk-v4.json +672 -0
- package/catalogs/rn-v5.json +449 -0
- package/catalogs/rn-v5.symbols.txt +216 -0
- package/catalogs/sdk-android-v5.json +514 -0
- package/contracts.android-calls-v5.json +122 -0
- package/contracts.android-v6.json +135 -0
- package/contracts.angular-v5.json +694 -0
- package/contracts.flutter-calls-v5.json +77 -0
- package/contracts.flutter-v6.json +126 -0
- package/contracts.ios-calls-v5.json +67 -0
- package/contracts.ios-v5.json +436 -0
- package/contracts.json +82 -0
- package/contracts.rn-calls-v5.json +77 -0
- package/contracts.rn-v5.json +727 -0
- package/contracts.sdk-android-v5.json +15 -0
- package/contracts.web-calls-v5.json +45 -0
- package/features.android-calls-v5.json +246 -0
- package/features.android-v6.json +65 -0
- package/features.angular-v5.json +521 -0
- package/features.flutter-calls-v5.json +286 -0
- package/features.flutter-v6.json +484 -0
- package/features.ios-calls-v5.json +236 -0
- package/features.ios-v5.json +573 -0
- package/features.json +61 -0
- package/features.rn-calls-v5.json +187 -0
- package/features.rn-v5.json +614 -0
- package/features.sdk-android-v5.json +40 -0
- package/features.sdk-jsv4.json +24 -0
- package/features.web-calls-v5.json +108 -0
- package/package.json +151 -74
- package/peers.yaml +312 -0
- package/registry/README.md +31 -0
- package/registry/android-calls-v5.json +54 -0
- package/registry/android-v6.json +137 -0
- package/registry/angular-v5.json +114 -0
- package/registry/flutter-calls-v5.json +54 -0
- package/registry/flutter-v6.json +119 -0
- package/registry/ios-calls-v5.json +59 -0
- package/registry/ios-v5.json +97 -0
- package/registry/rn-calls-v5.json +59 -0
- package/registry/rn-v5.json +129 -0
- package/registry/sdk-android-v5.json +53 -0
- package/registry/sdk-jsv4.json +53 -0
- package/registry/web-calls-v5.json +54 -0
- package/registry/web-v7.json +99 -0
- package/skills/cometchat/SKILL.md +42 -2096
- package/skills/cometchat-android-v5-calls-sdk/SKILL.md +206 -0
- package/skills/cometchat-android-v5-calls-sdk/references/build-truth.md +63 -0
- package/skills/cometchat-android-v5-calls-sdk/references/docs-map.md +119 -0
- package/skills/cometchat-android-v5-calls-sdk/references/method-map.md +53 -0
- package/skills/cometchat-android-v5-calls-sdk/references/pitfalls.md +72 -0
- package/skills/cometchat-android-v5-calls-sdk/references/ringing.md +92 -0
- package/skills/cometchat-android-v5-calls-sdk/references/user-switch.md +90 -0
- package/skills/cometchat-android-v5-sdk/SKILL.md +127 -0
- package/skills/cometchat-android-v5-sdk/references/app-surface.md +88 -0
- package/skills/cometchat-android-v5-sdk/references/docs-map.md +91 -0
- package/skills/cometchat-android-v6-builder-settings/SKILL.md +51 -137
- package/skills/cometchat-android-v6-calls/SKILL.md +128 -413
- package/skills/cometchat-android-v6-compose-components/SKILL.md +84 -194
- package/skills/cometchat-android-v6-compose-customization/SKILL.md +66 -411
- package/skills/cometchat-android-v6-compose-placement/SKILL.md +154 -237
- package/skills/cometchat-android-v6-core/SKILL.md +236 -672
- package/skills/cometchat-android-v6-core/references/anti-patterns.md +31 -0
- package/skills/cometchat-android-v6-core/references/component-props.md +168 -0
- package/skills/cometchat-android-v6-core/references/docs-map.md +153 -0
- package/skills/cometchat-android-v6-core/references/layout.md +112 -0
- package/skills/cometchat-android-v6-core/references/lifecycle.md +75 -0
- package/skills/cometchat-android-v6-core/references/setup-credentials.md +105 -0
- package/skills/cometchat-android-v6-core/references/troubleshooting.md +36 -0
- package/skills/cometchat-android-v6-events/SKILL.md +46 -184
- package/skills/cometchat-android-v6-extensions/SKILL.md +39 -179
- package/skills/cometchat-android-v6-features/SKILL.md +74 -143
- package/skills/cometchat-android-v6-kotlin-components/SKILL.md +75 -193
- package/skills/cometchat-android-v6-kotlin-customization/SKILL.md +67 -419
- package/skills/cometchat-android-v6-kotlin-placement/SKILL.md +77 -223
- package/skills/cometchat-android-v6-migration/SKILL.md +67 -378
- package/skills/cometchat-android-v6-production/SKILL.md +40 -179
- package/skills/cometchat-android-v6-push/SKILL.md +39 -289
- package/skills/cometchat-android-v6-testing/SKILL.md +50 -265
- package/skills/cometchat-android-v6-troubleshooting/SKILL.md +70 -254
- package/skills/cometchat-angular-v5-calls/SKILL.md +193 -0
- package/skills/cometchat-angular-v5-components/SKILL.md +131 -0
- package/skills/cometchat-angular-v5-components/references/catalog.md +111 -0
- package/skills/cometchat-angular-v5-components/references/host-composed.md +46 -0
- package/skills/cometchat-angular-v5-core/SKILL.md +300 -0
- package/skills/cometchat-angular-v5-core/references/anti-patterns.md +49 -0
- package/skills/cometchat-angular-v5-core/references/component-props.md +55 -0
- package/skills/cometchat-angular-v5-core/references/dependencies.md +66 -0
- package/skills/cometchat-angular-v5-core/references/docs-map.md +132 -0
- package/skills/cometchat-angular-v5-core/references/layout.md +64 -0
- package/skills/cometchat-angular-v5-core/references/lifecycle.md +202 -0
- package/skills/cometchat-angular-v5-core/references/setup-credentials.md +137 -0
- package/skills/cometchat-angular-v5-core/references/theming.md +70 -0
- package/skills/cometchat-angular-v5-core/references/troubleshooting.md +27 -0
- package/skills/cometchat-angular-v5-customization/SKILL.md +94 -0
- package/skills/cometchat-angular-v5-features/SKILL.md +107 -0
- package/skills/cometchat-angular-v5-features/references/custom-messages.md +133 -0
- package/skills/cometchat-angular-v5-features/references/formatters.md +28 -0
- package/skills/cometchat-angular-v5-features/references/host-composed-extensions.md +85 -0
- package/skills/cometchat-angular-v5-migration/SKILL.md +40 -0
- package/skills/cometchat-angular-v5-migration/references/migration-guide.md +165 -0
- package/skills/cometchat-angular-v5-patterns/SKILL.md +107 -0
- package/skills/cometchat-angular-v5-placement/SKILL.md +133 -0
- package/skills/cometchat-angular-v5-placement/references/combined-app.md +174 -0
- package/skills/cometchat-angular-v5-placement/references/core-surface.md +199 -0
- package/skills/cometchat-angular-v5-production/SKILL.md +101 -0
- package/skills/cometchat-angular-v5-push/SKILL.md +61 -0
- package/skills/cometchat-angular-v5-testing/SKILL.md +112 -0
- package/skills/cometchat-angular-v5-troubleshooting/SKILL.md +96 -0
- package/skills/cometchat-flutter-v5-sdk/SKILL.md +188 -0
- package/skills/cometchat-flutter-v5-sdk/references/doc-corrections.md +55 -0
- package/skills/cometchat-flutter-v5-sdk/references/docs-map.md +211 -0
- package/skills/cometchat-flutter-v5-sdk/references/platform-notes.md +48 -0
- package/skills/cometchat-flutter-v5-sdk/references/transcription.md +87 -0
- package/skills/cometchat-flutter-v6-calls/SKILL.md +75 -389
- package/skills/cometchat-flutter-v6-components/SKILL.md +88 -361
- package/skills/cometchat-flutter-v6-core/SKILL.md +154 -593
- package/skills/cometchat-flutter-v6-core/references/anti-patterns.md +55 -0
- package/skills/cometchat-flutter-v6-core/references/docs-map.md +143 -0
- package/skills/cometchat-flutter-v6-core/references/layout.md +45 -0
- package/skills/cometchat-flutter-v6-core/references/lifecycle.md +87 -0
- package/skills/cometchat-flutter-v6-core/references/setup-credentials.md +84 -0
- package/skills/cometchat-flutter-v6-core/references/troubleshooting.md +26 -0
- package/skills/cometchat-flutter-v6-customization/SKILL.md +70 -712
- package/skills/cometchat-flutter-v6-events/SKILL.md +79 -174
- package/skills/cometchat-flutter-v6-features/SKILL.md +55 -394
- package/skills/cometchat-flutter-v6-migration/SKILL.md +68 -367
- package/skills/cometchat-flutter-v6-migration/references/migration-guide.md +131 -0
- package/skills/cometchat-flutter-v6-patterns/SKILL.md +61 -0
- package/skills/cometchat-flutter-v6-placement/SKILL.md +94 -381
- package/skills/cometchat-flutter-v6-production/SKILL.md +58 -615
- package/skills/cometchat-flutter-v6-push/SKILL.md +46 -455
- package/skills/cometchat-flutter-v6-testing/SKILL.md +68 -299
- package/skills/cometchat-flutter-v6-troubleshooting/SKILL.md +54 -878
- package/skills/cometchat-ios-calls/SKILL.md +112 -563
- package/skills/cometchat-ios-components/SKILL.md +44 -834
- package/skills/cometchat-ios-core/SKILL.md +181 -1068
- package/skills/cometchat-ios-core/references/anti-patterns.md +80 -0
- package/skills/cometchat-ios-core/references/docs-map.md +123 -0
- package/skills/cometchat-ios-core/references/install.md +23 -0
- package/skills/cometchat-ios-core/references/layout.md +186 -0
- package/skills/cometchat-ios-core/references/setup-credentials.md +197 -0
- package/skills/cometchat-ios-core/references/swiftui.md +91 -0
- package/skills/cometchat-ios-core/references/troubleshooting.md +100 -0
- package/skills/cometchat-ios-customization/SKILL.md +33 -968
- package/skills/cometchat-ios-features/SKILL.md +29 -738
- package/skills/cometchat-ios-migration/SKILL.md +39 -0
- package/skills/cometchat-ios-placement/SKILL.md +51 -729
- package/skills/cometchat-ios-push/SKILL.md +24 -602
- package/skills/cometchat-ios-v5-sdk/SKILL.md +161 -0
- package/skills/cometchat-ios-v5-sdk/references/docs-map.md +326 -0
- package/skills/cometchat-js-v5-sdk/SKILL.md +95 -0
- package/skills/cometchat-js-v5-sdk/references/docs-map.md +114 -0
- package/skills/cometchat-onboarding/SKILL.md +89 -0
- package/skills/cometchat-onboarding/references/archetypes.md +51 -0
- package/skills/cometchat-onboarding/references/calling-first.md +77 -0
- package/skills/cometchat-onboarding/references/not-in-this-pack.md +8 -0
- package/skills/cometchat-onboarding/references/plan-artifact.md +133 -0
- package/skills/cometchat-onboarding/references/platforms.md +90 -0
- package/skills/cometchat-react-native-bare-patterns/SKILL.md +120 -0
- package/skills/cometchat-react-native-calls/SKILL.md +200 -0
- package/skills/cometchat-react-native-components/SKILL.md +142 -0
- package/skills/cometchat-react-native-core/SKILL.md +313 -0
- package/skills/cometchat-react-native-core/references/anti-patterns.md +79 -0
- package/skills/cometchat-react-native-core/references/component-props.md +105 -0
- package/skills/cometchat-react-native-core/references/dependencies.md +62 -0
- package/skills/cometchat-react-native-core/references/docs-map.md +126 -0
- package/skills/cometchat-react-native-core/references/layout.md +61 -0
- package/skills/cometchat-react-native-core/references/lifecycle.md +64 -0
- package/skills/cometchat-react-native-core/references/setup-credentials.md +39 -0
- package/skills/cometchat-react-native-customization/SKILL.md +198 -0
- package/skills/cometchat-react-native-expo-patterns/SKILL.md +116 -0
- package/skills/cometchat-react-native-features/SKILL.md +122 -0
- package/skills/cometchat-react-native-migration/SKILL.md +103 -0
- package/skills/cometchat-react-native-placement/SKILL.md +158 -0
- package/skills/cometchat-react-native-production/SKILL.md +78 -0
- package/skills/cometchat-react-native-push/SKILL.md +88 -0
- package/skills/cometchat-react-native-sdk/SKILL.md +126 -0
- package/skills/cometchat-react-native-sdk/references/method-map.md +239 -0
- package/skills/cometchat-react-native-sdk/references/page-map.md +96 -0
- package/skills/cometchat-react-native-testing/SKILL.md +94 -0
- package/skills/cometchat-react-native-troubleshooting/SKILL.md +116 -0
- package/skills/cometchat-react-native-v5-sdk/SKILL.md +150 -0
- package/skills/cometchat-react-native-v5-sdk/references/docs-map.md +127 -0
- package/skills/cometchat-react-native-v5-sdk/references/ringing-voip.md +369 -0
- package/skills/cometchat-react-v7-calls/SKILL.md +75 -0
- package/skills/cometchat-react-v7-components/SKILL.md +72 -0
- package/skills/cometchat-react-v7-core/SKILL.md +101 -0
- package/skills/cometchat-react-v7-core/references/anti-patterns.md +19 -0
- package/skills/cometchat-react-v7-core/references/component-props.md +82 -0
- package/skills/cometchat-react-v7-core/references/dependencies.md +23 -0
- package/skills/cometchat-react-v7-core/references/docs-map.md +117 -0
- package/skills/cometchat-react-v7-core/references/i18n-rtl-a11y.md +22 -0
- package/skills/cometchat-react-v7-core/references/layout.md +158 -0
- package/skills/cometchat-react-v7-core/references/lifecycle.md +74 -0
- package/skills/cometchat-react-v7-core/references/setup-credentials.md +58 -0
- package/skills/cometchat-react-v7-core/references/ssr.md +11 -0
- package/skills/cometchat-react-v7-core/references/theming.md +52 -0
- package/skills/cometchat-react-v7-core/references/troubleshooting.md +28 -0
- package/skills/cometchat-react-v7-customization/SKILL.md +84 -0
- package/skills/cometchat-react-v7-features/SKILL.md +92 -0
- package/skills/cometchat-react-v7-migration/SKILL.md +39 -0
- package/skills/cometchat-react-v7-migration/references/migration-guide.md +119 -0
- package/skills/cometchat-react-v7-patterns/SKILL.md +43 -0
- package/skills/cometchat-react-v7-placement/SKILL.md +106 -0
- package/skills/cometchat-react-v7-placement/references/recipes.md +354 -0
- package/skills/cometchat-react-v7-push/SKILL.md +53 -0
- package/test-suite/README.md +70 -0
- package/test-suite/catalogs/android-calls-v5.json +830 -0
- package/test-suite/catalogs/android-calls-v5.symbols.txt +499 -0
- package/test-suite/catalogs/android-v6.json +1646 -0
- package/test-suite/catalogs/android-v6.symbols.txt +298 -0
- package/test-suite/catalogs/angular-v5.json +7587 -0
- package/test-suite/catalogs/flutter-calls-v5.json +196 -0
- package/test-suite/catalogs/flutter-calls-v5.symbols.txt +59 -0
- package/test-suite/catalogs/flutter-v6.json +651 -0
- package/test-suite/catalogs/ios-calls-v5.json +158 -0
- package/test-suite/catalogs/ios-calls-v5.symbols.txt +70 -0
- package/test-suite/catalogs/ios-v5.json +1383 -0
- package/test-suite/catalogs/ios-v5.symbols.txt +699 -0
- package/test-suite/catalogs/rn-calls-v5.json +134 -0
- package/test-suite/catalogs/rn-sdk-v4.json +672 -0
- package/test-suite/catalogs/rn-v5.json +449 -0
- package/test-suite/catalogs/sdk-android-v5.json +514 -0
- package/test-suite/catalogs/sdk-android-v5.symbols.txt +254 -0
- package/test-suite/catalogs/sdk-jsv4.json +800 -0
- package/test-suite/catalogs/web-calls-v5.json +195 -0
- package/test-suite/catalogs/web-v7.json +1243 -0
- package/test-suite/scripts/build-registry.mjs +113 -0
- package/test-suite/scripts/catalog-refresh-dart.mjs +151 -0
- package/test-suite/scripts/catalog-refresh.mjs +100 -0
- package/test-suite/scripts/lint-skills.mjs +909 -0
- package/test-suite/scripts/measure-tokens.mjs +169 -0
- package/test-suite/scripts/typecheck-fences-dart.mjs +437 -0
- package/test-suite/scripts/typecheck-fences-kotlin.mjs +269 -0
- package/test-suite/scripts/typecheck-fences.mjs +206 -0
- package/test-suite/scripts/verify-catalog.mjs +242 -0
- package/test-suite/scripts/verify-contract-fences.mjs +94 -0
- package/test-suite/scripts/verify-detection.mjs +178 -0
- package/test-suite/scripts/verify-docs-base.mjs +91 -0
- package/test-suite/scripts/verify-family-agnostic.mjs +130 -0
- package/test-suite/scripts/verify-golden-path.mjs +138 -0
- package/test-suite/scripts/verify-oracle-components.mjs +133 -0
- package/test-suite/scripts/verify-template-bindings.mjs +148 -0
- package/test-suite/typecheck/angular-v5/package.json +21 -0
- package/test-suite/typecheck/angular-v5/tsconfig.json +21 -0
- package/test-suite/typecheck/flutter-v6/analysis_options.yaml +25 -0
- package/test-suite/typecheck/flutter-v6/pubspec.yaml +21 -0
- package/test-suite/typecheck/web-v7/package.json +18 -0
- package/test-suite/typecheck/web-v7/tsconfig.json +19 -0
- package/bin/install.js +0 -1003
- package/skills/.claude-plugin/marketplace.json +0 -86
- package/skills/cometchat/references/asking-questions.md +0 -48
- package/skills/cometchat-a11y/SKILL.md +0 -477
- package/skills/cometchat-android-v5/SKILL.md +0 -121
- package/skills/cometchat-android-v5-calls/SKILL.md +0 -429
- package/skills/cometchat-android-v5-calls/references/README.md +0 -53
- package/skills/cometchat-android-v5-calls/references/add-calls-to-existing-chat.md +0 -197
- package/skills/cometchat-android-v5-calls/references/audio-controls.md +0 -91
- package/skills/cometchat-android-v5-calls/references/background-handling.md +0 -168
- package/skills/cometchat-android-v5-calls/references/call-layouts.md +0 -131
- package/skills/cometchat-android-v5-calls/references/call-logs.md +0 -113
- package/skills/cometchat-android-v5-calls/references/call-session.md +0 -274
- package/skills/cometchat-android-v5-calls/references/custom-ui.md +0 -150
- package/skills/cometchat-android-v5-calls/references/event-listeners.md +0 -123
- package/skills/cometchat-android-v5-calls/references/group-calls.md +0 -205
- package/skills/cometchat-android-v5-calls/references/idle-timeout.md +0 -117
- package/skills/cometchat-android-v5-calls/references/in-call-chat.md +0 -134
- package/skills/cometchat-android-v5-calls/references/join-session.md +0 -120
- package/skills/cometchat-android-v5-calls/references/migration-v4-to-v5.md +0 -222
- package/skills/cometchat-android-v5-calls/references/participant-management.md +0 -110
- package/skills/cometchat-android-v5-calls/references/picture-in-picture.md +0 -106
- package/skills/cometchat-android-v5-calls/references/raise-hand.md +0 -248
- package/skills/cometchat-android-v5-calls/references/recording.md +0 -101
- package/skills/cometchat-android-v5-calls/references/ringing-integration.md +0 -152
- package/skills/cometchat-android-v5-calls/references/screen-sharing.md +0 -78
- package/skills/cometchat-android-v5-calls/references/server-fcm-voip.md +0 -215
- package/skills/cometchat-android-v5-calls/references/session-settings.md +0 -121
- package/skills/cometchat-android-v5-calls/references/setup.md +0 -137
- package/skills/cometchat-android-v5-calls/references/share-invite.md +0 -156
- package/skills/cometchat-android-v5-calls/references/video-controls.md +0 -87
- package/skills/cometchat-android-v5-calls/references/voip-calling.md +0 -526
- package/skills/cometchat-android-v5-components/SKILL.md +0 -431
- package/skills/cometchat-android-v5-core/SKILL.md +0 -486
- package/skills/cometchat-android-v5-customization/SKILL.md +0 -469
- package/skills/cometchat-android-v5-extensions/SKILL.md +0 -127
- package/skills/cometchat-android-v5-features/SKILL.md +0 -131
- package/skills/cometchat-android-v5-placement/SKILL.md +0 -277
- package/skills/cometchat-android-v5-production/SKILL.md +0 -95
- package/skills/cometchat-android-v5-push/SKILL.md +0 -619
- package/skills/cometchat-android-v5-testing/SKILL.md +0 -188
- package/skills/cometchat-android-v5-theming/SKILL.md +0 -167
- package/skills/cometchat-android-v5-troubleshooting/SKILL.md +0 -74
- package/skills/cometchat-android-v6/SKILL.md +0 -108
- package/skills/cometchat-android-v6-calls/references/add-calls-to-existing-chat.md +0 -97
- package/skills/cometchat-android-v6-calls/references/advanced-features.md +0 -87
- package/skills/cometchat-android-v6-calls/references/call-layouts.md +0 -100
- package/skills/cometchat-android-v6-calls/references/call-session.md +0 -163
- package/skills/cometchat-android-v6-calls/references/device-management.md +0 -172
- package/skills/cometchat-android-v6-calls/references/group-calls.md +0 -191
- package/skills/cometchat-android-v6-calls/references/idle-timeout.md +0 -110
- package/skills/cometchat-android-v6-calls/references/in-call-chat.md +0 -141
- package/skills/cometchat-android-v6-calls/references/raise-hand.md +0 -188
- package/skills/cometchat-android-v6-calls/references/ringing-integration.md +0 -176
- package/skills/cometchat-android-v6-calls/references/server-fcm-voip.md +0 -127
- package/skills/cometchat-android-v6-calls/references/share-invite.md +0 -105
- package/skills/cometchat-android-v6-compose-theming/SKILL.md +0 -250
- package/skills/cometchat-android-v6-kotlin-theming/SKILL.md +0 -233
- package/skills/cometchat-angular-calls/SKILL.md +0 -380
- package/skills/cometchat-angular-calls/references/add-calls-to-existing-chat.md +0 -96
- package/skills/cometchat-angular-calls/references/call-layouts.md +0 -123
- package/skills/cometchat-angular-calls/references/call-session.md +0 -167
- package/skills/cometchat-angular-calls/references/custom-ui.md +0 -239
- package/skills/cometchat-angular-calls/references/device-management.md +0 -154
- package/skills/cometchat-angular-calls/references/group-calls.md +0 -433
- package/skills/cometchat-angular-calls/references/idle-timeout.md +0 -161
- package/skills/cometchat-angular-calls/references/in-call-chat.md +0 -148
- package/skills/cometchat-angular-calls/references/lazy-loading-pitfalls.md +0 -205
- package/skills/cometchat-angular-calls/references/migration-v4-to-v5.md +0 -53
- package/skills/cometchat-angular-calls/references/ngzone-and-async-callbacks.md +0 -184
- package/skills/cometchat-angular-calls/references/picture-in-picture.md +0 -285
- package/skills/cometchat-angular-calls/references/raise-hand.md +0 -172
- package/skills/cometchat-angular-calls/references/recording-screen-share.md +0 -260
- package/skills/cometchat-angular-calls/references/ringing-integration.md +0 -133
- package/skills/cometchat-angular-calls/references/server-web-push-vapid.md +0 -100
- package/skills/cometchat-angular-calls/references/share-invite.md +0 -122
- package/skills/cometchat-angular-calls/references/virtual-background.md +0 -29
- package/skills/cometchat-angular-components/SKILL.md +0 -235
- package/skills/cometchat-angular-core/SKILL.md +0 -386
- package/skills/cometchat-angular-customization/SKILL.md +0 -616
- package/skills/cometchat-angular-features/SKILL.md +0 -329
- package/skills/cometchat-angular-patterns/SKILL.md +0 -256
- package/skills/cometchat-angular-placement/SKILL.md +0 -314
- package/skills/cometchat-angular-production/SKILL.md +0 -564
- package/skills/cometchat-angular-push/SKILL.md +0 -389
- package/skills/cometchat-angular-testing/SKILL.md +0 -605
- package/skills/cometchat-angular-theming/SKILL.md +0 -290
- package/skills/cometchat-angular-troubleshooting/SKILL.md +0 -364
- package/skills/cometchat-astro-patterns/SKILL.md +0 -708
- package/skills/cometchat-calls/SKILL.md +0 -364
- package/skills/cometchat-calls/references/use-case-broadcast.md +0 -199
- package/skills/cometchat-calls/references/use-case-marketplace.md +0 -157
- package/skills/cometchat-calls/references/use-case-support.md +0 -189
- package/skills/cometchat-calls/references/use-case-team.md +0 -180
- package/skills/cometchat-calls/references/use-case-telehealth.md +0 -153
- package/skills/cometchat-components/SKILL.md +0 -1142
- package/skills/cometchat-core/SKILL.md +0 -1048
- package/skills/cometchat-customization/SKILL.md +0 -580
- package/skills/cometchat-customization/references/component-catalog.md +0 -236
- package/skills/cometchat-features/SKILL.md +0 -861
- package/skills/cometchat-flutter-v5/SKILL.md +0 -173
- package/skills/cometchat-flutter-v5-calls/SKILL.md +0 -455
- package/skills/cometchat-flutter-v5-calls/references/add-calls-to-existing-chat.md +0 -193
- package/skills/cometchat-flutter-v5-calls/references/call-layouts.md +0 -103
- package/skills/cometchat-flutter-v5-calls/references/call-session.md +0 -285
- package/skills/cometchat-flutter-v5-calls/references/device-management.md +0 -124
- package/skills/cometchat-flutter-v5-calls/references/group-calls.md +0 -181
- package/skills/cometchat-flutter-v5-calls/references/idle-timeout.md +0 -99
- package/skills/cometchat-flutter-v5-calls/references/in-call-chat.md +0 -135
- package/skills/cometchat-flutter-v5-calls/references/migration-v4-to-v5.md +0 -210
- package/skills/cometchat-flutter-v5-calls/references/raise-hand.md +0 -255
- package/skills/cometchat-flutter-v5-calls/references/ringing-integration.md +0 -196
- package/skills/cometchat-flutter-v5-calls/references/server-push-bridge.md +0 -101
- package/skills/cometchat-flutter-v5-calls/references/share-invite.md +0 -148
- package/skills/cometchat-flutter-v5-conversations/SKILL.md +0 -118
- package/skills/cometchat-flutter-v5-core/SKILL.md +0 -239
- package/skills/cometchat-flutter-v5-customization/SKILL.md +0 -358
- package/skills/cometchat-flutter-v5-events/SKILL.md +0 -156
- package/skills/cometchat-flutter-v5-messages/SKILL.md +0 -259
- package/skills/cometchat-flutter-v5-production/SKILL.md +0 -216
- package/skills/cometchat-flutter-v5-push/SKILL.md +0 -285
- package/skills/cometchat-flutter-v5-testing/SKILL.md +0 -401
- package/skills/cometchat-flutter-v5-theming/SKILL.md +0 -161
- package/skills/cometchat-flutter-v5-troubleshooting/SKILL.md +0 -130
- package/skills/cometchat-flutter-v5-users-groups/SKILL.md +0 -152
- package/skills/cometchat-flutter-v6/SKILL.md +0 -446
- package/skills/cometchat-flutter-v6-calls/references/add-calls-to-existing-chat.md +0 -136
- package/skills/cometchat-flutter-v6-calls/references/advanced-features.md +0 -89
- package/skills/cometchat-flutter-v6-calls/references/call-layouts.md +0 -105
- package/skills/cometchat-flutter-v6-calls/references/call-session.md +0 -229
- package/skills/cometchat-flutter-v6-calls/references/device-management.md +0 -105
- package/skills/cometchat-flutter-v6-calls/references/group-calls.md +0 -190
- package/skills/cometchat-flutter-v6-calls/references/idle-timeout.md +0 -88
- package/skills/cometchat-flutter-v6-calls/references/in-call-chat.md +0 -125
- package/skills/cometchat-flutter-v6-calls/references/raise-hand.md +0 -275
- package/skills/cometchat-flutter-v6-calls/references/ringing-integration.md +0 -171
- package/skills/cometchat-flutter-v6-calls/references/server-push-bridge.md +0 -93
- package/skills/cometchat-flutter-v6-calls/references/share-invite.md +0 -102
- package/skills/cometchat-flutter-v6-conversations/SKILL.md +0 -238
- package/skills/cometchat-flutter-v6-messages/SKILL.md +0 -384
- package/skills/cometchat-flutter-v6-theming/SKILL.md +0 -293
- package/skills/cometchat-flutter-v6-users-groups/SKILL.md +0 -224
- package/skills/cometchat-i18n/SKILL.md +0 -419
- package/skills/cometchat-ios/SKILL.md +0 -325
- package/skills/cometchat-ios-calls/references/add-calls-to-existing-chat.md +0 -181
- package/skills/cometchat-ios-calls/references/audio-modes-and-controls.md +0 -45
- package/skills/cometchat-ios-calls/references/avaudiosession-routing.md +0 -188
- package/skills/cometchat-ios-calls/references/call-layouts.md +0 -76
- package/skills/cometchat-ios-calls/references/call-session.md +0 -218
- package/skills/cometchat-ios-calls/references/callkit-and-pushkit.md +0 -357
- package/skills/cometchat-ios-calls/references/custom-ui.md +0 -322
- package/skills/cometchat-ios-calls/references/device-management.md +0 -171
- package/skills/cometchat-ios-calls/references/group-calls.md +0 -359
- package/skills/cometchat-ios-calls/references/idle-timeout.md +0 -184
- package/skills/cometchat-ios-calls/references/in-call-chat.md +0 -179
- package/skills/cometchat-ios-calls/references/migration-v4-to-v5.md +0 -196
- package/skills/cometchat-ios-calls/references/picture-in-picture.md +0 -246
- package/skills/cometchat-ios-calls/references/raise-hand.md +0 -26
- package/skills/cometchat-ios-calls/references/recording-screen-share.md +0 -252
- package/skills/cometchat-ios-calls/references/ringing-integration.md +0 -143
- package/skills/cometchat-ios-calls/references/server-apns-pushkit.md +0 -267
- package/skills/cometchat-ios-calls/references/share-invite.md +0 -148
- package/skills/cometchat-ios-calls/references/swiftui-uikit-hosting.md +0 -246
- package/skills/cometchat-ios-calls/references/voip-cert-setup.md +0 -166
- package/skills/cometchat-ios-production/SKILL.md +0 -738
- package/skills/cometchat-ios-testing/SKILL.md +0 -376
- package/skills/cometchat-ios-theming/SKILL.md +0 -667
- package/skills/cometchat-ios-troubleshooting/SKILL.md +0 -1003
- package/skills/cometchat-native-bare-patterns/SKILL.md +0 -550
- package/skills/cometchat-native-calls/SKILL.md +0 -671
- package/skills/cometchat-native-calls/references/add-calls-to-existing-chat.md +0 -203
- package/skills/cometchat-native-calls/references/call-layouts.md +0 -125
- package/skills/cometchat-native-calls/references/call-session.md +0 -182
- package/skills/cometchat-native-calls/references/custom-ui.md +0 -254
- package/skills/cometchat-native-calls/references/device-management.md +0 -158
- package/skills/cometchat-native-calls/references/expo-vs-bare.md +0 -179
- package/skills/cometchat-native-calls/references/group-calls.md +0 -296
- package/skills/cometchat-native-calls/references/idle-timeout.md +0 -128
- package/skills/cometchat-native-calls/references/in-call-chat.md +0 -145
- package/skills/cometchat-native-calls/references/migration-v4-to-v5.md +0 -72
- package/skills/cometchat-native-calls/references/picture-in-picture.md +0 -276
- package/skills/cometchat-native-calls/references/raise-hand.md +0 -205
- package/skills/cometchat-native-calls/references/recording-screen-share.md +0 -169
- package/skills/cometchat-native-calls/references/ringing-integration.md +0 -118
- package/skills/cometchat-native-calls/references/server-push-bridge.md +0 -135
- package/skills/cometchat-native-calls/references/server-push-payloads.md +0 -193
- package/skills/cometchat-native-calls/references/share-invite.md +0 -146
- package/skills/cometchat-native-calls/references/voip-push-end-to-end.md +0 -319
- package/skills/cometchat-native-components/SKILL.md +0 -628
- package/skills/cometchat-native-core/SKILL.md +0 -679
- package/skills/cometchat-native-customization/SKILL.md +0 -716
- package/skills/cometchat-native-expo-patterns/SKILL.md +0 -552
- package/skills/cometchat-native-features/SKILL.md +0 -638
- package/skills/cometchat-native-placement/SKILL.md +0 -509
- package/skills/cometchat-native-production/SKILL.md +0 -700
- package/skills/cometchat-native-push/SKILL.md +0 -594
- package/skills/cometchat-native-testing/SKILL.md +0 -582
- package/skills/cometchat-native-theming/SKILL.md +0 -681
- package/skills/cometchat-native-troubleshooting/SKILL.md +0 -501
- package/skills/cometchat-nextjs-patterns/SKILL.md +0 -899
- package/skills/cometchat-placement/SKILL.md +0 -1360
- package/skills/cometchat-production/SKILL.md +0 -1027
- package/skills/cometchat-react-calls/SKILL.md +0 -752
- package/skills/cometchat-react-calls/references/add-calls-to-existing-chat.md +0 -146
- package/skills/cometchat-react-calls/references/call-layouts.md +0 -160
- package/skills/cometchat-react-calls/references/call-session.md +0 -235
- package/skills/cometchat-react-calls/references/custom-ui.md +0 -247
- package/skills/cometchat-react-calls/references/device-management.md +0 -210
- package/skills/cometchat-react-calls/references/group-calls.md +0 -257
- package/skills/cometchat-react-calls/references/idle-timeout.md +0 -188
- package/skills/cometchat-react-calls/references/in-call-chat.md +0 -212
- package/skills/cometchat-react-calls/references/migration-v4-to-v5.md +0 -170
- package/skills/cometchat-react-calls/references/picture-in-picture.md +0 -245
- package/skills/cometchat-react-calls/references/raise-hand.md +0 -238
- package/skills/cometchat-react-calls/references/recording-screen-share.md +0 -144
- package/skills/cometchat-react-calls/references/ringing-integration.md +0 -255
- package/skills/cometchat-react-calls/references/server-web-push-vapid.md +0 -241
- package/skills/cometchat-react-calls/references/share-invite.md +0 -175
- package/skills/cometchat-react-calls/references/testing-calls-on-web.md +0 -216
- package/skills/cometchat-react-calls/references/virtual-background.md +0 -32
- package/skills/cometchat-react-calls/references/voip-and-web-push.md +0 -165
- package/skills/cometchat-react-patterns/SKILL.md +0 -628
- package/skills/cometchat-react-push/SKILL.md +0 -634
- package/skills/cometchat-react-router-patterns/SKILL.md +0 -758
- package/skills/cometchat-react-testing/SKILL.md +0 -413
- package/skills/cometchat-theming/SKILL.md +0 -498
- package/skills/cometchat-troubleshooting/SKILL.md +0 -294
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
# Share invite on web (React)
|
|
2
|
-
|
|
3
|
-
Let participants share the call link with others. The kit ships a share-invite button (hidden by default); your app intercepts the click and runs the platform's native share UI.
|
|
4
|
-
|
|
5
|
-
**Canonical docs:** https://www.cometchat.com/docs/calls/javascript/share-invite
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Hard rule: deep-link routing must work BEFORE you ship share-invite
|
|
10
|
-
|
|
11
|
-
A share button that copies a URL nobody can open is worse than no share button. Verify your app's `/call/:sessionId` route handles all four states:
|
|
12
|
-
|
|
13
|
-
1. **User logged in, in-app** → join call directly
|
|
14
|
-
2. **User logged in, fresh tab** → restore session, join call
|
|
15
|
-
3. **User logged out** → login, then redirect to call
|
|
16
|
-
4. **User doesn't have account** → signup flow with `?invite=...` query param
|
|
17
|
-
|
|
18
|
-
Build the deep-link route first, then turn on the share button.
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## Show the kit's share button
|
|
23
|
-
|
|
24
|
-
```tsx
|
|
25
|
-
const callSettings = {
|
|
26
|
-
hideShareInviteButton: false,
|
|
27
|
-
// ... rest
|
|
28
|
-
};
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
## Handle the click
|
|
34
|
-
|
|
35
|
-
```tsx
|
|
36
|
-
useEffect(() => {
|
|
37
|
-
const handler = () => shareCallInvite(sessionId);
|
|
38
|
-
// addEventListener returns an unsubscribe fn — there is no removeEventListener.
|
|
39
|
-
const off = CometChatCalls.addEventListener("onShareInviteButtonClicked", handler);
|
|
40
|
-
return () => off();
|
|
41
|
-
}, [sessionId]);
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## Native Web Share API + clipboard fallback
|
|
47
|
-
|
|
48
|
-
```tsx
|
|
49
|
-
async function shareCallInvite(sessionId: string) {
|
|
50
|
-
const url = `https://yourapp.com/call/${sessionId}`;
|
|
51
|
-
const shareData = {
|
|
52
|
-
title: "Join my call",
|
|
53
|
-
text: "I'm on a call — tap to join.",
|
|
54
|
-
url,
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
if (navigator.share && navigator.canShare?.(shareData)) {
|
|
58
|
-
try {
|
|
59
|
-
await navigator.share(shareData);
|
|
60
|
-
} catch (err) {
|
|
61
|
-
// User cancelled — that's fine, no toast needed
|
|
62
|
-
if ((err as Error).name !== "AbortError") {
|
|
63
|
-
console.warn("Share failed", err);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Fallback: clipboard
|
|
70
|
-
try {
|
|
71
|
-
await navigator.clipboard.writeText(url);
|
|
72
|
-
showToast("Link copied to clipboard");
|
|
73
|
-
} catch {
|
|
74
|
-
// Clipboard API requires user gesture + secure context (https) — must always have a manual fallback
|
|
75
|
-
promptManualCopy(url);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
`navigator.share` is iOS Safari + Android Chrome + recent desktop Chrome. `navigator.clipboard.writeText` is everywhere modern but **only works in secure contexts (https)** — localhost is fine; non-https staging hosts will throw.
|
|
81
|
-
|
|
82
|
-
---
|
|
83
|
-
|
|
84
|
-
## Custom share dialog (when you want more control)
|
|
85
|
-
|
|
86
|
-
```tsx
|
|
87
|
-
function ShareDialog({ sessionId, onClose }: Props) {
|
|
88
|
-
const url = `https://yourapp.com/call/${sessionId}`;
|
|
89
|
-
return (
|
|
90
|
-
<dialog open className="share-dialog" role="dialog" aria-label="Share call invite">
|
|
91
|
-
<button onClick={() => navigator.clipboard.writeText(url)}>Copy link</button>
|
|
92
|
-
<a href={`mailto:?subject=Join%20my%20call&body=${encodeURIComponent(url)}`}>Email</a>
|
|
93
|
-
<a href={`sms:?body=${encodeURIComponent(url)}`}>SMS</a>
|
|
94
|
-
<button onClick={onClose}>Close</button>
|
|
95
|
-
</dialog>
|
|
96
|
-
);
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
`mailto:` opens default email client; `sms:` opens default SMS app on mobile (no-op on most desktops). Both are universal — no provider lock-in.
|
|
101
|
-
|
|
102
|
-
---
|
|
103
|
-
|
|
104
|
-
## QR code for in-person sharing
|
|
105
|
-
|
|
106
|
-
For "share to the person sitting next to you" UX, a QR is faster than a link:
|
|
107
|
-
|
|
108
|
-
```tsx
|
|
109
|
-
import QRCode from "qrcode.react";
|
|
110
|
-
|
|
111
|
-
function CallQR({ sessionId }: { sessionId: string }) {
|
|
112
|
-
const url = `https://yourapp.com/call/${sessionId}`;
|
|
113
|
-
return (
|
|
114
|
-
<div>
|
|
115
|
-
<QRCode value={url} size={192} />
|
|
116
|
-
<p>{url}</p>
|
|
117
|
-
</div>
|
|
118
|
-
);
|
|
119
|
-
}
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
---
|
|
123
|
-
|
|
124
|
-
## Anti-patterns
|
|
125
|
-
|
|
126
|
-
1. **Sharing the raw `sessionId` instead of a deep link.** Recipients can't open it.
|
|
127
|
-
2. **Wiring share before the deep-link route works.** Recipients click → 404.
|
|
128
|
-
3. **`navigator.clipboard.writeText` without a manual-copy fallback.** Fails in non-https contexts (e.g., embedded iframes, dev tunnels).
|
|
129
|
-
4. **Showing "Link copied!" toast even when share was cancelled.** `AbortError` is the user dismissing the share sheet — silent.
|
|
130
|
-
5. **Forgetting to call the unsubscribe fn on unmount.** `addEventListener` returns a `() => void` — call it in cleanup (there is no `removeEventListener`). Otherwise the listener accumulates → multiple share sheets per click.
|
|
131
|
-
6. **Hard-coding `https://yourapp.com`.** Use `window.location.origin` or `import.meta.env.VITE_APP_URL`.
|
|
132
|
-
|
|
133
|
-
---
|
|
134
|
-
|
|
135
|
-
## Server-side: deep links + auth bridge
|
|
136
|
-
|
|
137
|
-
If invitee isn't logged in, `https://yourapp.com/call/SESSION_ID` should redirect them through login THEN to the call. Pattern:
|
|
138
|
-
|
|
139
|
-
```ts
|
|
140
|
-
// pages/call/[sessionId].tsx (Next.js example)
|
|
141
|
-
export async function getServerSideProps({ params, req }) {
|
|
142
|
-
const session = await getSession(req);
|
|
143
|
-
if (!session) {
|
|
144
|
-
return {
|
|
145
|
-
redirect: {
|
|
146
|
-
destination: `/login?next=/call/${params.sessionId}`,
|
|
147
|
-
permanent: false,
|
|
148
|
-
},
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
return { props: { sessionId: params.sessionId } };
|
|
152
|
-
}
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
For invitees without an account, send them to `/signup?invite=SESSION_ID` and store the pending invite in `localStorage` until signup completes.
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
|
-
## Verification checklist
|
|
160
|
-
|
|
161
|
-
- [ ] Deep-link route `/call/:sessionId` works in 4 states (logged in / logged out / no account / fresh tab)
|
|
162
|
-
- [ ] `hideShareInviteButton: false` in CallSettings
|
|
163
|
-
- [ ] `onShareInviteButtonClicked` listener cleaned up on unmount
|
|
164
|
-
- [ ] `navigator.share` used when available; clipboard fallback; manual-copy fallback for non-https
|
|
165
|
-
- [ ] AbortError silenced
|
|
166
|
-
- [ ] App URL not hard-coded — read from env
|
|
167
|
-
- [ ] Smoke: copy link → paste in incognito → can join call
|
|
168
|
-
|
|
169
|
-
---
|
|
170
|
-
|
|
171
|
-
## Pointers
|
|
172
|
-
|
|
173
|
-
- `cometchat-react-calls/SKILL.md` — call architecture
|
|
174
|
-
- `cometchat-react-calls/references/in-call-chat.md` — sister cross-cutting concern
|
|
175
|
-
- Canonical docs: https://www.cometchat.com/docs/calls/javascript/share-invite
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
# Testing calls on web
|
|
2
|
-
|
|
3
|
-
Calls are the hardest CometChat surface to unit-test because they touch native browser APIs (`getUserMedia`, `RTCPeerConnection`) that don't exist in jsdom. Three layers, three strategies:
|
|
4
|
-
|
|
5
|
-
1. **Unit tests** — mock the entire Calls SDK; assert your code calls the right methods in the right order.
|
|
6
|
-
2. **Component tests** — Vitest + React Testing Library; mock `getUserMedia` and `RTCPeerConnection`; assert your custom UI renders correctly given mocked SDK events.
|
|
7
|
-
3. **E2E tests** — Playwright with the headless WebRTC flag; real two-tab call between two test users.
|
|
8
|
-
|
|
9
|
-
This reference covers all three. For chat-side testing patterns, see `cometchat-react-testing` (sibling skill).
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## ⚠️ Ringing-mode manual testing needs TWO ISOLATED browser contexts (not two tabs)
|
|
14
|
-
|
|
15
|
-
The single most common "incoming call never rings / Accept never appears" report is a **test-setup** problem, not a code bug:
|
|
16
|
-
|
|
17
|
-
**The Chat SDK is one session per browser origin.** `CometChat.login()` persists the logged-in user in **IndexedDB/localStorage keyed by `appId`** and maintains **one WebSocket per origin** — both **shared across every tab** of `localhost:5173`. Two tabs in the *same* browser therefore CANNOT hold two different logins: the second tab's login overwrites the shared session, so there is no independent callee connected to receive `onIncomingCallReceived`. A per-tab `sessionStorage` "user switcher" only changes what *your app* thinks the user is — the Chat SDK underneath is still a single shared session.
|
|
18
|
-
|
|
19
|
-
- **Ringing mode (1:1 / `initiateCall` → `onIncomingCallReceived`)** → needs **two isolated contexts**: a normal window for the caller + an **Incognito/Private window** (or a different browser, or a second device) for the callee. Only then are there two distinct Chat-SDK sessions + sockets.
|
|
20
|
-
- **Session/meeting mode (`joinSession` on a shared `sessionId`)** → two tabs in the *same* browser are fine — it doesn't depend on two live Chat-SDK logins; both sides just join the same session id.
|
|
21
|
-
|
|
22
|
-
Sanity-check in the callee context's console — it must show the callee, not the caller:
|
|
23
|
-
```js
|
|
24
|
-
await CometChat.getLoggedinUser() // → User { uid: "cometchat-uid-2", ... }
|
|
25
|
-
```
|
|
26
|
-
If it shows the caller's uid (or `null`), the callee isn't an independent receiver — that's the shared-session symptom.
|
|
27
|
-
|
|
28
|
-
Two devices on a LAN need HTTPS for `getUserMedia` (secure-context), but the ring itself arrives over plain `localhost` in incognito.
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## 1. Unit tests — mock the SDK module
|
|
33
|
-
|
|
34
|
-
Vitest's `vi.mock` with a hoisted factory:
|
|
35
|
-
|
|
36
|
-
```ts
|
|
37
|
-
// __tests__/CallButton.test.tsx
|
|
38
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
39
|
-
import { render, screen, fireEvent } from "@testing-library/react";
|
|
40
|
-
import { CometChatCalls } from "@cometchat/calls-sdk-javascript";
|
|
41
|
-
import { CallButton } from "../src/components/CallButton";
|
|
42
|
-
|
|
43
|
-
vi.mock("@cometchat/chat-sdk-javascript", () => ({
|
|
44
|
-
CometChat: {
|
|
45
|
-
initiateCall: vi.fn().mockResolvedValue({ getSessionId: () => "session-123" }),
|
|
46
|
-
Call: vi.fn((uid, type, recv) => ({ uid, type, recv })),
|
|
47
|
-
CALL_TYPE: { VOICE: "voice", VIDEO: "video" },
|
|
48
|
-
RECEIVER_TYPE: { USER: "user" },
|
|
49
|
-
},
|
|
50
|
-
}));
|
|
51
|
-
|
|
52
|
-
vi.mock("@cometchat/calls-sdk-javascript", () => ({
|
|
53
|
-
CometChatCalls: {
|
|
54
|
-
init: vi.fn(),
|
|
55
|
-
generateToken: vi.fn().mockResolvedValue({ token: "rtc-token" }),
|
|
56
|
-
startSession: vi.fn(),
|
|
57
|
-
endSession: vi.fn(),
|
|
58
|
-
CallSettingsBuilder: class {
|
|
59
|
-
setIsAudioOnlyCall() { return this; }
|
|
60
|
-
enableDefaultLayout() { return this; }
|
|
61
|
-
build() { return {}; }
|
|
62
|
-
},
|
|
63
|
-
},
|
|
64
|
-
}));
|
|
65
|
-
|
|
66
|
-
beforeEach(() => vi.clearAllMocks());
|
|
67
|
-
|
|
68
|
-
describe("CallButton", () => {
|
|
69
|
-
it("initiates a video call when video button clicked", async () => {
|
|
70
|
-
const { CometChat } = await import("@cometchat/chat-sdk-javascript");
|
|
71
|
-
render(<CallButton user={{ uid: "alice" }} />);
|
|
72
|
-
|
|
73
|
-
await fireEvent.click(screen.getByLabelText("Start video call"));
|
|
74
|
-
|
|
75
|
-
expect(CometChat.initiateCall).toHaveBeenCalledWith(
|
|
76
|
-
expect.objectContaining({ uid: "alice", type: "video" }),
|
|
77
|
-
);
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
---
|
|
83
|
-
|
|
84
|
-
## 2. Component tests — mock `getUserMedia` + `RTCPeerConnection`
|
|
85
|
-
|
|
86
|
-
For tests that exercise your custom UI's reaction to track-arrived events:
|
|
87
|
-
|
|
88
|
-
```ts
|
|
89
|
-
// vitest.setup.ts
|
|
90
|
-
import { vi } from "vitest";
|
|
91
|
-
|
|
92
|
-
beforeAll(() => {
|
|
93
|
-
// jsdom doesn't have navigator.mediaDevices — polyfill it
|
|
94
|
-
Object.defineProperty(navigator, "mediaDevices", {
|
|
95
|
-
writable: true,
|
|
96
|
-
value: {
|
|
97
|
-
getUserMedia: vi.fn().mockResolvedValue({
|
|
98
|
-
getTracks: () => [
|
|
99
|
-
{ kind: "audio", stop: vi.fn() },
|
|
100
|
-
{ kind: "video", stop: vi.fn() },
|
|
101
|
-
],
|
|
102
|
-
}),
|
|
103
|
-
getDisplayMedia: vi.fn().mockResolvedValue({ getTracks: () => [{ stop: vi.fn() }] }),
|
|
104
|
-
enumerateDevices: vi.fn().mockResolvedValue([]),
|
|
105
|
-
},
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
// Polyfill RTCPeerConnection
|
|
109
|
-
(global as Record<string, unknown>).RTCPeerConnection = class {
|
|
110
|
-
addTrack = vi.fn();
|
|
111
|
-
addEventListener = vi.fn();
|
|
112
|
-
createOffer = vi.fn().mockResolvedValue({ sdp: "fake-offer", type: "offer" });
|
|
113
|
-
createAnswer = vi.fn().mockResolvedValue({ sdp: "fake-answer", type: "answer" });
|
|
114
|
-
setLocalDescription = vi.fn();
|
|
115
|
-
setRemoteDescription = vi.fn();
|
|
116
|
-
close = vi.fn();
|
|
117
|
-
};
|
|
118
|
-
});
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
Reference this in `vitest.config.ts`:
|
|
122
|
-
|
|
123
|
-
```ts
|
|
124
|
-
export default defineConfig({
|
|
125
|
-
test: {
|
|
126
|
-
setupFiles: ["./vitest.setup.ts"],
|
|
127
|
-
environment: "jsdom",
|
|
128
|
-
},
|
|
129
|
-
});
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
---
|
|
133
|
-
|
|
134
|
-
## 3. E2E tests — Playwright with WebRTC enabled
|
|
135
|
-
|
|
136
|
-
Playwright supports real WebRTC in headless mode with the right Chromium flag:
|
|
137
|
-
|
|
138
|
-
```ts
|
|
139
|
-
// playwright.config.ts
|
|
140
|
-
import { defineConfig } from "@playwright/test";
|
|
141
|
-
|
|
142
|
-
export default defineConfig({
|
|
143
|
-
use: {
|
|
144
|
-
launchOptions: {
|
|
145
|
-
args: [
|
|
146
|
-
"--use-fake-ui-for-media-stream", // auto-grants getUserMedia
|
|
147
|
-
"--use-fake-device-for-media-stream", // synthetic camera (animated pattern)
|
|
148
|
-
"--allow-running-insecure-content",
|
|
149
|
-
],
|
|
150
|
-
},
|
|
151
|
-
},
|
|
152
|
-
});
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
Then a two-page test exercises the full call flow:
|
|
156
|
-
|
|
157
|
-
```ts
|
|
158
|
-
import { test, expect, type Page } from "@playwright/test";
|
|
159
|
-
|
|
160
|
-
async function login(page: Page, uid: string) {
|
|
161
|
-
await page.goto("/");
|
|
162
|
-
await page.evaluate((uid) => localStorage.setItem("cc-test-uid", uid), uid);
|
|
163
|
-
await page.reload();
|
|
164
|
-
await expect(page.getByTestId("logged-in-banner")).toBeVisible();
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
test("alice calls bob; bob answers; both see two-way video", async ({ browser }) => {
|
|
168
|
-
const aliceCtx = await browser.newContext();
|
|
169
|
-
const bobCtx = await browser.newContext();
|
|
170
|
-
const alice = await aliceCtx.newPage();
|
|
171
|
-
const bob = await bobCtx.newPage();
|
|
172
|
-
|
|
173
|
-
await login(alice, "cometchat-uid-1");
|
|
174
|
-
await login(bob, "cometchat-uid-2");
|
|
175
|
-
|
|
176
|
-
// Alice clicks call on Bob's profile
|
|
177
|
-
await alice.goto("/users/cometchat-uid-2");
|
|
178
|
-
await alice.getByLabel("Start video call").click();
|
|
179
|
-
|
|
180
|
-
// Bob's IncomingCall overlay appears
|
|
181
|
-
await expect(bob.getByText("Incoming call from")).toBeVisible({ timeout: 10_000 });
|
|
182
|
-
await bob.getByRole("button", { name: "Accept" }).click();
|
|
183
|
-
|
|
184
|
-
// Both see the ongoing-call view
|
|
185
|
-
await expect(alice.getByTestId("ongoing-call")).toBeVisible();
|
|
186
|
-
await expect(bob.getByTestId("ongoing-call")).toBeVisible();
|
|
187
|
-
|
|
188
|
-
// Verify two video elements are playing (synthetic streams)
|
|
189
|
-
const aliceVideos = await alice.locator("video").count();
|
|
190
|
-
expect(aliceVideos).toBeGreaterThanOrEqual(2); // local + remote
|
|
191
|
-
|
|
192
|
-
// Hangup
|
|
193
|
-
await alice.getByRole("button", { name: "End" }).click();
|
|
194
|
-
await expect(alice.getByTestId("ongoing-call")).not.toBeVisible();
|
|
195
|
-
await expect(bob.getByTestId("ongoing-call")).not.toBeVisible();
|
|
196
|
-
});
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
**Synthetic stream gotcha:** the `--use-fake-device-for-media-stream` flag makes Chrome stream a green-and-blue animated pattern. Real cameras / mics are NOT used, so you cannot assert "this video shows the user's face." You CAN assert "two video elements with `srcObject` set," which is what 90% of tests need.
|
|
200
|
-
|
|
201
|
-
---
|
|
202
|
-
|
|
203
|
-
## CI gotchas
|
|
204
|
-
|
|
205
|
-
- **Linux GPU + WebRTC:** GitHub Actions Ubuntu runners have headless Chrome but no GPU. Pass `--disable-gpu` if you see WebRTC errors about GPU process crash; the synthetic stream still works.
|
|
206
|
-
- **Test isolation:** real CometChat App ID + Auth Key in CI. Use a dedicated test app (Dashboard → New App → "ci-tests"); don't reuse production credentials.
|
|
207
|
-
- **Rate limits:** the CometChat backend rate-limits `initiateCall` per user. Tests that loop call/hangup quickly hit limits; throttle to ~5 calls/minute per test UID or rotate UIDs (`cometchat-uid-1` through `cometchat-uid-5` are pre-seeded).
|
|
208
|
-
- **Cleanup:** kill any active calls between tests via `CometChatCalls.leaveSession()` in afterEach. Stale sessions cause the next test's `initiateCall` to fail.
|
|
209
|
-
|
|
210
|
-
---
|
|
211
|
-
|
|
212
|
-
## What NOT to mock
|
|
213
|
-
|
|
214
|
-
- **Don't mock `useEffect` cleanup.** It's where rule 1.3's track-stop happens; mocking hides bugs in the cleanup path.
|
|
215
|
-
- **Don't mock `navigator.mediaDevices` to return synchronous values.** Real APIs are async; mocks should be too, otherwise you mask race conditions in your real code.
|
|
216
|
-
- **Don't mock the kit components themselves** (`<CometChatIncomingCall />` etc.) for unit tests — they're tested by CometChat. Mock the SDK that the kit calls.
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# Virtual Background (web)
|
|
2
|
-
|
|
3
|
-
Verified against `@cometchat/calls-sdk-javascript@5`. Web (React/Angular) is one of the few platforms that supports virtual background (native iOS/Android do not). Two ways to expose it:
|
|
4
|
-
|
|
5
|
-
## A. Let the kit show its built-in setting (additive / kit components)
|
|
6
|
-
|
|
7
|
-
Enable the kit's own Virtual Background button on the call settings builder — it renders a blur/image/clear picker inside the call UI, no custom code:
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
const settings = new CometChatCalls.CallSettingsBuilder()
|
|
11
|
-
.enableDefaultLayout(true)
|
|
12
|
-
.showVirtualBackgroundSetting(true) // ← shows the built-in VB control
|
|
13
|
-
.build();
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
To read the current state, call `getVirtualBackground()` on a built `CallSettings` instance — it's an **instance** method on `CallSettings` (`callSettings.getVirtualBackground(): VirtualBackground`), not a `CometChatCalls` static.
|
|
17
|
-
|
|
18
|
-
## B. Apply programmatically (custom call surface)
|
|
19
|
-
|
|
20
|
-
Three static methods on `CometChatCalls`, callable during an active session:
|
|
21
|
-
|
|
22
|
-
```ts
|
|
23
|
-
import { CometChatCalls } from "@cometchat/calls-sdk-javascript";
|
|
24
|
-
|
|
25
|
-
CometChatCalls.setVirtualBackgroundBlurLevel(50); // blur (0–100)
|
|
26
|
-
CometChatCalls.setVirtualBackgroundImage("https://…/bg.jpg"); // custom image
|
|
27
|
-
CometChatCalls.clearVirtualBackground(); // remove
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
> The older `setBackgroundBlur()` / `setBackgroundImage()` names are **deprecated** — use the `setVirtualBackground*` forms above.
|
|
31
|
-
|
|
32
|
-
Verified (calls-sdk `index.d.ts`): `CallSettingsBuilder.showVirtualBackgroundSetting(boolean)`, instance `CallSettings.getVirtualBackground(): VirtualBackground`, and the statics `CometChatCalls.setVirtualBackgroundBlurLevel(number)` / `setVirtualBackgroundImage(string)` / `clearVirtualBackground()`.
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
# VoIP push on web — there isn't any
|
|
2
|
-
|
|
3
|
-
Web browsers do not have VoIP push. You cannot ring a user whose tab is closed. The closest equivalents are:
|
|
4
|
-
|
|
5
|
-
1. **Web Push** (Service Worker + Push API + Notification API) — can fire a system-level notification while the browser is open even if the tab is backgrounded. Limitations:
|
|
6
|
-
- Service Worker must be installed (one prior visit required)
|
|
7
|
-
- User must have granted notification permission
|
|
8
|
-
- Browser must be running (Chrome/Edge can deliver to closed tabs IF the browser process is alive; Safari requires Safari to be running; Firefox stops Service Workers aggressively)
|
|
9
|
-
- Does NOT bypass closed browser. Production calling apps on web pair this with email/SMS fallback for missed calls.
|
|
10
|
-
|
|
11
|
-
2. **Email/SMS missed-call fallback** — server-side. When a call rings unanswered for ~30 seconds, send a "missed call from X" email/SMS with a deep link back into the app.
|
|
12
|
-
|
|
13
|
-
This reference covers Web Push end-to-end. Email/SMS is out of scope (server-side only, not skill-scaffoldable).
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## Web Push setup (Service Worker + push subscription)
|
|
18
|
-
|
|
19
|
-
### 1. Generate VAPID keys (server-side, one-time)
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
npx web-push generate-vapid-keys
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
Stores public + private keys. Public goes to the client; private stays on the push server.
|
|
26
|
-
|
|
27
|
-
### 2. Register the Service Worker
|
|
28
|
-
|
|
29
|
-
`public/sw.js`:
|
|
30
|
-
|
|
31
|
-
```js
|
|
32
|
-
self.addEventListener("push", (event) => {
|
|
33
|
-
if (!event.data) return;
|
|
34
|
-
const payload = event.data.json();
|
|
35
|
-
if (payload.type !== "incoming_call") return;
|
|
36
|
-
|
|
37
|
-
event.waitUntil(
|
|
38
|
-
self.registration.showNotification("Incoming call", {
|
|
39
|
-
body: `${payload.callerName} is calling`,
|
|
40
|
-
icon: "/icons/call.png",
|
|
41
|
-
tag: `call-${payload.sessionId}`, // dedupe — only one ring per session
|
|
42
|
-
requireInteraction: true, // don't auto-dismiss
|
|
43
|
-
data: { sessionId: payload.sessionId, callerUid: payload.callerUid },
|
|
44
|
-
}),
|
|
45
|
-
);
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
self.addEventListener("notificationclick", (event) => {
|
|
49
|
-
event.notification.close();
|
|
50
|
-
event.waitUntil(
|
|
51
|
-
clients.matchAll({ type: "window", includeUncontrolled: true }).then((wins) => {
|
|
52
|
-
// Focus existing tab if open, otherwise open a new one
|
|
53
|
-
for (const w of wins) {
|
|
54
|
-
if (w.url.includes(self.registration.scope)) {
|
|
55
|
-
w.focus();
|
|
56
|
-
w.postMessage({ type: "incoming_call_click", ...event.notification.data });
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return clients.openWindow(`/calls/incoming?sessionId=${event.notification.data.sessionId}`);
|
|
61
|
-
}),
|
|
62
|
-
);
|
|
63
|
-
});
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### 3. Register from the app
|
|
67
|
-
|
|
68
|
-
```ts
|
|
69
|
-
// cometchat/registerWebPush.ts
|
|
70
|
-
const VAPID_PUBLIC = import.meta.env.VITE_VAPID_PUBLIC_KEY;
|
|
71
|
-
|
|
72
|
-
export async function registerWebPushForCalls(uid: string): Promise<void> {
|
|
73
|
-
if (!("serviceWorker" in navigator) || !("PushManager" in window)) return;
|
|
74
|
-
|
|
75
|
-
const reg = await navigator.serviceWorker.register("/sw.js");
|
|
76
|
-
const permission = await Notification.requestPermission();
|
|
77
|
-
if (permission !== "granted") return;
|
|
78
|
-
|
|
79
|
-
const subscription = await reg.pushManager.subscribe({
|
|
80
|
-
userVisibleOnly: true,
|
|
81
|
-
applicationServerKey: urlBase64ToUint8Array(VAPID_PUBLIC),
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
// Send subscription to YOUR server, keyed by uid
|
|
85
|
-
await fetch("/api/push/subscribe", {
|
|
86
|
-
method: "POST",
|
|
87
|
-
headers: { "Content-Type": "application/json" },
|
|
88
|
-
body: JSON.stringify({ uid, subscription }),
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function urlBase64ToUint8Array(base64: string): Uint8Array {
|
|
93
|
-
const padding = "=".repeat((4 - (base64.length % 4)) % 4);
|
|
94
|
-
const raw = atob((base64 + padding).replace(/-/g, "+").replace(/_/g, "/"));
|
|
95
|
-
return Uint8Array.from(raw, (c) => c.charCodeAt(0));
|
|
96
|
-
}
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
### 4. Listen for SW messages in your React app
|
|
100
|
-
|
|
101
|
-
```tsx
|
|
102
|
-
// CometChatProvider.tsx
|
|
103
|
-
useEffect(() => {
|
|
104
|
-
const handler = (event: MessageEvent) => {
|
|
105
|
-
if (event.data?.type === "incoming_call_click") {
|
|
106
|
-
// Navigate to the call screen and let CometChatIncomingCall pick it up
|
|
107
|
-
navigate(`/calls/incoming?sessionId=${event.data.sessionId}`);
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
navigator.serviceWorker.addEventListener("message", handler);
|
|
111
|
-
return () => navigator.serviceWorker.removeEventListener("message", handler);
|
|
112
|
-
}, [navigate]);
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
### 5. Server-side push send (signaling integration)
|
|
116
|
-
|
|
117
|
-
Your CometChat backend (or webhook listener) detects an incoming call event and sends Web Push to the receiver's subscription:
|
|
118
|
-
|
|
119
|
-
```ts
|
|
120
|
-
// server (Node.js) — runs when CometChat fires the call.received webhook
|
|
121
|
-
import webpush from "web-push";
|
|
122
|
-
|
|
123
|
-
webpush.setVapidDetails("mailto:you@example.com", VAPID_PUBLIC, VAPID_PRIVATE);
|
|
124
|
-
|
|
125
|
-
async function sendIncomingCallPush(receiverUid: string, sessionId: string, callerName: string, callerUid: string) {
|
|
126
|
-
const subs = await getSubscriptionsForUid(receiverUid); // your DB
|
|
127
|
-
await Promise.allSettled(
|
|
128
|
-
subs.map((sub) =>
|
|
129
|
-
webpush.sendNotification(sub, JSON.stringify({
|
|
130
|
-
type: "incoming_call",
|
|
131
|
-
sessionId,
|
|
132
|
-
callerName,
|
|
133
|
-
callerUid,
|
|
134
|
-
})),
|
|
135
|
-
),
|
|
136
|
-
);
|
|
137
|
-
}
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
The webhook setup itself is server-side; the skill scaffolds the client side and points users at this template for the server.
|
|
141
|
-
|
|
142
|
-
---
|
|
143
|
-
|
|
144
|
-
## Browser support matrix
|
|
145
|
-
|
|
146
|
-
| Browser | Push API | Notification while tab closed | Service Worker terminated background |
|
|
147
|
-
|---|---|---|---|
|
|
148
|
-
| Chrome/Edge desktop | ✓ | ✓ if browser process alive | After ~30s idle |
|
|
149
|
-
| Chrome/Edge mobile | ✓ | ✓ | Aggressive; Web Push is best-effort |
|
|
150
|
-
| Firefox desktop | ✓ | ✓ | After ~30s idle |
|
|
151
|
-
| Safari 16+ desktop | ✓ | ✓ if Safari running | Tighter |
|
|
152
|
-
| Safari iOS 16.4+ | ✓ | Only when added to Home Screen as PWA | N/A — PWA only |
|
|
153
|
-
| Mobile Web (any) | Limited | Often not delivered when browser killed | OS-driven |
|
|
154
|
-
|
|
155
|
-
**Bottom line:** Web Push is "best-effort ring" — it works often enough to be worth wiring, but production calling apps must have a missed-call email/SMS fallback. The skill warns the user about this explicitly during scaffold.
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
|
-
## When NOT to bother with Web Push
|
|
160
|
-
|
|
161
|
-
- Internal tools where users keep the tab open during work hours — `<CometChatIncomingCall />` mounted at root rings the tab itself, which is enough.
|
|
162
|
-
- Apps where the call surface is a route the user navigates to deliberately (telehealth waiting room) — the ring happens when they arrive on the route; they don't need to be paged.
|
|
163
|
-
- Greenfield projects that haven't shipped to production yet — add it later when missed-calls become a real complaint.
|
|
164
|
-
|
|
165
|
-
The dispatcher's Step 3 in `cometchat-react-calls/SKILL.md` asks the user whether to scaffold Web Push. Default = no for "just exploring" / "messaging app" intents; default = yes for "support" / "marketplace" intents (where users may receive a call without expecting it).
|