stream-chat-react 14.12.0 → 15.0.0-rc.1

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 (1428) hide show
  1. package/dist/cjs/ListItemLayout.60c3b287.js +2181 -0
  2. package/dist/cjs/ListItemLayout.60c3b287.js.map +1 -0
  3. package/dist/cjs/{ReactPlayerWrapper.7cc7b0d8.js → ReactPlayerWrapper.f04b1d06.js} +3 -3
  4. package/dist/cjs/{ReactPlayerWrapper.7cc7b0d8.js.map → ReactPlayerWrapper.f04b1d06.js.map} +1 -1
  5. package/dist/cjs/SlotLayout.de45be2d.js +1672 -0
  6. package/dist/cjs/SlotLayout.de45be2d.js.map +1 -0
  7. package/dist/cjs/Thread.373af587.js +7479 -0
  8. package/dist/cjs/Thread.373af587.js.map +1 -0
  9. package/dist/cjs/channel-detail.js +409 -389
  10. package/dist/cjs/channel-detail.js.map +1 -1
  11. package/dist/cjs/emojis.js +18 -16
  12. package/dist/cjs/emojis.js.map +1 -1
  13. package/dist/cjs/index.js +14467 -20208
  14. package/dist/cjs/index.js.map +1 -1
  15. package/dist/cjs/slot-geometry.js +145 -0
  16. package/dist/cjs/slot-geometry.js.map +1 -0
  17. package/dist/cjs/slot-layout.js +37 -0
  18. package/dist/cjs/useChannel.1004ed4c.js +18 -0
  19. package/dist/cjs/useChannel.1004ed4c.js.map +1 -0
  20. package/dist/cjs/useComponentContextIcons.d16834d9.js +1729 -0
  21. package/dist/cjs/useComponentContextIcons.d16834d9.js.map +1 -0
  22. package/dist/cjs/useIsCooldownActive.1f778bc1.js +110 -0
  23. package/dist/cjs/useIsCooldownActive.1f778bc1.js.map +1 -0
  24. package/dist/css/channel-detail.css.map +1 -1
  25. package/dist/css/index.css +208 -103
  26. package/dist/css/index.css.map +1 -1
  27. package/dist/es/a11y/accessibleLabel.mjs +6 -2
  28. package/dist/es/a11y/accessibleLabel.mjs.map +1 -1
  29. package/dist/es/components/AIStateIndicator/AIStateIndicator.mjs +6 -5
  30. package/dist/es/components/AIStateIndicator/AIStateIndicator.mjs.map +1 -1
  31. package/dist/es/components/AIStateIndicator/hooks/useAIState.mjs +9 -33
  32. package/dist/es/components/AIStateIndicator/hooks/useAIState.mjs.map +1 -1
  33. package/dist/es/components/Accessibility/NotificationAnnouncer.mjs +2 -3
  34. package/dist/es/components/Accessibility/NotificationAnnouncer.mjs.map +1 -1
  35. package/dist/es/components/Accessibility/hooks/useIncomingMessageAnnouncements.mjs +10 -5
  36. package/dist/es/components/Accessibility/hooks/useIncomingMessageAnnouncements.mjs.map +1 -1
  37. package/dist/es/components/Accessibility/hooks/useInteractionAnnouncements.mjs +38 -28
  38. package/dist/es/components/Accessibility/hooks/useInteractionAnnouncements.mjs.map +1 -1
  39. package/dist/es/components/Accessibility/useAriaLiveAnnouncer.mjs +5 -8
  40. package/dist/es/components/Accessibility/useAriaLiveAnnouncer.mjs.map +1 -1
  41. package/dist/es/components/Attachment/Attachment.mjs +21 -6
  42. package/dist/es/components/Attachment/Attachment.mjs.map +1 -1
  43. package/dist/es/components/Attachment/AttachmentActions.mjs +10 -9
  44. package/dist/es/components/Attachment/AttachmentActions.mjs.map +1 -1
  45. package/dist/es/components/Attachment/AttachmentContainer.mjs +21 -17
  46. package/dist/es/components/Attachment/AttachmentContainer.mjs.map +1 -1
  47. package/dist/es/components/Attachment/Audio.mjs +15 -10
  48. package/dist/es/components/Attachment/Audio.mjs.map +1 -1
  49. package/dist/es/components/Attachment/FileAttachment.mjs +4 -5
  50. package/dist/es/components/Attachment/FileAttachment.mjs.map +1 -1
  51. package/dist/es/components/Attachment/Geolocation.mjs +29 -17
  52. package/dist/es/components/Attachment/Geolocation.mjs.map +1 -1
  53. package/dist/es/components/Attachment/Giphy.mjs +4 -4
  54. package/dist/es/components/Attachment/Giphy.mjs.map +1 -1
  55. package/dist/es/components/Attachment/LinkPreview/Card.mjs +4 -4
  56. package/dist/es/components/Attachment/LinkPreview/Card.mjs.map +1 -1
  57. package/dist/es/components/Attachment/LinkPreview/UnableToRenderCard.mjs +2 -2
  58. package/dist/es/components/Attachment/LinkPreview/UnableToRenderCard.mjs.map +1 -1
  59. package/dist/es/components/Attachment/ModalGallery.mjs +20 -8
  60. package/dist/es/components/Attachment/ModalGallery.mjs.map +1 -1
  61. package/dist/es/components/Attachment/UnsupportedAttachment.mjs +3 -3
  62. package/dist/es/components/Attachment/UnsupportedAttachment.mjs.map +1 -1
  63. package/dist/es/components/Attachment/VideoAttachment.mjs +10 -10
  64. package/dist/es/components/Attachment/VideoAttachment.mjs.map +1 -1
  65. package/dist/es/components/Attachment/VisibilityDisclaimer.mjs +2 -2
  66. package/dist/es/components/Attachment/VisibilityDisclaimer.mjs.map +1 -1
  67. package/dist/es/components/Attachment/VoiceRecording.mjs +17 -12
  68. package/dist/es/components/Attachment/VoiceRecording.mjs.map +1 -1
  69. package/dist/es/components/Attachment/components/AttachmentUploadProgressIndicator.mjs +1 -1
  70. package/dist/es/components/Attachment/components/DownloadButton.mjs +3 -3
  71. package/dist/es/components/Attachment/components/DownloadButton.mjs.map +1 -1
  72. package/dist/es/components/Attachment/hooks/useAttachmentUploadState.mjs +4 -30
  73. package/dist/es/components/Attachment/hooks/useAttachmentUploadState.mjs.map +1 -1
  74. package/dist/es/components/Attachment/utils.mjs.map +1 -1
  75. package/dist/es/components/AudioPlayback/AudioPlaybackArbiter.mjs +57 -0
  76. package/dist/es/components/AudioPlayback/AudioPlaybackArbiter.mjs.map +1 -0
  77. package/dist/es/components/AudioPlayback/AudioPlayer.mjs +329 -314
  78. package/dist/es/components/AudioPlayback/AudioPlayer.mjs.map +1 -1
  79. package/dist/es/components/AudioPlayback/AudioPlayerPool.mjs +54 -90
  80. package/dist/es/components/AudioPlayback/AudioPlayerPool.mjs.map +1 -1
  81. package/dist/es/components/AudioPlayback/WithAudioPlayback.mjs +20 -6
  82. package/dist/es/components/AudioPlayback/WithAudioPlayback.mjs.map +1 -1
  83. package/dist/es/components/AudioPlayback/components/ProgressBar.mjs +2 -2
  84. package/dist/es/components/AudioPlayback/components/ProgressBar.mjs.map +1 -1
  85. package/dist/es/components/AudioPlayback/components/WaveProgressBar.mjs +2 -2
  86. package/dist/es/components/AudioPlayback/components/WaveProgressBar.mjs.map +1 -1
  87. package/dist/es/components/AudioPlayback/components/progressBarA11y.mjs +2 -2
  88. package/dist/es/components/AudioPlayback/components/progressBarA11y.mjs.map +1 -1
  89. package/dist/es/components/AudioPlayback/plugins/AudioPlayerNotificationsPlugin.mjs +4 -4
  90. package/dist/es/components/AudioPlayback/plugins/AudioPlayerNotificationsPlugin.mjs.map +1 -1
  91. package/dist/es/components/Avatar/Avatar.mjs.map +1 -1
  92. package/dist/es/components/Avatar/AvatarStack.mjs +1 -1
  93. package/dist/es/components/Avatar/AvatarStack.mjs.map +1 -1
  94. package/dist/es/components/Badge/Badge.mjs.map +1 -1
  95. package/dist/es/components/Badge/MediaBadge.mjs +2 -1
  96. package/dist/es/components/Badge/MediaBadge.mjs.map +1 -1
  97. package/dist/es/components/BaseImage/ImagePlaceholder.mjs +3 -3
  98. package/dist/es/components/BaseImage/ImagePlaceholder.mjs.map +1 -1
  99. package/dist/es/components/Button/PlayButton.mjs +3 -3
  100. package/dist/es/components/Button/PlayButton.mjs.map +1 -1
  101. package/dist/es/components/Button/WorkspaceNavigationButtons.mjs +94 -0
  102. package/dist/es/components/Button/WorkspaceNavigationButtons.mjs.map +1 -0
  103. package/dist/es/components/Channel/Channel.mjs +34 -720
  104. package/dist/es/components/Channel/Channel.mjs.map +1 -1
  105. package/dist/es/components/Channel/hooks/useChannelCapabilities.mjs +21 -0
  106. package/dist/es/components/Channel/hooks/useChannelCapabilities.mjs.map +1 -0
  107. package/dist/es/components/Channel/hooks/useChannelContainerClasses.mjs +1 -1
  108. package/dist/es/components/Channel/hooks/useChannelContainerClasses.mjs.map +1 -1
  109. package/dist/es/components/ChannelHeader/ChannelHeader.mjs +17 -16
  110. package/dist/es/components/ChannelHeader/ChannelHeader.mjs.map +1 -1
  111. package/dist/es/components/ChannelHeader/hooks/useChannelHasMembersOnline.mjs +16 -41
  112. package/dist/es/components/ChannelHeader/hooks/useChannelHasMembersOnline.mjs.map +1 -1
  113. package/dist/es/components/ChannelHeader/hooks/useChannelHeaderOnlineStatus.mjs +19 -21
  114. package/dist/es/components/ChannelHeader/hooks/useChannelHeaderOnlineStatus.mjs.map +1 -1
  115. package/dist/es/components/ChannelList/ChannelList.mjs +60 -131
  116. package/dist/es/components/ChannelList/ChannelList.mjs.map +1 -1
  117. package/dist/es/components/ChannelList/ChannelListHeader.mjs +4 -4
  118. package/dist/es/components/ChannelList/ChannelListHeader.mjs.map +1 -1
  119. package/dist/es/components/ChannelList/ChannelLists.mjs +31 -0
  120. package/dist/es/components/ChannelList/ChannelLists.mjs.map +1 -0
  121. package/dist/es/components/ChannelList/ChannelNavigation.mjs +36 -0
  122. package/dist/es/components/ChannelList/ChannelNavigation.mjs.map +1 -0
  123. package/dist/es/components/ChannelList/hooks/useChannelMembersState.mjs.map +1 -1
  124. package/dist/es/components/ChannelList/hooks/useChannelMembershipState.mjs.map +1 -1
  125. package/dist/es/components/ChannelList/hooks/useChannelPaginatorState.mjs +21 -0
  126. package/dist/es/components/ChannelList/hooks/useChannelPaginatorState.mjs.map +1 -0
  127. package/dist/es/components/ChannelList/hooks/useSelectedChannelState.mjs.map +1 -1
  128. package/dist/es/components/ChannelListItem/ChannelListItem.mjs +23 -74
  129. package/dist/es/components/ChannelListItem/ChannelListItem.mjs.map +1 -1
  130. package/dist/es/components/ChannelListItem/ChannelListItemActionButtons.defaults.mjs +34 -34
  131. package/dist/es/components/ChannelListItem/ChannelListItemActionButtons.defaults.mjs.map +1 -1
  132. package/dist/es/components/ChannelListItem/ChannelListItemActionButtons.mjs +2 -2
  133. package/dist/es/components/ChannelListItem/ChannelListItemActionButtons.mjs.map +1 -1
  134. package/dist/es/components/ChannelListItem/ChannelListItemTimestamp.mjs +7 -6
  135. package/dist/es/components/ChannelListItem/ChannelListItemTimestamp.mjs.map +1 -1
  136. package/dist/es/components/ChannelListItem/ChannelListItemUI.mjs +15 -13
  137. package/dist/es/components/ChannelListItem/ChannelListItemUI.mjs.map +1 -1
  138. package/dist/es/components/ChannelListItem/hooks/useChannelDisplayName.mjs +7 -7
  139. package/dist/es/components/ChannelListItem/hooks/useChannelDisplayName.mjs.map +1 -1
  140. package/dist/es/components/ChannelListItem/hooks/useIsChannelMuted.mjs +8 -26
  141. package/dist/es/components/ChannelListItem/hooks/useIsChannelMuted.mjs.map +1 -1
  142. package/dist/es/components/ChannelListItem/hooks/useIsUserMuted.mjs +1 -1
  143. package/dist/es/components/ChannelListItem/hooks/useIsUserMuted.mjs.map +1 -1
  144. package/dist/es/components/ChannelListItem/hooks/useMessageDeliveryStatus.mjs +18 -50
  145. package/dist/es/components/ChannelListItem/hooks/useMessageDeliveryStatus.mjs.map +1 -1
  146. package/dist/es/components/ChannelListItem/utils.a11y.mjs +35 -21
  147. package/dist/es/components/ChannelListItem/utils.a11y.mjs.map +1 -1
  148. package/dist/es/components/ChannelListItem/utils.mjs +31 -30
  149. package/dist/es/components/ChannelListItem/utils.mjs.map +1 -1
  150. package/dist/es/components/Chat/Chat.mjs +17 -16
  151. package/dist/es/components/Chat/Chat.mjs.map +1 -1
  152. package/dist/es/components/Chat/hooks/useChat.mjs +7 -49
  153. package/dist/es/components/Chat/hooks/useChat.mjs.map +1 -1
  154. package/dist/es/components/Chat/hooks/useCreateChatClient.mjs +1 -1
  155. package/dist/es/components/Chat/hooks/useCreateChatClient.mjs.map +1 -1
  156. package/dist/es/components/Chat/hooks/useCreateChatContext.mjs +3 -11
  157. package/dist/es/components/Chat/hooks/useCreateChatContext.mjs.map +1 -1
  158. package/dist/es/components/Chat/hooks/useNetworkConnectionState.mjs +46 -0
  159. package/dist/es/components/Chat/hooks/useNetworkConnectionState.mjs.map +1 -0
  160. package/dist/es/components/Chat/hooks/useReportLostConnectionSystemNotification.mjs +112 -24
  161. package/dist/es/components/Chat/hooks/useReportLostConnectionSystemNotification.mjs.map +1 -1
  162. package/dist/es/components/Chat/hooks/useSplitActionSet.mjs +1 -1
  163. package/dist/es/components/Chat/hooks/useSplitActionSet.mjs.map +1 -1
  164. package/dist/es/components/Chat/hooks/useWSConnectionState.mjs +31 -0
  165. package/dist/es/components/Chat/hooks/useWSConnectionState.mjs.map +1 -0
  166. package/dist/es/components/DateSeparator/DateSeparator.mjs +2 -2
  167. package/dist/es/components/DateSeparator/DateSeparator.mjs.map +1 -1
  168. package/dist/es/components/Dialog/components/Alert.mjs +1 -1
  169. package/dist/es/components/Dialog/components/Callout.mjs +2 -2
  170. package/dist/es/components/Dialog/components/Callout.mjs.map +1 -1
  171. package/dist/es/components/Dialog/components/ContextMenu.mjs +9 -8
  172. package/dist/es/components/Dialog/components/ContextMenu.mjs.map +1 -1
  173. package/dist/es/components/Dialog/components/Prompt.mjs +5 -5
  174. package/dist/es/components/Dialog/components/Prompt.mjs.map +1 -1
  175. package/dist/es/components/Dialog/components/Viewer.mjs +5 -5
  176. package/dist/es/components/Dialog/components/Viewer.mjs.map +1 -1
  177. package/dist/es/components/Dialog/hooks/usePopoverPosition.mjs +9 -1
  178. package/dist/es/components/Dialog/hooks/usePopoverPosition.mjs.map +1 -1
  179. package/dist/es/components/Dialog/service/DialogManager.mjs +22 -19
  180. package/dist/es/components/Dialog/service/DialogManager.mjs.map +1 -1
  181. package/dist/es/components/EmptyStateIndicator/EmptyStateIndicator.mjs +6 -5
  182. package/dist/es/components/EmptyStateIndicator/EmptyStateIndicator.mjs.map +1 -1
  183. package/dist/es/components/Form/Dropdown.mjs +6 -3
  184. package/dist/es/components/Form/Dropdown.mjs.map +1 -1
  185. package/dist/es/components/Form/NumericInput.mjs +6 -5
  186. package/dist/es/components/Form/NumericInput.mjs.map +1 -1
  187. package/dist/es/components/Form/SwitchField.mjs +2 -2
  188. package/dist/es/components/Form/SwitchField.mjs.map +1 -1
  189. package/dist/es/components/Form/TextInput.mjs +1 -1
  190. package/dist/es/components/Gallery/GalleryContext.mjs +2 -8
  191. package/dist/es/components/Gallery/GalleryContext.mjs.map +1 -1
  192. package/dist/es/components/Gallery/GalleryHeader.mjs +39 -12
  193. package/dist/es/components/Gallery/GalleryHeader.mjs.map +1 -1
  194. package/dist/es/components/Gallery/GalleryUI.mjs +4 -4
  195. package/dist/es/components/Gallery/GalleryUI.mjs.map +1 -1
  196. package/dist/es/components/InfiniteScrollPaginator/InfiniteScrollPaginator.mjs +16 -14
  197. package/dist/es/components/InfiniteScrollPaginator/InfiniteScrollPaginator.mjs.map +1 -1
  198. package/dist/es/components/InfiniteScrollPaginator/InfiniteScrollWithComponents.mjs +43 -0
  199. package/dist/es/components/InfiniteScrollPaginator/InfiniteScrollWithComponents.mjs.map +1 -0
  200. package/dist/es/components/InfiniteScrollPaginator/hooks/useCursorPaginator.mjs +1 -1
  201. package/dist/es/components/InfiniteScrollPaginator/hooks/useCursorPaginator.mjs.map +1 -1
  202. package/dist/es/components/LoadMore/LoadMoreButton.mjs +3 -3
  203. package/dist/es/components/LoadMore/LoadMoreButton.mjs.map +1 -1
  204. package/dist/es/components/Loading/AttachmentUploadedSizeIndicator.mjs +2 -11
  205. package/dist/es/components/Loading/AttachmentUploadedSizeIndicator.mjs.map +1 -1
  206. package/dist/es/components/Loading/LoadingErrorIndicator.mjs +2 -2
  207. package/dist/es/components/Loading/LoadingErrorIndicator.mjs.map +1 -1
  208. package/dist/es/components/Loading/LoadingIndicator.mjs.map +1 -1
  209. package/dist/es/components/Loading/UploadProgressIndicator.mjs.map +1 -1
  210. package/dist/es/components/Loading/progress-indicators.mjs +2 -2
  211. package/dist/es/components/Loading/progress-indicators.mjs.map +1 -1
  212. package/dist/es/components/Location/ShareLocationDialog.mjs +13 -13
  213. package/dist/es/components/Location/ShareLocationDialog.mjs.map +1 -1
  214. package/dist/es/components/Location/hooks/useLiveLocationSharingManager.mjs +1 -0
  215. package/dist/es/components/Location/hooks/useLiveLocationSharingManager.mjs.map +1 -1
  216. package/dist/es/components/MediaRecorder/AudioRecorder/AudioRecorder.mjs +4 -4
  217. package/dist/es/components/MediaRecorder/AudioRecorder/AudioRecorder.mjs.map +1 -1
  218. package/dist/es/components/MediaRecorder/AudioRecorder/AudioRecorderRecordingControls.mjs +7 -7
  219. package/dist/es/components/MediaRecorder/AudioRecorder/AudioRecorderRecordingControls.mjs.map +1 -1
  220. package/dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingButtonWithNotification.mjs +4 -4
  221. package/dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingButtonWithNotification.mjs.map +1 -1
  222. package/dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingPlayback.mjs +2 -2
  223. package/dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingPlayback.mjs.map +1 -1
  224. package/dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingPreview.mjs +1 -1
  225. package/dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingPreview.mjs.map +1 -1
  226. package/dist/es/components/MediaRecorder/RecordingPermissionDeniedNotification.mjs +4 -4
  227. package/dist/es/components/MediaRecorder/RecordingPermissionDeniedNotification.mjs.map +1 -1
  228. package/dist/es/components/MediaRecorder/classes/AmplitudeRecorder.mjs +32 -26
  229. package/dist/es/components/MediaRecorder/classes/AmplitudeRecorder.mjs.map +1 -1
  230. package/dist/es/components/MediaRecorder/classes/BrowserPermission.mjs +5 -4
  231. package/dist/es/components/MediaRecorder/classes/BrowserPermission.mjs.map +1 -1
  232. package/dist/es/components/MediaRecorder/classes/MediaRecorderController.mjs +195 -181
  233. package/dist/es/components/MediaRecorder/classes/MediaRecorderController.mjs.map +1 -1
  234. package/dist/es/components/MediaRecorder/hooks/useMediaRecorder.mjs +7 -11
  235. package/dist/es/components/MediaRecorder/hooks/useMediaRecorder.mjs.map +1 -1
  236. package/dist/es/components/MediaRecorder/observable/BehaviorSubject.mjs +1 -0
  237. package/dist/es/components/MediaRecorder/observable/BehaviorSubject.mjs.map +1 -1
  238. package/dist/es/components/MediaRecorder/observable/Observable.mjs +2 -1
  239. package/dist/es/components/MediaRecorder/observable/Observable.mjs.map +1 -1
  240. package/dist/es/components/MediaRecorder/observable/Subject.mjs +3 -2
  241. package/dist/es/components/MediaRecorder/observable/Subject.mjs.map +1 -1
  242. package/dist/es/components/MediaRecorder/observable/Subscription.mjs +2 -1
  243. package/dist/es/components/MediaRecorder/observable/Subscription.mjs.map +1 -1
  244. package/dist/es/components/Message/Message.mjs +13 -54
  245. package/dist/es/components/Message/Message.mjs.map +1 -1
  246. package/dist/es/components/Message/MessageAlsoSentInChannelIndicator.mjs +10 -54
  247. package/dist/es/components/Message/MessageAlsoSentInChannelIndicator.mjs.map +1 -1
  248. package/dist/es/components/Message/MessageBlocked.mjs +2 -2
  249. package/dist/es/components/Message/MessageBlocked.mjs.map +1 -1
  250. package/dist/es/components/Message/MessageDeletedBubble.mjs +2 -2
  251. package/dist/es/components/Message/MessageDeletedBubble.mjs.map +1 -1
  252. package/dist/es/components/Message/MessageEditedIndicator.mjs +8 -7
  253. package/dist/es/components/Message/MessageEditedIndicator.mjs.map +1 -1
  254. package/dist/es/components/Message/MessageRepliesCountButton.mjs +43 -9
  255. package/dist/es/components/Message/MessageRepliesCountButton.mjs.map +1 -1
  256. package/dist/es/components/Message/MessageStatus.mjs +13 -11
  257. package/dist/es/components/Message/MessageStatus.mjs.map +1 -1
  258. package/dist/es/components/Message/MessageText.mjs +4 -4
  259. package/dist/es/components/Message/MessageText.mjs.map +1 -1
  260. package/dist/es/components/Message/MessageTimestamp.mjs +4 -3
  261. package/dist/es/components/Message/MessageTimestamp.mjs.map +1 -1
  262. package/dist/es/components/Message/MessageTranslationIndicator.mjs +7 -7
  263. package/dist/es/components/Message/MessageTranslationIndicator.mjs.map +1 -1
  264. package/dist/es/components/Message/MessageUI.mjs +22 -21
  265. package/dist/es/components/Message/MessageUI.mjs.map +1 -1
  266. package/dist/es/components/Message/PinIndicator.mjs +3 -3
  267. package/dist/es/components/Message/PinIndicator.mjs.map +1 -1
  268. package/dist/es/components/Message/QuotedMessage.mjs +4 -4
  269. package/dist/es/components/Message/QuotedMessage.mjs.map +1 -1
  270. package/dist/es/components/Message/ReminderNotification.mjs +13 -12
  271. package/dist/es/components/Message/ReminderNotification.mjs.map +1 -1
  272. package/dist/es/components/Message/StreamedMessageText.mjs +5 -4
  273. package/dist/es/components/Message/StreamedMessageText.mjs.map +1 -1
  274. package/dist/es/components/Message/Timestamp.mjs +5 -5
  275. package/dist/es/components/Message/Timestamp.mjs.map +1 -1
  276. package/dist/es/components/Message/hooks/useActionHandler.mjs +8 -7
  277. package/dist/es/components/Message/hooks/useActionHandler.mjs.map +1 -1
  278. package/dist/es/components/Message/hooks/useDeleteHandler.mjs +30 -11
  279. package/dist/es/components/Message/hooks/useDeleteHandler.mjs.map +1 -1
  280. package/dist/es/components/Message/hooks/useFlagHandler.mjs +3 -3
  281. package/dist/es/components/Message/hooks/useFlagHandler.mjs.map +1 -1
  282. package/dist/es/components/Message/hooks/useMarkUnreadHandler.mjs +8 -3
  283. package/dist/es/components/Message/hooks/useMarkUnreadHandler.mjs.map +1 -1
  284. package/dist/es/components/Message/hooks/useMentionsHandler.mjs +2 -4
  285. package/dist/es/components/Message/hooks/useMentionsHandler.mjs.map +1 -1
  286. package/dist/es/components/Message/hooks/useMessageAlsoSentInChannelNavigation.mjs +72 -0
  287. package/dist/es/components/Message/hooks/useMessageAlsoSentInChannelNavigation.mjs.map +1 -0
  288. package/dist/es/components/Message/hooks/useMessageReminder.mjs +1 -1
  289. package/dist/es/components/Message/hooks/useMuteHandler.mjs +26 -9
  290. package/dist/es/components/Message/hooks/useMuteHandler.mjs.map +1 -1
  291. package/dist/es/components/Message/hooks/useOpenThreadHandler.mjs +13 -5
  292. package/dist/es/components/Message/hooks/useOpenThreadHandler.mjs.map +1 -1
  293. package/dist/es/components/Message/hooks/usePinHandler.mjs +26 -21
  294. package/dist/es/components/Message/hooks/usePinHandler.mjs.map +1 -1
  295. package/dist/es/components/Message/hooks/useReactionHandler.mjs +25 -17
  296. package/dist/es/components/Message/hooks/useReactionHandler.mjs.map +1 -1
  297. package/dist/es/components/Message/hooks/useReactionsFetcher.mjs +6 -3
  298. package/dist/es/components/Message/hooks/useReactionsFetcher.mjs.map +1 -1
  299. package/dist/es/components/Message/hooks/useRetryHandler.mjs +9 -7
  300. package/dist/es/components/Message/hooks/useRetryHandler.mjs.map +1 -1
  301. package/dist/es/components/Message/hooks/useUserRole.mjs +16 -12
  302. package/dist/es/components/Message/hooks/useUserRole.mjs.map +1 -1
  303. package/dist/es/components/Message/renderText/renderText.mjs +1 -1
  304. package/dist/es/components/Message/utils.mjs +19 -56
  305. package/dist/es/components/Message/utils.mjs.map +1 -1
  306. package/dist/es/components/MessageActions/DeleteMessageAlert.mjs +5 -5
  307. package/dist/es/components/MessageActions/DeleteMessageAlert.mjs.map +1 -1
  308. package/dist/es/components/MessageActions/DownloadSubmenu.mjs +4 -4
  309. package/dist/es/components/MessageActions/DownloadSubmenu.mjs.map +1 -1
  310. package/dist/es/components/MessageActions/MessageActions.defaults.mjs +72 -73
  311. package/dist/es/components/MessageActions/MessageActions.defaults.mjs.map +1 -1
  312. package/dist/es/components/MessageActions/MessageActions.mjs +3 -3
  313. package/dist/es/components/MessageActions/MessageActions.mjs.map +1 -1
  314. package/dist/es/components/MessageActions/RemindMeSubmenu.mjs +7 -7
  315. package/dist/es/components/MessageActions/RemindMeSubmenu.mjs.map +1 -1
  316. package/dist/es/components/MessageActions/hooks/useBaseMessageActionSetFilter.mjs +7 -4
  317. package/dist/es/components/MessageActions/hooks/useBaseMessageActionSetFilter.mjs.map +1 -1
  318. package/dist/es/components/MessageBounce/MessageBounceModal.mjs +1 -1
  319. package/dist/es/components/MessageBounce/MessageBouncePrompt.mjs +8 -8
  320. package/dist/es/components/MessageBounce/MessageBouncePrompt.mjs.map +1 -1
  321. package/dist/es/components/MessageComposer/AttachmentPreviewList/AttachmentPreviewList.mjs +2 -2
  322. package/dist/es/components/MessageComposer/AttachmentPreviewList/AudioAttachmentPreview.mjs +14 -14
  323. package/dist/es/components/MessageComposer/AttachmentPreviewList/AudioAttachmentPreview.mjs.map +1 -1
  324. package/dist/es/components/MessageComposer/AttachmentPreviewList/FileAttachmentPreview.mjs +9 -9
  325. package/dist/es/components/MessageComposer/AttachmentPreviewList/FileAttachmentPreview.mjs.map +1 -1
  326. package/dist/es/components/MessageComposer/AttachmentPreviewList/GeolocationPreview.mjs +6 -6
  327. package/dist/es/components/MessageComposer/AttachmentPreviewList/GeolocationPreview.mjs.map +1 -1
  328. package/dist/es/components/MessageComposer/AttachmentPreviewList/MediaAttachmentPreview.mjs +3 -4
  329. package/dist/es/components/MessageComposer/AttachmentPreviewList/MediaAttachmentPreview.mjs.map +1 -1
  330. package/dist/es/components/MessageComposer/AttachmentPreviewList/UnsupportedAttachmentPreview.mjs +2 -2
  331. package/dist/es/components/MessageComposer/AttachmentPreviewList/UnsupportedAttachmentPreview.mjs.map +1 -1
  332. package/dist/es/components/MessageComposer/AttachmentPreviewList/VoiceRecordingPreviewSlot.mjs +2 -2
  333. package/dist/es/components/MessageComposer/AttachmentPreviewList/utils/AttachmentPreviewRoot.mjs +2 -2
  334. package/dist/es/components/MessageComposer/AttachmentPreviewList/utils/AttachmentPreviewRoot.mjs.map +1 -1
  335. package/dist/es/components/MessageComposer/AttachmentSelector/AttachmentSelector.mjs +33 -30
  336. package/dist/es/components/MessageComposer/AttachmentSelector/AttachmentSelector.mjs.map +1 -1
  337. package/dist/es/components/MessageComposer/AttachmentSelector/CommandsMenu.mjs +26 -31
  338. package/dist/es/components/MessageComposer/AttachmentSelector/CommandsMenu.mjs.map +1 -1
  339. package/dist/es/components/MessageComposer/CommandChip.mjs +3 -3
  340. package/dist/es/components/MessageComposer/CommandChip.mjs.map +1 -1
  341. package/dist/es/components/MessageComposer/EditedMessagePreview.mjs +1 -1
  342. package/dist/es/components/MessageComposer/EditedMessagePreview.mjs.map +1 -1
  343. package/dist/es/components/MessageComposer/LinkPreviewList.mjs +3 -3
  344. package/dist/es/components/MessageComposer/MessageComposer.mjs +12 -17
  345. package/dist/es/components/MessageComposer/MessageComposer.mjs.map +1 -1
  346. package/dist/es/components/MessageComposer/MessageComposerActions.mjs +17 -13
  347. package/dist/es/components/MessageComposer/MessageComposerActions.mjs.map +1 -1
  348. package/dist/es/components/MessageComposer/MessageComposerUI.mjs +8 -8
  349. package/dist/es/components/MessageComposer/MessageComposerUI.mjs.map +1 -1
  350. package/dist/es/components/MessageComposer/QuotedMessagePreview.mjs +40 -40
  351. package/dist/es/components/MessageComposer/QuotedMessagePreview.mjs.map +1 -1
  352. package/dist/es/components/MessageComposer/RemoveAttachmentPreviewButton.mjs +2 -2
  353. package/dist/es/components/MessageComposer/RemoveAttachmentPreviewButton.mjs.map +1 -1
  354. package/dist/es/components/MessageComposer/SendButton.mjs +2 -2
  355. package/dist/es/components/MessageComposer/SendButton.mjs.map +1 -1
  356. package/dist/es/components/MessageComposer/SendToChannelCheckbox.mjs +2 -2
  357. package/dist/es/components/MessageComposer/SendToChannelCheckbox.mjs.map +1 -1
  358. package/dist/es/components/MessageComposer/StopAIGenerationButton.mjs +1 -1
  359. package/dist/es/components/MessageComposer/StopAIGenerationButton.mjs.map +1 -1
  360. package/dist/es/components/MessageComposer/WithDragAndDropUpload.mjs +9 -13
  361. package/dist/es/components/MessageComposer/WithDragAndDropUpload.mjs.map +1 -1
  362. package/dist/es/components/MessageComposer/hooks/useAttachmentManagerState.mjs +15 -2
  363. package/dist/es/components/MessageComposer/hooks/useAttachmentManagerState.mjs.map +1 -1
  364. package/dist/es/components/MessageComposer/hooks/useCooldownRemaining.mjs +2 -3
  365. package/dist/es/components/MessageComposer/hooks/useCooldownRemaining.mjs.map +1 -1
  366. package/dist/es/components/MessageComposer/hooks/useCreateMessageComposerContext.mjs +1 -3
  367. package/dist/es/components/MessageComposer/hooks/useCreateMessageComposerContext.mjs.map +1 -1
  368. package/dist/es/components/MessageComposer/hooks/useIsCooldownActive.mjs +2 -3
  369. package/dist/es/components/MessageComposer/hooks/useIsCooldownActive.mjs.map +1 -1
  370. package/dist/es/components/MessageComposer/hooks/useMessageComposerBindings.mjs +0 -4
  371. package/dist/es/components/MessageComposer/hooks/useMessageComposerBindings.mjs.map +1 -1
  372. package/dist/es/components/MessageComposer/hooks/useMessageComposerCommands.mjs +4 -4
  373. package/dist/es/components/MessageComposer/hooks/useMessageComposerCommands.mjs.map +1 -1
  374. package/dist/es/components/MessageComposer/hooks/useMessageComposerController.mjs +8 -34
  375. package/dist/es/components/MessageComposer/hooks/useMessageComposerController.mjs.map +1 -1
  376. package/dist/es/components/MessageComposer/hooks/useMessageComposerHasSendableData.mjs.map +1 -1
  377. package/dist/es/components/MessageComposer/hooks/useMessageComposerSubmitFn.mjs +16 -0
  378. package/dist/es/components/MessageComposer/hooks/useMessageComposerSubmitFn.mjs.map +1 -0
  379. package/dist/es/components/MessageComposer/hooks/usePasteHandler.mjs +1 -1
  380. package/dist/es/components/MessageComposer/hooks/utils.mjs.map +1 -1
  381. package/dist/es/components/MessageComposer/icons.mjs +2 -2
  382. package/dist/es/components/MessageComposer/icons.mjs.map +1 -1
  383. package/dist/es/components/MessageComposer/preEditSnapshot.mjs +1 -7
  384. package/dist/es/components/MessageComposer/preEditSnapshot.mjs.map +1 -1
  385. package/dist/es/components/MessageList/FloatingDateSeparator.mjs +7 -7
  386. package/dist/es/components/MessageList/FloatingDateSeparator.mjs.map +1 -1
  387. package/dist/es/components/MessageList/MessageList.mjs +168 -213
  388. package/dist/es/components/MessageList/MessageList.mjs.map +1 -1
  389. package/dist/es/components/MessageList/NewMessageNotification.mjs +5 -1
  390. package/dist/es/components/MessageList/NewMessageNotification.mjs.map +1 -1
  391. package/dist/es/components/MessageList/ScrollToLatestMessageButton.mjs +27 -22
  392. package/dist/es/components/MessageList/ScrollToLatestMessageButton.mjs.map +1 -1
  393. package/dist/es/components/MessageList/UnreadMessagesNotification.mjs +25 -9
  394. package/dist/es/components/MessageList/UnreadMessagesNotification.mjs.map +1 -1
  395. package/dist/es/components/MessageList/UnreadMessagesSeparator.mjs +18 -7
  396. package/dist/es/components/MessageList/UnreadMessagesSeparator.mjs.map +1 -1
  397. package/dist/es/components/MessageList/VirtualizedMessageList.mjs +186 -167
  398. package/dist/es/components/MessageList/VirtualizedMessageList.mjs.map +1 -1
  399. package/dist/es/components/MessageList/VirtualizedMessageListComponents.mjs +12 -12
  400. package/dist/es/components/MessageList/VirtualizedMessageListComponents.mjs.map +1 -1
  401. package/dist/es/components/MessageList/hooks/MessageList/useEnrichedMessages.mjs +6 -7
  402. package/dist/es/components/MessageList/hooks/MessageList/useEnrichedMessages.mjs.map +1 -1
  403. package/dist/es/components/MessageList/hooks/MessageList/useFloatingDateSeparatorMessageList.mjs +6 -10
  404. package/dist/es/components/MessageList/hooks/MessageList/useFloatingDateSeparatorMessageList.mjs.map +1 -1
  405. package/dist/es/components/MessageList/hooks/MessageList/useMessageListElements.mjs +18 -10
  406. package/dist/es/components/MessageList/hooks/MessageList/useMessageListElements.mjs.map +1 -1
  407. package/dist/es/components/MessageList/hooks/MessageList/useMessageListScrollManager.mjs +6 -4
  408. package/dist/es/components/MessageList/hooks/MessageList/useMessageListScrollManager.mjs.map +1 -1
  409. package/dist/es/components/MessageList/hooks/MessageList/useScrollLocationLogic.mjs +27 -202
  410. package/dist/es/components/MessageList/hooks/MessageList/useScrollLocationLogic.mjs.map +1 -1
  411. package/dist/es/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.mjs +10 -5
  412. package/dist/es/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.mjs.map +1 -1
  413. package/dist/es/components/MessageList/hooks/VirtualizedMessageList/useFloatingDateSeparator.mjs +6 -5
  414. package/dist/es/components/MessageList/hooks/VirtualizedMessageList/useFloatingDateSeparator.mjs.map +1 -1
  415. package/dist/es/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.mjs +4 -4
  416. package/dist/es/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.mjs.map +1 -1
  417. package/dist/es/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.mjs +5 -1
  418. package/dist/es/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.mjs.map +1 -1
  419. package/dist/es/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.mjs +14 -9
  420. package/dist/es/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.mjs.map +1 -1
  421. package/dist/es/components/MessageList/hooks/useCanPaginateReplies.mjs +47 -0
  422. package/dist/es/components/MessageList/hooks/useCanPaginateReplies.mjs.map +1 -0
  423. package/dist/es/components/MessageList/hooks/useLastDeliveredData.mjs +6 -38
  424. package/dist/es/components/MessageList/hooks/useLastDeliveredData.mjs.map +1 -1
  425. package/dist/es/components/MessageList/hooks/useLastReadData.mjs +6 -23
  426. package/dist/es/components/MessageList/hooks/useLastReadData.mjs.map +1 -1
  427. package/dist/es/components/MessageList/hooks/useMarkRead.mjs +78 -48
  428. package/dist/es/components/MessageList/hooks/useMarkRead.mjs.map +1 -1
  429. package/dist/es/components/MessageList/hooks/useReceiptsByMessageId.mjs +71 -0
  430. package/dist/es/components/MessageList/hooks/useReceiptsByMessageId.mjs.map +1 -0
  431. package/dist/es/components/MessageList/hooks/useThreadHead.mjs +26 -0
  432. package/dist/es/components/MessageList/hooks/useThreadHead.mjs.map +1 -0
  433. package/dist/es/components/MessageList/messageSourceKey.mjs +37 -0
  434. package/dist/es/components/MessageList/messageSourceKey.mjs.map +1 -0
  435. package/dist/es/components/MessageList/renderMessages.mjs +11 -11
  436. package/dist/es/components/MessageList/renderMessages.mjs.map +1 -1
  437. package/dist/es/components/MessageList/utils.mjs +40 -33
  438. package/dist/es/components/MessageList/utils.mjs.map +1 -1
  439. package/dist/es/components/Modal/GlobalModal.mjs +2 -2
  440. package/dist/es/components/Notifications/Notification.mjs +10 -9
  441. package/dist/es/components/Notifications/Notification.mjs.map +1 -1
  442. package/dist/es/components/Notifications/NotificationList.mjs +5 -19
  443. package/dist/es/components/Notifications/NotificationList.mjs.map +1 -1
  444. package/dist/es/components/Notifications/hooks/useNotificationApi.mjs +69 -62
  445. package/dist/es/components/Notifications/hooks/useNotificationApi.mjs.map +1 -1
  446. package/dist/es/components/Notifications/hooks/useNotificationTarget.mjs +8 -12
  447. package/dist/es/components/Notifications/hooks/useNotificationTarget.mjs.map +1 -1
  448. package/dist/es/components/Notifications/hooks/useNotifications.mjs +1 -1
  449. package/dist/es/components/Notifications/hooks/useSystemNotifications.mjs +1 -1
  450. package/dist/es/components/Notifications/notificationTarget.mjs +17 -2
  451. package/dist/es/components/Notifications/notificationTarget.mjs.map +1 -1
  452. package/dist/es/components/Poll/Poll.mjs +1 -1
  453. package/dist/es/components/Poll/PollActions/AddCommentPrompt.mjs +8 -8
  454. package/dist/es/components/Poll/PollActions/AddCommentPrompt.mjs.map +1 -1
  455. package/dist/es/components/Poll/PollActions/EndPollAlert.mjs +9 -9
  456. package/dist/es/components/Poll/PollActions/EndPollAlert.mjs.map +1 -1
  457. package/dist/es/components/Poll/PollActions/PollActions.mjs +20 -14
  458. package/dist/es/components/Poll/PollActions/PollActions.mjs.map +1 -1
  459. package/dist/es/components/Poll/PollActions/PollAnswerList.mjs +8 -8
  460. package/dist/es/components/Poll/PollActions/PollAnswerList.mjs.map +1 -1
  461. package/dist/es/components/Poll/PollActions/PollOptionsFullList.mjs +4 -4
  462. package/dist/es/components/Poll/PollActions/PollOptionsFullList.mjs.map +1 -1
  463. package/dist/es/components/Poll/PollActions/PollQuestion.mjs +1 -1
  464. package/dist/es/components/Poll/PollActions/PollQuestion.mjs.map +1 -1
  465. package/dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotes.mjs +7 -5
  466. package/dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotes.mjs.map +1 -1
  467. package/dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.mjs +8 -4
  468. package/dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.mjs.map +1 -1
  469. package/dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotesList.mjs +1 -1
  470. package/dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotesList.mjs.map +1 -1
  471. package/dist/es/components/Poll/PollActions/PollResults/PollResults.mjs +11 -7
  472. package/dist/es/components/Poll/PollActions/PollResults/PollResults.mjs.map +1 -1
  473. package/dist/es/components/Poll/PollActions/SuggestPollOptionPrompt.mjs +15 -12
  474. package/dist/es/components/Poll/PollActions/SuggestPollOptionPrompt.mjs.map +1 -1
  475. package/dist/es/components/Poll/PollContent.mjs +2 -2
  476. package/dist/es/components/Poll/PollCreationDialog/MultipleAnswersField.mjs +13 -11
  477. package/dist/es/components/Poll/PollCreationDialog/MultipleAnswersField.mjs.map +1 -1
  478. package/dist/es/components/Poll/PollCreationDialog/NameField.mjs +6 -5
  479. package/dist/es/components/Poll/PollCreationDialog/NameField.mjs.map +1 -1
  480. package/dist/es/components/Poll/PollCreationDialog/OptionFieldSet.mjs +14 -13
  481. package/dist/es/components/Poll/PollCreationDialog/OptionFieldSet.mjs.map +1 -1
  482. package/dist/es/components/Poll/PollCreationDialog/PollCreationDialog.mjs +11 -12
  483. package/dist/es/components/Poll/PollCreationDialog/PollCreationDialog.mjs.map +1 -1
  484. package/dist/es/components/Poll/PollCreationDialog/PollCreationDialogControls.mjs +11 -20
  485. package/dist/es/components/Poll/PollCreationDialog/PollCreationDialogControls.mjs.map +1 -1
  486. package/dist/es/components/Poll/PollCreationDialog/PollOptionReorderHandle.mjs +5 -5
  487. package/dist/es/components/Poll/PollCreationDialog/PollOptionReorderHandle.mjs.map +1 -1
  488. package/dist/es/components/Poll/PollHeader.mjs +10 -6
  489. package/dist/es/components/Poll/PollHeader.mjs.map +1 -1
  490. package/dist/es/components/Poll/PollOptionList.mjs +8 -4
  491. package/dist/es/components/Poll/PollOptionList.mjs.map +1 -1
  492. package/dist/es/components/Poll/PollOptionSelector.mjs +13 -7
  493. package/dist/es/components/Poll/PollOptionSelector.mjs.map +1 -1
  494. package/dist/es/components/Poll/PollVote.mjs +6 -5
  495. package/dist/es/components/Poll/PollVote.mjs.map +1 -1
  496. package/dist/es/components/Poll/hooks/useManagePollVotesRealtime.mjs.map +1 -1
  497. package/dist/es/components/Poll/hooks/usePollAnswerPagination.mjs +5 -5
  498. package/dist/es/components/Poll/hooks/usePollAnswerPagination.mjs.map +1 -1
  499. package/dist/es/components/Poll/hooks/usePollOptionVotesPagination.mjs +6 -5
  500. package/dist/es/components/Poll/hooks/usePollOptionVotesPagination.mjs.map +1 -1
  501. package/dist/es/components/ReactFileUtilities/UploadButton.mjs +5 -5
  502. package/dist/es/components/ReactFileUtilities/UploadButton.mjs.map +1 -1
  503. package/dist/es/components/Reactions/MessageReactions.mjs +7 -7
  504. package/dist/es/components/Reactions/MessageReactions.mjs.map +1 -1
  505. package/dist/es/components/Reactions/MessageReactionsDetail.mjs +19 -12
  506. package/dist/es/components/Reactions/MessageReactionsDetail.mjs.map +1 -1
  507. package/dist/es/components/Reactions/ReactionSelector.mjs +15 -21
  508. package/dist/es/components/Reactions/ReactionSelector.mjs.map +1 -1
  509. package/dist/es/components/Reactions/ReactionSelectorWithButton.mjs +4 -4
  510. package/dist/es/components/Reactions/ReactionSelectorWithButton.mjs.map +1 -1
  511. package/dist/es/components/Reactions/hooks/useFetchReactions.mjs +3 -3
  512. package/dist/es/components/Reactions/hooks/useFetchReactions.mjs.map +1 -1
  513. package/dist/es/components/Reactions/hooks/useProcessReactions.mjs +5 -4
  514. package/dist/es/components/Reactions/hooks/useProcessReactions.mjs.map +1 -1
  515. package/dist/es/components/Search/Search.mjs +1 -1
  516. package/dist/es/components/Search/SearchBar/SearchBar.mjs +8 -7
  517. package/dist/es/components/Search/SearchBar/SearchBar.mjs.map +1 -1
  518. package/dist/es/components/Search/SearchContext.mjs +2 -3
  519. package/dist/es/components/Search/SearchContext.mjs.map +1 -1
  520. package/dist/es/components/Search/SearchResults/SearchResultItem.mjs +56 -39
  521. package/dist/es/components/Search/SearchResults/SearchResultItem.mjs.map +1 -1
  522. package/dist/es/components/Search/SearchResults/SearchResults.mjs +4 -4
  523. package/dist/es/components/Search/SearchResults/SearchResults.mjs.map +1 -1
  524. package/dist/es/components/Search/SearchResults/SearchResultsHeader.mjs +6 -5
  525. package/dist/es/components/Search/SearchResults/SearchResultsHeader.mjs.map +1 -1
  526. package/dist/es/components/Search/SearchResults/SearchResultsPresearch.mjs +1 -1
  527. package/dist/es/components/Search/SearchResults/SearchResultsPresearch.mjs.map +1 -1
  528. package/dist/es/components/Search/SearchResults/SearchSourceResultList.mjs +1 -1
  529. package/dist/es/components/Search/SearchResults/SearchSourceResultListFooter.mjs +2 -2
  530. package/dist/es/components/Search/SearchResults/SearchSourceResultListFooter.mjs.map +1 -1
  531. package/dist/es/components/Search/SearchResults/SearchSourceResults.mjs +1 -1
  532. package/dist/es/components/Search/SearchResults/SearchSourceResultsEmpty.mjs +1 -1
  533. package/dist/es/components/Search/SearchResults/SearchSourceResultsEmpty.mjs.map +1 -1
  534. package/dist/es/components/Search/SearchResults/SearchSourceResultsLoadingIndicator.mjs +1 -1
  535. package/dist/es/components/Search/SearchResults/SearchSourceResultsLoadingIndicator.mjs.map +1 -1
  536. package/dist/es/components/Search/SearchSourceResultsContext.mjs +2 -3
  537. package/dist/es/components/Search/SearchSourceResultsContext.mjs.map +1 -1
  538. package/dist/es/components/SummarizedMessagePreview/SummarizedMessagePreview.mjs +1 -1
  539. package/dist/es/components/SummarizedMessagePreview/SummarizedMessagePreview.mjs.map +1 -1
  540. package/dist/es/components/SummarizedMessagePreview/hooks/useLatestMessagePreview.mjs +44 -19
  541. package/dist/es/components/SummarizedMessagePreview/hooks/useLatestMessagePreview.mjs.map +1 -1
  542. package/dist/es/components/TextareaComposer/SuggestionList/CommandItem.mjs +1 -1
  543. package/dist/es/components/TextareaComposer/SuggestionList/CommandItem.mjs.map +1 -1
  544. package/dist/es/components/TextareaComposer/SuggestionList/MentionItem/BroadcastMentionItem.mjs +2 -2
  545. package/dist/es/components/TextareaComposer/SuggestionList/MentionItem/BroadcastMentionItem.mjs.map +1 -1
  546. package/dist/es/components/TextareaComposer/SuggestionList/MentionItem/RoleItem.mjs +2 -2
  547. package/dist/es/components/TextareaComposer/SuggestionList/MentionItem/RoleItem.mjs.map +1 -1
  548. package/dist/es/components/TextareaComposer/SuggestionList/MentionItem/UserGroupItem.mjs.map +1 -1
  549. package/dist/es/components/TextareaComposer/SuggestionList/SuggestionList.mjs +11 -11
  550. package/dist/es/components/TextareaComposer/SuggestionList/SuggestionList.mjs.map +1 -1
  551. package/dist/es/components/TextareaComposer/SuggestionList/SuggestionListItem.mjs +1 -1
  552. package/dist/es/components/TextareaComposer/TextareaComposer.mjs +13 -11
  553. package/dist/es/components/TextareaComposer/TextareaComposer.mjs.map +1 -1
  554. package/dist/es/components/TextareaComposer/hooks/useTextareaPlaceholder.mjs +12 -11
  555. package/dist/es/components/TextareaComposer/hooks/useTextareaPlaceholder.mjs.map +1 -1
  556. package/dist/es/components/Thread/Thread.mjs +89 -92
  557. package/dist/es/components/Thread/Thread.mjs.map +1 -1
  558. package/dist/es/components/Thread/ThreadHead.mjs +5 -4
  559. package/dist/es/components/Thread/ThreadHead.mjs.map +1 -1
  560. package/dist/es/components/Thread/ThreadHeader.mjs +31 -41
  561. package/dist/es/components/Thread/ThreadHeader.mjs.map +1 -1
  562. package/dist/es/components/Thread/ThreadStart.mjs +11 -10
  563. package/dist/es/components/Thread/ThreadStart.mjs.map +1 -1
  564. package/dist/es/components/Threads/ThreadContext.mjs +1 -5
  565. package/dist/es/components/Threads/ThreadContext.mjs.map +1 -1
  566. package/dist/es/components/Threads/ThreadList/ThreadList.mjs +19 -27
  567. package/dist/es/components/Threads/ThreadList/ThreadList.mjs.map +1 -1
  568. package/dist/es/components/Threads/ThreadList/ThreadListEmptyPlaceholder.mjs +3 -3
  569. package/dist/es/components/Threads/ThreadList/ThreadListEmptyPlaceholder.mjs.map +1 -1
  570. package/dist/es/components/Threads/ThreadList/ThreadListHeader.mjs +4 -4
  571. package/dist/es/components/Threads/ThreadList/ThreadListHeader.mjs.map +1 -1
  572. package/dist/es/components/Threads/ThreadList/ThreadListItemUI.mjs +30 -30
  573. package/dist/es/components/Threads/ThreadList/ThreadListItemUI.mjs.map +1 -1
  574. package/dist/es/components/Threads/ThreadList/ThreadListLoadingIndicator.mjs +1 -1
  575. package/dist/es/components/Threads/ThreadList/ThreadListUnseenThreadsBanner.mjs +7 -3
  576. package/dist/es/components/Threads/ThreadList/ThreadListUnseenThreadsBanner.mjs.map +1 -1
  577. package/dist/es/components/Threads/ThreadList/useThreadHighlighting.mjs +47 -0
  578. package/dist/es/components/Threads/ThreadList/useThreadHighlighting.mjs.map +1 -0
  579. package/dist/es/components/Threads/ThreadList/utils.a11y.mjs +13 -8
  580. package/dist/es/components/Threads/ThreadList/utils.a11y.mjs.map +1 -1
  581. package/dist/es/components/Threads/hooks/useCloseThread.mjs +30 -0
  582. package/dist/es/components/Threads/hooks/useCloseThread.mjs.map +1 -0
  583. package/dist/es/components/TypingIndicator/TypingIndicator.mjs +23 -17
  584. package/dist/es/components/TypingIndicator/TypingIndicator.mjs.map +1 -1
  585. package/dist/es/components/TypingIndicator/TypingIndicatorHeader.mjs +15 -11
  586. package/dist/es/components/TypingIndicator/TypingIndicatorHeader.mjs.map +1 -1
  587. package/dist/es/components/TypingIndicator/hooks/useDebouncedTypingActive.mjs.map +1 -1
  588. package/dist/es/components/TypingIndicator/utils/getTypingStatusMessage.mjs +7 -3
  589. package/dist/es/components/TypingIndicator/utils/getTypingStatusMessage.mjs.map +1 -1
  590. package/dist/es/components/VideoPlayer/VideoThumbnail.mjs +2 -2
  591. package/dist/es/components/VideoPlayer/VideoThumbnail.mjs.map +1 -1
  592. package/dist/es/context/AttachmentContext.mjs +16 -0
  593. package/dist/es/context/AttachmentContext.mjs.map +1 -0
  594. package/dist/es/context/ChannelInstanceContext.mjs +17 -0
  595. package/dist/es/context/ChannelInstanceContext.mjs.map +1 -0
  596. package/dist/es/context/ChannelListContext.mjs +3 -6
  597. package/dist/es/context/ChannelListContext.mjs.map +1 -1
  598. package/dist/es/context/ChatContext.mjs +2 -8
  599. package/dist/es/context/ChatContext.mjs.map +1 -1
  600. package/dist/es/context/ComponentContext.mjs +1 -1
  601. package/dist/es/context/ComponentContext.mjs.map +1 -1
  602. package/dist/es/context/DialogManagerContext.mjs +2 -2
  603. package/dist/es/context/DialogManagerContext.mjs.map +1 -1
  604. package/dist/es/context/MessageBounceContext.mjs +12 -14
  605. package/dist/es/context/MessageBounceContext.mjs.map +1 -1
  606. package/dist/es/context/MessageComposerContext.mjs +8 -6
  607. package/dist/es/context/MessageComposerContext.mjs.map +1 -1
  608. package/dist/es/context/MessageComposerControllerContext.mjs +19 -0
  609. package/dist/es/context/MessageComposerControllerContext.mjs.map +1 -0
  610. package/dist/es/context/MessageContext.mjs +2 -5
  611. package/dist/es/context/MessageContext.mjs.map +1 -1
  612. package/dist/es/context/MessageListContext.mjs +2 -8
  613. package/dist/es/context/MessageListContext.mjs.map +1 -1
  614. package/dist/es/context/MessageTranslationViewContext.mjs +3 -6
  615. package/dist/es/context/MessageTranslationViewContext.mjs.map +1 -1
  616. package/dist/es/context/ModalContext.mjs +6 -8
  617. package/dist/es/context/ModalContext.mjs.map +1 -1
  618. package/dist/es/context/PollContext.mjs +2 -3
  619. package/dist/es/context/PollContext.mjs.map +1 -1
  620. package/dist/es/context/TranslationContext.mjs +8 -21
  621. package/dist/es/context/TranslationContext.mjs.map +1 -1
  622. package/dist/es/context/VirtualizedMessageListContext.mjs +2 -1
  623. package/dist/es/context/VirtualizedMessageListContext.mjs.map +1 -1
  624. package/dist/es/context/WithComponents.mjs +3 -3
  625. package/dist/es/context/WithComponents.mjs.map +1 -1
  626. package/dist/es/context/WorkspaceNavigationContext.mjs +45 -0
  627. package/dist/es/context/WorkspaceNavigationContext.mjs.map +1 -0
  628. package/dist/es/context/requireContext.mjs +17 -0
  629. package/dist/es/context/requireContext.mjs.map +1 -0
  630. package/dist/es/context/useChannel.mjs +14 -0
  631. package/dist/es/context/useChannel.mjs.map +1 -0
  632. package/dist/es/context/useComponentContextIcons.mjs +8 -13
  633. package/dist/es/context/useComponentContextIcons.mjs.map +1 -1
  634. package/dist/es/hooks/useIsDmChannel.mjs +30 -0
  635. package/dist/es/hooks/useIsDmChannel.mjs.map +1 -0
  636. package/dist/es/hooks/useMessagePaginator.mjs +14 -0
  637. package/dist/es/hooks/useMessagePaginator.mjs.map +1 -0
  638. package/dist/es/i18n/Streami18n.mjs +38 -521
  639. package/dist/es/i18n/Streami18n.mjs.map +1 -1
  640. package/dist/es/i18n/TranslationBuilder/index.mjs +3 -0
  641. package/dist/es/i18n/TranslationBuilder/notifications/NotificationTranslationTopic.mjs +22 -24
  642. package/dist/es/i18n/TranslationBuilder/notifications/NotificationTranslationTopic.mjs.map +1 -1
  643. package/dist/es/i18n/TranslationBuilder/notifications/translators.mjs +20 -31
  644. package/dist/es/i18n/TranslationBuilder/notifications/translators.mjs.map +1 -1
  645. package/dist/es/i18n/TranslationBuilder/notifications/translatorsByNotificationType.mjs +42 -15
  646. package/dist/es/i18n/TranslationBuilder/notifications/translatorsByNotificationType.mjs.map +1 -1
  647. package/dist/es/i18n/runtimeDefaults.mjs +41 -0
  648. package/dist/es/i18n/runtimeDefaults.mjs.map +1 -0
  649. package/dist/es/i18n/useStreami18n.mjs +41 -0
  650. package/dist/es/i18n/useStreami18n.mjs.map +1 -0
  651. package/dist/es/i18n/utils.mjs +7 -125
  652. package/dist/es/i18n/utils.mjs.map +1 -1
  653. package/dist/es/index.mjs +175 -180
  654. package/dist/es/plugins/ChannelDetail/AvatarWithChannelDetail.mjs +4 -4
  655. package/dist/es/plugins/ChannelDetail/AvatarWithChannelDetail.mjs.map +1 -1
  656. package/dist/es/plugins/ChannelDetail/ChannelDetail.mjs +1 -1
  657. package/dist/es/plugins/ChannelDetail/ChannelDetail.mjs.map +1 -1
  658. package/dist/es/plugins/ChannelDetail/ChannelDetailEmptyList.mjs.map +1 -1
  659. package/dist/es/plugins/ChannelDetail/ChannelDetailSearchInput.mjs +3 -3
  660. package/dist/es/plugins/ChannelDetail/ChannelDetailSearchInput.mjs.map +1 -1
  661. package/dist/es/plugins/ChannelDetail/SectionNavigator/SectionNavigatorHeader.mjs +4 -5
  662. package/dist/es/plugins/ChannelDetail/SectionNavigator/SectionNavigatorHeader.mjs.map +1 -1
  663. package/dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesEmptyList.mjs +4 -4
  664. package/dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesEmptyList.mjs.map +1 -1
  665. package/dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.mjs +9 -8
  666. package/dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.mjs.map +1 -1
  667. package/dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.utils.mjs +7 -6
  668. package/dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.utils.mjs.map +1 -1
  669. package/dist/es/plugins/ChannelDetail/Views/ChannelFilesView/useChannelFilesSearch.mjs +1 -1
  670. package/dist/es/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementActions.defaults.mjs +44 -44
  671. package/dist/es/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementActions.defaults.mjs.map +1 -1
  672. package/dist/es/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementView.mjs +25 -25
  673. package/dist/es/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementView.mjs.map +1 -1
  674. package/dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaEmptyList.mjs +4 -4
  675. package/dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaEmptyList.mjs.map +1 -1
  676. package/dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.mjs +13 -13
  677. package/dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.mjs.map +1 -1
  678. package/dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.utils.mjs +8 -3
  679. package/dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.utils.mjs.map +1 -1
  680. package/dist/es/plugins/ChannelDetail/Views/ChannelMediaView/useChannelMediaSearch.mjs +1 -1
  681. package/dist/es/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberActions.defaults.mjs +44 -41
  682. package/dist/es/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberActions.defaults.mjs.map +1 -1
  683. package/dist/es/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberDetail.mjs +6 -5
  684. package/dist/es/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberDetail.mjs.map +1 -1
  685. package/dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersAddView.mjs +19 -11
  686. package/dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersAddView.mjs.map +1 -1
  687. package/dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersBrowseView.mjs +12 -11
  688. package/dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersBrowseView.mjs.map +1 -1
  689. package/dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersHeaderActions.defaults.mjs +8 -8
  690. package/dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersHeaderActions.defaults.mjs.map +1 -1
  691. package/dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.mjs +8 -4
  692. package/dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.mjs.map +1 -1
  693. package/dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.utils.mjs +1 -1
  694. package/dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.utils.mjs.map +1 -1
  695. package/dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesEmptyList.mjs +3 -3
  696. package/dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesEmptyList.mjs.map +1 -1
  697. package/dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesView.mjs +24 -21
  698. package/dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesView.mjs.map +1 -1
  699. package/dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/usePinnedMessagesCount.mjs +9 -17
  700. package/dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/usePinnedMessagesCount.mjs.map +1 -1
  701. package/dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/usePinnedMessagesSearch.mjs +1 -1
  702. package/dist/es/plugins/Emojis/EmojiPicker.mjs +9 -8
  703. package/dist/es/plugins/Emojis/EmojiPicker.mjs.map +1 -1
  704. package/dist/es/plugins/Emojis/middleware/textComposerEmojiMiddleware.mjs +2 -1
  705. package/dist/es/plugins/Emojis/middleware/textComposerEmojiMiddleware.mjs.map +1 -1
  706. package/dist/es/plugins/SlotGeometry/SlotGeometry.mjs +141 -0
  707. package/dist/es/plugins/SlotGeometry/SlotGeometry.mjs.map +1 -0
  708. package/dist/es/plugins/SlotLayout/ChannelSlot.mjs +30 -0
  709. package/dist/es/plugins/SlotLayout/ChannelSlot.mjs.map +1 -0
  710. package/dist/es/{components/ChatView → plugins/SlotLayout}/ChatView.a11y.utility.mjs +1 -1
  711. package/dist/es/plugins/SlotLayout/ChatView.a11y.utility.mjs.map +1 -0
  712. package/dist/es/plugins/SlotLayout/ChatView.mjs +277 -0
  713. package/dist/es/plugins/SlotLayout/ChatView.mjs.map +1 -0
  714. package/dist/es/plugins/SlotLayout/ChatViewNavigationContext.mjs +239 -0
  715. package/dist/es/plugins/SlotLayout/ChatViewNavigationContext.mjs.map +1 -0
  716. package/dist/es/plugins/SlotLayout/ThreadListSlot.mjs +42 -0
  717. package/dist/es/plugins/SlotLayout/ThreadListSlot.mjs.map +1 -0
  718. package/dist/es/plugins/SlotLayout/ThreadSlot.mjs +34 -0
  719. package/dist/es/plugins/SlotLayout/ThreadSlot.mjs.map +1 -0
  720. package/dist/es/plugins/SlotLayout/hooks/useLayoutViewState.mjs +26 -0
  721. package/dist/es/plugins/SlotLayout/hooks/useLayoutViewState.mjs.map +1 -0
  722. package/dist/es/plugins/SlotLayout/hooks/useSlotEntity.mjs +167 -0
  723. package/dist/es/plugins/SlotLayout/hooks/useSlotEntity.mjs.map +1 -0
  724. package/dist/es/plugins/SlotLayout/layout/Slot.mjs +46 -0
  725. package/dist/es/plugins/SlotLayout/layout/Slot.mjs.map +1 -0
  726. package/dist/es/plugins/SlotLayout/layout/WorkspaceLayout.mjs +23 -0
  727. package/dist/es/plugins/SlotLayout/layout/WorkspaceLayout.mjs.map +1 -0
  728. package/dist/es/plugins/SlotLayout/layoutController/LayoutController.mjs +376 -0
  729. package/dist/es/plugins/SlotLayout/layoutController/LayoutController.mjs.map +1 -0
  730. package/dist/es/plugins/SlotLayout/layoutController/serialization.mjs +80 -0
  731. package/dist/es/plugins/SlotLayout/layoutController/serialization.mjs.map +1 -0
  732. package/dist/es/plugins/SlotLayout/slotBinding.mjs +15 -0
  733. package/dist/es/plugins/SlotLayout/slotBinding.mjs.map +1 -0
  734. package/dist/es/plugins/SlotLayout/slotRegistry.mjs +64 -0
  735. package/dist/es/plugins/SlotLayout/slotRegistry.mjs.map +1 -0
  736. package/dist/es/plugins/SlotLayout/workspaceNavigationAdapter.mjs +130 -0
  737. package/dist/es/plugins/SlotLayout/workspaceNavigationAdapter.mjs.map +1 -0
  738. package/dist/es/slot-geometry.mjs +2 -0
  739. package/dist/es/slot-layout.mjs +14 -0
  740. package/dist/es/store/hooks/useStateStore.mjs.map +1 -1
  741. package/dist/es/utils/getChannel.mjs +5 -2
  742. package/dist/es/utils/getChannel.mjs.map +1 -1
  743. package/dist/es/utils/useStableCallback.mjs +1 -1
  744. package/dist/es/utils/useStableCallback.mjs.map +1 -1
  745. package/dist/types/a11y/accessibleLabel.d.ts.map +1 -1
  746. package/dist/types/components/AIStateIndicator/AIStateIndicator.d.ts.map +1 -1
  747. package/dist/types/components/AIStateIndicator/hooks/useAIState.d.ts +3 -8
  748. package/dist/types/components/AIStateIndicator/hooks/useAIState.d.ts.map +1 -1
  749. package/dist/types/components/Accessibility/NotificationAnnouncer.d.ts +1 -2
  750. package/dist/types/components/Accessibility/NotificationAnnouncer.d.ts.map +1 -1
  751. package/dist/types/components/Accessibility/hooks/useIncomingMessageAnnouncements.d.ts.map +1 -1
  752. package/dist/types/components/Accessibility/hooks/useInteractionAnnouncements.d.ts.map +1 -1
  753. package/dist/types/components/Accessibility/useAriaLiveAnnouncer.d.ts +4 -0
  754. package/dist/types/components/Accessibility/useAriaLiveAnnouncer.d.ts.map +1 -1
  755. package/dist/types/components/Attachment/Attachment.d.ts +13 -2
  756. package/dist/types/components/Attachment/Attachment.d.ts.map +1 -1
  757. package/dist/types/components/Attachment/AttachmentActions.d.ts.map +1 -1
  758. package/dist/types/components/Attachment/AttachmentContainer.d.ts +2 -2
  759. package/dist/types/components/Attachment/AttachmentContainer.d.ts.map +1 -1
  760. package/dist/types/components/Attachment/Audio.d.ts.map +1 -1
  761. package/dist/types/components/Attachment/FileAttachment.d.ts.map +1 -1
  762. package/dist/types/components/Attachment/Geolocation.d.ts +3 -3
  763. package/dist/types/components/Attachment/Geolocation.d.ts.map +1 -1
  764. package/dist/types/components/Attachment/Giphy.d.ts.map +1 -1
  765. package/dist/types/components/Attachment/LinkPreview/Card.d.ts.map +1 -1
  766. package/dist/types/components/Attachment/LinkPreview/CardAudio.d.ts +1 -1
  767. package/dist/types/components/Attachment/LinkPreview/CardAudio.d.ts.map +1 -1
  768. package/dist/types/components/Attachment/ModalGallery.d.ts.map +1 -1
  769. package/dist/types/components/Attachment/UnsupportedAttachment.d.ts.map +1 -1
  770. package/dist/types/components/Attachment/VideoAttachment.d.ts.map +1 -1
  771. package/dist/types/components/Attachment/VisibilityDisclaimer.d.ts.map +1 -1
  772. package/dist/types/components/Attachment/VoiceRecording.d.ts.map +1 -1
  773. package/dist/types/components/Attachment/components/DownloadButton.d.ts.map +1 -1
  774. package/dist/types/components/Attachment/components/index.d.ts +1 -1
  775. package/dist/types/components/Attachment/components/index.d.ts.map +1 -1
  776. package/dist/types/components/Attachment/hooks/useAttachmentUploadState.d.ts +0 -28
  777. package/dist/types/components/Attachment/hooks/useAttachmentUploadState.d.ts.map +1 -1
  778. package/dist/types/components/Attachment/index.d.ts +1 -1
  779. package/dist/types/components/Attachment/index.d.ts.map +1 -1
  780. package/dist/types/components/Attachment/utils.d.ts +2 -2
  781. package/dist/types/components/Attachment/utils.d.ts.map +1 -1
  782. package/dist/types/components/AudioPlayback/AudioPlaybackArbiter.d.ts +37 -0
  783. package/dist/types/components/AudioPlayback/AudioPlaybackArbiter.d.ts.map +1 -0
  784. package/dist/types/components/AudioPlayback/AudioPlayer.d.ts +1 -1
  785. package/dist/types/components/AudioPlayback/AudioPlayer.d.ts.map +1 -1
  786. package/dist/types/components/AudioPlayback/AudioPlayerPool.d.ts +19 -31
  787. package/dist/types/components/AudioPlayback/AudioPlayerPool.d.ts.map +1 -1
  788. package/dist/types/components/AudioPlayback/WithAudioPlayback.d.ts +17 -2
  789. package/dist/types/components/AudioPlayback/WithAudioPlayback.d.ts.map +1 -1
  790. package/dist/types/components/AudioPlayback/components/ProgressBar.d.ts.map +1 -1
  791. package/dist/types/components/AudioPlayback/components/WaveProgressBar.d.ts.map +1 -1
  792. package/dist/types/components/AudioPlayback/components/progressBarA11y.d.ts +2 -2
  793. package/dist/types/components/AudioPlayback/components/progressBarA11y.d.ts.map +1 -1
  794. package/dist/types/components/AudioPlayback/index.d.ts.map +1 -1
  795. package/dist/types/components/AudioPlayback/plugins/AudioPlayerNotificationsPlugin.d.ts +2 -2
  796. package/dist/types/components/AudioPlayback/plugins/AudioPlayerNotificationsPlugin.d.ts.map +1 -1
  797. package/dist/types/components/Avatar/Avatar.d.ts +1 -5
  798. package/dist/types/components/Avatar/Avatar.d.ts.map +1 -1
  799. package/dist/types/components/Badge/Badge.d.ts.map +1 -1
  800. package/dist/types/components/Badge/MediaBadge.d.ts.map +1 -1
  801. package/dist/types/components/BaseImage/ImagePlaceholder.d.ts.map +1 -1
  802. package/dist/types/components/Button/PlayButton.d.ts.map +1 -1
  803. package/dist/types/components/Button/WorkspaceNavigationButtons.d.ts +11 -0
  804. package/dist/types/components/Button/WorkspaceNavigationButtons.d.ts.map +1 -0
  805. package/dist/types/components/Button/index.d.ts +1 -0
  806. package/dist/types/components/Button/index.d.ts.map +1 -1
  807. package/dist/types/components/Channel/Channel.d.ts +9 -57
  808. package/dist/types/components/Channel/Channel.d.ts.map +1 -1
  809. package/dist/types/components/Channel/hooks/useChannelCapabilities.d.ts +4 -0
  810. package/dist/types/components/Channel/hooks/useChannelCapabilities.d.ts.map +1 -0
  811. package/dist/types/components/Channel/index.d.ts +1 -2
  812. package/dist/types/components/Channel/index.d.ts.map +1 -1
  813. package/dist/types/components/ChannelHeader/ChannelHeader.d.ts +12 -0
  814. package/dist/types/components/ChannelHeader/ChannelHeader.d.ts.map +1 -1
  815. package/dist/types/components/ChannelHeader/hooks/useChannelHasMembersOnline.d.ts +8 -0
  816. package/dist/types/components/ChannelHeader/hooks/useChannelHasMembersOnline.d.ts.map +1 -1
  817. package/dist/types/components/ChannelHeader/hooks/useChannelHeaderOnlineStatus.d.ts +7 -8
  818. package/dist/types/components/ChannelHeader/hooks/useChannelHeaderOnlineStatus.d.ts.map +1 -1
  819. package/dist/types/components/ChannelList/ChannelList.d.ts +11 -78
  820. package/dist/types/components/ChannelList/ChannelList.d.ts.map +1 -1
  821. package/dist/types/components/ChannelList/ChannelListHeader.d.ts.map +1 -1
  822. package/dist/types/components/ChannelList/ChannelLists.d.ts +10 -0
  823. package/dist/types/components/ChannelList/ChannelLists.d.ts.map +1 -0
  824. package/dist/types/components/ChannelList/ChannelNavigation.d.ts +9 -0
  825. package/dist/types/components/ChannelList/ChannelNavigation.d.ts.map +1 -0
  826. package/dist/types/components/ChannelList/hooks/index.d.ts +1 -2
  827. package/dist/types/components/ChannelList/hooks/index.d.ts.map +1 -1
  828. package/dist/types/components/ChannelList/hooks/useChannelMembersState.d.ts.map +1 -1
  829. package/dist/types/components/ChannelList/hooks/useChannelMembershipState.d.ts.map +1 -1
  830. package/dist/types/components/ChannelList/hooks/useChannelPaginatorState.d.ts +18 -0
  831. package/dist/types/components/ChannelList/hooks/useChannelPaginatorState.d.ts.map +1 -0
  832. package/dist/types/components/ChannelList/hooks/useSelectedChannelState.d.ts +3 -3
  833. package/dist/types/components/ChannelList/hooks/useSelectedChannelState.d.ts.map +1 -1
  834. package/dist/types/components/ChannelList/index.d.ts +3 -2
  835. package/dist/types/components/ChannelList/index.d.ts.map +1 -1
  836. package/dist/types/components/ChannelListItem/ChannelListItem.d.ts +9 -18
  837. package/dist/types/components/ChannelListItem/ChannelListItem.d.ts.map +1 -1
  838. package/dist/types/components/ChannelListItem/ChannelListItemActionButtons.defaults.d.ts.map +1 -1
  839. package/dist/types/components/ChannelListItem/ChannelListItemTimestamp.d.ts +3 -3
  840. package/dist/types/components/ChannelListItem/ChannelListItemTimestamp.d.ts.map +1 -1
  841. package/dist/types/components/ChannelListItem/ChannelListItemUI.d.ts.map +1 -1
  842. package/dist/types/components/ChannelListItem/hooks/useChannelDisplayName.d.ts +1 -1
  843. package/dist/types/components/ChannelListItem/hooks/useChannelDisplayName.d.ts.map +1 -1
  844. package/dist/types/components/ChannelListItem/hooks/useIsChannelMuted.d.ts +8 -5
  845. package/dist/types/components/ChannelListItem/hooks/useIsChannelMuted.d.ts.map +1 -1
  846. package/dist/types/components/ChannelListItem/hooks/useMessageDeliveryStatus.d.ts.map +1 -1
  847. package/dist/types/components/ChannelListItem/utils.a11y.d.ts +14 -5
  848. package/dist/types/components/ChannelListItem/utils.a11y.d.ts.map +1 -1
  849. package/dist/types/components/ChannelListItem/utils.d.ts +1 -1
  850. package/dist/types/components/ChannelListItem/utils.d.ts.map +1 -1
  851. package/dist/types/components/Chat/Chat.d.ts +1 -4
  852. package/dist/types/components/Chat/Chat.d.ts.map +1 -1
  853. package/dist/types/components/Chat/hooks/useChat.d.ts +4 -16
  854. package/dist/types/components/Chat/hooks/useChat.d.ts.map +1 -1
  855. package/dist/types/components/Chat/hooks/useCreateChatClient.d.ts +2 -2
  856. package/dist/types/components/Chat/hooks/useCreateChatClient.d.ts.map +1 -1
  857. package/dist/types/components/Chat/hooks/useCreateChatContext.d.ts.map +1 -1
  858. package/dist/types/components/Chat/hooks/useNetworkConnectionState.d.ts +34 -0
  859. package/dist/types/components/Chat/hooks/useNetworkConnectionState.d.ts.map +1 -0
  860. package/dist/types/components/Chat/hooks/useReportLostConnectionSystemNotification.d.ts +26 -2
  861. package/dist/types/components/Chat/hooks/useReportLostConnectionSystemNotification.d.ts.map +1 -1
  862. package/dist/types/components/Chat/hooks/useWSConnectionState.d.ts +22 -0
  863. package/dist/types/components/Chat/hooks/useWSConnectionState.d.ts.map +1 -0
  864. package/dist/types/components/Chat/index.d.ts +2 -0
  865. package/dist/types/components/Chat/index.d.ts.map +1 -1
  866. package/dist/types/components/Dialog/components/ContextMenu.d.ts +0 -4
  867. package/dist/types/components/Dialog/components/ContextMenu.d.ts.map +1 -1
  868. package/dist/types/components/Dialog/hooks/usePopoverPosition.d.ts +2 -2
  869. package/dist/types/components/Dialog/hooks/usePopoverPosition.d.ts.map +1 -1
  870. package/dist/types/components/Dialog/service/DialogManager.d.ts +1 -1
  871. package/dist/types/components/Dialog/service/DialogManager.d.ts.map +1 -1
  872. package/dist/types/components/EmptyStateIndicator/EmptyStateIndicator.d.ts.map +1 -1
  873. package/dist/types/components/Form/Dropdown.d.ts +4 -1
  874. package/dist/types/components/Form/Dropdown.d.ts.map +1 -1
  875. package/dist/types/components/Form/NumericInput.d.ts.map +1 -1
  876. package/dist/types/components/Gallery/GalleryContext.d.ts +5 -0
  877. package/dist/types/components/Gallery/GalleryContext.d.ts.map +1 -1
  878. package/dist/types/components/Gallery/GalleryHeader.d.ts.map +1 -1
  879. package/dist/types/components/Gallery/GalleryUI.d.ts.map +1 -1
  880. package/dist/types/components/Icons/index.d.ts +1 -1
  881. package/dist/types/components/Icons/index.d.ts.map +1 -1
  882. package/dist/types/components/Icons/slots.d.ts +18 -7
  883. package/dist/types/components/Icons/slots.d.ts.map +1 -1
  884. package/dist/types/components/InfiniteScrollPaginator/InfiniteScrollPaginator.d.ts +8 -2
  885. package/dist/types/components/InfiniteScrollPaginator/InfiniteScrollPaginator.d.ts.map +1 -1
  886. package/dist/types/components/InfiniteScrollPaginator/InfiniteScrollWithComponents.d.ts +43 -0
  887. package/dist/types/components/InfiniteScrollPaginator/InfiniteScrollWithComponents.d.ts.map +1 -0
  888. package/dist/types/components/InfiniteScrollPaginator/hooks/useCursorPaginator.d.ts +1 -1
  889. package/dist/types/components/InfiniteScrollPaginator/hooks/useCursorPaginator.d.ts.map +1 -1
  890. package/dist/types/components/LoadMore/LoadMoreButton.d.ts.map +1 -1
  891. package/dist/types/components/Loading/AttachmentUploadedSizeIndicator.d.ts +3 -0
  892. package/dist/types/components/Loading/AttachmentUploadedSizeIndicator.d.ts.map +1 -1
  893. package/dist/types/components/Loading/LoadingErrorIndicator.d.ts.map +1 -1
  894. package/dist/types/components/Loading/LoadingIndicator.d.ts +2 -3
  895. package/dist/types/components/Loading/LoadingIndicator.d.ts.map +1 -1
  896. package/dist/types/components/Loading/UploadProgressIndicator.d.ts +2 -2
  897. package/dist/types/components/Loading/index.d.ts +1 -1
  898. package/dist/types/components/Loading/index.d.ts.map +1 -1
  899. package/dist/types/components/Loading/progress-indicators.d.ts.map +1 -1
  900. package/dist/types/components/Location/ShareLocationDialog.d.ts.map +1 -1
  901. package/dist/types/components/Location/hooks/useLiveLocationSharingManager.d.ts.map +1 -1
  902. package/dist/types/components/MediaRecorder/AudioRecorder/AudioRecorderRecordingControls.d.ts.map +1 -1
  903. package/dist/types/components/MediaRecorder/AudioRecorder/AudioRecordingButtonWithNotification.d.ts.map +1 -1
  904. package/dist/types/components/MediaRecorder/AudioRecorder/AudioRecordingPlayback.d.ts.map +1 -1
  905. package/dist/types/components/MediaRecorder/AudioRecorder/AudioRecordingPreview.d.ts.map +1 -1
  906. package/dist/types/components/MediaRecorder/RecordingPermissionDeniedNotification.d.ts.map +1 -1
  907. package/dist/types/components/MediaRecorder/classes/MediaRecorderController.d.ts.map +1 -1
  908. package/dist/types/components/MediaRecorder/hooks/useMediaRecorder.d.ts +2 -2
  909. package/dist/types/components/MediaRecorder/hooks/useMediaRecorder.d.ts.map +1 -1
  910. package/dist/types/components/Message/Message.d.ts.map +1 -1
  911. package/dist/types/components/Message/MessageAlsoSentInChannelIndicator.d.ts +11 -1
  912. package/dist/types/components/Message/MessageAlsoSentInChannelIndicator.d.ts.map +1 -1
  913. package/dist/types/components/Message/MessageDeletedBubble.d.ts.map +1 -1
  914. package/dist/types/components/Message/MessageEditedIndicator.d.ts.map +1 -1
  915. package/dist/types/components/Message/MessageRepliesCountButton.d.ts.map +1 -1
  916. package/dist/types/components/Message/MessageStatus.d.ts.map +1 -1
  917. package/dist/types/components/Message/MessageText.d.ts.map +1 -1
  918. package/dist/types/components/Message/MessageTimestamp.d.ts.map +1 -1
  919. package/dist/types/components/Message/MessageTranslationIndicator.d.ts.map +1 -1
  920. package/dist/types/components/Message/MessageUI.d.ts.map +1 -1
  921. package/dist/types/components/Message/ReminderNotification.d.ts.map +1 -1
  922. package/dist/types/components/Message/StreamedMessageText.d.ts.map +1 -1
  923. package/dist/types/components/Message/Timestamp.d.ts.map +1 -1
  924. package/dist/types/components/Message/hooks/index.d.ts +1 -0
  925. package/dist/types/components/Message/hooks/index.d.ts.map +1 -1
  926. package/dist/types/components/Message/hooks/useActionHandler.d.ts +1 -1
  927. package/dist/types/components/Message/hooks/useActionHandler.d.ts.map +1 -1
  928. package/dist/types/components/Message/hooks/useDeleteHandler.d.ts +6 -2
  929. package/dist/types/components/Message/hooks/useDeleteHandler.d.ts.map +1 -1
  930. package/dist/types/components/Message/hooks/useMarkUnreadHandler.d.ts +6 -1
  931. package/dist/types/components/Message/hooks/useMarkUnreadHandler.d.ts.map +1 -1
  932. package/dist/types/components/Message/hooks/useMentionsHandler.d.ts.map +1 -1
  933. package/dist/types/components/Message/hooks/useMessageAlsoSentInChannelNavigation.d.ts +22 -0
  934. package/dist/types/components/Message/hooks/useMessageAlsoSentInChannelNavigation.d.ts.map +1 -0
  935. package/dist/types/components/Message/hooks/useMuteHandler.d.ts +7 -2
  936. package/dist/types/components/Message/hooks/useMuteHandler.d.ts.map +1 -1
  937. package/dist/types/components/Message/hooks/useOpenThreadHandler.d.ts +1 -0
  938. package/dist/types/components/Message/hooks/useOpenThreadHandler.d.ts.map +1 -1
  939. package/dist/types/components/Message/hooks/usePinHandler.d.ts +23 -2
  940. package/dist/types/components/Message/hooks/usePinHandler.d.ts.map +1 -1
  941. package/dist/types/components/Message/hooks/useReactionHandler.d.ts +1 -1
  942. package/dist/types/components/Message/hooks/useReactionHandler.d.ts.map +1 -1
  943. package/dist/types/components/Message/hooks/useReactionsFetcher.d.ts +2 -2
  944. package/dist/types/components/Message/hooks/useReactionsFetcher.d.ts.map +1 -1
  945. package/dist/types/components/Message/hooks/useRetryHandler.d.ts +3 -2
  946. package/dist/types/components/Message/hooks/useRetryHandler.d.ts.map +1 -1
  947. package/dist/types/components/Message/hooks/useUserRole.d.ts +1 -0
  948. package/dist/types/components/Message/hooks/useUserRole.d.ts.map +1 -1
  949. package/dist/types/components/Message/types.d.ts +11 -20
  950. package/dist/types/components/Message/types.d.ts.map +1 -1
  951. package/dist/types/components/Message/utils.d.ts +7 -38
  952. package/dist/types/components/Message/utils.d.ts.map +1 -1
  953. package/dist/types/components/MessageActions/DeleteMessageAlert.d.ts.map +1 -1
  954. package/dist/types/components/MessageActions/DownloadSubmenu.d.ts.map +1 -1
  955. package/dist/types/components/MessageActions/MessageActions.d.ts +6 -2
  956. package/dist/types/components/MessageActions/MessageActions.d.ts.map +1 -1
  957. package/dist/types/components/MessageActions/MessageActions.defaults.d.ts.map +1 -1
  958. package/dist/types/components/MessageActions/RemindMeSubmenu.d.ts.map +1 -1
  959. package/dist/types/components/MessageActions/hooks/useBaseMessageActionSetFilter.d.ts.map +1 -1
  960. package/dist/types/components/MessageBounce/MessageBouncePrompt.d.ts.map +1 -1
  961. package/dist/types/components/MessageComposer/AttachmentPreviewList/AudioAttachmentPreview.d.ts.map +1 -1
  962. package/dist/types/components/MessageComposer/AttachmentPreviewList/FileAttachmentPreview.d.ts.map +1 -1
  963. package/dist/types/components/MessageComposer/AttachmentPreviewList/GeolocationPreview.d.ts.map +1 -1
  964. package/dist/types/components/MessageComposer/AttachmentPreviewList/MediaAttachmentPreview.d.ts.map +1 -1
  965. package/dist/types/components/MessageComposer/AttachmentPreviewList/UnsupportedAttachmentPreview.d.ts.map +1 -1
  966. package/dist/types/components/MessageComposer/AttachmentPreviewList/index.d.ts +1 -1
  967. package/dist/types/components/MessageComposer/AttachmentPreviewList/index.d.ts.map +1 -1
  968. package/dist/types/components/MessageComposer/AttachmentPreviewList/utils/AttachmentPreviewRoot.d.ts.map +1 -1
  969. package/dist/types/components/MessageComposer/AttachmentSelector/AttachmentSelector.d.ts.map +1 -1
  970. package/dist/types/components/MessageComposer/AttachmentSelector/CommandsMenu.d.ts +5 -5
  971. package/dist/types/components/MessageComposer/AttachmentSelector/CommandsMenu.d.ts.map +1 -1
  972. package/dist/types/components/MessageComposer/CommandChip.d.ts.map +1 -1
  973. package/dist/types/components/MessageComposer/EditMessageForm.d.ts +1 -0
  974. package/dist/types/components/MessageComposer/EditMessageForm.d.ts.map +1 -0
  975. package/dist/types/components/MessageComposer/MessageComposer.d.ts +1 -17
  976. package/dist/types/components/MessageComposer/MessageComposer.d.ts.map +1 -1
  977. package/dist/types/components/MessageComposer/MessageComposerActions.d.ts.map +1 -1
  978. package/dist/types/components/MessageComposer/MessageComposerUI.d.ts.map +1 -1
  979. package/dist/types/components/MessageComposer/QuotedMessagePreview.d.ts +3 -3
  980. package/dist/types/components/MessageComposer/QuotedMessagePreview.d.ts.map +1 -1
  981. package/dist/types/components/MessageComposer/RemoveAttachmentPreviewButton.d.ts.map +1 -1
  982. package/dist/types/components/MessageComposer/SendButton.d.ts.map +1 -1
  983. package/dist/types/components/MessageComposer/SendToChannelCheckbox.d.ts.map +1 -1
  984. package/dist/types/components/MessageComposer/StopAIGenerationButton.d.ts.map +1 -1
  985. package/dist/types/components/MessageComposer/WithDragAndDropUpload.d.ts +2 -5
  986. package/dist/types/components/MessageComposer/WithDragAndDropUpload.d.ts.map +1 -1
  987. package/dist/types/components/MessageComposer/hooks/index.d.ts +1 -0
  988. package/dist/types/components/MessageComposer/hooks/index.d.ts.map +1 -1
  989. package/dist/types/components/MessageComposer/hooks/useAttachmentManagerState.d.ts +5 -1
  990. package/dist/types/components/MessageComposer/hooks/useAttachmentManagerState.d.ts.map +1 -1
  991. package/dist/types/components/MessageComposer/hooks/useAttachmentsForPreview.d.ts +1 -2
  992. package/dist/types/components/MessageComposer/hooks/useAttachmentsForPreview.d.ts.map +1 -1
  993. package/dist/types/components/MessageComposer/hooks/useCreateMessageComposerContext.d.ts.map +1 -1
  994. package/dist/types/components/MessageComposer/hooks/useMessageComposerBindings.d.ts +0 -1
  995. package/dist/types/components/MessageComposer/hooks/useMessageComposerBindings.d.ts.map +1 -1
  996. package/dist/types/components/MessageComposer/hooks/useMessageComposerCommands.d.ts +2 -2
  997. package/dist/types/components/MessageComposer/hooks/useMessageComposerCommands.d.ts.map +1 -1
  998. package/dist/types/components/MessageComposer/hooks/useMessageComposerController.d.ts +1 -1
  999. package/dist/types/components/MessageComposer/hooks/useMessageComposerController.d.ts.map +1 -1
  1000. package/dist/types/components/MessageComposer/hooks/useMessageComposerHasSendableData.d.ts.map +1 -1
  1001. package/dist/types/components/MessageComposer/hooks/useMessageComposerSubmitFn.d.ts +7 -0
  1002. package/dist/types/components/MessageComposer/hooks/useMessageComposerSubmitFn.d.ts.map +1 -0
  1003. package/dist/types/components/MessageComposer/index.d.ts +2 -1
  1004. package/dist/types/components/MessageComposer/index.d.ts.map +1 -1
  1005. package/dist/types/components/MessageList/FloatingDateSeparator.d.ts +1 -1
  1006. package/dist/types/components/MessageList/FloatingDateSeparator.d.ts.map +1 -1
  1007. package/dist/types/components/MessageList/MessageList.d.ts +24 -25
  1008. package/dist/types/components/MessageList/MessageList.d.ts.map +1 -1
  1009. package/dist/types/components/MessageList/NewMessageNotification.d.ts.map +1 -1
  1010. package/dist/types/components/MessageList/ScrollToLatestMessageButton.d.ts +0 -1
  1011. package/dist/types/components/MessageList/ScrollToLatestMessageButton.d.ts.map +1 -1
  1012. package/dist/types/components/MessageList/UnreadMessagesNotification.d.ts +1 -4
  1013. package/dist/types/components/MessageList/UnreadMessagesNotification.d.ts.map +1 -1
  1014. package/dist/types/components/MessageList/UnreadMessagesSeparator.d.ts.map +1 -1
  1015. package/dist/types/components/MessageList/VirtualizedMessageList.d.ts +23 -42
  1016. package/dist/types/components/MessageList/VirtualizedMessageList.d.ts.map +1 -1
  1017. package/dist/types/components/MessageList/VirtualizedMessageListComponents.d.ts.map +1 -1
  1018. package/dist/types/components/MessageList/hooks/MessageList/useEnrichedMessages.d.ts +3 -3
  1019. package/dist/types/components/MessageList/hooks/MessageList/useEnrichedMessages.d.ts.map +1 -1
  1020. package/dist/types/components/MessageList/hooks/MessageList/useFloatingDateSeparatorMessageList.d.ts +2 -2
  1021. package/dist/types/components/MessageList/hooks/MessageList/useFloatingDateSeparatorMessageList.d.ts.map +1 -1
  1022. package/dist/types/components/MessageList/hooks/MessageList/useMessageListElements.d.ts +1 -3
  1023. package/dist/types/components/MessageList/hooks/MessageList/useMessageListElements.d.ts.map +1 -1
  1024. package/dist/types/components/MessageList/hooks/MessageList/useMessageListScrollManager.d.ts +1 -0
  1025. package/dist/types/components/MessageList/hooks/MessageList/useMessageListScrollManager.d.ts.map +1 -1
  1026. package/dist/types/components/MessageList/hooks/MessageList/useScrollLocationLogic.d.ts +6 -25
  1027. package/dist/types/components/MessageList/hooks/MessageList/useScrollLocationLogic.d.ts.map +1 -1
  1028. package/dist/types/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.d.ts +1 -1
  1029. package/dist/types/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.d.ts.map +1 -1
  1030. package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useFloatingDateSeparator.d.ts +2 -2
  1031. package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useFloatingDateSeparator.d.ts.map +1 -1
  1032. package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.d.ts +1 -1
  1033. package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.d.ts.map +1 -1
  1034. package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.d.ts +1 -5
  1035. package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.d.ts.map +1 -1
  1036. package/dist/types/components/MessageList/hooks/useCanPaginateReplies.d.ts +32 -0
  1037. package/dist/types/components/MessageList/hooks/useCanPaginateReplies.d.ts.map +1 -0
  1038. package/dist/types/components/MessageList/hooks/useLastDeliveredData.d.ts +1 -0
  1039. package/dist/types/components/MessageList/hooks/useLastDeliveredData.d.ts.map +1 -1
  1040. package/dist/types/components/MessageList/hooks/useLastReadData.d.ts +1 -0
  1041. package/dist/types/components/MessageList/hooks/useLastReadData.d.ts.map +1 -1
  1042. package/dist/types/components/MessageList/hooks/useMarkRead.d.ts +5 -9
  1043. package/dist/types/components/MessageList/hooks/useMarkRead.d.ts.map +1 -1
  1044. package/dist/types/components/MessageList/hooks/useReceiptsByMessageId.d.ts +12 -0
  1045. package/dist/types/components/MessageList/hooks/useReceiptsByMessageId.d.ts.map +1 -0
  1046. package/dist/types/components/MessageList/hooks/useThreadHead.d.ts +9 -0
  1047. package/dist/types/components/MessageList/hooks/useThreadHead.d.ts.map +1 -0
  1048. package/dist/types/components/MessageList/messageSourceKey.d.ts +14 -0
  1049. package/dist/types/components/MessageList/messageSourceKey.d.ts.map +1 -0
  1050. package/dist/types/components/MessageList/renderMessages.d.ts +11 -9
  1051. package/dist/types/components/MessageList/renderMessages.d.ts.map +1 -1
  1052. package/dist/types/components/MessageList/utils.d.ts +22 -13
  1053. package/dist/types/components/MessageList/utils.d.ts.map +1 -1
  1054. package/dist/types/components/Modal/CloseButtonOnModalOverlay.d.ts.map +1 -1
  1055. package/dist/types/components/Notifications/Notification.d.ts.map +1 -1
  1056. package/dist/types/components/Notifications/NotificationList.d.ts.map +1 -1
  1057. package/dist/types/components/Notifications/hooks/useNotificationApi.d.ts +3 -0
  1058. package/dist/types/components/Notifications/hooks/useNotificationApi.d.ts.map +1 -1
  1059. package/dist/types/components/Notifications/hooks/useNotificationTarget.d.ts.map +1 -1
  1060. package/dist/types/components/Notifications/notificationTarget.d.ts.map +1 -1
  1061. package/dist/types/components/Poll/PollActions/AddCommentPrompt.d.ts.map +1 -1
  1062. package/dist/types/components/Poll/PollActions/EndPollAlert.d.ts.map +1 -1
  1063. package/dist/types/components/Poll/PollActions/PollActions.d.ts.map +1 -1
  1064. package/dist/types/components/Poll/PollActions/PollAnswerList.d.ts.map +1 -1
  1065. package/dist/types/components/Poll/PollActions/PollOptionsFullList.d.ts.map +1 -1
  1066. package/dist/types/components/Poll/PollActions/PollQuestion.d.ts.map +1 -1
  1067. package/dist/types/components/Poll/PollActions/PollResults/PollOptionWithVotes.d.ts +2 -2
  1068. package/dist/types/components/Poll/PollActions/PollResults/PollOptionWithVotes.d.ts.map +1 -1
  1069. package/dist/types/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.d.ts +2 -2
  1070. package/dist/types/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.d.ts.map +1 -1
  1071. package/dist/types/components/Poll/PollActions/PollResults/PollOptionWithVotesList.d.ts +2 -2
  1072. package/dist/types/components/Poll/PollActions/PollResults/PollOptionWithVotesList.d.ts.map +1 -1
  1073. package/dist/types/components/Poll/PollActions/PollResults/PollResults.d.ts.map +1 -1
  1074. package/dist/types/components/Poll/PollActions/SuggestPollOptionPrompt.d.ts.map +1 -1
  1075. package/dist/types/components/Poll/PollCreationDialog/MultipleAnswersField.d.ts.map +1 -1
  1076. package/dist/types/components/Poll/PollCreationDialog/NameField.d.ts.map +1 -1
  1077. package/dist/types/components/Poll/PollCreationDialog/OptionFieldSet.d.ts.map +1 -1
  1078. package/dist/types/components/Poll/PollCreationDialog/PollCreationDialog.d.ts.map +1 -1
  1079. package/dist/types/components/Poll/PollCreationDialog/PollCreationDialogControls.d.ts.map +1 -1
  1080. package/dist/types/components/Poll/PollCreationDialog/PollOptionReorderHandle.d.ts.map +1 -1
  1081. package/dist/types/components/Poll/PollHeader.d.ts.map +1 -1
  1082. package/dist/types/components/Poll/PollOptionList.d.ts.map +1 -1
  1083. package/dist/types/components/Poll/PollOptionSelector.d.ts +2 -2
  1084. package/dist/types/components/Poll/PollOptionSelector.d.ts.map +1 -1
  1085. package/dist/types/components/Poll/PollVote.d.ts +1 -1
  1086. package/dist/types/components/Poll/PollVote.d.ts.map +1 -1
  1087. package/dist/types/components/Poll/hooks/useManagePollVotesRealtime.d.ts +2 -2
  1088. package/dist/types/components/Poll/hooks/useManagePollVotesRealtime.d.ts.map +1 -1
  1089. package/dist/types/components/Poll/hooks/usePollAnswerPagination.d.ts +2 -2
  1090. package/dist/types/components/Poll/hooks/usePollAnswerPagination.d.ts.map +1 -1
  1091. package/dist/types/components/Poll/hooks/usePollOptionVotesPagination.d.ts +2 -2
  1092. package/dist/types/components/Poll/hooks/usePollOptionVotesPagination.d.ts.map +1 -1
  1093. package/dist/types/components/Reactions/MessageReactions.d.ts.map +1 -1
  1094. package/dist/types/components/Reactions/MessageReactionsDetail.d.ts +2 -2
  1095. package/dist/types/components/Reactions/MessageReactionsDetail.d.ts.map +1 -1
  1096. package/dist/types/components/Reactions/ReactionSelector.d.ts.map +1 -1
  1097. package/dist/types/components/Reactions/ReactionSelectorWithButton.d.ts +0 -5
  1098. package/dist/types/components/Reactions/ReactionSelectorWithButton.d.ts.map +1 -1
  1099. package/dist/types/components/Reactions/hooks/useFetchReactions.d.ts +2 -2
  1100. package/dist/types/components/Reactions/hooks/useFetchReactions.d.ts.map +1 -1
  1101. package/dist/types/components/Reactions/hooks/useProcessReactions.d.ts +1 -3
  1102. package/dist/types/components/Reactions/hooks/useProcessReactions.d.ts.map +1 -1
  1103. package/dist/types/components/Search/SearchBar/SearchBar.d.ts.map +1 -1
  1104. package/dist/types/components/Search/SearchContext.d.ts.map +1 -1
  1105. package/dist/types/components/Search/SearchResults/SearchResultItem.d.ts +20 -6
  1106. package/dist/types/components/Search/SearchResults/SearchResultItem.d.ts.map +1 -1
  1107. package/dist/types/components/Search/SearchResults/SearchResultsHeader.d.ts.map +1 -1
  1108. package/dist/types/components/Search/SearchResults/SearchSourceResultsEmpty.d.ts.map +1 -1
  1109. package/dist/types/components/Search/SearchResults/SearchSourceResultsLoadingIndicator.d.ts.map +1 -1
  1110. package/dist/types/components/Search/SearchSourceResultsContext.d.ts.map +1 -1
  1111. package/dist/types/components/Search/hooks/index.d.ts +0 -1
  1112. package/dist/types/components/Search/hooks/index.d.ts.map +1 -1
  1113. package/dist/types/components/SummarizedMessagePreview/SummarizedMessagePreview.d.ts +6 -0
  1114. package/dist/types/components/SummarizedMessagePreview/SummarizedMessagePreview.d.ts.map +1 -1
  1115. package/dist/types/components/SummarizedMessagePreview/hooks/useLatestMessagePreview.d.ts.map +1 -1
  1116. package/dist/types/components/TextareaComposer/SuggestionList/CommandItem.d.ts +2 -2
  1117. package/dist/types/components/TextareaComposer/SuggestionList/CommandItem.d.ts.map +1 -1
  1118. package/dist/types/components/TextareaComposer/SuggestionList/MentionItem/BroadcastMentionItem.d.ts.map +1 -1
  1119. package/dist/types/components/TextareaComposer/SuggestionList/MentionItem/RoleItem.d.ts.map +1 -1
  1120. package/dist/types/components/TextareaComposer/SuggestionList/MentionItem/UserGroupItem.d.ts.map +1 -1
  1121. package/dist/types/components/TextareaComposer/SuggestionList/SuggestionList.d.ts.map +1 -1
  1122. package/dist/types/components/TextareaComposer/TextareaComposer.d.ts.map +1 -1
  1123. package/dist/types/components/TextareaComposer/hooks/useTextareaPlaceholder.d.ts.map +1 -1
  1124. package/dist/types/components/Thread/Thread.d.ts +31 -27
  1125. package/dist/types/components/Thread/Thread.d.ts.map +1 -1
  1126. package/dist/types/components/Thread/ThreadHead.d.ts.map +1 -1
  1127. package/dist/types/components/Thread/ThreadHeader.d.ts +13 -6
  1128. package/dist/types/components/Thread/ThreadHeader.d.ts.map +1 -1
  1129. package/dist/types/components/Thread/ThreadStart.d.ts.map +1 -1
  1130. package/dist/types/components/Thread/index.d.ts +0 -1
  1131. package/dist/types/components/Thread/index.d.ts.map +1 -1
  1132. package/dist/types/components/Threads/ThreadContext.d.ts.map +1 -1
  1133. package/dist/types/components/Threads/ThreadList/ThreadList.d.ts.map +1 -1
  1134. package/dist/types/components/Threads/ThreadList/ThreadListEmptyPlaceholder.d.ts.map +1 -1
  1135. package/dist/types/components/Threads/ThreadList/ThreadListHeader.d.ts.map +1 -1
  1136. package/dist/types/components/Threads/ThreadList/ThreadListItemUI.d.ts.map +1 -1
  1137. package/dist/types/components/Threads/ThreadList/ThreadListUnseenThreadsBanner.d.ts.map +1 -1
  1138. package/dist/types/components/Threads/ThreadList/useThreadHighlighting.d.ts +15 -0
  1139. package/dist/types/components/Threads/ThreadList/useThreadHighlighting.d.ts.map +1 -0
  1140. package/dist/types/components/Threads/ThreadList/utils.a11y.d.ts.map +1 -1
  1141. package/dist/types/components/Threads/hooks/useCloseThread.d.ts +9 -0
  1142. package/dist/types/components/Threads/hooks/useCloseThread.d.ts.map +1 -0
  1143. package/dist/types/components/Threads/index.d.ts +1 -0
  1144. package/dist/types/components/Threads/index.d.ts.map +1 -1
  1145. package/dist/types/components/TypingIndicator/TypingIndicator.d.ts +4 -5
  1146. package/dist/types/components/TypingIndicator/TypingIndicator.d.ts.map +1 -1
  1147. package/dist/types/components/TypingIndicator/TypingIndicatorHeader.d.ts +1 -1
  1148. package/dist/types/components/TypingIndicator/TypingIndicatorHeader.d.ts.map +1 -1
  1149. package/dist/types/components/TypingIndicator/hooks/useDebouncedTypingActive.d.ts +2 -2
  1150. package/dist/types/components/TypingIndicator/hooks/useDebouncedTypingActive.d.ts.map +1 -1
  1151. package/dist/types/components/TypingIndicator/utils/getTypingStatusMessage.d.ts +2 -3
  1152. package/dist/types/components/TypingIndicator/utils/getTypingStatusMessage.d.ts.map +1 -1
  1153. package/dist/types/components/VideoPlayer/VideoThumbnail.d.ts.map +1 -1
  1154. package/dist/types/components/index.d.ts +0 -2
  1155. package/dist/types/components/index.d.ts.map +1 -1
  1156. package/dist/types/context/AttachmentContext.d.ts +19 -0
  1157. package/dist/types/context/AttachmentContext.d.ts.map +1 -0
  1158. package/dist/types/context/ChannelInstanceContext.d.ts +16 -0
  1159. package/dist/types/context/ChannelInstanceContext.d.ts.map +1 -0
  1160. package/dist/types/context/ChannelListContext.d.ts +9 -18
  1161. package/dist/types/context/ChannelListContext.d.ts.map +1 -1
  1162. package/dist/types/context/ChatContext.d.ts +10 -23
  1163. package/dist/types/context/ChatContext.d.ts.map +1 -1
  1164. package/dist/types/context/ComponentContext.d.ts +30 -23
  1165. package/dist/types/context/ComponentContext.d.ts.map +1 -1
  1166. package/dist/types/context/DialogManagerContext.d.ts.map +1 -1
  1167. package/dist/types/context/MessageBounceContext.d.ts +1 -1
  1168. package/dist/types/context/MessageBounceContext.d.ts.map +1 -1
  1169. package/dist/types/context/MessageComposerContext.d.ts +7 -2
  1170. package/dist/types/context/MessageComposerContext.d.ts.map +1 -1
  1171. package/dist/types/context/MessageComposerControllerContext.d.ts +13 -0
  1172. package/dist/types/context/MessageComposerControllerContext.d.ts.map +1 -0
  1173. package/dist/types/context/MessageContext.d.ts +8 -21
  1174. package/dist/types/context/MessageContext.d.ts.map +1 -1
  1175. package/dist/types/context/MessageListContext.d.ts +2 -2
  1176. package/dist/types/context/MessageListContext.d.ts.map +1 -1
  1177. package/dist/types/context/MessageTranslationViewContext.d.ts.map +1 -1
  1178. package/dist/types/context/ModalContext.d.ts +4 -0
  1179. package/dist/types/context/ModalContext.d.ts.map +1 -1
  1180. package/dist/types/context/PollContext.d.ts.map +1 -1
  1181. package/dist/types/context/TranslationContext.d.ts +21 -11
  1182. package/dist/types/context/TranslationContext.d.ts.map +1 -1
  1183. package/dist/types/context/VirtualizedMessageListContext.d.ts.map +1 -1
  1184. package/dist/types/context/WithComponents.d.ts.map +1 -1
  1185. package/dist/types/context/WorkspaceNavigationContext.d.ts +128 -0
  1186. package/dist/types/context/WorkspaceNavigationContext.d.ts.map +1 -0
  1187. package/dist/types/context/index.d.ts +6 -4
  1188. package/dist/types/context/index.d.ts.map +1 -1
  1189. package/dist/types/context/requireContext.d.ts +10 -0
  1190. package/dist/types/context/requireContext.d.ts.map +1 -0
  1191. package/dist/types/context/useChannel.d.ts +3 -0
  1192. package/dist/types/context/useChannel.d.ts.map +1 -0
  1193. package/dist/types/context/useComponentContextIcons.d.ts +4 -6
  1194. package/dist/types/context/useComponentContextIcons.d.ts.map +1 -1
  1195. package/dist/types/hooks/index.d.ts +3 -0
  1196. package/dist/types/hooks/index.d.ts.map +1 -0
  1197. package/dist/types/hooks/useIsDmChannel.d.ts +13 -0
  1198. package/dist/types/hooks/useIsDmChannel.d.ts.map +1 -0
  1199. package/dist/types/hooks/useMessagePaginator.d.ts +6 -0
  1200. package/dist/types/hooks/useMessagePaginator.d.ts.map +1 -0
  1201. package/dist/types/i18n/Streami18n.d.ts +48 -848
  1202. package/dist/types/i18n/Streami18n.d.ts.map +1 -1
  1203. package/dist/types/i18n/TranslationBuilder/index.d.ts +6 -1
  1204. package/dist/types/i18n/TranslationBuilder/index.d.ts.map +1 -1
  1205. package/dist/types/i18n/TranslationBuilder/notifications/NotificationTranslationTopic.d.ts.map +1 -1
  1206. package/dist/types/i18n/TranslationBuilder/notifications/translators.d.ts.map +1 -1
  1207. package/dist/types/i18n/TranslationBuilder/notifications/translatorsByNotificationType.d.ts +3 -1
  1208. package/dist/types/i18n/TranslationBuilder/notifications/translatorsByNotificationType.d.ts.map +1 -1
  1209. package/dist/types/i18n/index.d.ts +2 -2
  1210. package/dist/types/i18n/index.d.ts.map +1 -1
  1211. package/dist/types/i18n/keys.d.ts +583 -0
  1212. package/dist/types/i18n/keys.d.ts.map +1 -0
  1213. package/dist/types/i18n/runtimeDefaults.d.ts +37 -0
  1214. package/dist/types/i18n/runtimeDefaults.d.ts.map +1 -0
  1215. package/dist/types/i18n/types.d.ts +34 -104
  1216. package/dist/types/i18n/types.d.ts.map +1 -1
  1217. package/dist/types/i18n/useStreami18n.d.ts +19 -0
  1218. package/dist/types/i18n/useStreami18n.d.ts.map +1 -0
  1219. package/dist/types/i18n/utils.d.ts +18 -14
  1220. package/dist/types/i18n/utils.d.ts.map +1 -1
  1221. package/dist/types/plugins/ChannelDetail/AvatarWithChannelDetail.d.ts.map +1 -1
  1222. package/dist/types/plugins/ChannelDetail/ChannelDetail.d.ts.map +1 -1
  1223. package/dist/types/plugins/ChannelDetail/ChannelDetailEmptyList.d.ts.map +1 -1
  1224. package/dist/types/plugins/ChannelDetail/ChannelDetailSearchInput.d.ts.map +1 -1
  1225. package/dist/types/plugins/ChannelDetail/SectionNavigator/SectionNavigatorHeader.d.ts.map +1 -1
  1226. package/dist/types/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesEmptyList.d.ts.map +1 -1
  1227. package/dist/types/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.d.ts.map +1 -1
  1228. package/dist/types/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.utils.d.ts.map +1 -1
  1229. package/dist/types/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementActions.defaults.d.ts.map +1 -1
  1230. package/dist/types/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementView.d.ts.map +1 -1
  1231. package/dist/types/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaEmptyList.d.ts.map +1 -1
  1232. package/dist/types/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.d.ts.map +1 -1
  1233. package/dist/types/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.utils.d.ts.map +1 -1
  1234. package/dist/types/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberActions.defaults.d.ts.map +1 -1
  1235. package/dist/types/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberDetail.d.ts.map +1 -1
  1236. package/dist/types/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersAddView.d.ts.map +1 -1
  1237. package/dist/types/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersBrowseView.d.ts.map +1 -1
  1238. package/dist/types/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersHeaderActions.defaults.d.ts.map +1 -1
  1239. package/dist/types/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.d.ts.map +1 -1
  1240. package/dist/types/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.utils.d.ts.map +1 -1
  1241. package/dist/types/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesEmptyList.d.ts.map +1 -1
  1242. package/dist/types/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesView.d.ts.map +1 -1
  1243. package/dist/types/plugins/ChannelDetail/Views/PinnedMessagesView/usePinnedMessagesCount.d.ts +5 -1
  1244. package/dist/types/plugins/ChannelDetail/Views/PinnedMessagesView/usePinnedMessagesCount.d.ts.map +1 -1
  1245. package/dist/types/plugins/Emojis/EmojiPicker.d.ts +0 -4
  1246. package/dist/types/plugins/Emojis/EmojiPicker.d.ts.map +1 -1
  1247. package/dist/types/plugins/SlotGeometry/SlotGeometry.d.ts +72 -0
  1248. package/dist/types/plugins/SlotGeometry/SlotGeometry.d.ts.map +1 -0
  1249. package/dist/types/plugins/SlotGeometry/index.d.ts +3 -0
  1250. package/dist/types/plugins/SlotGeometry/index.d.ts.map +1 -0
  1251. package/dist/types/plugins/SlotLayout/ChannelSlot.d.ts +24 -0
  1252. package/dist/types/plugins/SlotLayout/ChannelSlot.d.ts.map +1 -0
  1253. package/dist/types/plugins/SlotLayout/ChatView.a11y.utility.d.ts.map +1 -0
  1254. package/dist/types/plugins/SlotLayout/ChatView.d.ts +113 -0
  1255. package/dist/types/plugins/SlotLayout/ChatView.d.ts.map +1 -0
  1256. package/dist/types/plugins/SlotLayout/ChatViewNavigationContext.d.ts +111 -0
  1257. package/dist/types/plugins/SlotLayout/ChatViewNavigationContext.d.ts.map +1 -0
  1258. package/dist/types/plugins/SlotLayout/ThreadListSlot.d.ts +8 -0
  1259. package/dist/types/plugins/SlotLayout/ThreadListSlot.d.ts.map +1 -0
  1260. package/dist/types/plugins/SlotLayout/ThreadSlot.d.ts +10 -0
  1261. package/dist/types/plugins/SlotLayout/ThreadSlot.d.ts.map +1 -0
  1262. package/dist/types/plugins/SlotLayout/hooks/index.d.ts +3 -0
  1263. package/dist/types/plugins/SlotLayout/hooks/index.d.ts.map +1 -0
  1264. package/dist/types/plugins/SlotLayout/hooks/useLayoutViewState.d.ts +5 -0
  1265. package/dist/types/plugins/SlotLayout/hooks/useLayoutViewState.d.ts.map +1 -0
  1266. package/dist/types/plugins/SlotLayout/hooks/useSlotEntity.d.ts +162 -0
  1267. package/dist/types/plugins/SlotLayout/hooks/useSlotEntity.d.ts.map +1 -0
  1268. package/dist/types/plugins/SlotLayout/index.d.ts +12 -0
  1269. package/dist/types/plugins/SlotLayout/index.d.ts.map +1 -0
  1270. package/dist/types/plugins/SlotLayout/layout/Slot.d.ts +8 -0
  1271. package/dist/types/plugins/SlotLayout/layout/Slot.d.ts.map +1 -0
  1272. package/dist/types/plugins/SlotLayout/layout/WorkspaceLayout.d.ts +11 -0
  1273. package/dist/types/plugins/SlotLayout/layout/WorkspaceLayout.d.ts.map +1 -0
  1274. package/dist/types/plugins/SlotLayout/layoutController/LayoutController.d.ts +25 -0
  1275. package/dist/types/plugins/SlotLayout/layoutController/LayoutController.d.ts.map +1 -0
  1276. package/dist/types/plugins/SlotLayout/layoutController/layoutControllerTypes.d.ts +121 -0
  1277. package/dist/types/plugins/SlotLayout/layoutController/layoutControllerTypes.d.ts.map +1 -0
  1278. package/dist/types/plugins/SlotLayout/layoutController/serialization.d.ts +6 -0
  1279. package/dist/types/plugins/SlotLayout/layoutController/serialization.d.ts.map +1 -0
  1280. package/dist/types/plugins/SlotLayout/slotBinding.d.ts +85 -0
  1281. package/dist/types/plugins/SlotLayout/slotBinding.d.ts.map +1 -0
  1282. package/dist/types/plugins/SlotLayout/slotRegistry.d.ts +60 -0
  1283. package/dist/types/plugins/SlotLayout/slotRegistry.d.ts.map +1 -0
  1284. package/dist/types/plugins/SlotLayout/workspaceNavigationAdapter.d.ts +26 -0
  1285. package/dist/types/plugins/SlotLayout/workspaceNavigationAdapter.d.ts.map +1 -0
  1286. package/dist/types/store/hooks/useStateStore.d.ts +1 -1
  1287. package/dist/types/store/hooks/useStateStore.d.ts.map +1 -1
  1288. package/dist/types/types/index.d.ts +0 -1
  1289. package/dist/types/types/index.d.ts.map +1 -1
  1290. package/dist/types/types/types.d.ts +0 -10
  1291. package/dist/types/types/types.d.ts.map +1 -1
  1292. package/dist/types/utils/getChannel.d.ts +2 -2
  1293. package/dist/types/utils/getChannel.d.ts.map +1 -1
  1294. package/dist/types/utils/useStableCallback.d.ts +1 -1
  1295. package/package.json +34 -16
  1296. package/dist/cjs/NotificationList.4ce251ea.js +0 -9552
  1297. package/dist/cjs/NotificationList.4ce251ea.js.map +0 -1
  1298. package/dist/cjs/useChannelHeaderOnlineStatus.64c443f5.js +0 -961
  1299. package/dist/cjs/useChannelHeaderOnlineStatus.64c443f5.js.map +0 -1
  1300. package/dist/cjs/useInertWhenHidden.1a2a6a2b.js +0 -6573
  1301. package/dist/cjs/useInertWhenHidden.1a2a6a2b.js.map +0 -1
  1302. package/dist/es/components/Channel/channelState.mjs +0 -195
  1303. package/dist/es/components/Channel/channelState.mjs.map +0 -1
  1304. package/dist/es/components/Channel/hooks/useCreateChannelStateContext.mjs +0 -86
  1305. package/dist/es/components/Channel/hooks/useCreateChannelStateContext.mjs.map +0 -1
  1306. package/dist/es/components/Channel/hooks/useCreateTypingContext.mjs +0 -10
  1307. package/dist/es/components/Channel/hooks/useCreateTypingContext.mjs.map +0 -1
  1308. package/dist/es/components/Channel/hooks/useEditMessageHandler.mjs +0 -13
  1309. package/dist/es/components/Channel/hooks/useEditMessageHandler.mjs.map +0 -1
  1310. package/dist/es/components/Channel/hooks/useIsMounted.mjs +0 -16
  1311. package/dist/es/components/Channel/hooks/useIsMounted.mjs.map +0 -1
  1312. package/dist/es/components/Channel/hooks/useMentionsHandlers.mjs +0 -18
  1313. package/dist/es/components/Channel/hooks/useMentionsHandlers.mjs.map +0 -1
  1314. package/dist/es/components/Channel/utils.mjs +0 -156
  1315. package/dist/es/components/Channel/utils.mjs.map +0 -1
  1316. package/dist/es/components/ChannelList/ChannelListUI.mjs +0 -35
  1317. package/dist/es/components/ChannelList/ChannelListUI.mjs.map +0 -1
  1318. package/dist/es/components/ChannelList/hooks/useChannelListShape.mjs +0 -310
  1319. package/dist/es/components/ChannelList/hooks/useChannelListShape.mjs.map +0 -1
  1320. package/dist/es/components/ChannelList/hooks/useConnectionRecoveredListener.mjs +0 -19
  1321. package/dist/es/components/ChannelList/hooks/useConnectionRecoveredListener.mjs.map +0 -1
  1322. package/dist/es/components/ChannelList/hooks/usePaginatedChannels.mjs +0 -110
  1323. package/dist/es/components/ChannelList/hooks/usePaginatedChannels.mjs.map +0 -1
  1324. package/dist/es/components/ChannelList/utils.mjs +0 -86
  1325. package/dist/es/components/ChannelList/utils.mjs.map +0 -1
  1326. package/dist/es/components/Chat/hooks/useChannelsQueryState.mjs +0 -16
  1327. package/dist/es/components/Chat/hooks/useChannelsQueryState.mjs.map +0 -1
  1328. package/dist/es/components/ChatView/ChatView.a11y.utility.mjs.map +0 -1
  1329. package/dist/es/components/ChatView/ChatView.mjs +0 -224
  1330. package/dist/es/components/ChatView/ChatView.mjs.map +0 -1
  1331. package/dist/es/components/MessageComposer/hooks/useSubmitHandler.mjs +0 -98
  1332. package/dist/es/components/MessageComposer/hooks/useSubmitHandler.mjs.map +0 -1
  1333. package/dist/es/components/MessageList/hooks/useReducedMotionPreference.mjs +0 -23
  1334. package/dist/es/components/MessageList/hooks/useReducedMotionPreference.mjs.map +0 -1
  1335. package/dist/es/components/Search/hooks/useSearchFocusedMessage.mjs +0 -13
  1336. package/dist/es/components/Search/hooks/useSearchFocusedMessage.mjs.map +0 -1
  1337. package/dist/es/components/Thread/LegacyThreadContext.mjs +0 -8
  1338. package/dist/es/components/Thread/LegacyThreadContext.mjs.map +0 -1
  1339. package/dist/es/components/UtilityComponents/NullComponent.mjs +0 -6
  1340. package/dist/es/components/UtilityComponents/NullComponent.mjs.map +0 -1
  1341. package/dist/es/components/Window/Window.mjs +0 -21
  1342. package/dist/es/components/Window/Window.mjs.map +0 -1
  1343. package/dist/es/context/ChannelActionContext.mjs +0 -20
  1344. package/dist/es/context/ChannelActionContext.mjs.map +0 -1
  1345. package/dist/es/context/ChannelStateContext.mjs +0 -24
  1346. package/dist/es/context/ChannelStateContext.mjs.map +0 -1
  1347. package/dist/es/context/TypingContext.mjs +0 -20
  1348. package/dist/es/context/TypingContext.mjs.map +0 -1
  1349. package/dist/es/i18n/TranslationBuilder/TranslationBuilder.mjs +0 -86
  1350. package/dist/es/i18n/TranslationBuilder/TranslationBuilder.mjs.map +0 -1
  1351. package/dist/es/i18n/de.mjs +0 -782
  1352. package/dist/es/i18n/de.mjs.map +0 -1
  1353. package/dist/es/i18n/en.mjs +0 -779
  1354. package/dist/es/i18n/en.mjs.map +0 -1
  1355. package/dist/es/i18n/es.mjs +0 -821
  1356. package/dist/es/i18n/es.mjs.map +0 -1
  1357. package/dist/es/i18n/fr.mjs +0 -822
  1358. package/dist/es/i18n/fr.mjs.map +0 -1
  1359. package/dist/es/i18n/hi.mjs +0 -786
  1360. package/dist/es/i18n/hi.mjs.map +0 -1
  1361. package/dist/es/i18n/it.mjs +0 -821
  1362. package/dist/es/i18n/it.mjs.map +0 -1
  1363. package/dist/es/i18n/ja.mjs +0 -760
  1364. package/dist/es/i18n/ja.mjs.map +0 -1
  1365. package/dist/es/i18n/ko.mjs +0 -760
  1366. package/dist/es/i18n/ko.mjs.map +0 -1
  1367. package/dist/es/i18n/nl.mjs +0 -786
  1368. package/dist/es/i18n/nl.mjs.map +0 -1
  1369. package/dist/es/i18n/pt.mjs +0 -819
  1370. package/dist/es/i18n/pt.mjs.map +0 -1
  1371. package/dist/es/i18n/ru.mjs +0 -868
  1372. package/dist/es/i18n/ru.mjs.map +0 -1
  1373. package/dist/es/i18n/tr.mjs +0 -781
  1374. package/dist/es/i18n/tr.mjs.map +0 -1
  1375. package/dist/es/utils/getChannelConfig.mjs +0 -11
  1376. package/dist/es/utils/getChannelConfig.mjs.map +0 -1
  1377. package/dist/types/components/Channel/channelState.d.ts +0 -90
  1378. package/dist/types/components/Channel/channelState.d.ts.map +0 -1
  1379. package/dist/types/components/Channel/hooks/useCreateChannelStateContext.d.ts +0 -6
  1380. package/dist/types/components/Channel/hooks/useCreateChannelStateContext.d.ts.map +0 -1
  1381. package/dist/types/components/Channel/hooks/useCreateTypingContext.d.ts +0 -3
  1382. package/dist/types/components/Channel/hooks/useCreateTypingContext.d.ts.map +0 -1
  1383. package/dist/types/components/Channel/hooks/useEditMessageHandler.d.ts +0 -5
  1384. package/dist/types/components/Channel/hooks/useEditMessageHandler.d.ts.map +0 -1
  1385. package/dist/types/components/Channel/hooks/useMentionsHandlers.d.ts +0 -10
  1386. package/dist/types/components/Channel/hooks/useMentionsHandlers.d.ts.map +0 -1
  1387. package/dist/types/components/Channel/utils.d.ts +0 -55
  1388. package/dist/types/components/Channel/utils.d.ts.map +0 -1
  1389. package/dist/types/components/ChannelList/ChannelListUI.d.ts +0 -18
  1390. package/dist/types/components/ChannelList/ChannelListUI.d.ts.map +0 -1
  1391. package/dist/types/components/ChannelList/hooks/useChannelListShape.d.ts +0 -61
  1392. package/dist/types/components/ChannelList/hooks/useChannelListShape.d.ts.map +0 -1
  1393. package/dist/types/components/ChannelList/hooks/useConnectionRecoveredListener.d.ts +0 -2
  1394. package/dist/types/components/ChannelList/hooks/useConnectionRecoveredListener.d.ts.map +0 -1
  1395. package/dist/types/components/ChannelList/hooks/usePaginatedChannels.d.ts +0 -29
  1396. package/dist/types/components/ChannelList/hooks/usePaginatedChannels.d.ts.map +0 -1
  1397. package/dist/types/components/ChannelList/utils.d.ts +0 -46
  1398. package/dist/types/components/ChannelList/utils.d.ts.map +0 -1
  1399. package/dist/types/components/Chat/hooks/useChannelsQueryState.d.ts +0 -12
  1400. package/dist/types/components/Chat/hooks/useChannelsQueryState.d.ts.map +0 -1
  1401. package/dist/types/components/ChatView/ChatView.a11y.utility.d.ts.map +0 -1
  1402. package/dist/types/components/ChatView/ChatView.d.ts +0 -59
  1403. package/dist/types/components/ChatView/ChatView.d.ts.map +0 -1
  1404. package/dist/types/components/ChatView/index.d.ts +0 -2
  1405. package/dist/types/components/ChatView/index.d.ts.map +0 -1
  1406. package/dist/types/components/MessageComposer/hooks/useSubmitHandler.d.ts +0 -5
  1407. package/dist/types/components/MessageComposer/hooks/useSubmitHandler.d.ts.map +0 -1
  1408. package/dist/types/components/Search/hooks/useSearchFocusedMessage.d.ts +0 -2
  1409. package/dist/types/components/Search/hooks/useSearchFocusedMessage.d.ts.map +0 -1
  1410. package/dist/types/components/Thread/LegacyThreadContext.d.ts +0 -9
  1411. package/dist/types/components/Thread/LegacyThreadContext.d.ts.map +0 -1
  1412. package/dist/types/components/Window/Window.d.ts +0 -13
  1413. package/dist/types/components/Window/Window.d.ts.map +0 -1
  1414. package/dist/types/components/Window/index.d.ts +0 -2
  1415. package/dist/types/components/Window/index.d.ts.map +0 -1
  1416. package/dist/types/context/ChannelActionContext.d.ts +0 -46
  1417. package/dist/types/context/ChannelActionContext.d.ts.map +0 -1
  1418. package/dist/types/context/ChannelStateContext.d.ts +0 -51
  1419. package/dist/types/context/ChannelStateContext.d.ts.map +0 -1
  1420. package/dist/types/context/TypingContext.d.ts +0 -12
  1421. package/dist/types/context/TypingContext.d.ts.map +0 -1
  1422. package/dist/types/i18n/TranslationBuilder/TranslationBuilder.d.ts +0 -36
  1423. package/dist/types/i18n/TranslationBuilder/TranslationBuilder.d.ts.map +0 -1
  1424. package/dist/types/i18n/translations.d.ts +0 -14
  1425. package/dist/types/i18n/translations.d.ts.map +0 -1
  1426. package/dist/types/utils/getChannelConfig.d.ts +0 -8
  1427. package/dist/types/utils/getChannelConfig.d.ts.map +0 -1
  1428. /package/dist/types/{components/ChatView → plugins/SlotLayout}/ChatView.a11y.utility.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"useMessageListScrollManager.mjs","names":[],"sources":["../../../../../../src/components/MessageList/hooks/MessageList/useMessageListScrollManager.ts"],"sourcesContent":["import { useLayoutEffect, useRef } from 'react';\n\nimport { useChatContext } from '../../../../context/ChatContext';\nimport type { LocalMessage } from 'stream-chat';\n\nexport type ContainerMeasures = {\n offsetHeight: number;\n scrollHeight: number;\n scrollTop: number;\n};\n\nexport type UseMessageListScrollManagerParams = {\n captureAnchor: () => { id: string; offsetTop: number } | null;\n disableScrollManagement?: boolean;\n justReachedLatestMessageSet?: boolean;\n loadMoreScrollThreshold: number;\n loadingMore?: boolean;\n messages: LocalMessage[];\n onScrollBy: (scrollBy: number) => void;\n onScrollToTop: () => void;\n restoreAnchor: (anchor: { id: string; offsetTop: number }) => void;\n scrollContainerMeasures: () => ContainerMeasures;\n scrolledUpThreshold: number;\n scrollToBottom: () => void;\n showNewMessages: () => void;\n};\n\n// Tracks how the current older-page pagination cycle should restore the viewport\n// once messages are prepended. The mode is chosen when loading starts and cleared\n// after the prepend has been handled.\n//\n// Modes:\n// - `idle`: there is no active older-page restoration strategy\n// - `stick-to-top`: pagination started from the absolute top, so keep the newly\n// loaded page pinned to the top of the container\n// - `preserve-anchor`: pagination started near the top but not at the absolute\n// top, so restore the captured anchor message to its previous viewport offset\ntype OlderPaginationState =\n | { anchor: null; mode: 'idle' }\n | { anchor: null; mode: 'stick-to-top' }\n | { anchor: { id: string; offsetTop: number }; mode: 'preserve-anchor' };\n\n// An \"anchor\" is the currently visible message row we want to keep visually pinned\n// to the same spot in the viewport while older messages are inserted above it.\n// It stores:\n// - `id`: which rendered message row should stay stable\n// - `offsetTop`: how far that row sits from the top edge of the scroll container\n//\n// After a prepend, the DOM shifts downward. Restoring the anchor means finding the\n// same message row again and correcting scrollTop until it returns to that offset.\n\n// When all previous messages appear at the start of the new array, the growth\n// happened at the bottom of the list.\nconst messageIdsMatchAsPrefix = (\n prevMessages: LocalMessage[],\n newMessages: LocalMessage[],\n) => prevMessages.every((message, index) => message.id === newMessages[index]?.id);\n\n// When all previous messages appear at the end of the new array, the growth\n// happened at the top of the list.\nconst messageIdsMatchAsSuffix = (\n prevMessages: LocalMessage[],\n newMessages: LocalMessage[],\n) =>\n prevMessages.every(\n (message, index) =>\n message.id === newMessages[newMessages.length - prevMessages.length + index]?.id,\n );\n\n/**\n * Coordinates scroll-position preservation when the rendered message array changes.\n *\n * The hook distinguishes three broad cases:\n * 1. Older-page pagination prepends messages at the top of the list.\n * This path either sticks to the top of the new page or restores a captured\n * message anchor, depending on where the user was when pagination started.\n * 2. Newer messages append to the bottom of the list.\n * This path preserves normal chat behavior by auto-scrolling only when the\n * user was already near the bottom or the appended message is the user's own.\n * 3. Disjunct/overlapping page switches.\n * These intentionally bypass prepend heuristics because the old and new arrays\n * are not comparable as a single contiguous list.\n */\nexport function useMessageListScrollManager(params: UseMessageListScrollManagerParams) {\n const {\n captureAnchor,\n disableScrollManagement = false,\n justReachedLatestMessageSet = false,\n loadingMore = false,\n loadMoreScrollThreshold,\n onScrollBy,\n onScrollToTop,\n restoreAnchor,\n scrollContainerMeasures,\n scrolledUpThreshold,\n scrollToBottom,\n showNewMessages,\n } = params;\n\n const { client } = useChatContext('useMessageListScrollManager');\n\n const measures = useRef<ContainerMeasures>({\n offsetHeight: 0,\n scrollHeight: 0,\n scrollTop: 0,\n });\n const messages = useRef<LocalMessage[]>(undefined);\n const olderPaginationState = useRef<OlderPaginationState>({\n anchor: null,\n mode: 'idle',\n });\n const previousLoadingMoreRef = useRef(loadingMore);\n const scrollTop = useRef(0);\n\n useLayoutEffect(() => {\n if (disableScrollManagement) {\n // Even while management is disabled we still refresh the cached list shape,\n // so the next enabled render compares against the most recent DOM state.\n messages.current = params.messages;\n measures.current = scrollContainerMeasures();\n previousLoadingMoreRef.current = loadingMore;\n return;\n }\n\n const prevMeasures = measures.current;\n const prevMessages = messages.current;\n const newMessages = params.messages;\n const lastNewMessage = newMessages[newMessages.length - 1] || {};\n const lastPrevMessage = prevMessages?.[prevMessages.length - 1];\n const newMeasures = scrollContainerMeasures();\n const startedLoadingOlder = loadingMore && !previousLoadingMoreRef.current;\n const finishedLoadingOlder = !loadingMore && previousLoadingMoreRef.current;\n\n if (startedLoadingOlder) {\n // Read the live DOM scroll position instead of the cached ref so we get\n // the correct value even when scrollToBottom() has been called but the\n // async scroll event hasn't updated the ref yet (common on initial mount).\n const liveMeasures = scrollContainerMeasures();\n const hasOverflow = liveMeasures.scrollHeight > liveMeasures.offsetHeight;\n const liveScrollTop = liveMeasures.scrollTop;\n\n // Older-page pagination uses one of three modes:\n // - `stick-to-top`: user hit the absolute top and wants to keep reading upward\n // - `preserve-anchor`: user was only near the top, so keep the same message in view\n // - `idle`: no restoration needed for this load cycle\n //\n // When the container doesn't overflow yet (e.g. content hasn't reached its\n // final height due to font loading) the scroll position is meaningless, so\n // default to idle to avoid a false stick-to-top that would jump the list.\n if (!hasOverflow) {\n olderPaginationState.current = {\n anchor: null,\n mode: 'idle',\n };\n } else if (liveScrollTop <= 1) {\n olderPaginationState.current = {\n anchor: null,\n mode: 'stick-to-top',\n };\n } else if (liveScrollTop < loadMoreScrollThreshold) {\n const capturedAnchor = captureAnchor();\n if (capturedAnchor) {\n olderPaginationState.current = {\n anchor: capturedAnchor,\n mode: 'preserve-anchor',\n };\n } else {\n olderPaginationState.current = {\n anchor: null,\n mode: 'idle',\n };\n }\n } else {\n olderPaginationState.current = {\n anchor: null,\n mode: 'idle',\n };\n }\n }\n\n // Evaluate bottom proximity from the previous render, before any new content\n // changes the list height and invalidates the prior bottom distance.\n const wasAtBottom =\n prevMeasures.scrollHeight - prevMeasures.offsetHeight - scrollTop.current <\n scrolledUpThreshold;\n\n if (typeof prevMessages !== 'undefined') {\n if (prevMessages.length < newMessages.length) {\n const messagesAddedToTop = messageIdsMatchAsSuffix(prevMessages, newMessages);\n const messagesAddedToBottom = messageIdsMatchAsPrefix(prevMessages, newMessages);\n\n // A clean prepend means older messages were inserted ahead of the current\n // viewport. Restore the viewport according to the mode chosen when loading\n // started, then clear the mode for the next pagination cycle.\n if (messagesAddedToTop) {\n const preservedAnchor =\n olderPaginationState.current.mode === 'preserve-anchor' &&\n olderPaginationState.current.anchor &&\n (finishedLoadingOlder || loadingMore)\n ? olderPaginationState.current.anchor\n : null;\n\n // When pagination was triggered from absolute top, keep the newly\n // loaded page pinned to top instead of restoring the old viewport.\n if (olderPaginationState.current.mode === 'stick-to-top') {\n onScrollToTop();\n } else if (preservedAnchor) {\n restoreAnchor(preservedAnchor);\n } else if (scrollTop.current < loadMoreScrollThreshold) {\n // Fallback for prepends when there is no stable DOM anchor to restore.\n // This is less accurate than anchor restoration, but still avoids a full\n // jump by compensating for the inserted page height.\n const listHeightDelta = newMeasures.scrollHeight - prevMeasures.scrollHeight;\n onScrollBy(listHeightDelta);\n }\n\n olderPaginationState.current = {\n anchor: null,\n mode: 'idle',\n };\n }\n // A clean append means the list grew downward. Preserve the usual chat\n // semantics: auto-scroll only for self-sent messages or when the user was\n // already close enough to bottom.\n else if (messagesAddedToBottom) {\n if (justReachedLatestMessageSet) {\n // Merging into the latest page is handled by dedicated logic higher up.\n // Returning here avoids undoing that behavior with a normal append scroll.\n messages.current = newMessages;\n measures.current = newMeasures;\n previousLoadingMoreRef.current = loadingMore;\n return;\n }\n\n const lastMessageIsFromCurrentUser = lastNewMessage.user?.id === client.userID;\n\n if (lastMessageIsFromCurrentUser || wasAtBottom) {\n scrollToBottom();\n } else {\n showNewMessages();\n }\n } else {\n // If the new page is neither a pure prepend nor a pure append, treat it as\n // a disjunct/overlapping page switch and avoid applying prepend heuristics.\n olderPaginationState.current = {\n anchor: null,\n mode: 'idle',\n };\n }\n }\n // message list length didn't change, but check if last message had reaction/reply update\n else {\n const hasNewReactions =\n lastPrevMessage?.latest_reactions?.length !==\n lastNewMessage.latest_reactions?.length;\n const hasNewReplies = lastPrevMessage?.reply_count !== lastNewMessage.reply_count;\n\n if ((hasNewReactions || hasNewReplies) && wasAtBottom) {\n scrollToBottom();\n }\n\n if (finishedLoadingOlder) {\n // Clear any older-page mode when the request ends without increasing the\n // rendered list size, so the next pagination cycle starts from a clean slate.\n olderPaginationState.current = {\n anchor: null,\n mode: 'idle',\n };\n }\n }\n }\n\n messages.current = newMessages;\n measures.current = newMeasures;\n previousLoadingMoreRef.current = loadingMore;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n captureAnchor,\n disableScrollManagement,\n justReachedLatestMessageSet,\n loadingMore,\n measures,\n messages,\n params.messages,\n restoreAnchor,\n scrollContainerMeasures,\n ]);\n\n return (\n scrollTopValue: number,\n getLatestAnchor: (() => { id: string; offsetTop: number } | null) | null = null,\n ) => {\n scrollTop.current = scrollTopValue;\n\n if (\n loadingMore &&\n getLatestAnchor &&\n olderPaginationState.current.mode === 'preserve-anchor'\n ) {\n // Keep the anchor fresh while the request is in flight so restoration matches\n // the latest viewport position if the user keeps scrolling before data arrives.\n // The getter keeps normal scroll events cheap by avoiding DOM anchor capture\n // unless anchor preservation is actually active.\n const latestAnchor = getLatestAnchor();\n if (!latestAnchor) return;\n\n olderPaginationState.current = {\n anchor: latestAnchor,\n mode: 'preserve-anchor',\n };\n }\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useMessageListScrollManager.mjs","names":[],"sources":["../../../../../../src/components/MessageList/hooks/MessageList/useMessageListScrollManager.ts"],"sourcesContent":["import { useLayoutEffect, useRef } from 'react';\n\nimport { useChatContext } from '../../../../context/ChatContext';\nimport type { LocalMessage } from 'stream-chat';\n\nexport type ContainerMeasures = {\n offsetHeight: number;\n scrollHeight: number;\n scrollTop: number;\n};\n\nexport type UseMessageListScrollManagerParams = {\n captureAnchor: () => { id: string; offsetTop: number } | null;\n disableScrollManagement?: boolean;\n justReachedLatestMessageSet?: boolean;\n loadMoreScrollThreshold: number;\n loadingMore?: boolean;\n messages: LocalMessage[];\n onScrollBy: (scrollBy: number) => void;\n onScrollToTop: () => void;\n restoreAnchor: (anchor: { id: string; offsetTop: number }) => void;\n scrollContainerMeasures: () => ContainerMeasures;\n scrolledUpThreshold: number;\n scrollToBottom: () => void;\n showNewMessages: () => void;\n suppressAutoscroll?: boolean;\n};\n\n// Tracks how the current older-page pagination cycle should restore the viewport\n// once messages are prepended. The mode is chosen when loading starts and cleared\n// after the prepend has been handled.\n//\n// Modes:\n// - `idle`: there is no active older-page restoration strategy\n// - `stick-to-top`: pagination started from the absolute top, so keep the newly\n// loaded page pinned to the top of the container\n// - `preserve-anchor`: pagination started near the top but not at the absolute\n// top, so restore the captured anchor message to its previous viewport offset\ntype OlderPaginationState =\n | { anchor: null; mode: 'idle' }\n | { anchor: null; mode: 'stick-to-top' }\n | { anchor: { id: string; offsetTop: number }; mode: 'preserve-anchor' };\n\n// An \"anchor\" is the currently visible message row we want to keep visually pinned\n// to the same spot in the viewport while older messages are inserted above it.\n// It stores:\n// - `id`: which rendered message row should stay stable\n// - `offsetTop`: how far that row sits from the top edge of the scroll container\n//\n// After a prepend, the DOM shifts downward. Restoring the anchor means finding the\n// same message row again and correcting scrollTop until it returns to that offset.\n\n// When all previous messages appear at the start of the new array, the growth\n// happened at the bottom of the list.\nconst messageIdsMatchAsPrefix = (\n prevMessages: LocalMessage[],\n newMessages: LocalMessage[],\n) => prevMessages.every((message, index) => message.id === newMessages[index]?.id);\n\n// When all previous messages appear at the end of the new array, the growth\n// happened at the top of the list.\nconst messageIdsMatchAsSuffix = (\n prevMessages: LocalMessage[],\n newMessages: LocalMessage[],\n) =>\n prevMessages.every(\n (message, index) =>\n message.id === newMessages[newMessages.length - prevMessages.length + index]?.id,\n );\n\n/**\n * Coordinates scroll-position preservation when the rendered message array changes.\n *\n * The hook distinguishes three broad cases:\n * 1. Older-page pagination prepends messages at the top of the list.\n * This path either sticks to the top of the new page or restores a captured\n * message anchor, depending on where the user was when pagination started.\n * 2. Newer messages append to the bottom of the list.\n * This path preserves normal chat behavior by auto-scrolling only when the\n * user was already near the bottom or the appended message is the user's own.\n * 3. Disjunct/overlapping page switches.\n * These intentionally bypass prepend heuristics because the old and new arrays\n * are not comparable as a single contiguous list.\n */\nexport function useMessageListScrollManager(params: UseMessageListScrollManagerParams) {\n const {\n captureAnchor,\n disableScrollManagement = false,\n justReachedLatestMessageSet = false,\n loadingMore = false,\n loadMoreScrollThreshold,\n onScrollBy,\n onScrollToTop,\n restoreAnchor,\n scrollContainerMeasures,\n scrolledUpThreshold,\n scrollToBottom,\n showNewMessages,\n suppressAutoscroll = false,\n } = params;\n\n const { client } = useChatContext();\n\n const measures = useRef<ContainerMeasures>({\n offsetHeight: 0,\n scrollHeight: 0,\n scrollTop: 0,\n });\n const messages = useRef<LocalMessage[]>(undefined);\n const olderPaginationState = useRef<OlderPaginationState>({\n anchor: null,\n mode: 'idle',\n });\n const previousLoadingMoreRef = useRef(loadingMore);\n const scrollTop = useRef(0);\n\n useLayoutEffect(() => {\n if (disableScrollManagement) {\n // Even while management is disabled we still refresh the cached list shape,\n // so the next enabled render compares against the most recent DOM state.\n messages.current = params.messages;\n measures.current = scrollContainerMeasures();\n previousLoadingMoreRef.current = loadingMore;\n return;\n }\n\n const prevMeasures = measures.current;\n const prevMessages = messages.current;\n const newMessages = params.messages;\n const lastNewMessage = newMessages[newMessages.length - 1] || {};\n const lastPrevMessage = prevMessages?.[prevMessages.length - 1];\n const newMeasures = scrollContainerMeasures();\n const startedLoadingOlder = loadingMore && !previousLoadingMoreRef.current;\n const finishedLoadingOlder = !loadingMore && previousLoadingMoreRef.current;\n\n if (startedLoadingOlder) {\n // Read the live DOM scroll position instead of the cached ref so we get\n // the correct value even when scrollToBottom() has been called but the\n // async scroll event hasn't updated the ref yet (common on initial mount).\n const liveMeasures = scrollContainerMeasures();\n const hasOverflow = liveMeasures.scrollHeight > liveMeasures.offsetHeight;\n const liveScrollTop = liveMeasures.scrollTop;\n\n // Older-page pagination uses one of three modes:\n // - `stick-to-top`: user hit the absolute top and wants to keep reading upward\n // - `preserve-anchor`: user was only near the top, so keep the same message in view\n // - `idle`: no restoration needed for this load cycle\n //\n // When the container doesn't overflow yet (e.g. content hasn't reached its\n // final height due to font loading) the scroll position is meaningless, so\n // default to idle to avoid a false stick-to-top that would jump the list.\n if (!hasOverflow) {\n olderPaginationState.current = {\n anchor: null,\n mode: 'idle',\n };\n } else if (liveScrollTop <= 1) {\n olderPaginationState.current = {\n anchor: null,\n mode: 'stick-to-top',\n };\n } else if (liveScrollTop < loadMoreScrollThreshold) {\n const capturedAnchor = captureAnchor();\n if (capturedAnchor) {\n olderPaginationState.current = {\n anchor: capturedAnchor,\n mode: 'preserve-anchor',\n };\n } else {\n olderPaginationState.current = {\n anchor: null,\n mode: 'idle',\n };\n }\n } else {\n olderPaginationState.current = {\n anchor: null,\n mode: 'idle',\n };\n }\n }\n\n // Evaluate bottom proximity from the previous render, before any new content\n // changes the list height and invalidates the prior bottom distance.\n const wasAtBottom =\n prevMeasures.scrollHeight - prevMeasures.offsetHeight - scrollTop.current <\n scrolledUpThreshold;\n\n if (typeof prevMessages !== 'undefined') {\n if (prevMessages.length < newMessages.length) {\n const messagesAddedToTop = messageIdsMatchAsSuffix(prevMessages, newMessages);\n const messagesAddedToBottom = messageIdsMatchAsPrefix(prevMessages, newMessages);\n\n // A clean prepend means older messages were inserted ahead of the current\n // viewport. Restore the viewport according to the mode chosen when loading\n // started, then clear the mode for the next pagination cycle.\n if (messagesAddedToTop) {\n const preservedAnchor =\n olderPaginationState.current.mode === 'preserve-anchor' &&\n olderPaginationState.current.anchor &&\n (finishedLoadingOlder || loadingMore)\n ? olderPaginationState.current.anchor\n : null;\n\n // When pagination was triggered from absolute top, keep the newly\n // loaded page pinned to top instead of restoring the old viewport.\n if (olderPaginationState.current.mode === 'stick-to-top') {\n onScrollToTop();\n } else if (preservedAnchor) {\n restoreAnchor(preservedAnchor);\n } else if (scrollTop.current < loadMoreScrollThreshold) {\n // Fallback for prepends when there is no stable DOM anchor to restore.\n // This is less accurate than anchor restoration, but still avoids a full\n // jump by compensating for the inserted page height.\n const listHeightDelta = newMeasures.scrollHeight - prevMeasures.scrollHeight;\n onScrollBy(listHeightDelta);\n }\n\n olderPaginationState.current = {\n anchor: null,\n mode: 'idle',\n };\n }\n // A clean append means the list grew downward. Preserve the usual chat\n // semantics: auto-scroll only for self-sent messages or when the user was\n // already close enough to bottom.\n else if (messagesAddedToBottom) {\n if (justReachedLatestMessageSet) {\n // Merging into the latest page is handled by dedicated logic higher up.\n // Returning here avoids undoing that behavior with a normal append scroll.\n messages.current = newMessages;\n measures.current = newMeasures;\n previousLoadingMoreRef.current = loadingMore;\n return;\n }\n\n const lastMessageIsFromCurrentUser = lastNewMessage.user?.id === client.userID;\n\n if (!suppressAutoscroll && (lastMessageIsFromCurrentUser || wasAtBottom)) {\n scrollToBottom();\n } else {\n showNewMessages();\n }\n } else {\n // If the new page is neither a pure prepend nor a pure append, treat it as\n // a disjunct/overlapping page switch and avoid applying prepend heuristics.\n olderPaginationState.current = {\n anchor: null,\n mode: 'idle',\n };\n }\n }\n // message list length didn't change, but check if last message had reaction/reply update\n else {\n const hasNewReactions =\n lastPrevMessage?.latest_reactions?.length !==\n lastNewMessage.latest_reactions?.length;\n const hasNewReplies = lastPrevMessage?.reply_count !== lastNewMessage.reply_count;\n\n if ((hasNewReactions || hasNewReplies) && wasAtBottom) {\n scrollToBottom();\n }\n\n if (finishedLoadingOlder) {\n // Clear any older-page mode when the request ends without increasing the\n // rendered list size, so the next pagination cycle starts from a clean slate.\n olderPaginationState.current = {\n anchor: null,\n mode: 'idle',\n };\n }\n }\n }\n\n messages.current = newMessages;\n measures.current = newMeasures;\n previousLoadingMoreRef.current = loadingMore;\n // MERGE-RECONCILE: deps are the UNION of master's anchor-based scroll params and\n // PR #2909's suppressAutoscroll (exhaustive-deps is disabled, so extra deps are safe).\n // The scroll logic here (master) and useScrollLocationLogic (PR base) diverged;\n // verify the two scroll paths cooperate rather than double-manage scrolling.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n captureAnchor,\n disableScrollManagement,\n justReachedLatestMessageSet,\n loadingMore,\n measures,\n messages,\n params.messages,\n restoreAnchor,\n scrollContainerMeasures,\n suppressAutoscroll,\n ]);\n\n return (\n scrollTopValue: number,\n getLatestAnchor: (() => { id: string; offsetTop: number } | null) | null = null,\n ) => {\n scrollTop.current = scrollTopValue;\n\n if (\n loadingMore &&\n getLatestAnchor &&\n olderPaginationState.current.mode === 'preserve-anchor'\n ) {\n // Keep the anchor fresh while the request is in flight so restoration matches\n // the latest viewport position if the user keeps scrolling before data arrives.\n // The getter keeps normal scroll events cheap by avoiding DOM anchor capture\n // unless anchor preservation is actually active.\n const latestAnchor = getLatestAnchor();\n if (!latestAnchor) return;\n\n olderPaginationState.current = {\n anchor: latestAnchor,\n mode: 'preserve-anchor',\n };\n }\n };\n}\n"],"mappings":"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"}
@@ -1,231 +1,61 @@
1
1
  import { useMessageListScrollManager } from "./useMessageListScrollManager.mjs";
2
2
  import { useCallback, useLayoutEffect, useRef, useState } from "react";
3
3
  //#region src/components/MessageList/hooks/MessageList/useScrollLocationLogic.tsx
4
- /**
5
- * Centralized scroll-position logic for MessageList.
6
- *
7
- * Responsibilities:
8
- * - Keep viewport stable during prepend/append pagination updates.
9
- * - Track whether the list is near bottom and expose that state to UI.
10
- * - Auto-scroll to bottom when appropriate while respecting suppression flags.
11
- * - Perform a short hydration settle pass so freshly loaded lists land at bottom.
12
- */
13
4
  var useScrollLocationLogic = (params) => {
14
- const { disableAutoScrollToBottom = false, disableScrollManagement = false, hasMoreNewer, listElement, loadingMore = false, loadMoreScrollThreshold, messages = [], scrolledUpThreshold = 200, suppressAutoscroll } = params;
5
+ const { hasMoreNewer, listElement, loadMoreScrollThreshold, messages = [], scrolledUpThreshold = 200, suppressAutoscroll = false } = params;
15
6
  const [hasNewMessages, setHasNewMessages] = useState(false);
16
7
  const [wrapperRect, setWrapperRect] = useState();
17
- const previousHasMoreNewerRef = useRef(hasMoreNewer);
18
- const justReachedLatestMessageSet = previousHasMoreNewerRef.current && !hasMoreNewer;
19
- const skipNextAutoScrollRef = useRef(false);
20
- const isRestoringOlderAnchorRef = useRef(false);
21
8
  const [isMessageListScrolledToBottom, setIsMessageListScrolledToBottom] = useState(true);
22
9
  const closeToBottom = useRef(false);
23
10
  const closeToTop = useRef(false);
24
- const previousScrollTopRef = useRef(0);
25
- const previousMessagesLengthRef = useRef(messages.length);
26
- const previousDisableAutoScrollToBottomRef = useRef(disableAutoScrollToBottom);
27
- const previousDisableAutoScrollSettleRef = useRef(disableAutoScrollToBottom);
28
- const anchorRestoreCleanupRef = useRef(null);
29
- const captureAnchor = useCallback(() => {
30
- if (!listElement) return null;
31
- const listRect = listElement.getBoundingClientRect();
32
- const listTop = listRect.top;
33
- const listBottom = listRect.bottom;
34
- const listCenter = listTop + listRect.height / 2;
35
- const preferTopEdgeAnchor = loadingMore || listElement.scrollTop < loadMoreScrollThreshold;
36
- const messageAnchors = Array.from(listElement.querySelectorAll("[data-message-id]")).map((element) => {
37
- const rect = element.getBoundingClientRect();
38
- return {
39
- center: rect.top + rect.height / 2,
40
- element,
41
- offsetTop: rect.top - listTop,
42
- rect
43
- };
44
- });
45
- const visibleMessageAnchors = messageAnchors.filter(({ rect }) => rect.bottom > listTop && rect.top < listBottom);
46
- const topEdgeAnchor = visibleMessageAnchors.reduce((closest, candidate) => {
47
- if (!closest || candidate.rect.top < closest.rect.top) return candidate;
48
- return closest;
49
- }, null);
50
- const centerAnchor = visibleMessageAnchors.find(({ rect }) => rect.top <= listCenter && rect.bottom >= listCenter) ?? visibleMessageAnchors.reduce((closest, candidate) => {
51
- if (!closest) return candidate;
52
- return Math.abs(candidate.center - listCenter) < Math.abs(closest.center - listCenter) ? candidate : closest;
53
- }, null);
54
- const anchor = (preferTopEdgeAnchor ? topEdgeAnchor : centerAnchor) ?? messageAnchors[0];
55
- if (!anchor?.element.dataset.messageId) return null;
56
- return {
57
- id: anchor.element.dataset.messageId,
58
- offsetTop: anchor.offsetTop
59
- };
60
- }, [
61
- listElement,
62
- loadMoreScrollThreshold,
63
- loadingMore
64
- ]);
65
- const restoreAnchor = useCallback((anchor) => {
66
- if (!listElement) return;
67
- anchorRestoreCleanupRef.current?.();
68
- let cancelled = false;
69
- let stableFrameCount = 0;
70
- let frameQueued = false;
71
- let resizeObserver;
72
- let settleTimeoutId;
73
- let animationFrameId;
74
- isRestoringOlderAnchorRef.current = true;
75
- const applyAnchor = () => {
76
- if (cancelled) return true;
77
- const anchorElement = listElement.querySelector(`[data-message-id='${anchor.id}']`);
78
- if (!anchorElement) return true;
79
- const listTop = listElement.getBoundingClientRect().top;
80
- const offsetDelta = anchorElement.getBoundingClientRect().top - listTop - anchor.offsetTop;
81
- if (Math.abs(offsetDelta) > 1) {
82
- listElement.scrollBy({ top: offsetDelta });
83
- return false;
84
- }
85
- return true;
86
- };
87
- const cleanup = () => {
88
- cancelled = true;
89
- frameQueued = false;
90
- isRestoringOlderAnchorRef.current = false;
91
- if (typeof animationFrameId !== "undefined") window.cancelAnimationFrame(animationFrameId);
92
- if (settleTimeoutId) clearTimeout(settleTimeoutId);
93
- resizeObserver?.disconnect();
94
- };
95
- const queueNextFrame = () => {
96
- if (cancelled || frameQueued) return;
97
- frameQueued = true;
98
- animationFrameId = window.requestAnimationFrame(() => {
99
- frameQueued = false;
100
- stableFrameCount = applyAnchor() ? stableFrameCount + 1 : 0;
101
- if (stableFrameCount >= 2) {
102
- cleanup();
103
- return;
104
- }
105
- queueNextFrame();
106
- });
107
- };
108
- stableFrameCount = applyAnchor() ? 1 : 0;
109
- queueNextFrame();
110
- if (typeof ResizeObserver !== "undefined") {
111
- resizeObserver = new ResizeObserver(() => {
112
- stableFrameCount = 0;
113
- queueNextFrame();
114
- });
115
- resizeObserver.observe(listElement);
116
- }
117
- settleTimeoutId = setTimeout(() => {
118
- cleanup();
119
- }, 1200);
120
- anchorRestoreCleanupRef.current = cleanup;
121
- }, [listElement]);
122
- useLayoutEffect(() => () => {
123
- anchorRestoreCleanupRef.current?.();
124
- }, []);
11
+ const initialDataAutoscrollDoneRef = useRef(false);
12
+ const previousHasMoreNewer = useRef(hasMoreNewer);
13
+ const justReachedLatestMessageSet = previousHasMoreNewer.current && !hasMoreNewer;
125
14
  const scrollToBottom = useCallback((options) => {
126
- if (!listElement?.scrollTo || hasMoreNewer || isRestoringOlderAnchorRef.current || justReachedLatestMessageSet || suppressAutoscroll) return;
15
+ if (!listElement?.scrollTo || hasMoreNewer || suppressAutoscroll) return;
127
16
  listElement.scrollTo({
128
17
  behavior: options?.behavior,
129
18
  top: listElement.scrollHeight
130
19
  });
131
20
  setHasNewMessages(false);
132
21
  }, [
133
- hasMoreNewer,
134
- justReachedLatestMessageSet,
135
22
  listElement,
23
+ hasMoreNewer,
136
24
  suppressAutoscroll
137
25
  ]);
138
- /**
139
- * Keeps wrapper geometry up to date and handles the "reached latest merged set"
140
- * path where existing viewport position must be preserved.
141
- */
142
26
  useLayoutEffect(() => {
143
- const disableAutoScrollJustReleased = previousDisableAutoScrollToBottomRef.current && !disableAutoScrollToBottom;
144
- previousDisableAutoScrollToBottomRef.current = disableAutoScrollToBottom;
145
- if (disableAutoScrollJustReleased) return;
146
- if (listElement) setWrapperRect(listElement.getBoundingClientRect());
147
- if (listElement && justReachedLatestMessageSet) {
148
- listElement.scrollTop = previousScrollTopRef.current;
149
- skipNextAutoScrollRef.current = true;
150
- return;
27
+ if (listElement) {
28
+ setWrapperRect(listElement.getBoundingClientRect());
29
+ if (!justReachedLatestMessageSet) scrollToBottom();
151
30
  }
152
- if (skipNextAutoScrollRef.current) {
153
- skipNextAutoScrollRef.current = false;
31
+ }, [listElement, hasMoreNewer]);
32
+ useLayoutEffect(() => {
33
+ if (messages.length === 0) {
34
+ initialDataAutoscrollDoneRef.current = false;
154
35
  return;
155
36
  }
156
- if (listElement && !disableAutoScrollToBottom && !isRestoringOlderAnchorRef.current) scrollToBottom();
157
- }, [
158
- disableAutoScrollToBottom,
159
- justReachedLatestMessageSet,
160
- listElement,
161
- hasMoreNewer
162
- ]);
163
- /**
164
- * Short post-render bottom settle. This is intentionally small (immediate + 2 retries)
165
- * to catch late layout updates without keeping the list in a prolonged lock loop.
166
- */
167
- useLayoutEffect(() => {
168
- const disableAutoScrollJustReleased = previousDisableAutoScrollSettleRef.current && !disableAutoScrollToBottom;
169
- previousDisableAutoScrollSettleRef.current = disableAutoScrollToBottom;
170
- if (disableAutoScrollJustReleased) return;
171
- if (!listElement || disableAutoScrollToBottom || hasMoreNewer || suppressAutoscroll || justReachedLatestMessageSet || isRestoringOlderAnchorRef.current) return;
172
- const initialDistanceToBottom = listElement.scrollHeight - (listElement.scrollTop + listElement.clientHeight);
173
- const messagesHydrated = previousMessagesLengthRef.current === 0 && messages.length > 0;
174
- if (initialDistanceToBottom > scrolledUpThreshold && !messagesHydrated) return;
175
- let keepPinnedToBottom = true;
176
- const maybeScrollToBottom = () => {
177
- if (keepPinnedToBottom) scrollToBottom();
178
- };
179
- maybeScrollToBottom();
180
- const settleTimeoutIds = [
181
- 80,
182
- messagesHydrated ? 260 : 420,
183
- 900,
184
- 1700
185
- ].map((delay) => setTimeout(maybeScrollToBottom, delay));
186
- const stopKeepingPinnedToBottom = () => {
187
- keepPinnedToBottom = false;
188
- };
189
- listElement.addEventListener("pointerdown", stopKeepingPinnedToBottom, { passive: true });
190
- listElement.addEventListener("touchstart", stopKeepingPinnedToBottom, { passive: true });
191
- listElement.addEventListener("wheel", stopKeepingPinnedToBottom, { passive: true });
192
- listElement.addEventListener("keydown", stopKeepingPinnedToBottom);
193
- const pinWindowTimeoutId = setTimeout(() => {
194
- stopKeepingPinnedToBottom();
195
- }, 2200);
196
- return () => {
197
- settleTimeoutIds.forEach(clearTimeout);
198
- clearTimeout(pinWindowTimeoutId);
199
- listElement.removeEventListener("pointerdown", stopKeepingPinnedToBottom);
200
- listElement.removeEventListener("touchstart", stopKeepingPinnedToBottom);
201
- listElement.removeEventListener("wheel", stopKeepingPinnedToBottom);
202
- listElement.removeEventListener("keydown", stopKeepingPinnedToBottom);
203
- };
37
+ if (listElement?.scrollTo && !initialDataAutoscrollDoneRef.current && !suppressAutoscroll) {
38
+ listElement.scrollTo({ top: listElement.scrollHeight });
39
+ setHasNewMessages(false);
40
+ initialDataAutoscrollDoneRef.current = true;
41
+ }
204
42
  }, [
205
- disableAutoScrollToBottom,
206
- hasMoreNewer,
207
- justReachedLatestMessageSet,
208
43
  listElement,
209
44
  messages.length,
210
- scrollToBottom,
211
- scrolledUpThreshold,
212
45
  suppressAutoscroll
213
46
  ]);
214
47
  const updateScrollTop = useMessageListScrollManager({
215
- captureAnchor,
216
- disableScrollManagement: disableScrollManagement || isRestoringOlderAnchorRef.current,
48
+ captureAnchor: () => null,
217
49
  justReachedLatestMessageSet,
218
- loadingMore,
219
50
  loadMoreScrollThreshold,
220
51
  messages,
221
52
  onScrollBy: (scrollBy) => {
222
53
  listElement?.scrollBy({ top: scrollBy });
223
54
  },
224
55
  onScrollToTop: () => {
225
- if (!listElement) return;
226
- listElement.scrollTop = 0;
56
+ listElement?.scrollTo({ top: 0 });
227
57
  },
228
- restoreAnchor,
58
+ restoreAnchor: () => void 0,
229
59
  scrollContainerMeasures: () => ({
230
60
  offsetHeight: listElement?.offsetHeight || 0,
231
61
  scrollHeight: listElement?.scrollHeight || 0,
@@ -233,33 +63,28 @@ var useScrollLocationLogic = (params) => {
233
63
  }),
234
64
  scrolledUpThreshold,
235
65
  scrollToBottom,
236
- showNewMessages: () => setHasNewMessages(true)
66
+ showNewMessages: () => setHasNewMessages(true),
67
+ suppressAutoscroll
237
68
  });
238
69
  useLayoutEffect(() => {
239
- previousHasMoreNewerRef.current = hasMoreNewer;
70
+ previousHasMoreNewer.current = hasMoreNewer;
240
71
  }, [hasMoreNewer]);
241
- useLayoutEffect(() => {
242
- previousMessagesLengthRef.current = messages.length;
243
- }, [messages.length]);
244
72
  return {
245
73
  hasNewMessages,
246
74
  isMessageListScrolledToBottom,
247
75
  onScroll: useCallback((event) => {
248
76
  const element = event.target;
249
77
  const scrollTop = element.scrollTop;
250
- previousScrollTopRef.current = scrollTop;
251
- updateScrollTop(scrollTop, captureAnchor);
78
+ updateScrollTop(scrollTop);
252
79
  const offsetHeight = element.offsetHeight;
253
- const distanceToBottom = element.scrollHeight - (scrollTop + offsetHeight);
254
- const bottomEnterThreshold = Math.max(Math.floor(scrolledUpThreshold * .6), 24);
80
+ const scrollHeight = element.scrollHeight;
255
81
  const prevCloseToBottom = closeToBottom.current;
256
- closeToBottom.current = prevCloseToBottom ? distanceToBottom < scrolledUpThreshold : distanceToBottom < bottomEnterThreshold;
82
+ closeToBottom.current = scrollHeight - (scrollTop + offsetHeight) < scrolledUpThreshold;
257
83
  closeToTop.current = scrollTop < scrolledUpThreshold;
258
84
  if (closeToBottom.current) setHasNewMessages(false);
259
85
  if (prevCloseToBottom && !closeToBottom.current) setIsMessageListScrolledToBottom(false);
260
86
  else if (!prevCloseToBottom && closeToBottom.current) setIsMessageListScrolledToBottom(true);
261
87
  }, [
262
- captureAnchor,
263
88
  updateScrollTop,
264
89
  closeToTop,
265
90
  closeToBottom,
@@ -1 +1 @@
1
- {"version":3,"file":"useScrollLocationLogic.mjs","names":[],"sources":["../../../../../../src/components/MessageList/hooks/MessageList/useScrollLocationLogic.tsx"],"sourcesContent":["import type React from 'react';\nimport { useCallback, useLayoutEffect, useRef, useState } from 'react';\n\nimport { useMessageListScrollManager } from './useMessageListScrollManager';\nimport type { LocalMessage } from 'stream-chat';\n\nexport type UseScrollLocationLogicParams = {\n /** Disables automatic scroll-to-bottom updates after message changes. */\n disableAutoScrollToBottom?: boolean;\n /** Disables scroll-management adjustments (anchor restore, append/prepend handling). */\n disableScrollManagement?: boolean;\n /** True when there are newer messages to load beyond the currently rendered page. */\n hasMoreNewer: boolean;\n /** Scrollable message-list container element. */\n listElement: HTMLDivElement | null;\n /** Threshold used to detect older-page pagination proximity near the top. */\n loadMoreScrollThreshold: number;\n /** Indicates whether older-page pagination is currently in progress. */\n loadingMore?: boolean;\n /** Hard-disable all autoscroll behavior. */\n suppressAutoscroll: boolean;\n /** Current rendered message set used for scroll reconciliation. */\n messages?: LocalMessage[];\n /** Distance from bottom (px) considered as \"near bottom\". */\n scrolledUpThreshold?: number;\n};\n\n/**\n * Centralized scroll-position logic for MessageList.\n *\n * Responsibilities:\n * - Keep viewport stable during prepend/append pagination updates.\n * - Track whether the list is near bottom and expose that state to UI.\n * - Auto-scroll to bottom when appropriate while respecting suppression flags.\n * - Perform a short hydration settle pass so freshly loaded lists land at bottom.\n */\nexport const useScrollLocationLogic = (params: UseScrollLocationLogicParams) => {\n const {\n disableAutoScrollToBottom = false,\n disableScrollManagement = false,\n hasMoreNewer,\n listElement,\n loadingMore = false,\n loadMoreScrollThreshold,\n messages = [],\n scrolledUpThreshold = 200,\n suppressAutoscroll,\n } = params;\n\n const [hasNewMessages, setHasNewMessages] = useState(false);\n const [wrapperRect, setWrapperRect] = useState<DOMRect>();\n const previousHasMoreNewerRef = useRef(hasMoreNewer);\n const justReachedLatestMessageSet = previousHasMoreNewerRef.current && !hasMoreNewer;\n const skipNextAutoScrollRef = useRef(false);\n const isRestoringOlderAnchorRef = useRef(false);\n\n const [isMessageListScrolledToBottom, setIsMessageListScrolledToBottom] =\n useState(true);\n const closeToBottom = useRef(false);\n const closeToTop = useRef(false);\n const previousScrollTopRef = useRef(0);\n const previousMessagesLengthRef = useRef(messages.length);\n const previousDisableAutoScrollToBottomRef = useRef(disableAutoScrollToBottom);\n const previousDisableAutoScrollSettleRef = useRef(disableAutoScrollToBottom);\n const anchorRestoreCleanupRef = useRef<(() => void) | null>(null);\n\n const captureAnchor = useCallback(() => {\n if (!listElement) return null;\n\n const listRect = listElement.getBoundingClientRect();\n const listTop = listRect.top;\n const listBottom = listRect.bottom;\n const listCenter = listTop + listRect.height / 2;\n // Older-page pagination should track the top edge, while the generic\n // “keep this viewport stable” case works better from the center.\n const preferTopEdgeAnchor =\n loadingMore || listElement.scrollTop < loadMoreScrollThreshold;\n const messageElements = Array.from(\n listElement.querySelectorAll<HTMLElement>('[data-message-id]'),\n );\n const messageAnchors = messageElements.map((element) => {\n const rect = element.getBoundingClientRect();\n return {\n center: rect.top + rect.height / 2,\n element,\n offsetTop: rect.top - listTop,\n rect,\n };\n });\n\n const visibleMessageAnchors = messageAnchors.filter(\n ({ rect }) => rect.bottom > listTop && rect.top < listBottom,\n );\n\n const topEdgeAnchor = visibleMessageAnchors.reduce<\n (typeof visibleMessageAnchors)[number] | null\n >((closest, candidate) => {\n if (!closest || candidate.rect.top < closest.rect.top) {\n return candidate;\n }\n\n return closest;\n }, null);\n\n const centerAnchor =\n visibleMessageAnchors.find(\n ({ rect }) => rect.top <= listCenter && rect.bottom >= listCenter,\n ) ??\n visibleMessageAnchors.reduce<(typeof visibleMessageAnchors)[number] | null>(\n (closest, candidate) => {\n if (!closest) return candidate;\n\n const distance = Math.abs(candidate.center - listCenter);\n const closestDistance = Math.abs(closest.center - listCenter);\n\n return distance < closestDistance ? candidate : closest;\n },\n null,\n );\n\n const anchor =\n (preferTopEdgeAnchor ? topEdgeAnchor : centerAnchor) ?? messageAnchors[0];\n\n if (!anchor?.element.dataset.messageId) return null;\n\n return {\n id: anchor.element.dataset.messageId,\n offsetTop: anchor.offsetTop,\n };\n }, [listElement, loadMoreScrollThreshold, loadingMore]);\n\n const restoreAnchor = useCallback(\n (anchor: { id: string; offsetTop: number }) => {\n if (!listElement) return;\n\n anchorRestoreCleanupRef.current?.();\n\n let cancelled = false;\n let stableFrameCount = 0;\n let frameQueued = false;\n let resizeObserver: ResizeObserver | undefined;\n // eslint-disable-next-line prefer-const\n let settleTimeoutId: ReturnType<typeof setTimeout> | undefined;\n let animationFrameId: number | undefined;\n\n isRestoringOlderAnchorRef.current = true;\n\n const applyAnchor = () => {\n if (cancelled) return true;\n\n const anchorElement = listElement.querySelector<HTMLElement>(\n `[data-message-id='${anchor.id}']`,\n );\n if (!anchorElement) return true;\n\n const listTop = listElement.getBoundingClientRect().top;\n const nextOffsetTop = anchorElement.getBoundingClientRect().top - listTop;\n const offsetDelta = nextOffsetTop - anchor.offsetTop;\n\n if (Math.abs(offsetDelta) > 1) {\n listElement.scrollBy({ top: offsetDelta });\n return false;\n }\n\n return true;\n };\n\n const cleanup = () => {\n cancelled = true;\n frameQueued = false;\n isRestoringOlderAnchorRef.current = false;\n if (typeof animationFrameId !== 'undefined') {\n window.cancelAnimationFrame(animationFrameId);\n }\n if (settleTimeoutId) {\n clearTimeout(settleTimeoutId);\n }\n resizeObserver?.disconnect();\n };\n\n // Keep correcting against the same anchor until the DOM stops shifting.\n const queueNextFrame = () => {\n if (cancelled || frameQueued) return;\n frameQueued = true;\n animationFrameId = window.requestAnimationFrame(() => {\n frameQueued = false;\n const isStable = applyAnchor();\n stableFrameCount = isStable ? stableFrameCount + 1 : 0;\n\n if (stableFrameCount >= 2) {\n cleanup();\n return;\n }\n\n queueNextFrame();\n });\n };\n\n stableFrameCount = applyAnchor() ? 1 : 0;\n queueNextFrame();\n\n // Late media/layout updates can still move the anchor after the first\n // correction, so restart the settle check when the list resizes.\n if (typeof ResizeObserver !== 'undefined') {\n resizeObserver = new ResizeObserver(() => {\n stableFrameCount = 0;\n queueNextFrame();\n });\n resizeObserver.observe(listElement);\n }\n\n settleTimeoutId = setTimeout(() => {\n cleanup();\n }, 1200);\n\n anchorRestoreCleanupRef.current = cleanup;\n },\n [listElement],\n );\n\n useLayoutEffect(\n () => () => {\n anchorRestoreCleanupRef.current?.();\n },\n [],\n );\n\n const scrollToBottom = useCallback(\n (options?: ScrollToOptions) => {\n if (\n !listElement?.scrollTo ||\n hasMoreNewer ||\n isRestoringOlderAnchorRef.current ||\n justReachedLatestMessageSet ||\n suppressAutoscroll\n ) {\n return;\n }\n\n listElement.scrollTo({\n behavior: options?.behavior,\n top: listElement.scrollHeight,\n });\n setHasNewMessages(false);\n },\n [hasMoreNewer, justReachedLatestMessageSet, listElement, suppressAutoscroll],\n );\n\n /**\n * Keeps wrapper geometry up to date and handles the \"reached latest merged set\"\n * path where existing viewport position must be preserved.\n */\n useLayoutEffect(() => {\n const disableAutoScrollJustReleased =\n previousDisableAutoScrollToBottomRef.current && !disableAutoScrollToBottom;\n previousDisableAutoScrollToBottomRef.current = disableAutoScrollToBottom;\n\n // Re-enabling auto-scroll should not immediately force a jump to bottom.\n // This avoids snap-back after temporary suppression (e.g. jump-to-message).\n if (disableAutoScrollJustReleased) {\n return;\n }\n\n if (listElement) {\n setWrapperRect(listElement.getBoundingClientRect());\n }\n\n if (listElement && justReachedLatestMessageSet) {\n listElement.scrollTop = previousScrollTopRef.current;\n skipNextAutoScrollRef.current = true;\n return;\n }\n\n if (skipNextAutoScrollRef.current) {\n skipNextAutoScrollRef.current = false;\n return;\n }\n\n if (listElement && !disableAutoScrollToBottom && !isRestoringOlderAnchorRef.current) {\n scrollToBottom();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [disableAutoScrollToBottom, justReachedLatestMessageSet, listElement, hasMoreNewer]);\n\n /**\n * Short post-render bottom settle. This is intentionally small (immediate + 2 retries)\n * to catch late layout updates without keeping the list in a prolonged lock loop.\n */\n useLayoutEffect(() => {\n const disableAutoScrollJustReleased =\n previousDisableAutoScrollSettleRef.current && !disableAutoScrollToBottom;\n previousDisableAutoScrollSettleRef.current = disableAutoScrollToBottom;\n\n // Skip one settle cycle when auto-scroll suppression is released.\n // Without this guard, a jump-to-message flow can scroll to the target and then\n // get pulled back down by the delayed \"keep pinned to bottom\" retries\n // (80/260/420/900/1700ms), which looks like a snap-back to the latest message.\n // Letting this transition frame pass preserves the jump destination.\n if (disableAutoScrollJustReleased) {\n return;\n }\n\n if (\n !listElement ||\n disableAutoScrollToBottom ||\n hasMoreNewer ||\n suppressAutoscroll ||\n justReachedLatestMessageSet ||\n isRestoringOlderAnchorRef.current\n ) {\n return;\n }\n\n const initialDistanceToBottom =\n listElement.scrollHeight - (listElement.scrollTop + listElement.clientHeight);\n const messagesHydrated =\n previousMessagesLengthRef.current === 0 && messages.length > 0;\n\n if (initialDistanceToBottom > scrolledUpThreshold && !messagesHydrated) {\n return;\n }\n\n let keepPinnedToBottom = true;\n\n const maybeScrollToBottom = () => {\n if (keepPinnedToBottom) {\n scrollToBottom();\n }\n };\n\n maybeScrollToBottom();\n const settleDelays = [80, messagesHydrated ? 260 : 420, 900, 1700];\n const settleTimeoutIds = settleDelays.map((delay) =>\n setTimeout(maybeScrollToBottom, delay),\n );\n\n const stopKeepingPinnedToBottom = () => {\n keepPinnedToBottom = false;\n };\n\n // Any direct user interaction with the scroller disables the temporary\n // initial-load pin, so manual scrolling is never force-overridden.\n listElement.addEventListener('pointerdown', stopKeepingPinnedToBottom, {\n passive: true,\n });\n listElement.addEventListener('touchstart', stopKeepingPinnedToBottom, {\n passive: true,\n });\n listElement.addEventListener('wheel', stopKeepingPinnedToBottom, {\n passive: true,\n });\n listElement.addEventListener('keydown', stopKeepingPinnedToBottom);\n\n const pinWindowTimeoutId = setTimeout(() => {\n stopKeepingPinnedToBottom();\n }, 2200);\n\n return () => {\n settleTimeoutIds.forEach(clearTimeout);\n clearTimeout(pinWindowTimeoutId);\n listElement.removeEventListener('pointerdown', stopKeepingPinnedToBottom);\n listElement.removeEventListener('touchstart', stopKeepingPinnedToBottom);\n listElement.removeEventListener('wheel', stopKeepingPinnedToBottom);\n listElement.removeEventListener('keydown', stopKeepingPinnedToBottom);\n };\n }, [\n disableAutoScrollToBottom,\n hasMoreNewer,\n justReachedLatestMessageSet,\n listElement,\n messages.length,\n scrollToBottom,\n scrolledUpThreshold,\n suppressAutoscroll,\n ]);\n\n const updateScrollTop = useMessageListScrollManager({\n captureAnchor,\n disableScrollManagement: disableScrollManagement || isRestoringOlderAnchorRef.current,\n justReachedLatestMessageSet,\n loadingMore,\n loadMoreScrollThreshold,\n messages,\n onScrollBy: (scrollBy) => {\n listElement?.scrollBy({ top: scrollBy });\n },\n onScrollToTop: () => {\n if (!listElement) return;\n listElement.scrollTop = 0;\n },\n restoreAnchor,\n\n scrollContainerMeasures: () => ({\n offsetHeight: listElement?.offsetHeight || 0,\n scrollHeight: listElement?.scrollHeight || 0,\n scrollTop: listElement?.scrollTop || 0,\n }),\n scrolledUpThreshold,\n scrollToBottom,\n showNewMessages: () => setHasNewMessages(true),\n });\n\n useLayoutEffect(() => {\n previousHasMoreNewerRef.current = hasMoreNewer;\n }, [hasMoreNewer]);\n\n useLayoutEffect(() => {\n previousMessagesLengthRef.current = messages.length;\n }, [messages.length]);\n\n /**\n * Updates cached scroll metrics and bottom/top proximity state used by\n * notifications, autoscroll decisions, and paginator behavior.\n */\n const onScroll = useCallback(\n (event: React.UIEvent<HTMLDivElement>) => {\n const element = event.target as HTMLDivElement;\n const scrollTop = element.scrollTop;\n previousScrollTopRef.current = scrollTop;\n\n updateScrollTop(scrollTop, captureAnchor);\n\n const offsetHeight = element.offsetHeight;\n const scrollHeight = element.scrollHeight;\n const distanceToBottom = scrollHeight - (scrollTop + offsetHeight);\n const bottomEnterThreshold = Math.max(Math.floor(scrolledUpThreshold * 0.6), 24);\n\n const prevCloseToBottom = closeToBottom.current;\n closeToBottom.current = prevCloseToBottom\n ? distanceToBottom < scrolledUpThreshold\n : distanceToBottom < bottomEnterThreshold;\n closeToTop.current = scrollTop < scrolledUpThreshold;\n\n if (closeToBottom.current) {\n setHasNewMessages(false);\n }\n if (prevCloseToBottom && !closeToBottom.current) {\n setIsMessageListScrolledToBottom(false);\n } else if (!prevCloseToBottom && closeToBottom.current) {\n setIsMessageListScrolledToBottom(true);\n }\n },\n [captureAnchor, updateScrollTop, closeToTop, closeToBottom, scrolledUpThreshold],\n );\n\n return {\n hasNewMessages,\n isMessageListScrolledToBottom,\n onScroll,\n scrollToBottom,\n wrapperRect,\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"useScrollLocationLogic.mjs","names":[],"sources":["../../../../../../src/components/MessageList/hooks/MessageList/useScrollLocationLogic.tsx"],"sourcesContent":["import type React from 'react';\nimport { useCallback, useLayoutEffect, useRef, useState } from 'react';\n\nimport { useMessageListScrollManager } from './useMessageListScrollManager';\nimport type { LocalMessage } from 'stream-chat';\n\nexport type UseScrollLocationLogicParams = {\n hasMoreNewer: boolean;\n listElement: HTMLElement | null;\n loadMoreScrollThreshold: number;\n suppressAutoscroll?: boolean;\n messages?: LocalMessage[];\n scrolledUpThreshold?: number;\n};\n\nexport const useScrollLocationLogic = (params: UseScrollLocationLogicParams) => {\n const {\n hasMoreNewer,\n listElement,\n loadMoreScrollThreshold,\n messages = [],\n scrolledUpThreshold = 200,\n suppressAutoscroll = false,\n } = params;\n\n const [hasNewMessages, setHasNewMessages] = useState(false);\n const [wrapperRect, setWrapperRect] = useState<DOMRect>();\n\n const [isMessageListScrolledToBottom, setIsMessageListScrolledToBottom] =\n useState(true);\n const closeToBottom = useRef(false);\n const closeToTop = useRef(false);\n const initialDataAutoscrollDoneRef = useRef(false);\n\n // `hasMoreNewer` turning false means the loaded window just reached the live head — typically\n // because the user scrolled down out of a window they had jumped to (a search result deep in\n // history) and the page bridging the gap arrived.\n //\n // The viewport must not move for that. The user is reading where they jumped to, and the merged\n // page lands *below* them; treating the merge like a mount (or like a newly received message at\n // the head) teleports them to the newest message. Both autoscroll paths below are suppressed for\n // this one render, and the ref is advanced afterwards so only the transition itself counts.\n const previousHasMoreNewer = useRef(hasMoreNewer);\n const justReachedLatestMessageSet = previousHasMoreNewer.current && !hasMoreNewer;\n\n // `behavior` is optional so callers opt into animation: the initial-mount and streaming\n // \"keep pinned to bottom\" autoscroll below call it with no argument and stay instant (which is\n // what keeps pagination position-preservation correct), while an interactive scroll-to-latest\n // passes `{ behavior }` for a smooth (or reduced-motion `auto`) scroll.\n const scrollToBottom = useCallback(\n (options?: { behavior?: ScrollBehavior }) => {\n if (!listElement?.scrollTo || hasMoreNewer || suppressAutoscroll) {\n return;\n }\n\n listElement.scrollTo({\n behavior: options?.behavior,\n top: listElement.scrollHeight,\n });\n setHasNewMessages(false);\n },\n [listElement, hasMoreNewer, suppressAutoscroll],\n );\n\n useLayoutEffect(() => {\n if (listElement) {\n setWrapperRect(listElement.getBoundingClientRect());\n // `hasMoreNewer` is a dependency so a list that mounts before its first page resolves still\n // autoscrolls once it does. That makes this run on *every* change of it, including the merge\n // into the live head, which must leave the viewport alone.\n if (!justReachedLatestMessageSet) scrollToBottom();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [listElement, hasMoreNewer]);\n\n useLayoutEffect(() => {\n if (messages.length === 0) {\n initialDataAutoscrollDoneRef.current = false;\n return;\n }\n\n if (\n listElement?.scrollTo &&\n !initialDataAutoscrollDoneRef.current &&\n !suppressAutoscroll\n ) {\n listElement.scrollTo({ top: listElement.scrollHeight });\n setHasNewMessages(false);\n initialDataAutoscrollDoneRef.current = true;\n }\n }, [listElement, messages.length, suppressAutoscroll]);\n\n const updateScrollTop = useMessageListScrollManager({\n // MERGE-RECONCILE: master's useMessageListScrollManager expects anchor-based restoration\n // params (captureAnchor/restoreAnchor/onScrollToTop) that PR #2909's useScrollLocationLogic\n // does not compute. captureAnchor returns null so the manager falls back to its\n // height-delta compensation (no precise anchor restoration). Reconcile the two scroll\n // paths if precise anchor preservation on older-page loads is required.\n captureAnchor: () => null,\n justReachedLatestMessageSet,\n loadMoreScrollThreshold,\n messages,\n onScrollBy: (scrollBy) => {\n listElement?.scrollBy({ top: scrollBy });\n },\n onScrollToTop: () => {\n listElement?.scrollTo({ top: 0 });\n },\n restoreAnchor: () => undefined,\n\n scrollContainerMeasures: () => ({\n offsetHeight: listElement?.offsetHeight || 0,\n scrollHeight: listElement?.scrollHeight || 0,\n // MERGE-RECONCILE: master's ContainerMeasures requires scrollTop (used by the\n // anchor-based useMessageListScrollManager); PR #2909's version omitted it.\n scrollTop: listElement?.scrollTop || 0,\n }),\n scrolledUpThreshold,\n scrollToBottom,\n showNewMessages: () => setHasNewMessages(true),\n suppressAutoscroll,\n });\n\n // Declared after the two autoscroll layout effects and the scroll manager's own, so all three\n // observe the transition before it is consumed.\n useLayoutEffect(() => {\n previousHasMoreNewer.current = hasMoreNewer;\n }, [hasMoreNewer]);\n\n const onScroll = useCallback(\n (event: React.UIEvent<HTMLElement>) => {\n const element = event.target as HTMLElement;\n const scrollTop = element.scrollTop;\n\n updateScrollTop(scrollTop);\n\n const offsetHeight = element.offsetHeight;\n const scrollHeight = element.scrollHeight;\n\n const prevCloseToBottom = closeToBottom.current;\n closeToBottom.current =\n scrollHeight - (scrollTop + offsetHeight) < scrolledUpThreshold;\n closeToTop.current = scrollTop < scrolledUpThreshold;\n\n if (closeToBottom.current) {\n setHasNewMessages(false);\n }\n if (prevCloseToBottom && !closeToBottom.current) {\n setIsMessageListScrolledToBottom(false);\n } else if (!prevCloseToBottom && closeToBottom.current) {\n setIsMessageListScrolledToBottom(true);\n }\n },\n [updateScrollTop, closeToTop, closeToBottom, scrolledUpThreshold],\n );\n\n return {\n hasNewMessages,\n isMessageListScrolledToBottom,\n onScroll,\n scrollToBottom,\n wrapperRect,\n };\n};\n"],"mappings":";;;AAeA,IAAa,0BAA0B,WAAyC;CAC9E,MAAM,EACJ,cACA,aACA,yBACA,WAAW,CAAC,GACZ,sBAAsB,KACtB,qBAAqB,UACnB;CAEJ,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,KAAK;CAC1D,MAAM,CAAC,aAAa,kBAAkB,SAAkB;CAExD,MAAM,CAAC,+BAA+B,oCACpC,SAAS,IAAI;CACf,MAAM,gBAAgB,OAAO,KAAK;CAClC,MAAM,aAAa,OAAO,KAAK;CAC/B,MAAM,+BAA+B,OAAO,KAAK;CAUjD,MAAM,uBAAuB,OAAO,YAAY;CAChD,MAAM,8BAA8B,qBAAqB,WAAW,CAAC;CAMrE,MAAM,iBAAiB,aACpB,YAA4C;EAC3C,IAAI,CAAC,aAAa,YAAY,gBAAgB,oBAC5C;EAGF,YAAY,SAAS;GACnB,UAAU,SAAS;GACnB,KAAK,YAAY;EACnB,CAAC;EACD,kBAAkB,KAAK;CACzB,GACA;EAAC;EAAa;EAAc;CAAkB,CAChD;CAEA,sBAAsB;EACpB,IAAI,aAAa;GACf,eAAe,YAAY,sBAAsB,CAAC;GAIlD,IAAI,CAAC,6BAA6B,eAAe;EACnD;CAEF,GAAG,CAAC,aAAa,YAAY,CAAC;CAE9B,sBAAsB;EACpB,IAAI,SAAS,WAAW,GAAG;GACzB,6BAA6B,UAAU;GACvC;EACF;EAEA,IACE,aAAa,YACb,CAAC,6BAA6B,WAC9B,CAAC,oBACD;GACA,YAAY,SAAS,EAAE,KAAK,YAAY,aAAa,CAAC;GACtD,kBAAkB,KAAK;GACvB,6BAA6B,UAAU;EACzC;CACF,GAAG;EAAC;EAAa,SAAS;EAAQ;CAAkB,CAAC;CAErD,MAAM,kBAAkB,4BAA4B;EAMlD,qBAAqB;EACrB;EACA;EACA;EACA,aAAa,aAAa;GACxB,aAAa,SAAS,EAAE,KAAK,SAAS,CAAC;EACzC;EACA,qBAAqB;GACnB,aAAa,SAAS,EAAE,KAAK,EAAE,CAAC;EAClC;EACA,qBAAqB,KAAA;EAErB,gCAAgC;GAC9B,cAAc,aAAa,gBAAgB;GAC3C,cAAc,aAAa,gBAAgB;GAG3C,WAAW,aAAa,aAAa;EACvC;EACA;EACA;EACA,uBAAuB,kBAAkB,IAAI;EAC7C;CACF,CAAC;CAID,sBAAsB;EACpB,qBAAqB,UAAU;CACjC,GAAG,CAAC,YAAY,CAAC;CA6BjB,OAAO;EACL;EACA;EACA,UA9Be,aACd,UAAsC;GACrC,MAAM,UAAU,MAAM;GACtB,MAAM,YAAY,QAAQ;GAE1B,gBAAgB,SAAS;GAEzB,MAAM,eAAe,QAAQ;GAC7B,MAAM,eAAe,QAAQ;GAE7B,MAAM,oBAAoB,cAAc;GACxC,cAAc,UACZ,gBAAgB,YAAY,gBAAgB;GAC9C,WAAW,UAAU,YAAY;GAEjC,IAAI,cAAc,SAChB,kBAAkB,KAAK;GAEzB,IAAI,qBAAqB,CAAC,cAAc,SACtC,iCAAiC,KAAK;QACjC,IAAI,CAAC,qBAAqB,cAAc,SAC7C,iCAAiC,IAAI;EAEzC,GACA;GAAC;GAAiB;GAAY;GAAe;EAAmB,CAMhE;EACA;EACA;CACF;AACF"}
@@ -1,4 +1,5 @@
1
- import { useChannelStateContext } from "../../../../context/ChannelStateContext.mjs";
1
+ import { useStateStore } from "../../../../store/hooks/useStateStore.mjs";
2
+ import { useMessagePaginator } from "../../../../hooks/useMessagePaginator.mjs";
2
3
  import { MESSAGE_LIST_MAIN_PANEL_CLASS } from "../../MessageListMainPanel.mjs";
3
4
  import { UNREAD_MESSAGE_SEPARATOR_CLASS } from "../../UnreadMessagesSeparator.mjs";
4
5
  import { useEffect, useRef, useState } from "react";
@@ -12,8 +13,12 @@ var targetScrolledBelowVisibleContainerArea = (element, container) => {
12
13
  const { bottom: containerBottom } = container.getBoundingClientRect();
13
14
  return targetTop > containerBottom;
14
15
  };
15
- var useUnreadMessagesNotification = ({ isMessageListScrolledToBottom, listElement, showAlways, unreadCount }) => {
16
- const { messages } = useChannelStateContext("UnreadMessagesNotification");
16
+ var messagePaginatorStateSelector = (state) => ({ messages: state.items ?? [] });
17
+ var unreadStateSnapshotSelector = (state) => ({ unreadCount: state.unreadCount });
18
+ var useUnreadMessagesNotification = ({ isMessageListScrolledToBottom, listElement, showAlways }) => {
19
+ const messagePaginator = useMessagePaginator();
20
+ const { messages } = useStateStore(messagePaginator.state, messagePaginatorStateSelector);
21
+ const { unreadCount } = useStateStore(messagePaginator.unreadStateSnapshot, unreadStateSnapshotSelector);
17
22
  const [show, setShow] = useState(false);
18
23
  const isScrolledAboveTargetTop = useRef(false);
19
24
  const intersectionObserverIsSupported = typeof IntersectionObserver !== "undefined";
@@ -27,12 +32,12 @@ var useUnreadMessagesNotification = ({ isMessageListScrolledToBottom, listElemen
27
32
  const [msgListPanel] = document.getElementsByClassName(MESSAGE_LIST_MAIN_PANEL_CLASS);
28
33
  if (!msgListPanel) return;
29
34
  const [observedTarget] = document.getElementsByClassName(UNREAD_MESSAGE_SEPARATOR_CLASS);
30
- if (!observedTarget) setShow(true);
35
+ if (!observedTarget) setShow(unreadCount > 0);
31
36
  return;
32
37
  }
33
38
  const [observedTarget] = document.getElementsByClassName(UNREAD_MESSAGE_SEPARATOR_CLASS);
34
39
  if (!observedTarget) {
35
- setShow(true);
40
+ setShow(unreadCount > 0);
36
41
  return;
37
42
  }
38
43
  const scrolledBelowSeparator = targetScrolledAboveVisibleContainerArea(observedTarget, scrollRoot);
@@ -1 +1 @@
1
- {"version":3,"file":"useUnreadMessagesNotification.mjs","names":[],"sources":["../../../../../../src/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.ts"],"sourcesContent":["import { useChannelStateContext } from '../../../../context';\nimport { useEffect, useRef, useState } from 'react';\nimport { MESSAGE_LIST_MAIN_PANEL_CLASS } from '../../MessageListMainPanel';\nimport { UNREAD_MESSAGE_SEPARATOR_CLASS } from '../../UnreadMessagesSeparator';\n\nconst targetScrolledAboveVisibleContainerArea = (\n element: Element,\n container?: Element,\n) => {\n const { bottom: targetBottom } = element.getBoundingClientRect();\n const containerTop = container?.getBoundingClientRect().top ?? 0;\n return targetBottom < containerTop;\n};\n\nconst targetScrolledBelowVisibleContainerArea = (\n element: Element,\n container: Element,\n) => {\n const { top: targetTop } = element.getBoundingClientRect();\n const { bottom: containerBottom } = container.getBoundingClientRect();\n return targetTop > containerBottom;\n};\n\nexport type UseUnreadMessagesNotificationParams = {\n /** Scroll container (the element with overflow that actually scrolls). When provided, used as IntersectionObserver root and for initial visibility. */\n listElement: HTMLDivElement | null;\n isMessageListScrolledToBottom: boolean;\n showAlways: boolean;\n unreadCount?: number;\n};\n\nexport const useUnreadMessagesNotification = ({\n isMessageListScrolledToBottom,\n listElement,\n showAlways,\n unreadCount,\n}: UseUnreadMessagesNotificationParams) => {\n const { messages } = useChannelStateContext('UnreadMessagesNotification');\n const [show, setShow] = useState(false);\n const isScrolledAboveTargetTop = useRef(false);\n const intersectionObserverIsSupported = typeof IntersectionObserver !== 'undefined';\n\n useEffect(() => {\n if (!(unreadCount && intersectionObserverIsSupported)) {\n setShow(false);\n return;\n }\n\n const scrollRoot = listElement ?? null;\n if (!scrollRoot) {\n const [msgListPanel] = document.getElementsByClassName(\n MESSAGE_LIST_MAIN_PANEL_CLASS,\n );\n if (!msgListPanel) return;\n const [observedTarget] = document.getElementsByClassName(\n UNREAD_MESSAGE_SEPARATOR_CLASS,\n );\n if (!observedTarget) {\n setShow(true);\n }\n return;\n }\n\n const [observedTarget] = document.getElementsByClassName(\n UNREAD_MESSAGE_SEPARATOR_CLASS,\n );\n if (!observedTarget) {\n setShow(true);\n return;\n }\n\n const scrolledBelowSeparator = targetScrolledAboveVisibleContainerArea(\n observedTarget,\n scrollRoot,\n );\n const scrolledAboveSeparator = targetScrolledBelowVisibleContainerArea(\n observedTarget,\n scrollRoot,\n );\n\n setShow(\n showAlways\n ? scrolledBelowSeparator || scrolledAboveSeparator\n : scrolledBelowSeparator,\n );\n\n const observer = new IntersectionObserver(\n (elements) => {\n if (!elements.length) return;\n const entry = elements[0];\n const { boundingClientRect, isIntersecting, rootBounds } = entry;\n if (isIntersecting) {\n setShow(false);\n return;\n }\n const rootTop = rootBounds?.top ?? 0;\n const separatorIsAboveContainerTop = boundingClientRect.bottom < rootTop;\n setShow(showAlways || separatorIsAboveContainerTop);\n isScrolledAboveTargetTop.current = separatorIsAboveContainerTop;\n },\n { root: scrollRoot },\n );\n observer.observe(observedTarget);\n\n return () => {\n observer.disconnect();\n };\n }, [\n intersectionObserverIsSupported,\n listElement,\n isMessageListScrolledToBottom,\n messages,\n showAlways,\n unreadCount,\n ]);\n\n useEffect(() => {\n /**\n * Handle situation when scrollToBottom is called from another component when the msg list is scrolled above the observed target (unread separator).\n * The intersection observer is not triggered when Element.scrollTo() is called. So we end up in a situation when we are scrolled to the bottom\n * and at the same time scrolled above the observed target.\n */\n\n if (\n unreadCount &&\n isMessageListScrolledToBottom &&\n isScrolledAboveTargetTop.current\n ) {\n setShow(true);\n isScrolledAboveTargetTop.current = false;\n }\n }, [isMessageListScrolledToBottom, unreadCount]);\n\n return { show: show && intersectionObserverIsSupported };\n};\n"],"mappings":";;;;;AAKA,IAAM,2CACJ,SACA,cACG;CACH,MAAM,EAAE,QAAQ,iBAAiB,QAAQ,sBAAsB;CAE/D,OAAO,gBADc,WAAW,sBAAsB,CAAC,CAAC,OAAO;AAEjE;AAEA,IAAM,2CACJ,SACA,cACG;CACH,MAAM,EAAE,KAAK,cAAc,QAAQ,sBAAsB;CACzD,MAAM,EAAE,QAAQ,oBAAoB,UAAU,sBAAsB;CACpE,OAAO,YAAY;AACrB;AAUA,IAAa,iCAAiC,EAC5C,+BACA,aACA,YACA,kBACyC;CACzC,MAAM,EAAE,aAAa,uBAAuB,4BAA4B;CACxE,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,2BAA2B,OAAO,KAAK;CAC7C,MAAM,kCAAkC,OAAO,yBAAyB;CAExE,gBAAgB;EACd,IAAI,EAAE,eAAe,kCAAkC;GACrD,QAAQ,KAAK;GACb;EACF;EAEA,MAAM,aAAa,eAAe;EAClC,IAAI,CAAC,YAAY;GACf,MAAM,CAAC,gBAAgB,SAAS,uBAC9B,6BACF;GACA,IAAI,CAAC,cAAc;GACnB,MAAM,CAAC,kBAAkB,SAAS,uBAChC,8BACF;GACA,IAAI,CAAC,gBACH,QAAQ,IAAI;GAEd;EACF;EAEA,MAAM,CAAC,kBAAkB,SAAS,uBAChC,8BACF;EACA,IAAI,CAAC,gBAAgB;GACnB,QAAQ,IAAI;GACZ;EACF;EAEA,MAAM,yBAAyB,wCAC7B,gBACA,UACF;EACA,MAAM,yBAAyB,wCAC7B,gBACA,UACF;EAEA,QACE,aACI,0BAA0B,yBAC1B,sBACN;EAEA,MAAM,WAAW,IAAI,sBAClB,aAAa;GACZ,IAAI,CAAC,SAAS,QAAQ;GAEtB,MAAM,EAAE,oBAAoB,gBAAgB,eAD9B,SAAS;GAEvB,IAAI,gBAAgB;IAClB,QAAQ,KAAK;IACb;GACF;GACA,MAAM,UAAU,YAAY,OAAO;GACnC,MAAM,+BAA+B,mBAAmB,SAAS;GACjE,QAAQ,cAAc,4BAA4B;GAClD,yBAAyB,UAAU;EACrC,GACA,EAAE,MAAM,WAAW,CACrB;EACA,SAAS,QAAQ,cAAc;EAE/B,aAAa;GACX,SAAS,WAAW;EACtB;CACF,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,gBAAgB;;;;;;EAOd,IACE,eACA,iCACA,yBAAyB,SACzB;GACA,QAAQ,IAAI;GACZ,yBAAyB,UAAU;EACrC;CACF,GAAG,CAAC,+BAA+B,WAAW,CAAC;CAE/C,OAAO,EAAE,MAAM,QAAQ,gCAAgC;AACzD"}
1
+ {"version":3,"file":"useUnreadMessagesNotification.mjs","names":[],"sources":["../../../../../../src/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { MESSAGE_LIST_MAIN_PANEL_CLASS } from '../../MessageListMainPanel';\nimport { UNREAD_MESSAGE_SEPARATOR_CLASS } from '../../UnreadMessagesSeparator';\nimport type { MessagePaginatorState, UnreadSnapshotState } from 'stream-chat';\nimport { useStateStore } from '../../../../store';\nimport { useMessagePaginator } from '../../../../hooks';\n\nconst targetScrolledAboveVisibleContainerArea = (\n element: Element,\n container?: Element,\n) => {\n const { bottom: targetBottom } = element.getBoundingClientRect();\n const containerTop = container?.getBoundingClientRect().top ?? 0;\n return targetBottom < containerTop;\n};\n\nconst targetScrolledBelowVisibleContainerArea = (\n element: Element,\n container: Element,\n) => {\n const { top: targetTop } = element.getBoundingClientRect();\n const { bottom: containerBottom } = container.getBoundingClientRect();\n return targetTop > containerBottom;\n};\n\nexport type UseUnreadMessagesNotificationParams = {\n /** Scroll container (the element with overflow that actually scrolls). When provided, used as IntersectionObserver root and for initial visibility. */\n listElement: HTMLDivElement | null;\n isMessageListScrolledToBottom: boolean;\n showAlways: boolean;\n unreadCount?: number;\n};\n\nconst messagePaginatorStateSelector = (state: MessagePaginatorState) => ({\n messages: state.items ?? [],\n});\n\nconst unreadStateSnapshotSelector = (state: UnreadSnapshotState) => ({\n unreadCount: state.unreadCount,\n});\n\nexport const useUnreadMessagesNotification = ({\n isMessageListScrolledToBottom,\n listElement,\n showAlways,\n}: UseUnreadMessagesNotificationParams) => {\n const messagePaginator = useMessagePaginator();\n\n const { messages } = useStateStore(\n messagePaginator.state,\n messagePaginatorStateSelector,\n );\n\n const { unreadCount } = useStateStore(\n messagePaginator.unreadStateSnapshot,\n unreadStateSnapshotSelector,\n );\n const [show, setShow] = useState(false);\n const isScrolledAboveTargetTop = useRef(false);\n const intersectionObserverIsSupported = typeof IntersectionObserver !== 'undefined';\n\n useEffect(() => {\n if (!(unreadCount && intersectionObserverIsSupported)) {\n setShow(false);\n return;\n }\n\n const scrollRoot = listElement ?? null;\n if (!scrollRoot) {\n const [msgListPanel] = document.getElementsByClassName(\n MESSAGE_LIST_MAIN_PANEL_CLASS,\n );\n if (!msgListPanel) return;\n const [observedTarget] = document.getElementsByClassName(\n UNREAD_MESSAGE_SEPARATOR_CLASS,\n );\n if (!observedTarget) {\n setShow(unreadCount > 0);\n }\n return;\n }\n\n const [observedTarget] = document.getElementsByClassName(\n UNREAD_MESSAGE_SEPARATOR_CLASS,\n );\n if (!observedTarget) {\n setShow(unreadCount > 0);\n return;\n }\n\n const scrolledBelowSeparator = targetScrolledAboveVisibleContainerArea(\n observedTarget,\n scrollRoot,\n );\n const scrolledAboveSeparator = targetScrolledBelowVisibleContainerArea(\n observedTarget,\n scrollRoot,\n );\n\n setShow(\n showAlways\n ? scrolledBelowSeparator || scrolledAboveSeparator\n : scrolledBelowSeparator,\n );\n\n const observer = new IntersectionObserver(\n (elements) => {\n if (!elements.length) return;\n const entry = elements[0];\n const { boundingClientRect, isIntersecting, rootBounds } = entry;\n if (isIntersecting) {\n setShow(false);\n return;\n }\n const rootTop = rootBounds?.top ?? 0;\n const separatorIsAboveContainerTop = boundingClientRect.bottom < rootTop;\n setShow(showAlways || separatorIsAboveContainerTop);\n isScrolledAboveTargetTop.current = separatorIsAboveContainerTop;\n },\n { root: scrollRoot },\n );\n observer.observe(observedTarget);\n\n return () => {\n observer.disconnect();\n };\n }, [\n intersectionObserverIsSupported,\n listElement,\n isMessageListScrolledToBottom,\n messages,\n showAlways,\n unreadCount,\n ]);\n\n useEffect(() => {\n /**\n * Handle situation when scrollToBottom is called from another component when the msg list is scrolled above the observed target (unread separator).\n * The intersection observer is not triggered when Element.scrollTo() is called. So we end up in a situation when we are scrolled to the bottom\n * and at the same time scrolled above the observed target.\n */\n\n if (\n unreadCount &&\n isMessageListScrolledToBottom &&\n isScrolledAboveTargetTop.current\n ) {\n setShow(true);\n isScrolledAboveTargetTop.current = false;\n }\n }, [isMessageListScrolledToBottom, unreadCount]);\n\n return { show: show && intersectionObserverIsSupported };\n};\n"],"mappings":";;;;;;AAOA,IAAM,2CACJ,SACA,cACG;CACH,MAAM,EAAE,QAAQ,iBAAiB,QAAQ,sBAAsB;CAE/D,OAAO,gBADc,WAAW,sBAAsB,CAAC,CAAC,OAAO;AAEjE;AAEA,IAAM,2CACJ,SACA,cACG;CACH,MAAM,EAAE,KAAK,cAAc,QAAQ,sBAAsB;CACzD,MAAM,EAAE,QAAQ,oBAAoB,UAAU,sBAAsB;CACpE,OAAO,YAAY;AACrB;AAUA,IAAM,iCAAiC,WAAkC,EACvE,UAAU,MAAM,SAAS,CAAC,EAC5B;AAEA,IAAM,+BAA+B,WAAgC,EACnE,aAAa,MAAM,YACrB;AAEA,IAAa,iCAAiC,EAC5C,+BACA,aACA,iBACyC;CACzC,MAAM,mBAAmB,oBAAoB;CAE7C,MAAM,EAAE,aAAa,cACnB,iBAAiB,OACjB,6BACF;CAEA,MAAM,EAAE,gBAAgB,cACtB,iBAAiB,qBACjB,2BACF;CACA,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,2BAA2B,OAAO,KAAK;CAC7C,MAAM,kCAAkC,OAAO,yBAAyB;CAExE,gBAAgB;EACd,IAAI,EAAE,eAAe,kCAAkC;GACrD,QAAQ,KAAK;GACb;EACF;EAEA,MAAM,aAAa,eAAe;EAClC,IAAI,CAAC,YAAY;GACf,MAAM,CAAC,gBAAgB,SAAS,uBAC9B,6BACF;GACA,IAAI,CAAC,cAAc;GACnB,MAAM,CAAC,kBAAkB,SAAS,uBAChC,8BACF;GACA,IAAI,CAAC,gBACH,QAAQ,cAAc,CAAC;GAEzB;EACF;EAEA,MAAM,CAAC,kBAAkB,SAAS,uBAChC,8BACF;EACA,IAAI,CAAC,gBAAgB;GACnB,QAAQ,cAAc,CAAC;GACvB;EACF;EAEA,MAAM,yBAAyB,wCAC7B,gBACA,UACF;EACA,MAAM,yBAAyB,wCAC7B,gBACA,UACF;EAEA,QACE,aACI,0BAA0B,yBAC1B,sBACN;EAEA,MAAM,WAAW,IAAI,sBAClB,aAAa;GACZ,IAAI,CAAC,SAAS,QAAQ;GAEtB,MAAM,EAAE,oBAAoB,gBAAgB,eAD9B,SAAS;GAEvB,IAAI,gBAAgB;IAClB,QAAQ,KAAK;IACb;GACF;GACA,MAAM,UAAU,YAAY,OAAO;GACnC,MAAM,+BAA+B,mBAAmB,SAAS;GACjE,QAAQ,cAAc,4BAA4B;GAClD,yBAAyB,UAAU;EACrC,GACA,EAAE,MAAM,WAAW,CACrB;EACA,SAAS,QAAQ,cAAc;EAE/B,aAAa;GACX,SAAS,WAAW;EACtB;CACF,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,gBAAgB;;;;;;EAOd,IACE,eACA,iCACA,yBAAyB,SACzB;GACA,QAAQ,IAAI;GACZ,yBAAyB,UAAU;EACrC;CACF,GAAG,CAAC,+BAA+B,WAAW,CAAC;CAE/C,OAAO,EAAE,MAAM,QAAQ,gCAAgC;AACzD"}
@@ -1,5 +1,6 @@
1
1
  import { isDateSeparatorMessage, isIntroMessage } from "../../utils.mjs";
2
2
  import { useCallback, useState } from "react";
3
+ import { nsToDate } from "stream-chat";
3
4
  //#region src/components/MessageList/hooks/VirtualizedMessageList/useFloatingDateSeparator.ts
4
5
  /**
5
6
  * Returns the date to show in the floating date separator based on currently visible messages.
@@ -13,8 +14,8 @@ function getFloatingDateForFirstMessage(firstMessage, processedMessages, firstMe
13
14
  if (isDateSeparatorMessage(item)) return item.date;
14
15
  }
15
16
  const created = firstMessage.created_at;
16
- if (created) {
17
- const d = new Date(created);
17
+ if (created != null) {
18
+ const d = nsToDate(created);
18
19
  return isNaN(d.getTime()) ? null : d;
19
20
  }
20
21
  return null;
@@ -31,10 +32,10 @@ var HIDDEN_STATE = {
31
32
  date: null,
32
33
  visible: false
33
34
  };
34
- var useFloatingDateSeparator = ({ disableDateSeparator, processedMessages }) => {
35
+ var useFloatingDateSeparator = ({ processedMessages, withDateSeparator }) => {
35
36
  const [state, setState] = useState(HIDDEN_STATE);
36
37
  const onItemsRendered = useCallback((rendered) => {
37
- if (disableDateSeparator || processedMessages.length === 0) {
38
+ if (!withDateSeparator || processedMessages.length === 0) {
38
39
  setState(HIDDEN_STATE);
39
40
  return;
40
41
  }
@@ -56,7 +57,7 @@ var useFloatingDateSeparator = ({ disableDateSeparator, processedMessages }) =>
56
57
  visible
57
58
  };
58
59
  });
59
- }, [disableDateSeparator, processedMessages]);
60
+ }, [withDateSeparator, processedMessages]);
60
61
  return {
61
62
  floatingDate: state.date,
62
63
  onItemsRendered,
@@ -1 +1 @@
1
- {"version":3,"file":"useFloatingDateSeparator.mjs","names":[],"sources":["../../../../../../src/components/MessageList/hooks/VirtualizedMessageList/useFloatingDateSeparator.ts"],"sourcesContent":["import { useCallback, useState } from 'react';\n\nimport type { RenderedMessage } from '../../utils';\nimport { isDateSeparatorMessage, isIntroMessage } from '../../utils';\nimport type { LocalMessage } from 'stream-chat';\n\nexport type UseFloatingDateSeparatorParams = {\n disableDateSeparator: boolean;\n processedMessages: RenderedMessage[];\n};\n\nexport type UseFloatingDateSeparatorResult = {\n floatingDate: Date | null;\n onItemsRendered: (rendered: RenderedMessage[]) => void;\n showFloatingDate: boolean;\n};\n\n/**\n * Returns the date to show in the floating date separator based on currently visible messages.\n * When the first visible item is a message (not a date separator), we've scrolled past its\n * date separator — find that separator's date.\n */\nfunction getFloatingDateForFirstMessage(\n firstMessage: RenderedMessage,\n processedMessages: RenderedMessage[],\n firstMessageIndex: number,\n): Date | null {\n if (isIntroMessage(firstMessage)) return null;\n\n // Walk backwards to find the last date separator before this message\n for (let i = firstMessageIndex - 1; i >= 0; i -= 1) {\n const item = processedMessages[i];\n if (isDateSeparatorMessage(item)) {\n return item.date;\n }\n }\n\n // No preceding date separator; use message's created_at\n const msg = firstMessage as LocalMessage;\n const created = msg.created_at;\n if (created) {\n const d = new Date(created);\n return isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\nfunction getFloatingDateForFirstItem(\n firstItem: RenderedMessage,\n processedMessages: RenderedMessage[],\n firstItemIndex: number,\n): Date | null {\n if (isDateSeparatorMessage(firstItem)) return firstItem.date;\n\n return getFloatingDateForFirstMessage(firstItem, processedMessages, firstItemIndex);\n}\n\n/**\n * Controls the floating date separator as a sticky \"current section\" label.\n * It follows the date separator represented by the first visible item.\n */\nconst HIDDEN_STATE = { date: null, visible: false } as const;\n\nexport const useFloatingDateSeparator = ({\n disableDateSeparator,\n processedMessages,\n}: UseFloatingDateSeparatorParams): UseFloatingDateSeparatorResult => {\n const [state, setState] = useState<{\n date: Date | null;\n visible: boolean;\n }>(HIDDEN_STATE);\n\n const onItemsRendered = useCallback(\n (rendered: RenderedMessage[]) => {\n if (disableDateSeparator || processedMessages.length === 0) {\n setState(HIDDEN_STATE);\n return;\n }\n\n const valid = rendered.filter((m): m is RenderedMessage => m != null);\n if (valid.length === 0) {\n setState(HIDDEN_STATE);\n return;\n }\n\n const first = valid[0];\n const firstIndex = processedMessages.findIndex((m) => m.id === first.id);\n const date =\n firstIndex >= 0\n ? getFloatingDateForFirstItem(first, processedMessages, firstIndex)\n : null;\n\n const visible = date !== null;\n setState((prev) => {\n const prevTime = prev.date?.getTime() ?? null;\n const nextTime = date?.getTime() ?? null;\n if (prev.visible === visible && prevTime === nextTime) return prev;\n return { date, visible };\n });\n },\n [disableDateSeparator, processedMessages],\n );\n\n return {\n floatingDate: state.date,\n onItemsRendered,\n showFloatingDate: !!state.date && state.visible,\n };\n};\n"],"mappings":";;;;;;;;AAsBA,SAAS,+BACP,cACA,mBACA,mBACa;CACb,IAAI,eAAe,YAAY,GAAG,OAAO;CAGzC,KAAK,IAAI,IAAI,oBAAoB,GAAG,KAAK,GAAG,KAAK,GAAG;EAClD,MAAM,OAAO,kBAAkB;EAC/B,IAAI,uBAAuB,IAAI,GAC7B,OAAO,KAAK;CAEhB;CAIA,MAAM,UAAU,aAAI;CACpB,IAAI,SAAS;EACX,MAAM,IAAI,IAAI,KAAK,OAAO;EAC1B,OAAO,MAAM,EAAE,QAAQ,CAAC,IAAI,OAAO;CACrC;CACA,OAAO;AACT;AAEA,SAAS,4BACP,WACA,mBACA,gBACa;CACb,IAAI,uBAAuB,SAAS,GAAG,OAAO,UAAU;CAExD,OAAO,+BAA+B,WAAW,mBAAmB,cAAc;AACpF;;;;;AAMA,IAAM,eAAe;CAAE,MAAM;CAAM,SAAS;AAAM;AAElD,IAAa,4BAA4B,EACvC,sBACA,wBACoE;CACpE,MAAM,CAAC,OAAO,YAAY,SAGvB,YAAY;CAEf,MAAM,kBAAkB,aACrB,aAAgC;EAC/B,IAAI,wBAAwB,kBAAkB,WAAW,GAAG;GAC1D,SAAS,YAAY;GACrB;EACF;EAEA,MAAM,QAAQ,SAAS,QAAQ,MAA4B,KAAK,IAAI;EACpE,IAAI,MAAM,WAAW,GAAG;GACtB,SAAS,YAAY;GACrB;EACF;EAEA,MAAM,QAAQ,MAAM;EACpB,MAAM,aAAa,kBAAkB,WAAW,MAAM,EAAE,OAAO,MAAM,EAAE;EACvE,MAAM,OACJ,cAAc,IACV,4BAA4B,OAAO,mBAAmB,UAAU,IAChE;EAEN,MAAM,UAAU,SAAS;EACzB,UAAU,SAAS;GACjB,MAAM,WAAW,KAAK,MAAM,QAAQ,KAAK;GACzC,MAAM,WAAW,MAAM,QAAQ,KAAK;GACpC,IAAI,KAAK,YAAY,WAAW,aAAa,UAAU,OAAO;GAC9D,OAAO;IAAE;IAAM;GAAQ;EACzB,CAAC;CACH,GACA,CAAC,sBAAsB,iBAAiB,CAC1C;CAEA,OAAO;EACL,cAAc,MAAM;EACpB;EACA,kBAAkB,CAAC,CAAC,MAAM,QAAQ,MAAM;CAC1C;AACF"}
1
+ {"version":3,"file":"useFloatingDateSeparator.mjs","names":[],"sources":["../../../../../../src/components/MessageList/hooks/VirtualizedMessageList/useFloatingDateSeparator.ts"],"sourcesContent":["import { useCallback, useState } from 'react';\n\nimport type { RenderedMessage } from '../../utils';\nimport { isDateSeparatorMessage, isIntroMessage } from '../../utils';\nimport type { LocalMessage } from 'stream-chat';\nimport { nsToDate } from 'stream-chat';\n\nexport type UseFloatingDateSeparatorParams = {\n processedMessages: RenderedMessage[];\n withDateSeparator: boolean;\n};\n\nexport type UseFloatingDateSeparatorResult = {\n floatingDate: Date | null;\n onItemsRendered: (rendered: RenderedMessage[]) => void;\n showFloatingDate: boolean;\n};\n\n/**\n * Returns the date to show in the floating date separator based on currently visible messages.\n * When the first visible item is a message (not a date separator), we've scrolled past its\n * date separator — find that separator's date.\n */\nfunction getFloatingDateForFirstMessage(\n firstMessage: RenderedMessage,\n processedMessages: RenderedMessage[],\n firstMessageIndex: number,\n): Date | null {\n if (isIntroMessage(firstMessage)) return null;\n\n // Walk backwards to find the last date separator before this message\n for (let i = firstMessageIndex - 1; i >= 0; i -= 1) {\n const item = processedMessages[i];\n if (isDateSeparatorMessage(item)) {\n return item.date;\n }\n }\n\n // No preceding date separator; use message's created_at\n const msg = firstMessage as LocalMessage;\n const created = msg.created_at;\n if (created != null) {\n const d = nsToDate(created);\n return isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\nfunction getFloatingDateForFirstItem(\n firstItem: RenderedMessage,\n processedMessages: RenderedMessage[],\n firstItemIndex: number,\n): Date | null {\n if (isDateSeparatorMessage(firstItem)) return firstItem.date;\n\n return getFloatingDateForFirstMessage(firstItem, processedMessages, firstItemIndex);\n}\n\n/**\n * Controls the floating date separator as a sticky \"current section\" label.\n * It follows the date separator represented by the first visible item.\n */\nconst HIDDEN_STATE = { date: null, visible: false } as const;\n\nexport const useFloatingDateSeparator = ({\n processedMessages,\n withDateSeparator,\n}: UseFloatingDateSeparatorParams): UseFloatingDateSeparatorResult => {\n const [state, setState] = useState<{\n date: Date | null;\n visible: boolean;\n }>(HIDDEN_STATE);\n\n const onItemsRendered = useCallback(\n (rendered: RenderedMessage[]) => {\n if (!withDateSeparator || processedMessages.length === 0) {\n setState(HIDDEN_STATE);\n return;\n }\n\n const valid = rendered.filter((m): m is RenderedMessage => m != null);\n if (valid.length === 0) {\n setState(HIDDEN_STATE);\n return;\n }\n\n const first = valid[0];\n const firstIndex = processedMessages.findIndex((m) => m.id === first.id);\n const date =\n firstIndex >= 0\n ? getFloatingDateForFirstItem(first, processedMessages, firstIndex)\n : null;\n\n const visible = date !== null;\n setState((prev) => {\n const prevTime = prev.date?.getTime() ?? null;\n const nextTime = date?.getTime() ?? null;\n if (prev.visible === visible && prevTime === nextTime) return prev;\n return { date, visible };\n });\n },\n [withDateSeparator, processedMessages],\n );\n\n return {\n floatingDate: state.date,\n onItemsRendered,\n showFloatingDate: !!state.date && state.visible,\n };\n};\n"],"mappings":";;;;;;;;;AAuBA,SAAS,+BACP,cACA,mBACA,mBACa;CACb,IAAI,eAAe,YAAY,GAAG,OAAO;CAGzC,KAAK,IAAI,IAAI,oBAAoB,GAAG,KAAK,GAAG,KAAK,GAAG;EAClD,MAAM,OAAO,kBAAkB;EAC/B,IAAI,uBAAuB,IAAI,GAC7B,OAAO,KAAK;CAEhB;CAIA,MAAM,UAAU,aAAI;CACpB,IAAI,WAAW,MAAM;EACnB,MAAM,IAAI,SAAS,OAAO;EAC1B,OAAO,MAAM,EAAE,QAAQ,CAAC,IAAI,OAAO;CACrC;CACA,OAAO;AACT;AAEA,SAAS,4BACP,WACA,mBACA,gBACa;CACb,IAAI,uBAAuB,SAAS,GAAG,OAAO,UAAU;CAExD,OAAO,+BAA+B,WAAW,mBAAmB,cAAc;AACpF;;;;;AAMA,IAAM,eAAe;CAAE,MAAM;CAAM,SAAS;AAAM;AAElD,IAAa,4BAA4B,EACvC,mBACA,wBACoE;CACpE,MAAM,CAAC,OAAO,YAAY,SAGvB,YAAY;CAEf,MAAM,kBAAkB,aACrB,aAAgC;EAC/B,IAAI,CAAC,qBAAqB,kBAAkB,WAAW,GAAG;GACxD,SAAS,YAAY;GACrB;EACF;EAEA,MAAM,QAAQ,SAAS,QAAQ,MAA4B,KAAK,IAAI;EACpE,IAAI,MAAM,WAAW,GAAG;GACtB,SAAS,YAAY;GACrB;EACF;EAEA,MAAM,QAAQ,MAAM;EACpB,MAAM,aAAa,kBAAkB,WAAW,MAAM,EAAE,OAAO,MAAM,EAAE;EACvE,MAAM,OACJ,cAAc,IACV,4BAA4B,OAAO,mBAAmB,UAAU,IAChE;EAEN,MAAM,UAAU,SAAS;EACzB,UAAU,SAAS;GACjB,MAAM,WAAW,KAAK,MAAM,QAAQ,KAAK;GACzC,MAAM,WAAW,MAAM,QAAQ,KAAK;GACpC,IAAI,KAAK,YAAY,WAAW,aAAa,UAAU,OAAO;GAC9D,OAAO;IAAE;IAAM;GAAQ;EACzB,CAAC;CACH,GACA,CAAC,mBAAmB,iBAAiB,CACvC;CAEA,OAAO;EACL,cAAc,MAAM;EACpB;EACA,kBAAkB,CAAC,CAAC,MAAM,QAAQ,MAAM;CAC1C;AACF"}
@@ -3,15 +3,15 @@ import { useEffect, useState } from "react";
3
3
  //#region src/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.ts
4
4
  var useGiphyPreview = (separateGiphyPreview) => {
5
5
  const [giphyPreviewMessage, setGiphyPreviewMessage] = useState();
6
- const { client } = useChatContext("useGiphyPreview");
6
+ const { client } = useChatContext();
7
7
  useEffect(() => {
8
8
  if (!separateGiphyPreview) return;
9
9
  const handleEvent = (event) => {
10
10
  const { message, user } = event;
11
- if (message?.command === "giphy" && user?.id === client.userID) setGiphyPreviewMessage(void 0);
11
+ if (message?.command === "giphy" && user?.id === client.userId) setGiphyPreviewMessage(void 0);
12
12
  };
13
- client.on("message.new", handleEvent);
14
- return () => client.off("message.new", handleEvent);
13
+ const subscription = client.on("message.new", handleEvent);
14
+ return () => subscription.unsubscribe();
15
15
  }, [client, separateGiphyPreview]);
16
16
  return {
17
17
  giphyPreviewMessage,
@@ -1 +1 @@
1
- {"version":3,"file":"useGiphyPreview.mjs","names":[],"sources":["../../../../../../src/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport { useChatContext } from '../../../../context/ChatContext';\n\nimport type { EventHandler, LocalMessage } from 'stream-chat';\n\nexport const useGiphyPreview = (separateGiphyPreview: boolean) => {\n const [giphyPreviewMessage, setGiphyPreviewMessage] = useState<LocalMessage>();\n\n const { client } = useChatContext('useGiphyPreview');\n\n useEffect(() => {\n if (!separateGiphyPreview) return;\n const handleEvent: EventHandler = (event) => {\n const { message, user } = event;\n\n if (message?.command === 'giphy' && user?.id === client.userID) {\n setGiphyPreviewMessage(undefined);\n }\n };\n\n client.on('message.new', handleEvent);\n return () => client.off('message.new', handleEvent);\n }, [client, separateGiphyPreview]);\n\n return {\n giphyPreviewMessage,\n setGiphyPreviewMessage: separateGiphyPreview ? setGiphyPreviewMessage : undefined,\n };\n};\n"],"mappings":";;;AAMA,IAAa,mBAAmB,yBAAkC;CAChE,MAAM,CAAC,qBAAqB,0BAA0B,SAAuB;CAE7E,MAAM,EAAE,WAAW,eAAe,iBAAiB;CAEnD,gBAAgB;EACd,IAAI,CAAC,sBAAsB;EAC3B,MAAM,eAA6B,UAAU;GAC3C,MAAM,EAAE,SAAS,SAAS;GAE1B,IAAI,SAAS,YAAY,WAAW,MAAM,OAAO,OAAO,QACtD,uBAAuB,KAAA,CAAS;EAEpC;EAEA,OAAO,GAAG,eAAe,WAAW;EACpC,aAAa,OAAO,IAAI,eAAe,WAAW;CACpD,GAAG,CAAC,QAAQ,oBAAoB,CAAC;CAEjC,OAAO;EACL;EACA,wBAAwB,uBAAuB,yBAAyB,KAAA;CAC1E;AACF"}
1
+ {"version":3,"file":"useGiphyPreview.mjs","names":[],"sources":["../../../../../../src/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport { useChatContext } from '../../../../context/ChatContext';\n\nimport type { EventPayload, LocalMessage } from 'stream-chat';\n\nexport const useGiphyPreview = (separateGiphyPreview: boolean) => {\n const [giphyPreviewMessage, setGiphyPreviewMessage] = useState<LocalMessage>();\n\n const { client } = useChatContext();\n\n useEffect(() => {\n if (!separateGiphyPreview) return;\n const handleEvent = (event: EventPayload<'message.new'>) => {\n const { message, user } = event;\n\n if (message?.command === 'giphy' && user?.id === client.userId) {\n setGiphyPreviewMessage(undefined);\n }\n };\n\n const subscription = client.on('message.new', handleEvent);\n return () => subscription.unsubscribe();\n }, [client, separateGiphyPreview]);\n\n return {\n giphyPreviewMessage,\n setGiphyPreviewMessage: separateGiphyPreview ? setGiphyPreviewMessage : undefined,\n };\n};\n"],"mappings":";;;AAMA,IAAa,mBAAmB,yBAAkC;CAChE,MAAM,CAAC,qBAAqB,0BAA0B,SAAuB;CAE7E,MAAM,EAAE,WAAW,eAAe;CAElC,gBAAgB;EACd,IAAI,CAAC,sBAAsB;EAC3B,MAAM,eAAe,UAAuC;GAC1D,MAAM,EAAE,SAAS,SAAS;GAE1B,IAAI,SAAS,YAAY,WAAW,MAAM,OAAO,OAAO,QACtD,uBAAuB,KAAA,CAAS;EAEpC;EAEA,MAAM,eAAe,OAAO,GAAG,eAAe,WAAW;EACzD,aAAa,aAAa,YAAY;CACxC,GAAG,CAAC,QAAQ,oBAAoB,CAAC;CAEjC,OAAO;EACL;EACA,wBAAwB,uBAAuB,yBAAyB,KAAA;CAC1E;AACF"}
@@ -1,8 +1,12 @@
1
+ import { useStateStore } from "../../../../store/hooks/useStateStore.mjs";
2
+ import { useMessagePaginator } from "../../../../hooks/useMessagePaginator.mjs";
1
3
  import { useEffect, useRef, useState } from "react";
2
4
  //#region src/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.ts
3
- function useNewMessageNotification(messages, currentUserId, hasMoreNewer) {
5
+ var messagePaginatorStateSelector = (state) => ({ hasMoreNewer: state.hasMoreHead ?? [] });
6
+ function useNewMessageNotification(messages, currentUserId) {
4
7
  const [newMessagesNotification, setNewMessagesNotification] = useState(false);
5
8
  const [isMessageListScrolledToBottom, setIsMessageListScrolledToBottom] = useState(true);
9
+ const { hasMoreNewer } = useStateStore(useMessagePaginator().state, messagePaginatorStateSelector);
6
10
  /**
7
11
  * use the flag to avoid the initial "new messages" quick blink
8
12
  */