@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,357 +0,0 @@
1
- # CallKit + PushKit on iOS — the canonical implementation
2
-
3
- iOS is the only platform where the OS owns the incoming-call UI. CallKit + PushKit isn't optional for production — without them, calls don't ring on locked devices and Apple rejects production builds. This reference is the full implementation; the SKILL.md sketches it, here is the code.
4
-
5
- ---
6
-
7
- ## Why two frameworks
8
-
9
- | Framework | Role |
10
- |---|---|
11
- | **PushKit** | Receives high-priority VoIP push payloads, even when the app is terminated. Separate from APNs. |
12
- | **CallKit** | Presents the system incoming-call UI (lock-screen, even on locked device), reports call state to the OS, integrates with Phone app's "Recents" list. |
13
-
14
- Combined: a VoIP push wakes the app via PushKit; the app immediately reports the call to CallKit; CallKit takes over and shows the system UI.
15
-
16
- ---
17
-
18
- ## Apple Developer setup (one-time, manual)
19
-
20
- The skill cannot automate these:
21
-
22
- 1. **Create a VoIP Services certificate** in Apple Developer portal → Certificates → "+" → VoIP Services.
23
- 2. **Pin to the bundle ID** of your app.
24
- 3. **Download the .p12** and convert to .pem if your push server needs it (`openssl pkcs12 -in cert.p12 -out cert.pem -nodes`).
25
- 4. **Upload to your push server.** This is a SEPARATE certificate from your standard APNs cert.
26
-
27
- The skill prints these steps and waits for the user to confirm before proceeding.
28
-
29
- ---
30
-
31
- ## Xcode setup
32
-
33
- In the target's "Signing & Capabilities":
34
-
35
- 1. Click "+" → "Push Notifications" → adds the entitlement.
36
- 2. Click "+" → "Background Modes" → check:
37
- - ☑ Audio, AirPlay, and Picture in Picture
38
- - ☑ Voice over IP
39
- - ☑ Remote notifications
40
-
41
- Verify the resulting `Info.plist` has:
42
-
43
- ```xml
44
- <key>UIBackgroundModes</key>
45
- <array>
46
- <string>audio</string>
47
- <string>voip</string>
48
- <string>remote-notification</string>
49
- </array>
50
- <key>NSMicrophoneUsageDescription</key>
51
- <string>So you can talk during voice and video calls.</string>
52
- <key>NSCameraUsageDescription</key>
53
- <string>So you can be seen during video calls.</string>
54
- ```
55
-
56
- ---
57
-
58
- ## App entry — register PushKit + CallKit
59
-
60
- ### SwiftUI (`@main App`)
61
-
62
- ```swift
63
- import SwiftUI
64
- import PushKit
65
- import CallKit
66
- import CometChatSDK
67
- import CometChatCallsSDK
68
-
69
- @main
70
- struct YourApp: App {
71
- @StateObject private var callManager = CallManager.shared
72
-
73
- var body: some Scene {
74
- WindowGroup {
75
- ContentView()
76
- .onAppear {
77
- CometChat.init(appId: Secrets.cometchatAppID, appSettings: appSettings) { isInitialized, error in
78
- guard error == nil else { return }
79
- CometChatCalls.init(callsAppSettings: callAppSettings) { _ in
80
- callManager.registerForPushKit() // wait for SDK ready
81
- }
82
- }
83
- }
84
- }
85
- }
86
- }
87
- ```
88
-
89
- ### UIKit (`AppDelegate`)
90
-
91
- ```swift
92
- import UIKit
93
- import PushKit
94
- import CallKit
95
-
96
- @main
97
- class AppDelegate: UIResponder, UIApplicationDelegate {
98
- func application(_ app: UIApplication, didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
99
- CometChat.init(appId: Secrets.cometchatAppID, appSettings: appSettings) { _, error in
100
- guard error == nil else { return }
101
- CometChatCalls.init(callsAppSettings: callAppSettings) { _ in
102
- CallManager.shared.registerForPushKit()
103
- }
104
- }
105
- return true
106
- }
107
- }
108
- ```
109
-
110
- ---
111
-
112
- ## CallManager — the shared state holder
113
-
114
- ```swift
115
- import PushKit
116
- import CallKit
117
- import CometChatCallsSDK
118
-
119
- class CallManager: NSObject, ObservableObject {
120
- static let shared = CallManager()
121
-
122
- private let pushRegistry = PKPushRegistry(queue: .main)
123
- private let provider: CXProvider
124
- private let callController = CXCallController()
125
-
126
- private override init() {
127
- let config = CXProviderConfiguration(localizedName: "YourApp")
128
- config.supportsVideo = true
129
- config.maximumCallGroups = 1
130
- config.maximumCallsPerCallGroup = 1
131
- config.supportedHandleTypes = [.generic]
132
- config.iconTemplateImageData = UIImage(named: "CallKitIcon")?.pngData()
133
- config.ringtoneSound = "ringtone.caf"
134
-
135
- self.provider = CXProvider(configuration: config)
136
- super.init()
137
- provider.setDelegate(self, queue: .main)
138
- }
139
-
140
- func registerForPushKit() {
141
- pushRegistry.delegate = self
142
- pushRegistry.desiredPushTypes = [.voIP]
143
- }
144
-
145
- func reportIncomingCall(uuid: UUID, callerName: String, callerUid: String, hasVideo: Bool) {
146
- let update = CXCallUpdate()
147
- update.remoteHandle = CXHandle(type: .generic, value: callerUid)
148
- update.localizedCallerName = callerName
149
- update.hasVideo = hasVideo
150
-
151
- provider.reportNewIncomingCall(with: uuid, update: update) { error in
152
- if let error = error {
153
- print("Failed to report incoming call: \(error)")
154
- }
155
- }
156
- }
157
- }
158
- ```
159
-
160
- ---
161
-
162
- ## PushKit delegate — the 5-second rule
163
-
164
- ```swift
165
- extension CallManager: PKPushRegistryDelegate {
166
- func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, for type: PKPushType) {
167
- guard type == .voIP else { return }
168
- let token = credentials.token.map { String(format: "%02x", $0) }.joined()
169
- // Send this token to your server, keyed by the logged-in CometChat UID
170
- Task {
171
- await sendVoipTokenToServer(token: token, uid: CometChat.getLoggedInUser()?.uid ?? "")
172
- }
173
- }
174
-
175
- func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
176
- guard type == .voIP else { completion(); return }
177
-
178
- // CRITICAL: report to CallKit IMMEDIATELY. iOS terminates apps that delay this >~5s.
179
- let data = payload.dictionaryPayload["data"] as? [String: Any] ?? [:]
180
- let sessionId = data["sessionId"] as? String ?? UUID().uuidString
181
- let callerName = data["callerName"] as? String ?? "Unknown"
182
- let callerUid = data["callerUid"] as? String ?? ""
183
- let hasVideo = (data["callType"] as? String) == "video"
184
-
185
- let uuid = UUID(uuidString: sessionId) ?? UUID()
186
- reportIncomingCall(uuid: uuid, callerName: callerName, callerUid: callerUid, hasVideo: hasVideo)
187
-
188
- // Store sessionId for later when CXAnswerCallAction fires
189
- self.pendingSessionIds[uuid] = sessionId
190
-
191
- completion() // ← tell iOS we're done
192
- }
193
-
194
- // iOS may invalidate the token (OS upgrade, app reinstall)
195
- func pushRegistry(_ registry: PKPushRegistry, didInvalidatePushTokenFor type: PKPushType) {
196
- // Token will re-register; wait for didUpdate
197
- }
198
- }
199
- ```
200
-
201
- **The 5-second rule:** Apple's `PKPushRegistry` documentation says you must call `reportNewIncomingCall` "promptly." Practical limit: ~5 seconds. If you exceed it, iOS terminates your app process and won't deliver future VoIP pushes for ~24 hours (apologies, no public retry mechanism).
202
-
203
- ---
204
-
205
- ## CallKit delegate — answer + end actions
206
-
207
- ```swift
208
- extension CallManager: CXProviderDelegate {
209
- func providerDidReset(_ provider: CXProvider) {
210
- // OS reset everything — clean up local state
211
- pendingSessionIds.removeAll()
212
- }
213
-
214
- func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
215
- // User tapped "Answer" on the lock screen
216
- guard let sessionId = pendingSessionIds[action.callUUID] else {
217
- action.fail()
218
- return
219
- }
220
-
221
- Task {
222
- do {
223
- // Accept via Chat SDK
224
- try await CometChat.acceptCall(sessionID: sessionId)
225
-
226
- // Configure AVAudioSession for voice/video call audio
227
- try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .voiceChat)
228
- try AVAudioSession.sharedInstance().setActive(true)
229
-
230
- // Build session settings via CallSettingsBuilder. The CallsEventsDelegate
231
- // is wired with setDelegate(_:); there is no SessionSettings(Builder).
232
- let settings = CallSettingsBuilder()
233
- .setIsAudioOnly(false)
234
- .setStartVideoMuted(false)
235
- .setStartAudioMuted(false)
236
- .setDelegate(callListener) // callListener conforms to CallsEventsDelegate
237
- .build()
238
-
239
- // Two-step: generateToken THEN startSession. There is no joinSession.
240
- // `view` is the UIView the ongoing-call UI will be drawn into.
241
- CometChatCalls.generateToken(authToken: CometChat.getUserAuthToken(), sessionID: sessionId) { token in
242
- guard let token = token else {
243
- print("generateToken returned nil")
244
- action.fail()
245
- return
246
- }
247
- CometChatCalls.startSession(
248
- callToken: token,
249
- callSetting: settings,
250
- view: callContainerView // a UIView with measurable bounds
251
- ) { _ in
252
- action.fulfill() // tell CallKit we answered successfully
253
- } onError: { error in
254
- print("startSession failed: \(error?.errorDescription ?? "unknown")")
255
- action.fail()
256
- }
257
- } onError: { error in
258
- print("generateToken failed: \(error?.errorDescription ?? "unknown")")
259
- action.fail()
260
- }
261
-
262
- // Navigate the app's UI to the ongoing-call screen
263
- await MainActor.run {
264
- // ...your nav logic — push the view that hosts callContainerView...
265
- }
266
- } catch {
267
- action.fail()
268
- }
269
- }
270
- }
271
-
272
- func provider(_ provider: CXProvider, perform action: CXEndCallAction) {
273
- // User tapped "End" or call ended remotely.
274
- CometChatCalls.endSession() // EXISTS on the static facade in v5
275
-
276
- // CRITICAL: deactivate audio session (rule 1.5)
277
- do {
278
- try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
279
- } catch {
280
- // log but don't block
281
- }
282
-
283
- pendingSessionIds.removeValue(forKey: action.callUUID)
284
- action.fulfill()
285
- }
286
-
287
- func provider(_ provider: CXProvider, perform action: CXSetMutedCallAction) {
288
- CometChatCalls.audioMuted(action.isMuted) // NOT muteAudio
289
- action.fulfill()
290
- }
291
- }
292
- ```
293
-
294
- ---
295
-
296
- ## Outgoing calls — also through CallKit
297
-
298
- For caller-initiated calls, report via `CXStartCallAction` so the call appears in the iOS Phone app's Recents:
299
-
300
- ```swift
301
- extension CallManager {
302
- func startOutgoingCall(receiverUid: String, callType: CallType) {
303
- let uuid = UUID()
304
- let handle = CXHandle(type: .generic, value: receiverUid)
305
- let action = CXStartCallAction(call: uuid, handle: handle)
306
- action.isVideo = (callType == .video)
307
-
308
- let transaction = CXTransaction(action: action)
309
- callController.request(transaction) { error in
310
- if let error = error {
311
- print("Failed to start outgoing call: \(error)")
312
- }
313
- }
314
- }
315
- }
316
-
317
- extension CallManager {
318
- // CXProviderDelegate
319
- func provider(_ provider: CXProvider, perform action: CXStartCallAction) {
320
- Task {
321
- do {
322
- let outgoing = Call(receiverId: action.handle.value,
323
- callType: action.isVideo ? .video : .audio, // CallType has no .voice
324
- receiverType: .user)
325
- let initiated = try await CometChat.initiateCall(call: outgoing)
326
- pendingSessionIds[action.callUUID] = initiated.sessionID
327
- provider.reportOutgoingCall(with: action.callUUID, startedConnectingAt: nil)
328
- action.fulfill()
329
- } catch {
330
- action.fail()
331
- }
332
- }
333
- }
334
- }
335
- ```
336
-
337
- This gives the user a "Calling..." UI in the iOS system. When the receiver accepts, `provider.reportOutgoingCall(connectedAt:)` switches the UI to "Connected."
338
-
339
- ---
340
-
341
- ## Common failure modes
342
-
343
- | Symptom | Cause | Fix |
344
- |---|---|---|
345
- | App terminates 5s after PushKit delivery | Async work before `reportNewIncomingCall` | Report first, then do anything else |
346
- | "VoIP services not available" at registry setup | Background Modes capability missing | Add VoIP capability in Xcode and rebuild |
347
- | Token never registers | App not signed with VoIP-capable provisioning profile | Re-download provisioning profile |
348
- | Call rings but answering does nothing | `CXAnswerCallAction` delegate doesn't fail/fulfill | Always call `action.fulfill()` or `action.fail()` |
349
- | Music doesn't resume after hangup | Missing `setActive(false, .notifyOthersOnDeactivation)` | Add to `CXEndCallAction` handler |
350
- | Lock-screen rings but unlocking shows wrong screen | App didn't navigate to ongoing-call view in `CXAnswerCallAction` | Navigate inside the action handler |
351
- | Outgoing call never shows "Calling..." UI | Started via `initiateCall` directly without `CXStartCallAction` | Use `CXTransaction` flow |
352
-
353
- ---
354
-
355
- ## Testing without a push server
356
-
357
- Same workaround as RN — call `CallManager.shared.reportIncomingCall(...)` from a debug button. Bypasses PushKit entirely. Useful for testing the in-app + CallKit-UI flow but doesn't exercise the lock-screen ring (which requires PushKit delivery to an unlocked or terminated app).
@@ -1,322 +0,0 @@
1
- # Custom call UI on iOS
2
-
3
- Same shape as the other families' custom-ui references. iOS-specific because of CallKit interplay (rule 1.7: CallKit owns standalone-mode incoming UI, so custom in-app incoming UI is additive-mode-only) and AVFoundation routing.
4
-
5
- ---
6
-
7
- ## Two paths
8
-
9
- 1. **Style the kit's `CometChatOngoingCall`** UIViewController via theming + property overrides. Cheapest. Covers most apps.
10
- 2. **Build your own UIViewController on the SDK** — direct `CometChatCalls.generateToken` → `startSession` with your own UIView container. Maximum control.
11
-
12
- This reference covers path 2.
13
-
14
- ---
15
-
16
- ## Architecture
17
-
18
- ```
19
- Your UIViewController
20
- ├── containerView for remote participant(s) ← UIView the SDK draws into
21
- ├── localPreviewView ← AVCaptureVideoPreviewLayer or SDK preview
22
- ├── controlPanel (mute / camera / end / switch)
23
- └── statusLabel (call state, duration)
24
- ```
25
-
26
- The Calls SDK draws video into UIViews you provide. You don't render WebRTC tracks yourself (unlike web/RN where you wire `<video>` elements).
27
-
28
- ---
29
-
30
- ## Custom OngoingCallViewController
31
-
32
- ```swift
33
- import UIKit
34
- import AVFoundation
35
- import CometChatCallsSDK
36
-
37
- class CustomOngoingCallViewController: UIViewController {
38
- private let containerView = UIView()
39
- private let localPreviewView = UIView()
40
- private lazy var controlPanel = ControlPanelView()
41
- private let statusLabel = UILabel()
42
-
43
- private let sessionID: String
44
- private let isAudioOnly: Bool
45
- private var muted = false
46
- private var cameraOff = false
47
-
48
- init(sessionID: String, isAudioOnly: Bool) {
49
- self.sessionID = sessionID
50
- self.isAudioOnly = isAudioOnly
51
- super.init(nibName: nil, bundle: nil)
52
- modalPresentationStyle = .fullScreen
53
- }
54
-
55
- required init?(coder: NSCoder) { fatalError() }
56
-
57
- override func viewDidLoad() {
58
- super.viewDidLoad()
59
- view.backgroundColor = .black
60
- setupLayout()
61
- startCall()
62
- }
63
-
64
- override func viewWillDisappear(_ animated: Bool) {
65
- super.viewWillDisappear(animated)
66
- cleanup()
67
- }
68
-
69
- private func startCall() {
70
- // Build CallSettings via CallSettingsBuilder. The CallsEventsDelegate is
71
- // wired with setDelegate(_:); there is no SessionSettings/SessionSettingsBuilder.
72
- let settings = CallSettingsBuilder()
73
- .setIsAudioOnly(isAudioOnly)
74
- .setStartVideoMuted(isAudioOnly)
75
- .setStartAudioMuted(false)
76
- .setDelegate(self)
77
- .build()
78
-
79
- // Configure audio session BEFORE starting
80
- try? configureAudioSession()
81
-
82
- // Two-step: generateToken THEN startSession into your container UIView.
83
- // There is no single-call joinSession on the iOS Calls SDK v5.
84
- // authToken: pass CometChat.getUserAuthToken() in additive (chat + calls)
85
- // integrations; nil for session-only apps.
86
- CometChatCalls.generateToken(authToken: nil, sessionID: sessionID) { [weak self] token in
87
- guard let self = self, let token = token else { return }
88
- CometChatCalls.startSession(
89
- callToken: token,
90
- callSetting: settings,
91
- view: self.containerView
92
- ) { _ in
93
- // session started — delegate already wired via setDelegate
94
- } onError: { error in
95
- print("startSession failed: \(error?.errorDescription ?? "unknown")")
96
- }
97
- } onError: { error in
98
- print("generateToken failed: \(error?.errorDescription ?? "unknown")")
99
- }
100
- }
101
-
102
- private func configureAudioSession() throws {
103
- let session = AVAudioSession.sharedInstance()
104
- try session.setCategory(
105
- .playAndRecord,
106
- mode: isAudioOnly ? .voiceChat : .videoChat,
107
- options: [.allowBluetooth, .allowBluetoothA2DP, .defaultToSpeaker]
108
- )
109
- try session.setActive(true)
110
- }
111
-
112
- private func cleanup() {
113
- CometChatCalls.endSession() // EXISTS on the static facade in v5
114
- try? AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
115
- }
116
-
117
- private func setupLayout() {
118
- [containerView, localPreviewView, controlPanel, statusLabel].forEach {
119
- $0.translatesAutoresizingMaskIntoConstraints = false
120
- view.addSubview($0)
121
- }
122
-
123
- NSLayoutConstraint.activate([
124
- containerView.topAnchor.constraint(equalTo: view.topAnchor),
125
- containerView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
126
- containerView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
127
- containerView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
128
-
129
- localPreviewView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 16),
130
- localPreviewView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16),
131
- localPreviewView.widthAnchor.constraint(equalToConstant: 120),
132
- localPreviewView.heightAnchor.constraint(equalToConstant: 160),
133
-
134
- controlPanel.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -16),
135
- controlPanel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
136
- controlPanel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16),
137
- controlPanel.heightAnchor.constraint(equalToConstant: 80),
138
-
139
- statusLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 16),
140
- statusLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
141
- ])
142
- }
143
- }
144
-
145
- extension CustomOngoingCallViewController: CallsEventsDelegate {
146
- func onCallEnded() {
147
- DispatchQueue.main.async { [weak self] in
148
- self?.cleanup()
149
- self?.dismiss(animated: true)
150
- }
151
- }
152
-
153
- // swiftinterface: onUserListChanged(userList: NSArray) — payload is NSArray of [String: Any]
154
- func onUserListChanged(userList: NSArray) {
155
- DispatchQueue.main.async { [weak self] in
156
- self?.statusLabel.text = "\(userList.count) participants"
157
- }
158
- }
159
-
160
- // Note: CallsEventsDelegate has no onError callback. Surface generateToken /
161
- // startSession failures from their onError closures (see startCall above).
162
- }
163
- ```
164
-
165
- The `DispatchQueue.main.async` wrapping is the iOS equivalent of NgZone.run on Angular — SDK callbacks fire on background queues; UI updates must be on main.
166
-
167
- ---
168
-
169
- ## Control panel
170
-
171
- ```swift
172
- final class ControlPanelView: UIView {
173
- let muteButton = UIButton(type: .system)
174
- let cameraButton = UIButton(type: .system)
175
- let switchCameraButton = UIButton(type: .system)
176
- let endButton = UIButton(type: .system)
177
-
178
- var onMute: (() -> Void)?
179
- var onCamera: (() -> Void)?
180
- var onSwitch: (() -> Void)?
181
- var onEnd: (() -> Void)?
182
-
183
- override init(frame: CGRect) {
184
- super.init(frame: frame)
185
- backgroundColor = UIColor(white: 0, alpha: 0.4)
186
- layer.cornerRadius = 40
187
-
188
- let stack = UIStackView(arrangedSubviews: [muteButton, cameraButton, switchCameraButton, endButton])
189
- stack.distribution = .equalCentering
190
- stack.alignment = .center
191
- stack.translatesAutoresizingMaskIntoConstraints = false
192
- addSubview(stack)
193
-
194
- NSLayoutConstraint.activate([
195
- stack.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16),
196
- stack.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16),
197
- stack.centerYAnchor.constraint(equalTo: centerYAnchor),
198
- ])
199
-
200
- muteButton.setTitle("Mute", for: .normal)
201
- cameraButton.setTitle("Cam", for: .normal)
202
- switchCameraButton.setTitle("Flip", for: .normal)
203
- endButton.setTitle("End", for: .normal)
204
- endButton.tintColor = .red
205
-
206
- muteButton.addAction(UIAction { [weak self] _ in self?.onMute?() }, for: .touchUpInside)
207
- cameraButton.addAction(UIAction { [weak self] _ in self?.onCamera?() }, for: .touchUpInside)
208
- switchCameraButton.addAction(UIAction { [weak self] _ in self?.onSwitch?() }, for: .touchUpInside)
209
- endButton.addAction(UIAction { [weak self] _ in self?.onEnd?() }, for: .touchUpInside)
210
- }
211
-
212
- required init?(coder: NSCoder) { fatalError() }
213
- }
214
- ```
215
-
216
- Wire actions in the VC:
217
-
218
- ```swift
219
- override func viewDidLoad() {
220
- super.viewDidLoad()
221
- // ...
222
- controlPanel.onMute = { [weak self] in
223
- guard let self = self else { return }
224
- self.muted.toggle()
225
- CometChatCalls.audioMuted(self.muted) // NOT muteAudio
226
- }
227
- controlPanel.onCamera = { [weak self] in
228
- guard let self = self else { return }
229
- self.cameraOff.toggle()
230
- CometChatCalls.videoPaused(self.cameraOff) // NOT pauseVideo
231
- }
232
- controlPanel.onSwitch = { CometChatCalls.switchCamera() }
233
- controlPanel.onEnd = { [weak self] in
234
- self?.cleanup()
235
- self?.dismiss(animated: true)
236
- }
237
- }
238
- ```
239
-
240
- ---
241
-
242
- ## Local preview before connect
243
-
244
- ```swift
245
- private lazy var captureSession = AVCaptureSession()
246
- private lazy var previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
247
-
248
- private func startLocalPreview() {
249
- guard let device = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .front),
250
- let input = try? AVCaptureDeviceInput(device: device) else { return }
251
-
252
- captureSession.addInput(input)
253
- previewLayer.frame = localPreviewView.bounds
254
- previewLayer.videoGravity = .resizeAspectFill
255
- localPreviewView.layer.addSublayer(previewLayer)
256
-
257
- DispatchQueue.global(qos: .userInitiated).async {
258
- self.captureSession.startRunning()
259
- }
260
- }
261
-
262
- private func stopLocalPreview() {
263
- captureSession.stopRunning()
264
- previewLayer.removeFromSuperlayer()
265
- }
266
- ```
267
-
268
- Stop the preview BEFORE `startSession` — the SDK takes over the camera and your `AVCaptureSession` will fight with it.
269
-
270
- ---
271
-
272
- ## SwiftUI hosting
273
-
274
- Wrap with `UIViewControllerRepresentable` (see `references/swiftui-uikit-hosting.md`):
275
-
276
- ```swift
277
- struct CustomOngoingCallView: UIViewControllerRepresentable {
278
- let sessionID: String
279
- let isAudioOnly: Bool
280
-
281
- func makeUIViewController(context: Context) -> CustomOngoingCallViewController {
282
- CustomOngoingCallViewController(sessionID: sessionID, isAudioOnly: isAudioOnly)
283
- }
284
-
285
- func updateUIViewController(_ vc: CustomOngoingCallViewController, context: Context) {}
286
- }
287
- ```
288
-
289
- Present via `.fullScreenCover` (NOT `.sheet`).
290
-
291
- ---
292
-
293
- ## Picture-in-picture
294
-
295
- iOS supports PiP for video calls via `AVPictureInPictureController`:
296
-
297
- ```swift
298
- import AVKit
299
-
300
- class CustomOngoingCallViewController {
301
- private var pipController: AVPictureInPictureController?
302
-
303
- func setupPiP() {
304
- guard AVPictureInPictureController.isPictureInPictureSupported() else { return }
305
- let layer = AVSampleBufferDisplayLayer()
306
- containerView.layer.addSublayer(layer)
307
- let contentSource = AVPictureInPictureController.ContentSource(sampleBufferDisplayLayer: layer, playbackDelegate: self)
308
- pipController = AVPictureInPictureController(contentSource: contentSource)
309
- pipController?.canStartPictureInPictureAutomaticallyFromInline = true
310
- }
311
- }
312
- ```
313
-
314
- Setting up your own `AVPictureInPictureController` for WebRTC video is involved — the SDK doesn't expose a `CMSampleBuffer` stream directly. For most apps, use the Calls SDK's built-in PiP instead: `CometChatCalls.enterPIPMode()` / `CometChatCalls.exitPIPMode()` toggle the SDK-managed picture-in-picture for the session view. See `references/picture-in-picture.md`.
315
-
316
- ---
317
-
318
- ## When NOT to go custom
319
-
320
- The kit's `CometChatOngoingCall` covers 80% of apps. Custom is for design-system requirements that the kit's theming + property overrides can't reach. Same calculus as web/RN/Angular.
321
-
322
- The dispatcher asks before scaffolding custom and defaults to "no — use kit."