@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,184 +0,0 @@
|
|
|
1
|
-
# NgZone + async SDK callbacks — the Angular calls gotcha
|
|
2
|
-
|
|
3
|
-
Angular's change detection runs inside `NgZone`. Callbacks that fire *outside* NgZone don't trigger change detection — UI doesn't update. The Calls SDK fires lots of callbacks from native bridges (WebRTC, browser MediaStream events), and those bridges escape the zone.
|
|
4
|
-
|
|
5
|
-
If your custom call UI seems "frozen" — call ends but the screen stays — this is almost always the cause.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Symptom
|
|
10
|
-
|
|
11
|
-
```ts
|
|
12
|
-
// OngoingCallComponent
|
|
13
|
-
ngOnInit() {
|
|
14
|
-
CometChatCalls.joinSession(token, settings, container); // v5 canonical (startSession is a deprecated shim)
|
|
15
|
-
|
|
16
|
-
// This callback is registered with the SDK, which is registered with WebRTC,
|
|
17
|
-
// which is a native browser API outside Angular's zone
|
|
18
|
-
callListener.onCallEnded = () => {
|
|
19
|
-
this.callEnded = true; // ← variable updates
|
|
20
|
-
this.cleanup(); // ← runs
|
|
21
|
-
// BUT: change detection doesn't fire. The template doesn't re-render.
|
|
22
|
-
// User sees: "End" button still showing, no "Call ended" message.
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
---
|
|
28
|
-
|
|
29
|
-
## Fix
|
|
30
|
-
|
|
31
|
-
Wrap the callback body in `NgZone.run`:
|
|
32
|
-
|
|
33
|
-
```ts
|
|
34
|
-
import { NgZone } from "@angular/core";
|
|
35
|
-
|
|
36
|
-
constructor(private zone: NgZone) {}
|
|
37
|
-
|
|
38
|
-
ngOnInit() {
|
|
39
|
-
// ...
|
|
40
|
-
callListener.onCallEnded = () => {
|
|
41
|
-
this.zone.run(() => {
|
|
42
|
-
this.callEnded = true;
|
|
43
|
-
this.cleanup();
|
|
44
|
-
});
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
Now change detection runs after the variable updates; template re-renders.
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
## Which callbacks need NgZone.run?
|
|
54
|
-
|
|
55
|
-
All Calls SDK event listeners. The kit's own components handle this internally; custom code that subscribes to the SDK directly does NOT.
|
|
56
|
-
|
|
57
|
-
Conservative rule: **wrap every callback that mutates UI state** in `zone.run`.
|
|
58
|
-
|
|
59
|
-
> `CometChatCalls.OngoingCallListener` is `@deprecated` in calls-sdk-javascript v5 (prefer `CometChatCalls.addEventListener(...)`); the listener pattern below still works and is shown here because this reference is about NgZone-wrapping. Note that the dominant-speaker signal is NOT a listener callback — subscribe to it via `addEventListener("onDominantSpeakerChanged", …)` (also wrap that handler in `zone.run`).
|
|
60
|
-
|
|
61
|
-
```ts
|
|
62
|
-
const listener = new CometChatCalls.OngoingCallListener({
|
|
63
|
-
onUserListUpdated: (userList) => {
|
|
64
|
-
this.zone.run(() => { this.participants = userList; });
|
|
65
|
-
},
|
|
66
|
-
onCallEnded: () => {
|
|
67
|
-
this.zone.run(() => { this.callEnded = true; this.cleanup(); });
|
|
68
|
-
},
|
|
69
|
-
onError: (err) => {
|
|
70
|
-
this.zone.run(() => { this.errorMessage = err.message; });
|
|
71
|
-
},
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
// Dominant speaker is an addEventListener event key, not a listener callback:
|
|
75
|
-
const offSpeaker = CometChatCalls.addEventListener("onDominantSpeakerChanged", (p) => {
|
|
76
|
-
this.zone.run(() => { this.activeSpeakerUid = p.uid; });
|
|
77
|
-
});
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
If a callback only triggers a side effect (logging, analytics) without UI changes, NgZone.run is not strictly required — but harmless.
|
|
81
|
-
|
|
82
|
-
---
|
|
83
|
-
|
|
84
|
-
## Alternative: ChangeDetectorRef.detectChanges
|
|
85
|
-
|
|
86
|
-
If you want to avoid NgZone for performance reasons (zone.run is cheap but adds overhead in hot paths), use `ChangeDetectorRef.detectChanges`:
|
|
87
|
-
|
|
88
|
-
```ts
|
|
89
|
-
import { ChangeDetectorRef } from "@angular/core";
|
|
90
|
-
|
|
91
|
-
constructor(private cd: ChangeDetectorRef) {}
|
|
92
|
-
|
|
93
|
-
ngOnInit() {
|
|
94
|
-
callListener.onCallEnded = () => {
|
|
95
|
-
this.callEnded = true;
|
|
96
|
-
this.cleanup();
|
|
97
|
-
this.cd.detectChanges(); // run change detection just for this component subtree
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
Pros: scoped to the component (NgZone is global).
|
|
103
|
-
Cons: if you have parent component bindings that depend on this state, they don't update. Use NgZone.run for cross-component state changes.
|
|
104
|
-
|
|
105
|
-
For 95% of cases, NgZone.run is the right answer.
|
|
106
|
-
|
|
107
|
-
---
|
|
108
|
-
|
|
109
|
-
## Async/await inside callbacks
|
|
110
|
-
|
|
111
|
-
If your callback is `async`, wrap the whole function:
|
|
112
|
-
|
|
113
|
-
```ts
|
|
114
|
-
callListener.onCallEnded = async () => {
|
|
115
|
-
await this.zone.run(async () => {
|
|
116
|
-
await this.savePostCallAnalytics();
|
|
117
|
-
this.callEnded = true;
|
|
118
|
-
this.cleanup();
|
|
119
|
-
});
|
|
120
|
-
};
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
Or simpler — use a plain method and let zone.js patch async automatically:
|
|
124
|
-
|
|
125
|
-
```ts
|
|
126
|
-
callListener.onCallEnded = () => {
|
|
127
|
-
this.zone.run(() => this.handleCallEnded());
|
|
128
|
-
};
|
|
129
|
-
|
|
130
|
-
private async handleCallEnded() {
|
|
131
|
-
await this.savePostCallAnalytics();
|
|
132
|
-
this.callEnded = true;
|
|
133
|
-
this.cleanup();
|
|
134
|
-
}
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
Inside `handleCallEnded`, change detection fires automatically because zone.js patches `await`.
|
|
138
|
-
|
|
139
|
-
---
|
|
140
|
-
|
|
141
|
-
## How to detect this bug
|
|
142
|
-
|
|
143
|
-
Add a debug log inside the callback. If the log fires but the UI doesn't update, you're outside zone:
|
|
144
|
-
|
|
145
|
-
```ts
|
|
146
|
-
callListener.onCallEnded = () => {
|
|
147
|
-
console.log("[debug] onCallEnded fired", new Date().toISOString());
|
|
148
|
-
this.callEnded = true;
|
|
149
|
-
};
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
If "fired" appears in console but the template still shows the call as active, wrap in zone.run.
|
|
153
|
-
|
|
154
|
-
---
|
|
155
|
-
|
|
156
|
-
## OnPush change detection
|
|
157
|
-
|
|
158
|
-
If your component uses `ChangeDetectionStrategy.OnPush`, NgZone.run alone isn't enough — OnPush only re-renders on `@Input` changes or explicit markForCheck. Combine:
|
|
159
|
-
|
|
160
|
-
```ts
|
|
161
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef } from "@angular/core";
|
|
162
|
-
|
|
163
|
-
@Component({
|
|
164
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
165
|
-
})
|
|
166
|
-
export class OngoingCallComponent {
|
|
167
|
-
constructor(private zone: NgZone, private cd: ChangeDetectorRef) {}
|
|
168
|
-
|
|
169
|
-
ngOnInit() {
|
|
170
|
-
callListener.onCallEnded = () => {
|
|
171
|
-
this.zone.run(() => {
|
|
172
|
-
this.callEnded = true;
|
|
173
|
-
this.cd.markForCheck();
|
|
174
|
-
});
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
---
|
|
181
|
-
|
|
182
|
-
## When the kit fires NgZone-correctly
|
|
183
|
-
|
|
184
|
-
The CometChat Angular UI Kit (`@cometchat/chat-uikit-angular`) handles this internally. If you only use `<cometchat-incoming-call>`, `<cometchat-ongoing-call>`, etc. — no manual NgZone needed. The bug only bites when you write custom subscriptions to `CometChatCalls.*` callbacks.
|
|
@@ -1,285 +0,0 @@
|
|
|
1
|
-
# Picture-in-Picture on Angular
|
|
2
|
-
|
|
3
|
-
Same browser APIs as React (Video PiP + Document PiP) — the SDK and underlying primitives are identical because Angular wraps the JS Calls SDK. For API-level details, browser support, and the Document PiP path, read `cometchat-react-calls/references/picture-in-picture.md` first. This reference covers Angular-specific wiring.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Video PiP — Angular component pattern
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
// components/pip-button/pip-button.component.ts
|
|
11
|
-
@Component({
|
|
12
|
-
selector: "app-pip-button",
|
|
13
|
-
template: `
|
|
14
|
-
<button (click)="togglePip()" [disabled]="!supported" *ngIf="supported">
|
|
15
|
-
{{ inPip ? "Exit PiP" : "Enter PiP" }}
|
|
16
|
-
</button>
|
|
17
|
-
`,
|
|
18
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
19
|
-
})
|
|
20
|
-
export class PipButtonComponent implements OnInit, OnDestroy {
|
|
21
|
-
@Input() videoRef!: ElementRef<HTMLVideoElement>;
|
|
22
|
-
inPip = false;
|
|
23
|
-
supported = typeof document !== "undefined" && document.pictureInPictureEnabled;
|
|
24
|
-
|
|
25
|
-
private enterListener?: () => void;
|
|
26
|
-
private leaveListener?: () => void;
|
|
27
|
-
|
|
28
|
-
constructor(private zone: NgZone, private cd: ChangeDetectorRef) {}
|
|
29
|
-
|
|
30
|
-
ngOnInit() {
|
|
31
|
-
if (!this.videoRef?.nativeElement) return;
|
|
32
|
-
const video = this.videoRef.nativeElement;
|
|
33
|
-
|
|
34
|
-
this.enterListener = () => this.zone.run(() => { this.inPip = true; this.cd.markForCheck(); });
|
|
35
|
-
this.leaveListener = () => this.zone.run(() => { this.inPip = false; this.cd.markForCheck(); });
|
|
36
|
-
|
|
37
|
-
video.addEventListener("enterpictureinpicture", this.enterListener);
|
|
38
|
-
video.addEventListener("leavepictureinpicture", this.leaveListener);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
ngOnDestroy() {
|
|
42
|
-
const video = this.videoRef?.nativeElement;
|
|
43
|
-
if (!video) return;
|
|
44
|
-
if (this.enterListener) video.removeEventListener("enterpictureinpicture", this.enterListener);
|
|
45
|
-
if (this.leaveListener) video.removeEventListener("leavepictureinpicture", this.leaveListener);
|
|
46
|
-
if (document.pictureInPictureElement) {
|
|
47
|
-
document.exitPictureInPicture().catch(() => {});
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
async togglePip() {
|
|
52
|
-
if (!this.videoRef?.nativeElement) return;
|
|
53
|
-
if (this.inPip) {
|
|
54
|
-
await document.exitPictureInPicture();
|
|
55
|
-
} else {
|
|
56
|
-
try {
|
|
57
|
-
await this.videoRef.nativeElement.requestPictureInPicture();
|
|
58
|
-
} catch (err) {
|
|
59
|
-
console.warn("PiP request failed:", err);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
The `@Input() videoRef` is the parent's `<video>` element via `@ViewChild`. NgZone wraps the events so OnPush components re-render correctly.
|
|
67
|
-
|
|
68
|
-
Usage in the call screen:
|
|
69
|
-
|
|
70
|
-
```ts
|
|
71
|
-
@Component({
|
|
72
|
-
selector: "app-ongoing-call",
|
|
73
|
-
template: `
|
|
74
|
-
<video #remoteVideo autoplay playsinline [class.hidden]="inPip"></video>
|
|
75
|
-
<app-pip-button [videoRef]="remoteVideo"></app-pip-button>
|
|
76
|
-
`,
|
|
77
|
-
styles: [`
|
|
78
|
-
.hidden { visibility: hidden; }
|
|
79
|
-
`],
|
|
80
|
-
})
|
|
81
|
-
export class OngoingCallComponent {
|
|
82
|
-
@ViewChild("remoteVideo") remoteVideo!: ElementRef<HTMLVideoElement>;
|
|
83
|
-
inPip = false;
|
|
84
|
-
}
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
---
|
|
88
|
-
|
|
89
|
-
## Document PiP — Angular host element transfer
|
|
90
|
-
|
|
91
|
-
Document PiP lets you put arbitrary HTML in a floating window, including a full Angular component subtree. The challenge: detaching + re-attaching a DOM node mid-Angular-lifecycle.
|
|
92
|
-
|
|
93
|
-
```ts
|
|
94
|
-
// services/document-pip.service.ts
|
|
95
|
-
import { Injectable, NgZone, RendererFactory2, Renderer2 } from "@angular/core";
|
|
96
|
-
|
|
97
|
-
@Injectable({ providedIn: "root" })
|
|
98
|
-
export class DocumentPipService {
|
|
99
|
-
private pipWindow: Window | null = null;
|
|
100
|
-
private renderer: Renderer2;
|
|
101
|
-
|
|
102
|
-
constructor(private zone: NgZone, private rendererFactory: RendererFactory2) {
|
|
103
|
-
this.renderer = rendererFactory.createRenderer(null, null);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
get supported(): boolean {
|
|
107
|
-
return typeof window !== "undefined" && "documentPictureInPicture" in window;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
async openWindow(content: HTMLElement, options: { width?: number; height?: number } = {}): Promise<Window | null> {
|
|
111
|
-
if (!this.supported) return null;
|
|
112
|
-
|
|
113
|
-
this.pipWindow = await (window as unknown as {
|
|
114
|
-
documentPictureInPicture: { requestWindow: (o: object) => Promise<Window> };
|
|
115
|
-
}).documentPictureInPicture.requestWindow({
|
|
116
|
-
width: options.width ?? 360,
|
|
117
|
-
height: options.height ?? 480,
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
// Copy stylesheets so kit + Angular Material styles work in the PiP window
|
|
121
|
-
for (const sheet of Array.from(document.styleSheets)) {
|
|
122
|
-
try {
|
|
123
|
-
const cssText = Array.from(sheet.cssRules ?? []).map(r => r.cssText).join("\n");
|
|
124
|
-
const style = this.pipWindow.document.createElement("style");
|
|
125
|
-
style.textContent = cssText;
|
|
126
|
-
this.pipWindow.document.head.appendChild(style);
|
|
127
|
-
} catch {
|
|
128
|
-
if (sheet.href) {
|
|
129
|
-
const link = this.pipWindow.document.createElement("link");
|
|
130
|
-
link.rel = "stylesheet";
|
|
131
|
-
link.href = sheet.href;
|
|
132
|
-
this.pipWindow.document.head.appendChild(link);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
this.pipWindow.document.body.appendChild(content);
|
|
138
|
-
|
|
139
|
-
return this.pipWindow;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
closeWindow() {
|
|
143
|
-
if (this.pipWindow) {
|
|
144
|
-
this.pipWindow.close();
|
|
145
|
-
this.pipWindow = null;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
Then in the call component:
|
|
152
|
-
|
|
153
|
-
```ts
|
|
154
|
-
@Component({
|
|
155
|
-
// ...
|
|
156
|
-
template: `
|
|
157
|
-
<div #callRoot class="call-root">
|
|
158
|
-
<video #remoteVideo autoplay playsinline></video>
|
|
159
|
-
<app-control-panel></app-control-panel>
|
|
160
|
-
</div>
|
|
161
|
-
`,
|
|
162
|
-
})
|
|
163
|
-
export class OngoingCallComponent {
|
|
164
|
-
@ViewChild("callRoot", { static: true }) callRoot!: ElementRef<HTMLElement>;
|
|
165
|
-
|
|
166
|
-
constructor(private docPip: DocumentPipService, private zone: NgZone) {}
|
|
167
|
-
|
|
168
|
-
async enterDocumentPip() {
|
|
169
|
-
const pipWin = await this.docPip.openWindow(this.callRoot.nativeElement);
|
|
170
|
-
if (!pipWin) return;
|
|
171
|
-
|
|
172
|
-
pipWin.addEventListener("pagehide", () => {
|
|
173
|
-
this.zone.run(() => {
|
|
174
|
-
// Restore the call-root back to the original mount point
|
|
175
|
-
const host = document.getElementById("call-host");
|
|
176
|
-
if (host && this.callRoot.nativeElement) {
|
|
177
|
-
host.appendChild(this.callRoot.nativeElement);
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
When you transfer the DOM node into the PiP window, Angular's change detection still works because the node is the same. Click handlers, OnPush updates, NgZone events all continue functioning across the window boundary. This is the magic of Document PiP.
|
|
186
|
-
|
|
187
|
-
---
|
|
188
|
-
|
|
189
|
-
## Auto-PiP on tab/window backgrounding
|
|
190
|
-
|
|
191
|
-
```ts
|
|
192
|
-
@Component({...})
|
|
193
|
-
export class OngoingCallComponent implements OnInit, OnDestroy {
|
|
194
|
-
private visibilitySub?: Subscription;
|
|
195
|
-
|
|
196
|
-
ngOnInit() {
|
|
197
|
-
if (!document.pictureInPictureEnabled) return;
|
|
198
|
-
this.visibilitySub = fromEvent(document, "visibilitychange").subscribe(() => {
|
|
199
|
-
if (document.visibilityState === "hidden" && this.callActive) {
|
|
200
|
-
this.zone.run(() => {
|
|
201
|
-
this.remoteVideo.nativeElement.requestPictureInPicture().catch(() => {});
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
ngOnDestroy() {
|
|
208
|
-
this.visibilitySub?.unsubscribe();
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
Same caveats as React — Safari rejects auto-PiP from non-user-gesture contexts in some versions. Test on real Safari before relying on this.
|
|
214
|
-
|
|
215
|
-
---
|
|
216
|
-
|
|
217
|
-
## Auto-leave on hangup
|
|
218
|
-
|
|
219
|
-
```ts
|
|
220
|
-
async endCall() {
|
|
221
|
-
if (document.pictureInPictureElement) {
|
|
222
|
-
await document.exitPictureInPicture();
|
|
223
|
-
}
|
|
224
|
-
this.docPip.closeWindow();
|
|
225
|
-
|
|
226
|
-
CometChatCalls.leaveSession(); // v5 canonical (endSession is a deprecated shim)
|
|
227
|
-
// ...rest of cleanup
|
|
228
|
-
}
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
---
|
|
232
|
-
|
|
233
|
-
## SSR considerations (Angular Universal)
|
|
234
|
-
|
|
235
|
-
Document and Video PiP both reference `document.pictureInPictureEnabled` and `window.documentPictureInPicture`. Both are browser-only — guard:
|
|
236
|
-
|
|
237
|
-
```ts
|
|
238
|
-
import { isPlatformBrowser } from "@angular/common";
|
|
239
|
-
|
|
240
|
-
constructor(@Inject(PLATFORM_ID) private platformId: object) {}
|
|
241
|
-
|
|
242
|
-
get supported() {
|
|
243
|
-
return isPlatformBrowser(this.platformId)
|
|
244
|
-
&& typeof document !== "undefined"
|
|
245
|
-
&& document.pictureInPictureEnabled;
|
|
246
|
-
}
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
Without this, SSR build crashes at boot.
|
|
250
|
-
|
|
251
|
-
---
|
|
252
|
-
|
|
253
|
-
## Anti-patterns
|
|
254
|
-
|
|
255
|
-
1. **`requestPictureInPicture()` from `ngOnInit`.** Browsers reject — needs user gesture. `(click)` is the trigger.
|
|
256
|
-
2. **Skipping `NgZone.run`** for PiP enter/leave events. OnPush components don't re-render.
|
|
257
|
-
3. **Document PiP without copying stylesheets.** PiP window unstyled.
|
|
258
|
-
4. **Forgetting `pagehide` cleanup** when user closes the PiP window via system X. DOM node stays detached; controls broken.
|
|
259
|
-
5. **No SSR guard.** Universal build crashes.
|
|
260
|
-
6. **Two separate video elements** (one for normal, one for PiP). Use one `<video>` and `[class.hidden]` it.
|
|
261
|
-
7. **Auto-PiP in `ngOnInit` with no user-gesture context.** Safari rejects.
|
|
262
|
-
|
|
263
|
-
---
|
|
264
|
-
|
|
265
|
-
## Verification checklist
|
|
266
|
-
|
|
267
|
-
- [ ] PiP button feature-detects `document.pictureInPictureEnabled`
|
|
268
|
-
- [ ] Button hidden / disabled when unsupported
|
|
269
|
-
- [ ] PiP request from `(click)`, not `ngOnInit`
|
|
270
|
-
- [ ] `enterpictureinpicture` / `leavepictureinpicture` listeners wrapped in NgZone
|
|
271
|
-
- [ ] OnPush components call `markForCheck()` after PiP state change
|
|
272
|
-
- [ ] In-page video hidden while PiP active
|
|
273
|
-
- [ ] Hangup path calls `document.exitPictureInPicture()` if active
|
|
274
|
-
- [ ] Document PiP path closes window via `docPip.closeWindow()`
|
|
275
|
-
- [ ] SSR builds: `isPlatformBrowser` guards
|
|
276
|
-
- [ ] Real-browser smoke: Chrome (both APIs) + Safari (Video PiP) + Firefox (Video PiP)
|
|
277
|
-
|
|
278
|
-
---
|
|
279
|
-
|
|
280
|
-
## Pointers
|
|
281
|
-
|
|
282
|
-
- `cometchat-react-calls/references/picture-in-picture.md` — sister reference (browser API details, Document PiP semantics, browser support)
|
|
283
|
-
- `references/custom-ui.md` — Angular custom call UI (PiP integration via @ViewChild on the video element)
|
|
284
|
-
- `references/lazy-loading-pitfalls.md` — eager loading + SSR guards
|
|
285
|
-
- `cometchat-angular-calls` SKILL.md — base hard rules
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
# Raise hand on Angular
|
|
2
|
-
|
|
3
|
-
Same SDK API as web (`@cometchat/calls-sdk-javascript`). Angular-specific wiring: NgZone wrap on listeners, RxJS Subject for the raised-hands roster, OnPush + markForCheck.
|
|
4
|
-
|
|
5
|
-
**Canonical docs:** https://www.cometchat.com/docs/calls/javascript/raise-hand
|
|
6
|
-
**Read first:** `cometchat-react-calls/references/raise-hand.md` — integration shape + anti-patterns are identical; this reference is the Angular-specific wiring.
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## SDK API (same as web)
|
|
11
|
-
|
|
12
|
-
```ts
|
|
13
|
-
import { CometChatCalls } from "@cometchat/calls-sdk-javascript";
|
|
14
|
-
|
|
15
|
-
CometChatCalls.raiseHand();
|
|
16
|
-
CometChatCalls.lowerHand();
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## Angular wiring — service-driven roster
|
|
22
|
-
|
|
23
|
-
Centralize raise-hand state in a service so any component can subscribe:
|
|
24
|
-
|
|
25
|
-
```ts
|
|
26
|
-
// services/raise-hand.service.ts
|
|
27
|
-
import { Injectable, NgZone, OnDestroy } from "@angular/core";
|
|
28
|
-
import { BehaviorSubject } from "rxjs";
|
|
29
|
-
import { CometChatCalls } from "@cometchat/calls-sdk-javascript";
|
|
30
|
-
|
|
31
|
-
interface RaisedParticipant { uid: string; name: string; raisedAt: number; }
|
|
32
|
-
|
|
33
|
-
@Injectable({ providedIn: "root" })
|
|
34
|
-
export class RaiseHandService implements OnDestroy {
|
|
35
|
-
private readonly raised = new Map<string, RaisedParticipant>();
|
|
36
|
-
readonly raised$ = new BehaviorSubject<RaisedParticipant[]>([]);
|
|
37
|
-
|
|
38
|
-
private onRaised = (p: { uid: string; name: string }) => {
|
|
39
|
-
this.zone.run(() => {
|
|
40
|
-
this.raised.set(p.uid, { ...p, raisedAt: Date.now() });
|
|
41
|
-
this.emit();
|
|
42
|
-
});
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
private onLowered = (p: { uid: string }) => {
|
|
46
|
-
this.zone.run(() => {
|
|
47
|
-
this.raised.delete(p.uid);
|
|
48
|
-
this.emit();
|
|
49
|
-
});
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
// addEventListener returns an unsubscribe fn — there is NO CometChatCalls.removeEventListener.
|
|
53
|
-
private offs: Array<() => void> = [];
|
|
54
|
-
|
|
55
|
-
constructor(private zone: NgZone) {
|
|
56
|
-
this.offs.push(
|
|
57
|
-
CometChatCalls.addEventListener("onParticipantHandRaised", this.onRaised),
|
|
58
|
-
CometChatCalls.addEventListener("onParticipantHandLowered", this.onLowered),
|
|
59
|
-
);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
ngOnDestroy() {
|
|
63
|
-
this.offs.forEach(off => off());
|
|
64
|
-
this.offs = [];
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
raise() { CometChatCalls.raiseHand(); }
|
|
68
|
-
lower() { CometChatCalls.lowerHand(); }
|
|
69
|
-
|
|
70
|
-
private emit() {
|
|
71
|
-
const sorted = Array.from(this.raised.values()).sort((a, b) => a.raisedAt - b.raisedAt);
|
|
72
|
-
this.raised$.next(sorted);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
The `NgZone.run` wrapping is the canonical Angular rule (see `references/ngzone-and-async-callbacks.md`) — without it, `BehaviorSubject.next` doesn't trigger change detection in OnPush components.
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
## Toggle button component
|
|
82
|
-
|
|
83
|
-
```ts
|
|
84
|
-
@Component({
|
|
85
|
-
selector: "app-raise-hand-button",
|
|
86
|
-
template: `
|
|
87
|
-
<button
|
|
88
|
-
(click)="toggle()"
|
|
89
|
-
[class.active]="raised"
|
|
90
|
-
[attr.aria-pressed]="raised"
|
|
91
|
-
[attr.aria-label]="raised ? 'Lower hand' : 'Raise hand'"
|
|
92
|
-
>
|
|
93
|
-
✋ {{ raised ? "Lower" : "Raise" }}
|
|
94
|
-
</button>
|
|
95
|
-
`,
|
|
96
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
97
|
-
})
|
|
98
|
-
export class RaiseHandButtonComponent {
|
|
99
|
-
raised = false;
|
|
100
|
-
constructor(private svc: RaiseHandService, private cd: ChangeDetectorRef) {}
|
|
101
|
-
|
|
102
|
-
toggle() {
|
|
103
|
-
if (this.raised) this.svc.lower();
|
|
104
|
-
else this.svc.raise();
|
|
105
|
-
this.raised = !this.raised;
|
|
106
|
-
this.cd.markForCheck();
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
---
|
|
112
|
-
|
|
113
|
-
## Roster component (host view)
|
|
114
|
-
|
|
115
|
-
```ts
|
|
116
|
-
@Component({
|
|
117
|
-
selector: "app-raised-hands-list",
|
|
118
|
-
template: `
|
|
119
|
-
<div *ngIf="(raised$ | async) as list">
|
|
120
|
-
<ul *ngIf="list.length > 0" aria-label="Raised hands queue">
|
|
121
|
-
<li *ngFor="let p of list; trackBy: trackByUid">
|
|
122
|
-
✋ {{ p.name }} <span class="ago">{{ secondsAgo(p.raisedAt) }}</span>
|
|
123
|
-
</li>
|
|
124
|
-
</ul>
|
|
125
|
-
</div>
|
|
126
|
-
`,
|
|
127
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
128
|
-
})
|
|
129
|
-
export class RaisedHandsListComponent {
|
|
130
|
-
raised$ = this.svc.raised$;
|
|
131
|
-
constructor(private svc: RaiseHandService) {}
|
|
132
|
-
trackByUid(_: number, p: RaisedParticipant) { return p.uid; }
|
|
133
|
-
secondsAgo(t: number) { return `${Math.round((Date.now() - t) / 1000)}s ago`; }
|
|
134
|
-
}
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
`trackByUid` is critical — without it, Angular re-renders every list item on every emit, which is bad for FlatList-style smooth scroll.
|
|
138
|
-
|
|
139
|
-
---
|
|
140
|
-
|
|
141
|
-
## Anti-patterns
|
|
142
|
-
|
|
143
|
-
Same shape as web sister reference, plus Angular-specific:
|
|
144
|
-
|
|
145
|
-
1. **Service NOT provided in `root`.** If raise-hand service is provided in a feature module, it instantiates on lazy-load — listeners attach late. Provide in root so it boots with the app.
|
|
146
|
-
2. **Skipping `markForCheck` with OnPush.** Service emits, component doesn't re-render.
|
|
147
|
-
3. **Forgetting `ngOnDestroy` cleanup.** Service is `providedIn: "root"` so it lives forever, but the listeners would survive across logout/re-login. Reset on `CometChatUIKit.logout`.
|
|
148
|
-
4. **`*ngFor` without `trackBy`.** Re-renders thrash; tile state lost.
|
|
149
|
-
|
|
150
|
-
---
|
|
151
|
-
|
|
152
|
-
## Verification checklist
|
|
153
|
-
|
|
154
|
-
- [ ] `RaiseHandService` provided in root
|
|
155
|
-
- [ ] `NgZone.run` wraps both listener callbacks
|
|
156
|
-
- [ ] `BehaviorSubject` emits sorted-by-raisedAt list
|
|
157
|
-
- [ ] Toggle button has `aria-pressed` + `aria-label`
|
|
158
|
-
- [ ] Roster uses `trackBy: trackByUid`
|
|
159
|
-
- [ ] OnPush components call `markForCheck()` on state change
|
|
160
|
-
- [ ] Listeners cleaned up in `ngOnDestroy`
|
|
161
|
-
- [ ] `hideRaiseHandButton: true` in CallSettings if using custom UI
|
|
162
|
-
- [ ] Browser smoke: 3 tabs in same call → host's roster updates with markForCheck
|
|
163
|
-
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
## Pointers
|
|
167
|
-
|
|
168
|
-
- `cometchat-react-calls/references/raise-hand.md` — sister reference
|
|
169
|
-
- `references/ngzone-and-async-callbacks.md` — NgZone primer
|
|
170
|
-
- `references/group-calls.md` — group call architecture in Angular
|
|
171
|
-
- `cometchat-a11y` — `aria-pressed` + screen reader announcements
|
|
172
|
-
- Canonical docs: https://www.cometchat.com/docs/calls/javascript/raise-hand
|