@adminide-stack/yantra-mobile 12.0.69-alpha.9 → 12.0.69

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 (522) hide show
  1. package/lib/components/GatewayConnector/GatewayConnector.js +2 -2
  2. package/lib/components/GatewayConnector/GatewayConnector.js.map +1 -1
  3. package/lib/components/KeyboardComposerDock.js +8 -1
  4. package/lib/components/KeyboardComposerDock.js.map +1 -1
  5. package/lib/components/NavigationHeader/NavigationHeader.js +2 -2
  6. package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -1
  7. package/lib/config/env-config.js +4 -0
  8. package/lib/config/env-config.js.map +1 -1
  9. package/lib/contexts/ChatLiveStreamContext.js +4 -1
  10. package/lib/contexts/ChatLiveStreamContext.js.map +1 -1
  11. package/lib/features/agent-chat/NativeAgentChat.js +2 -0
  12. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  13. package/lib/features/apps/AppsCatalog.js +2 -2
  14. package/lib/features/apps/AppsCatalog.js.map +1 -1
  15. package/lib/features/audio-input/MicErrorBoundary.js +2 -2
  16. package/lib/features/audio-input/MicErrorBoundary.js.map +1 -1
  17. package/lib/features/canvas/AudioEditorExperience.js +308 -0
  18. package/lib/features/canvas/AudioEditorExperience.js.map +1 -0
  19. package/lib/features/canvas/CanvasAgentChatPane.js +310 -0
  20. package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -0
  21. package/lib/features/canvas/CanvasBoardsGrid.js +414 -0
  22. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -0
  23. package/lib/features/canvas/CanvasChatResultCard.js +113 -0
  24. package/lib/features/canvas/CanvasChatResultCard.js.map +1 -0
  25. package/lib/features/canvas/CanvasEditToolsPanel.js +179 -0
  26. package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -0
  27. package/lib/features/canvas/CanvasExperience.js +859 -0
  28. package/lib/features/canvas/CanvasExperience.js.map +1 -0
  29. package/lib/features/canvas/CanvasGeneratePanel.js +514 -0
  30. package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -0
  31. package/lib/features/canvas/CanvasLibrarySheet.js +355 -0
  32. package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -0
  33. package/lib/features/canvas/CanvasLooksPanel.js +184 -0
  34. package/lib/features/canvas/CanvasLooksPanel.js.map +1 -0
  35. package/lib/features/canvas/CanvasTasksPanel.js +138 -0
  36. package/lib/features/canvas/CanvasTasksPanel.js.map +1 -0
  37. package/lib/features/canvas/CanvasTemplatesPanel.js +226 -0
  38. package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -0
  39. package/lib/features/canvas/CanvasToolDock.js +423 -0
  40. package/lib/features/canvas/CanvasToolDock.js.map +1 -0
  41. package/lib/features/canvas/FrameExtractorExperience.js +242 -0
  42. package/lib/features/canvas/FrameExtractorExperience.js.map +1 -0
  43. package/lib/features/canvas/ImageEditorExperience.js +491 -0
  44. package/lib/features/canvas/ImageEditorExperience.js.map +1 -0
  45. package/lib/features/canvas/InfluencerStudioExperience.js +288 -0
  46. package/lib/features/canvas/InfluencerStudioExperience.js.map +1 -0
  47. package/lib/features/canvas/MoodboardExperience.js +205 -0
  48. package/lib/features/canvas/MoodboardExperience.js.map +1 -0
  49. package/lib/features/canvas/NativeCanvasViewer.js +929 -0
  50. package/lib/features/canvas/NativeCanvasViewer.js.map +1 -0
  51. package/lib/features/canvas/PromoContextFields.js +150 -0
  52. package/lib/features/canvas/PromoContextFields.js.map +1 -0
  53. package/lib/features/canvas/SetStudioExperience.js +323 -0
  54. package/lib/features/canvas/SetStudioExperience.js.map +1 -0
  55. package/lib/features/canvas/VideoClipsExperience.js +175 -0
  56. package/lib/features/canvas/VideoClipsExperience.js.map +1 -0
  57. package/lib/features/canvas/VideoEditExperience.js +824 -0
  58. package/lib/features/canvas/VideoEditExperience.js.map +1 -0
  59. package/lib/features/canvas/VideoEditorExperience.js +3050 -0
  60. package/lib/features/canvas/VideoEditorExperience.js.map +1 -0
  61. package/lib/features/canvas/VideoGeneratorExperience.js +415 -0
  62. package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -0
  63. package/lib/features/canvas/aiEdit.js +53 -0
  64. package/lib/features/canvas/aiEdit.js.map +1 -0
  65. package/lib/features/canvas/canvasAgentChat.js +76 -0
  66. package/lib/features/canvas/canvasAgentChat.js.map +1 -0
  67. package/lib/features/canvas/canvasBoardsCatalog.js +59 -0
  68. package/lib/features/canvas/canvasBoardsCatalog.js.map +1 -0
  69. package/lib/features/canvas/canvasBoardsSnapshot.js +14 -1
  70. package/lib/features/canvas/canvasBoardsSnapshot.js.map +1 -1
  71. package/lib/features/canvas/canvasChatDisplay.js +38 -0
  72. package/lib/features/canvas/canvasChatDisplay.js.map +1 -0
  73. package/lib/features/canvas/canvasChatTemplates.js +219 -0
  74. package/lib/features/canvas/canvasChatTemplates.js.map +1 -0
  75. package/lib/features/canvas/canvasCore.js +138 -1
  76. package/lib/features/canvas/canvasCore.js.map +1 -1
  77. package/lib/features/canvas/canvasEditOps.js +224 -0
  78. package/lib/features/canvas/canvasEditOps.js.map +1 -0
  79. package/lib/features/canvas/canvasTasks.js +187 -0
  80. package/lib/features/canvas/canvasTasks.js.map +1 -0
  81. package/lib/features/canvas/designPromptTemplates.js +3084 -0
  82. package/lib/features/canvas/designPromptTemplates.js.map +1 -0
  83. package/lib/features/canvas/editTools.js +54 -0
  84. package/lib/features/canvas/editTools.js.map +1 -0
  85. package/lib/features/canvas/extendVideo.js +5 -0
  86. package/lib/features/canvas/extendVideo.js.map +1 -0
  87. package/lib/features/canvas/frameExtract.js +33 -0
  88. package/lib/features/canvas/frameExtract.js.map +1 -0
  89. package/lib/features/canvas/generationModels.js +201 -0
  90. package/lib/features/canvas/generationModels.js.map +1 -0
  91. package/lib/features/canvas/influencer/influencerPipeline.js +170 -0
  92. package/lib/features/canvas/influencer/influencerPipeline.js.map +1 -0
  93. package/lib/features/canvas/influencer/productReel.js +72 -0
  94. package/lib/features/canvas/influencer/productReel.js.map +1 -0
  95. package/lib/features/canvas/influencer/reelPlan.js +159 -0
  96. package/lib/features/canvas/influencer/reelPlan.js.map +1 -0
  97. package/lib/features/canvas/moodboardCore.js +13 -0
  98. package/lib/features/canvas/moodboardCore.js.map +1 -0
  99. package/lib/features/canvas/promoProjectImport.js +99 -0
  100. package/lib/features/canvas/promoProjectImport.js.map +1 -0
  101. package/lib/features/canvas/promoVideo.js +312 -0
  102. package/lib/features/canvas/promoVideo.js.map +1 -0
  103. package/lib/features/canvas/recorder/CameraRecorderExperience.js +109 -0
  104. package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -0
  105. package/lib/features/canvas/sessionIdentity.js +28 -1
  106. package/lib/features/canvas/sessionIdentity.js.map +1 -1
  107. package/lib/features/canvas/set/SetViewportWebView.js +133 -0
  108. package/lib/features/canvas/set/SetViewportWebView.js.map +1 -0
  109. package/lib/features/canvas/set/cameraPath.js +194 -0
  110. package/lib/features/canvas/set/cameraPath.js.map +1 -0
  111. package/lib/features/canvas/set/setProject.js +24 -0
  112. package/lib/features/canvas/set/setProject.js.map +1 -0
  113. package/lib/features/canvas/storageLibrary.js +184 -0
  114. package/lib/features/canvas/storageLibrary.js.map +1 -0
  115. package/lib/features/canvas/studioCatalog.js +129 -0
  116. package/lib/features/canvas/studioCatalog.js.map +1 -0
  117. package/lib/features/canvas/studioLooks.js +189 -0
  118. package/lib/features/canvas/studioLooks.js.map +1 -0
  119. package/lib/features/canvas/surfaceIndex.js +63 -1
  120. package/lib/features/canvas/surfaceIndex.js.map +1 -1
  121. package/lib/features/canvas/templateImport/invideoNative.js +221 -0
  122. package/lib/features/canvas/templateImport/invideoNative.js.map +1 -0
  123. package/lib/features/canvas/templateImport/loadTemplate.js +43 -0
  124. package/lib/features/canvas/templateImport/loadTemplate.js.map +1 -0
  125. package/lib/features/canvas/templateImport/renderConfig.js +93 -0
  126. package/lib/features/canvas/templateImport/renderConfig.js.map +1 -0
  127. package/lib/features/canvas/useStudioCatalogTemplates.js +134 -0
  128. package/lib/features/canvas/useStudioCatalogTemplates.js.map +1 -0
  129. package/lib/features/canvas/video3d.js +109 -0
  130. package/lib/features/canvas/video3d.js.map +1 -0
  131. package/lib/features/canvas/videoClips.js +42 -0
  132. package/lib/features/canvas/videoClips.js.map +1 -0
  133. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +120 -0
  134. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -0
  135. package/lib/features/canvas/videoEditor/agent/agentLoop.js +69 -0
  136. package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -0
  137. package/lib/features/canvas/videoEditor/agent/brainClient.js +45 -0
  138. package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -0
  139. package/lib/features/canvas/videoEditor/agent/cutTools.js +129 -0
  140. package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -0
  141. package/lib/features/canvas/videoEditor/editorModel.js +346 -0
  142. package/lib/features/canvas/videoEditor/editorModel.js.map +1 -0
  143. package/lib/features/canvas/videoEditor/exportRenderer.js +214 -0
  144. package/lib/features/canvas/videoEditor/exportRenderer.js.map +1 -0
  145. package/lib/features/canvas/videoEditor/filters.js +41 -0
  146. package/lib/features/canvas/videoEditor/filters.js.map +1 -0
  147. package/lib/features/canvas/videoEditor/mediaActions.js +57 -0
  148. package/lib/features/canvas/videoEditor/mediaActions.js.map +1 -0
  149. package/lib/features/canvas/videoEditor/remoteMediaClient.js +129 -0
  150. package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -0
  151. package/lib/features/canvas/videoEditor/solidColorPng.js +115 -0
  152. package/lib/features/canvas/videoEditor/solidColorPng.js.map +1 -0
  153. package/lib/features/canvas/videoEditor/videoEditOps.js +191 -0
  154. package/lib/features/canvas/videoEditor/videoEditOps.js.map +1 -0
  155. package/lib/features/canvas/videoEditor/videoProjectsStore.js +82 -0
  156. package/lib/features/canvas/videoEditor/videoProjectsStore.js.map +1 -0
  157. package/lib/features/canvas/videoRenderer.js +8 -0
  158. package/lib/features/canvas/videoRenderer.js.map +1 -0
  159. package/lib/features/canvas/withRemoteSafeArea.js +2 -2
  160. package/lib/features/canvas/withRemoteSafeArea.js.map +1 -1
  161. package/lib/features/characters/characterStudioProps.js +14 -0
  162. package/lib/features/characters/characterStudioProps.js.map +1 -0
  163. package/lib/features/chat/ChatCodeBlock.js +7 -3
  164. package/lib/features/chat/ChatCodeBlock.js.map +1 -1
  165. package/lib/features/chat/ChatTranscript.js +7 -3
  166. package/lib/features/chat/ChatTranscript.js.map +1 -1
  167. package/lib/features/chat/ChatWidgetCard.js +13 -0
  168. package/lib/features/chat/ChatWidgetCard.js.map +1 -0
  169. package/lib/features/chat/ConnectorConnectCard.js +164 -0
  170. package/lib/features/chat/ConnectorConnectCard.js.map +1 -0
  171. package/lib/features/chat/ConnectorConnectPrompt.js +254 -0
  172. package/lib/features/chat/ConnectorConnectPrompt.js.map +1 -0
  173. package/lib/features/chat/MessageActionBar.js.map +1 -1
  174. package/lib/features/chat/QueuedFollowUps.js +71 -0
  175. package/lib/features/chat/QueuedFollowUps.js.map +1 -0
  176. package/lib/features/chat/chatWidgets.js +37 -0
  177. package/lib/features/chat/chatWidgets.js.map +1 -0
  178. package/lib/features/chat/connectorConnect.js +179 -0
  179. package/lib/features/chat/connectorConnect.js.map +1 -0
  180. package/lib/features/chat/connectorConnectHandbacks.js +55 -0
  181. package/lib/features/chat/connectorConnectHandbacks.js.map +1 -0
  182. package/lib/features/design/DesignEditorExperience.js +643 -0
  183. package/lib/features/design/DesignEditorExperience.js.map +1 -0
  184. package/lib/features/design/DesignExperience.js +444 -0
  185. package/lib/features/design/DesignExperience.js.map +1 -0
  186. package/lib/features/design/designCore.js +298 -0
  187. package/lib/features/design/designCore.js.map +1 -0
  188. package/lib/features/design/designIndex.js +150 -0
  189. package/lib/features/design/designIndex.js.map +1 -0
  190. package/lib/features/design/exportDesign.js +133 -0
  191. package/lib/features/design/exportDesign.js.map +1 -0
  192. package/lib/features/job-search/ApplicationsPanel.js +907 -0
  193. package/lib/features/job-search/ApplicationsPanel.js.map +1 -0
  194. package/lib/features/job-search/ContactsPanel.js +627 -0
  195. package/lib/features/job-search/ContactsPanel.js.map +1 -0
  196. package/lib/features/job-search/InsightsPanel.js +299 -0
  197. package/lib/features/job-search/InsightsPanel.js.map +1 -0
  198. package/lib/features/job-search/InterviewPanel.js +637 -0
  199. package/lib/features/job-search/InterviewPanel.js.map +1 -0
  200. package/lib/features/job-search/JdPastePrompt.js +130 -0
  201. package/lib/features/job-search/JdPastePrompt.js.map +1 -0
  202. package/lib/features/job-search/JobCard.js +199 -0
  203. package/lib/features/job-search/JobCard.js.map +1 -0
  204. package/lib/features/job-search/JobDetailSheet.js +255 -0
  205. package/lib/features/job-search/JobDetailSheet.js.map +1 -0
  206. package/lib/features/job-search/JobSearchAgentChatPane.js +377 -0
  207. package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -0
  208. package/lib/features/job-search/JobSearchExperience.js +1324 -0
  209. package/lib/features/job-search/JobSearchExperience.js.map +1 -0
  210. package/lib/features/job-search/JobSearchLocationField.js +231 -0
  211. package/lib/features/job-search/JobSearchLocationField.js.map +1 -0
  212. package/lib/features/job-search/ProfilePanel.js +679 -0
  213. package/lib/features/job-search/ProfilePanel.js.map +1 -0
  214. package/lib/features/job-search/RepliesPanel.js +344 -0
  215. package/lib/features/job-search/RepliesPanel.js.map +1 -0
  216. package/lib/features/job-search/SavedPanel.js +297 -0
  217. package/lib/features/job-search/SavedPanel.js.map +1 -0
  218. package/lib/features/job-search/chat/widgetContent.js +29 -0
  219. package/lib/features/job-search/chat/widgetContent.js.map +1 -0
  220. package/lib/features/job-search/cvText.js +91 -0
  221. package/lib/features/job-search/cvText.js.map +1 -0
  222. package/lib/features/job-search/jobAgentSwipe.js +7 -0
  223. package/lib/features/job-search/jobAgentSwipe.js.map +1 -0
  224. package/lib/features/job-search/jobSearchClient.js +184 -0
  225. package/lib/features/job-search/jobSearchClient.js.map +1 -0
  226. package/lib/features/job-search/jobSearchExec.js +14 -0
  227. package/lib/features/job-search/jobSearchExec.js.map +1 -0
  228. package/lib/features/job-search/jobSearchRuntime.js +50 -0
  229. package/lib/features/job-search/jobSearchRuntime.js.map +1 -0
  230. package/lib/features/job-search/jobSearchTheme.js +44 -0
  231. package/lib/features/job-search/jobSearchTheme.js.map +1 -0
  232. package/lib/features/job-search/savedJobs.js +85 -0
  233. package/lib/features/job-search/savedJobs.js.map +1 -0
  234. package/lib/features/job-search/searchHistory.js +117 -0
  235. package/lib/features/job-search/searchHistory.js.map +1 -0
  236. package/lib/features/job-search/types.js +36 -0
  237. package/lib/features/job-search/types.js.map +1 -0
  238. package/lib/features/job-search/useJobSearchSession.js +558 -0
  239. package/lib/features/job-search/useJobSearchSession.js.map +1 -0
  240. package/lib/features/messaging/ChatComponents.js +529 -0
  241. package/lib/features/messaging/ChatComponents.js.map +1 -0
  242. package/lib/features/messaging/ChatInviteDeepLink.js +116 -0
  243. package/lib/features/messaging/ChatInviteDeepLink.js.map +1 -0
  244. package/lib/features/messaging/ContactsScreen.js +288 -0
  245. package/lib/features/messaging/ContactsScreen.js.map +1 -0
  246. package/lib/features/messaging/ConversationListScreen.js +147 -0
  247. package/lib/features/messaging/ConversationListScreen.js.map +1 -0
  248. package/lib/features/messaging/MessageActions.js +290 -0
  249. package/lib/features/messaging/MessageActions.js.map +1 -0
  250. package/lib/features/messaging/NativeChatExperience.js +189 -0
  251. package/lib/features/messaging/NativeChatExperience.js.map +1 -0
  252. package/lib/features/messaging/RegistrationScreen.js +11 -14
  253. package/lib/features/messaging/RegistrationScreen.js.map +1 -1
  254. package/lib/features/messaging/ThreadScreen.js +215 -0
  255. package/lib/features/messaging/ThreadScreen.js.map +1 -0
  256. package/lib/features/messaging/chatInviteLink.js +52 -0
  257. package/lib/features/messaging/chatInviteLink.js.map +1 -0
  258. package/lib/features/messaging/chatModel.js +278 -0
  259. package/lib/features/messaging/chatModel.js.map +1 -0
  260. package/lib/features/messaging/chatOperations.js +106 -1
  261. package/lib/features/messaging/chatOperations.js.map +1 -1
  262. package/lib/features/messaging/emojiCatalog.js +60 -0
  263. package/lib/features/messaging/emojiCatalog.js.map +1 -0
  264. package/lib/features/messaging/emojiKeywords.js +1592 -0
  265. package/lib/features/messaging/emojiKeywords.js.map +1 -0
  266. package/lib/features/messaging/nativeChatChannelQuery.js +27 -0
  267. package/lib/features/messaging/nativeChatChannelQuery.js.map +1 -0
  268. package/lib/features/messaging/phoneNumbers.js +52 -1
  269. package/lib/features/messaging/phoneNumbers.js.map +1 -1
  270. package/lib/features/messaging/sha256.js +68 -0
  271. package/lib/features/messaging/sha256.js.map +1 -0
  272. package/lib/features/messaging/useChatData.js +421 -0
  273. package/lib/features/messaging/useChatData.js.map +1 -0
  274. package/lib/features/messaging/useContactMatches.js +191 -0
  275. package/lib/features/messaging/useContactMatches.js.map +1 -0
  276. package/lib/features/messaging/usePhoneVerification.js +12 -12
  277. package/lib/features/messaging/usePhoneVerification.js.map +1 -1
  278. package/lib/features/messaging/yantraChatOrg.js +8 -3
  279. package/lib/features/messaging/yantraChatOrg.js.map +1 -1
  280. package/lib/features/resume/AnnotateModal.js +100 -0
  281. package/lib/features/resume/AnnotateModal.js.map +1 -0
  282. package/lib/features/resume/AnnotationBar.js +69 -0
  283. package/lib/features/resume/AnnotationBar.js.map +1 -0
  284. package/lib/features/resume/ExportSheet.js +105 -0
  285. package/lib/features/resume/ExportSheet.js.map +1 -0
  286. package/lib/features/resume/ResumeAgentChatPane.js +95 -0
  287. package/lib/features/resume/ResumeAgentChatPane.js.map +1 -0
  288. package/lib/features/resume/ResumeEditor.js +676 -0
  289. package/lib/features/resume/ResumeEditor.js.map +1 -0
  290. package/lib/features/resume/ResumeExperience.js +235 -0
  291. package/lib/features/resume/ResumeExperience.js.map +1 -0
  292. package/lib/features/resume/ResumeListPanel.js +262 -0
  293. package/lib/features/resume/ResumeListPanel.js.map +1 -0
  294. package/lib/features/resume/ResumeToolbar.js +236 -0
  295. package/lib/features/resume/ResumeToolbar.js.map +1 -0
  296. package/lib/features/resume/annotations.js +17 -0
  297. package/lib/features/resume/annotations.js.map +1 -0
  298. package/lib/features/resume/documentCss.js +52 -0
  299. package/lib/features/resume/documentCss.js.map +1 -0
  300. package/lib/features/resume/draft.js +89 -0
  301. package/lib/features/resume/draft.js.map +1 -0
  302. package/lib/features/resume/exportResume.js +43 -0
  303. package/lib/features/resume/exportResume.js.map +1 -0
  304. package/lib/features/resume/pickResumePhoto.js +22 -0
  305. package/lib/features/resume/pickResumePhoto.js.map +1 -0
  306. package/lib/features/resume/renderResume.js +121 -0
  307. package/lib/features/resume/renderResume.js.map +1 -0
  308. package/lib/features/resume/resumeClient.js +69 -0
  309. package/lib/features/resume/resumeClient.js.map +1 -0
  310. package/lib/features/resume/resumeExec.js +14 -0
  311. package/lib/features/resume/resumeExec.js.map +1 -0
  312. package/lib/features/resume/resumeIndex.js +244 -0
  313. package/lib/features/resume/resumeIndex.js.map +1 -0
  314. package/lib/features/resume/resumeRuntime.js +50 -0
  315. package/lib/features/resume/resumeRuntime.js.map +1 -0
  316. package/lib/features/resume/resumeTheme.js +34 -0
  317. package/lib/features/resume/resumeTheme.js.map +1 -0
  318. package/lib/features/resume/resumeToolbox.js +49 -0
  319. package/lib/features/resume/resumeToolbox.js.map +1 -0
  320. package/lib/features/resume/templates.js +90 -0
  321. package/lib/features/resume/templates.js.map +1 -0
  322. package/lib/features/resume/types.js +10 -0
  323. package/lib/features/resume/types.js.map +1 -0
  324. package/lib/features/resume/useResumeSession.js +183 -0
  325. package/lib/features/resume/useResumeSession.js.map +1 -0
  326. package/lib/features/shopping/DealsPanel.js +254 -0
  327. package/lib/features/shopping/DealsPanel.js.map +1 -0
  328. package/lib/features/shopping/HistoryPanel.js +147 -0
  329. package/lib/features/shopping/HistoryPanel.js.map +1 -0
  330. package/lib/features/shopping/OrdersPanel.js +157 -0
  331. package/lib/features/shopping/OrdersPanel.js.map +1 -0
  332. package/lib/features/shopping/ProductCard.js +326 -0
  333. package/lib/features/shopping/ProductCard.js.map +1 -0
  334. package/lib/features/shopping/ProductDetailSheet.js +313 -0
  335. package/lib/features/shopping/ProductDetailSheet.js.map +1 -0
  336. package/lib/features/shopping/ProductFilterBar.js +153 -0
  337. package/lib/features/shopping/ProductFilterBar.js.map +1 -0
  338. package/lib/features/shopping/ProductPhoto.js +27 -0
  339. package/lib/features/shopping/ProductPhoto.js.map +1 -0
  340. package/lib/features/shopping/SavedPanel.js +139 -0
  341. package/lib/features/shopping/SavedPanel.js.map +1 -0
  342. package/lib/features/shopping/ShoppingAgentChatPane.js +436 -0
  343. package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -0
  344. package/lib/features/shopping/ShoppingExperience.js +888 -0
  345. package/lib/features/shopping/ShoppingExperience.js.map +1 -0
  346. package/lib/features/shopping/TrendingSections.js +199 -0
  347. package/lib/features/shopping/TrendingSections.js.map +1 -0
  348. package/lib/features/shopping/WatchlistPanel.js +148 -0
  349. package/lib/features/shopping/WatchlistPanel.js.map +1 -0
  350. package/lib/features/shopping/catalog.js +238 -0
  351. package/lib/features/shopping/catalog.js.map +1 -0
  352. package/lib/features/shopping/chat/ShoppingChatResultCard.js +175 -0
  353. package/lib/features/shopping/chat/ShoppingChatResultCard.js.map +1 -0
  354. package/lib/features/shopping/chat/streamAssistantReply.js +34 -0
  355. package/lib/features/shopping/chat/streamAssistantReply.js.map +1 -0
  356. package/lib/features/shopping/chat/widgetContent.js +233 -0
  357. package/lib/features/shopping/chat/widgetContent.js.map +1 -0
  358. package/lib/features/shopping/hooks/useTrendingProducts.js +162 -0
  359. package/lib/features/shopping/hooks/useTrendingProducts.js.map +1 -0
  360. package/lib/features/shopping/productImage.js +42 -0
  361. package/lib/features/shopping/productImage.js.map +1 -0
  362. package/lib/features/shopping/savedProducts.js +84 -0
  363. package/lib/features/shopping/savedProducts.js.map +1 -0
  364. package/lib/features/shopping/services/catalogActions.js +166 -0
  365. package/lib/features/shopping/services/catalogActions.js.map +1 -0
  366. package/lib/features/shopping/services/parsePriceCheckIntent.js +58 -0
  367. package/lib/features/shopping/services/parsePriceCheckIntent.js.map +1 -0
  368. package/lib/features/shopping/services/parseShoppingIntent.js +67 -0
  369. package/lib/features/shopping/services/parseShoppingIntent.js.map +1 -0
  370. package/lib/features/shopping/services/productAvailability.js +25 -0
  371. package/lib/features/shopping/services/productAvailability.js.map +1 -0
  372. package/lib/features/shopping/services/productFilters.js +72 -0
  373. package/lib/features/shopping/services/productFilters.js.map +1 -0
  374. package/lib/features/shopping/services/retailerUrl.js +75 -0
  375. package/lib/features/shopping/services/retailerUrl.js.map +1 -0
  376. package/lib/features/shopping/services/shoppingChatReply.js +46 -0
  377. package/lib/features/shopping/services/shoppingChatReply.js.map +1 -0
  378. package/lib/features/shopping/services/shoppingProductSearch.js +336 -0
  379. package/lib/features/shopping/services/shoppingProductSearch.js.map +1 -0
  380. package/lib/features/shopping/services/shoppingSearchConnectorClient.js +41 -0
  381. package/lib/features/shopping/services/shoppingSearchConnectorClient.js.map +1 -0
  382. package/lib/features/shopping/shopAgentSwipe.js +7 -0
  383. package/lib/features/shopping/shopAgentSwipe.js.map +1 -0
  384. package/lib/features/shopping/shoppingCart.js +116 -0
  385. package/lib/features/shopping/shoppingCart.js.map +1 -0
  386. package/lib/features/shopping/shoppingExec.js +14 -0
  387. package/lib/features/shopping/shoppingExec.js.map +1 -0
  388. package/lib/features/shopping/shoppingHistoryStore.js +176 -0
  389. package/lib/features/shopping/shoppingHistoryStore.js.map +1 -0
  390. package/lib/features/shopping/shoppingRuntime.js +63 -0
  391. package/lib/features/shopping/shoppingRuntime.js.map +1 -0
  392. package/lib/features/shopping/timeAgo.js +14 -0
  393. package/lib/features/shopping/timeAgo.js.map +1 -0
  394. package/lib/features/shopping/useShoppingSearch.js +262 -0
  395. package/lib/features/shopping/useShoppingSearch.js.map +1 -0
  396. package/lib/features/travel/BookHeaderGlow.js +48 -0
  397. package/lib/features/travel/BookHeaderGlow.js.map +1 -0
  398. package/lib/features/travel/BookingsPanel.js +29 -0
  399. package/lib/features/travel/BookingsPanel.js.map +1 -0
  400. package/lib/features/travel/DiscoverPanel.js +155 -0
  401. package/lib/features/travel/DiscoverPanel.js.map +1 -0
  402. package/lib/features/travel/FlightCompareBar.js +86 -0
  403. package/lib/features/travel/FlightCompareBar.js.map +1 -0
  404. package/lib/features/travel/FlightDealsBoard.js +100 -0
  405. package/lib/features/travel/FlightDealsBoard.js.map +1 -0
  406. package/lib/features/travel/HistoryPanel.js +82 -0
  407. package/lib/features/travel/HistoryPanel.js.map +1 -0
  408. package/lib/features/travel/PopularDestinations.js +144 -0
  409. package/lib/features/travel/PopularDestinations.js.map +1 -0
  410. package/lib/features/travel/SavedPanel.js +27 -0
  411. package/lib/features/travel/SavedPanel.js.map +1 -0
  412. package/lib/features/travel/TravelAgentChatPane.js +303 -0
  413. package/lib/features/travel/TravelAgentChatPane.js.map +1 -0
  414. package/lib/features/travel/TravelBookHero.js +425 -0
  415. package/lib/features/travel/TravelBookHero.js.map +1 -0
  416. package/lib/features/travel/TravelDatesField.js +234 -0
  417. package/lib/features/travel/TravelDatesField.js.map +1 -0
  418. package/lib/features/travel/TravelDetailSheet.js +106 -0
  419. package/lib/features/travel/TravelDetailSheet.js.map +1 -0
  420. package/lib/features/travel/TravelExperience.js +624 -0
  421. package/lib/features/travel/TravelExperience.js.map +1 -0
  422. package/lib/features/travel/TravelGuestsField.js +85 -0
  423. package/lib/features/travel/TravelGuestsField.js.map +1 -0
  424. package/lib/features/travel/TravelLanding.js +318 -0
  425. package/lib/features/travel/TravelLanding.js.map +1 -0
  426. package/lib/features/travel/TravelLocationField.js +179 -0
  427. package/lib/features/travel/TravelLocationField.js.map +1 -0
  428. package/lib/features/travel/TravelPropertyCard.js +266 -0
  429. package/lib/features/travel/TravelPropertyCard.js.map +1 -0
  430. package/lib/features/travel/TravelPropertyPhoto.js +22 -0
  431. package/lib/features/travel/TravelPropertyPhoto.js.map +1 -0
  432. package/lib/features/travel/TravelRailFlyout.js +79 -0
  433. package/lib/features/travel/TravelRailFlyout.js.map +1 -0
  434. package/lib/features/travel/TravelResultsMap.js +126 -0
  435. package/lib/features/travel/TravelResultsMap.js.map +1 -0
  436. package/lib/features/travel/WorkspacePanel.js +148 -0
  437. package/lib/features/travel/WorkspacePanel.js.map +1 -0
  438. package/lib/features/travel/appNav.js +244 -0
  439. package/lib/features/travel/appNav.js.map +1 -0
  440. package/lib/features/travel/calendarDays.js +50 -0
  441. package/lib/features/travel/calendarDays.js.map +1 -0
  442. package/lib/features/travel/catalog.js +72 -0
  443. package/lib/features/travel/catalog.js.map +1 -0
  444. package/lib/features/travel/chat/TravelChatResultCard.js +107 -0
  445. package/lib/features/travel/chat/TravelChatResultCard.js.map +1 -0
  446. package/lib/features/travel/chat/widgetContent.js +107 -0
  447. package/lib/features/travel/chat/widgetContent.js.map +1 -0
  448. package/lib/features/travel/flightDeals.js +65 -0
  449. package/lib/features/travel/flightDeals.js.map +1 -0
  450. package/lib/features/travel/mapCoordinates.js +36 -0
  451. package/lib/features/travel/mapCoordinates.js.map +1 -0
  452. package/lib/features/travel/parseTravelIntent.js +303 -0
  453. package/lib/features/travel/parseTravelIntent.js.map +1 -0
  454. package/lib/features/travel/savedStays.js +66 -0
  455. package/lib/features/travel/savedStays.js.map +1 -0
  456. package/lib/features/travel/services/flightDealsBoard.js +111 -0
  457. package/lib/features/travel/services/flightDealsBoard.js.map +1 -0
  458. package/lib/features/travel/services/flightSearchConnectorClient.js +42 -0
  459. package/lib/features/travel/services/flightSearchConnectorClient.js.map +1 -0
  460. package/lib/features/travel/services/geocodeLocation.js +79 -0
  461. package/lib/features/travel/services/geocodeLocation.js.map +1 -0
  462. package/lib/features/travel/services/placePredictions.js +113 -0
  463. package/lib/features/travel/services/placePredictions.js.map +1 -0
  464. package/lib/features/travel/services/resolveOriginCity.js +27 -0
  465. package/lib/features/travel/services/resolveOriginCity.js.map +1 -0
  466. package/lib/features/travel/services/resortifiConnectorClient.js +76 -0
  467. package/lib/features/travel/services/resortifiConnectorClient.js.map +1 -0
  468. package/lib/features/travel/services/travelFlightSearch.js +289 -0
  469. package/lib/features/travel/services/travelFlightSearch.js.map +1 -0
  470. package/lib/features/travel/services/travelPropertySearch.js +377 -0
  471. package/lib/features/travel/services/travelPropertySearch.js.map +1 -0
  472. package/lib/features/travel/travelAgentSwipe.js +7 -0
  473. package/lib/features/travel/travelAgentSwipe.js.map +1 -0
  474. package/lib/features/travel/travelExec.js +14 -0
  475. package/lib/features/travel/travelExec.js.map +1 -0
  476. package/lib/features/travel/travelHistoryStore.js +108 -0
  477. package/lib/features/travel/travelHistoryStore.js.map +1 -0
  478. package/lib/features/travel/travelRuntime.js +62 -0
  479. package/lib/features/travel/travelRuntime.js.map +1 -0
  480. package/lib/features/travel/types.js +9 -0
  481. package/lib/features/travel/types.js.map +1 -0
  482. package/lib/features/travel/useTravelSearch.js +330 -0
  483. package/lib/features/travel/useTravelSearch.js.map +1 -0
  484. package/lib/features/travel/workspaceContent.js +548 -0
  485. package/lib/features/travel/workspaceContent.js.map +1 -0
  486. package/lib/hooks/useCdecliChannel.js +128 -6
  487. package/lib/hooks/useCdecliChannel.js.map +1 -1
  488. package/lib/hooks/useChatApi.js +4 -2
  489. package/lib/hooks/useChatApi.js.map +1 -1
  490. package/lib/hooks/useChatStream.js +77 -63
  491. package/lib/hooks/useChatStream.js.map +1 -1
  492. package/lib/hooks/useHostConnectorCard.js +24 -0
  493. package/lib/hooks/useHostConnectorCard.js.map +1 -0
  494. package/lib/hooks/useObtainSystemToken.js +23 -5
  495. package/lib/hooks/useObtainSystemToken.js.map +1 -1
  496. package/lib/hooks/webViewRetentionPolicy.js +1 -0
  497. package/lib/hooks/webViewRetentionPolicy.js.map +1 -1
  498. package/lib/index.js +1 -1
  499. package/lib/index.js.map +1 -1
  500. package/lib/screens/Chat/index.js +51 -22
  501. package/lib/screens/Chat/index.js.map +1 -1
  502. package/lib/screens/ChatNative/index.js +13 -2
  503. package/lib/screens/ChatNative/index.js.map +1 -1
  504. package/lib/screens/Home/HomeScreen.js +3 -3
  505. package/lib/screens/Home/HomeScreen.js.map +1 -1
  506. package/lib/screens/Home/components/ChatHistoryLanding.js +32 -32
  507. package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -1
  508. package/lib/screens/JobSearchNative/useJobSearchHostChat.js +12 -6
  509. package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
  510. package/lib/screens/ResumeNative/useResumeHostChat.js +12 -6
  511. package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
  512. package/lib/screens/ShoppingNative/useShoppingHostChat.js +12 -6
  513. package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
  514. package/lib/screens/TravelNative/useTravelHostChat.js +12 -6
  515. package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
  516. package/lib/screens/WebBuilder/WebViewWithNavigation.js +2 -2
  517. package/lib/screens/WebBuilder/WebViewWithNavigation.js.map +1 -1
  518. package/lib/services/brainQuickReply.js +38 -1
  519. package/lib/services/brainQuickReply.js.map +1 -1
  520. package/lib/state/chatThreadMerge.js +6 -1
  521. package/lib/state/chatThreadMerge.js.map +1 -1
  522. package/package.json +6 -4
@@ -0,0 +1,421 @@
1
+ import*as React from'react';import {CHANNELS_QUERY,MESSAGE_ADDED_SUBSCRIPTION_WS,CREATE_DIRECT_CHANNEL_MUTATION,MESSAGES_QUERY,SEND_MESSAGE_MUTATION,REACTION_CHANGED_SUBSCRIPTION_WS,SET_MESSAGE_REACTION_MUTATION,VIEW_CHANNEL_MUTATION}from'./chatOperations.js';import {mergeConversations,toConversation,patchConversationAfterPost,sortConversations,mergeMessages,toChatMessage,reconcileOptimistic,applyReactionSummary,withViewerReaction}from'./chatModel.js';import {NATIVE_CHAT_CHANNELS_QUERY_VARS,isNativeMessengerChannel,NATIVE_CHAT_LIST_PAGE_SIZE,isMongoAccountId}from'./nativeChatChannelQuery.js';var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ const PAGE_SIZE = 20;
21
+ function firstErrorMessage(errors) {
22
+ if (!(errors == null ? void 0 : errors.length)) return null;
23
+ const raw = errors[0].message || "Something went wrong.";
24
+ if (/Cannot return null for non-nullable field Channel\.id/i.test(raw)) return null;
25
+ if (/status code 400/i.test(raw)) return "Could not load messages for this chat.";
26
+ if (/status code 401/i.test(raw) || /status code 403/i.test(raw)) return "You do not have access to this conversation.";
27
+ return raw;
28
+ }
29
+ function sortChannelsByRecentActivity(rows) {
30
+ return [...rows].sort((left, right) => {
31
+ const leftTime = left.lastPostAt ? new Date(left.lastPostAt).getTime() : 0;
32
+ const rightTime = right.lastPostAt ? new Date(right.lastPostAt).getTime() : 0;
33
+ return rightTime - leftTime;
34
+ });
35
+ }
36
+ function useConversations(services, viewer, opts) {
37
+ var _a;
38
+ const {
39
+ gql
40
+ } = services;
41
+ const [conversations, setConversations] = React.useState([]);
42
+ const [loading, setLoading] = React.useState(true);
43
+ const [refreshing, setRefreshing] = React.useState(false);
44
+ const [error, setError] = React.useState(null);
45
+ const [hasMore, setHasMore] = React.useState(false);
46
+ const [loadingMore, setLoadingMore] = React.useState(false);
47
+ const viewerId = (_a = viewer == null ? void 0 : viewer.userId) != null ? _a : null;
48
+ const mounted = React.useRef(true);
49
+ const conversationsRef = React.useRef([]);
50
+ const serverOffset = React.useRef(0);
51
+ React.useEffect(() => {
52
+ conversationsRef.current = conversations;
53
+ }, [conversations]);
54
+ const listQueryEnabled = (opts == null ? void 0 : opts.listQueryEnabled) !== false;
55
+ const load = React.useCallback(async (mode) => {
56
+ var _a2, _b, _c, _d;
57
+ if (!viewerId || !listQueryEnabled) return;
58
+ if (mode === "refresh") setRefreshing(true);
59
+ if (mode === "initial") {
60
+ const cached = await gql.query(CHANNELS_QUERY, NATIVE_CHAT_CHANNELS_QUERY_VARS, {
61
+ fetchPolicy: "cache-only"
62
+ });
63
+ const cachedRows = ((_b = (_a2 = cached.data) == null ? void 0 : _a2.channelsByUser) != null ? _b : []).filter(Boolean).filter(isNativeMessengerChannel);
64
+ if (mounted.current && cachedRows.length) {
65
+ setConversations(mergeConversations([], sortChannelsByRecentActivity(cachedRows).map((c) => toConversation(c, viewerId))));
66
+ setLoading(false);
67
+ }
68
+ }
69
+ const res = await gql.query(
70
+ CHANNELS_QUERY,
71
+ NATIVE_CHAT_CHANNELS_QUERY_VARS,
72
+ // network-only: a stale conversation list is the single most
73
+ // visible staleness in a chat app, and this is one small page.
74
+ {
75
+ fetchPolicy: "network-only"
76
+ }
77
+ );
78
+ if (!mounted.current) return;
79
+ const message = firstErrorMessage(res.errors);
80
+ const raw = ((_d = (_c = res.data) == null ? void 0 : _c.channelsByUser) != null ? _d : []).filter(Boolean);
81
+ const rows = raw.filter(isNativeMessengerChannel);
82
+ if (rows.length || !message) {
83
+ setConversations(mergeConversations([], sortChannelsByRecentActivity(rows).map((c) => toConversation(c, viewerId))));
84
+ serverOffset.current = raw.length;
85
+ setHasMore(raw.length >= NATIVE_CHAT_LIST_PAGE_SIZE);
86
+ }
87
+ setError(message);
88
+ setLoading(false);
89
+ setRefreshing(false);
90
+ }, [gql, viewerId, listQueryEnabled]);
91
+ const loadMore = React.useCallback(async () => {
92
+ var _a2, _b;
93
+ if (!viewerId || !listQueryEnabled || !hasMore || loadingMore || loading) return;
94
+ setLoadingMore(true);
95
+ const res = await gql.query(CHANNELS_QUERY, __spreadProps(__spreadValues({}, NATIVE_CHAT_CHANNELS_QUERY_VARS), {
96
+ skip: serverOffset.current
97
+ }), {
98
+ fetchPolicy: "network-only"
99
+ });
100
+ if (!mounted.current) return;
101
+ const message = firstErrorMessage(res.errors);
102
+ const raw = ((_b = (_a2 = res.data) == null ? void 0 : _a2.channelsByUser) != null ? _b : []).filter(Boolean);
103
+ const rows = raw.filter(isNativeMessengerChannel);
104
+ if (rows.length) {
105
+ setConversations((prev) => mergeConversations(prev, rows.map((c) => toConversation(c, viewerId))));
106
+ }
107
+ if (!message) {
108
+ serverOffset.current += raw.length;
109
+ setHasMore(raw.length >= NATIVE_CHAT_LIST_PAGE_SIZE);
110
+ }
111
+ setError(message);
112
+ setLoadingMore(false);
113
+ }, [gql, viewerId, listQueryEnabled, hasMore, loadingMore, loading]);
114
+ React.useEffect(() => {
115
+ if (!listQueryEnabled) {
116
+ setLoading(true);
117
+ return;
118
+ }
119
+ void load("initial");
120
+ }, [load, listQueryEnabled]);
121
+ React.useEffect(() => {
122
+ if (gql.reconnectEpoch > 0) void load("refresh");
123
+ }, [gql.reconnectEpoch]);
124
+ const markRead = React.useCallback((channelId) => {
125
+ setConversations((prev) => prev.map((c) => c.id === channelId ? __spreadProps(__spreadValues({}, c), {
126
+ unreadCount: 0
127
+ }) : c));
128
+ }, []);
129
+ const applyConversationMessage = React.useCallback((channelId, post) => {
130
+ if (!viewerId) return;
131
+ setConversations((prev) => {
132
+ const idx = prev.findIndex((c) => c.id === channelId);
133
+ if (idx < 0) return prev;
134
+ const updated = patchConversationAfterPost(prev[idx], post, viewerId);
135
+ const rest = prev.filter((c) => c.id !== channelId);
136
+ return sortConversations([updated, ...rest]);
137
+ });
138
+ }, [viewerId]);
139
+ const listSyncKey = (opts == null ? void 0 : opts.syncListRealtime) ? conversations.map((c) => c.id).slice(0, 12).join("|") : "";
140
+ React.useEffect(() => {
141
+ if (!(opts == null ? void 0 : opts.syncListRealtime) || !viewerId || !listSyncKey) return void 0;
142
+ const channelIds = listSyncKey.split("|").filter(Boolean);
143
+ const unsubs = channelIds.map((channelId) => gql.subscribe(MESSAGE_ADDED_SUBSCRIPTION_WS, {
144
+ channelId
145
+ }, {
146
+ next: (data) => {
147
+ var _a2;
148
+ const post = data == null ? void 0 : data.chatMessageAdded;
149
+ if (!post || !mounted.current) return;
150
+ applyConversationMessage(channelId, post);
151
+ (_a2 = gql.patchChannelListAfterMessage) == null ? void 0 : _a2.call(gql, channelId, post);
152
+ }
153
+ }));
154
+ return () => {
155
+ unsubs.forEach((off) => off());
156
+ };
157
+ }, [gql, viewerId, listSyncKey, opts == null ? void 0 : opts.syncListRealtime, applyConversationMessage]);
158
+ React.useEffect(() => {
159
+ mounted.current = true;
160
+ return () => {
161
+ mounted.current = false;
162
+ };
163
+ }, []);
164
+ const findExistingDirect = React.useCallback((peerUserId, peerName) => {
165
+ const peerKey = String(peerUserId);
166
+ const nameKey = peerName.trim().toLowerCase();
167
+ return conversationsRef.current.find((c) => {
168
+ var _a2, _b;
169
+ return c.isDirect && (((_a2 = c.peer) == null ? void 0 : _a2.id) && String(c.peer.id) === peerKey || !((_b = c.peer) == null ? void 0 : _b.id) && c.title.trim().toLowerCase() === nameKey);
170
+ });
171
+ }, []);
172
+ const openDirect = React.useCallback(async (peerUserId, peerName) => {
173
+ var _a2;
174
+ if (!isMongoAccountId(peerUserId) || peerUserId === viewerId) return null;
175
+ const existing = findExistingDirect(peerUserId, peerName);
176
+ if (existing) return existing.id;
177
+ const res = await gql.mutate(CREATE_DIRECT_CHANNEL_MUTATION, {
178
+ receiver: [peerUserId],
179
+ displayName: peerName
180
+ });
181
+ const message = firstErrorMessage(res.errors);
182
+ if (message) {
183
+ setError(message);
184
+ return null;
185
+ }
186
+ const channel = (_a2 = res.data) == null ? void 0 : _a2.createDirectChannel;
187
+ if (!(channel == null ? void 0 : channel.id) || !viewerId) {
188
+ setError("Could not start this conversation. Please try again.");
189
+ return null;
190
+ }
191
+ setConversations((prev) => mergeConversations(prev, [toConversation(channel, viewerId)]));
192
+ return String(channel.id);
193
+ }, [gql, viewerId, findExistingDirect]);
194
+ return {
195
+ conversations,
196
+ loading,
197
+ error,
198
+ refreshing,
199
+ refresh: () => void load("refresh"),
200
+ hasMore,
201
+ loadingMore,
202
+ loadMore: () => void loadMore(),
203
+ markRead,
204
+ applyConversationMessage,
205
+ openDirect
206
+ };
207
+ }
208
+ function useThread(gql, channelId, viewer, opts) {
209
+ var _a;
210
+ const [messages, setMessages] = React.useState([]);
211
+ const [loading, setLoading] = React.useState(true);
212
+ const [loadingMore, setLoadingMore] = React.useState(false);
213
+ const [hasMore, setHasMore] = React.useState(true);
214
+ const [error, setError] = React.useState(null);
215
+ const viewerId = (_a = viewer == null ? void 0 : viewer.userId) != null ? _a : null;
216
+ const mounted = React.useRef(true);
217
+ const pending = React.useRef(/* @__PURE__ */ new Map());
218
+ const onConversationMessage = opts == null ? void 0 : opts.onConversationMessage;
219
+ const notifyList = React.useCallback((post) => {
220
+ var _a2;
221
+ if (!channelId) return;
222
+ onConversationMessage == null ? void 0 : onConversationMessage(post);
223
+ (_a2 = gql.patchChannelListAfterMessage) == null ? void 0 : _a2.call(gql, channelId, post);
224
+ }, [channelId, gql, onConversationMessage]);
225
+ React.useEffect(() => {
226
+ mounted.current = true;
227
+ return () => {
228
+ mounted.current = false;
229
+ };
230
+ }, []);
231
+ const fetchPage = React.useCallback(async (skip) => {
232
+ var _a2, _b, _c, _d, _e;
233
+ if (!channelId || !viewerId) return;
234
+ const res = await gql.query(MESSAGES_QUERY, {
235
+ channelId,
236
+ limit: PAGE_SIZE,
237
+ skip
238
+ }, {
239
+ fetchPolicy: "network-only"
240
+ });
241
+ if (!mounted.current) return;
242
+ const rows = ((_c = (_b = (_a2 = res.data) == null ? void 0 : _a2.messages) == null ? void 0 : _b.data) != null ? _c : []).filter(Boolean);
243
+ setMessages((prev) => mergeMessages(prev, rows.map((p) => toChatMessage(p, viewerId))));
244
+ const total = (_e = (_d = res.data) == null ? void 0 : _d.messages) == null ? void 0 : _e.totalCount;
245
+ setHasMore(typeof total === "number" ? skip + rows.length < total : rows.length >= PAGE_SIZE);
246
+ setError(firstErrorMessage(res.errors));
247
+ setLoading(false);
248
+ setLoadingMore(false);
249
+ }, [gql, channelId, viewerId]);
250
+ React.useEffect(() => {
251
+ let cancelled = false;
252
+ setMessages([]);
253
+ setHasMore(true);
254
+ setLoading(true);
255
+ pending.current.clear();
256
+ if (channelId && viewerId) {
257
+ void gql.query(MESSAGES_QUERY, {
258
+ channelId,
259
+ limit: PAGE_SIZE,
260
+ skip: 0
261
+ }, {
262
+ fetchPolicy: "cache-only"
263
+ }).then((cached) => {
264
+ var _a2, _b, _c;
265
+ const rows = ((_c = (_b = (_a2 = cached.data) == null ? void 0 : _a2.messages) == null ? void 0 : _b.data) != null ? _c : []).filter(Boolean);
266
+ if (cancelled || !mounted.current || !rows.length) return;
267
+ setMessages((prev) => prev.length ? prev : mergeMessages([], rows.map((p) => toChatMessage(p, viewerId))));
268
+ setLoading(false);
269
+ });
270
+ }
271
+ void fetchPage(0);
272
+ return () => {
273
+ cancelled = true;
274
+ };
275
+ }, [fetchPage, gql, channelId, viewerId]);
276
+ React.useEffect(() => {
277
+ if (gql.reconnectEpoch > 0) void fetchPage(0);
278
+ }, [gql.reconnectEpoch]);
279
+ React.useEffect(() => {
280
+ if (!channelId || !viewerId) return void 0;
281
+ return gql.subscribe(MESSAGE_ADDED_SUBSCRIPTION_WS, {
282
+ channelId
283
+ }, {
284
+ next: (data) => {
285
+ const post = data == null ? void 0 : data.chatMessageAdded;
286
+ if (!post || !mounted.current) return;
287
+ const incoming = toChatMessage(post, viewerId);
288
+ setMessages((prev) => reconcileOptimistic(prev, incoming));
289
+ notifyList(post);
290
+ },
291
+ error: (err) => mounted.current && setError(err.message)
292
+ });
293
+ }, [gql, channelId, viewerId, notifyList]);
294
+ const send = React.useCallback(async (body) => {
295
+ var _a2, _b, _c;
296
+ const text = body.trim();
297
+ if (!text || !channelId || !viewerId) return;
298
+ const clientId = `pending-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
299
+ const optimistic = {
300
+ id: clientId,
301
+ body: text,
302
+ createdAt: Date.now(),
303
+ authorId: viewerId,
304
+ authorName: (_a2 = viewer == null ? void 0 : viewer.displayName) != null ? _a2 : "You",
305
+ authorAvatar: (_b = viewer == null ? void 0 : viewer.avatarUrl) != null ? _b : null,
306
+ isMine: true,
307
+ isDeleted: false,
308
+ isEdited: false,
309
+ attachments: [],
310
+ reactions: [],
311
+ sendState: "sending"
312
+ };
313
+ pending.current.set(clientId, text);
314
+ setMessages((prev) => mergeMessages(prev, [optimistic]));
315
+ onConversationMessage == null ? void 0 : onConversationMessage({
316
+ id: clientId,
317
+ message: text,
318
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
319
+ creator: {
320
+ id: viewerId
321
+ }
322
+ });
323
+ const res = await gql.mutate(SEND_MESSAGE_MUTATION, {
324
+ channelId,
325
+ messageInput: {
326
+ content: text
327
+ }
328
+ });
329
+ if (!mounted.current) return;
330
+ const message = firstErrorMessage(res.errors);
331
+ const saved = (_c = res.data) == null ? void 0 : _c.sendMessage;
332
+ if (message || !saved) {
333
+ setMessages((prev) => prev.map((m) => m.id === clientId ? __spreadProps(__spreadValues({}, m), {
334
+ sendState: "failed"
335
+ }) : m));
336
+ setError(message);
337
+ return;
338
+ }
339
+ pending.current.delete(clientId);
340
+ setMessages((prev) => reconcileOptimistic(prev, toChatMessage(saved, viewerId)));
341
+ notifyList(saved);
342
+ }, [gql, channelId, viewerId, viewer, notifyList, onConversationMessage]);
343
+ const retry = React.useCallback((messageId) => {
344
+ const body = pending.current.get(messageId);
345
+ if (!body) return;
346
+ pending.current.delete(messageId);
347
+ setMessages((prev) => prev.filter((m) => m.id !== messageId));
348
+ void send(body);
349
+ }, [send]);
350
+ const loadMore = React.useCallback(() => {
351
+ if (loadingMore || !hasMore || loading) return;
352
+ setLoadingMore(true);
353
+ void fetchPage(messages.filter((m) => !m.sendState || m.sendState === "sent").length);
354
+ }, [fetchPage, loadingMore, hasMore, loading, messages]);
355
+ React.useEffect(() => {
356
+ if (!channelId || !viewerId) return void 0;
357
+ return gql.subscribe(REACTION_CHANGED_SUBSCRIPTION_WS, {
358
+ channelId
359
+ }, {
360
+ next: (data) => {
361
+ const event = data == null ? void 0 : data.chatReactionChanged;
362
+ if (!(event == null ? void 0 : event.postId) || !mounted.current) return;
363
+ setMessages((prev) => applyReactionSummary(prev, String(event.postId), event.reactions, viewerId));
364
+ }
365
+ });
366
+ }, [gql, channelId, viewerId]);
367
+ const messagesRef = React.useRef(messages);
368
+ messagesRef.current = messages;
369
+ const react = React.useCallback((messageId, emoji) => {
370
+ var _a2, _b;
371
+ if (!channelId || !viewerId) return;
372
+ const target = messagesRef.current.find((m) => m.id === messageId);
373
+ if (!target || target.sendState && target.sendState !== "sent") return;
374
+ const before = target.reactions;
375
+ const after = withViewerReaction(before, emoji, viewerId);
376
+ const next = (_b = (_a2 = after.find((r) => r.mine)) == null ? void 0 : _a2.reaction) != null ? _b : null;
377
+ setMessages((prev) => prev.map((m) => m.id === messageId ? __spreadProps(__spreadValues({}, m), {
378
+ reactions: after
379
+ }) : m));
380
+ void (async () => {
381
+ var _a3, _b2, _c;
382
+ const res = await gql.mutate(SET_MESSAGE_REACTION_MUTATION, {
383
+ channelId,
384
+ postId: messageId,
385
+ reaction: next
386
+ });
387
+ if (!mounted.current) return;
388
+ if (((_a3 = res.errors) == null ? void 0 : _a3.length) || !((_b2 = res.data) == null ? void 0 : _b2.setMessageReaction)) {
389
+ setMessages((prev) => prev.map((m) => m.id === messageId ? __spreadProps(__spreadValues({}, m), {
390
+ reactions: before
391
+ }) : m));
392
+ setError((_c = firstErrorMessage(res.errors)) != null ? _c : "Could not update the reaction.");
393
+ return;
394
+ }
395
+ setMessages((prev) => {
396
+ var _a4;
397
+ return applyReactionSummary(prev, messageId, (_a4 = res.data) == null ? void 0 : _a4.setMessageReaction, viewerId);
398
+ });
399
+ })();
400
+ }, [gql, channelId, viewerId]);
401
+ return {
402
+ messages,
403
+ loading,
404
+ loadingMore,
405
+ hasMore,
406
+ error,
407
+ send,
408
+ loadMore,
409
+ retry,
410
+ react
411
+ };
412
+ }
413
+ function useMarkRead(gql, channelId, onMarked) {
414
+ React.useEffect(() => {
415
+ if (!channelId) return;
416
+ onMarked(channelId);
417
+ void gql.mutate(VIEW_CHANNEL_MUTATION, {
418
+ id: channelId
419
+ });
420
+ }, [channelId]);
421
+ }export{useConversations,useMarkRead,useThread};//# sourceMappingURL=useChatData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChatData.js","sources":["../../../src/features/messaging/useChatData.ts"],"sourcesContent":["/**\n * The chat surface's data layer: conversations, one transcript, and sending.\n *\n * Hooks rather than a store, because the remote must not pull in redux or\n * Apollo - everything reaches the network through `ChatGraphQLSeam`. The\n * shaping and merging all live in `chatModel.ts` as pure functions; what is\n * here is the effect wiring around them.\n *\n * Two behaviours are worth knowing about:\n *\n * - **`reconnectEpoch` drives recovery.** The host bumps it on every\n * successful (re)connect. Both hooks re-fetch their head page when it\n * changes, because a dropped socket means missed subscription frames and the\n * only honest fix is to re-read. Merging is idempotent, so healing a gap\n * never duplicates anything.\n * - **Errors are state, not exceptions.** The seam resolves with `{data,\n * errors}` and never rejects, so a failure renders an inline banner over\n * whatever is already on screen instead of unmounting the transcript.\n */\nimport * as React from 'react';\nimport {\n CHANNELS_QUERY,\n CREATE_DIRECT_CHANNEL_MUTATION,\n MESSAGES_QUERY,\n MESSAGE_ADDED_SUBSCRIPTION_WS,\n REACTION_CHANGED_SUBSCRIPTION_WS,\n SEND_MESSAGE_MUTATION,\n SET_MESSAGE_REACTION_MUTATION,\n VIEW_CHANNEL_MUTATION,\n} from './chatOperations';\nimport {\n applyReactionSummary,\n withViewerReaction,\n type WireReaction,\n mergeConversations,\n mergeMessages,\n patchConversationAfterPost,\n reconcileOptimistic,\n sortConversations,\n toChatMessage,\n toConversation,\n type ChatConversation,\n type ChatMessage,\n type WireChannel,\n type WirePost,\n} from './chatModel';\nimport type { ChatGraphQLSeam, ChatHostServices, ChatViewer } from './chatHost';\nimport {\n isMongoAccountId,\n isNativeMessengerChannel,\n NATIVE_CHAT_CHANNELS_QUERY_VARS,\n NATIVE_CHAT_LIST_PAGE_SIZE,\n} from './nativeChatChannelQuery';\n\n/** Messages fetched per page in a thread. */\nconst PAGE_SIZE = 20;\n\nfunction firstErrorMessage(errors?: { message: string }[]): string | null {\n if (!errors?.length) return null;\n const raw = errors[0].message || 'Something went wrong.';\n if (/Cannot return null for non-nullable field Channel\\.id/i.test(raw)) return null;\n if (/status code 400/i.test(raw)) return 'Could not load messages for this chat.';\n if (/status code 401/i.test(raw) || /status code 403/i.test(raw))\n return 'You do not have access to this conversation.';\n return raw;\n}\n\ninterface MessagesQueryPayload {\n messages?: {\n data?: (WirePost | null)[] | null;\n totalCount?: number | null;\n } | null;\n}\n\nfunction sortChannelsByRecentActivity(rows: WireChannel[]): WireChannel[] {\n return [...rows].sort((left, right) => {\n const leftTime = left.lastPostAt ? new Date(left.lastPostAt).getTime() : 0;\n const rightTime = right.lastPostAt ? new Date(right.lastPostAt).getTime() : 0;\n return rightTime - leftTime;\n });\n}\n\nexport interface ConversationsState {\n conversations: ChatConversation[];\n loading: boolean;\n error: string | null;\n refreshing: boolean;\n refresh: () => void;\n /** More conversations exist on the server beyond what is loaded. */\n hasMore: boolean;\n loadingMore: boolean;\n /** Fetch the next page of conversations. */\n loadMore: () => void;\n /** Locally zero the badge so the list responds before the server confirms. */\n markRead: (channelId: string) => void;\n /** Move a row to the top with an updated preview after send/subscription. */\n applyConversationMessage: (channelId: string, post: WirePost) => void;\n openDirect: (peerUserId: string, peerName: string) => Promise<string | null>;\n}\n\nexport function useConversations(\n services: ChatHostServices,\n viewer: ChatViewer | null,\n opts?: {\n syncListRealtime?: boolean;\n /** Wait for host to set yantra-chat org before querying. */ listQueryEnabled?: boolean;\n },\n): ConversationsState {\n const { gql } = services;\n const [conversations, setConversations] = React.useState<ChatConversation[]>([]);\n const [loading, setLoading] = React.useState(true);\n const [refreshing, setRefreshing] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const [hasMore, setHasMore] = React.useState(false);\n const [loadingMore, setLoadingMore] = React.useState(false);\n const viewerId = viewer?.userId ?? null;\n const mounted = React.useRef(true);\n const conversationsRef = React.useRef<ChatConversation[]>([]);\n /** Raw server rows consumed so far (before the client-side filter), i.e. the next `skip`. */\n const serverOffset = React.useRef(0);\n\n React.useEffect(() => {\n conversationsRef.current = conversations;\n }, [conversations]);\n\n const listQueryEnabled = opts?.listQueryEnabled !== false;\n\n const load = React.useCallback(\n async (mode: 'initial' | 'refresh') => {\n if (!viewerId || !listQueryEnabled) return;\n if (mode === 'refresh') setRefreshing(true);\n if (mode === 'initial') {\n // Paint the Apollo-cached list immediately; the network read below replaces it.\n const cached = await gql.query<{ channelsByUser?: (WireChannel | null)[] | null }>(\n CHANNELS_QUERY,\n NATIVE_CHAT_CHANNELS_QUERY_VARS,\n { fetchPolicy: 'cache-only' },\n );\n const cachedRows = (cached.data?.channelsByUser ?? [])\n .filter(Boolean)\n .filter(isNativeMessengerChannel) as WireChannel[];\n if (mounted.current && cachedRows.length) {\n setConversations(\n mergeConversations(\n [],\n sortChannelsByRecentActivity(cachedRows).map((c) => toConversation(c, viewerId)),\n ),\n );\n setLoading(false);\n }\n }\n const res = await gql.query<{ channelsByUser?: (WireChannel | null)[] | null }>(\n CHANNELS_QUERY,\n NATIVE_CHAT_CHANNELS_QUERY_VARS,\n // network-only: a stale conversation list is the single most\n // visible staleness in a chat app, and this is one small page.\n { fetchPolicy: 'network-only' },\n );\n if (!mounted.current) return;\n\n const message = firstErrorMessage(res.errors);\n const raw = (res.data?.channelsByUser ?? []).filter(Boolean) as WireChannel[];\n const rows = raw.filter(isNativeMessengerChannel);\n\n // Partial data with errors is normal here (one bad channel should\n // not blank the list), so render what arrived AND show the banner.\n // Initial/refresh always resets to the first page.\n if (rows.length || !message) {\n setConversations(\n mergeConversations(\n [],\n sortChannelsByRecentActivity(rows).map((c) => toConversation(c, viewerId)),\n ),\n );\n serverOffset.current = raw.length;\n setHasMore(raw.length >= NATIVE_CHAT_LIST_PAGE_SIZE);\n }\n setError(message);\n setLoading(false);\n setRefreshing(false);\n },\n [gql, viewerId, listQueryEnabled],\n );\n\n const loadMore = React.useCallback(async () => {\n if (!viewerId || !listQueryEnabled || !hasMore || loadingMore || loading) return;\n setLoadingMore(true);\n const res = await gql.query<{ channelsByUser?: (WireChannel | null)[] | null }>(\n CHANNELS_QUERY,\n { ...NATIVE_CHAT_CHANNELS_QUERY_VARS, skip: serverOffset.current },\n { fetchPolicy: 'network-only' },\n );\n if (!mounted.current) return;\n const message = firstErrorMessage(res.errors);\n const raw = (res.data?.channelsByUser ?? []).filter(Boolean) as WireChannel[];\n const rows = raw.filter(isNativeMessengerChannel);\n if (rows.length) {\n setConversations((prev) =>\n mergeConversations(\n prev,\n rows.map((c) => toConversation(c, viewerId)),\n ),\n );\n }\n if (!message) {\n serverOffset.current += raw.length;\n setHasMore(raw.length >= NATIVE_CHAT_LIST_PAGE_SIZE);\n }\n setError(message);\n setLoadingMore(false);\n }, [gql, viewerId, listQueryEnabled, hasMore, loadingMore, loading]);\n\n React.useEffect(() => {\n if (!listQueryEnabled) {\n setLoading(true);\n return;\n }\n void load('initial');\n }, [load, listQueryEnabled]);\n\n // Re-read the list on every reconnect: while the socket was down the list\n // could have moved for reasons no subscription frame will now tell us.\n React.useEffect(() => {\n if (gql.reconnectEpoch > 0) void load('refresh');\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [gql.reconnectEpoch]);\n\n const markRead = React.useCallback((channelId: string) => {\n setConversations((prev) => prev.map((c) => (c.id === channelId ? { ...c, unreadCount: 0 } : c)));\n }, []);\n\n const applyConversationMessage = React.useCallback(\n (channelId: string, post: WirePost) => {\n if (!viewerId) return;\n setConversations((prev) => {\n const idx = prev.findIndex((c) => c.id === channelId);\n if (idx < 0) return prev;\n const updated = patchConversationAfterPost(prev[idx], post, viewerId);\n const rest = prev.filter((c) => c.id !== channelId);\n return sortConversations([updated, ...rest]);\n });\n },\n [viewerId],\n );\n\n const listSyncKey = opts?.syncListRealtime\n ? conversations\n .map((c) => c.id)\n .slice(0, 12)\n .join('|')\n : '';\n\n React.useEffect(() => {\n if (!opts?.syncListRealtime || !viewerId || !listSyncKey) return undefined;\n const channelIds = listSyncKey.split('|').filter(Boolean);\n const unsubs = channelIds.map((channelId) =>\n gql.subscribe<{ chatMessageAdded?: WirePost | null }>(\n MESSAGE_ADDED_SUBSCRIPTION_WS,\n { channelId },\n {\n next: (data) => {\n const post = data?.chatMessageAdded;\n if (!post || !mounted.current) return;\n applyConversationMessage(channelId, post);\n gql.patchChannelListAfterMessage?.(channelId, post);\n },\n },\n ),\n );\n return () => {\n unsubs.forEach((off) => off());\n };\n }, [gql, viewerId, listSyncKey, opts?.syncListRealtime, applyConversationMessage]);\n\n React.useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const findExistingDirect = React.useCallback((peerUserId: string, peerName: string) => {\n const peerKey = String(peerUserId);\n const nameKey = peerName.trim().toLowerCase();\n return conversationsRef.current.find(\n (c) =>\n c.isDirect &&\n ((c.peer?.id && String(c.peer.id) === peerKey) ||\n (!c.peer?.id && c.title.trim().toLowerCase() === nameKey)),\n );\n }, []);\n\n const openDirect = React.useCallback(\n async (peerUserId: string, peerName: string): Promise<string | null> => {\n if (!isMongoAccountId(peerUserId) || peerUserId === viewerId) return null;\n const existing = findExistingDirect(peerUserId, peerName);\n if (existing) return existing.id;\n\n const res = await gql.mutate<{ createDirectChannel?: WireChannel | null }>(CREATE_DIRECT_CHANNEL_MUTATION, {\n receiver: [peerUserId],\n displayName: peerName,\n });\n const message = firstErrorMessage(res.errors);\n if (message) {\n setError(message);\n return null;\n }\n const channel = res.data?.createDirectChannel;\n if (!channel?.id || !viewerId) {\n // firstErrorMessage hides the null-Channel.id error, so a failed create would otherwise do nothing on tap.\n setError('Could not start this conversation. Please try again.');\n return null;\n }\n // Idempotent server-side, so an existing DM lands here too and just\n // merges over its own row rather than appearing twice.\n setConversations((prev) => mergeConversations(prev, [toConversation(channel, viewerId)]));\n return String(channel.id);\n },\n [gql, viewerId, findExistingDirect],\n );\n\n return {\n conversations,\n loading,\n error,\n refreshing,\n refresh: () => void load('refresh'),\n hasMore,\n loadingMore,\n loadMore: () => void loadMore(),\n markRead,\n applyConversationMessage,\n openDirect,\n };\n}\n\nexport interface ThreadState {\n messages: ChatMessage[];\n loading: boolean;\n loadingMore: boolean;\n hasMore: boolean;\n error: string | null;\n send: (body: string) => Promise<void>;\n loadMore: () => void;\n retry: (messageId: string) => void;\n /** Pick (or, with the same emoji / null, remove) the viewer's Tapback on a message. */\n react: (messageId: string, emoji: string | null) => void;\n}\n\nexport function useThread(\n gql: ChatGraphQLSeam,\n channelId: string | null,\n viewer: ChatViewer | null,\n opts?: { onConversationMessage?: (post: WirePost) => void },\n): ThreadState {\n const [messages, setMessages] = React.useState<ChatMessage[]>([]);\n const [loading, setLoading] = React.useState(true);\n const [loadingMore, setLoadingMore] = React.useState(false);\n const [hasMore, setHasMore] = React.useState(true);\n const [error, setError] = React.useState<string | null>(null);\n const viewerId = viewer?.userId ?? null;\n const mounted = React.useRef(true);\n /** Bodies of rows still in flight, so a retry can find them. */\n const pending = React.useRef(new Map<string, string>());\n\n const onConversationMessage = opts?.onConversationMessage;\n const notifyList = React.useCallback(\n (post: WirePost) => {\n if (!channelId) return;\n onConversationMessage?.(post);\n gql.patchChannelListAfterMessage?.(channelId, post);\n },\n [channelId, gql, onConversationMessage],\n );\n\n React.useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const fetchPage = React.useCallback(\n async (skip: number) => {\n if (!channelId || !viewerId) return;\n const res = await gql.query<MessagesQueryPayload>(\n MESSAGES_QUERY,\n { channelId, limit: PAGE_SIZE, skip },\n { fetchPolicy: 'network-only' },\n );\n if (!mounted.current) return;\n\n const rows = (res.data?.messages?.data ?? []).filter(Boolean) as WirePost[];\n setMessages((prev) =>\n mergeMessages(\n prev,\n rows.map((p) => toChatMessage(p, viewerId)),\n ),\n );\n // Short page means the end. Offset paging can also repeat rows, but\n // mergeMessages de-duplicates so that is invisible.\n const total = res.data?.messages?.totalCount;\n setHasMore(typeof total === 'number' ? skip + rows.length < total : rows.length >= PAGE_SIZE);\n setError(firstErrorMessage(res.errors));\n setLoading(false);\n setLoadingMore(false);\n },\n [gql, channelId, viewerId],\n );\n\n // Reset hard when the channel changes: keeping the previous transcript for\n // even one frame shows the wrong conversation under the right title.\n React.useEffect(() => {\n let cancelled = false;\n setMessages([]);\n setHasMore(true);\n setLoading(true);\n pending.current.clear();\n if (channelId && viewerId) {\n // Paint the Apollo-cached head page immediately (a revisit shows the transcript with no\n // spinner); the network-only fetch below then replaces it with the server's truth.\n void gql\n .query<MessagesQueryPayload>(\n MESSAGES_QUERY,\n { channelId, limit: PAGE_SIZE, skip: 0 },\n { fetchPolicy: 'cache-only' },\n )\n .then((cached) => {\n const rows = (cached.data?.messages?.data ?? []).filter(Boolean) as WirePost[];\n if (cancelled || !mounted.current || !rows.length) return;\n setMessages((prev) =>\n prev.length\n ? prev\n : mergeMessages(\n [],\n rows.map((p) => toChatMessage(p, viewerId)),\n ),\n );\n setLoading(false);\n });\n }\n void fetchPage(0);\n return () => {\n cancelled = true;\n };\n }, [fetchPage, gql, channelId, viewerId]);\n\n React.useEffect(() => {\n if (gql.reconnectEpoch > 0) void fetchPage(0);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [gql.reconnectEpoch]);\n\n // Live messages. The host owns socket retry; this just holds the handle.\n React.useEffect(() => {\n if (!channelId || !viewerId) return undefined;\n return gql.subscribe<{ chatMessageAdded?: WirePost | null }>(\n MESSAGE_ADDED_SUBSCRIPTION_WS,\n { channelId },\n {\n next: (data) => {\n const post = data?.chatMessageAdded;\n if (!post || !mounted.current) return;\n const incoming = toChatMessage(post, viewerId);\n // The echo of the viewer's own send arrives here too, so it\n // must reconcile rather than append.\n setMessages((prev) => reconcileOptimistic(prev, incoming));\n notifyList(post);\n },\n error: (err) => mounted.current && setError(err.message),\n },\n );\n }, [gql, channelId, viewerId, notifyList]);\n\n const send = React.useCallback(\n async (body: string) => {\n const text = body.trim();\n if (!text || !channelId || !viewerId) return;\n\n const clientId = `pending-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n const optimistic: ChatMessage = {\n id: clientId,\n body: text,\n createdAt: Date.now(),\n authorId: viewerId,\n authorName: viewer?.displayName ?? 'You',\n authorAvatar: viewer?.avatarUrl ?? null,\n isMine: true,\n isDeleted: false,\n isEdited: false,\n attachments: [],\n reactions: [],\n sendState: 'sending',\n };\n pending.current.set(clientId, text);\n setMessages((prev) => mergeMessages(prev, [optimistic]));\n onConversationMessage?.({\n id: clientId,\n message: text,\n createdAt: new Date().toISOString(),\n creator: { id: viewerId },\n });\n\n const res = await gql.mutate<{ sendMessage?: WirePost | null }>(SEND_MESSAGE_MUTATION, {\n channelId,\n messageInput: { content: text },\n });\n if (!mounted.current) return;\n\n const message = firstErrorMessage(res.errors);\n const saved = res.data?.sendMessage;\n if (message || !saved) {\n // Keep the text on screen and mark it failed. Dropping a\n // message the user typed is never acceptable.\n setMessages((prev) =>\n prev.map((m) => (m.id === clientId ? { ...m, sendState: 'failed' as const } : m)),\n );\n setError(message);\n return;\n }\n pending.current.delete(clientId);\n setMessages((prev) => reconcileOptimistic(prev, toChatMessage(saved, viewerId)));\n notifyList(saved);\n },\n [gql, channelId, viewerId, viewer, notifyList, onConversationMessage],\n );\n\n const retry = React.useCallback(\n (messageId: string) => {\n const body = pending.current.get(messageId);\n if (!body) return;\n pending.current.delete(messageId);\n setMessages((prev) => prev.filter((m) => m.id !== messageId));\n void send(body);\n },\n [send],\n );\n\n const loadMore = React.useCallback(() => {\n if (loadingMore || !hasMore || loading) return;\n setLoadingMore(true);\n // Count only server rows: optimistic ones are not in the server's\n // offset space and would skip a real message on the next page.\n void fetchPage(messages.filter((m) => !m.sendState || m.sendState === 'sent').length);\n }, [fetchPage, loadingMore, hasMore, loading, messages]);\n\n // Live Tapbacks from anyone in the conversation, including the viewer's other devices.\n React.useEffect(() => {\n if (!channelId || !viewerId) return undefined;\n return gql.subscribe<{\n chatReactionChanged?: { postId?: string | null; reactions?: WireReaction[] | null } | null;\n }>(\n REACTION_CHANGED_SUBSCRIPTION_WS,\n { channelId },\n {\n next: (data) => {\n const event = data?.chatReactionChanged;\n if (!event?.postId || !mounted.current) return;\n setMessages((prev) => applyReactionSummary(prev, String(event.postId), event.reactions, viewerId));\n },\n },\n );\n }, [gql, channelId, viewerId]);\n\n const messagesRef = React.useRef(messages);\n messagesRef.current = messages;\n\n const react = React.useCallback(\n (messageId: string, emoji: string | null) => {\n if (!channelId || !viewerId) return;\n const target = messagesRef.current.find((m) => m.id === messageId);\n // Only confirmed server rows can carry reactions.\n if (!target || (target.sendState && target.sendState !== 'sent')) return;\n const before = target.reactions;\n const after = withViewerReaction(before, emoji, viewerId);\n const next = after.find((r) => r.mine)?.reaction ?? null;\n setMessages((prev) => prev.map((m) => (m.id === messageId ? { ...m, reactions: after } : m)));\n\n void (async () => {\n const res = await gql.mutate<{ setMessageReaction?: WireReaction[] | null }>(\n SET_MESSAGE_REACTION_MUTATION,\n { channelId, postId: messageId, reaction: next },\n );\n if (!mounted.current) return;\n if (res.errors?.length || !res.data?.setMessageReaction) {\n setMessages((prev) => prev.map((m) => (m.id === messageId ? { ...m, reactions: before } : m)));\n setError(firstErrorMessage(res.errors) ?? 'Could not update the reaction.');\n return;\n }\n setMessages((prev) => applyReactionSummary(prev, messageId, res.data?.setMessageReaction, viewerId));\n })();\n },\n [gql, channelId, viewerId],\n );\n\n return { messages, loading, loadingMore, hasMore, error, send, loadMore, retry, react };\n}\n\n/** Fire-and-forget read receipt; the badge is already cleared locally. */\nexport function useMarkRead(gql: ChatGraphQLSeam, channelId: string | null, onMarked: (id: string) => void) {\n React.useEffect(() => {\n if (!channelId) return;\n onMarked(channelId);\n void gql.mutate(VIEW_CHANNEL_MUTATION, { id: channelId });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [channelId]);\n}\n"],"names":["_a","_b"],"mappings":"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"}