@cometchat/skills 4.4.1 → 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.
Files changed (489) hide show
  1. package/.claude-plugin/marketplace.json +55 -0
  2. package/.claude-plugin/plugin.json +14 -0
  3. package/CHANGELOG.md +36 -0
  4. package/README.md +41 -163
  5. package/RULES.md +114 -0
  6. package/bin/cometchat-skills.mjs +1180 -0
  7. package/bin/legacy-skills.json +95 -0
  8. package/catalogs/android-v6.json +1646 -0
  9. package/catalogs/flutter-v6.json +651 -0
  10. package/catalogs/ios-v5.json +1383 -0
  11. package/catalogs/rn-calls-v5.json +134 -0
  12. package/catalogs/rn-calls-v5.symbols.txt +58 -0
  13. package/catalogs/rn-sdk-v4.json +672 -0
  14. package/catalogs/rn-v5.json +449 -0
  15. package/catalogs/rn-v5.symbols.txt +216 -0
  16. package/catalogs/sdk-android-v5.json +514 -0
  17. package/contracts.android-calls-v5.json +122 -0
  18. package/contracts.android-v6.json +135 -0
  19. package/contracts.angular-v5.json +694 -0
  20. package/contracts.flutter-calls-v5.json +77 -0
  21. package/contracts.flutter-v6.json +126 -0
  22. package/contracts.ios-calls-v5.json +67 -0
  23. package/contracts.ios-v5.json +436 -0
  24. package/contracts.json +82 -0
  25. package/contracts.rn-calls-v5.json +77 -0
  26. package/contracts.rn-v5.json +727 -0
  27. package/contracts.sdk-android-v5.json +15 -0
  28. package/contracts.web-calls-v5.json +45 -0
  29. package/features.android-calls-v5.json +246 -0
  30. package/features.android-v6.json +65 -0
  31. package/features.angular-v5.json +521 -0
  32. package/features.flutter-calls-v5.json +286 -0
  33. package/features.flutter-v6.json +484 -0
  34. package/features.ios-calls-v5.json +236 -0
  35. package/features.ios-v5.json +573 -0
  36. package/features.json +61 -0
  37. package/features.rn-calls-v5.json +187 -0
  38. package/features.rn-v5.json +614 -0
  39. package/features.sdk-android-v5.json +40 -0
  40. package/features.sdk-jsv4.json +24 -0
  41. package/features.web-calls-v5.json +108 -0
  42. package/package.json +151 -74
  43. package/peers.yaml +312 -0
  44. package/registry/README.md +31 -0
  45. package/registry/android-calls-v5.json +54 -0
  46. package/registry/android-v6.json +137 -0
  47. package/registry/angular-v5.json +114 -0
  48. package/registry/flutter-calls-v5.json +54 -0
  49. package/registry/flutter-v6.json +119 -0
  50. package/registry/ios-calls-v5.json +59 -0
  51. package/registry/ios-v5.json +97 -0
  52. package/registry/rn-calls-v5.json +59 -0
  53. package/registry/rn-v5.json +129 -0
  54. package/registry/sdk-android-v5.json +53 -0
  55. package/registry/sdk-jsv4.json +53 -0
  56. package/registry/web-calls-v5.json +54 -0
  57. package/registry/web-v7.json +99 -0
  58. package/skills/cometchat/SKILL.md +42 -2096
  59. package/skills/cometchat-android-v5-calls-sdk/SKILL.md +206 -0
  60. package/skills/cometchat-android-v5-calls-sdk/references/build-truth.md +63 -0
  61. package/skills/cometchat-android-v5-calls-sdk/references/docs-map.md +119 -0
  62. package/skills/cometchat-android-v5-calls-sdk/references/method-map.md +53 -0
  63. package/skills/cometchat-android-v5-calls-sdk/references/pitfalls.md +72 -0
  64. package/skills/cometchat-android-v5-calls-sdk/references/ringing.md +92 -0
  65. package/skills/cometchat-android-v5-calls-sdk/references/user-switch.md +90 -0
  66. package/skills/cometchat-android-v5-sdk/SKILL.md +127 -0
  67. package/skills/cometchat-android-v5-sdk/references/app-surface.md +88 -0
  68. package/skills/cometchat-android-v5-sdk/references/docs-map.md +91 -0
  69. package/skills/cometchat-android-v6-builder-settings/SKILL.md +51 -137
  70. package/skills/cometchat-android-v6-calls/SKILL.md +128 -411
  71. package/skills/cometchat-android-v6-compose-components/SKILL.md +84 -194
  72. package/skills/cometchat-android-v6-compose-customization/SKILL.md +66 -411
  73. package/skills/cometchat-android-v6-compose-placement/SKILL.md +154 -237
  74. package/skills/cometchat-android-v6-core/SKILL.md +236 -672
  75. package/skills/cometchat-android-v6-core/references/anti-patterns.md +31 -0
  76. package/skills/cometchat-android-v6-core/references/component-props.md +168 -0
  77. package/skills/cometchat-android-v6-core/references/docs-map.md +153 -0
  78. package/skills/cometchat-android-v6-core/references/layout.md +112 -0
  79. package/skills/cometchat-android-v6-core/references/lifecycle.md +75 -0
  80. package/skills/cometchat-android-v6-core/references/setup-credentials.md +105 -0
  81. package/skills/cometchat-android-v6-core/references/troubleshooting.md +36 -0
  82. package/skills/cometchat-android-v6-events/SKILL.md +46 -184
  83. package/skills/cometchat-android-v6-extensions/SKILL.md +39 -179
  84. package/skills/cometchat-android-v6-features/SKILL.md +74 -143
  85. package/skills/cometchat-android-v6-kotlin-components/SKILL.md +75 -193
  86. package/skills/cometchat-android-v6-kotlin-customization/SKILL.md +67 -419
  87. package/skills/cometchat-android-v6-kotlin-placement/SKILL.md +77 -223
  88. package/skills/cometchat-android-v6-migration/SKILL.md +67 -378
  89. package/skills/cometchat-android-v6-production/SKILL.md +40 -179
  90. package/skills/cometchat-android-v6-push/SKILL.md +39 -289
  91. package/skills/cometchat-android-v6-testing/SKILL.md +50 -265
  92. package/skills/cometchat-android-v6-troubleshooting/SKILL.md +70 -254
  93. package/skills/cometchat-angular-v5-calls/SKILL.md +193 -0
  94. package/skills/cometchat-angular-v5-components/SKILL.md +131 -0
  95. package/skills/cometchat-angular-v5-components/references/catalog.md +111 -0
  96. package/skills/cometchat-angular-v5-components/references/host-composed.md +46 -0
  97. package/skills/cometchat-angular-v5-core/SKILL.md +300 -0
  98. package/skills/cometchat-angular-v5-core/references/anti-patterns.md +49 -0
  99. package/skills/cometchat-angular-v5-core/references/component-props.md +55 -0
  100. package/skills/cometchat-angular-v5-core/references/dependencies.md +66 -0
  101. package/skills/cometchat-angular-v5-core/references/docs-map.md +132 -0
  102. package/skills/cometchat-angular-v5-core/references/layout.md +64 -0
  103. package/skills/cometchat-angular-v5-core/references/lifecycle.md +202 -0
  104. package/skills/cometchat-angular-v5-core/references/setup-credentials.md +137 -0
  105. package/skills/cometchat-angular-v5-core/references/theming.md +70 -0
  106. package/skills/cometchat-angular-v5-core/references/troubleshooting.md +27 -0
  107. package/skills/cometchat-angular-v5-customization/SKILL.md +94 -0
  108. package/skills/cometchat-angular-v5-features/SKILL.md +107 -0
  109. package/skills/cometchat-angular-v5-features/references/custom-messages.md +133 -0
  110. package/skills/cometchat-angular-v5-features/references/formatters.md +28 -0
  111. package/skills/cometchat-angular-v5-features/references/host-composed-extensions.md +85 -0
  112. package/skills/cometchat-angular-v5-migration/SKILL.md +40 -0
  113. package/skills/cometchat-angular-v5-migration/references/migration-guide.md +165 -0
  114. package/skills/cometchat-angular-v5-patterns/SKILL.md +107 -0
  115. package/skills/cometchat-angular-v5-placement/SKILL.md +133 -0
  116. package/skills/cometchat-angular-v5-placement/references/combined-app.md +174 -0
  117. package/skills/cometchat-angular-v5-placement/references/core-surface.md +199 -0
  118. package/skills/cometchat-angular-v5-production/SKILL.md +101 -0
  119. package/skills/cometchat-angular-v5-push/SKILL.md +61 -0
  120. package/skills/cometchat-angular-v5-testing/SKILL.md +112 -0
  121. package/skills/cometchat-angular-v5-troubleshooting/SKILL.md +96 -0
  122. package/skills/cometchat-flutter-v5-sdk/SKILL.md +188 -0
  123. package/skills/cometchat-flutter-v5-sdk/references/doc-corrections.md +55 -0
  124. package/skills/cometchat-flutter-v5-sdk/references/docs-map.md +211 -0
  125. package/skills/cometchat-flutter-v5-sdk/references/platform-notes.md +48 -0
  126. package/skills/cometchat-flutter-v5-sdk/references/transcription.md +87 -0
  127. package/skills/cometchat-flutter-v6-calls/SKILL.md +75 -387
  128. package/skills/cometchat-flutter-v6-components/SKILL.md +88 -361
  129. package/skills/cometchat-flutter-v6-core/SKILL.md +154 -593
  130. package/skills/cometchat-flutter-v6-core/references/anti-patterns.md +55 -0
  131. package/skills/cometchat-flutter-v6-core/references/docs-map.md +143 -0
  132. package/skills/cometchat-flutter-v6-core/references/layout.md +45 -0
  133. package/skills/cometchat-flutter-v6-core/references/lifecycle.md +87 -0
  134. package/skills/cometchat-flutter-v6-core/references/setup-credentials.md +84 -0
  135. package/skills/cometchat-flutter-v6-core/references/troubleshooting.md +26 -0
  136. package/skills/cometchat-flutter-v6-customization/SKILL.md +70 -712
  137. package/skills/cometchat-flutter-v6-events/SKILL.md +79 -174
  138. package/skills/cometchat-flutter-v6-features/SKILL.md +55 -394
  139. package/skills/cometchat-flutter-v6-migration/SKILL.md +68 -367
  140. package/skills/cometchat-flutter-v6-migration/references/migration-guide.md +131 -0
  141. package/skills/cometchat-flutter-v6-patterns/SKILL.md +61 -0
  142. package/skills/cometchat-flutter-v6-placement/SKILL.md +94 -381
  143. package/skills/cometchat-flutter-v6-production/SKILL.md +58 -615
  144. package/skills/cometchat-flutter-v6-push/SKILL.md +46 -455
  145. package/skills/cometchat-flutter-v6-testing/SKILL.md +68 -299
  146. package/skills/cometchat-flutter-v6-troubleshooting/SKILL.md +54 -878
  147. package/skills/cometchat-ios-calls/SKILL.md +105 -511
  148. package/skills/cometchat-ios-components/SKILL.md +44 -834
  149. package/skills/cometchat-ios-core/SKILL.md +181 -1068
  150. package/skills/cometchat-ios-core/references/anti-patterns.md +80 -0
  151. package/skills/cometchat-ios-core/references/docs-map.md +123 -0
  152. package/skills/cometchat-ios-core/references/install.md +23 -0
  153. package/skills/cometchat-ios-core/references/layout.md +186 -0
  154. package/skills/cometchat-ios-core/references/setup-credentials.md +197 -0
  155. package/skills/cometchat-ios-core/references/swiftui.md +91 -0
  156. package/skills/cometchat-ios-core/references/troubleshooting.md +100 -0
  157. package/skills/cometchat-ios-customization/SKILL.md +33 -968
  158. package/skills/cometchat-ios-features/SKILL.md +29 -738
  159. package/skills/cometchat-ios-migration/SKILL.md +39 -0
  160. package/skills/cometchat-ios-placement/SKILL.md +51 -729
  161. package/skills/cometchat-ios-push/SKILL.md +24 -602
  162. package/skills/cometchat-ios-v5-sdk/SKILL.md +161 -0
  163. package/skills/cometchat-ios-v5-sdk/references/docs-map.md +326 -0
  164. package/skills/cometchat-js-v5-sdk/SKILL.md +95 -0
  165. package/skills/cometchat-js-v5-sdk/references/docs-map.md +114 -0
  166. package/skills/cometchat-onboarding/SKILL.md +89 -0
  167. package/skills/cometchat-onboarding/references/archetypes.md +51 -0
  168. package/skills/cometchat-onboarding/references/calling-first.md +77 -0
  169. package/skills/cometchat-onboarding/references/not-in-this-pack.md +8 -0
  170. package/skills/cometchat-onboarding/references/plan-artifact.md +133 -0
  171. package/skills/cometchat-onboarding/references/platforms.md +90 -0
  172. package/skills/cometchat-react-native-bare-patterns/SKILL.md +120 -0
  173. package/skills/cometchat-react-native-calls/SKILL.md +200 -0
  174. package/skills/cometchat-react-native-components/SKILL.md +142 -0
  175. package/skills/cometchat-react-native-core/SKILL.md +313 -0
  176. package/skills/cometchat-react-native-core/references/anti-patterns.md +79 -0
  177. package/skills/cometchat-react-native-core/references/component-props.md +105 -0
  178. package/skills/cometchat-react-native-core/references/dependencies.md +62 -0
  179. package/skills/cometchat-react-native-core/references/docs-map.md +126 -0
  180. package/skills/cometchat-react-native-core/references/layout.md +61 -0
  181. package/skills/cometchat-react-native-core/references/lifecycle.md +64 -0
  182. package/skills/cometchat-react-native-core/references/setup-credentials.md +39 -0
  183. package/skills/cometchat-react-native-customization/SKILL.md +198 -0
  184. package/skills/cometchat-react-native-expo-patterns/SKILL.md +116 -0
  185. package/skills/cometchat-react-native-features/SKILL.md +122 -0
  186. package/skills/cometchat-react-native-migration/SKILL.md +103 -0
  187. package/skills/cometchat-react-native-placement/SKILL.md +158 -0
  188. package/skills/cometchat-react-native-production/SKILL.md +78 -0
  189. package/skills/cometchat-react-native-push/SKILL.md +88 -0
  190. package/skills/cometchat-react-native-sdk/SKILL.md +126 -0
  191. package/skills/cometchat-react-native-sdk/references/method-map.md +239 -0
  192. package/skills/cometchat-react-native-sdk/references/page-map.md +96 -0
  193. package/skills/cometchat-react-native-testing/SKILL.md +94 -0
  194. package/skills/cometchat-react-native-troubleshooting/SKILL.md +116 -0
  195. package/skills/cometchat-react-native-v5-sdk/SKILL.md +150 -0
  196. package/skills/cometchat-react-native-v5-sdk/references/docs-map.md +127 -0
  197. package/skills/cometchat-react-native-v5-sdk/references/ringing-voip.md +369 -0
  198. package/skills/cometchat-react-v7-calls/SKILL.md +75 -0
  199. package/skills/cometchat-react-v7-components/SKILL.md +72 -0
  200. package/skills/cometchat-react-v7-core/SKILL.md +101 -0
  201. package/skills/cometchat-react-v7-core/references/anti-patterns.md +19 -0
  202. package/skills/cometchat-react-v7-core/references/component-props.md +82 -0
  203. package/skills/cometchat-react-v7-core/references/dependencies.md +23 -0
  204. package/skills/cometchat-react-v7-core/references/docs-map.md +117 -0
  205. package/skills/cometchat-react-v7-core/references/i18n-rtl-a11y.md +22 -0
  206. package/skills/cometchat-react-v7-core/references/layout.md +158 -0
  207. package/skills/cometchat-react-v7-core/references/lifecycle.md +74 -0
  208. package/skills/cometchat-react-v7-core/references/setup-credentials.md +58 -0
  209. package/skills/cometchat-react-v7-core/references/ssr.md +11 -0
  210. package/skills/cometchat-react-v7-core/references/theming.md +52 -0
  211. package/skills/cometchat-react-v7-core/references/troubleshooting.md +28 -0
  212. package/skills/cometchat-react-v7-customization/SKILL.md +84 -0
  213. package/skills/cometchat-react-v7-features/SKILL.md +92 -0
  214. package/skills/cometchat-react-v7-migration/SKILL.md +39 -0
  215. package/skills/cometchat-react-v7-migration/references/migration-guide.md +119 -0
  216. package/skills/cometchat-react-v7-patterns/SKILL.md +43 -0
  217. package/skills/cometchat-react-v7-placement/SKILL.md +106 -0
  218. package/skills/cometchat-react-v7-placement/references/recipes.md +354 -0
  219. package/skills/cometchat-react-v7-push/SKILL.md +53 -0
  220. package/test-suite/README.md +70 -0
  221. package/test-suite/catalogs/android-calls-v5.json +830 -0
  222. package/test-suite/catalogs/android-calls-v5.symbols.txt +499 -0
  223. package/test-suite/catalogs/android-v6.json +1646 -0
  224. package/test-suite/catalogs/android-v6.symbols.txt +298 -0
  225. package/test-suite/catalogs/angular-v5.json +7587 -0
  226. package/test-suite/catalogs/flutter-calls-v5.json +196 -0
  227. package/test-suite/catalogs/flutter-calls-v5.symbols.txt +59 -0
  228. package/test-suite/catalogs/flutter-v6.json +651 -0
  229. package/test-suite/catalogs/ios-calls-v5.json +158 -0
  230. package/test-suite/catalogs/ios-calls-v5.symbols.txt +70 -0
  231. package/test-suite/catalogs/ios-v5.json +1383 -0
  232. package/test-suite/catalogs/ios-v5.symbols.txt +699 -0
  233. package/test-suite/catalogs/rn-calls-v5.json +134 -0
  234. package/test-suite/catalogs/rn-sdk-v4.json +672 -0
  235. package/test-suite/catalogs/rn-v5.json +449 -0
  236. package/test-suite/catalogs/sdk-android-v5.json +514 -0
  237. package/test-suite/catalogs/sdk-android-v5.symbols.txt +254 -0
  238. package/test-suite/catalogs/sdk-jsv4.json +800 -0
  239. package/test-suite/catalogs/web-calls-v5.json +195 -0
  240. package/test-suite/catalogs/web-v7.json +1243 -0
  241. package/test-suite/scripts/build-registry.mjs +113 -0
  242. package/test-suite/scripts/catalog-refresh-dart.mjs +151 -0
  243. package/test-suite/scripts/catalog-refresh.mjs +100 -0
  244. package/test-suite/scripts/lint-skills.mjs +909 -0
  245. package/test-suite/scripts/measure-tokens.mjs +169 -0
  246. package/test-suite/scripts/typecheck-fences-dart.mjs +437 -0
  247. package/test-suite/scripts/typecheck-fences-kotlin.mjs +269 -0
  248. package/test-suite/scripts/typecheck-fences.mjs +206 -0
  249. package/test-suite/scripts/verify-catalog.mjs +242 -0
  250. package/test-suite/scripts/verify-contract-fences.mjs +94 -0
  251. package/test-suite/scripts/verify-detection.mjs +178 -0
  252. package/test-suite/scripts/verify-docs-base.mjs +91 -0
  253. package/test-suite/scripts/verify-family-agnostic.mjs +130 -0
  254. package/test-suite/scripts/verify-golden-path.mjs +138 -0
  255. package/test-suite/scripts/verify-oracle-components.mjs +133 -0
  256. package/test-suite/scripts/verify-template-bindings.mjs +148 -0
  257. package/test-suite/typecheck/angular-v5/package.json +21 -0
  258. package/test-suite/typecheck/angular-v5/tsconfig.json +21 -0
  259. package/test-suite/typecheck/flutter-v6/analysis_options.yaml +25 -0
  260. package/test-suite/typecheck/flutter-v6/pubspec.yaml +21 -0
  261. package/test-suite/typecheck/web-v7/package.json +18 -0
  262. package/test-suite/typecheck/web-v7/tsconfig.json +19 -0
  263. package/bin/install.js +0 -1003
  264. package/skills/.claude-plugin/marketplace.json +0 -86
  265. package/skills/cometchat/references/asking-questions.md +0 -48
  266. package/skills/cometchat-a11y/SKILL.md +0 -477
  267. package/skills/cometchat-android-v5/SKILL.md +0 -121
  268. package/skills/cometchat-android-v5-calls/SKILL.md +0 -427
  269. package/skills/cometchat-android-v5-calls/references/README.md +0 -53
  270. package/skills/cometchat-android-v5-calls/references/add-calls-to-existing-chat.md +0 -197
  271. package/skills/cometchat-android-v5-calls/references/audio-controls.md +0 -91
  272. package/skills/cometchat-android-v5-calls/references/background-handling.md +0 -168
  273. package/skills/cometchat-android-v5-calls/references/call-layouts.md +0 -131
  274. package/skills/cometchat-android-v5-calls/references/call-logs.md +0 -113
  275. package/skills/cometchat-android-v5-calls/references/call-session.md +0 -274
  276. package/skills/cometchat-android-v5-calls/references/custom-ui.md +0 -150
  277. package/skills/cometchat-android-v5-calls/references/event-listeners.md +0 -123
  278. package/skills/cometchat-android-v5-calls/references/group-calls.md +0 -205
  279. package/skills/cometchat-android-v5-calls/references/idle-timeout.md +0 -117
  280. package/skills/cometchat-android-v5-calls/references/in-call-chat.md +0 -134
  281. package/skills/cometchat-android-v5-calls/references/join-session.md +0 -120
  282. package/skills/cometchat-android-v5-calls/references/migration-v4-to-v5.md +0 -222
  283. package/skills/cometchat-android-v5-calls/references/participant-management.md +0 -110
  284. package/skills/cometchat-android-v5-calls/references/picture-in-picture.md +0 -106
  285. package/skills/cometchat-android-v5-calls/references/raise-hand.md +0 -248
  286. package/skills/cometchat-android-v5-calls/references/recording.md +0 -101
  287. package/skills/cometchat-android-v5-calls/references/ringing-integration.md +0 -152
  288. package/skills/cometchat-android-v5-calls/references/screen-sharing.md +0 -78
  289. package/skills/cometchat-android-v5-calls/references/server-fcm-voip.md +0 -215
  290. package/skills/cometchat-android-v5-calls/references/session-settings.md +0 -121
  291. package/skills/cometchat-android-v5-calls/references/setup.md +0 -137
  292. package/skills/cometchat-android-v5-calls/references/share-invite.md +0 -156
  293. package/skills/cometchat-android-v5-calls/references/video-controls.md +0 -87
  294. package/skills/cometchat-android-v5-calls/references/voip-calling.md +0 -526
  295. package/skills/cometchat-android-v5-components/SKILL.md +0 -431
  296. package/skills/cometchat-android-v5-core/SKILL.md +0 -486
  297. package/skills/cometchat-android-v5-customization/SKILL.md +0 -469
  298. package/skills/cometchat-android-v5-extensions/SKILL.md +0 -127
  299. package/skills/cometchat-android-v5-features/SKILL.md +0 -131
  300. package/skills/cometchat-android-v5-placement/SKILL.md +0 -277
  301. package/skills/cometchat-android-v5-production/SKILL.md +0 -95
  302. package/skills/cometchat-android-v5-push/SKILL.md +0 -619
  303. package/skills/cometchat-android-v5-testing/SKILL.md +0 -188
  304. package/skills/cometchat-android-v5-theming/SKILL.md +0 -167
  305. package/skills/cometchat-android-v5-troubleshooting/SKILL.md +0 -74
  306. package/skills/cometchat-android-v6/SKILL.md +0 -108
  307. package/skills/cometchat-android-v6-calls/references/add-calls-to-existing-chat.md +0 -97
  308. package/skills/cometchat-android-v6-calls/references/advanced-features.md +0 -87
  309. package/skills/cometchat-android-v6-calls/references/call-layouts.md +0 -100
  310. package/skills/cometchat-android-v6-calls/references/call-session.md +0 -163
  311. package/skills/cometchat-android-v6-calls/references/device-management.md +0 -172
  312. package/skills/cometchat-android-v6-calls/references/group-calls.md +0 -191
  313. package/skills/cometchat-android-v6-calls/references/idle-timeout.md +0 -110
  314. package/skills/cometchat-android-v6-calls/references/in-call-chat.md +0 -141
  315. package/skills/cometchat-android-v6-calls/references/raise-hand.md +0 -188
  316. package/skills/cometchat-android-v6-calls/references/ringing-integration.md +0 -176
  317. package/skills/cometchat-android-v6-calls/references/server-fcm-voip.md +0 -127
  318. package/skills/cometchat-android-v6-calls/references/share-invite.md +0 -105
  319. package/skills/cometchat-android-v6-compose-theming/SKILL.md +0 -250
  320. package/skills/cometchat-android-v6-kotlin-theming/SKILL.md +0 -233
  321. package/skills/cometchat-angular-calls/SKILL.md +0 -378
  322. package/skills/cometchat-angular-calls/references/add-calls-to-existing-chat.md +0 -96
  323. package/skills/cometchat-angular-calls/references/call-layouts.md +0 -123
  324. package/skills/cometchat-angular-calls/references/call-session.md +0 -167
  325. package/skills/cometchat-angular-calls/references/custom-ui.md +0 -239
  326. package/skills/cometchat-angular-calls/references/device-management.md +0 -154
  327. package/skills/cometchat-angular-calls/references/group-calls.md +0 -433
  328. package/skills/cometchat-angular-calls/references/idle-timeout.md +0 -161
  329. package/skills/cometchat-angular-calls/references/in-call-chat.md +0 -148
  330. package/skills/cometchat-angular-calls/references/lazy-loading-pitfalls.md +0 -205
  331. package/skills/cometchat-angular-calls/references/migration-v4-to-v5.md +0 -53
  332. package/skills/cometchat-angular-calls/references/ngzone-and-async-callbacks.md +0 -184
  333. package/skills/cometchat-angular-calls/references/picture-in-picture.md +0 -285
  334. package/skills/cometchat-angular-calls/references/raise-hand.md +0 -172
  335. package/skills/cometchat-angular-calls/references/recording-screen-share.md +0 -260
  336. package/skills/cometchat-angular-calls/references/ringing-integration.md +0 -133
  337. package/skills/cometchat-angular-calls/references/server-web-push-vapid.md +0 -100
  338. package/skills/cometchat-angular-calls/references/share-invite.md +0 -122
  339. package/skills/cometchat-angular-calls/references/virtual-background.md +0 -29
  340. package/skills/cometchat-angular-components/SKILL.md +0 -235
  341. package/skills/cometchat-angular-core/SKILL.md +0 -386
  342. package/skills/cometchat-angular-customization/SKILL.md +0 -616
  343. package/skills/cometchat-angular-features/SKILL.md +0 -329
  344. package/skills/cometchat-angular-patterns/SKILL.md +0 -256
  345. package/skills/cometchat-angular-placement/SKILL.md +0 -314
  346. package/skills/cometchat-angular-production/SKILL.md +0 -564
  347. package/skills/cometchat-angular-push/SKILL.md +0 -389
  348. package/skills/cometchat-angular-testing/SKILL.md +0 -605
  349. package/skills/cometchat-angular-theming/SKILL.md +0 -290
  350. package/skills/cometchat-angular-troubleshooting/SKILL.md +0 -364
  351. package/skills/cometchat-astro-patterns/SKILL.md +0 -708
  352. package/skills/cometchat-calls/SKILL.md +0 -364
  353. package/skills/cometchat-calls/references/use-case-broadcast.md +0 -199
  354. package/skills/cometchat-calls/references/use-case-marketplace.md +0 -157
  355. package/skills/cometchat-calls/references/use-case-support.md +0 -189
  356. package/skills/cometchat-calls/references/use-case-team.md +0 -180
  357. package/skills/cometchat-calls/references/use-case-telehealth.md +0 -153
  358. package/skills/cometchat-components/SKILL.md +0 -1142
  359. package/skills/cometchat-core/SKILL.md +0 -1048
  360. package/skills/cometchat-customization/SKILL.md +0 -580
  361. package/skills/cometchat-customization/references/component-catalog.md +0 -236
  362. package/skills/cometchat-features/SKILL.md +0 -861
  363. package/skills/cometchat-flutter-v5/SKILL.md +0 -173
  364. package/skills/cometchat-flutter-v5-calls/SKILL.md +0 -453
  365. package/skills/cometchat-flutter-v5-calls/references/add-calls-to-existing-chat.md +0 -193
  366. package/skills/cometchat-flutter-v5-calls/references/call-layouts.md +0 -103
  367. package/skills/cometchat-flutter-v5-calls/references/call-session.md +0 -285
  368. package/skills/cometchat-flutter-v5-calls/references/device-management.md +0 -124
  369. package/skills/cometchat-flutter-v5-calls/references/group-calls.md +0 -181
  370. package/skills/cometchat-flutter-v5-calls/references/idle-timeout.md +0 -99
  371. package/skills/cometchat-flutter-v5-calls/references/in-call-chat.md +0 -135
  372. package/skills/cometchat-flutter-v5-calls/references/migration-v4-to-v5.md +0 -210
  373. package/skills/cometchat-flutter-v5-calls/references/raise-hand.md +0 -255
  374. package/skills/cometchat-flutter-v5-calls/references/ringing-integration.md +0 -196
  375. package/skills/cometchat-flutter-v5-calls/references/server-push-bridge.md +0 -101
  376. package/skills/cometchat-flutter-v5-calls/references/share-invite.md +0 -148
  377. package/skills/cometchat-flutter-v5-conversations/SKILL.md +0 -118
  378. package/skills/cometchat-flutter-v5-core/SKILL.md +0 -239
  379. package/skills/cometchat-flutter-v5-customization/SKILL.md +0 -358
  380. package/skills/cometchat-flutter-v5-events/SKILL.md +0 -156
  381. package/skills/cometchat-flutter-v5-messages/SKILL.md +0 -259
  382. package/skills/cometchat-flutter-v5-production/SKILL.md +0 -216
  383. package/skills/cometchat-flutter-v5-push/SKILL.md +0 -285
  384. package/skills/cometchat-flutter-v5-testing/SKILL.md +0 -401
  385. package/skills/cometchat-flutter-v5-theming/SKILL.md +0 -161
  386. package/skills/cometchat-flutter-v5-troubleshooting/SKILL.md +0 -130
  387. package/skills/cometchat-flutter-v5-users-groups/SKILL.md +0 -152
  388. package/skills/cometchat-flutter-v6/SKILL.md +0 -446
  389. package/skills/cometchat-flutter-v6-calls/references/add-calls-to-existing-chat.md +0 -136
  390. package/skills/cometchat-flutter-v6-calls/references/advanced-features.md +0 -89
  391. package/skills/cometchat-flutter-v6-calls/references/call-layouts.md +0 -105
  392. package/skills/cometchat-flutter-v6-calls/references/call-session.md +0 -229
  393. package/skills/cometchat-flutter-v6-calls/references/device-management.md +0 -105
  394. package/skills/cometchat-flutter-v6-calls/references/group-calls.md +0 -190
  395. package/skills/cometchat-flutter-v6-calls/references/idle-timeout.md +0 -88
  396. package/skills/cometchat-flutter-v6-calls/references/in-call-chat.md +0 -125
  397. package/skills/cometchat-flutter-v6-calls/references/raise-hand.md +0 -275
  398. package/skills/cometchat-flutter-v6-calls/references/ringing-integration.md +0 -171
  399. package/skills/cometchat-flutter-v6-calls/references/server-push-bridge.md +0 -93
  400. package/skills/cometchat-flutter-v6-calls/references/share-invite.md +0 -102
  401. package/skills/cometchat-flutter-v6-conversations/SKILL.md +0 -238
  402. package/skills/cometchat-flutter-v6-messages/SKILL.md +0 -384
  403. package/skills/cometchat-flutter-v6-theming/SKILL.md +0 -293
  404. package/skills/cometchat-flutter-v6-users-groups/SKILL.md +0 -224
  405. package/skills/cometchat-i18n/SKILL.md +0 -419
  406. package/skills/cometchat-ios/SKILL.md +0 -325
  407. package/skills/cometchat-ios-calls/references/add-calls-to-existing-chat.md +0 -174
  408. package/skills/cometchat-ios-calls/references/audio-modes-and-controls.md +0 -45
  409. package/skills/cometchat-ios-calls/references/avaudiosession-routing.md +0 -188
  410. package/skills/cometchat-ios-calls/references/call-layouts.md +0 -76
  411. package/skills/cometchat-ios-calls/references/call-session.md +0 -218
  412. package/skills/cometchat-ios-calls/references/callkit-and-pushkit.md +0 -357
  413. package/skills/cometchat-ios-calls/references/custom-ui.md +0 -322
  414. package/skills/cometchat-ios-calls/references/device-management.md +0 -171
  415. package/skills/cometchat-ios-calls/references/group-calls.md +0 -359
  416. package/skills/cometchat-ios-calls/references/idle-timeout.md +0 -184
  417. package/skills/cometchat-ios-calls/references/in-call-chat.md +0 -179
  418. package/skills/cometchat-ios-calls/references/migration-v4-to-v5.md +0 -196
  419. package/skills/cometchat-ios-calls/references/picture-in-picture.md +0 -246
  420. package/skills/cometchat-ios-calls/references/raise-hand.md +0 -26
  421. package/skills/cometchat-ios-calls/references/recording-screen-share.md +0 -252
  422. package/skills/cometchat-ios-calls/references/ringing-integration.md +0 -143
  423. package/skills/cometchat-ios-calls/references/server-apns-pushkit.md +0 -267
  424. package/skills/cometchat-ios-calls/references/share-invite.md +0 -148
  425. package/skills/cometchat-ios-calls/references/swiftui-uikit-hosting.md +0 -246
  426. package/skills/cometchat-ios-calls/references/voip-cert-setup.md +0 -166
  427. package/skills/cometchat-ios-production/SKILL.md +0 -738
  428. package/skills/cometchat-ios-testing/SKILL.md +0 -376
  429. package/skills/cometchat-ios-theming/SKILL.md +0 -667
  430. package/skills/cometchat-ios-troubleshooting/SKILL.md +0 -1003
  431. package/skills/cometchat-native-bare-patterns/SKILL.md +0 -550
  432. package/skills/cometchat-native-calls/SKILL.md +0 -669
  433. package/skills/cometchat-native-calls/references/add-calls-to-existing-chat.md +0 -203
  434. package/skills/cometchat-native-calls/references/call-layouts.md +0 -125
  435. package/skills/cometchat-native-calls/references/call-session.md +0 -182
  436. package/skills/cometchat-native-calls/references/custom-ui.md +0 -254
  437. package/skills/cometchat-native-calls/references/device-management.md +0 -158
  438. package/skills/cometchat-native-calls/references/expo-vs-bare.md +0 -179
  439. package/skills/cometchat-native-calls/references/group-calls.md +0 -296
  440. package/skills/cometchat-native-calls/references/idle-timeout.md +0 -128
  441. package/skills/cometchat-native-calls/references/in-call-chat.md +0 -145
  442. package/skills/cometchat-native-calls/references/migration-v4-to-v5.md +0 -72
  443. package/skills/cometchat-native-calls/references/picture-in-picture.md +0 -276
  444. package/skills/cometchat-native-calls/references/raise-hand.md +0 -205
  445. package/skills/cometchat-native-calls/references/recording-screen-share.md +0 -169
  446. package/skills/cometchat-native-calls/references/ringing-integration.md +0 -118
  447. package/skills/cometchat-native-calls/references/server-push-bridge.md +0 -135
  448. package/skills/cometchat-native-calls/references/server-push-payloads.md +0 -193
  449. package/skills/cometchat-native-calls/references/share-invite.md +0 -146
  450. package/skills/cometchat-native-calls/references/voip-push-end-to-end.md +0 -319
  451. package/skills/cometchat-native-components/SKILL.md +0 -628
  452. package/skills/cometchat-native-core/SKILL.md +0 -679
  453. package/skills/cometchat-native-customization/SKILL.md +0 -716
  454. package/skills/cometchat-native-expo-patterns/SKILL.md +0 -552
  455. package/skills/cometchat-native-features/SKILL.md +0 -638
  456. package/skills/cometchat-native-placement/SKILL.md +0 -509
  457. package/skills/cometchat-native-production/SKILL.md +0 -700
  458. package/skills/cometchat-native-push/SKILL.md +0 -594
  459. package/skills/cometchat-native-testing/SKILL.md +0 -582
  460. package/skills/cometchat-native-theming/SKILL.md +0 -681
  461. package/skills/cometchat-native-troubleshooting/SKILL.md +0 -501
  462. package/skills/cometchat-nextjs-patterns/SKILL.md +0 -899
  463. package/skills/cometchat-placement/SKILL.md +0 -1360
  464. package/skills/cometchat-production/SKILL.md +0 -1027
  465. package/skills/cometchat-react-calls/SKILL.md +0 -749
  466. package/skills/cometchat-react-calls/references/add-calls-to-existing-chat.md +0 -146
  467. package/skills/cometchat-react-calls/references/call-layouts.md +0 -160
  468. package/skills/cometchat-react-calls/references/call-session.md +0 -235
  469. package/skills/cometchat-react-calls/references/custom-ui.md +0 -247
  470. package/skills/cometchat-react-calls/references/device-management.md +0 -210
  471. package/skills/cometchat-react-calls/references/group-calls.md +0 -257
  472. package/skills/cometchat-react-calls/references/idle-timeout.md +0 -188
  473. package/skills/cometchat-react-calls/references/in-call-chat.md +0 -212
  474. package/skills/cometchat-react-calls/references/migration-v4-to-v5.md +0 -170
  475. package/skills/cometchat-react-calls/references/picture-in-picture.md +0 -245
  476. package/skills/cometchat-react-calls/references/raise-hand.md +0 -238
  477. package/skills/cometchat-react-calls/references/recording-screen-share.md +0 -144
  478. package/skills/cometchat-react-calls/references/ringing-integration.md +0 -255
  479. package/skills/cometchat-react-calls/references/server-web-push-vapid.md +0 -241
  480. package/skills/cometchat-react-calls/references/share-invite.md +0 -175
  481. package/skills/cometchat-react-calls/references/testing-calls-on-web.md +0 -216
  482. package/skills/cometchat-react-calls/references/virtual-background.md +0 -32
  483. package/skills/cometchat-react-calls/references/voip-and-web-push.md +0 -165
  484. package/skills/cometchat-react-patterns/SKILL.md +0 -628
  485. package/skills/cometchat-react-push/SKILL.md +0 -634
  486. package/skills/cometchat-react-router-patterns/SKILL.md +0 -758
  487. package/skills/cometchat-react-testing/SKILL.md +0 -413
  488. package/skills/cometchat-theming/SKILL.md +0 -498
  489. package/skills/cometchat-troubleshooting/SKILL.md +0 -294
@@ -1,184 +0,0 @@
1
- # NgZone + async SDK callbacks — the Angular calls gotcha
2
-
3
- Angular's change detection runs inside `NgZone`. Callbacks that fire *outside* NgZone don't trigger change detection — UI doesn't update. The Calls SDK fires lots of callbacks from native bridges (WebRTC, browser MediaStream events), and those bridges escape the zone.
4
-
5
- If your custom call UI seems "frozen" — call ends but the screen stays — this is almost always the cause.
6
-
7
- ---
8
-
9
- ## Symptom
10
-
11
- ```ts
12
- // OngoingCallComponent
13
- ngOnInit() {
14
- CometChatCalls.joinSession(token, settings, container); // v5 canonical (startSession is a deprecated shim)
15
-
16
- // This callback is registered with the SDK, which is registered with WebRTC,
17
- // which is a native browser API outside Angular's zone
18
- callListener.onCallEnded = () => {
19
- this.callEnded = true; // ← variable updates
20
- this.cleanup(); // ← runs
21
- // BUT: change detection doesn't fire. The template doesn't re-render.
22
- // User sees: "End" button still showing, no "Call ended" message.
23
- };
24
- }
25
- ```
26
-
27
- ---
28
-
29
- ## Fix
30
-
31
- Wrap the callback body in `NgZone.run`:
32
-
33
- ```ts
34
- import { NgZone } from "@angular/core";
35
-
36
- constructor(private zone: NgZone) {}
37
-
38
- ngOnInit() {
39
- // ...
40
- callListener.onCallEnded = () => {
41
- this.zone.run(() => {
42
- this.callEnded = true;
43
- this.cleanup();
44
- });
45
- };
46
- }
47
- ```
48
-
49
- Now change detection runs after the variable updates; template re-renders.
50
-
51
- ---
52
-
53
- ## Which callbacks need NgZone.run?
54
-
55
- All Calls SDK event listeners. The kit's own components handle this internally; custom code that subscribes to the SDK directly does NOT.
56
-
57
- Conservative rule: **wrap every callback that mutates UI state** in `zone.run`.
58
-
59
- > `CometChatCalls.OngoingCallListener` is `@deprecated` in calls-sdk-javascript v5 (prefer `CometChatCalls.addEventListener(...)`); the listener pattern below still works and is shown here because this reference is about NgZone-wrapping. Note that the dominant-speaker signal is NOT a listener callback — subscribe to it via `addEventListener("onDominantSpeakerChanged", …)` (also wrap that handler in `zone.run`).
60
-
61
- ```ts
62
- const listener = new CometChatCalls.OngoingCallListener({
63
- onUserListUpdated: (userList) => {
64
- this.zone.run(() => { this.participants = userList; });
65
- },
66
- onCallEnded: () => {
67
- this.zone.run(() => { this.callEnded = true; this.cleanup(); });
68
- },
69
- onError: (err) => {
70
- this.zone.run(() => { this.errorMessage = err.message; });
71
- },
72
- });
73
-
74
- // Dominant speaker is an addEventListener event key, not a listener callback:
75
- const offSpeaker = CometChatCalls.addEventListener("onDominantSpeakerChanged", (p) => {
76
- this.zone.run(() => { this.activeSpeakerUid = p.uid; });
77
- });
78
- ```
79
-
80
- If a callback only triggers a side effect (logging, analytics) without UI changes, NgZone.run is not strictly required — but harmless.
81
-
82
- ---
83
-
84
- ## Alternative: ChangeDetectorRef.detectChanges
85
-
86
- If you want to avoid NgZone for performance reasons (zone.run is cheap but adds overhead in hot paths), use `ChangeDetectorRef.detectChanges`:
87
-
88
- ```ts
89
- import { ChangeDetectorRef } from "@angular/core";
90
-
91
- constructor(private cd: ChangeDetectorRef) {}
92
-
93
- ngOnInit() {
94
- callListener.onCallEnded = () => {
95
- this.callEnded = true;
96
- this.cleanup();
97
- this.cd.detectChanges(); // run change detection just for this component subtree
98
- };
99
- }
100
- ```
101
-
102
- Pros: scoped to the component (NgZone is global).
103
- Cons: if you have parent component bindings that depend on this state, they don't update. Use NgZone.run for cross-component state changes.
104
-
105
- For 95% of cases, NgZone.run is the right answer.
106
-
107
- ---
108
-
109
- ## Async/await inside callbacks
110
-
111
- If your callback is `async`, wrap the whole function:
112
-
113
- ```ts
114
- callListener.onCallEnded = async () => {
115
- await this.zone.run(async () => {
116
- await this.savePostCallAnalytics();
117
- this.callEnded = true;
118
- this.cleanup();
119
- });
120
- };
121
- ```
122
-
123
- Or simpler — use a plain method and let zone.js patch async automatically:
124
-
125
- ```ts
126
- callListener.onCallEnded = () => {
127
- this.zone.run(() => this.handleCallEnded());
128
- };
129
-
130
- private async handleCallEnded() {
131
- await this.savePostCallAnalytics();
132
- this.callEnded = true;
133
- this.cleanup();
134
- }
135
- ```
136
-
137
- Inside `handleCallEnded`, change detection fires automatically because zone.js patches `await`.
138
-
139
- ---
140
-
141
- ## How to detect this bug
142
-
143
- Add a debug log inside the callback. If the log fires but the UI doesn't update, you're outside zone:
144
-
145
- ```ts
146
- callListener.onCallEnded = () => {
147
- console.log("[debug] onCallEnded fired", new Date().toISOString());
148
- this.callEnded = true;
149
- };
150
- ```
151
-
152
- If "fired" appears in console but the template still shows the call as active, wrap in zone.run.
153
-
154
- ---
155
-
156
- ## OnPush change detection
157
-
158
- If your component uses `ChangeDetectionStrategy.OnPush`, NgZone.run alone isn't enough — OnPush only re-renders on `@Input` changes or explicit markForCheck. Combine:
159
-
160
- ```ts
161
- import { ChangeDetectionStrategy, ChangeDetectorRef } from "@angular/core";
162
-
163
- @Component({
164
- changeDetection: ChangeDetectionStrategy.OnPush,
165
- })
166
- export class OngoingCallComponent {
167
- constructor(private zone: NgZone, private cd: ChangeDetectorRef) {}
168
-
169
- ngOnInit() {
170
- callListener.onCallEnded = () => {
171
- this.zone.run(() => {
172
- this.callEnded = true;
173
- this.cd.markForCheck();
174
- });
175
- };
176
- }
177
- }
178
- ```
179
-
180
- ---
181
-
182
- ## When the kit fires NgZone-correctly
183
-
184
- The CometChat Angular UI Kit (`@cometchat/chat-uikit-angular`) handles this internally. If you only use `<cometchat-incoming-call>`, `<cometchat-ongoing-call>`, etc. — no manual NgZone needed. The bug only bites when you write custom subscriptions to `CometChatCalls.*` callbacks.
@@ -1,285 +0,0 @@
1
- # Picture-in-Picture on Angular
2
-
3
- Same browser APIs as React (Video PiP + Document PiP) — the SDK and underlying primitives are identical because Angular wraps the JS Calls SDK. For API-level details, browser support, and the Document PiP path, read `cometchat-react-calls/references/picture-in-picture.md` first. This reference covers Angular-specific wiring.
4
-
5
- ---
6
-
7
- ## Video PiP — Angular component pattern
8
-
9
- ```ts
10
- // components/pip-button/pip-button.component.ts
11
- @Component({
12
- selector: "app-pip-button",
13
- template: `
14
- <button (click)="togglePip()" [disabled]="!supported" *ngIf="supported">
15
- {{ inPip ? "Exit PiP" : "Enter PiP" }}
16
- </button>
17
- `,
18
- changeDetection: ChangeDetectionStrategy.OnPush,
19
- })
20
- export class PipButtonComponent implements OnInit, OnDestroy {
21
- @Input() videoRef!: ElementRef<HTMLVideoElement>;
22
- inPip = false;
23
- supported = typeof document !== "undefined" && document.pictureInPictureEnabled;
24
-
25
- private enterListener?: () => void;
26
- private leaveListener?: () => void;
27
-
28
- constructor(private zone: NgZone, private cd: ChangeDetectorRef) {}
29
-
30
- ngOnInit() {
31
- if (!this.videoRef?.nativeElement) return;
32
- const video = this.videoRef.nativeElement;
33
-
34
- this.enterListener = () => this.zone.run(() => { this.inPip = true; this.cd.markForCheck(); });
35
- this.leaveListener = () => this.zone.run(() => { this.inPip = false; this.cd.markForCheck(); });
36
-
37
- video.addEventListener("enterpictureinpicture", this.enterListener);
38
- video.addEventListener("leavepictureinpicture", this.leaveListener);
39
- }
40
-
41
- ngOnDestroy() {
42
- const video = this.videoRef?.nativeElement;
43
- if (!video) return;
44
- if (this.enterListener) video.removeEventListener("enterpictureinpicture", this.enterListener);
45
- if (this.leaveListener) video.removeEventListener("leavepictureinpicture", this.leaveListener);
46
- if (document.pictureInPictureElement) {
47
- document.exitPictureInPicture().catch(() => {});
48
- }
49
- }
50
-
51
- async togglePip() {
52
- if (!this.videoRef?.nativeElement) return;
53
- if (this.inPip) {
54
- await document.exitPictureInPicture();
55
- } else {
56
- try {
57
- await this.videoRef.nativeElement.requestPictureInPicture();
58
- } catch (err) {
59
- console.warn("PiP request failed:", err);
60
- }
61
- }
62
- }
63
- }
64
- ```
65
-
66
- The `@Input() videoRef` is the parent's `<video>` element via `@ViewChild`. NgZone wraps the events so OnPush components re-render correctly.
67
-
68
- Usage in the call screen:
69
-
70
- ```ts
71
- @Component({
72
- selector: "app-ongoing-call",
73
- template: `
74
- <video #remoteVideo autoplay playsinline [class.hidden]="inPip"></video>
75
- <app-pip-button [videoRef]="remoteVideo"></app-pip-button>
76
- `,
77
- styles: [`
78
- .hidden { visibility: hidden; }
79
- `],
80
- })
81
- export class OngoingCallComponent {
82
- @ViewChild("remoteVideo") remoteVideo!: ElementRef<HTMLVideoElement>;
83
- inPip = false;
84
- }
85
- ```
86
-
87
- ---
88
-
89
- ## Document PiP — Angular host element transfer
90
-
91
- Document PiP lets you put arbitrary HTML in a floating window, including a full Angular component subtree. The challenge: detaching + re-attaching a DOM node mid-Angular-lifecycle.
92
-
93
- ```ts
94
- // services/document-pip.service.ts
95
- import { Injectable, NgZone, RendererFactory2, Renderer2 } from "@angular/core";
96
-
97
- @Injectable({ providedIn: "root" })
98
- export class DocumentPipService {
99
- private pipWindow: Window | null = null;
100
- private renderer: Renderer2;
101
-
102
- constructor(private zone: NgZone, private rendererFactory: RendererFactory2) {
103
- this.renderer = rendererFactory.createRenderer(null, null);
104
- }
105
-
106
- get supported(): boolean {
107
- return typeof window !== "undefined" && "documentPictureInPicture" in window;
108
- }
109
-
110
- async openWindow(content: HTMLElement, options: { width?: number; height?: number } = {}): Promise<Window | null> {
111
- if (!this.supported) return null;
112
-
113
- this.pipWindow = await (window as unknown as {
114
- documentPictureInPicture: { requestWindow: (o: object) => Promise<Window> };
115
- }).documentPictureInPicture.requestWindow({
116
- width: options.width ?? 360,
117
- height: options.height ?? 480,
118
- });
119
-
120
- // Copy stylesheets so kit + Angular Material styles work in the PiP window
121
- for (const sheet of Array.from(document.styleSheets)) {
122
- try {
123
- const cssText = Array.from(sheet.cssRules ?? []).map(r => r.cssText).join("\n");
124
- const style = this.pipWindow.document.createElement("style");
125
- style.textContent = cssText;
126
- this.pipWindow.document.head.appendChild(style);
127
- } catch {
128
- if (sheet.href) {
129
- const link = this.pipWindow.document.createElement("link");
130
- link.rel = "stylesheet";
131
- link.href = sheet.href;
132
- this.pipWindow.document.head.appendChild(link);
133
- }
134
- }
135
- }
136
-
137
- this.pipWindow.document.body.appendChild(content);
138
-
139
- return this.pipWindow;
140
- }
141
-
142
- closeWindow() {
143
- if (this.pipWindow) {
144
- this.pipWindow.close();
145
- this.pipWindow = null;
146
- }
147
- }
148
- }
149
- ```
150
-
151
- Then in the call component:
152
-
153
- ```ts
154
- @Component({
155
- // ...
156
- template: `
157
- <div #callRoot class="call-root">
158
- <video #remoteVideo autoplay playsinline></video>
159
- <app-control-panel></app-control-panel>
160
- </div>
161
- `,
162
- })
163
- export class OngoingCallComponent {
164
- @ViewChild("callRoot", { static: true }) callRoot!: ElementRef<HTMLElement>;
165
-
166
- constructor(private docPip: DocumentPipService, private zone: NgZone) {}
167
-
168
- async enterDocumentPip() {
169
- const pipWin = await this.docPip.openWindow(this.callRoot.nativeElement);
170
- if (!pipWin) return;
171
-
172
- pipWin.addEventListener("pagehide", () => {
173
- this.zone.run(() => {
174
- // Restore the call-root back to the original mount point
175
- const host = document.getElementById("call-host");
176
- if (host && this.callRoot.nativeElement) {
177
- host.appendChild(this.callRoot.nativeElement);
178
- }
179
- });
180
- });
181
- }
182
- }
183
- ```
184
-
185
- When you transfer the DOM node into the PiP window, Angular's change detection still works because the node is the same. Click handlers, OnPush updates, NgZone events all continue functioning across the window boundary. This is the magic of Document PiP.
186
-
187
- ---
188
-
189
- ## Auto-PiP on tab/window backgrounding
190
-
191
- ```ts
192
- @Component({...})
193
- export class OngoingCallComponent implements OnInit, OnDestroy {
194
- private visibilitySub?: Subscription;
195
-
196
- ngOnInit() {
197
- if (!document.pictureInPictureEnabled) return;
198
- this.visibilitySub = fromEvent(document, "visibilitychange").subscribe(() => {
199
- if (document.visibilityState === "hidden" && this.callActive) {
200
- this.zone.run(() => {
201
- this.remoteVideo.nativeElement.requestPictureInPicture().catch(() => {});
202
- });
203
- }
204
- });
205
- }
206
-
207
- ngOnDestroy() {
208
- this.visibilitySub?.unsubscribe();
209
- }
210
- }
211
- ```
212
-
213
- Same caveats as React — Safari rejects auto-PiP from non-user-gesture contexts in some versions. Test on real Safari before relying on this.
214
-
215
- ---
216
-
217
- ## Auto-leave on hangup
218
-
219
- ```ts
220
- async endCall() {
221
- if (document.pictureInPictureElement) {
222
- await document.exitPictureInPicture();
223
- }
224
- this.docPip.closeWindow();
225
-
226
- CometChatCalls.leaveSession(); // v5 canonical (endSession is a deprecated shim)
227
- // ...rest of cleanup
228
- }
229
- ```
230
-
231
- ---
232
-
233
- ## SSR considerations (Angular Universal)
234
-
235
- Document and Video PiP both reference `document.pictureInPictureEnabled` and `window.documentPictureInPicture`. Both are browser-only — guard:
236
-
237
- ```ts
238
- import { isPlatformBrowser } from "@angular/common";
239
-
240
- constructor(@Inject(PLATFORM_ID) private platformId: object) {}
241
-
242
- get supported() {
243
- return isPlatformBrowser(this.platformId)
244
- && typeof document !== "undefined"
245
- && document.pictureInPictureEnabled;
246
- }
247
- ```
248
-
249
- Without this, SSR build crashes at boot.
250
-
251
- ---
252
-
253
- ## Anti-patterns
254
-
255
- 1. **`requestPictureInPicture()` from `ngOnInit`.** Browsers reject — needs user gesture. `(click)` is the trigger.
256
- 2. **Skipping `NgZone.run`** for PiP enter/leave events. OnPush components don't re-render.
257
- 3. **Document PiP without copying stylesheets.** PiP window unstyled.
258
- 4. **Forgetting `pagehide` cleanup** when user closes the PiP window via system X. DOM node stays detached; controls broken.
259
- 5. **No SSR guard.** Universal build crashes.
260
- 6. **Two separate video elements** (one for normal, one for PiP). Use one `<video>` and `[class.hidden]` it.
261
- 7. **Auto-PiP in `ngOnInit` with no user-gesture context.** Safari rejects.
262
-
263
- ---
264
-
265
- ## Verification checklist
266
-
267
- - [ ] PiP button feature-detects `document.pictureInPictureEnabled`
268
- - [ ] Button hidden / disabled when unsupported
269
- - [ ] PiP request from `(click)`, not `ngOnInit`
270
- - [ ] `enterpictureinpicture` / `leavepictureinpicture` listeners wrapped in NgZone
271
- - [ ] OnPush components call `markForCheck()` after PiP state change
272
- - [ ] In-page video hidden while PiP active
273
- - [ ] Hangup path calls `document.exitPictureInPicture()` if active
274
- - [ ] Document PiP path closes window via `docPip.closeWindow()`
275
- - [ ] SSR builds: `isPlatformBrowser` guards
276
- - [ ] Real-browser smoke: Chrome (both APIs) + Safari (Video PiP) + Firefox (Video PiP)
277
-
278
- ---
279
-
280
- ## Pointers
281
-
282
- - `cometchat-react-calls/references/picture-in-picture.md` — sister reference (browser API details, Document PiP semantics, browser support)
283
- - `references/custom-ui.md` — Angular custom call UI (PiP integration via @ViewChild on the video element)
284
- - `references/lazy-loading-pitfalls.md` — eager loading + SSR guards
285
- - `cometchat-angular-calls` SKILL.md — base hard rules
@@ -1,172 +0,0 @@
1
- # Raise hand on Angular
2
-
3
- Same SDK API as web (`@cometchat/calls-sdk-javascript`). Angular-specific wiring: NgZone wrap on listeners, RxJS Subject for the raised-hands roster, OnPush + markForCheck.
4
-
5
- **Canonical docs:** https://www.cometchat.com/docs/calls/javascript/raise-hand
6
- **Read first:** `cometchat-react-calls/references/raise-hand.md` — integration shape + anti-patterns are identical; this reference is the Angular-specific wiring.
7
-
8
- ---
9
-
10
- ## SDK API (same as web)
11
-
12
- ```ts
13
- import { CometChatCalls } from "@cometchat/calls-sdk-javascript";
14
-
15
- CometChatCalls.raiseHand();
16
- CometChatCalls.lowerHand();
17
- ```
18
-
19
- ---
20
-
21
- ## Angular wiring — service-driven roster
22
-
23
- Centralize raise-hand state in a service so any component can subscribe:
24
-
25
- ```ts
26
- // services/raise-hand.service.ts
27
- import { Injectable, NgZone, OnDestroy } from "@angular/core";
28
- import { BehaviorSubject } from "rxjs";
29
- import { CometChatCalls } from "@cometchat/calls-sdk-javascript";
30
-
31
- interface RaisedParticipant { uid: string; name: string; raisedAt: number; }
32
-
33
- @Injectable({ providedIn: "root" })
34
- export class RaiseHandService implements OnDestroy {
35
- private readonly raised = new Map<string, RaisedParticipant>();
36
- readonly raised$ = new BehaviorSubject<RaisedParticipant[]>([]);
37
-
38
- private onRaised = (p: { uid: string; name: string }) => {
39
- this.zone.run(() => {
40
- this.raised.set(p.uid, { ...p, raisedAt: Date.now() });
41
- this.emit();
42
- });
43
- };
44
-
45
- private onLowered = (p: { uid: string }) => {
46
- this.zone.run(() => {
47
- this.raised.delete(p.uid);
48
- this.emit();
49
- });
50
- };
51
-
52
- // addEventListener returns an unsubscribe fn — there is NO CometChatCalls.removeEventListener.
53
- private offs: Array<() => void> = [];
54
-
55
- constructor(private zone: NgZone) {
56
- this.offs.push(
57
- CometChatCalls.addEventListener("onParticipantHandRaised", this.onRaised),
58
- CometChatCalls.addEventListener("onParticipantHandLowered", this.onLowered),
59
- );
60
- }
61
-
62
- ngOnDestroy() {
63
- this.offs.forEach(off => off());
64
- this.offs = [];
65
- }
66
-
67
- raise() { CometChatCalls.raiseHand(); }
68
- lower() { CometChatCalls.lowerHand(); }
69
-
70
- private emit() {
71
- const sorted = Array.from(this.raised.values()).sort((a, b) => a.raisedAt - b.raisedAt);
72
- this.raised$.next(sorted);
73
- }
74
- }
75
- ```
76
-
77
- The `NgZone.run` wrapping is the canonical Angular rule (see `references/ngzone-and-async-callbacks.md`) — without it, `BehaviorSubject.next` doesn't trigger change detection in OnPush components.
78
-
79
- ---
80
-
81
- ## Toggle button component
82
-
83
- ```ts
84
- @Component({
85
- selector: "app-raise-hand-button",
86
- template: `
87
- <button
88
- (click)="toggle()"
89
- [class.active]="raised"
90
- [attr.aria-pressed]="raised"
91
- [attr.aria-label]="raised ? 'Lower hand' : 'Raise hand'"
92
- >
93
- ✋ {{ raised ? "Lower" : "Raise" }}
94
- </button>
95
- `,
96
- changeDetection: ChangeDetectionStrategy.OnPush,
97
- })
98
- export class RaiseHandButtonComponent {
99
- raised = false;
100
- constructor(private svc: RaiseHandService, private cd: ChangeDetectorRef) {}
101
-
102
- toggle() {
103
- if (this.raised) this.svc.lower();
104
- else this.svc.raise();
105
- this.raised = !this.raised;
106
- this.cd.markForCheck();
107
- }
108
- }
109
- ```
110
-
111
- ---
112
-
113
- ## Roster component (host view)
114
-
115
- ```ts
116
- @Component({
117
- selector: "app-raised-hands-list",
118
- template: `
119
- <div *ngIf="(raised$ | async) as list">
120
- <ul *ngIf="list.length > 0" aria-label="Raised hands queue">
121
- <li *ngFor="let p of list; trackBy: trackByUid">
122
- ✋ {{ p.name }} <span class="ago">{{ secondsAgo(p.raisedAt) }}</span>
123
- </li>
124
- </ul>
125
- </div>
126
- `,
127
- changeDetection: ChangeDetectionStrategy.OnPush,
128
- })
129
- export class RaisedHandsListComponent {
130
- raised$ = this.svc.raised$;
131
- constructor(private svc: RaiseHandService) {}
132
- trackByUid(_: number, p: RaisedParticipant) { return p.uid; }
133
- secondsAgo(t: number) { return `${Math.round((Date.now() - t) / 1000)}s ago`; }
134
- }
135
- ```
136
-
137
- `trackByUid` is critical — without it, Angular re-renders every list item on every emit, which is bad for FlatList-style smooth scroll.
138
-
139
- ---
140
-
141
- ## Anti-patterns
142
-
143
- Same shape as web sister reference, plus Angular-specific:
144
-
145
- 1. **Service NOT provided in `root`.** If raise-hand service is provided in a feature module, it instantiates on lazy-load — listeners attach late. Provide in root so it boots with the app.
146
- 2. **Skipping `markForCheck` with OnPush.** Service emits, component doesn't re-render.
147
- 3. **Forgetting `ngOnDestroy` cleanup.** Service is `providedIn: "root"` so it lives forever, but the listeners would survive across logout/re-login. Reset on `CometChatUIKit.logout`.
148
- 4. **`*ngFor` without `trackBy`.** Re-renders thrash; tile state lost.
149
-
150
- ---
151
-
152
- ## Verification checklist
153
-
154
- - [ ] `RaiseHandService` provided in root
155
- - [ ] `NgZone.run` wraps both listener callbacks
156
- - [ ] `BehaviorSubject` emits sorted-by-raisedAt list
157
- - [ ] Toggle button has `aria-pressed` + `aria-label`
158
- - [ ] Roster uses `trackBy: trackByUid`
159
- - [ ] OnPush components call `markForCheck()` on state change
160
- - [ ] Listeners cleaned up in `ngOnDestroy`
161
- - [ ] `hideRaiseHandButton: true` in CallSettings if using custom UI
162
- - [ ] Browser smoke: 3 tabs in same call → host's roster updates with markForCheck
163
-
164
- ---
165
-
166
- ## Pointers
167
-
168
- - `cometchat-react-calls/references/raise-hand.md` — sister reference
169
- - `references/ngzone-and-async-callbacks.md` — NgZone primer
170
- - `references/group-calls.md` — group call architecture in Angular
171
- - `cometchat-a11y` — `aria-pressed` + screen reader announcements
172
- - Canonical docs: https://www.cometchat.com/docs/calls/javascript/raise-hand