@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
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Anti-patterns — code that compiles, shows no error, and does not work
|
|
2
|
+
|
|
3
|
+
## 1. Component missing from `imports: []` ⭐ most common
|
|
4
|
+
```ts
|
|
5
|
+
@Component({ standalone: true, imports: [CommonModule], template: '<cometchat-conversations></cometchat-conversations>' })
|
|
6
|
+
```
|
|
7
|
+
Angular treats the unknown element as plain HTML and renders **nothing**. No error, no warning, blank space.
|
|
8
|
+
**Fix:** import the class into that component's `imports` array. Every kit component, in every component that uses it.
|
|
9
|
+
|
|
10
|
+
## 2. Unsized ancestor chain
|
|
11
|
+
The kit fills its container. If any ancestor has no resolved height, the list computes to 0px and you see a blank pane.
|
|
12
|
+
**Fix:** `html, body { height: 100%; margin: 0; }`, a `100dvh` shell, and `min-height: 0` on every flex column. See `layout.md`.
|
|
13
|
+
|
|
14
|
+
## 3. No teardown in `ngOnDestroy`
|
|
15
|
+
RxJS subscriptions and CometChat listeners survive the component. Symptoms: memory grows per route change, handlers fire against destroyed views, duplicate messages.
|
|
16
|
+
**Fix:** `takeUntil(this.destroy$)` on every subscription and `CometChat.removeMessageListener(id)` in `ngOnDestroy`.
|
|
17
|
+
|
|
18
|
+
## 4. Async SDK-callback state doesn't repaint
|
|
19
|
+
`onTextMessageReceived` fires asynchronously, so assigning to a plain field does not trigger change detection. The message is in memory; the DOM never updates.
|
|
20
|
+
**Fix:** Angular v21 is **zoneless by default**, so `NgZone.run()` is a no-op for CD — write to a **signal** (`messages.update(...)`) or call `ChangeDetectorRef.markForCheck()` after the update. (`NgZone.run()` only helps if you've opted back into zones with `provideZoneChangeDetection()`.) Kit components handle this internally — this applies to your own listeners.
|
|
21
|
+
|
|
22
|
+
## 5. Rendering before `login()` resolves
|
|
23
|
+
Components mount with no session and render empty lists with no error, which looks like "the API returned nothing".
|
|
24
|
+
**Fix:** init and login must resolve before bootstrap, or gate the chat route. See `lifecycle.md`.
|
|
25
|
+
|
|
26
|
+
## 6. Concurrent `login()`
|
|
27
|
+
Two callers racing throws **"Please wait until the previous login request ends."** A route guard plus a component `ngOnInit` is enough to cause it.
|
|
28
|
+
**Fix:** cache the in-flight **promise**, never a boolean. See `lifecycle.md`.
|
|
29
|
+
|
|
30
|
+
## 7. Using the class name as a selector, or the docs title as either
|
|
31
|
+
`<CometChatConversations>` and `<cometchat-conversations-component>` are both wrong. Class `CometChatConversationsComponent`, selector `<cometchat-conversations>`, docs title "Conversations" — three different strings.
|
|
32
|
+
|
|
33
|
+
## 8. Guessing the bare class name
|
|
34
|
+
`CometChatConversations` (no suffix) exists inside the package but is **not exported** — importing it fails to compile. 109 such internal-only names exist. Always use the exported `…Component` form. The AI-assistant exports are the sole exception and carry no suffix.
|
|
35
|
+
|
|
36
|
+
## 9. Putting credentials in `.env`
|
|
37
|
+
Angular does not read `.env`. Values must be in `src/environments/environment.ts` and swapped via `fileReplacements`. A `.env` file is silently ignored, so config appears empty at runtime.
|
|
38
|
+
|
|
39
|
+
## 10. Shipping the Auth Key to production
|
|
40
|
+
The Auth Key can mint a session for **any** user. Production must call `loginWithAuthToken` with a token minted server-side. See `setup-credentials.md`.
|
|
41
|
+
|
|
42
|
+
## 11. `@import` of the kit stylesheet
|
|
43
|
+
`@import '@cometchat/chat-uikit-angular/styles/css-variables.css'` fails the build — the package `exports` map does not expose that path. Register the full `node_modules/...` path in `angular.json` `styles` instead.
|
|
44
|
+
|
|
45
|
+
## 12. Installing on Angular 22
|
|
46
|
+
`npm install` hard-fails with `ERESOLVE` (peer range `>=17.0.0 <22.0.0`). Do not "fix" it with `--force` or `--legacy-peer-deps` — that installs a combination nobody has tested. Scaffold with `@angular/cli@21`.
|
|
47
|
+
|
|
48
|
+
## 13. Hand-rolling what the kit already renders
|
|
49
|
+
Message bubbles, receipts, reaction pickers, typing indicators and attachment previews are rendered by the kit. Rebuilding them by hand means losing realtime updates and every future fix. If an affordance appears not to work, it is nearly always a missing input or an unsized container.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Inputs, outputs & content projection
|
|
2
|
+
|
|
3
|
+
Beyond the golden path. Anything not here: fetch the component's docs page (`docs-map.md`) — do not guess.
|
|
4
|
+
|
|
5
|
+
## The Angular shape
|
|
6
|
+
- Props are `@Input()` → template attribute binding: `[user]="selected"`
|
|
7
|
+
- Events are `@Output()` → template event binding: `(itemClick)="fn($event)"`. Output names are plain (`itemClick`, `error`, `closeClick`) — there is **no** `cc` prefix; that is the React convention, not Angular's.
|
|
8
|
+
- Slots are **content projection** — you pass a `<ng-template>` or project children, not a render-prop function as in React.
|
|
9
|
+
|
|
10
|
+
## Conversations
|
|
11
|
+
```html
|
|
12
|
+
<cometchat-conversations
|
|
13
|
+
[activeConversation]="selected"
|
|
14
|
+
(itemClick)="onOpen($event)"
|
|
15
|
+
(error)="onError($event)">
|
|
16
|
+
</cometchat-conversations>
|
|
17
|
+
```
|
|
18
|
+
`activeConversation` is what visually reflects the selected row. Omit it and the list looks stateless even though clicking works — a real defect, not cosmetic.
|
|
19
|
+
|
|
20
|
+
## Message header / list / composer
|
|
21
|
+
All three take the same subject — one of `[user]` or `[group]`, never both:
|
|
22
|
+
```html
|
|
23
|
+
<cometchat-message-header [user]="selectedUser"></cometchat-message-header>
|
|
24
|
+
<cometchat-message-list [user]="selectedUser"></cometchat-message-list>
|
|
25
|
+
<cometchat-message-composer [user]="selectedUser"></cometchat-message-composer>
|
|
26
|
+
```
|
|
27
|
+
For a group, swap all three to `[group]`. Mixing them across the three components shows one conversation's header above another's messages.
|
|
28
|
+
|
|
29
|
+
## Thread
|
|
30
|
+
```html
|
|
31
|
+
<cometchat-thread-header [parentMessage]="threadParent" (closeClick)="threadParent = null"></cometchat-thread-header>
|
|
32
|
+
<cometchat-message-list [user]="selectedUser" [parentMessageId]="threadParent?.getId()"></cometchat-message-list>
|
|
33
|
+
```
|
|
34
|
+
The reply affordance in a bubble is on by default but inert until you render a thread surface — wire it or hide it, never leave a dead button.
|
|
35
|
+
|
|
36
|
+
## Users / Groups / Group members
|
|
37
|
+
```html
|
|
38
|
+
<cometchat-users (itemClick)="onUser($event)"></cometchat-users>
|
|
39
|
+
<cometchat-groups (itemClick)="onGroup($event)"></cometchat-groups>
|
|
40
|
+
<cometchat-group-members [group]="activeGroup"></cometchat-group-members>
|
|
41
|
+
```
|
|
42
|
+
Group members must expose view · kick · ban · banned list · change scope · search to be complete. Change-scope uses `CometChatChangeScopeComponent`; the banned list comes from the SDK.
|
|
43
|
+
|
|
44
|
+
## Content projection instead of render props
|
|
45
|
+
```html
|
|
46
|
+
<cometchat-conversations>
|
|
47
|
+
<ng-template #itemView let-conversation>
|
|
48
|
+
<div class="my-row">{{ conversation.getConversationId() }}</div>
|
|
49
|
+
</ng-template>
|
|
50
|
+
</cometchat-conversations>
|
|
51
|
+
```
|
|
52
|
+
Slot names vary per component — confirm on the component's docs page before using one.
|
|
53
|
+
|
|
54
|
+
## Services for headless control
|
|
55
|
+
Some behaviour is reachable without a component, via DI: `ChatStateService` (active chat), `MessageListService`, `ConversationsService`, `SearchMessagesService`, `GroupMembersService`, `ThemeService`. Inject with `inject(ChatStateService)`. Use these for state coordination, not for rebuilding UI the kit already renders.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Dependencies & support matrix
|
|
2
|
+
|
|
3
|
+
## Install
|
|
4
|
+
```bash
|
|
5
|
+
npm install @cometchat/chat-uikit-angular@^5 @cometchat/chat-sdk-javascript@^4 @cometchat/cards-angular@^1 dompurify@^3
|
|
6
|
+
```
|
|
7
|
+
Calls (optional): `npm install @cometchat/calls-sdk-javascript@^5`
|
|
8
|
+
|
|
9
|
+
## Peer dependencies — verified against the published 5.1.0
|
|
10
|
+
| Package | Range | Notes |
|
|
11
|
+
| --- | --- | --- |
|
|
12
|
+
| `@angular/core` | `>=17.0.0 <22.0.0` | 22 fails to install — see below |
|
|
13
|
+
| `@angular/common` | `>=17.0.0 <22.0.0` | |
|
|
14
|
+
| `@cometchat/chat-sdk-javascript` | `^4.1.13` | required |
|
|
15
|
+
| `@cometchat/cards-angular` | `^1.0.0` | **required** — added in 5.1.0 |
|
|
16
|
+
| `dompurify` | `^3.0.0` | required |
|
|
17
|
+
| `@cometchat/calls-sdk-javascript` | `^5.0.3` | optional — calls only |
|
|
18
|
+
|
|
19
|
+
> `@cometchat/cards-angular` was added between 5.0.3 and 5.1.0. Omitting it produces an incomplete install.
|
|
20
|
+
|
|
21
|
+
## Angular version support
|
|
22
|
+
| Angular | Status |
|
|
23
|
+
| --- | --- |
|
|
24
|
+
| 17 | Works (within the peer range) but undocumented |
|
|
25
|
+
| 18 – 21 | Supported and documented |
|
|
26
|
+
| 22 | **Install fails** — `ERESOLVE`, peer range excludes it |
|
|
27
|
+
|
|
28
|
+
> **Divergence from the docs.** `{DOCS_BASE}/ui-kit/angular/overview.md` lists Angular "v18, v19, v20, v21, v22" as supported. That is wrong against the published 5.1.0 package: the peer range is `>=17.0.0 <22.0.0` (so 22 hard-fails `ERESOLVE`). The table above is verified against npm — **trust it over the guide**. Do not scaffold Angular 22 because the docs say it is supported, and never `--force` past the install failure. (The version range needs a kit release; `@cometchat/cards-angular` as a required peer was corrected upstream and now appears in the overview's peer list — verified against cometchat/docs, 2026-09-09.)
|
|
29
|
+
|
|
30
|
+
CometChat's stated policy is 18 through latest, so the range is expected to widen in a future kit release. Until that ships, 22 does not install. Scaffold new apps with:
|
|
31
|
+
```bash
|
|
32
|
+
npx -y @angular/cli@21 new my-app
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Stylesheet + icon assets — BOTH are required
|
|
36
|
+
`angular.json` → `projects.<app>.architect.build.options`:
|
|
37
|
+
|
|
38
|
+
`styles`:
|
|
39
|
+
```json
|
|
40
|
+
"node_modules/@cometchat/chat-uikit-angular/styles/css-variables.css"
|
|
41
|
+
```
|
|
42
|
+
The package-specifier `@import` form does not work — the `exports` map does not expose it.
|
|
43
|
+
|
|
44
|
+
`assets` (282 SVG icons ship under `src/lib/assets`):
|
|
45
|
+
```json
|
|
46
|
+
{ "glob": "**/*", "input": "node_modules/@cometchat/chat-uikit-angular/src/lib/assets", "output": "assets" }
|
|
47
|
+
```
|
|
48
|
+
Missing this leaves icons broken across every component with no error — the most commonly missed Angular setup step. Verify after `ng serve`: send/attach/emoji buttons in the composer should render as icons, not blank space.
|
|
49
|
+
|
|
50
|
+
## Versions this skill was verified against
|
|
51
|
+
`@cometchat/chat-uikit-angular@5.1.0` · `@cometchat/chat-sdk-javascript@4.1.13`
|
|
52
|
+
|
|
53
|
+
## Production build: budgets + the CommonJS bailout
|
|
54
|
+
|
|
55
|
+
A stock CLI app budgets the initial bundle at 500 kB warning / 1 MB error. The kit plus the Chat SDK is ~4.2 MB, so the DEFAULT `ng build` (which is the production config) exits non-zero:
|
|
56
|
+
```
|
|
57
|
+
✘ [ERROR] bundle initial exceeded maximum budget. Budget 1.00 MB was not met by 3.21 MB with a total of 4.21 MB.
|
|
58
|
+
```
|
|
59
|
+
`ng serve` is unaffected, so this only bites at ship time. Under `configurations.production`:
|
|
60
|
+
```json
|
|
61
|
+
"budgets": [{ "type": "initial", "maximumWarning": "5mb", "maximumError": "6mb" }]
|
|
62
|
+
```
|
|
63
|
+
Also silence the CommonJS bailout warning (the Chat SDK is not ESM) under `build.options`:
|
|
64
|
+
```json
|
|
65
|
+
"allowedCommonJsDependencies": ["@cometchat/chat-sdk-javascript"]
|
|
66
|
+
```
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# docs-map — where to look anything up
|
|
2
|
+
|
|
3
|
+
## Reaching docs — PREFER the CometChat docs MCP; fetch is the fallback
|
|
4
|
+
The canonical doc channel is the **first-party CometChat docs MCP** — tools `search_cometchat_docs`,
|
|
5
|
+
`fetch_cometchat_doc_page`, and `get_cometchat_implementation_bundle`. **If those tools are connected,
|
|
6
|
+
use them instead of a raw web fetch:**
|
|
7
|
+
- **Find the page** → `search_cometchat_docs(query, version?)` — replaces browsing the scoped `llms-*` index.
|
|
8
|
+
- **Read the page** → `fetch_cometchat_doc_page(path)` — pass the SAME `<path>` the tables below list
|
|
9
|
+
(the conversations page path for your platform); the MCP resolves the `.md` twin and returns raw Markdown.
|
|
10
|
+
A full `https://…/docs/<path>` URL also works.
|
|
11
|
+
- **A whole feature/recipe** → `get_cometchat_implementation_bundle(...)` is **NON-AUTHORITATIVE** — curated STATIC recipes that can lag the live docs (verified stale vs v7: e.g. `CometChatConversationsWithMessages`, `css-variables.css`). Treat any bundle as a hint only: RECONCILE it against the `fetch_cometchat_doc_page` result + the pack's hardening; never emit bundle code verbatim.
|
|
12
|
+
|
|
13
|
+
The MCP reads whatever docs environment it is pointed at (production by default; a preview when repointed),
|
|
14
|
+
so it also carries the environment-swap concern below — no hardcoded host on the skill side.
|
|
15
|
+
|
|
16
|
+
**If the MCP tools are NOT connected:** add it (`claude mcp add --transport http cometchat-docs https://mcp.cometchat.com/mcp`, or reinstall/enable the plugin) and retry; only if it still will not connect, fall back to a plain fetch via `DOCS_BASE` (defined next).
|
|
17
|
+
Either way the `<path>` catalog in this file is the source of truth for WHICH page — MCP-vs-fetch is only HOW.
|
|
18
|
+
|
|
19
|
+
## DOCS_BASE — the fetch FALLBACK entry point (⚠️ SWAP HERE to change environments)
|
|
20
|
+
```
|
|
21
|
+
DOCS_BASE = https://www.cometchat.com/docs
|
|
22
|
+
```
|
|
23
|
+
**Fetch rule:** build a URL as `DOCS_BASE` + the path below, then append `.md` for the clean Markdown twin. The same applies to any `docs_topic` in `features.angular-v5.json` / `contracts.angular-v5.json` — those are paths, not URLs, so they resolve against whatever `DOCS_BASE` is set to.
|
|
24
|
+
```
|
|
25
|
+
Fetch: {DOCS_BASE}/ui-kit/angular/components/cometchat-conversations.md
|
|
26
|
+
```
|
|
27
|
+
Most pages open with an **"AI Integration Quick Reference"** block — read that first for package, imports and key inputs.
|
|
28
|
+
|
|
29
|
+
## Scoped Angular v5 index (prefer over the global llms.txt)
|
|
30
|
+
```
|
|
31
|
+
{DOCS_BASE}/ui-kit/angular/llms-angular-v5.md
|
|
32
|
+
```
|
|
33
|
+
A 91-page, Angular-v5-only routing index including a **"Task guides (recipes)"** section — start here to find the right page. Site-wide `{DOCS_BASE}/llms.txt` spans every product and is far larger; last resort only.
|
|
34
|
+
|
|
35
|
+
> This scoped index now resolves on prod (corrected upstream — verified against cometchat/docs, 2026-09-09). If a `.md` twin ever 404s, fall back to the same path without `.md`, or use the per-page paths below.
|
|
36
|
+
|
|
37
|
+
## Component docs (append `.md`)
|
|
38
|
+
| Need | Path under `{DOCS_BASE}/ui-kit/angular` |
|
|
39
|
+
| --- | --- |
|
|
40
|
+
| Conversation list | `/components/cometchat-conversations` |
|
|
41
|
+
| Message header | `/components/cometchat-message-header` |
|
|
42
|
+
| Message list | `/components/cometchat-message-list` |
|
|
43
|
+
| Message composer | `/components/cometchat-message-composer` |
|
|
44
|
+
| Thread header | `/components/cometchat-thread-header` |
|
|
45
|
+
| Users / Groups | `/components/cometchat-users` · `/components/cometchat-groups` |
|
|
46
|
+
| Group members | `/components/cometchat-group-members` |
|
|
47
|
+
| Search | `/components/cometchat-search` |
|
|
48
|
+
| Reactions | `/components/cometchat-reactions` |
|
|
49
|
+
| Calls | `/components/cometchat-call-buttons` · `/components/cometchat-incoming-call` |
|
|
50
|
+
| Notification feed | `/components/notification-feed` *(no `cometchat-` prefix — the one exception)* |
|
|
51
|
+
| All components | `/components/components-overview` |
|
|
52
|
+
| Theming | `/customization/theming` |
|
|
53
|
+
| Localization | `/customization/localization` |
|
|
54
|
+
| Global config | `/customization/global-config` |
|
|
55
|
+
| Events · Methods · Core | `/events` · `/methods` · `/core-features` |
|
|
56
|
+
| Extensions · AI · Calls | `/extensions` · `/ai-features` · `/call-features` |
|
|
57
|
+
| Services (DI) | `/api-reference/introduction` |
|
|
58
|
+
| **v4→v5 migration / upgrade** | `/customization/migration-guide` *(the official "Upgrading From V4": Integration · Components · Theming · Properties · Shared Dependencies · State Management · Localization · Quick Checklist. Angular has **no** `migration-property-changes` twin like React's — per-component inputs/outputs come from each component page above.)* |
|
|
59
|
+
|
|
60
|
+
## Task guides (recipes) — build FROM these
|
|
61
|
+
| Task | Path |
|
|
62
|
+
| --- | --- |
|
|
63
|
+
| New chat | `/guides/new-chat` |
|
|
64
|
+
| Group chat | `/guides/group-chat` |
|
|
65
|
+
| Threaded messages | `/guides/threaded-messages` |
|
|
66
|
+
| Search messages | `/guides/search-messages` |
|
|
67
|
+
| Message privately | `/guides/message-privately` |
|
|
68
|
+
| Block / unblock | `/guides/block-unblock-user` |
|
|
69
|
+
| Custom message types | `/guides/custom-message-types` |
|
|
70
|
+
| Text formatters | `/guides/custom-text-formatter` · `/guides/mentions-formatter` · `/guides/url-formatter` · `/guides/hashtag-formatter` · `/guides/shortcut-formatter` |
|
|
71
|
+
| Rich text | `/guides/rich-text-formatting` |
|
|
72
|
+
| Card messages | `/guides/card-messages` |
|
|
73
|
+
| State management | `/guides/state-management` |
|
|
74
|
+
| RxJS patterns | `/guides/subscription-patterns` |
|
|
75
|
+
| Call log details | `/guides/call-log-details` |
|
|
76
|
+
|
|
77
|
+
**Reference layouts** — whole-screen shells, not single-feature recipes. Fetch the matching one before composing a surface:
|
|
78
|
+
|
|
79
|
+
| Layout | Path | Shape |
|
|
80
|
+
| --- | --- | --- |
|
|
81
|
+
| Tab-based app | `/ui-kit/angular/angular-tab-based-chat` | left sidebar + `@switch (activeTab)` over `ChatStateService`. **The grow target** — build it only when the user asks for tabs. Its tab set (Chats · Call Logs · Users) is ONE example, not the definitive list. |
|
|
82
|
+
| Conversation list ↔ pane | `/ui-kit/angular/angular-conversation` | the default "add chat" shape (`placement/references/core-surface.md`) |
|
|
83
|
+
| Single 1:1 chat | `/ui-kit/angular/angular-one-to-one-chat` | one fixed conversation, no selector |
|
|
84
|
+
|
|
85
|
+
Use a guide as the implementation SOURCE, then compare your output against it.
|
|
86
|
+
|
|
87
|
+
## SDK docs — the per-feature fallback
|
|
88
|
+
When a capability has **no UI Kit component**, drop to the headless JS SDK. Angular uses the same SDK as every other web family — there is no Angular-specific SDK.
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
SDK_DOCS_BASE = https://www.cometchat.com/docs
|
|
92
|
+
# Production docs base
|
|
93
|
+
SDK index (scoped — PREFER): {SDK_DOCS_BASE}/sdk/javascript/llms-javascript-v4.md
|
|
94
|
+
Convention: {SDK_DOCS_BASE}/sdk/javascript/<page> then append .md
|
|
95
|
+
```
|
|
96
|
+
The scoped index groups every SDK page by area — Messaging · Calling · Users · Groups · AI, campaigns & webhooks · Real-time Listeners · Key Concepts. Each page opens with an **"AI Integration Quick Reference"** accordion listing package, import and key methods — read that first, then the examples.
|
|
97
|
+
|
|
98
|
+
Common entry points: `/sdk/javascript/send-message` · `/sdk/javascript/receive-messages` · `/sdk/javascript/retrieve-conversations` · `/sdk/javascript/user-management` · `/sdk/javascript/groups-overview` · `/sdk/javascript/ai-agents`.
|
|
99
|
+
|
|
100
|
+
Using the SDK from Angular, two rules from `lifecycle.md` always apply: remove listeners in `ngOnDestroy`, and repaint after SDK-callback state updates via a **signal** or `ChangeDetectorRef.markForCheck()` (Angular v21 is zoneless by default, so `NgZone.run()` won't trigger change detection).
|
|
101
|
+
|
|
102
|
+
## Never
|
|
103
|
+
Do not read a symbol's shape from `node_modules/**/*.d.ts` and present it as documentation, and never answer inputs/outputs from memory. Fetch the page.
|
|
104
|
+
|
|
105
|
+
## Docs first for the API — the installed kit for BEHAVIOUR the docs omit (full detail)
|
|
106
|
+
> `SKILL.md` § "Docs first for the API" keeps the spine; the deep methodology + examples live here.
|
|
107
|
+
|
|
108
|
+
**What exists and what it is called comes from the docs.** Fetch the component's page (`DOCS_BASE` + path + `.md`).
|
|
109
|
+
Each opens with an **AI Integration Quick Reference** — selector, key inputs/outputs, view slots, anchors into the
|
|
110
|
+
props table. Read that first; it usually answers the question without loading the page.
|
|
111
|
+
|
|
112
|
+
Do **not** invent an API from the type declarations. The types expose internal-only names that are not importable
|
|
113
|
+
and members with no defined behaviour — that is how a plausible-but-wrong symbol reaches the emitted code.
|
|
114
|
+
|
|
115
|
+
**But reading the shipped bundle IS correct when the docs state a prop and not its semantics.** The props table
|
|
116
|
+
often gives a type and a one-line description without saying how the input behaves. Real examples in this kit:
|
|
117
|
+
|
|
118
|
+
- `attachmentOptions` is documented as *"Custom attachment options for the attachment menu"* — it does not say
|
|
119
|
+
whether yours **append to** or **replace** the built-ins. (They append: the composer pushes yours onto the built-in
|
|
120
|
+
list.) Guess "replace" and you silently delete image/video/file/audio attachments.
|
|
121
|
+
- `messagesRequestBuilder` — whether a supplied builder overrides or merges with defaults is not stated for the
|
|
122
|
+
message list.
|
|
123
|
+
|
|
124
|
+
When behaviour is load-bearing and undocumented, **verify it in the installed package**
|
|
125
|
+
(`node_modules/@cometchat/chat-uikit-angular/fesm2022/*.mjs`) rather than guessing. Then do two things:
|
|
126
|
+
|
|
127
|
+
1. **State in your summary that you verified it against the installed kit**, not the docs — so the developer knows it
|
|
128
|
+
is pinned to this version.
|
|
129
|
+
2. **Report it as a docs gap**, naming the page and the missing sentence. That is how the docs improve instead of
|
|
130
|
+
every agent re-deriving it.
|
|
131
|
+
|
|
132
|
+
Reading the package is also fine for confirming the installed **version**.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Layout & sizing — why the chat pane collapses
|
|
2
|
+
|
|
3
|
+
## The rule
|
|
4
|
+
Every kit component fills its container. If any ancestor has no resolved height, the component computes to **0px** and you get a blank pane with no error. This is the second most common failure after a missing `imports` entry.
|
|
5
|
+
|
|
6
|
+
## The prepared ancestor chain
|
|
7
|
+
```css
|
|
8
|
+
/* styles.css — global, required */
|
|
9
|
+
html, body { height: 100%; margin: 0; }
|
|
10
|
+
```
|
|
11
|
+
Then the shell:
|
|
12
|
+
```css
|
|
13
|
+
.cc-shell { display: flex; height: 100dvh; width: 100%; min-height: 0; overflow: hidden; }
|
|
14
|
+
.cc-side { width: 320px; min-height: 0; overflow: hidden; }
|
|
15
|
+
.cc-main { flex: 1; display: flex; flex-direction: column; min-height: 0; overflow: hidden; }
|
|
16
|
+
```
|
|
17
|
+
`100dvh` (not `100vh`) so mobile browser chrome does not clip the composer.
|
|
18
|
+
|
|
19
|
+
## `overflow: hidden` is what makes each pane scroll ITSELF
|
|
20
|
+
`min-height: 0` lets a child shrink; **`overflow: hidden` on the shell and on each column is what keeps its scrolling inside it.** Omit it and the panes grow the page instead: scrolling the conversation list scrolls the WHOLE window, message pane and all, and the header scrolls away with it. The height chain looks right, nothing errors, and the app feels broken.
|
|
21
|
+
|
|
22
|
+
Both are required, and they do different jobs:
|
|
23
|
+
- `min-height: 0` — the column may shrink below its content
|
|
24
|
+
- `overflow: hidden` — the overflow is contained, so the kit's own list scrolls internally
|
|
25
|
+
|
|
26
|
+
The kit's lists manage their own scrolling. Your job is to give them a **fixed-size box to scroll inside**; the moment the box can grow, they stop scrolling and the document does.
|
|
27
|
+
|
|
28
|
+
## `min-height: 0` on every flex column
|
|
29
|
+
A flex item defaults to `min-height: auto`, which refuses to shrink below its content. Nested scrollable lists then overflow the viewport instead of scrolling internally. Every column in the chain needs `min-height: 0`.
|
|
30
|
+
|
|
31
|
+
## Ancestors that break it
|
|
32
|
+
- `transform`, `filter` or `backdrop-filter` on an ancestor creates a containing block that breaks the height chain and can trap `position: fixed` overlays.
|
|
33
|
+
- `overflow: hidden` on a mid-level wrapper clips the composer.
|
|
34
|
+
- A host element with no display set: kit components are custom elements, so give the host `display: block` or `display: flex` where you control it.
|
|
35
|
+
|
|
36
|
+
## No reflow between loading and loaded
|
|
37
|
+
The pane must not change size when data arrives. Give the pinned box its height up front so the kit's loading and empty views occupy the same box as the loaded list. If the layout jumps, an ancestor is sizing to content rather than to the viewport.
|
|
38
|
+
|
|
39
|
+
## Thread and search panels
|
|
40
|
+
Both are additional columns in the same shell, not overlays:
|
|
41
|
+
```css
|
|
42
|
+
.cc-thread { width: 360px; min-height: 0; border-left: 1px solid var(--cometchat-border-color-default); }
|
|
43
|
+
```
|
|
44
|
+
Opening a thread must not resize the message list — reserve the column or animate width, never remount the list. Closing must return to the exact prior layout (the panel-close round-trip).
|
|
45
|
+
|
|
46
|
+
## Responsive — one pane on mobile
|
|
47
|
+
Below ~768px, show a single pane: the list, or the conversation, never both squeezed.
|
|
48
|
+
```css
|
|
49
|
+
@media (max-width: 768px) {
|
|
50
|
+
.cc-shell { flex-direction: column; }
|
|
51
|
+
.cc-side { width: 100%; }
|
|
52
|
+
.cc-side[hidden], .cc-main[hidden] { display: none; }
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
Drive `hidden` from the same selection state that drives the message components, and give the mobile conversation view a back control that clears the selection.
|
|
56
|
+
|
|
57
|
+
## Quick diagnosis
|
|
58
|
+
| Symptom | Cause |
|
|
59
|
+
| --- | --- |
|
|
60
|
+
| Blank pane, no error | an ancestor has no height — check `html, body` |
|
|
61
|
+
| List overflows the page | a flex column is missing `min-height: 0` |
|
|
62
|
+
| Composer off-screen on mobile | `100vh` instead of `100dvh`, or `overflow: hidden` on a wrapper |
|
|
63
|
+
| Layout jumps when data loads | the box is sizing to content, not the viewport |
|
|
64
|
+
| Dropdown clipped | an ancestor has `overflow: hidden` or a `transform` |
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# Lifecycle — init → login → render, the Angular way
|
|
2
|
+
|
|
3
|
+
## The invariant
|
|
4
|
+
`init()` must RESOLVE before `login()`, and `login()` before any kit component renders. Out of order, components mount with no session and render empty lists with no error.
|
|
5
|
+
|
|
6
|
+
## Where init goes
|
|
7
|
+
Angular has no React-style root effect. Two correct placements:
|
|
8
|
+
|
|
9
|
+
**A. Before `bootstrapApplication` (simplest, recommended).** See the core SKILL.md recipe — init and login resolve, then the app boots. Nothing can render early because the app has not booted yet.
|
|
10
|
+
|
|
11
|
+
**B. `provideAppInitializer` (when you need DI during init).**
|
|
12
|
+
```ts
|
|
13
|
+
// src/app/app.config.ts
|
|
14
|
+
import { ApplicationConfig, provideAppInitializer, inject } from '@angular/core';
|
|
15
|
+
import { CometChatUIKit } from '@cometchat/chat-uikit-angular';
|
|
16
|
+
import { environment } from '../environments/environment';
|
|
17
|
+
import { ensureLoggedIn } from './cometchat-session'; // the guarded login below
|
|
18
|
+
|
|
19
|
+
export const appConfig: ApplicationConfig = {
|
|
20
|
+
providers: [
|
|
21
|
+
provideAppInitializer(() => {
|
|
22
|
+
const { appId, region, authKey } = environment.cometchat;
|
|
23
|
+
// initFromSettings — NOT the classic builder init — so integrationSource
|
|
24
|
+
// ="ai-agent" is persisted for telemetry attribution and the Calls SDK
|
|
25
|
+
// inherits the same source.
|
|
26
|
+
return CometChatUIKit.initFromSettings({
|
|
27
|
+
appId, region,
|
|
28
|
+
credentials: { authKey },
|
|
29
|
+
chatSDK: { presenceSubscription: { type: 'ALL_USERS' } },
|
|
30
|
+
}).then(() => ensureLoggedIn('cometchat-uid-1'));
|
|
31
|
+
}),
|
|
32
|
+
],
|
|
33
|
+
};
|
|
34
|
+
```
|
|
35
|
+
Angular waits for the returned promise before rendering the first component. On Angular 17-18 use the older `{ provide: APP_INITIALIZER, useFactory, multi: true }` form — same semantics.
|
|
36
|
+
|
|
37
|
+
`initFromSettings` returns `Promise<InitResult>`. `CometChatUIKit.isInitialized()` is a cheap synchronous check.
|
|
38
|
+
|
|
39
|
+
## The docs show `init(builder)` — that is CORRECT for them, and wrong for us
|
|
40
|
+
`{DOCS_BASE}/ui-kit/angular/integration.md` and `quickstart.md` initialise with the classic builder:
|
|
41
|
+
the classic `UIKitSettingsBuilder` chain (`setAppId` / `setRegion` / `setAuthKey`) passed to the UI Kit's builder-style init.
|
|
42
|
+
|
|
43
|
+
That is **not stale documentation** — it is the right recipe for its reader, and it must not be "fixed".
|
|
44
|
+
|
|
45
|
+
The SDK ships two integration sources and the init path selects between them:
|
|
46
|
+
|
|
47
|
+
| Caller | Path | Recorded as |
|
|
48
|
+
| --- | --- | --- |
|
|
49
|
+
| A developer following the docs by hand | the builder-style `init` | `manual` |
|
|
50
|
+
| An agent following this pack | `CometChatUIKit.initFromSettings({ … })` | `ai-agent` |
|
|
51
|
+
|
|
52
|
+
Verified in the shipped SDK: `INTEGRATION_SOURCE = { AI_AGENT: "ai-agent", MANUAL: "manual" }`, with the builder-style init storing `MANUAL` and `initFromSettings()` storing `AI_AGENT`.
|
|
53
|
+
|
|
54
|
+
So the split is deliberate on both sides. **Use `initFromSettings` here** — a static gate enforces it — and do **not** raise the docs' builder recipe as a docs bug or propose changing it. Converting the public docs to `initFromSettings` would tag every hand-built integration as agent-built and destroy the distinction the field exists to measure.
|
|
55
|
+
|
|
56
|
+
## Guarded login — the one that bites
|
|
57
|
+
A second `login()` while the first is still in flight throws **"Please wait until the previous login request ends."** Sequential calls are fine (the second returns the cached user); concurrent ones are not. Route guards, resolvers and a component `ngOnInit` firing together will do this.
|
|
58
|
+
|
|
59
|
+
Cache the **promise**, never a boolean flipped before the await:
|
|
60
|
+
```ts
|
|
61
|
+
// src/app/cometchat-session.ts
|
|
62
|
+
import { CometChatUIKit } from '@cometchat/chat-uikit-angular';
|
|
63
|
+
|
|
64
|
+
// Cache the PROMISE, once per page load. Concurrent callers await the same one;
|
|
65
|
+
// later callers get the resolved value. A second sequential login() returns the
|
|
66
|
+
// cached user, so calling it once per load is safe even with a stored session.
|
|
67
|
+
let session: Promise<unknown> | null = null;
|
|
68
|
+
|
|
69
|
+
export function ensureLoggedIn(uid: string) {
|
|
70
|
+
if (!session) {
|
|
71
|
+
session = CometChatUIKit.login(uid).catch((e) => { session = null; throw e; });
|
|
72
|
+
}
|
|
73
|
+
return session;
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
> ⚠️ **Do NOT short-circuit on `CometChatUIKit.getLoggedInUser()`.** It is tempting:
|
|
78
|
+
> ```ts
|
|
79
|
+
> const existing = CometChatUIKit.getLoggedInUser(); // ← don't
|
|
80
|
+
> if (existing) return Promise.resolve(existing);
|
|
81
|
+
> ```
|
|
82
|
+
> `initFromSettings` hydrates the kit's own `_loggedInUser` from storage when a session exists, so this returns a user **before `login()` has run in this page**. You then skip `login()` entirely and the kit's post-login wiring never executes. Worse, the kit's view and the SDK's can disagree — `CometChatUIKit.getLoggedInUser()` returning a user does **not** guarantee `CometChat.getLoggedinUser()` is populated or that requests will authorise. Trust the promise, not the cached flag.
|
|
83
|
+
|
|
84
|
+
## Dev-only: `ensureDevUser` — create-if-missing, then log in
|
|
85
|
+
|
|
86
|
+
`login(uid)` authenticates a user that **must already exist**; it does not create one. `cometchat-uid-1` is the docs sample, **not a guarantee about this app** — on an app whose sample users were never seeded or have been cleaned up, login fails with a user-not-found and the screen stays blank with no obvious cause.
|
|
87
|
+
|
|
88
|
+
You cannot pre-check existence: `CometChat.getUser()` needs a session, and in dev you hold only the Auth Key, not the REST key. Probing `uid-1..5` would mean up to five failed login attempts. So **create-if-missing, then log in** — one deterministic call that is valid on any app, fresh or customised:
|
|
89
|
+
|
|
90
|
+
```ts
|
|
91
|
+
// src/app/cometchat-session.ts — continued: add below ensureLoggedIn() (merge the imports)
|
|
92
|
+
import { CometChat } from '@cometchat/chat-sdk-javascript'; // for CometChat.User
|
|
93
|
+
import { CometChatUIKit } from '@cometchat/chat-uikit-angular';
|
|
94
|
+
|
|
95
|
+
// createUser uses the Auth Key configured in init — verified vs installed 5.1.0:
|
|
96
|
+
// static createUser(user: CometChat.User): Promise<CometChat.User>
|
|
97
|
+
export async function ensureDevUser(uid = 'cometchat-uid-1', name = 'Demo User') {
|
|
98
|
+
try {
|
|
99
|
+
const u = new CometChat.User(uid);
|
|
100
|
+
u.setName(name);
|
|
101
|
+
await CometChatUIKit.createUser(u);
|
|
102
|
+
} catch {
|
|
103
|
+
// ERR_UID_ALREADY_EXISTS is EXPECTED — the user is there. Fall through to login.
|
|
104
|
+
}
|
|
105
|
+
return ensureLoggedIn(uid); // now guaranteed to succeed
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**DEV ONLY.** It depends on the Auth Key being in the browser. Production mints a per-user auth token server-side and calls `loginWithAuthToken` — see `setup-credentials.md`. When the developer names a real UID, log in as that instead; only fall back to this when no UID is known.
|
|
110
|
+
|
|
111
|
+
## Readiness gap — `login()` resolving is not "ready to fetch"
|
|
112
|
+
`login()` can resolve slightly before the session can authorise requests. A list that mounts in that window fires its first fetch, gets an auth error, and — for `ConversationsService` — **caches the failure**: the built-in Retry button does not re-attempt, so a transient startup error becomes a permanent "OOPS!" until a page reload.
|
|
113
|
+
|
|
114
|
+
Defend against it:
|
|
115
|
+
- **Bootstrap after login resolves** (core's `main.ts` recipe) rather than rendering a chat route that races it. Nothing mounts until the session exists.
|
|
116
|
+
- If you must gate a route instead, resolve `ensureLoggedIn()` in the guard and let the route render only after it settles.
|
|
117
|
+
- Handle `(error)` on lists and give the user a real retry that **remounts** the component, since the built-in one may not recover.
|
|
118
|
+
- Do not "fix" this with a `setTimeout` — it hides a race rather than ordering it.
|
|
119
|
+
Production uses a server-minted token instead: `CometChatUIKit.loginWithAuthToken(token)`. Never ship the Auth Key to the browser — see `setup-credentials.md`.
|
|
120
|
+
|
|
121
|
+
## Reading the session — `loggedInUser$`
|
|
122
|
+
The kit exposes an RxJS Observable. This is the Angular-idiomatic way to react to login/logout; React has no equivalent.
|
|
123
|
+
```ts
|
|
124
|
+
import { Component, OnDestroy, inject, ChangeDetectorRef } from '@angular/core';
|
|
125
|
+
import { CometChatUIKit } from '@cometchat/chat-uikit-angular';
|
|
126
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
127
|
+
|
|
128
|
+
@Component({ selector: 'app-shell', standalone: true, template: '' })
|
|
129
|
+
export class ShellComponent implements OnDestroy {
|
|
130
|
+
private destroy$ = new Subject<void>();
|
|
131
|
+
user: unknown = null;
|
|
132
|
+
|
|
133
|
+
constructor() {
|
|
134
|
+
CometChatUIKit.loggedInUser$
|
|
135
|
+
.pipe(takeUntil(this.destroy$))
|
|
136
|
+
.subscribe((u) => { this.user = u; });
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); }
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
`CometChatUIKit.getLoggedInUser()` is the synchronous one-shot equivalent.
|
|
143
|
+
|
|
144
|
+
## Teardown — required, not optional
|
|
145
|
+
Every subscription and every CometChat SDK listener must be released in `ngOnDestroy`, or the app leaks on each route change and stale handlers fire against destroyed views.
|
|
146
|
+
```ts
|
|
147
|
+
import { CometChat } from '@cometchat/chat-sdk-javascript';
|
|
148
|
+
|
|
149
|
+
class ExampleComponent {
|
|
150
|
+
private listenerId = 'chat-example';
|
|
151
|
+
private destroy$ = { next: () => {}, complete: () => {} };
|
|
152
|
+
|
|
153
|
+
ngOnDestroy() {
|
|
154
|
+
this.destroy$.next();
|
|
155
|
+
this.destroy$.complete();
|
|
156
|
+
CometChat.removeMessageListener(this.listenerId); // same id used to register
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
Register listeners with a stable id you keep on the component instance.
|
|
161
|
+
|
|
162
|
+
## Async SDK callbacks — messages arrive but the UI does not update
|
|
163
|
+
CometChat SDK callbacks fire asynchronously (and, with zones, outside Angular's zone), so state you set inside them does not repaint on its own. Symptom: the message exists in memory, the DOM never changes.
|
|
164
|
+
|
|
165
|
+
**Angular v21 is ZONELESS by default** — no provider needed: `ng new` (21.2.x) adds no `zone.js` and no `provideZoneChangeDetection()`, and does NOT add `provideZonelessChangeDetection()` or `OnPush` either (components stay `Default` CD) — so **`NgZone.run()` does NOT trigger change detection**; there's no zone to re-enter. Use a **signal** (the cleanest zoneless pattern — writing it schedules CD) or call **`ChangeDetectorRef.markForCheck()`** after mutating plain state. Both work whether the app is zoneless or (legacy) zone-based:
|
|
166
|
+
```ts
|
|
167
|
+
import { CometChat } from '@cometchat/chat-sdk-javascript';
|
|
168
|
+
import { signal } from '@angular/core';
|
|
169
|
+
|
|
170
|
+
class ExampleComponent {
|
|
171
|
+
private listenerId = 'chat-example';
|
|
172
|
+
// signal: writing to it schedules change detection under the zoneless default
|
|
173
|
+
messages = signal<unknown[]>([]);
|
|
174
|
+
|
|
175
|
+
constructor() {
|
|
176
|
+
CometChat.addMessageListener(this.listenerId, {
|
|
177
|
+
onTextMessageReceived: (msg: unknown) => {
|
|
178
|
+
this.messages.update((prev) => [...prev, msg]); // repaints — no NgZone needed
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
Prefer a signal (template reads `messages()`); if you keep a plain field instead, inject `ChangeDetectorRef` and call `this.cdr.markForCheck()` after the mutation. Only if you have deliberately opted back into zones with `provideZoneChangeDetection()` is `NgZone.run()` the right remedy. The kit's own components handle this internally — you only need this for your own SDK listeners.
|
|
185
|
+
|
|
186
|
+
## Logout — cleanup only runs if the SDK call resolves
|
|
187
|
+
```ts
|
|
188
|
+
import { CometChatUIKit } from '@cometchat/chat-uikit-angular';
|
|
189
|
+
|
|
190
|
+
export async function signOut(navigateToLogin: () => void) {
|
|
191
|
+
try {
|
|
192
|
+
await CometChatUIKit.logout();
|
|
193
|
+
} catch {
|
|
194
|
+
// swallow — still treat the user as signed out locally, see below
|
|
195
|
+
} finally {
|
|
196
|
+
navigateToLogin(); // unconditional — do not gate this on the promise resolving
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
Verified in the installed 5.1.0 bundle: `CometChatUIKit.logout()` only runs its local cleanup (`detachListeners`, clearing the cached user, `loggedInUser$` → `null`) **inside** `CometChat.logout()`'s `.then()`. A rejection (reproduced: `USER_NOT_LOGED_IN` — *"an authToken is need to use the userLogout end-point"*) skips cleanup entirely — `getLoggedInUser()`/`loggedInUser$` keep reporting the old session, and `initFromSettings` rehydrates that same stale user on the next reload (§ above), so sign-out silently doesn't stick. Undocumented in the pack and the official docs.
|
|
201
|
+
|
|
202
|
+
Never drive a login-screen redirect off `loggedInUser$` emitting `null` after calling logout — on a rejection it may not. `catch` the call and navigate/clear your own app-level "signed in" state unconditionally in a `finally`; treat the kit's local cache as advisory, not authoritative, for this one transition.
|