@cometchat/skills 4.4.2 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) 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/LICENSE +21 -0
  5. package/README.md +41 -163
  6. package/RULES.md +114 -0
  7. package/bin/cometchat-skills.mjs +1180 -0
  8. package/bin/legacy-skills.json +95 -0
  9. package/catalogs/android-v6.json +1646 -0
  10. package/catalogs/flutter-v6.json +651 -0
  11. package/catalogs/ios-v5.json +1383 -0
  12. package/catalogs/rn-calls-v5.json +134 -0
  13. package/catalogs/rn-calls-v5.symbols.txt +58 -0
  14. package/catalogs/rn-sdk-v4.json +672 -0
  15. package/catalogs/rn-v5.json +449 -0
  16. package/catalogs/rn-v5.symbols.txt +216 -0
  17. package/catalogs/sdk-android-v5.json +514 -0
  18. package/contracts.android-calls-v5.json +122 -0
  19. package/contracts.android-v6.json +135 -0
  20. package/contracts.angular-v5.json +694 -0
  21. package/contracts.flutter-calls-v5.json +77 -0
  22. package/contracts.flutter-v6.json +126 -0
  23. package/contracts.ios-calls-v5.json +67 -0
  24. package/contracts.ios-v5.json +436 -0
  25. package/contracts.json +82 -0
  26. package/contracts.rn-calls-v5.json +77 -0
  27. package/contracts.rn-v5.json +727 -0
  28. package/contracts.sdk-android-v5.json +15 -0
  29. package/contracts.web-calls-v5.json +45 -0
  30. package/features.android-calls-v5.json +246 -0
  31. package/features.android-v6.json +65 -0
  32. package/features.angular-v5.json +521 -0
  33. package/features.flutter-calls-v5.json +286 -0
  34. package/features.flutter-v6.json +484 -0
  35. package/features.ios-calls-v5.json +236 -0
  36. package/features.ios-v5.json +573 -0
  37. package/features.json +61 -0
  38. package/features.rn-calls-v5.json +187 -0
  39. package/features.rn-v5.json +614 -0
  40. package/features.sdk-android-v5.json +40 -0
  41. package/features.sdk-jsv4.json +24 -0
  42. package/features.web-calls-v5.json +108 -0
  43. package/package.json +151 -74
  44. package/peers.yaml +312 -0
  45. package/registry/README.md +31 -0
  46. package/registry/android-calls-v5.json +54 -0
  47. package/registry/android-v6.json +137 -0
  48. package/registry/angular-v5.json +114 -0
  49. package/registry/flutter-calls-v5.json +54 -0
  50. package/registry/flutter-v6.json +119 -0
  51. package/registry/ios-calls-v5.json +59 -0
  52. package/registry/ios-v5.json +97 -0
  53. package/registry/rn-calls-v5.json +59 -0
  54. package/registry/rn-v5.json +129 -0
  55. package/registry/sdk-android-v5.json +53 -0
  56. package/registry/sdk-jsv4.json +53 -0
  57. package/registry/web-calls-v5.json +54 -0
  58. package/registry/web-v7.json +99 -0
  59. package/skills/cometchat/SKILL.md +42 -2096
  60. package/skills/cometchat-android-v5-calls-sdk/SKILL.md +206 -0
  61. package/skills/cometchat-android-v5-calls-sdk/references/build-truth.md +63 -0
  62. package/skills/cometchat-android-v5-calls-sdk/references/docs-map.md +119 -0
  63. package/skills/cometchat-android-v5-calls-sdk/references/method-map.md +53 -0
  64. package/skills/cometchat-android-v5-calls-sdk/references/pitfalls.md +72 -0
  65. package/skills/cometchat-android-v5-calls-sdk/references/ringing.md +92 -0
  66. package/skills/cometchat-android-v5-calls-sdk/references/user-switch.md +90 -0
  67. package/skills/cometchat-android-v5-sdk/SKILL.md +127 -0
  68. package/skills/cometchat-android-v5-sdk/references/app-surface.md +88 -0
  69. package/skills/cometchat-android-v5-sdk/references/docs-map.md +91 -0
  70. package/skills/cometchat-android-v6-builder-settings/SKILL.md +51 -137
  71. package/skills/cometchat-android-v6-calls/SKILL.md +128 -413
  72. package/skills/cometchat-android-v6-compose-components/SKILL.md +84 -194
  73. package/skills/cometchat-android-v6-compose-customization/SKILL.md +66 -411
  74. package/skills/cometchat-android-v6-compose-placement/SKILL.md +154 -237
  75. package/skills/cometchat-android-v6-core/SKILL.md +236 -672
  76. package/skills/cometchat-android-v6-core/references/anti-patterns.md +31 -0
  77. package/skills/cometchat-android-v6-core/references/component-props.md +168 -0
  78. package/skills/cometchat-android-v6-core/references/docs-map.md +153 -0
  79. package/skills/cometchat-android-v6-core/references/layout.md +112 -0
  80. package/skills/cometchat-android-v6-core/references/lifecycle.md +75 -0
  81. package/skills/cometchat-android-v6-core/references/setup-credentials.md +105 -0
  82. package/skills/cometchat-android-v6-core/references/troubleshooting.md +36 -0
  83. package/skills/cometchat-android-v6-events/SKILL.md +46 -184
  84. package/skills/cometchat-android-v6-extensions/SKILL.md +39 -179
  85. package/skills/cometchat-android-v6-features/SKILL.md +74 -143
  86. package/skills/cometchat-android-v6-kotlin-components/SKILL.md +75 -193
  87. package/skills/cometchat-android-v6-kotlin-customization/SKILL.md +67 -419
  88. package/skills/cometchat-android-v6-kotlin-placement/SKILL.md +77 -223
  89. package/skills/cometchat-android-v6-migration/SKILL.md +67 -378
  90. package/skills/cometchat-android-v6-production/SKILL.md +40 -179
  91. package/skills/cometchat-android-v6-push/SKILL.md +39 -289
  92. package/skills/cometchat-android-v6-testing/SKILL.md +50 -265
  93. package/skills/cometchat-android-v6-troubleshooting/SKILL.md +70 -254
  94. package/skills/cometchat-angular-v5-calls/SKILL.md +193 -0
  95. package/skills/cometchat-angular-v5-components/SKILL.md +131 -0
  96. package/skills/cometchat-angular-v5-components/references/catalog.md +111 -0
  97. package/skills/cometchat-angular-v5-components/references/host-composed.md +46 -0
  98. package/skills/cometchat-angular-v5-core/SKILL.md +300 -0
  99. package/skills/cometchat-angular-v5-core/references/anti-patterns.md +49 -0
  100. package/skills/cometchat-angular-v5-core/references/component-props.md +55 -0
  101. package/skills/cometchat-angular-v5-core/references/dependencies.md +66 -0
  102. package/skills/cometchat-angular-v5-core/references/docs-map.md +132 -0
  103. package/skills/cometchat-angular-v5-core/references/layout.md +64 -0
  104. package/skills/cometchat-angular-v5-core/references/lifecycle.md +202 -0
  105. package/skills/cometchat-angular-v5-core/references/setup-credentials.md +137 -0
  106. package/skills/cometchat-angular-v5-core/references/theming.md +70 -0
  107. package/skills/cometchat-angular-v5-core/references/troubleshooting.md +27 -0
  108. package/skills/cometchat-angular-v5-customization/SKILL.md +94 -0
  109. package/skills/cometchat-angular-v5-features/SKILL.md +107 -0
  110. package/skills/cometchat-angular-v5-features/references/custom-messages.md +133 -0
  111. package/skills/cometchat-angular-v5-features/references/formatters.md +28 -0
  112. package/skills/cometchat-angular-v5-features/references/host-composed-extensions.md +85 -0
  113. package/skills/cometchat-angular-v5-migration/SKILL.md +40 -0
  114. package/skills/cometchat-angular-v5-migration/references/migration-guide.md +165 -0
  115. package/skills/cometchat-angular-v5-patterns/SKILL.md +107 -0
  116. package/skills/cometchat-angular-v5-placement/SKILL.md +133 -0
  117. package/skills/cometchat-angular-v5-placement/references/combined-app.md +174 -0
  118. package/skills/cometchat-angular-v5-placement/references/core-surface.md +199 -0
  119. package/skills/cometchat-angular-v5-production/SKILL.md +101 -0
  120. package/skills/cometchat-angular-v5-push/SKILL.md +61 -0
  121. package/skills/cometchat-angular-v5-testing/SKILL.md +112 -0
  122. package/skills/cometchat-angular-v5-troubleshooting/SKILL.md +96 -0
  123. package/skills/cometchat-flutter-v5-sdk/SKILL.md +188 -0
  124. package/skills/cometchat-flutter-v5-sdk/references/doc-corrections.md +55 -0
  125. package/skills/cometchat-flutter-v5-sdk/references/docs-map.md +211 -0
  126. package/skills/cometchat-flutter-v5-sdk/references/platform-notes.md +48 -0
  127. package/skills/cometchat-flutter-v5-sdk/references/transcription.md +87 -0
  128. package/skills/cometchat-flutter-v6-calls/SKILL.md +75 -389
  129. package/skills/cometchat-flutter-v6-components/SKILL.md +88 -361
  130. package/skills/cometchat-flutter-v6-core/SKILL.md +154 -593
  131. package/skills/cometchat-flutter-v6-core/references/anti-patterns.md +55 -0
  132. package/skills/cometchat-flutter-v6-core/references/docs-map.md +143 -0
  133. package/skills/cometchat-flutter-v6-core/references/layout.md +45 -0
  134. package/skills/cometchat-flutter-v6-core/references/lifecycle.md +87 -0
  135. package/skills/cometchat-flutter-v6-core/references/setup-credentials.md +84 -0
  136. package/skills/cometchat-flutter-v6-core/references/troubleshooting.md +26 -0
  137. package/skills/cometchat-flutter-v6-customization/SKILL.md +70 -712
  138. package/skills/cometchat-flutter-v6-events/SKILL.md +79 -174
  139. package/skills/cometchat-flutter-v6-features/SKILL.md +55 -394
  140. package/skills/cometchat-flutter-v6-migration/SKILL.md +68 -367
  141. package/skills/cometchat-flutter-v6-migration/references/migration-guide.md +131 -0
  142. package/skills/cometchat-flutter-v6-patterns/SKILL.md +61 -0
  143. package/skills/cometchat-flutter-v6-placement/SKILL.md +94 -381
  144. package/skills/cometchat-flutter-v6-production/SKILL.md +58 -615
  145. package/skills/cometchat-flutter-v6-push/SKILL.md +46 -455
  146. package/skills/cometchat-flutter-v6-testing/SKILL.md +68 -299
  147. package/skills/cometchat-flutter-v6-troubleshooting/SKILL.md +54 -878
  148. package/skills/cometchat-ios-calls/SKILL.md +112 -563
  149. package/skills/cometchat-ios-components/SKILL.md +44 -834
  150. package/skills/cometchat-ios-core/SKILL.md +181 -1068
  151. package/skills/cometchat-ios-core/references/anti-patterns.md +80 -0
  152. package/skills/cometchat-ios-core/references/docs-map.md +123 -0
  153. package/skills/cometchat-ios-core/references/install.md +23 -0
  154. package/skills/cometchat-ios-core/references/layout.md +186 -0
  155. package/skills/cometchat-ios-core/references/setup-credentials.md +197 -0
  156. package/skills/cometchat-ios-core/references/swiftui.md +91 -0
  157. package/skills/cometchat-ios-core/references/troubleshooting.md +100 -0
  158. package/skills/cometchat-ios-customization/SKILL.md +33 -968
  159. package/skills/cometchat-ios-features/SKILL.md +29 -738
  160. package/skills/cometchat-ios-migration/SKILL.md +39 -0
  161. package/skills/cometchat-ios-placement/SKILL.md +51 -729
  162. package/skills/cometchat-ios-push/SKILL.md +24 -602
  163. package/skills/cometchat-ios-v5-sdk/SKILL.md +161 -0
  164. package/skills/cometchat-ios-v5-sdk/references/docs-map.md +326 -0
  165. package/skills/cometchat-js-v5-sdk/SKILL.md +95 -0
  166. package/skills/cometchat-js-v5-sdk/references/docs-map.md +114 -0
  167. package/skills/cometchat-onboarding/SKILL.md +89 -0
  168. package/skills/cometchat-onboarding/references/archetypes.md +51 -0
  169. package/skills/cometchat-onboarding/references/calling-first.md +77 -0
  170. package/skills/cometchat-onboarding/references/not-in-this-pack.md +8 -0
  171. package/skills/cometchat-onboarding/references/plan-artifact.md +133 -0
  172. package/skills/cometchat-onboarding/references/platforms.md +90 -0
  173. package/skills/cometchat-react-native-bare-patterns/SKILL.md +120 -0
  174. package/skills/cometchat-react-native-calls/SKILL.md +200 -0
  175. package/skills/cometchat-react-native-components/SKILL.md +142 -0
  176. package/skills/cometchat-react-native-core/SKILL.md +313 -0
  177. package/skills/cometchat-react-native-core/references/anti-patterns.md +79 -0
  178. package/skills/cometchat-react-native-core/references/component-props.md +105 -0
  179. package/skills/cometchat-react-native-core/references/dependencies.md +62 -0
  180. package/skills/cometchat-react-native-core/references/docs-map.md +126 -0
  181. package/skills/cometchat-react-native-core/references/layout.md +61 -0
  182. package/skills/cometchat-react-native-core/references/lifecycle.md +64 -0
  183. package/skills/cometchat-react-native-core/references/setup-credentials.md +39 -0
  184. package/skills/cometchat-react-native-customization/SKILL.md +198 -0
  185. package/skills/cometchat-react-native-expo-patterns/SKILL.md +116 -0
  186. package/skills/cometchat-react-native-features/SKILL.md +122 -0
  187. package/skills/cometchat-react-native-migration/SKILL.md +103 -0
  188. package/skills/cometchat-react-native-placement/SKILL.md +158 -0
  189. package/skills/cometchat-react-native-production/SKILL.md +78 -0
  190. package/skills/cometchat-react-native-push/SKILL.md +88 -0
  191. package/skills/cometchat-react-native-sdk/SKILL.md +126 -0
  192. package/skills/cometchat-react-native-sdk/references/method-map.md +239 -0
  193. package/skills/cometchat-react-native-sdk/references/page-map.md +96 -0
  194. package/skills/cometchat-react-native-testing/SKILL.md +94 -0
  195. package/skills/cometchat-react-native-troubleshooting/SKILL.md +116 -0
  196. package/skills/cometchat-react-native-v5-sdk/SKILL.md +150 -0
  197. package/skills/cometchat-react-native-v5-sdk/references/docs-map.md +127 -0
  198. package/skills/cometchat-react-native-v5-sdk/references/ringing-voip.md +369 -0
  199. package/skills/cometchat-react-v7-calls/SKILL.md +75 -0
  200. package/skills/cometchat-react-v7-components/SKILL.md +72 -0
  201. package/skills/cometchat-react-v7-core/SKILL.md +101 -0
  202. package/skills/cometchat-react-v7-core/references/anti-patterns.md +19 -0
  203. package/skills/cometchat-react-v7-core/references/component-props.md +82 -0
  204. package/skills/cometchat-react-v7-core/references/dependencies.md +23 -0
  205. package/skills/cometchat-react-v7-core/references/docs-map.md +117 -0
  206. package/skills/cometchat-react-v7-core/references/i18n-rtl-a11y.md +22 -0
  207. package/skills/cometchat-react-v7-core/references/layout.md +158 -0
  208. package/skills/cometchat-react-v7-core/references/lifecycle.md +74 -0
  209. package/skills/cometchat-react-v7-core/references/setup-credentials.md +58 -0
  210. package/skills/cometchat-react-v7-core/references/ssr.md +11 -0
  211. package/skills/cometchat-react-v7-core/references/theming.md +52 -0
  212. package/skills/cometchat-react-v7-core/references/troubleshooting.md +28 -0
  213. package/skills/cometchat-react-v7-customization/SKILL.md +84 -0
  214. package/skills/cometchat-react-v7-features/SKILL.md +92 -0
  215. package/skills/cometchat-react-v7-migration/SKILL.md +39 -0
  216. package/skills/cometchat-react-v7-migration/references/migration-guide.md +119 -0
  217. package/skills/cometchat-react-v7-patterns/SKILL.md +43 -0
  218. package/skills/cometchat-react-v7-placement/SKILL.md +106 -0
  219. package/skills/cometchat-react-v7-placement/references/recipes.md +354 -0
  220. package/skills/cometchat-react-v7-push/SKILL.md +53 -0
  221. package/test-suite/README.md +70 -0
  222. package/test-suite/catalogs/android-calls-v5.json +830 -0
  223. package/test-suite/catalogs/android-calls-v5.symbols.txt +499 -0
  224. package/test-suite/catalogs/android-v6.json +1646 -0
  225. package/test-suite/catalogs/android-v6.symbols.txt +298 -0
  226. package/test-suite/catalogs/angular-v5.json +7587 -0
  227. package/test-suite/catalogs/flutter-calls-v5.json +196 -0
  228. package/test-suite/catalogs/flutter-calls-v5.symbols.txt +59 -0
  229. package/test-suite/catalogs/flutter-v6.json +651 -0
  230. package/test-suite/catalogs/ios-calls-v5.json +158 -0
  231. package/test-suite/catalogs/ios-calls-v5.symbols.txt +70 -0
  232. package/test-suite/catalogs/ios-v5.json +1383 -0
  233. package/test-suite/catalogs/ios-v5.symbols.txt +699 -0
  234. package/test-suite/catalogs/rn-calls-v5.json +134 -0
  235. package/test-suite/catalogs/rn-sdk-v4.json +672 -0
  236. package/test-suite/catalogs/rn-v5.json +449 -0
  237. package/test-suite/catalogs/sdk-android-v5.json +514 -0
  238. package/test-suite/catalogs/sdk-android-v5.symbols.txt +254 -0
  239. package/test-suite/catalogs/sdk-jsv4.json +800 -0
  240. package/test-suite/catalogs/web-calls-v5.json +195 -0
  241. package/test-suite/catalogs/web-v7.json +1243 -0
  242. package/test-suite/scripts/build-registry.mjs +113 -0
  243. package/test-suite/scripts/catalog-refresh-dart.mjs +151 -0
  244. package/test-suite/scripts/catalog-refresh.mjs +100 -0
  245. package/test-suite/scripts/lint-skills.mjs +909 -0
  246. package/test-suite/scripts/measure-tokens.mjs +169 -0
  247. package/test-suite/scripts/typecheck-fences-dart.mjs +437 -0
  248. package/test-suite/scripts/typecheck-fences-kotlin.mjs +269 -0
  249. package/test-suite/scripts/typecheck-fences.mjs +206 -0
  250. package/test-suite/scripts/verify-catalog.mjs +242 -0
  251. package/test-suite/scripts/verify-contract-fences.mjs +94 -0
  252. package/test-suite/scripts/verify-detection.mjs +178 -0
  253. package/test-suite/scripts/verify-docs-base.mjs +91 -0
  254. package/test-suite/scripts/verify-family-agnostic.mjs +130 -0
  255. package/test-suite/scripts/verify-golden-path.mjs +138 -0
  256. package/test-suite/scripts/verify-oracle-components.mjs +133 -0
  257. package/test-suite/scripts/verify-template-bindings.mjs +148 -0
  258. package/test-suite/typecheck/angular-v5/package.json +21 -0
  259. package/test-suite/typecheck/angular-v5/tsconfig.json +21 -0
  260. package/test-suite/typecheck/flutter-v6/analysis_options.yaml +25 -0
  261. package/test-suite/typecheck/flutter-v6/pubspec.yaml +21 -0
  262. package/test-suite/typecheck/web-v7/package.json +18 -0
  263. package/test-suite/typecheck/web-v7/tsconfig.json +19 -0
  264. package/bin/install.js +0 -1003
  265. package/skills/.claude-plugin/marketplace.json +0 -86
  266. package/skills/cometchat/references/asking-questions.md +0 -48
  267. package/skills/cometchat-a11y/SKILL.md +0 -477
  268. package/skills/cometchat-android-v5/SKILL.md +0 -121
  269. package/skills/cometchat-android-v5-calls/SKILL.md +0 -429
  270. package/skills/cometchat-android-v5-calls/references/README.md +0 -53
  271. package/skills/cometchat-android-v5-calls/references/add-calls-to-existing-chat.md +0 -197
  272. package/skills/cometchat-android-v5-calls/references/audio-controls.md +0 -91
  273. package/skills/cometchat-android-v5-calls/references/background-handling.md +0 -168
  274. package/skills/cometchat-android-v5-calls/references/call-layouts.md +0 -131
  275. package/skills/cometchat-android-v5-calls/references/call-logs.md +0 -113
  276. package/skills/cometchat-android-v5-calls/references/call-session.md +0 -274
  277. package/skills/cometchat-android-v5-calls/references/custom-ui.md +0 -150
  278. package/skills/cometchat-android-v5-calls/references/event-listeners.md +0 -123
  279. package/skills/cometchat-android-v5-calls/references/group-calls.md +0 -205
  280. package/skills/cometchat-android-v5-calls/references/idle-timeout.md +0 -117
  281. package/skills/cometchat-android-v5-calls/references/in-call-chat.md +0 -134
  282. package/skills/cometchat-android-v5-calls/references/join-session.md +0 -120
  283. package/skills/cometchat-android-v5-calls/references/migration-v4-to-v5.md +0 -222
  284. package/skills/cometchat-android-v5-calls/references/participant-management.md +0 -110
  285. package/skills/cometchat-android-v5-calls/references/picture-in-picture.md +0 -106
  286. package/skills/cometchat-android-v5-calls/references/raise-hand.md +0 -248
  287. package/skills/cometchat-android-v5-calls/references/recording.md +0 -101
  288. package/skills/cometchat-android-v5-calls/references/ringing-integration.md +0 -152
  289. package/skills/cometchat-android-v5-calls/references/screen-sharing.md +0 -78
  290. package/skills/cometchat-android-v5-calls/references/server-fcm-voip.md +0 -215
  291. package/skills/cometchat-android-v5-calls/references/session-settings.md +0 -121
  292. package/skills/cometchat-android-v5-calls/references/setup.md +0 -137
  293. package/skills/cometchat-android-v5-calls/references/share-invite.md +0 -156
  294. package/skills/cometchat-android-v5-calls/references/video-controls.md +0 -87
  295. package/skills/cometchat-android-v5-calls/references/voip-calling.md +0 -526
  296. package/skills/cometchat-android-v5-components/SKILL.md +0 -431
  297. package/skills/cometchat-android-v5-core/SKILL.md +0 -486
  298. package/skills/cometchat-android-v5-customization/SKILL.md +0 -469
  299. package/skills/cometchat-android-v5-extensions/SKILL.md +0 -127
  300. package/skills/cometchat-android-v5-features/SKILL.md +0 -131
  301. package/skills/cometchat-android-v5-placement/SKILL.md +0 -277
  302. package/skills/cometchat-android-v5-production/SKILL.md +0 -95
  303. package/skills/cometchat-android-v5-push/SKILL.md +0 -619
  304. package/skills/cometchat-android-v5-testing/SKILL.md +0 -188
  305. package/skills/cometchat-android-v5-theming/SKILL.md +0 -167
  306. package/skills/cometchat-android-v5-troubleshooting/SKILL.md +0 -74
  307. package/skills/cometchat-android-v6/SKILL.md +0 -108
  308. package/skills/cometchat-android-v6-calls/references/add-calls-to-existing-chat.md +0 -97
  309. package/skills/cometchat-android-v6-calls/references/advanced-features.md +0 -87
  310. package/skills/cometchat-android-v6-calls/references/call-layouts.md +0 -100
  311. package/skills/cometchat-android-v6-calls/references/call-session.md +0 -163
  312. package/skills/cometchat-android-v6-calls/references/device-management.md +0 -172
  313. package/skills/cometchat-android-v6-calls/references/group-calls.md +0 -191
  314. package/skills/cometchat-android-v6-calls/references/idle-timeout.md +0 -110
  315. package/skills/cometchat-android-v6-calls/references/in-call-chat.md +0 -141
  316. package/skills/cometchat-android-v6-calls/references/raise-hand.md +0 -188
  317. package/skills/cometchat-android-v6-calls/references/ringing-integration.md +0 -176
  318. package/skills/cometchat-android-v6-calls/references/server-fcm-voip.md +0 -127
  319. package/skills/cometchat-android-v6-calls/references/share-invite.md +0 -105
  320. package/skills/cometchat-android-v6-compose-theming/SKILL.md +0 -250
  321. package/skills/cometchat-android-v6-kotlin-theming/SKILL.md +0 -233
  322. package/skills/cometchat-angular-calls/SKILL.md +0 -380
  323. package/skills/cometchat-angular-calls/references/add-calls-to-existing-chat.md +0 -96
  324. package/skills/cometchat-angular-calls/references/call-layouts.md +0 -123
  325. package/skills/cometchat-angular-calls/references/call-session.md +0 -167
  326. package/skills/cometchat-angular-calls/references/custom-ui.md +0 -239
  327. package/skills/cometchat-angular-calls/references/device-management.md +0 -154
  328. package/skills/cometchat-angular-calls/references/group-calls.md +0 -433
  329. package/skills/cometchat-angular-calls/references/idle-timeout.md +0 -161
  330. package/skills/cometchat-angular-calls/references/in-call-chat.md +0 -148
  331. package/skills/cometchat-angular-calls/references/lazy-loading-pitfalls.md +0 -205
  332. package/skills/cometchat-angular-calls/references/migration-v4-to-v5.md +0 -53
  333. package/skills/cometchat-angular-calls/references/ngzone-and-async-callbacks.md +0 -184
  334. package/skills/cometchat-angular-calls/references/picture-in-picture.md +0 -285
  335. package/skills/cometchat-angular-calls/references/raise-hand.md +0 -172
  336. package/skills/cometchat-angular-calls/references/recording-screen-share.md +0 -260
  337. package/skills/cometchat-angular-calls/references/ringing-integration.md +0 -133
  338. package/skills/cometchat-angular-calls/references/server-web-push-vapid.md +0 -100
  339. package/skills/cometchat-angular-calls/references/share-invite.md +0 -122
  340. package/skills/cometchat-angular-calls/references/virtual-background.md +0 -29
  341. package/skills/cometchat-angular-components/SKILL.md +0 -235
  342. package/skills/cometchat-angular-core/SKILL.md +0 -386
  343. package/skills/cometchat-angular-customization/SKILL.md +0 -616
  344. package/skills/cometchat-angular-features/SKILL.md +0 -329
  345. package/skills/cometchat-angular-patterns/SKILL.md +0 -256
  346. package/skills/cometchat-angular-placement/SKILL.md +0 -314
  347. package/skills/cometchat-angular-production/SKILL.md +0 -564
  348. package/skills/cometchat-angular-push/SKILL.md +0 -389
  349. package/skills/cometchat-angular-testing/SKILL.md +0 -605
  350. package/skills/cometchat-angular-theming/SKILL.md +0 -290
  351. package/skills/cometchat-angular-troubleshooting/SKILL.md +0 -364
  352. package/skills/cometchat-astro-patterns/SKILL.md +0 -708
  353. package/skills/cometchat-calls/SKILL.md +0 -364
  354. package/skills/cometchat-calls/references/use-case-broadcast.md +0 -199
  355. package/skills/cometchat-calls/references/use-case-marketplace.md +0 -157
  356. package/skills/cometchat-calls/references/use-case-support.md +0 -189
  357. package/skills/cometchat-calls/references/use-case-team.md +0 -180
  358. package/skills/cometchat-calls/references/use-case-telehealth.md +0 -153
  359. package/skills/cometchat-components/SKILL.md +0 -1142
  360. package/skills/cometchat-core/SKILL.md +0 -1048
  361. package/skills/cometchat-customization/SKILL.md +0 -580
  362. package/skills/cometchat-customization/references/component-catalog.md +0 -236
  363. package/skills/cometchat-features/SKILL.md +0 -861
  364. package/skills/cometchat-flutter-v5/SKILL.md +0 -173
  365. package/skills/cometchat-flutter-v5-calls/SKILL.md +0 -455
  366. package/skills/cometchat-flutter-v5-calls/references/add-calls-to-existing-chat.md +0 -193
  367. package/skills/cometchat-flutter-v5-calls/references/call-layouts.md +0 -103
  368. package/skills/cometchat-flutter-v5-calls/references/call-session.md +0 -285
  369. package/skills/cometchat-flutter-v5-calls/references/device-management.md +0 -124
  370. package/skills/cometchat-flutter-v5-calls/references/group-calls.md +0 -181
  371. package/skills/cometchat-flutter-v5-calls/references/idle-timeout.md +0 -99
  372. package/skills/cometchat-flutter-v5-calls/references/in-call-chat.md +0 -135
  373. package/skills/cometchat-flutter-v5-calls/references/migration-v4-to-v5.md +0 -210
  374. package/skills/cometchat-flutter-v5-calls/references/raise-hand.md +0 -255
  375. package/skills/cometchat-flutter-v5-calls/references/ringing-integration.md +0 -196
  376. package/skills/cometchat-flutter-v5-calls/references/server-push-bridge.md +0 -101
  377. package/skills/cometchat-flutter-v5-calls/references/share-invite.md +0 -148
  378. package/skills/cometchat-flutter-v5-conversations/SKILL.md +0 -118
  379. package/skills/cometchat-flutter-v5-core/SKILL.md +0 -239
  380. package/skills/cometchat-flutter-v5-customization/SKILL.md +0 -358
  381. package/skills/cometchat-flutter-v5-events/SKILL.md +0 -156
  382. package/skills/cometchat-flutter-v5-messages/SKILL.md +0 -259
  383. package/skills/cometchat-flutter-v5-production/SKILL.md +0 -216
  384. package/skills/cometchat-flutter-v5-push/SKILL.md +0 -285
  385. package/skills/cometchat-flutter-v5-testing/SKILL.md +0 -401
  386. package/skills/cometchat-flutter-v5-theming/SKILL.md +0 -161
  387. package/skills/cometchat-flutter-v5-troubleshooting/SKILL.md +0 -130
  388. package/skills/cometchat-flutter-v5-users-groups/SKILL.md +0 -152
  389. package/skills/cometchat-flutter-v6/SKILL.md +0 -446
  390. package/skills/cometchat-flutter-v6-calls/references/add-calls-to-existing-chat.md +0 -136
  391. package/skills/cometchat-flutter-v6-calls/references/advanced-features.md +0 -89
  392. package/skills/cometchat-flutter-v6-calls/references/call-layouts.md +0 -105
  393. package/skills/cometchat-flutter-v6-calls/references/call-session.md +0 -229
  394. package/skills/cometchat-flutter-v6-calls/references/device-management.md +0 -105
  395. package/skills/cometchat-flutter-v6-calls/references/group-calls.md +0 -190
  396. package/skills/cometchat-flutter-v6-calls/references/idle-timeout.md +0 -88
  397. package/skills/cometchat-flutter-v6-calls/references/in-call-chat.md +0 -125
  398. package/skills/cometchat-flutter-v6-calls/references/raise-hand.md +0 -275
  399. package/skills/cometchat-flutter-v6-calls/references/ringing-integration.md +0 -171
  400. package/skills/cometchat-flutter-v6-calls/references/server-push-bridge.md +0 -93
  401. package/skills/cometchat-flutter-v6-calls/references/share-invite.md +0 -102
  402. package/skills/cometchat-flutter-v6-conversations/SKILL.md +0 -238
  403. package/skills/cometchat-flutter-v6-messages/SKILL.md +0 -384
  404. package/skills/cometchat-flutter-v6-theming/SKILL.md +0 -293
  405. package/skills/cometchat-flutter-v6-users-groups/SKILL.md +0 -224
  406. package/skills/cometchat-i18n/SKILL.md +0 -419
  407. package/skills/cometchat-ios/SKILL.md +0 -325
  408. package/skills/cometchat-ios-calls/references/add-calls-to-existing-chat.md +0 -181
  409. package/skills/cometchat-ios-calls/references/audio-modes-and-controls.md +0 -45
  410. package/skills/cometchat-ios-calls/references/avaudiosession-routing.md +0 -188
  411. package/skills/cometchat-ios-calls/references/call-layouts.md +0 -76
  412. package/skills/cometchat-ios-calls/references/call-session.md +0 -218
  413. package/skills/cometchat-ios-calls/references/callkit-and-pushkit.md +0 -357
  414. package/skills/cometchat-ios-calls/references/custom-ui.md +0 -322
  415. package/skills/cometchat-ios-calls/references/device-management.md +0 -171
  416. package/skills/cometchat-ios-calls/references/group-calls.md +0 -359
  417. package/skills/cometchat-ios-calls/references/idle-timeout.md +0 -184
  418. package/skills/cometchat-ios-calls/references/in-call-chat.md +0 -179
  419. package/skills/cometchat-ios-calls/references/migration-v4-to-v5.md +0 -196
  420. package/skills/cometchat-ios-calls/references/picture-in-picture.md +0 -246
  421. package/skills/cometchat-ios-calls/references/raise-hand.md +0 -26
  422. package/skills/cometchat-ios-calls/references/recording-screen-share.md +0 -252
  423. package/skills/cometchat-ios-calls/references/ringing-integration.md +0 -143
  424. package/skills/cometchat-ios-calls/references/server-apns-pushkit.md +0 -267
  425. package/skills/cometchat-ios-calls/references/share-invite.md +0 -148
  426. package/skills/cometchat-ios-calls/references/swiftui-uikit-hosting.md +0 -246
  427. package/skills/cometchat-ios-calls/references/voip-cert-setup.md +0 -166
  428. package/skills/cometchat-ios-production/SKILL.md +0 -738
  429. package/skills/cometchat-ios-testing/SKILL.md +0 -376
  430. package/skills/cometchat-ios-theming/SKILL.md +0 -667
  431. package/skills/cometchat-ios-troubleshooting/SKILL.md +0 -1003
  432. package/skills/cometchat-native-bare-patterns/SKILL.md +0 -550
  433. package/skills/cometchat-native-calls/SKILL.md +0 -671
  434. package/skills/cometchat-native-calls/references/add-calls-to-existing-chat.md +0 -203
  435. package/skills/cometchat-native-calls/references/call-layouts.md +0 -125
  436. package/skills/cometchat-native-calls/references/call-session.md +0 -182
  437. package/skills/cometchat-native-calls/references/custom-ui.md +0 -254
  438. package/skills/cometchat-native-calls/references/device-management.md +0 -158
  439. package/skills/cometchat-native-calls/references/expo-vs-bare.md +0 -179
  440. package/skills/cometchat-native-calls/references/group-calls.md +0 -296
  441. package/skills/cometchat-native-calls/references/idle-timeout.md +0 -128
  442. package/skills/cometchat-native-calls/references/in-call-chat.md +0 -145
  443. package/skills/cometchat-native-calls/references/migration-v4-to-v5.md +0 -72
  444. package/skills/cometchat-native-calls/references/picture-in-picture.md +0 -276
  445. package/skills/cometchat-native-calls/references/raise-hand.md +0 -205
  446. package/skills/cometchat-native-calls/references/recording-screen-share.md +0 -169
  447. package/skills/cometchat-native-calls/references/ringing-integration.md +0 -118
  448. package/skills/cometchat-native-calls/references/server-push-bridge.md +0 -135
  449. package/skills/cometchat-native-calls/references/server-push-payloads.md +0 -193
  450. package/skills/cometchat-native-calls/references/share-invite.md +0 -146
  451. package/skills/cometchat-native-calls/references/voip-push-end-to-end.md +0 -319
  452. package/skills/cometchat-native-components/SKILL.md +0 -628
  453. package/skills/cometchat-native-core/SKILL.md +0 -679
  454. package/skills/cometchat-native-customization/SKILL.md +0 -716
  455. package/skills/cometchat-native-expo-patterns/SKILL.md +0 -552
  456. package/skills/cometchat-native-features/SKILL.md +0 -638
  457. package/skills/cometchat-native-placement/SKILL.md +0 -509
  458. package/skills/cometchat-native-production/SKILL.md +0 -700
  459. package/skills/cometchat-native-push/SKILL.md +0 -594
  460. package/skills/cometchat-native-testing/SKILL.md +0 -582
  461. package/skills/cometchat-native-theming/SKILL.md +0 -681
  462. package/skills/cometchat-native-troubleshooting/SKILL.md +0 -501
  463. package/skills/cometchat-nextjs-patterns/SKILL.md +0 -899
  464. package/skills/cometchat-placement/SKILL.md +0 -1360
  465. package/skills/cometchat-production/SKILL.md +0 -1027
  466. package/skills/cometchat-react-calls/SKILL.md +0 -752
  467. package/skills/cometchat-react-calls/references/add-calls-to-existing-chat.md +0 -146
  468. package/skills/cometchat-react-calls/references/call-layouts.md +0 -160
  469. package/skills/cometchat-react-calls/references/call-session.md +0 -235
  470. package/skills/cometchat-react-calls/references/custom-ui.md +0 -247
  471. package/skills/cometchat-react-calls/references/device-management.md +0 -210
  472. package/skills/cometchat-react-calls/references/group-calls.md +0 -257
  473. package/skills/cometchat-react-calls/references/idle-timeout.md +0 -188
  474. package/skills/cometchat-react-calls/references/in-call-chat.md +0 -212
  475. package/skills/cometchat-react-calls/references/migration-v4-to-v5.md +0 -170
  476. package/skills/cometchat-react-calls/references/picture-in-picture.md +0 -245
  477. package/skills/cometchat-react-calls/references/raise-hand.md +0 -238
  478. package/skills/cometchat-react-calls/references/recording-screen-share.md +0 -144
  479. package/skills/cometchat-react-calls/references/ringing-integration.md +0 -255
  480. package/skills/cometchat-react-calls/references/server-web-push-vapid.md +0 -241
  481. package/skills/cometchat-react-calls/references/share-invite.md +0 -175
  482. package/skills/cometchat-react-calls/references/testing-calls-on-web.md +0 -216
  483. package/skills/cometchat-react-calls/references/virtual-background.md +0 -32
  484. package/skills/cometchat-react-calls/references/voip-and-web-push.md +0 -165
  485. package/skills/cometchat-react-patterns/SKILL.md +0 -628
  486. package/skills/cometchat-react-push/SKILL.md +0 -634
  487. package/skills/cometchat-react-router-patterns/SKILL.md +0 -758
  488. package/skills/cometchat-react-testing/SKILL.md +0 -413
  489. package/skills/cometchat-theming/SKILL.md +0 -498
  490. 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.