@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,285 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: cometchat-flutter-v5-push
|
|
3
|
-
description: "Use when implementing push notifications with CometChat Flutter UIKit v5. Covers FCM (Android), APNs (iOS), VoIP calls, token lifecycle, local notifications, and tap-to-navigate."
|
|
4
|
-
license: "MIT"
|
|
5
|
-
compatibility: "cometchat_chat_uikit ^5.2.14; cometchat_calls_uikit ^5.0.15; firebase_messaging; flutter_local_notifications; flutter_callkit_incoming"
|
|
6
|
-
metadata:
|
|
7
|
-
author: "CometChat"
|
|
8
|
-
version: "3.0.0"
|
|
9
|
-
tags: "cometchat flutter v5 push notifications fcm apns voip callkit firebase"
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
> **Ground truth:** `cometchat_chat_uikit: ^5.2` (legacy/maintenance-only; calls via raw `cometchat_calls_sdk ^5.0.2`) — pub-cache source + `ui-kit/flutter/v5`. **Official docs:** https://www.cometchat.com/docs/notifications/overview · **Docs MCP:** `claude mcp add --transport http cometchat-docs https://www.cometchat.com/docs/mcp` (or fetch the URL directly without MCP). Verify symbols against the installed package/source before relying on them.
|
|
13
|
-
|
|
14
|
-
# CometChat Flutter UIKit v5 — Push Notifications
|
|
15
|
-
|
|
16
|
-
Push notification setup for Android (FCM) and iOS (APNs + VoIP).
|
|
17
|
-
|
|
18
|
-
## Dependencies
|
|
19
|
-
|
|
20
|
-
```yaml
|
|
21
|
-
dependencies:
|
|
22
|
-
firebase_core: ^3.9.0
|
|
23
|
-
firebase_messaging: ^15.1.6
|
|
24
|
-
flutter_local_notifications: ^18.0.0
|
|
25
|
-
flutter_callkit_incoming: # for VoIP call notifications
|
|
26
|
-
app_badge_plus: ^1.2.6 # badge count
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
## Architecture Overview
|
|
30
|
-
|
|
31
|
-
```
|
|
32
|
-
notifications/
|
|
33
|
-
├── models/
|
|
34
|
-
│ ├── payload.dart # PayloadData model for parsing FCM data
|
|
35
|
-
│ ├── call_action.dart # CallAction enum (initiated, cancelled, unanswered)
|
|
36
|
-
│ ├── call_type.dart # CallType enum (audio, video)
|
|
37
|
-
│ └── notification_message_type.dart # Message type constants
|
|
38
|
-
├── services/
|
|
39
|
-
│ ├── android_notification_service/
|
|
40
|
-
│ │ ├── firebase_services.dart # FCM init, listeners, token management
|
|
41
|
-
│ │ ├── local_notification_handler.dart # Local notification display + tap handling
|
|
42
|
-
│ │ ├── voip_notification_handler.dart # VoIP call display, accept, decline
|
|
43
|
-
│ │ └── notification_launch_handler.dart # Terminated state launch handling
|
|
44
|
-
│ ├── iOS_notification_service/
|
|
45
|
-
│ │ └── apns_services.dart # APNs connector, VoIP token, CallKit
|
|
46
|
-
│ └── cometchat_service/
|
|
47
|
-
│ └── cometchat_services.dart # PNRegistry (token registration/unregistration)
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
## Token Registration — `CometChatNotifications.registerPushToken`
|
|
51
|
-
|
|
52
|
-
The kit's only public push surface is `CometChatNotifications.registerPushToken(platform, {providerId, fcmToken, deviceToken, voipToken, onSuccess, onError})` (and `unregisterPushToken({onSuccess, onError})`). The sample app wraps this in an extension named `PNRegistry on CometChatService` (see `sample_app_push_notifications/lib/notifications/services/cometchat_service/cometchat_services.dart`) that picks the right provider ID + platform constant for FCM-Android / FCM-iOS / APNs / APNs-VoIP. **Copy that helper into your project, or call `CometChatNotifications.registerPushToken` directly** — `PNRegistry` is a sample-app extension, not importable from any cometchat package.
|
|
53
|
-
|
|
54
|
-
```dart
|
|
55
|
-
// Direct kit API:
|
|
56
|
-
import 'package:cometchat_chat_uikit/cometchat_chat_uikit.dart';
|
|
57
|
-
|
|
58
|
-
await CometChatNotifications.registerPushToken(
|
|
59
|
-
PushPlatforms.FCM_FLUTTER_ANDROID, // platform — first positional arg
|
|
60
|
-
providerId: fcmProviderId, // dashboard FCM provider ID
|
|
61
|
-
fcmToken: token, // use fcmToken / deviceToken / voipToken depending on platform
|
|
62
|
-
onSuccess: (response) => debugPrint('registered: $response'),
|
|
63
|
-
onError: (e) => debugPrint('register failed: $e'),
|
|
64
|
-
);
|
|
65
|
-
|
|
66
|
-
// On logout:
|
|
67
|
-
await CometChatNotifications.unregisterPushToken(
|
|
68
|
-
onSuccess: (_) {},
|
|
69
|
-
onError: (e) => debugPrint('unregister failed: $e'),
|
|
70
|
-
);
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
```dart
|
|
74
|
-
// Or use the sample-app PNRegistry helper after copying it into your project:
|
|
75
|
-
PNRegistry.registerPNService(token, true, false); // (token, isFcm, isVoip)
|
|
76
|
-
PNRegistry.unregisterPNService();
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
Platform mapping:
|
|
80
|
-
- FCM Android → `PushPlatforms.FCM_FLUTTER_ANDROID`
|
|
81
|
-
- FCM iOS → `PushPlatforms.FCM_FLUTTER_IOS`
|
|
82
|
-
- APNs Device → `PushPlatforms.APNS_FLUTTER_DEVICE`
|
|
83
|
-
- APNs VoIP → `PushPlatforms.APNS_FLUTTER_VOIP`
|
|
84
|
-
|
|
85
|
-
Provider IDs come from `AppCredentials.fcmProviderId` / `AppCredentials.apnProviderId` (your own constants — these are dashboard-configured values, not kit exports).
|
|
86
|
-
|
|
87
|
-
The remaining examples below assume you've copied `PNRegistry` from the sample app. If you call `CometChatNotifications.registerPushToken` directly, swap the call sites accordingly.
|
|
88
|
-
|
|
89
|
-
## Android — FCM Setup
|
|
90
|
-
|
|
91
|
-
### 1. Background handler (must be top-level function)
|
|
92
|
-
|
|
93
|
-
```dart
|
|
94
|
-
@pragma('vm:entry-point')
|
|
95
|
-
Future<void> firebaseMessagingBackgroundHandler(RemoteMessage rMessage) async {
|
|
96
|
-
LocalNotificationService.showNotification(rMessage.data, rMessage, "", false);
|
|
97
|
-
await VoipNotificationHandler.displayIncomingCall(rMessage);
|
|
98
|
-
}
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
### 2. Initialize in dashboard/home screen
|
|
102
|
-
|
|
103
|
-
```dart
|
|
104
|
-
class FirebaseService {
|
|
105
|
-
Future<void> init(BuildContext context) async {
|
|
106
|
-
_firebaseMessaging = FirebaseMessaging.instance;
|
|
107
|
-
await requestPermissions();
|
|
108
|
-
await initListeners(context);
|
|
109
|
-
|
|
110
|
-
String? token = await _firebaseMessaging.getToken();
|
|
111
|
-
if (token != null) {
|
|
112
|
-
PNRegistry.registerPNService(token, true, false);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
### 3. Listener setup
|
|
119
|
-
|
|
120
|
-
```dart
|
|
121
|
-
// Background messages
|
|
122
|
-
FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler);
|
|
123
|
-
|
|
124
|
-
// Token refresh
|
|
125
|
-
_firebaseMessaging.onTokenRefresh.listen((token) {
|
|
126
|
-
PNRegistry.registerPNService(token, true, false);
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
// Foreground messages
|
|
130
|
-
FirebaseMessaging.onMessage.listen((message) {
|
|
131
|
-
LocalNotificationService.showNotification(message.data, message, conversationId, isAgentic);
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
// Tap from background
|
|
135
|
-
FirebaseMessaging.onMessageOpenedApp.listen((message) {
|
|
136
|
-
openNotification(context, message, conversationId);
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
// Tap from terminated state
|
|
140
|
-
FirebaseMessaging.instance.getInitialMessage().then((message) {
|
|
141
|
-
if (message != null) openNotification(context, message, conversationId);
|
|
142
|
-
});
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
## iOS — APNs Setup
|
|
146
|
-
|
|
147
|
-
```dart
|
|
148
|
-
final _connector = ApnsPushConnector();
|
|
149
|
-
_connector.shouldPresent = (x) => Future.value(false);
|
|
150
|
-
|
|
151
|
-
_connector.configure(
|
|
152
|
-
onLaunch: (message) async { openNotification(message, context, ""); },
|
|
153
|
-
onResume: (message) async { openNotification(message, context, conversationId); },
|
|
154
|
-
onMessage: (message) async { _showNotification(message.data, message, conversationId, isAgentic); },
|
|
155
|
-
);
|
|
156
|
-
|
|
157
|
-
_connector.requestNotificationPermissions();
|
|
158
|
-
|
|
159
|
-
// APNs device token
|
|
160
|
-
_connector.token.addListener(() {
|
|
161
|
-
PNRegistry.registerPNService(_connector.token.value!, false, false);
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
// VoIP token
|
|
165
|
-
FlutterCallkitIncoming.getDevicePushTokenVoIP().then((voipToken) {
|
|
166
|
-
PNRegistry.registerPNService(voipToken, false, true);
|
|
167
|
-
});
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
## VoIP Call Notifications
|
|
171
|
-
|
|
172
|
-
### Display incoming call (both platforms)
|
|
173
|
-
|
|
174
|
-
```dart
|
|
175
|
-
static Future<void> displayIncomingCall(RemoteMessage rMessage) async {
|
|
176
|
-
PayloadData callPayload = PayloadData.fromJson(rMessage.data);
|
|
177
|
-
if (callPayload.type == 'call' && callPayload.callAction == CallAction.initiated) {
|
|
178
|
-
CallKitParams params = CallKitParams(
|
|
179
|
-
id: callPayload.sessionId,
|
|
180
|
-
nameCaller: callPayload.senderName,
|
|
181
|
-
type: (callPayload.callType == CallType.audio) ? 0 : 1,
|
|
182
|
-
duration: 45000,
|
|
183
|
-
);
|
|
184
|
-
await FlutterCallkitIncoming.showCallkitIncoming(params);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
### Accept/Decline via CallKit events
|
|
190
|
-
|
|
191
|
-
```dart
|
|
192
|
-
FlutterCallkitIncoming.onEvent.listen((CallEvent? callEvent) {
|
|
193
|
-
switch (callEvent?.event) {
|
|
194
|
-
case Event.actionCallAccept:
|
|
195
|
-
VoipNotificationHandler.acceptVoipCall(callEvent, context);
|
|
196
|
-
break;
|
|
197
|
-
case Event.actionCallDecline:
|
|
198
|
-
VoipNotificationHandler.declineVoipCall(callEvent);
|
|
199
|
-
break;
|
|
200
|
-
case Event.actionCallTimeout:
|
|
201
|
-
case Event.actionCallEnded:
|
|
202
|
-
VoipNotificationHandler.endCall(sessionId: callEvent?.body['id']);
|
|
203
|
-
break;
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
## Local Notification Display
|
|
209
|
-
|
|
210
|
-
Uses `flutter_local_notifications` with inbox-style grouping per conversation:
|
|
211
|
-
|
|
212
|
-
```dart
|
|
213
|
-
// Skip if user is viewing the same conversation
|
|
214
|
-
if (conversationId == notifConversationId) return;
|
|
215
|
-
|
|
216
|
-
// Skip call-type notifications (handled by CallKit)
|
|
217
|
-
if (data["type"] == "call") return;
|
|
218
|
-
|
|
219
|
-
// Show with stable ID per conversation (replaces previous)
|
|
220
|
-
final notificationId = conversationId.hashCode;
|
|
221
|
-
await flutterLocalNotificationsPlugin.show(notificationId, title, body, details, payload: jsonPayload);
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
## Tap-to-Navigate
|
|
225
|
-
|
|
226
|
-
```dart
|
|
227
|
-
static void handleNotificationTap(NotificationResponse? response) async {
|
|
228
|
-
if (response?.payload != null) {
|
|
229
|
-
final body = jsonDecode(response!.payload!);
|
|
230
|
-
NotificationDataModel model = NotificationDataModel.fromJson(body);
|
|
231
|
-
|
|
232
|
-
User? user; Group? group;
|
|
233
|
-
if (model.receiverType == "user") {
|
|
234
|
-
user = await CometChat.getUser(model.sender);
|
|
235
|
-
} else {
|
|
236
|
-
group = await CometChat.getGroup(model.receiver);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
if (model.type == "chat" && (user != null || group != null)) {
|
|
240
|
-
Navigator.of(CallNavigationContext.navigatorKey.currentContext!).push(
|
|
241
|
-
MaterialPageRoute(builder: (_) => MessagesSample(user: user, group: group)),
|
|
242
|
-
);
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
## Terminated State Handling
|
|
249
|
-
|
|
250
|
-
```dart
|
|
251
|
-
// In main()
|
|
252
|
-
final launchDetails = await flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails();
|
|
253
|
-
if (launchDetails?.didNotificationLaunchApp == true) {
|
|
254
|
-
NotificationLaunchHandler.pendingNotificationResponse = launchDetails!.notificationResponse;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
// In dashboard initState()
|
|
258
|
-
Future.delayed(Duration(milliseconds: 300), () {
|
|
259
|
-
final response = NotificationLaunchHandler.pendingNotificationResponse;
|
|
260
|
-
if (response != null) {
|
|
261
|
-
NotificationLaunchHandler.pendingNotificationResponse = null;
|
|
262
|
-
LocalNotificationService.handleNotificationTap(response, isTerminatedState: true);
|
|
263
|
-
}
|
|
264
|
-
});
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
## Logout — Unregister Token
|
|
268
|
-
|
|
269
|
-
```dart
|
|
270
|
-
PNRegistry.unregisterPNService();
|
|
271
|
-
// Then: CometChatUIKit.logout(...)
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
## Checklist — Push Notifications
|
|
275
|
-
|
|
276
|
-
- [ ] Firebase initialized before CometChat init
|
|
277
|
-
- [ ] FCM token registered via `PNRegistry.registerPNService(token, true, false)`
|
|
278
|
-
- [ ] APNs device + VoIP tokens registered on iOS
|
|
279
|
-
- [ ] Background handler is top-level `@pragma('vm:entry-point')` function
|
|
280
|
-
- [ ] Token refresh listener re-registers token
|
|
281
|
-
- [ ] Local notifications skip current active conversation
|
|
282
|
-
- [ ] Call notifications handled via `FlutterCallkitIncoming`, not local notifications
|
|
283
|
-
- [ ] Tap-to-navigate uses `CallNavigationContext.navigatorKey.currentContext`
|
|
284
|
-
- [ ] Tokens unregistered on logout via `PNRegistry.unregisterPNService()`
|
|
285
|
-
- [ ] Terminated state launch handled via `NotificationLaunchHandler`
|
|
@@ -1,401 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: cometchat-flutter-v5-testing
|
|
3
|
-
description: Testing patterns for CometChat Flutter UIKit v5 (GetX-based). Covers flutter_test (built-in), mocktail for SDK mocking, widget tests around CometChat widgets, integration_test for real-device flows, golden tests for theming, and CI on GitHub Actions / Codemagic. Sister skill of cometchat-flutter-v6-testing — the cohorts have different state-management primitives (GetX vs Bloc) so test patterns differ.
|
|
4
|
-
license: "MIT"
|
|
5
|
-
compatibility: "Flutter >= 2.5, Dart >= 2.17; flutter_test (built-in); mocktail >= 1.0; integration_test (built-in); cometchat_chat_uikit ^5.2; cometchat_calls_uikit ^5.0"
|
|
6
|
-
metadata:
|
|
7
|
-
author: "CometChat"
|
|
8
|
-
version: "4.0.0"
|
|
9
|
-
tags: "cometchat flutter v5 testing flutter-test mocktail widget-test integration-test golden-test getx ci codemagic"
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Purpose
|
|
13
|
-
|
|
14
|
-
Test recipes for Flutter UIKit v5. Covers the GetX-flavored patterns; v6 (Bloc) has its own skill (`cometchat-flutter-v6-testing`).
|
|
15
|
-
|
|
16
|
-
**Read these other skills first:**
|
|
17
|
-
- `cometchat-flutter-v5-core` — UIKitSettingsBuilder, init/login order, GetX scope rules
|
|
18
|
-
- `cometchat-flutter-v5-events` — event subscription patterns the tests assert against
|
|
19
|
-
|
|
20
|
-
**Ground truth:** **Official docs:** https://www.cometchat.com/docs/ui-kit/flutter/v5/overview · **Docs MCP:** `claude mcp add --transport http cometchat-docs https://www.cometchat.com/docs/mcp` (or fetch the URL directly without MCP).
|
|
21
|
-
- flutter_test — https://api.flutter.dev/flutter/flutter_test/flutter_test-library.html
|
|
22
|
-
- mocktail — https://pub.dev/packages/mocktail
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## 1. Test layers
|
|
27
|
-
|
|
28
|
-
| Layer | Test runner | Speed | What it covers |
|
|
29
|
-
|---|---|---|---|
|
|
30
|
-
| Unit | `flutter test` (Dart VM) | Fastest | Pure Dart logic — services, models |
|
|
31
|
-
| Widget | `flutter test` (test environment) | Fast | Single widget, mocked dependencies |
|
|
32
|
-
| Integration | `flutter test integration_test/` (real device or simulator) | Slow | Full app flow, real SDK or mocked |
|
|
33
|
-
| Golden | `flutter test --update-goldens` then assert | Fast | Visual regression |
|
|
34
|
-
|
|
35
|
-
The skill writes all four; CI runs unit + widget + golden by default; integration runs on demand.
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
## 2. Mocking the SDK with mocktail
|
|
40
|
-
|
|
41
|
-
```yaml
|
|
42
|
-
# pubspec.yaml — dev dependencies
|
|
43
|
-
dev_dependencies:
|
|
44
|
-
flutter_test:
|
|
45
|
-
sdk: flutter
|
|
46
|
-
mocktail: ^1.0.0
|
|
47
|
-
integration_test:
|
|
48
|
-
sdk: flutter
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
### Wrap the SDK in protocols (testable abstraction)
|
|
52
|
-
|
|
53
|
-
```dart
|
|
54
|
-
// lib/services/cometchat_service.dart
|
|
55
|
-
import 'package:cometchat_calls_uikit/cometchat_calls_uikit.dart';
|
|
56
|
-
|
|
57
|
-
abstract class CometChatService {
|
|
58
|
-
Future<void> init();
|
|
59
|
-
Future<User> login(String uid);
|
|
60
|
-
Future<void> logout();
|
|
61
|
-
User? getLoggedInUser();
|
|
62
|
-
Future<TextMessage> sendMessage(TextMessage message);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
class CometChatServiceImpl implements CometChatService {
|
|
66
|
-
@override
|
|
67
|
-
Future<void> init() async {
|
|
68
|
-
final settings = (UIKitSettingsBuilder()
|
|
69
|
-
..appId = CometChatConfig.appId
|
|
70
|
-
..region = CometChatConfig.region
|
|
71
|
-
..authKey = CometChatConfig.authKey
|
|
72
|
-
..subscriptionType = CometChatSubscriptionType.allUsers
|
|
73
|
-
..callingExtension = CometChatCallingExtension())
|
|
74
|
-
.build();
|
|
75
|
-
await CometChatUIKit.init(uiKitSettings: settings);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
@override
|
|
79
|
-
Future<User> login(String uid) async {
|
|
80
|
-
final completer = Completer<User>();
|
|
81
|
-
CometChatUIKit.login(uid, onSuccess: completer.complete, onError: completer.completeError);
|
|
82
|
-
return completer.future;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
@override
|
|
86
|
-
Future<void> logout() async {
|
|
87
|
-
final completer = Completer<void>();
|
|
88
|
-
CometChatUIKit.logout(onSuccess: () => completer.complete(), onError: completer.completeError);
|
|
89
|
-
return completer.future;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
@override
|
|
93
|
-
// Sync accessor → the static field. CometChatUIKit.getLoggedInUser() is async
|
|
94
|
-
// (Future<User?>) and would not satisfy this `User?` signature.
|
|
95
|
-
User? getLoggedInUser() => CometChatUIKit.loggedInUser;
|
|
96
|
-
|
|
97
|
-
@override
|
|
98
|
-
Future<TextMessage> sendMessage(TextMessage message) async {
|
|
99
|
-
final completer = Completer<TextMessage>();
|
|
100
|
-
// sendTextMessage takes message as positional, not named (verified cometchat_ui_kit.dart:357).
|
|
101
|
-
CometChatUIKit.sendTextMessage(message, onSuccess: completer.complete, onError: completer.completeError);
|
|
102
|
-
return completer.future;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
Inject via your DI / GetX scope:
|
|
108
|
-
|
|
109
|
-
```dart
|
|
110
|
-
final cometchatService = Get.put<CometChatService>(CometChatServiceImpl());
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
In tests, swap with a mock:
|
|
114
|
-
|
|
115
|
-
```dart
|
|
116
|
-
class MockCometChatService extends Mock implements CometChatService {}
|
|
117
|
-
|
|
118
|
-
setUp(() {
|
|
119
|
-
Get.reset();
|
|
120
|
-
final mock = MockCometChatService();
|
|
121
|
-
when(() => mock.init()).thenAnswer((_) async {});
|
|
122
|
-
when(() => mock.login(any())).thenAnswer((_) async => testUser);
|
|
123
|
-
Get.put<CometChatService>(mock);
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
tearDown(() {
|
|
127
|
-
Get.reset();
|
|
128
|
-
});
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
**`Get.reset()`** between tests is critical — GetX's singleton container persists across tests otherwise.
|
|
132
|
-
|
|
133
|
-
---
|
|
134
|
-
|
|
135
|
-
## 3. Widget tests
|
|
136
|
-
|
|
137
|
-
```dart
|
|
138
|
-
import 'package:flutter/material.dart';
|
|
139
|
-
import 'package:flutter_test/flutter_test.dart';
|
|
140
|
-
import 'package:mocktail/mocktail.dart';
|
|
141
|
-
import 'package:get/get.dart';
|
|
142
|
-
import 'package:your_app/screens/chat_screen.dart';
|
|
143
|
-
import 'package:your_app/services/cometchat_service.dart';
|
|
144
|
-
|
|
145
|
-
class MockCometChatService extends Mock implements CometChatService {}
|
|
146
|
-
|
|
147
|
-
void main() {
|
|
148
|
-
late MockCometChatService mock;
|
|
149
|
-
|
|
150
|
-
setUp(() {
|
|
151
|
-
Get.reset();
|
|
152
|
-
mock = MockCometChatService();
|
|
153
|
-
when(() => mock.init()).thenAnswer((_) async {});
|
|
154
|
-
when(() => mock.login(any())).thenAnswer((_) async => User(uid: 'cometchat-uid-1', name: 'Alice'));
|
|
155
|
-
Get.put<CometChatService>(mock);
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
tearDown(() => Get.reset());
|
|
159
|
-
|
|
160
|
-
testWidgets('shows loading until login resolves', (tester) async {
|
|
161
|
-
final loginCompleter = Completer<User>();
|
|
162
|
-
when(() => mock.login(any())).thenAnswer((_) => loginCompleter.future);
|
|
163
|
-
|
|
164
|
-
await tester.pumpWidget(MaterialApp(home: ChatScreen()));
|
|
165
|
-
await tester.pump(); // start the build
|
|
166
|
-
|
|
167
|
-
expect(find.byType(CircularProgressIndicator), findsOneWidget);
|
|
168
|
-
|
|
169
|
-
// User constructor requires both uid AND name (verified User constructor in chat-sdk-flutter).
|
|
170
|
-
loginCompleter.complete(User(uid: 'cometchat-uid-1', name: 'Alice'));
|
|
171
|
-
await tester.pumpAndSettle();
|
|
172
|
-
|
|
173
|
-
expect(find.byType(CircularProgressIndicator), findsNothing);
|
|
174
|
-
expect(find.text('Conversations'), findsOneWidget);
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
testWidgets('shows error when login fails', (tester) async {
|
|
178
|
-
when(() => mock.login(any())).thenThrow(Exception('401 Unauthorized'));
|
|
179
|
-
|
|
180
|
-
await tester.pumpWidget(MaterialApp(home: ChatScreen()));
|
|
181
|
-
await tester.pumpAndSettle();
|
|
182
|
-
|
|
183
|
-
expect(find.textContaining('Unauthorized'), findsOneWidget);
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
`pumpAndSettle()` waits for animations + Futures to complete.
|
|
189
|
-
|
|
190
|
-
---
|
|
191
|
-
|
|
192
|
-
## 4. Mocking CometChat widgets that ship with the kit
|
|
193
|
-
|
|
194
|
-
`CometChatConversations`, `CometChatMessageList`, etc. are real widgets that try to render against a real SDK during tests. Two strategies:
|
|
195
|
-
|
|
196
|
-
### Strategy A — Replace at the import level
|
|
197
|
-
|
|
198
|
-
If your widget composition is small (3-5 CometChat widgets), make them swappable:
|
|
199
|
-
|
|
200
|
-
```dart
|
|
201
|
-
// chat_screen.dart
|
|
202
|
-
class ChatScreen extends StatelessWidget {
|
|
203
|
-
final WidgetBuilder conversationsBuilder;
|
|
204
|
-
|
|
205
|
-
const ChatScreen({this.conversationsBuilder = _defaultConversations});
|
|
206
|
-
|
|
207
|
-
static Widget _defaultConversations(BuildContext context) =>
|
|
208
|
-
const CometChatConversations();
|
|
209
|
-
|
|
210
|
-
@override
|
|
211
|
-
Widget build(BuildContext context) => Scaffold(body: conversationsBuilder(context));
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// In tests:
|
|
215
|
-
testWidgets('chat screen renders', (tester) async {
|
|
216
|
-
await tester.pumpWidget(MaterialApp(
|
|
217
|
-
home: ChatScreen(conversationsBuilder: (_) => const Text('mock convo list')),
|
|
218
|
-
));
|
|
219
|
-
expect(find.text('mock convo list'), findsOneWidget);
|
|
220
|
-
});
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
### Strategy B — Skip widget tests, focus on service tests
|
|
224
|
-
|
|
225
|
-
For larger compositions, test the service layer (which is fully mockable) and rely on integration tests for widget assertions. Pragmatic for v5 because the kit's widgets aren't designed for unit testing.
|
|
226
|
-
|
|
227
|
-
---
|
|
228
|
-
|
|
229
|
-
## 5. Integration tests
|
|
230
|
-
|
|
231
|
-
```dart
|
|
232
|
-
// integration_test/chat_test.dart
|
|
233
|
-
import 'package:flutter/material.dart';
|
|
234
|
-
import 'package:flutter_test/flutter_test.dart';
|
|
235
|
-
import 'package:integration_test/integration_test.dart';
|
|
236
|
-
import 'package:your_app/main.dart' as app;
|
|
237
|
-
|
|
238
|
-
void main() {
|
|
239
|
-
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
|
|
240
|
-
|
|
241
|
-
testWidgets('login and see conversations', (tester) async {
|
|
242
|
-
app.main();
|
|
243
|
-
await tester.pumpAndSettle(Duration(seconds: 10)); // generous for real SDK init
|
|
244
|
-
|
|
245
|
-
expect(find.text('Welcome'), findsOneWidget);
|
|
246
|
-
|
|
247
|
-
await tester.tap(find.text('Messages'));
|
|
248
|
-
await tester.pumpAndSettle();
|
|
249
|
-
|
|
250
|
-
// Real SDK + real test app: assert that at least one conversation exists
|
|
251
|
-
// (cometchat-uid-1 has pre-seeded conversations with uid-2..5)
|
|
252
|
-
expect(find.byType(ListTile), findsAtLeastNWidgets(1));
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
Run on a real device or simulator:
|
|
258
|
-
|
|
259
|
-
```bash
|
|
260
|
-
flutter test integration_test/chat_test.dart
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
For CI:
|
|
264
|
-
|
|
265
|
-
```bash
|
|
266
|
-
flutter test integration_test/chat_test.dart --device-id=emulator-5554
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
---
|
|
270
|
-
|
|
271
|
-
## 6. Golden tests
|
|
272
|
-
|
|
273
|
-
```dart
|
|
274
|
-
testWidgets('chat bubble renders correctly in light theme', (tester) async {
|
|
275
|
-
await tester.pumpWidget(MaterialApp(
|
|
276
|
-
theme: ThemeData.light(),
|
|
277
|
-
home: Scaffold(
|
|
278
|
-
body: ChatBubble(
|
|
279
|
-
// TextMessage requires: text, receiverUid, type, receiverType + sender (User object).
|
|
280
|
-
// senderUid is NOT a TextMessage constructor param — set via sender (User).
|
|
281
|
-
message: TextMessage(
|
|
282
|
-
text: 'Hello',
|
|
283
|
-
receiverUid: 'bob',
|
|
284
|
-
type: 'text',
|
|
285
|
-
receiverType: 'user',
|
|
286
|
-
sender: User(uid: 'alice', name: 'Alice'),
|
|
287
|
-
),
|
|
288
|
-
),
|
|
289
|
-
),
|
|
290
|
-
));
|
|
291
|
-
|
|
292
|
-
await expectLater(
|
|
293
|
-
find.byType(ChatBubble),
|
|
294
|
-
matchesGoldenFile('goldens/chat_bubble_light.png'),
|
|
295
|
-
);
|
|
296
|
-
});
|
|
297
|
-
```
|
|
298
|
-
|
|
299
|
-
First run:
|
|
300
|
-
|
|
301
|
-
```bash
|
|
302
|
-
flutter test --update-goldens
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
Commit the `goldens/` folder. Subsequent runs assert against it.
|
|
306
|
-
|
|
307
|
-
**Gotcha:** golden tests are pixel-perfect; small rendering differences between Flutter versions / OS versions cause failures. Pin Flutter SDK version in CI.
|
|
308
|
-
|
|
309
|
-
---
|
|
310
|
-
|
|
311
|
-
## 7. CI configuration
|
|
312
|
-
|
|
313
|
-
### GitHub Actions
|
|
314
|
-
|
|
315
|
-
```yaml
|
|
316
|
-
name: tests
|
|
317
|
-
on: [push, pull_request]
|
|
318
|
-
|
|
319
|
-
jobs:
|
|
320
|
-
test:
|
|
321
|
-
runs-on: ubuntu-latest
|
|
322
|
-
steps:
|
|
323
|
-
- uses: actions/checkout@v4
|
|
324
|
-
- uses: subosito/flutter-action@v2
|
|
325
|
-
with: { flutter-version: 3.16.0, channel: stable }
|
|
326
|
-
- run: flutter pub get
|
|
327
|
-
- run: flutter test
|
|
328
|
-
env:
|
|
329
|
-
COMETCHAT_TEST_APP_ID: ${{ secrets.TEST_COMETCHAT_APP_ID }}
|
|
330
|
-
COMETCHAT_TEST_REGION: ${{ secrets.TEST_COMETCHAT_REGION }}
|
|
331
|
-
COMETCHAT_TEST_AUTH_KEY: ${{ secrets.TEST_COMETCHAT_AUTH_KEY }}
|
|
332
|
-
|
|
333
|
-
integration:
|
|
334
|
-
runs-on: macos-13
|
|
335
|
-
needs: test
|
|
336
|
-
steps:
|
|
337
|
-
- uses: actions/checkout@v4
|
|
338
|
-
- uses: subosito/flutter-action@v2
|
|
339
|
-
with: { flutter-version: 3.16.0, channel: stable }
|
|
340
|
-
- uses: futureware-tech/simulator-action@v3
|
|
341
|
-
with: { model: "iPhone 15", os: iOS, os_version: "17.0" }
|
|
342
|
-
- run: flutter pub get
|
|
343
|
-
- run: |
|
|
344
|
-
flutter test integration_test/chat_test.dart \
|
|
345
|
-
--dart-define=COMETCHAT_APP_ID=${{ secrets.TEST_COMETCHAT_APP_ID }} \
|
|
346
|
-
--dart-define=COMETCHAT_REGION=${{ secrets.TEST_COMETCHAT_REGION }} \
|
|
347
|
-
--dart-define=COMETCHAT_AUTH_KEY=${{ secrets.TEST_COMETCHAT_AUTH_KEY }}
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
### Codemagic
|
|
351
|
-
|
|
352
|
-
Codemagic is Flutter-native. Add a workflow:
|
|
353
|
-
|
|
354
|
-
```yaml
|
|
355
|
-
workflows:
|
|
356
|
-
test:
|
|
357
|
-
name: Flutter tests
|
|
358
|
-
instance_type: mac_mini_m1
|
|
359
|
-
scripts:
|
|
360
|
-
- name: Get dependencies
|
|
361
|
-
script: flutter pub get
|
|
362
|
-
- name: Run tests
|
|
363
|
-
script: flutter test
|
|
364
|
-
- name: Run integration tests
|
|
365
|
-
script: |
|
|
366
|
-
flutter test integration_test/chat_test.dart \
|
|
367
|
-
--dart-define=COMETCHAT_APP_ID=$COMETCHAT_APP_ID \
|
|
368
|
-
...
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
Codemagic's env vars come from the project settings UI.
|
|
372
|
-
|
|
373
|
-
---
|
|
374
|
-
|
|
375
|
-
## 8. Anti-patterns
|
|
376
|
-
|
|
377
|
-
1. **Skipping `Get.reset()`** between tests. GetX singletons persist across tests; "test 2 inherits test 1's state" flakes are common.
|
|
378
|
-
2. **Awaiting `pumpAndSettle()` with no timeout.** Real SDK calls can hang; tests timeout after 30s with no useful error. Pass `Duration(seconds: 10)` explicitly.
|
|
379
|
-
3. **Using `mocktail` without registering all dependencies.** `Get.put` requires every injected service; partial mocks crash with "not registered."
|
|
380
|
-
4. **Hardcoding the Auth Key in test files.** Use `--dart-define` flags. Same rule as production.
|
|
381
|
-
5. **Goldens that depend on system fonts.** They render differently on macOS vs Linux CI. Use `Roboto` (Material default) and pin Flutter SDK version.
|
|
382
|
-
6. **Real WebSocket calls in unit tests.** The CometChat SDK opens a WebSocket on init; if you call real `init` in a unit test, the test slows to seconds and may flake. Mock the service.
|
|
383
|
-
|
|
384
|
-
## 9. Verification checklist
|
|
385
|
-
|
|
386
|
-
- [ ] `CometChatService` abstraction (or similar) wrapping the SDK
|
|
387
|
-
- [ ] `MockCometChatService` in test setup; `Get.put<CometChatService>(mock)` per test
|
|
388
|
-
- [ ] `Get.reset()` in tearDown
|
|
389
|
-
- [ ] At least one widget test for "loading state until login resolves"
|
|
390
|
-
- [ ] At least one widget test for "error UI on init/login failure"
|
|
391
|
-
- [ ] Golden tests for at least one chat surface (light + dark theme)
|
|
392
|
-
- [ ] Integration test in `integration_test/` for the login + see conversations flow
|
|
393
|
-
- [ ] CI separates unit + integration; uses dedicated CometChat test app via `--dart-define`
|
|
394
|
-
- [ ] Flutter SDK version pinned in CI (no "channel: stable" alone)
|
|
395
|
-
|
|
396
|
-
## 10. Pointers
|
|
397
|
-
|
|
398
|
-
- `cometchat-flutter-v5-core` — UIKitSettingsBuilder, init/login order
|
|
399
|
-
- `cometchat-flutter-v5-events` — listener subscription patterns
|
|
400
|
-
- `cometchat-flutter-v5-troubleshooting` — when tests pass but production breaks
|
|
401
|
-
- `cometchat-flutter-v6-testing` — V6 patterns (Bloc-based; different)
|