@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,899 +0,0 @@
1
- ---
2
- name: cometchat-nextjs-patterns
3
- description: "Framework-specific patterns for integrating CometChat React UI Kit v6 into Next.js projects (App Router and Pages Router). Covers SSR prevention, provider setup, route placement, API routes, and common pitfalls."
4
- license: "MIT"
5
- compatibility: "Node.js >=18; React >=18; Next.js >=13; @cometchat/chat-uikit-react ^6; @cometchat/chat-sdk-javascript ^4"
6
- metadata:
7
- author: "CometChat"
8
- version: "3.0.0"
9
- tags: "chat cometchat nextjs next react ssr app-router pages-router patterns"
10
- ---
11
-
12
- > **Ground truth:** `@cometchat/chat-uikit-react@^6` (+ `@cometchat/calls-sdk-javascript@^5`) — installed package types + `ui-kit/react`. **Official docs:** https://www.cometchat.com/docs/ui-kit/react/overview · **Docs MCP:** `claude mcp add --transport http cometchat-docs https://www.cometchat.com/docs/mcp` (or fetch the URL directly without MCP). Verify symbols against the installed package/source before relying on them.
13
-
14
- ## Purpose
15
-
16
- This skill teaches Claude how to integrate CometChat into a Next.js project. Next.js is the most complex framework to integrate with because of Server-Side Rendering (SSR) and the Server Component / Client Component boundary. Every CometChat component is browser-only -- getting this wrong is the #1 source of integration failures.
17
-
18
- **Read these companion skills first:**
19
- - `cometchat-core` -- initialization, login, CSS, provider pattern, anti-patterns
20
- - `cometchat-components` -- component catalog and composition patterns
21
- - `cometchat-placement` -- WHERE to put chat (route, modal, drawer, embedded)
22
-
23
- This skill covers the HOW for Next.js specifically.
24
-
25
- ---
26
-
27
- ## 1. Project detection
28
-
29
- A project uses Next.js when `package.json` has `next` as a dependency.
30
-
31
- ### Detecting App Router vs Pages Router
32
-
33
- Both may coexist in a project. Check which is primary:
34
-
35
- ```bash
36
- # App Router: look for app/ directory with layout.tsx
37
- ls app/layout.tsx app/layout.jsx 2>/dev/null
38
-
39
- # Pages Router: look for pages/ directory with _app.tsx
40
- ls pages/_app.tsx pages/_app.jsx pages/_app.js 2>/dev/null
41
- ```
42
-
43
- **If `app/layout.tsx` exists, treat the project as App Router.** Even if `pages/` also exists, App Router is the primary routing mechanism in modern Next.js.
44
-
45
- **If only `pages/` exists, treat the project as Pages Router.**
46
-
47
- ---
48
-
49
- ## 2. Critical: SSR prevention
50
-
51
- **Every file that imports from `@cometchat/chat-uikit-react` MUST prevent server-side rendering.** CometChat components access `window`, `document`, and WebSocket APIs during import -- not just during render, but at import time. If Next.js tries to import these modules on the server, the build crashes with `ReferenceError: window is not defined`.
52
-
53
- ### App Router: "use client" directive
54
-
55
- Add `"use client"` as the FIRST line of every file that imports CometChat:
56
-
57
- ```tsx
58
- "use client";
59
-
60
- import { CometChatConversations } from "@cometchat/chat-uikit-react";
61
- // This file only runs in the browser
62
- ```
63
-
64
- **Common mistake:** Putting `"use client"` AFTER imports. It must be the very first line, before any import statements.
65
-
66
- ```tsx
67
- // WRONG -- "use client" is not the first line
68
- import React from "react";
69
- "use client"; // too late, has no effect
70
-
71
- // CORRECT
72
- "use client";
73
- import React from "react";
74
- ```
75
-
76
- ### App Router: dynamic import from a Client Component (Next.js 15+ rule)
77
-
78
- > ⚠️ **Next.js 15+ change (verified by runtime smoke 2026-06-02):** `dynamic(..., { ssr: false })` is **FORBIDDEN in Server Components** — Next.js 15+ throws a build error. The page that owns the dynamic-import MUST be a Client Component (`"use client"` at line 1). Otherwise the build fails with `Ecmascript file had an error` even if everything else is correct.
79
-
80
- ```tsx
81
- // app/messages/page.tsx
82
- "use client"; // ← REQUIRED in Next.js 15+ when using `dynamic({ ssr: false })`
83
- import dynamic from "next/dynamic";
84
-
85
- const ChatView = dynamic(() => import("../../components/ChatView"), {
86
- ssr: false,
87
- loading: () => <div>Loading chat...</div>,
88
- });
89
-
90
- export default function MessagesPage() {
91
- return <ChatView />;
92
- }
93
- ```
94
-
95
- The `ChatView` component file itself must also have `"use client"` at the top. Both ends of the dynamic-import boundary need the directive.
96
-
97
- **If you cannot make the page a Client Component** (because it needs server data-fetching), wrap your data-fetching in a separate Server Component sibling and pass results down via props to a Client Component that owns the CometChat subtree.
98
-
99
- **Build still fails after applying both `"use client"` and `dynamic(... ssr:false)`?** Add `export const dynamic = "force-dynamic";` at the top of the page to opt out of static prerendering entirely (or `export const runtime = "edge";` for edge runtime). This is sometimes needed in Next.js 16 even with everything else correct — verified during 2026-06-02 smoke against Next.js 16.2.7. Skill-side suspicion: kit's module-eval-time `window` references still trip static prerender even via dynamic boundary.
100
-
101
- ### Pages Router: dynamic import
102
-
103
- In the Pages Router, every page can potentially run on the server. Use `next/dynamic`:
104
-
105
- ```tsx
106
- // pages/messages.tsx
107
- import dynamic from "next/dynamic";
108
-
109
- const ChatView = dynamic(() => import("../components/ChatView"), {
110
- ssr: false,
111
- loading: () => <div>Loading chat...</div>,
112
- });
113
-
114
- export default function MessagesPage() {
115
- return <ChatView />;
116
- }
117
- ```
118
-
119
- ---
120
-
121
- ## 3. CometChatProvider for Next.js (App Router)
122
-
123
- ### Full implementation
124
-
125
- ```tsx
126
- // app/providers/CometChatProvider.tsx
127
- "use client";
128
-
129
- import React, { useEffect, useState, createContext, useContext } from "react";
130
- import { CometChatUIKit, UIKitSettingsBuilder } from "@cometchat/chat-uikit-react";
131
-
132
- interface CometChatContextValue {
133
- isReady: boolean;
134
- error: string | null;
135
- }
136
-
137
- const CometChatContext = createContext<CometChatContextValue>({
138
- isReady: false,
139
- error: null,
140
- });
141
-
142
- export const useCometChat = () => useContext(CometChatContext);
143
-
144
- // Module-level state prevents both double-init AND double-login in React
145
- // StrictMode. Without the loginInFlight guard, a second mount calls
146
- // login() while the first is still pending and the SDK throws
147
- // "Please wait until the previous login request ends."
148
- let initialized = false;
149
- let loginInFlight: Promise<unknown> | null = null;
150
-
151
- async function ensureLoggedIn(
152
- uid: string,
153
- authToken?: string,
154
- ): Promise<void> {
155
- const existing = await CometChatUIKit.getLoggedinUser();
156
- if (existing) return;
157
- if (loginInFlight) {
158
- await loginInFlight;
159
- return;
160
- }
161
- loginInFlight = authToken
162
- ? CometChatUIKit.loginWithAuthToken(authToken)
163
- : CometChatUIKit.login(uid);
164
- try {
165
- await loginInFlight;
166
- } finally {
167
- loginInFlight = null;
168
- }
169
- }
170
-
171
- interface CometChatProviderProps {
172
- children: React.ReactNode;
173
- }
174
-
175
- export function CometChatProvider({ children }: CometChatProviderProps) {
176
- const [isReady, setIsReady] = useState(false);
177
- const [error, setError] = useState<string | null>(null);
178
-
179
- useEffect(() => {
180
- async function setup() {
181
- try {
182
- if (!initialized) {
183
- initialized = true;
184
-
185
- const settings = new UIKitSettingsBuilder()
186
- .setAppId(process.env.NEXT_PUBLIC_COMETCHAT_APP_ID!)
187
- .setRegion(process.env.NEXT_PUBLIC_COMETCHAT_REGION!)
188
- .setAuthKey(process.env.NEXT_PUBLIC_COMETCHAT_AUTH_KEY!)
189
- .subscribePresenceForAllUsers()
190
- .build();
191
-
192
- await CometChatUIKit.init(settings);
193
- }
194
-
195
- await ensureLoggedIn("cometchat-uid-1"); // DEVELOPMENT ONLY — see cometchat-production skill
196
-
197
- setIsReady(true);
198
- } catch (e) {
199
- setError(formatCometChatError(e)); // from cometchat-core §6 errors.ts — NOT String(e),
200
- // which renders "[object Object]" on kit errors (ENG-35719)
201
- }
202
- }
203
-
204
- setup();
205
- }, []);
206
-
207
- if (error) {
208
- return (
209
- <div style={{ color: "red", padding: 16, fontFamily: "monospace" }}>
210
- CometChat Error: {error}
211
- </div>
212
- );
213
- }
214
-
215
- if (!isReady) return null;
216
-
217
- return (
218
- <CometChatContext.Provider value={{ isReady, error }}>
219
- {children}
220
- </CometChatContext.Provider>
221
- );
222
- }
223
- ```
224
-
225
- ### Where to mount: Option A -- Global (chat available everywhere)
226
-
227
- Wrap the entire app in `app/layout.tsx`. The layout itself is a Server Component, but the provider is a Client Component via `"use client"` in its file:
228
-
229
- ```tsx
230
- // app/layout.tsx (Server Component)
231
- import { CometChatProvider } from "./providers/CometChatProvider";
232
- import "./globals.css";
233
-
234
- export default function RootLayout({ children }: { children: React.ReactNode }) {
235
- return (
236
- <html lang="en">
237
- <body>
238
- <CometChatProvider>
239
- {children}
240
- </CometChatProvider>
241
- </body>
242
- </html>
243
- );
244
- }
245
- ```
246
-
247
- **Note:** Importing a `"use client"` component from a Server Component is fine. Next.js renders the Server Component on the server and defers the Client Component to the browser. The `CometChatProvider` only runs its `useEffect` (and init) in the browser.
248
-
249
- > ⚠️ **Option A REQUIRES `force-dynamic` on the layout (verified — real build, Next 16.2.9 + kit 6.5.1).** Mounting the provider in `app/layout.tsx` pulls the kit module into the layout's module graph, so `next build` evaluates it during the **static prerender** of *every* route — including `/` (which imports no CometChat code) and the framework-generated `/_not-found` — and crashes with `ReferenceError: window is not defined`. `"use client"` does NOT prevent this in Next 16. The per-page `export const dynamic = "force-dynamic"` from §"Build still fails…" cannot fix it, because `/_not-found` has no page file to annotate. **The fix is to put the directive on the LAYOUT, where it cascades to all routes including `/_not-found`:**
250
- > ```tsx
251
- > // app/layout.tsx — add this alongside the provider mount
252
- > export const dynamic = "force-dynamic";
253
- > ```
254
- > If you would rather keep static prerendering for non-chat routes, use **Option B** (scoped route group) so `/` and `/_not-found` never import the kit — that is the cleaner choice for marketing/SSG-heavy sites.
255
-
256
- ### Where to mount: Option B -- Scoped (chat only on chat routes)
257
-
258
- Use a route group to scope the provider to chat-related routes:
259
-
260
- ```
261
- app/
262
- layout.tsx <-- no CometChat here
263
- page.tsx <-- home page, no chat overhead
264
- (chat)/
265
- layout.tsx <-- CometChatProvider wraps only this group
266
- messages/
267
- page.tsx <-- chat page
268
- inbox/
269
- page.tsx <-- another chat page
270
- ```
271
-
272
- ```tsx
273
- // app/(chat)/layout.tsx
274
- import { CometChatProvider } from "../providers/CometChatProvider";
275
-
276
- export default function ChatLayout({ children }: { children: React.ReactNode }) {
277
- return <CometChatProvider>{children}</CometChatProvider>;
278
- }
279
- ```
280
-
281
- Option B is better for performance: CometChat's SDK and WebSocket connection are only loaded when the user visits a chat route. Option A is simpler and ensures incoming call notifications work everywhere.
282
-
283
- ---
284
-
285
- ## 4. CometChatProvider for Next.js (Pages Router)
286
-
287
- In the Pages Router, mount the provider in `_app.tsx`. Use dynamic import to prevent SSR:
288
-
289
- ```tsx
290
- // pages/_app.tsx
291
- import type { AppProps } from "next/app";
292
- import dynamic from "next/dynamic";
293
- import "../styles/globals.css";
294
-
295
- const CometChatProvider = dynamic(
296
- () => import("../components/CometChatProvider").then((mod) => mod.CometChatProvider),
297
- { ssr: false }
298
- );
299
-
300
- export default function App({ Component, pageProps }: AppProps) {
301
- return (
302
- <CometChatProvider>
303
- <Component {...pageProps} />
304
- </CometChatProvider>
305
- );
306
- }
307
- ```
308
-
309
- The provider implementation is the same as section 3, but the file lives at `components/CometChatProvider.tsx` (no `"use client"` needed in Pages Router -- `ssr: false` handles SSR prevention).
310
-
311
- ---
312
-
313
- ## 5. Route placement (App Router)
314
-
315
- Next.js App Router uses file-system routing. Creating a file at the right path automatically creates the route.
316
-
317
- ### Create the chat page
318
-
319
- ```tsx
320
- // app/messages/page.tsx
321
- "use client";
322
-
323
- import { useState } from "react";
324
- import {
325
- CometChatConversations,
326
- CometChatMessageHeader,
327
- CometChatMessageList,
328
- CometChatMessageComposer,
329
- } from "@cometchat/chat-uikit-react";
330
- import { CometChat } from "@cometchat/chat-sdk-javascript";
331
-
332
- export default function MessagesPage() {
333
- const [selectedUser, setSelectedUser] = useState<CometChat.User>();
334
- const [selectedGroup, setSelectedGroup] = useState<CometChat.Group>();
335
-
336
- function handleConversationClick(conversation: CometChat.Conversation) {
337
- const entity = conversation.getConversationWith();
338
- if (entity instanceof CometChat.User) {
339
- setSelectedUser(entity);
340
- setSelectedGroup(undefined);
341
- } else if (entity instanceof CometChat.Group) {
342
- setSelectedUser(undefined);
343
- setSelectedGroup(entity);
344
- }
345
- }
346
-
347
- return (
348
- <div style={{ display: "flex", height: "100vh" }}>
349
- <div style={{ width: "360px", borderRight: "1px solid #eee" }}>
350
- <CometChatConversations onItemClick={handleConversationClick} />
351
- </div>
352
- <div style={{ flex: 1, display: "flex", flexDirection: "column" }}>
353
- {(selectedUser || selectedGroup) ? (
354
- <>
355
- {selectedUser && <CometChatMessageHeader user={selectedUser} />}
356
- {selectedGroup && <CometChatMessageHeader group={selectedGroup} />}
357
- {selectedUser && <CometChatMessageList user={selectedUser} hideReplyInThreadOption={true} />}
358
- {selectedGroup && <CometChatMessageList group={selectedGroup} hideReplyInThreadOption={true} />}
359
- {selectedUser && <CometChatMessageComposer user={selectedUser} />}
360
- {selectedGroup && <CometChatMessageComposer group={selectedGroup} />}
361
- </>
362
- ) : (
363
- <div style={{ flex: 1, display: "flex", alignItems: "center", justifyContent: "center", color: "#999" }}>
364
- Select a conversation to start chatting
365
- </div>
366
- )}
367
- </div>
368
- </div>
369
- );
370
- }
371
- ```
372
-
373
- This page is accessible at `/messages`. No router configuration needed -- Next.js handles it via the file system.
374
-
375
- ### Add a navigation link
376
-
377
- Find the layout's nav component and add a link:
378
-
379
- ```tsx
380
- import Link from "next/link";
381
-
382
- // In the nav, alongside existing links:
383
- <Link href="/messages">Messages</Link>
384
- ```
385
-
386
- **Important:** Use Next.js's `<Link>` component (from `next/link`), not a plain `<a>` tag or React Router's `<Link>`. Next.js's Link handles client-side navigation and prefetching.
387
-
388
- ---
389
-
390
- ## 6. Route placement (Pages Router)
391
-
392
- ### Create the chat page
393
-
394
- ```tsx
395
- // pages/messages.tsx
396
- import dynamic from "next/dynamic";
397
-
398
- const ChatView = dynamic(() => import("../components/ChatView"), {
399
- ssr: false,
400
- loading: () => (
401
- <div style={{ display: "flex", alignItems: "center", justifyContent: "center", height: "100vh" }}>
402
- Loading chat...
403
- </div>
404
- ),
405
- });
406
-
407
- export default function MessagesPage() {
408
- return <ChatView />;
409
- }
410
- ```
411
-
412
- The `ChatView` component contains the actual CometChat composition (see `cometchat-placement` for patterns). It is dynamically imported with `ssr: false` to prevent server rendering.
413
-
414
- ### ChatView implementation
415
-
416
- ```tsx
417
- // components/ChatView.tsx
418
- import { useState } from "react";
419
- import {
420
- CometChatConversations,
421
- CometChatMessageHeader,
422
- CometChatMessageList,
423
- CometChatMessageComposer,
424
- } from "@cometchat/chat-uikit-react";
425
- import { CometChat } from "@cometchat/chat-sdk-javascript";
426
-
427
- export default function ChatView() {
428
- const [selectedUser, setSelectedUser] = useState<CometChat.User>();
429
- const [selectedGroup, setSelectedGroup] = useState<CometChat.Group>();
430
-
431
- function handleConversationClick(conversation: CometChat.Conversation) {
432
- const entity = conversation.getConversationWith();
433
- if (entity instanceof CometChat.User) {
434
- setSelectedUser(entity);
435
- setSelectedGroup(undefined);
436
- } else if (entity instanceof CometChat.Group) {
437
- setSelectedUser(undefined);
438
- setSelectedGroup(entity);
439
- }
440
- }
441
-
442
- return (
443
- <div style={{ display: "flex", height: "100vh" }}>
444
- <div style={{ width: "360px", borderRight: "1px solid #eee" }}>
445
- <CometChatConversations onItemClick={handleConversationClick} />
446
- </div>
447
- <div style={{ flex: 1, display: "flex", flexDirection: "column" }}>
448
- {selectedUser && (
449
- <>
450
- <CometChatMessageHeader user={selectedUser} />
451
- <CometChatMessageList user={selectedUser} hideReplyInThreadOption={true} />
452
- <CometChatMessageComposer user={selectedUser} />
453
- </>
454
- )}
455
- {selectedGroup && (
456
- <>
457
- <CometChatMessageHeader group={selectedGroup} />
458
- <CometChatMessageList group={selectedGroup} hideReplyInThreadOption={true} />
459
- <CometChatMessageComposer group={selectedGroup} />
460
- </>
461
- )}
462
- </div>
463
- </div>
464
- );
465
- }
466
- ```
467
-
468
- ---
469
-
470
- ## 7. Modal/drawer placement
471
-
472
- ### App Router
473
-
474
- Create a Client Component for the drawer:
475
-
476
- ```tsx
477
- // components/ChatDrawer.tsx
478
- "use client";
479
-
480
- import { useEffect, useState } from "react";
481
- import {
482
- CometChatMessageHeader,
483
- CometChatMessageList,
484
- CometChatMessageComposer,
485
- } from "@cometchat/chat-uikit-react";
486
- import { CometChat } from "@cometchat/chat-sdk-javascript";
487
-
488
- interface ChatDrawerProps {
489
- isOpen: boolean;
490
- onClose: () => void;
491
- targetUserId?: string;
492
- }
493
-
494
- export function ChatDrawer({ isOpen, onClose, targetUserId }: ChatDrawerProps) {
495
- const [user, setUser] = useState<CometChat.User>();
496
-
497
- useEffect(() => {
498
- if (!isOpen || !targetUserId) return;
499
- CometChat.getUser(targetUserId).then(setUser);
500
- }, [isOpen, targetUserId]);
501
-
502
- if (!isOpen) return null;
503
-
504
- return (
505
- <>
506
- <div onClick={onClose} style={{ position: "fixed", inset: 0, zIndex: 999, backgroundColor: "rgba(0,0,0,0.3)" }} />
507
- <div style={{
508
- position: "fixed", top: 0, right: 0, bottom: 0, width: "400px", zIndex: 1000,
509
- backgroundColor: "#fff", boxShadow: "-4px 0 20px rgba(0,0,0,0.15)",
510
- display: "flex", flexDirection: "column",
511
- }}>
512
- <div style={{ display: "flex", justifyContent: "space-between", padding: "12px", borderBottom: "1px solid #eee" }}>
513
- <span style={{ fontWeight: 600 }}>Chat</span>
514
- <button onClick={onClose} style={{ background: "none", border: "none", cursor: "pointer" }}>X</button>
515
- </div>
516
- {user && (
517
- <>
518
- <CometChatMessageHeader user={user} />
519
- <div style={{ flex: 1, overflow: "hidden" }}>
520
- <CometChatMessageList user={user} hideReplyInThreadOption={true} />
521
- </div>
522
- <CometChatMessageComposer user={user} />
523
- </>
524
- )}
525
- </div>
526
- </>
527
- );
528
- }
529
- ```
530
-
531
- **Mounting the drawer:** The drawer component has `"use client"`, so it can be imported from either Server or Client Components. Import it in the layout or any page:
532
-
533
- ```tsx
534
- // In a Server Component layout -- this works because ChatDrawer is "use client"
535
- import { ChatDrawer } from "../components/ChatDrawer";
536
-
537
- // But state management (isOpen) must be in a Client Component.
538
- // Option 1: wrap in a small client component
539
- // Option 2: use a client-side context for drawer state
540
- ```
541
-
542
- For state lifting across the Server/Client boundary, create a small Client Component wrapper:
543
-
544
- ```tsx
545
- // components/ChatDrawerTrigger.tsx
546
- "use client";
547
-
548
- import { useState } from "react";
549
- import { ChatDrawer } from "./ChatDrawer";
550
-
551
- export function ChatDrawerTrigger({ targetUserId }: { targetUserId: string }) {
552
- const [isOpen, setIsOpen] = useState(false);
553
-
554
- return (
555
- <>
556
- <button onClick={() => setIsOpen(true)}>Message</button>
557
- <ChatDrawer isOpen={isOpen} onClose={() => setIsOpen(false)} targetUserId={targetUserId} />
558
- </>
559
- );
560
- }
561
- ```
562
-
563
- ### Pages Router
564
-
565
- Use `dynamic` import for the drawer/modal component:
566
-
567
- ```tsx
568
- import dynamic from "next/dynamic";
569
-
570
- const ChatDrawer = dynamic(() => import("../components/ChatDrawer").then(m => m.ChatDrawer), {
571
- ssr: false,
572
- });
573
- ```
574
-
575
- See `cometchat-placement` for complete modal and drawer implementations.
576
-
577
- ---
578
-
579
- ## 8. API route for production auth
580
-
581
- Next.js can serve as both frontend and backend. Use an API route to generate CometChat auth tokens server-side.
582
-
583
- ### App Router API route
584
-
585
- ```tsx
586
- // app/api/cometchat-token/route.ts
587
- import { NextRequest, NextResponse } from "next/server";
588
-
589
- const COMETCHAT_APP_ID = process.env.COMETCHAT_APP_ID!; // server-only, no NEXT_PUBLIC_ prefix
590
- const COMETCHAT_REGION = process.env.COMETCHAT_REGION!; // server-only
591
- const COMETCHAT_AUTH_TOKEN = process.env.COMETCHAT_AUTH_TOKEN!; // server-only secret
592
-
593
- export async function POST(request: NextRequest) {
594
- try {
595
- const { uid } = await request.json();
596
-
597
- if (!uid || typeof uid !== "string") {
598
- return NextResponse.json({ error: "uid is required" }, { status: 400 });
599
- }
600
-
601
- const response = await fetch(
602
- `https://${COMETCHAT_APP_ID}.api-${COMETCHAT_REGION}.cometchat.io/v3/users/${uid}/auth_tokens`,
603
- {
604
- method: "POST",
605
- headers: {
606
- "Content-Type": "application/json",
607
- apiKey: COMETCHAT_AUTH_TOKEN,
608
- appId: COMETCHAT_APP_ID,
609
- },
610
- body: JSON.stringify({}),
611
- }
612
- );
613
-
614
- if (!response.ok) {
615
- const error = await response.text();
616
- return NextResponse.json({ error }, { status: response.status });
617
- }
618
-
619
- const data = await response.json();
620
- return NextResponse.json({ token: data.data.authToken });
621
- } catch (error) {
622
- return NextResponse.json({ error: String(error) }, { status: 500 });
623
- }
624
- }
625
- ```
626
-
627
- ### Pages Router API route
628
-
629
- ```tsx
630
- // pages/api/cometchat-token.ts
631
- import type { NextApiRequest, NextApiResponse } from "next";
632
-
633
- const COMETCHAT_APP_ID = process.env.COMETCHAT_APP_ID!;
634
- const COMETCHAT_REGION = process.env.COMETCHAT_REGION!;
635
- const COMETCHAT_AUTH_TOKEN = process.env.COMETCHAT_AUTH_TOKEN!;
636
-
637
- export default async function handler(req: NextApiRequest, res: NextApiResponse) {
638
- if (req.method !== "POST") {
639
- return res.status(405).json({ error: "Method not allowed" });
640
- }
641
-
642
- try {
643
- const { uid } = req.body;
644
-
645
- if (!uid || typeof uid !== "string") {
646
- return res.status(400).json({ error: "uid is required" });
647
- }
648
-
649
- const response = await fetch(
650
- `https://${COMETCHAT_APP_ID}.api-${COMETCHAT_REGION}.cometchat.io/v3/users/${uid}/auth_tokens`,
651
- {
652
- method: "POST",
653
- headers: {
654
- "Content-Type": "application/json",
655
- apiKey: COMETCHAT_AUTH_TOKEN,
656
- appId: COMETCHAT_APP_ID,
657
- },
658
- body: JSON.stringify({}),
659
- }
660
- );
661
-
662
- if (!response.ok) {
663
- const error = await response.text();
664
- return res.status(response.status).json({ error });
665
- }
666
-
667
- const data = await response.json();
668
- return res.status(200).json({ token: data.data.authToken });
669
- } catch (error) {
670
- return res.status(500).json({ error: String(error) });
671
- }
672
- }
673
- ```
674
-
675
- ### Environment variables for the API route
676
-
677
- Add server-only variables to `.env.local` (no `NEXT_PUBLIC_` prefix -- these must NOT be exposed to the browser):
678
-
679
- ```env
680
- # .env.local -- server-only (no NEXT_PUBLIC_ prefix)
681
- COMETCHAT_APP_ID=your_app_id
682
- COMETCHAT_REGION=us
683
- COMETCHAT_AUTH_TOKEN=your_server_auth_token
684
-
685
- # Client-side (NEXT_PUBLIC_ prefix)
686
- NEXT_PUBLIC_COMETCHAT_APP_ID=your_app_id
687
- NEXT_PUBLIC_COMETCHAT_REGION=us
688
- NEXT_PUBLIC_COMETCHAT_AUTH_KEY=your_client_auth_key
689
- ```
690
-
691
- **Note:** `COMETCHAT_AUTH_TOKEN` (server secret) and `COMETCHAT_AUTH_KEY` (client key) are different values from the CometChat dashboard. The auth token has higher privileges. Never prefix it with `NEXT_PUBLIC_`.
692
-
693
- ---
694
-
695
- ## 9. Environment variables
696
-
697
- ### Next.js env var conventions
698
-
699
- | Variable | Prefix | Accessible from | File |
700
- |---|---|---|---|
701
- | Client-side vars | `NEXT_PUBLIC_` | Browser + Server | `.env.local` |
702
- | Server-only vars | None | Server only (API routes, Server Components) | `.env.local` |
703
-
704
- ### .env.local file
705
-
706
- ```env
707
- NEXT_PUBLIC_COMETCHAT_APP_ID=your_app_id
708
- NEXT_PUBLIC_COMETCHAT_REGION=us
709
- NEXT_PUBLIC_COMETCHAT_AUTH_KEY=your_auth_key
710
- ```
711
-
712
- **Access in client code:** `process.env.NEXT_PUBLIC_COMETCHAT_APP_ID`
713
-
714
- **Important:** `.env.local` is gitignored by default in Next.js. Unlike Vite, you do not need to manually add it to `.gitignore`.
715
-
716
- ---
717
-
718
- ## 10. CSS import
719
-
720
- ### App Router
721
-
722
- Import in `app/globals.css` or `app/layout.tsx`:
723
-
724
- ```css
725
- /* app/globals.css */
726
- @import "@cometchat/chat-uikit-react/css-variables.css";
727
-
728
- /* your styles below */
729
- ```
730
-
731
- Or as a JS import in the root layout:
732
-
733
- ```tsx
734
- // app/layout.tsx
735
- import "@cometchat/chat-uikit-react/css-variables.css";
736
- import "./globals.css";
737
- ```
738
-
739
- ### Pages Router
740
-
741
- Import in `pages/_app.tsx` or `styles/globals.css`:
742
-
743
- ```tsx
744
- // pages/_app.tsx
745
- import "@cometchat/chat-uikit-react/css-variables.css";
746
- import "../styles/globals.css";
747
- ```
748
-
749
- ---
750
-
751
- ## 11. Common pitfalls
752
-
753
- ### Missing "use client"
754
-
755
- **Symptom:** `ReferenceError: window is not defined` or `ReferenceError: document is not defined` during build or at runtime.
756
-
757
- **Cause:** A file imports from `@cometchat/chat-uikit-react` without `"use client"` at the top. Next.js tries to render it on the server.
758
-
759
- **Fix:** Add `"use client"` as the first line of the file.
760
-
761
- ### Server/client code mixing
762
-
763
- **Symptom:** Build errors about `next/headers`, `cookies()`, or `generateMetadata` in the same file as CometChat imports.
764
-
765
- **Cause:** Server-only APIs and client-only APIs cannot coexist in the same file. CometChat requires `"use client"`, but `next/headers` and `cookies()` are server-only.
766
-
767
- **Fix:** Split the file. Keep server logic in a Server Component; keep CometChat in a separate `"use client"` component that the Server Component imports.
768
-
769
- ```tsx
770
- // app/messages/page.tsx (Server Component -- does data fetching)
771
- import { cookies } from "next/headers";
772
- import dynamic from "next/dynamic";
773
-
774
- const ChatView = dynamic(() => import("../../components/ChatView"), { ssr: false });
775
-
776
- export default async function MessagesPage() {
777
- const session = cookies().get("session"); // server-only
778
- if (!session) redirect("/login");
779
-
780
- return <ChatView />;
781
- }
782
- ```
783
-
784
- ### Image optimization
785
-
786
- CometChat renders avatars and media images via its own components. These do not conflict with `next/image`. Do not try to replace CometChat's internal images with `next/image` -- they are managed by the SDK.
787
-
788
- ### Middleware
789
-
790
- CometChat has no middleware requirements. Do not add CometChat-related middleware. If the project has auth middleware (e.g., protecting routes), just ensure the chat route is behind the same auth as the rest of the app.
791
-
792
- ### ISR/SSG pages with chat
793
-
794
- If a page uses static generation (`generateStaticParams`) or ISR, you can still add chat. Wrap the CometChat components in a Client Component. The page's static HTML ships without chat, and the Client Component hydrates and renders chat in the browser:
795
-
796
- ```tsx
797
- // app/products/[id]/page.tsx
798
- export async function generateStaticParams() {
799
- // ... returns product IDs for static generation
800
- }
801
-
802
- export default async function ProductPage({ params }: { params: { id: string } }) {
803
- const product = await getProduct(params.id);
804
-
805
- return (
806
- <div>
807
- <h1>{product.name}</h1>
808
- <p>{product.description}</p>
809
- {/* ChatPanel is "use client" -- renders only in the browser */}
810
- <ChatPanel targetUserId={product.sellerId} />
811
- </div>
812
- );
813
- }
814
- ```
815
-
816
- ### Turbopack
817
-
818
- Next.js's Turbopack (dev mode with `next dev --turbo`) works with CometChat. No special configuration needed. If you encounter issues, fall back to the standard Webpack dev server (`next dev` without `--turbo`).
819
-
820
- ### Pages Router: do NOT use CometChat from `getServerSideProps` / `getStaticProps` / `getInitialProps`
821
-
822
- **Symptom:** `ReferenceError: window is not defined` or cryptic SDK errors during `next build` or page rendering.
823
-
824
- **Cause:** The CometChat client SDK needs the browser (localStorage, WebSocket, etc.) and a logged-in user session. It cannot run inside `getServerSideProps`, `getStaticProps`, or `getInitialProps` — those execute on the Node.js server before the browser has hydrated.
825
-
826
- **Fix:** Do chat-related work in client components only. If you need to pre-seed a conversation from server data, pass just the primitive IDs (user UID, group GUID) as page props and let the client component fetch the CometChat entity on mount:
827
-
828
- ```tsx
829
- // pages/products/[id].tsx — server-side data fetch, no CometChat
830
- export async function getServerSideProps({ params }) {
831
- const product = await fetchProduct(params.id);
832
- return { props: { product } }; // pass sellerId as string, not a CometChat.User
833
- }
834
-
835
- export default function ProductPage({ product }) {
836
- return (
837
- <>
838
- <h1>{product.name}</h1>
839
- <ChatWithSeller sellerUid={product.sellerId} /> {/* client component */}
840
- </>
841
- );
842
- }
843
- ```
844
-
845
- ### Pages Router: `_document.tsx` doesn't need CometChat changes
846
-
847
- If the project has a custom `pages/_document.tsx` for font preloading or third-party SSR CSS injection, leave it alone. CometChat CSS variables are client-side only — they don't need `_document.tsx` integration. Mount the CSS import in `_app.tsx` as shown in section 10; `_document.tsx` is the wrong layer.
848
-
849
- ---
850
-
851
- ## 12. Complete integration checklist (App Router)
852
-
853
- 1. Install packages: `npm install @cometchat/chat-uikit-react@^6 @cometchat/chat-sdk-javascript@^4` — **⚠️ keep the `@^6` major pin; never install bare.** v7 is on npm — a bare `npm install @cometchat/chat-uikit-react` pulls it once it's tagged `latest`, and these v6 skills break against the v7 API.
854
- 2. Create `.env.local` with `NEXT_PUBLIC_COMETCHAT_APP_ID`, `NEXT_PUBLIC_COMETCHAT_REGION`, `NEXT_PUBLIC_COMETCHAT_AUTH_KEY`
855
- 3. Import `@cometchat/chat-uikit-react/css-variables.css` in `app/globals.css`
856
- 4. Create `app/providers/CometChatProvider.tsx` with `"use client"` (section 3)
857
- 5. Mount `CometChatProvider` in `app/layout.tsx` wrapping `{children}`
858
- 6. Create `app/messages/page.tsx` with `"use client"` (section 5)
859
- 7. Add a `<Link href="/messages">Messages</Link>` to the layout's nav
860
- 8. Verify: `npm run build` should succeed without SSR errors
861
-
862
- ## 13. Complete integration checklist (Pages Router)
863
-
864
- 1. Install packages: `npm install @cometchat/chat-uikit-react@^6 @cometchat/chat-sdk-javascript@^4` — **⚠️ keep the `@^6` major pin; never install bare.** v7 is on npm — a bare `npm install @cometchat/chat-uikit-react` pulls it once it's tagged `latest`, and these v6 skills break against the v7 API.
865
- 2. Create `.env.local` with `NEXT_PUBLIC_COMETCHAT_APP_ID`, `NEXT_PUBLIC_COMETCHAT_REGION`, `NEXT_PUBLIC_COMETCHAT_AUTH_KEY`
866
- 3. Import `@cometchat/chat-uikit-react/css-variables.css` in `pages/_app.tsx`
867
- 4. Create `components/CometChatProvider.tsx` (section 3 code, without `"use client"`)
868
- 5. Dynamically import `CometChatProvider` in `pages/_app.tsx` with `ssr: false` (section 4)
869
- 6. Create `pages/messages.tsx` with dynamic import (section 6)
870
- 7. Add a `<Link href="/messages">Messages</Link>` to the layout's nav
871
- 8. Verify: `npm run build` should succeed without SSR errors
872
-
873
- ## 14. Visual Builder integration (v4.3)
874
-
875
- If the customer picks **Visually** in dispatcher Step 3.1, the Next.js recipe diverges based on App Router vs Pages Router. Skills runs `cometchat builder export --platform react --output <target>` to download the canonical `src/CometChat/` + patch settings in one step.
876
-
877
- **Full recipe lives in `cometchat-core` §11 "Visual Builder integration".** This section is a pointer + Next.js-specific gotchas:
878
-
879
- ### App Router (recommended for Visual Builder)
880
-
881
- - Run `cometchat builder export --platform react --output src/app/CometChat --json`.
882
- - Create `src/app/CometChatNoSSR/CometChatNoSSR.tsx` (client component, init + login + render).
883
- - Create `src/app/CometChatAppWrapper.tsx` with `"use client"` + `dynamic(() => import("../app/CometChatNoSSR/CometChatNoSSR"), { ssr: false })`.
884
- - Import the wrapper in `src/app/page.tsx`.
885
- - **Patch `src/app/CometChat/context/CometChatContext.tsx`** to use `'../../../../package.json'` (4 levels up) instead of canonical's `'../../../package.json'` (3 levels). **Finding F16** — depth differs because the directory moved into `src/app/`.
886
-
887
- ### Pages Router (NOT recommended)
888
-
889
- **Finding F17** (2026-05-22): Next.js Pages Router enforces "global CSS imports only in `pages/_app.tsx`". The canonical `src/CometChat/` has 25+ component-level CSS imports — Pages Router rejects the build. App Router tolerates this; Pages Router does not. Recommend App Router instead.
890
-
891
- If a customer insists on Pages Router + Visual Builder, the only workaround is to convert all 25+ canonical CSS files into CSS Modules — heavy customer-side work. Not validated in v4.3.0.
892
-
893
- ### Both routers
894
-
895
- - Use `process.env.NEXT_PUBLIC_COMETCHAT_*` (NOT `import.meta.env.*` which is Vite-only).
896
- - Pin `@cometchat/chat-uikit-react@6.4.3` + `@cometchat/calls-sdk-javascript@4.2.5`.
897
- - `package.json` needs `cometChatCustomConfig` block (Finding F2).
898
-
899
- If the customer picks **In code**, ignore this section.