stream-chat-react 12.15.0 → 13.0.0-rc.2

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 (473) hide show
  1. package/dist/components/AIStateIndicator/AIStateIndicator.d.ts +4 -5
  2. package/dist/components/AIStateIndicator/hooks/useAIState.d.ts +2 -3
  3. package/dist/components/Attachment/Attachment.d.ts +8 -9
  4. package/dist/components/Attachment/Attachment.js +6 -5
  5. package/dist/components/Attachment/AttachmentActions.d.ts +2 -3
  6. package/dist/components/Attachment/AttachmentContainer.d.ts +15 -15
  7. package/dist/components/Attachment/AttachmentContainer.js +2 -2
  8. package/dist/components/Attachment/Audio.d.ts +3 -4
  9. package/dist/components/Attachment/Card.d.ts +1 -1
  10. package/dist/components/Attachment/FileAttachment.d.ts +3 -4
  11. package/dist/components/Attachment/FileAttachment.js +1 -1
  12. package/dist/components/Attachment/UnsupportedAttachment.d.ts +3 -4
  13. package/dist/components/Attachment/UnsupportedAttachment.js +1 -1
  14. package/dist/components/Attachment/VoiceRecording.d.ts +4 -5
  15. package/dist/components/Attachment/components/FileSizeIndicator.d.ts +1 -1
  16. package/dist/components/Attachment/components/FileSizeIndicator.js +4 -2
  17. package/dist/components/Attachment/utils.d.ts +8 -22
  18. package/dist/components/Attachment/utils.js +3 -18
  19. package/dist/components/Avatar/Avatar.d.ts +3 -4
  20. package/dist/components/Avatar/ChannelAvatar.d.ts +3 -4
  21. package/dist/components/Avatar/ChannelAvatar.js +1 -1
  22. package/dist/components/Avatar/GroupAvatar.d.ts +2 -2
  23. package/dist/components/Channel/Channel.d.ts +18 -43
  24. package/dist/components/Channel/Channel.js +25 -88
  25. package/dist/components/Channel/channelState.d.ts +17 -18
  26. package/dist/components/Channel/hooks/useChannelContainerClasses.d.ts +2 -3
  27. package/dist/components/Channel/hooks/useCreateChannelStateContext.d.ts +2 -3
  28. package/dist/components/Channel/hooks/useCreateChannelStateContext.js +1 -15
  29. package/dist/components/Channel/hooks/useCreateTypingContext.d.ts +1 -2
  30. package/dist/components/Channel/hooks/useEditMessageHandler.d.ts +3 -4
  31. package/dist/components/Channel/hooks/useMentionsHandlers.d.ts +3 -4
  32. package/dist/components/Channel/utils.d.ts +8 -6
  33. package/dist/components/Channel/utils.js +1 -0
  34. package/dist/components/ChannelHeader/ChannelHeader.d.ts +2 -3
  35. package/dist/components/ChannelList/ChannelList.d.ts +31 -30
  36. package/dist/components/ChannelList/ChannelList.js +8 -10
  37. package/dist/components/ChannelList/ChannelListMessenger.d.ts +6 -6
  38. package/dist/components/ChannelList/hooks/useChannelDeletedListener.d.ts +1 -2
  39. package/dist/components/ChannelList/hooks/useChannelHiddenListener.d.ts +1 -2
  40. package/dist/components/ChannelList/hooks/useChannelListShape.d.ts +44 -44
  41. package/dist/components/ChannelList/hooks/useChannelListShape.js +0 -2
  42. package/dist/components/ChannelList/hooks/useChannelMembershipState.d.ts +3 -3
  43. package/dist/components/ChannelList/hooks/useChannelTruncatedListener.d.ts +1 -2
  44. package/dist/components/ChannelList/hooks/useChannelUpdatedListener.d.ts +1 -2
  45. package/dist/components/ChannelList/hooks/useChannelVisibleListener.d.ts +1 -2
  46. package/dist/components/ChannelList/hooks/useConnectionRecoveredListener.d.ts +1 -2
  47. package/dist/components/ChannelList/hooks/useMessageNewListener.d.ts +1 -2
  48. package/dist/components/ChannelList/hooks/useNotificationAddedToChannelListener.d.ts +1 -2
  49. package/dist/components/ChannelList/hooks/useNotificationMessageNewListener.d.ts +1 -2
  50. package/dist/components/ChannelList/hooks/useNotificationRemovedFromChannelListener.d.ts +1 -2
  51. package/dist/components/ChannelList/hooks/usePaginatedChannels.d.ts +7 -8
  52. package/dist/components/ChannelList/hooks/usePaginatedChannels.js +3 -3
  53. package/dist/components/ChannelList/hooks/useSelectedChannelState.d.ts +7 -7
  54. package/dist/components/ChannelList/hooks/useUserPresenceChangedListener.d.ts +1 -2
  55. package/dist/components/ChannelList/utils.d.ts +20 -21
  56. package/dist/components/ChannelList/utils.js +2 -2
  57. package/dist/components/ChannelPreview/ChannelPreview.d.ts +15 -16
  58. package/dist/components/ChannelPreview/ChannelPreview.js +1 -1
  59. package/dist/components/ChannelPreview/ChannelPreviewActionButtons.d.ts +4 -4
  60. package/dist/components/ChannelPreview/ChannelPreviewMessenger.d.ts +1 -2
  61. package/dist/components/ChannelPreview/hooks/useChannelPreviewInfo.d.ts +3 -4
  62. package/dist/components/ChannelPreview/hooks/useIsChannelMuted.d.ts +1 -2
  63. package/dist/components/ChannelPreview/hooks/useMessageDeliveryStatus.d.ts +5 -7
  64. package/dist/components/ChannelPreview/icons.d.ts +1 -1
  65. package/dist/components/ChannelPreview/utils.d.ts +7 -7
  66. package/dist/components/ChannelSearch/ChannelSearch.d.ts +5 -6
  67. package/dist/components/ChannelSearch/ChannelSearch.js +2 -2
  68. package/dist/components/ChannelSearch/SearchBar.d.ts +1 -1
  69. package/dist/components/ChannelSearch/SearchBar.js +1 -1
  70. package/dist/components/ChannelSearch/SearchResults.d.ts +13 -14
  71. package/dist/components/ChannelSearch/SearchResults.js +1 -1
  72. package/dist/components/ChannelSearch/hooks/useChannelSearch.d.ts +17 -18
  73. package/dist/components/ChannelSearch/hooks/useChannelSearch.js +2 -6
  74. package/dist/components/ChannelSearch/utils.d.ts +2 -3
  75. package/dist/components/Chat/Chat.d.ts +9 -9
  76. package/dist/components/Chat/hooks/useChannelsQueryState.d.ts +1 -1
  77. package/dist/components/Chat/hooks/useChat.d.ts +10 -10
  78. package/dist/components/Chat/hooks/useChat.js +3 -3
  79. package/dist/components/Chat/hooks/useCreateChatClient.d.ts +4 -4
  80. package/dist/components/Chat/hooks/useCreateChatContext.d.ts +1 -2
  81. package/dist/components/Dialog/DialogAnchor.d.ts +4 -3
  82. package/dist/components/Dialog/DialogAnchor.js +2 -2
  83. package/dist/components/Dialog/DialogMenu.d.ts +2 -1
  84. package/dist/components/Dialog/DialogPortal.d.ts +2 -1
  85. package/dist/components/Dialog/FormDialog.d.ts +2 -1
  86. package/dist/components/Dialog/FormDialog.js +1 -1
  87. package/dist/components/Dialog/PromptDialog.d.ts +2 -1
  88. package/dist/components/DragAndDrop/DragAndDropContainer.d.ts +2 -1
  89. package/dist/components/EventComponent/EventComponent.d.ts +7 -6
  90. package/dist/components/Form/FieldError.d.ts +2 -1
  91. package/dist/components/Form/SwitchField.d.ts +2 -1
  92. package/dist/components/Form/SwitchField.js +1 -1
  93. package/dist/components/Gallery/Gallery.d.ts +5 -5
  94. package/dist/components/Gallery/Image.d.ts +6 -5
  95. package/dist/components/Gallery/ModalGallery.d.ts +3 -4
  96. package/dist/components/InfiniteScrollPaginator/InfiniteScroll.d.ts +2 -1
  97. package/dist/components/InfiniteScrollPaginator/InfiniteScrollPaginator.d.ts +2 -1
  98. package/dist/components/LoadMore/LoadMoreButton.d.ts +2 -1
  99. package/dist/components/LoadMore/LoadMorePaginator.d.ts +3 -2
  100. package/dist/components/LoadMore/LoadMorePaginator.js +1 -1
  101. package/dist/components/MediaRecorder/AudioRecorder/AudioRecorder.js +3 -2
  102. package/dist/components/MediaRecorder/AudioRecorder/AudioRecordingInProgress.js +1 -1
  103. package/dist/components/MediaRecorder/RecordingPermissionDeniedNotification.d.ts +1 -1
  104. package/dist/components/MediaRecorder/classes/MediaRecorderController.d.ts +11 -23
  105. package/dist/components/MediaRecorder/hooks/useMediaRecorder.d.ts +8 -8
  106. package/dist/components/MediaRecorder/hooks/useMediaRecorder.js +6 -4
  107. package/dist/components/MediaRecorder/observable/BehaviorSubject.d.ts +2 -2
  108. package/dist/components/MediaRecorder/observable/Observable.d.ts +1 -1
  109. package/dist/components/MediaRecorder/observable/Subject.d.ts +3 -2
  110. package/dist/components/Message/FixedHeightMessage.d.ts +4 -5
  111. package/dist/components/Message/Message.d.ts +1 -2
  112. package/dist/components/Message/MessageDeleted.d.ts +4 -5
  113. package/dist/components/Message/MessageEditedTimestamp.d.ts +2 -3
  114. package/dist/components/Message/MessageErrorText.d.ts +4 -5
  115. package/dist/components/Message/MessageErrorText.js +2 -2
  116. package/dist/components/Message/MessageOptions.d.ts +3 -3
  117. package/dist/components/Message/MessageRepliesCountButton.d.ts +2 -1
  118. package/dist/components/Message/MessageSimple.d.ts +1 -2
  119. package/dist/components/Message/MessageSimple.js +8 -10
  120. package/dist/components/Message/MessageStatus.d.ts +3 -4
  121. package/dist/components/Message/MessageText.d.ts +6 -6
  122. package/dist/components/Message/MessageTimestamp.d.ts +4 -5
  123. package/dist/components/Message/QuotedMessage.d.ts +2 -3
  124. package/dist/components/Message/QuotedMessage.js +1 -1
  125. package/dist/components/Message/StreamedMessageText.d.ts +3 -4
  126. package/dist/components/Message/hooks/useActionHandler.d.ts +2 -3
  127. package/dist/components/Message/hooks/useActionHandler.js +1 -1
  128. package/dist/components/Message/hooks/useDeleteHandler.d.ts +4 -5
  129. package/dist/components/Message/hooks/useFlagHandler.d.ts +5 -6
  130. package/dist/components/Message/hooks/useMarkUnreadHandler.d.ts +5 -6
  131. package/dist/components/Message/hooks/useMentionsHandler.d.ts +6 -8
  132. package/dist/components/Message/hooks/useMessageTextStreaming.d.ts +2 -3
  133. package/dist/components/Message/hooks/useMuteHandler.d.ts +5 -7
  134. package/dist/components/Message/hooks/useMuteHandler.js +1 -1
  135. package/dist/components/Message/hooks/useOpenThreadHandler.d.ts +2 -3
  136. package/dist/components/Message/hooks/usePinHandler.d.ts +4 -5
  137. package/dist/components/Message/hooks/usePinHandler.js +1 -1
  138. package/dist/components/Message/hooks/useReactionHandler.d.ts +3 -4
  139. package/dist/components/Message/hooks/useReactionHandler.js +2 -4
  140. package/dist/components/Message/hooks/useReactionsFetcher.d.ts +5 -7
  141. package/dist/components/Message/hooks/useRetryHandler.d.ts +2 -3
  142. package/dist/components/Message/hooks/useRetryHandler.js +1 -1
  143. package/dist/components/Message/hooks/useUserHandler.d.ts +5 -6
  144. package/dist/components/Message/hooks/useUserRole.d.ts +2 -3
  145. package/dist/components/Message/hooks/useUserRole.js +1 -1
  146. package/dist/components/Message/icons.d.ts +2 -2
  147. package/dist/components/Message/icons.js +1 -1
  148. package/dist/components/Message/renderText/componentRenderers/Anchor.d.ts +2 -1
  149. package/dist/components/Message/renderText/componentRenderers/Emoji.d.ts +1 -1
  150. package/dist/components/Message/renderText/componentRenderers/Mention.d.ts +5 -5
  151. package/dist/components/Message/renderText/componentRenderers/Mention.js +1 -1
  152. package/dist/components/Message/renderText/rehypePlugins/mentionsMarkdownPlugin.d.ts +1 -2
  153. package/dist/components/Message/renderText/renderText.d.ts +6 -6
  154. package/dist/components/Message/renderText/types.d.ts +1 -1
  155. package/dist/components/Message/types.d.ts +27 -28
  156. package/dist/components/Message/utils.d.ts +21 -22
  157. package/dist/components/Message/utils.js +5 -4
  158. package/dist/components/MessageActions/CustomMessageActionsList.d.ts +6 -7
  159. package/dist/components/MessageActions/MessageActions.d.ts +6 -5
  160. package/dist/components/MessageActions/MessageActions.js +1 -1
  161. package/dist/components/MessageActions/MessageActionsBox.d.ts +5 -5
  162. package/dist/components/MessageActions/MessageActionsBox.js +4 -3
  163. package/dist/components/MessageActions/hooks/useMessageActionsBoxPopper.d.ts +1 -1
  164. package/dist/components/MessageBounce/MessageBounceModal.d.ts +4 -3
  165. package/dist/components/MessageBounce/MessageBouncePrompt.d.ts +1 -2
  166. package/dist/components/MessageInput/AttachmentPreviewList/AttachmentPreviewList.d.ts +11 -11
  167. package/dist/components/MessageInput/AttachmentPreviewList/AttachmentPreviewList.js +17 -14
  168. package/dist/components/MessageInput/AttachmentPreviewList/FileAttachmentPreview.d.ts +4 -12
  169. package/dist/components/MessageInput/AttachmentPreviewList/FileAttachmentPreview.js +8 -5
  170. package/dist/components/MessageInput/AttachmentPreviewList/ImageAttachmentPreview.d.ts +4 -5
  171. package/dist/components/MessageInput/AttachmentPreviewList/ImageAttachmentPreview.js +2 -2
  172. package/dist/components/MessageInput/AttachmentPreviewList/UnsupportedAttachmentPreview.d.ts +7 -5
  173. package/dist/components/MessageInput/AttachmentPreviewList/UnsupportedAttachmentPreview.js +5 -2
  174. package/dist/components/MessageInput/AttachmentPreviewList/VoiceRecordingPreview.d.ts +4 -5
  175. package/dist/components/MessageInput/AttachmentPreviewList/VoiceRecordingPreview.js +5 -2
  176. package/dist/components/MessageInput/AttachmentPreviewList/index.d.ts +1 -1
  177. package/dist/components/MessageInput/AttachmentPreviewList/types.d.ts +3 -4
  178. package/dist/components/MessageInput/AttachmentSelector.d.ts +1 -2
  179. package/dist/components/MessageInput/AttachmentSelector.js +5 -3
  180. package/dist/components/MessageInput/EditMessageForm.d.ts +3 -2
  181. package/dist/components/MessageInput/EditMessageForm.js +30 -6
  182. package/dist/components/MessageInput/LinkPreviewList.d.ts +6 -4
  183. package/dist/components/MessageInput/LinkPreviewList.js +24 -10
  184. package/dist/components/MessageInput/MessageInput.d.ts +23 -45
  185. package/dist/components/MessageInput/MessageInput.js +24 -17
  186. package/dist/components/MessageInput/MessageInputFlat.d.ts +1 -2
  187. package/dist/components/MessageInput/MessageInputFlat.js +14 -39
  188. package/dist/components/MessageInput/QuotedMessagePreview.d.ts +4 -7
  189. package/dist/components/MessageInput/QuotedMessagePreview.js +22 -16
  190. package/dist/components/MessageInput/SendButton.d.ts +4 -5
  191. package/dist/components/MessageInput/SendButton.js +6 -2
  192. package/dist/components/MessageInput/WithDragAndDropUpload.d.ts +4 -3
  193. package/dist/components/MessageInput/WithDragAndDropUpload.js +20 -9
  194. package/dist/components/MessageInput/hooks/index.d.ts +5 -1
  195. package/dist/components/MessageInput/hooks/index.js +5 -1
  196. package/dist/components/MessageInput/hooks/useAttachmentManagerState.d.ts +10 -0
  197. package/dist/components/MessageInput/hooks/useAttachmentManagerState.js +19 -0
  198. package/dist/components/MessageInput/hooks/useCanCreatePoll.d.ts +1 -0
  199. package/dist/components/MessageInput/hooks/useCanCreatePoll.js +10 -0
  200. package/dist/components/MessageInput/hooks/useCooldownTimer.d.ts +2 -3
  201. package/dist/components/MessageInput/hooks/useCreateMessageInputContext.d.ts +1 -2
  202. package/dist/components/MessageInput/hooks/useCreateMessageInputContext.js +1 -55
  203. package/dist/components/MessageInput/hooks/useMessageComposer.d.ts +2 -0
  204. package/dist/components/MessageInput/hooks/useMessageComposer.js +80 -0
  205. package/dist/components/MessageInput/hooks/useMessageComposerHasSendableData.d.ts +1 -0
  206. package/dist/components/MessageInput/hooks/useMessageComposerHasSendableData.js +8 -0
  207. package/dist/components/MessageInput/hooks/useMessageInputControls.d.ts +12 -0
  208. package/dist/components/MessageInput/hooks/useMessageInputControls.js +23 -0
  209. package/dist/components/MessageInput/hooks/useMessageInputText.d.ts +1 -5
  210. package/dist/components/MessageInput/hooks/useMessageInputText.js +19 -53
  211. package/dist/components/MessageInput/hooks/usePasteHandler.d.ts +1 -3
  212. package/dist/components/MessageInput/hooks/usePasteHandler.js +6 -8
  213. package/dist/components/MessageInput/hooks/useSubmitHandler.d.ts +2 -6
  214. package/dist/components/MessageInput/hooks/useSubmitHandler.js +30 -98
  215. package/dist/components/MessageInput/hooks/utils.d.ts +0 -27
  216. package/dist/components/MessageInput/hooks/utils.js +0 -124
  217. package/dist/components/MessageInput/index.d.ts +0 -2
  218. package/dist/components/MessageInput/index.js +0 -2
  219. package/dist/components/MessageList/ConnectionStatus.d.ts +1 -2
  220. package/dist/components/MessageList/ConnectionStatus.js +1 -1
  221. package/dist/components/MessageList/CustomNotification.d.ts +2 -1
  222. package/dist/components/MessageList/GiphyPreviewMessage.d.ts +4 -5
  223. package/dist/components/MessageList/MessageList.d.ts +11 -12
  224. package/dist/components/MessageList/MessageList.js +4 -4
  225. package/dist/components/MessageList/MessageNotification.d.ts +2 -1
  226. package/dist/components/MessageList/VirtualizedMessageList.d.ts +22 -21
  227. package/dist/components/MessageList/VirtualizedMessageList.js +6 -6
  228. package/dist/components/MessageList/VirtualizedMessageListComponents.d.ts +10 -10
  229. package/dist/components/MessageList/VirtualizedMessageListComponents.js +7 -7
  230. package/dist/components/MessageList/hooks/MessageList/useEnrichedMessages.d.ts +8 -10
  231. package/dist/components/MessageList/hooks/MessageList/useEnrichedMessages.js +1 -1
  232. package/dist/components/MessageList/hooks/MessageList/useMessageListElements.d.ts +11 -12
  233. package/dist/components/MessageList/hooks/MessageList/useMessageListScrollManager.d.ts +4 -5
  234. package/dist/components/MessageList/hooks/MessageList/useScrollLocationLogic.d.ts +5 -6
  235. package/dist/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.d.ts +4 -5
  236. package/dist/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.js +3 -2
  237. package/dist/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.d.ts +4 -5
  238. package/dist/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.js +1 -1
  239. package/dist/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.d.ts +2 -3
  240. package/dist/components/MessageList/hooks/VirtualizedMessageList/usePrependMessagesCount.d.ts +2 -3
  241. package/dist/components/MessageList/hooks/VirtualizedMessageList/usePrependMessagesCount.js +6 -2
  242. package/dist/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.d.ts +4 -5
  243. package/dist/components/MessageList/hooks/VirtualizedMessageList/useShouldForceScrollToBottom.d.ts +2 -3
  244. package/dist/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.d.ts +3 -4
  245. package/dist/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.js +5 -6
  246. package/dist/components/MessageList/hooks/useLastReadData.d.ts +5 -6
  247. package/dist/components/MessageList/hooks/useLastReadData.js +5 -1
  248. package/dist/components/MessageList/hooks/useMarkRead.d.ts +1 -2
  249. package/dist/components/MessageList/renderMessages.d.ts +14 -14
  250. package/dist/components/MessageList/renderMessages.js +8 -7
  251. package/dist/components/MessageList/utils.d.ts +34 -28
  252. package/dist/components/MessageList/utils.js +26 -21
  253. package/dist/components/Modal/Modal.d.ts +2 -1
  254. package/dist/components/Poll/Poll.d.ts +2 -3
  255. package/dist/components/Poll/Poll.js +1 -1
  256. package/dist/components/Poll/PollActions/AddCommentForm.d.ts +1 -2
  257. package/dist/components/Poll/PollActions/AddCommentForm.js +4 -2
  258. package/dist/components/Poll/PollActions/EndPollDialog.d.ts +1 -2
  259. package/dist/components/Poll/PollActions/EndPollDialog.js +1 -1
  260. package/dist/components/Poll/PollActions/PollAction.d.ts +2 -1
  261. package/dist/components/Poll/PollActions/PollActions.d.ts +7 -8
  262. package/dist/components/Poll/PollActions/PollActions.js +5 -5
  263. package/dist/components/Poll/PollActions/PollAnswerList.d.ts +1 -2
  264. package/dist/components/Poll/PollActions/PollOptionsFullList.d.ts +1 -2
  265. package/dist/components/Poll/PollActions/PollOptionsFullList.js +4 -2
  266. package/dist/components/Poll/PollActions/PollResults/PollOptionVotesList.d.ts +3 -4
  267. package/dist/components/Poll/PollActions/PollResults/PollOptionVotesList.js +1 -1
  268. package/dist/components/Poll/PollActions/PollResults/PollOptionWithLatestVotes.d.ts +3 -4
  269. package/dist/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.d.ts +4 -5
  270. package/dist/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.js +1 -1
  271. package/dist/components/Poll/PollActions/PollResults/PollResults.d.ts +1 -2
  272. package/dist/components/Poll/PollActions/PollResults/PollResults.js +1 -1
  273. package/dist/components/Poll/PollActions/SuggestPollOptionForm.d.ts +1 -2
  274. package/dist/components/Poll/PollActions/SuggestPollOptionForm.js +3 -1
  275. package/dist/components/Poll/PollContent.d.ts +1 -2
  276. package/dist/components/Poll/PollCreationDialog/MultipleAnswersField.d.ts +2 -0
  277. package/dist/components/Poll/PollCreationDialog/MultipleAnswersField.js +35 -0
  278. package/dist/components/Poll/PollCreationDialog/NameField.d.ts +2 -0
  279. package/dist/components/Poll/PollCreationDialog/NameField.js +26 -0
  280. package/dist/components/Poll/PollCreationDialog/OptionFieldSet.d.ts +1 -8
  281. package/dist/components/Poll/PollCreationDialog/OptionFieldSet.js +33 -65
  282. package/dist/components/Poll/PollCreationDialog/PollCreationDialog.js +31 -85
  283. package/dist/components/Poll/PollCreationDialog/PollCreationDialogControls.d.ts +1 -4
  284. package/dist/components/Poll/PollCreationDialog/PollCreationDialogControls.js +15 -41
  285. package/dist/components/Poll/PollCreationDialog/types.d.ts +0 -14
  286. package/dist/components/Poll/PollHeader.d.ts +1 -2
  287. package/dist/components/Poll/PollOptionList.d.ts +1 -2
  288. package/dist/components/Poll/PollOptionList.js +4 -2
  289. package/dist/components/Poll/PollOptionSelector.d.ts +3 -4
  290. package/dist/components/Poll/PollVote.d.ts +6 -7
  291. package/dist/components/Poll/PollVote.js +3 -3
  292. package/dist/components/Poll/QuotedPoll.d.ts +1 -2
  293. package/dist/components/Poll/constants.d.ts +0 -1
  294. package/dist/components/Poll/constants.js +0 -1
  295. package/dist/components/Poll/hooks/useManagePollVotesRealtime.d.ts +2 -3
  296. package/dist/components/Poll/hooks/usePollAnswerPagination.d.ts +2 -3
  297. package/dist/components/Poll/hooks/usePollAnswerPagination.js +2 -2
  298. package/dist/components/Poll/hooks/usePollOptionVotesPagination.d.ts +2 -3
  299. package/dist/components/Poll/hooks/usePollOptionVotesPagination.js +1 -1
  300. package/dist/components/Portal/Portal.d.ts +1 -1
  301. package/dist/components/ReactFileUtilities/FileIcon/FileIcon.d.ts +1 -1
  302. package/dist/components/ReactFileUtilities/FileIcon/FileIconSet.d.ts +2 -1
  303. package/dist/components/ReactFileUtilities/FileIcon/iconMap.d.ts +1 -1
  304. package/dist/components/ReactFileUtilities/UploadButton.d.ts +3 -2
  305. package/dist/components/ReactFileUtilities/UploadButton.js +16 -6
  306. package/dist/components/ReactFileUtilities/index.d.ts +0 -1
  307. package/dist/components/ReactFileUtilities/index.js +0 -1
  308. package/dist/components/ReactFileUtilities/utils.d.ts +2 -2
  309. package/dist/components/Reactions/ReactionSelector.d.ts +4 -5
  310. package/dist/components/Reactions/ReactionSelectorWithButton.d.ts +1 -2
  311. package/dist/components/Reactions/ReactionsList.d.ts +6 -7
  312. package/dist/components/Reactions/ReactionsList.js +2 -2
  313. package/dist/components/Reactions/ReactionsListModal.d.ts +9 -10
  314. package/dist/components/Reactions/SimpleReactionsList.d.ts +5 -6
  315. package/dist/components/Reactions/StreamEmoji.d.ts +1 -1
  316. package/dist/components/Reactions/hooks/useFetchReactions.d.ts +9 -10
  317. package/dist/components/Reactions/hooks/useProcessReactions.d.ts +1 -2
  318. package/dist/components/Reactions/types.d.ts +3 -4
  319. package/dist/components/Reactions/utils/utils.d.ts +1 -1
  320. package/dist/components/SafeAnchor/SafeAnchor.d.ts +2 -1
  321. package/dist/components/TextareaComposer/SuggestionList/CommandItem.d.ts +7 -0
  322. package/dist/components/{CommandItem → TextareaComposer/SuggestionList}/CommandItem.js +1 -2
  323. package/dist/components/{EmoticonItem → TextareaComposer/SuggestionList}/EmoticonItem.d.ts +7 -7
  324. package/dist/components/TextareaComposer/SuggestionList/EmoticonItem.js +12 -0
  325. package/dist/components/TextareaComposer/SuggestionList/SuggestionList.d.ts +14 -0
  326. package/dist/components/TextareaComposer/SuggestionList/SuggestionList.js +50 -0
  327. package/dist/components/TextareaComposer/SuggestionList/SuggestionListItem.d.ts +18 -0
  328. package/dist/components/TextareaComposer/SuggestionList/SuggestionListItem.js +24 -0
  329. package/dist/components/{UserItem → TextareaComposer/SuggestionList}/UserItem.d.ts +7 -4
  330. package/dist/components/TextareaComposer/SuggestionList/UserItem.js +24 -0
  331. package/dist/components/TextareaComposer/SuggestionList/index.d.ts +5 -0
  332. package/dist/components/TextareaComposer/SuggestionList/index.js +5 -0
  333. package/dist/components/TextareaComposer/TextareaComposer.d.ts +13 -0
  334. package/dist/components/TextareaComposer/TextareaComposer.js +155 -0
  335. package/dist/components/TextareaComposer/index.d.ts +2 -0
  336. package/dist/components/TextareaComposer/index.js +2 -0
  337. package/dist/components/Thread/Thread.d.ts +13 -10
  338. package/dist/components/Thread/Thread.js +23 -12
  339. package/dist/components/Thread/ThreadHead.d.ts +2 -3
  340. package/dist/components/Thread/ThreadHeader.d.ts +5 -6
  341. package/dist/components/Thread/ThreadHeader.js +1 -1
  342. package/dist/components/Threads/ThreadContext.d.ts +2 -2
  343. package/dist/components/Threads/ThreadContext.js +1 -4
  344. package/dist/components/Threads/ThreadList/ThreadList.d.ts +1 -1
  345. package/dist/components/Threads/ThreadList/ThreadListItem.d.ts +1 -1
  346. package/dist/components/Threads/hooks/useThreadManagerState.d.ts +1 -1
  347. package/dist/components/Threads/hooks/useThreadState.d.ts +1 -1
  348. package/dist/components/Threads/icons.d.ts +1 -1
  349. package/dist/components/Tooltip/Tooltip.d.ts +3 -2
  350. package/dist/components/Tooltip/hooks/useEnterLeaveHandlers.d.ts +1 -1
  351. package/dist/components/TypingIndicator/TypingIndicator.d.ts +1 -2
  352. package/dist/components/Window/Window.d.ts +6 -6
  353. package/dist/components/index.d.ts +1 -5
  354. package/dist/components/index.js +1 -5
  355. package/dist/context/AttachmentSelectorContext.d.ts +2 -1
  356. package/dist/context/ChannelActionContext.d.ts +26 -35
  357. package/dist/context/ChannelListContext.d.ts +9 -9
  358. package/dist/context/ChannelListContext.js +1 -1
  359. package/dist/context/ChannelStateContext.d.ts +24 -34
  360. package/dist/context/ChatContext.d.ts +18 -17
  361. package/dist/context/ComponentContext.d.ts +39 -37
  362. package/dist/context/DialogManagerContext.d.ts +2 -1
  363. package/dist/context/MessageBounceContext.d.ts +8 -7
  364. package/dist/context/MessageBounceContext.js +1 -1
  365. package/dist/context/MessageContext.d.ts +23 -23
  366. package/dist/context/MessageInputContext.d.ts +8 -26
  367. package/dist/context/MessageListContext.d.ts +2 -1
  368. package/dist/context/PollContext.d.ts +8 -8
  369. package/dist/context/TranslationContext.d.ts +2 -1
  370. package/dist/context/TypingContext.d.ts +11 -10
  371. package/dist/context/VirtualizedMessageListContext.d.ts +2 -1
  372. package/dist/context/WithComponents.d.ts +3 -2
  373. package/dist/css/v2/index.css +1 -1
  374. package/dist/css/v2/index.layout.css +1 -1
  375. package/dist/experimental/MessageActions/MessageActions.d.ts +1 -1
  376. package/dist/experimental/MessageActions/MessageActions.js +1 -1
  377. package/dist/experimental/MessageActions/defaults.js +4 -3
  378. package/dist/experimental/Search/Search.d.ts +1 -2
  379. package/dist/experimental/Search/SearchContext.d.ts +8 -8
  380. package/dist/experimental/Search/SearchResults/SearchResultItem.d.ts +11 -11
  381. package/dist/experimental/Search/SearchResults/SearchResultItem.js +3 -3
  382. package/dist/experimental/Search/SearchResults/SearchResults.d.ts +1 -2
  383. package/dist/experimental/Search/SearchResults/SearchResultsHeader.d.ts +1 -2
  384. package/dist/experimental/Search/SearchResults/SearchResultsHeader.js +1 -1
  385. package/dist/experimental/Search/SearchResults/SearchSourceResultList.d.ts +2 -3
  386. package/dist/experimental/Search/SearchResults/SearchSourceResultListFooter.d.ts +1 -2
  387. package/dist/experimental/Search/SearchResults/SearchSourceResults.d.ts +1 -2
  388. package/dist/experimental/Search/SearchResults/SearchSourceResults.js +1 -1
  389. package/dist/experimental/Search/SearchSourceResultsContext.d.ts +2 -1
  390. package/dist/experimental/Search/hooks/useSearchFocusedMessage.d.ts +1 -2
  391. package/dist/experimental/Search/hooks/useSearchFocusedMessage.js +3 -1
  392. package/dist/experimental/Search/hooks/useSearchQueriesInProgress.d.ts +3 -4
  393. package/dist/experimental/index.browser.cjs +1139 -1075
  394. package/dist/experimental/index.browser.cjs.map +4 -4
  395. package/dist/experimental/index.node.cjs +1139 -1075
  396. package/dist/experimental/index.node.cjs.map +4 -4
  397. package/dist/i18n/Streami18n.d.ts +1 -1
  398. package/dist/i18n/types.d.ts +2 -2
  399. package/dist/i18n/utils.d.ts +1 -1
  400. package/dist/i18n/utils.js +3 -1
  401. package/dist/index.browser.cjs +28513 -30641
  402. package/dist/index.browser.cjs.map +4 -4
  403. package/dist/index.node.cjs +30740 -32877
  404. package/dist/index.node.cjs.map +4 -4
  405. package/dist/plugins/Emojis/index.browser.cjs +133 -2
  406. package/dist/plugins/Emojis/index.browser.cjs.map +4 -4
  407. package/dist/plugins/Emojis/index.d.ts +1 -0
  408. package/dist/plugins/Emojis/index.js +1 -0
  409. package/dist/plugins/Emojis/index.node.cjs +135 -3
  410. package/dist/plugins/Emojis/index.node.cjs.map +4 -4
  411. package/dist/plugins/Emojis/middleware/index.d.ts +1 -0
  412. package/dist/plugins/Emojis/middleware/index.js +1 -0
  413. package/dist/plugins/Emojis/middleware/textComposerEmojiMiddleware.d.ts +66 -0
  414. package/dist/plugins/Emojis/middleware/textComposerEmojiMiddleware.js +143 -0
  415. package/dist/plugins/encoders/mp3.browser.cjs.map +2 -2
  416. package/dist/plugins/encoders/mp3.node.cjs.map +2 -2
  417. package/dist/scss/v2/Autocomplete/Autocomplete-layout.scss +14 -0
  418. package/dist/scss/v2/Autocomplete/Autocomplete-theme.scss +11 -0
  419. package/dist/scss/v2/LinkPreview/LinkPreview-layout.scss +18 -0
  420. package/dist/scss/v2/LinkPreview/LinkPreview-theme.scss +15 -0
  421. package/dist/types/defaultDataInterfaces.d.ts +25 -0
  422. package/dist/types/index.d.ts +2 -1
  423. package/dist/types/types.d.ts +2 -62
  424. package/dist/utils/getChannel.d.ts +5 -6
  425. package/dist/utils/mergeDeep.d.ts +2 -3
  426. package/package.json +5 -5
  427. package/dist/components/AutoCompleteTextarea/Item.d.ts +0 -2
  428. package/dist/components/AutoCompleteTextarea/Item.js +0 -10
  429. package/dist/components/AutoCompleteTextarea/List.d.ts +0 -17
  430. package/dist/components/AutoCompleteTextarea/List.js +0 -89
  431. package/dist/components/AutoCompleteTextarea/Textarea.d.ts +0 -114
  432. package/dist/components/AutoCompleteTextarea/Textarea.js +0 -593
  433. package/dist/components/AutoCompleteTextarea/index.d.ts +0 -4
  434. package/dist/components/AutoCompleteTextarea/index.js +0 -4
  435. package/dist/components/AutoCompleteTextarea/types.d.ts +0 -15
  436. package/dist/components/AutoCompleteTextarea/utils.d.ts +0 -6
  437. package/dist/components/AutoCompleteTextarea/utils.js +0 -40
  438. package/dist/components/ChatAutoComplete/ChatAutoComplete.d.ts +0 -78
  439. package/dist/components/ChatAutoComplete/ChatAutoComplete.js +0 -33
  440. package/dist/components/ChatAutoComplete/index.d.ts +0 -1
  441. package/dist/components/ChatAutoComplete/index.js +0 -1
  442. package/dist/components/CommandItem/CommandItem.d.ts +0 -12
  443. package/dist/components/CommandItem/index.d.ts +0 -1
  444. package/dist/components/CommandItem/index.js +0 -1
  445. package/dist/components/EmoticonItem/EmoticonItem.js +0 -16
  446. package/dist/components/EmoticonItem/index.d.ts +0 -1
  447. package/dist/components/EmoticonItem/index.js +0 -1
  448. package/dist/components/MessageInput/DefaultTriggerProvider.d.ts +0 -35
  449. package/dist/components/MessageInput/DefaultTriggerProvider.js +0 -24
  450. package/dist/components/MessageInput/DropzoneProvider.d.ts +0 -4
  451. package/dist/components/MessageInput/DropzoneProvider.js +0 -23
  452. package/dist/components/MessageInput/hooks/useAttachments.d.ts +0 -14
  453. package/dist/components/MessageInput/hooks/useAttachments.js +0 -209
  454. package/dist/components/MessageInput/hooks/useCommandTrigger.d.ts +0 -3
  455. package/dist/components/MessageInput/hooks/useCommandTrigger.js +0 -62
  456. package/dist/components/MessageInput/hooks/useEmojiTrigger.d.ts +0 -3
  457. package/dist/components/MessageInput/hooks/useEmojiTrigger.js +0 -29
  458. package/dist/components/MessageInput/hooks/useLinkPreviews.d.ts +0 -30
  459. package/dist/components/MessageInput/hooks/useLinkPreviews.js +0 -109
  460. package/dist/components/MessageInput/hooks/useMessageInputState.d.ts +0 -71
  461. package/dist/components/MessageInput/hooks/useMessageInputState.js +0 -200
  462. package/dist/components/MessageInput/hooks/useUserTrigger.d.ts +0 -12
  463. package/dist/components/MessageInput/hooks/useUserTrigger.js +0 -130
  464. package/dist/components/MessageInput/types.d.ts +0 -87
  465. package/dist/components/MessageInput/types.js +0 -19
  466. package/dist/components/ReactFileUtilities/ImageDropzone.d.ts +0 -16
  467. package/dist/components/ReactFileUtilities/ImageDropzone.js +0 -42
  468. package/dist/components/UserItem/UserItem.js +0 -26
  469. package/dist/components/UserItem/index.d.ts +0 -1
  470. package/dist/components/UserItem/index.js +0 -1
  471. /package/dist/components/{MessageInput → MediaRecorder/AudioRecorder}/hooks/useTimeElapsed.d.ts +0 -0
  472. /package/dist/components/{MessageInput → MediaRecorder/AudioRecorder}/hooks/useTimeElapsed.js +0 -0
  473. /package/dist/{components/AutoCompleteTextarea/types.js → types/defaultDataInterfaces.js} +0 -0
@@ -1,20 +1,44 @@
1
- import React, { useEffect } from 'react';
1
+ import React, { useCallback, useEffect } from 'react';
2
+ import { MessageInput } from './MessageInput';
2
3
  import { MessageInputFlat } from './MessageInputFlat';
3
- import { useMessageInputContext, useTranslationContext } from '../../context';
4
+ import { Modal } from '../Modal';
5
+ import { useComponentContext, useMessageContext, useMessageInputContext, useTranslationContext, } from '../../context';
6
+ import { useMessageComposer, useMessageComposerHasSendableData } from './hooks';
7
+ const EditMessageFormSendButton = () => {
8
+ const { t } = useTranslationContext();
9
+ const hasSendableData = useMessageComposerHasSendableData();
10
+ return (React.createElement("button", { className: 'str-chat__edit-message-send', "data-testid": 'send-button-edit-form', disabled: !hasSendableData, type: 'submit' }, t('Send')));
11
+ };
4
12
  export const EditMessageForm = () => {
5
13
  const { t } = useTranslationContext('EditMessageForm');
14
+ const messageComposer = useMessageComposer();
6
15
  const { clearEditingState, handleSubmit } = useMessageInputContext('EditMessageForm');
16
+ const cancel = useCallback(() => {
17
+ clearEditingState?.();
18
+ messageComposer.restore();
19
+ }, [clearEditingState, messageComposer]);
7
20
  useEffect(() => {
8
21
  const onKeyDown = (event) => {
9
22
  if (event.key === 'Escape')
10
- clearEditingState?.();
23
+ cancel();
11
24
  };
12
25
  document.addEventListener('keydown', onKeyDown);
13
26
  return () => document.removeEventListener('keydown', onKeyDown);
14
- }, [clearEditingState]);
27
+ }, [cancel]);
15
28
  return (React.createElement("form", { autoComplete: 'off', className: 'str-chat__edit-message-form', onSubmit: handleSubmit },
16
29
  React.createElement(MessageInputFlat, null),
17
30
  React.createElement("div", { className: 'str-chat__edit-message-form-options' },
18
- React.createElement("button", { className: 'str-chat__edit-message-cancel', "data-testid": 'cancel-button', onClick: clearEditingState }, t('Cancel')),
19
- React.createElement("button", { className: 'str-chat__edit-message-send', "data-testid": 'send-button-edit-form', type: 'submit' }, t('Send')))));
31
+ React.createElement("button", { className: 'str-chat__edit-message-cancel', "data-testid": 'cancel-button', onClick: cancel }, t('Cancel')),
32
+ React.createElement(EditMessageFormSendButton, null))));
33
+ };
34
+ export const EditMessageModal = ({ additionalMessageInputProps, }) => {
35
+ const { EditMessageInput = EditMessageForm } = useComponentContext();
36
+ const { clearEditingState } = useMessageContext();
37
+ const messageComposer = useMessageComposer();
38
+ const onEditModalClose = useCallback(() => {
39
+ clearEditingState();
40
+ messageComposer.restore();
41
+ }, [clearEditingState, messageComposer]);
42
+ return (React.createElement(Modal, { className: 'str-chat__edit-message-modal', onClose: onEditModalClose, open: true },
43
+ React.createElement(MessageInput, { clearEditingState: clearEditingState, grow: true, hideSendButton: true, Input: EditMessageInput, ...additionalMessageInputProps })));
20
44
  };
@@ -1,6 +1,8 @@
1
1
  import React from 'react';
2
- import type { LinkPreview } from './types';
3
- export type LinkPreviewListProps = {
4
- linkPreviews: LinkPreview[];
2
+ import type { LinkPreview } from 'stream-chat';
3
+ export declare const LinkPreviewList: () => React.JSX.Element | null;
4
+ type LinkPreviewProps = {
5
+ linkPreview: LinkPreview;
5
6
  };
6
- export declare const LinkPreviewList: ({ linkPreviews }: LinkPreviewListProps) => React.JSX.Element | null;
7
+ export declare const LinkPreviewCard: ({ linkPreview }: LinkPreviewProps) => React.JSX.Element | null;
8
+ export {};
@@ -1,23 +1,37 @@
1
1
  import clsx from 'clsx';
2
2
  import React, { useState } from 'react';
3
- import { useChannelStateContext, useMessageInputContext } from '../../context';
4
- import { LinkPreviewState } from './types';
5
- import { CloseIcon, LinkIcon } from './icons';
3
+ import { LinkPreviewsManager } from 'stream-chat';
4
+ import { useStateStore } from '../../store';
6
5
  import { PopperTooltip } from '../Tooltip';
7
6
  import { useEnterLeaveHandlers } from '../Tooltip/hooks';
8
- export const LinkPreviewList = ({ linkPreviews }) => {
9
- const { quotedMessage } = useChannelStateContext();
7
+ import { useMessageComposer } from './hooks';
8
+ import { CloseIcon, LinkIcon } from './icons';
9
+ const linkPreviewsManagerStateSelector = (state) => ({
10
+ linkPreviews: Array.from(state.previews.values()).filter((preview) => LinkPreviewsManager.previewIsLoaded(preview) ||
11
+ LinkPreviewsManager.previewIsLoading(preview)),
12
+ });
13
+ const messageComposerStateSelector = (state) => ({
14
+ quotedMessage: state.quotedMessage,
15
+ });
16
+ export const LinkPreviewList = () => {
17
+ const messageComposer = useMessageComposer();
18
+ const { linkPreviewsManager } = messageComposer;
19
+ const { quotedMessage } = useStateStore(messageComposer.state, messageComposerStateSelector);
20
+ const { linkPreviews } = useStateStore(linkPreviewsManager.state, linkPreviewsManagerStateSelector);
10
21
  const showLinkPreviews = linkPreviews.length > 0 && !quotedMessage;
11
22
  if (!showLinkPreviews)
12
23
  return null;
13
- return (React.createElement("div", { className: 'str-chat__link-preview-list' }, Array.from(linkPreviews.values()).map((linkPreview) => linkPreview.state === LinkPreviewState.LOADED ? (React.createElement(LinkPreviewCard, { key: linkPreview.og_scrape_url, linkPreview: linkPreview })) : null)));
24
+ return (React.createElement("div", { className: 'str-chat__link-preview-list' }, linkPreviews.map((linkPreview) => (React.createElement(LinkPreviewCard, { key: linkPreview.og_scrape_url, linkPreview: linkPreview })))));
14
25
  };
15
- const LinkPreviewCard = ({ linkPreview }) => {
16
- const { dismissLinkPreview } = useMessageInputContext();
26
+ export const LinkPreviewCard = ({ linkPreview }) => {
27
+ const { linkPreviewsManager } = useMessageComposer();
17
28
  const { handleEnter, handleLeave, tooltipVisible } = useEnterLeaveHandlers();
18
29
  const [referenceElement, setReferenceElement] = useState(null);
30
+ if (!LinkPreviewsManager.previewIsLoaded(linkPreview) &&
31
+ !LinkPreviewsManager.previewIsLoading(linkPreview))
32
+ return null;
19
33
  return (React.createElement("div", { className: clsx('str-chat__link-preview-card', {
20
- 'str-chat__link-preview-card--loading': linkPreview.state === LinkPreviewState.LOADING,
34
+ 'str-chat__link-preview-card--loading': LinkPreviewsManager.previewIsLoading(linkPreview),
21
35
  }), "data-testid": 'link-preview-card' },
22
36
  React.createElement(PopperTooltip, { offset: [0, 5], referenceElement: referenceElement, visible: tooltipVisible }, linkPreview.og_scrape_url),
23
37
  React.createElement("div", { className: 'str-chat__link-preview-card__icon-container', onMouseEnter: handleEnter, onMouseLeave: handleLeave, ref: setReferenceElement },
@@ -25,6 +39,6 @@ const LinkPreviewCard = ({ linkPreview }) => {
25
39
  React.createElement("div", { className: 'str-chat__link-preview-card__content' },
26
40
  React.createElement("div", { className: 'str-chat__link-preview-card__content-title' }, linkPreview.title),
27
41
  React.createElement("div", { className: 'str-chat__link-preview-card__content-description' }, linkPreview.text)),
28
- React.createElement("button", { className: 'str-chat__link-preview-card__dismiss-button', "data-testid": 'link-preview-card-dismiss-btn', onClick: () => dismissLinkPreview(linkPreview) },
42
+ React.createElement("button", { className: 'str-chat__link-preview-card__dismiss-button', "data-testid": 'link-preview-card-dismiss-btn', onClick: () => linkPreviewsManager.dismissPreview(linkPreview.og_scrape_url), type: 'button' },
29
43
  React.createElement(CloseIcon, null))));
30
44
  };
@@ -1,12 +1,6 @@
1
1
  import React from 'react';
2
- import { StreamMessage } from '../../context/ChannelStateContext';
3
- import { ComponentContextValue } from '../../context/ComponentContext';
4
- import type { Channel, Message, SendFileAPIResponse } from 'stream-chat';
5
- import type { BaseLocalAttachmentMetadata, LocalAttachmentUploadMetadata } from './types';
6
- import type { SearchQueryParams } from '../ChannelSearch/hooks/useChannelSearch';
7
- import type { MessageToSend } from '../../context/ChannelActionContext';
8
- import type { CustomTrigger, DefaultStreamChatGenerics, SendMessageOptions, UnknownType } from '../../types/types';
9
- import type { URLEnrichmentConfig } from './hooks/useLinkPreviews';
2
+ import type { ComponentContextValue } from '../../context/ComponentContext';
3
+ import type { LocalMessage, Message, SendMessageOptions } from 'stream-chat';
10
4
  import type { CustomAudioRecordingConfig } from '../MediaRecorder';
11
5
  export type EmojiSearchIndexResult = {
12
6
  id: string;
@@ -17,12 +11,16 @@ export type EmojiSearchIndexResult = {
17
11
  emoticons?: Array<string>;
18
12
  native?: string;
19
13
  };
20
- export interface EmojiSearchIndex<T extends UnknownType = UnknownType> {
21
- search: (query: string) => PromiseLike<Array<EmojiSearchIndexResult & T>> | Array<EmojiSearchIndexResult & T> | null;
14
+ export interface EmojiSearchIndex {
15
+ search: (query: string) => PromiseLike<Array<EmojiSearchIndexResult>> | Array<EmojiSearchIndexResult> | null;
22
16
  }
23
- export type MessageInputProps<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics, V extends CustomTrigger = CustomTrigger> = {
24
- /** Additional props to be passed to the underlying `AutoCompleteTextarea` component, [available props](https://www.npmjs.com/package/react-textarea-autosize) */
25
- additionalTextareaProps?: React.TextareaHTMLAttributes<HTMLTextAreaElement>;
17
+ export type MessageInputProps = {
18
+ /**
19
+ * Additional props to be passed to the underlying `AutoCompleteTextarea` component.
20
+ * Default value is handled via MessageComposer.
21
+ * [Available props](https://www.npmjs.com/package/react-textarea-autosize)
22
+ */
23
+ additionalTextareaProps?: Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'defaultValue'>;
26
24
  /**
27
25
  * When enabled, recorded messages won’t be sent immediately.
28
26
  * Instead, they will “stack up” with other attachments in the message composer allowing the user to send multiple attachments as part of the same message.
@@ -34,64 +32,44 @@ export type MessageInputProps<StreamChatGenerics extends DefaultStreamChatGeneri
34
32
  audioRecordingEnabled?: boolean;
35
33
  /** Function to clear the editing state while editing a message */
36
34
  clearEditingState?: () => void;
37
- /** If true, disables the text input */
38
- disabled?: boolean;
39
- /** If true, the suggestion list will not display and autocomplete @mentions. Default: false. */
40
- disableMentions?: boolean;
41
- /** Function to override the default file upload request */
42
- doFileUploadRequest?: (file: LocalAttachmentUploadMetadata['file'], channel: Channel<StreamChatGenerics>) => Promise<SendFileAPIResponse>;
43
- /** Function to override the default image upload request */
44
- doImageUploadRequest?: (file: LocalAttachmentUploadMetadata['file'], channel: Channel<StreamChatGenerics>) => Promise<SendFileAPIResponse>;
45
35
  /** Mechanism to be used with autocomplete and text replace features of the `MessageInput` component, see [emoji-mart `SearchIndex`](https://github.com/missive/emoji-mart#%EF%B8%8F%EF%B8%8F-headless-search) */
46
36
  emojiSearchIndex?: ComponentContextValue['emojiSearchIndex'];
47
- /** Custom error handler function to be called with a file/image upload fails */
48
- errorHandler?: (error: Error, type: string, file: LocalAttachmentUploadMetadata['file'] & BaseLocalAttachmentMetadata) => void;
49
37
  /** If true, focuses the text input on component mount */
50
38
  focus?: boolean;
51
- /** Generates the default value for the underlying textarea element. The function's return value takes precedence before additionalTextareaProps.defaultValue. */
52
- getDefaultValue?: () => string | string[];
53
39
  /** If true, expands the text input vertically for new lines */
54
40
  grow?: boolean;
55
41
  /** Allows to hide MessageInput's send button. */
56
42
  hideSendButton?: boolean;
57
43
  /** Custom UI component handling how the message input is rendered, defaults to and accepts the same props as [MessageInputFlat](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/MessageInputFlat.tsx) */
58
- Input?: React.ComponentType<MessageInputProps<StreamChatGenerics, V>>;
44
+ Input?: React.ComponentType<MessageInputProps>;
59
45
  /** Signals that the MessageInput is rendered in a message thread (Thread component) */
60
46
  isThreadInput?: boolean;
61
47
  /** Max number of rows the underlying `textarea` component is allowed to grow */
62
48
  maxRows?: number;
63
- /** If true, the suggestion list will search all app users for an @mention, not just current channel members/watchers. Default: false. */
64
- mentionAllAppUsers?: boolean;
65
- /** Object containing filters/sort/options overrides for an @mention user query */
66
- mentionQueryParams?: SearchQueryParams<StreamChatGenerics>['userFilters'];
67
- /** If provided, the existing message will be edited on submit */
68
- message?: StreamMessage<StreamChatGenerics>;
69
49
  /** Min number of rows the underlying `textarea` will start with. The `grow` on MessageInput prop has to be enabled for `minRows` to take effect. */
70
50
  minRows?: number;
71
- /** If true, disables file uploads for all attachments except for those with type 'image'. Default: false */
72
- noFiles?: boolean;
73
- /** Function to override the default submit handler */
74
- overrideSubmitHandler?: (message: MessageToSend<StreamChatGenerics>, channelCid: string, customMessageData?: Partial<Message<StreamChatGenerics>>, options?: SendMessageOptions) => Promise<void> | void;
51
+ /** Function to override the default message sending process. Not message updating process. */
52
+ overrideSubmitHandler?: (params: {
53
+ cid: string;
54
+ localMessage: LocalMessage;
55
+ message: Message;
56
+ sendOptions: SendMessageOptions;
57
+ }) => Promise<void> | void;
75
58
  /** When replying in a thread, the parent message object */
76
- parent?: StreamMessage<StreamChatGenerics>;
77
- /** If true, triggers typing events on text input keystroke */
78
- publishTypingEvent?: boolean;
59
+ parent?: LocalMessage;
79
60
  /** If true, will use an optional dependency to support transliteration in the input for mentions, default is false. See: https://github.com/getstream/transliterate */
80
61
  /**
81
62
  * Currently, `Enter` is the default submission key and `Shift`+`Enter` is the default combination for the new line.
82
63
  * If specified, this function overrides the default behavior specified previously.
83
64
  *
84
- * Example of default behaviour:
65
+ * Example of default behavior:
85
66
  * ```tsx
86
67
  * const defaultShouldSubmit = (event) => event.key === "Enter" && !event.shiftKey;
87
68
  * ```
88
69
  */
89
- shouldSubmit?: (event: KeyboardEvent) => boolean;
90
- /** Configuration parameters for link previews. */
91
- urlEnrichmentConfig?: URLEnrichmentConfig;
92
- useMentionsTransliteration?: boolean;
70
+ shouldSubmit?: (event: React.KeyboardEvent<HTMLTextAreaElement>) => boolean;
93
71
  };
94
72
  /**
95
73
  * A high level component that has provides all functionality to the Input it renders.
96
74
  */
97
- export declare const MessageInput: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics, V extends CustomTrigger = CustomTrigger>(props: MessageInputProps<StreamChatGenerics, V>) => React.JSX.Element;
75
+ export declare const MessageInput: (props: MessageInputProps) => React.JSX.Element;
@@ -1,44 +1,51 @@
1
- import React from 'react';
2
- import { DefaultTriggerProvider } from './DefaultTriggerProvider';
1
+ import React, { useEffect } from 'react';
3
2
  import { MessageInputFlat } from './MessageInputFlat';
3
+ import { useMessageComposer } from './hooks';
4
4
  import { useCooldownTimer } from './hooks/useCooldownTimer';
5
5
  import { useCreateMessageInputContext } from './hooks/useCreateMessageInputContext';
6
- import { useMessageInputState } from './hooks/useMessageInputState';
7
- import { useChannelStateContext } from '../../context/ChannelStateContext';
8
- import { useComponentContext, } from '../../context/ComponentContext';
6
+ import { useMessageInputControls } from './hooks/useMessageInputControls';
7
+ import { useComponentContext } from '../../context/ComponentContext';
9
8
  import { MessageInputContextProvider } from '../../context/MessageInputContext';
10
9
  import { DialogManagerProvider } from '../../context';
11
10
  import { useRegisterDropHandlers } from './WithDragAndDropUpload';
12
11
  const MessageInputProvider = (props) => {
13
12
  const cooldownTimerState = useCooldownTimer();
14
- const messageInputState = useMessageInputState(props);
13
+ const messageInputUiApi = useMessageInputControls(props);
15
14
  const { emojiSearchIndex } = useComponentContext('MessageInput');
16
15
  const messageInputContextValue = useCreateMessageInputContext({
17
16
  ...cooldownTimerState,
18
- ...messageInputState,
17
+ ...messageInputUiApi,
19
18
  ...props,
20
19
  emojiSearchIndex: props.emojiSearchIndex ?? emojiSearchIndex,
21
20
  });
22
- // @ts-expect-error generics to be removed
23
- useRegisterDropHandlers(messageInputContextValue);
21
+ const messageComposer = useMessageComposer();
22
+ useEffect(() => () => {
23
+ messageComposer.createDraft();
24
+ }, [messageComposer]);
25
+ useEffect(() => {
26
+ const threadId = messageComposer.threadId;
27
+ if (!threadId || !messageComposer.channel || !messageComposer.compositionIsEmpty)
28
+ return;
29
+ // get draft data for legacy thead composer
30
+ messageComposer.channel.getDraft({ parent_id: threadId }).then(({ draft }) => {
31
+ if (draft) {
32
+ messageComposer.initState({ composition: draft });
33
+ }
34
+ });
35
+ }, [messageComposer]);
36
+ useRegisterDropHandlers();
24
37
  return (React.createElement(MessageInputContextProvider, { value: messageInputContextValue }, props.children));
25
38
  };
26
39
  const UnMemoizedMessageInput = (props) => {
27
40
  const { Input: PropInput } = props;
28
- const { dragAndDropWindow } = useChannelStateContext();
29
- const { Input: ContextInput, TriggerProvider = DefaultTriggerProvider } = useComponentContext('MessageInput');
41
+ const { Input: ContextInput } = useComponentContext('MessageInput');
30
42
  const Input = PropInput || ContextInput || MessageInputFlat;
31
43
  const dialogManagerId = props.isThreadInput
32
44
  ? 'message-input-dialog-manager-thread'
33
45
  : 'message-input-dialog-manager';
34
- if (dragAndDropWindow)
35
- return (React.createElement(DialogManagerProvider, { id: dialogManagerId },
36
- React.createElement(TriggerProvider, null,
37
- React.createElement(Input, null))));
38
46
  return (React.createElement(DialogManagerProvider, { id: dialogManagerId },
39
47
  React.createElement(MessageInputProvider, { ...props },
40
- React.createElement(TriggerProvider, null,
41
- React.createElement(Input, null)))));
48
+ React.createElement(Input, null))));
42
49
  };
43
50
  /**
44
51
  * A high level component that has provides all functionality to the Input it renders.
@@ -1,3 +1,2 @@
1
1
  import React from 'react';
2
- import type { DefaultStreamChatGenerics } from '../../types/types';
3
- export declare const MessageInputFlat: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>() => React.JSX.Element;
2
+ export declare const MessageInputFlat: () => React.JSX.Element;
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useEffect, useMemo, useState } from 'react';
1
+ import React, { useCallback, useState } from 'react';
2
2
  import { AttachmentSelector as DefaultAttachmentSelector, SimpleAttachmentSelector, } from './AttachmentSelector';
3
3
  import { AttachmentPreviewList as DefaultAttachmentPreviewList } from './AttachmentPreviewList';
4
4
  import { CooldownTimer as DefaultCooldownTimer } from './CooldownTimer';
@@ -7,20 +7,19 @@ import { StopAIGenerationButton as DefaultStopAIGenerationButton } from './StopA
7
7
  import { AudioRecorder as DefaultAudioRecorder, RecordingPermissionDeniedNotification as DefaultRecordingPermissionDeniedNotification, StartRecordingAudioButton as DefaultStartRecordingAudioButton, RecordingPermission, } from '../MediaRecorder';
8
8
  import { QuotedMessagePreview as DefaultQuotedMessagePreview, QuotedMessagePreviewHeader, } from './QuotedMessagePreview';
9
9
  import { LinkPreviewList as DefaultLinkPreviewList } from './LinkPreviewList';
10
- import { ChatAutoComplete } from '../ChatAutoComplete/ChatAutoComplete';
10
+ import { TextareaComposer } from '../TextareaComposer';
11
+ import { AIStates, useAIState } from '../AIStateIndicator';
11
12
  import { RecordingAttachmentType } from '../MediaRecorder/classes';
12
13
  import { useChatContext } from '../../context/ChatContext';
13
- import { useChannelActionContext } from '../../context/ChannelActionContext';
14
- import { useChannelStateContext } from '../../context/ChannelStateContext';
15
14
  import { useMessageInputContext } from '../../context/MessageInputContext';
16
15
  import { useComponentContext } from '../../context/ComponentContext';
17
- import { AIStates, useAIState } from '../AIStateIndicator';
16
+ import { useAttachmentManagerState } from './hooks/useAttachmentManagerState';
17
+ import { useMessageContext } from '../../context';
18
18
  import { WithDragAndDropUpload } from './WithDragAndDropUpload';
19
19
  export const MessageInputFlat = () => {
20
- const { asyncMessagesMultiSendEnabled, attachments, cooldownRemaining, findAndEnqueueURLsToEnrich, handleSubmit, hideSendButton, isUploadEnabled, linkPreviews, message, numberOfUploads, parent, recordingController, setCooldownRemaining, text, } = useMessageInputContext('MessageInputFlat');
20
+ const { message } = useMessageContext();
21
+ const { asyncMessagesMultiSendEnabled, cooldownRemaining, handleSubmit, hideSendButton, recordingController, setCooldownRemaining, } = useMessageInputContext('MessageInputFlat');
21
22
  const { AttachmentPreviewList = DefaultAttachmentPreviewList, AttachmentSelector = message ? SimpleAttachmentSelector : DefaultAttachmentSelector, AudioRecorder = DefaultAudioRecorder, CooldownTimer = DefaultCooldownTimer, EmojiPicker, LinkPreviewList = DefaultLinkPreviewList, QuotedMessagePreview = DefaultQuotedMessagePreview, RecordingPermissionDeniedNotification = DefaultRecordingPermissionDeniedNotification, SendButton = DefaultSendButton, StartRecordingAudioButton = DefaultStartRecordingAudioButton, StopAIGenerationButton: StopAIGenerationButtonOverride, } = useComponentContext('MessageInputFlat');
22
- const { quotedMessage } = useChannelStateContext('MessageInputFlat');
23
- const { setQuotedMessage } = useChannelActionContext('MessageInputFlat');
24
23
  const { channel } = useChatContext('MessageInputFlat');
25
24
  const { aiState } = useAIState(channel);
26
25
  const stopGenerating = useCallback(() => channel?.stopAIResponse(), [channel]);
@@ -28,30 +27,9 @@ export const MessageInputFlat = () => {
28
27
  const closePermissionDeniedNotification = useCallback(() => {
29
28
  setShowRecordingPermissionDeniedNotification(false);
30
29
  }, []);
31
- const failedUploadsCount = useMemo(() => attachments.filter((a) => a.localMetadata?.uploadState === 'failed').length, [attachments]);
32
- useEffect(() => {
33
- const handleQuotedMessageUpdate = (e) => {
34
- if (e.message?.id !== quotedMessage?.id)
35
- return;
36
- if (e.type === 'message.deleted') {
37
- setQuotedMessage(undefined);
38
- return;
39
- }
40
- setQuotedMessage(e.message);
41
- };
42
- channel?.on('message.deleted', handleQuotedMessageUpdate);
43
- channel?.on('message.updated', handleQuotedMessageUpdate);
44
- return () => {
45
- channel?.off('message.deleted', handleQuotedMessageUpdate);
46
- channel?.off('message.updated', handleQuotedMessageUpdate);
47
- };
48
- // eslint-disable-next-line react-hooks/exhaustive-deps
49
- }, [channel, quotedMessage]);
30
+ const { attachments } = useAttachmentManagerState();
50
31
  if (recordingController.recordingState)
51
32
  return React.createElement(AudioRecorder, null);
52
- // TODO: "!message" condition is a temporary fix for shared
53
- // state when editing a message (fix shared state issue)
54
- const displayQuotedMessage = !message && quotedMessage && quotedMessage.parent_id === parent?.id;
55
33
  const recordingEnabled = !!(recordingController.recorder && navigator.mediaDevices); // account for requirement on iOS as per this bug report: https://bugs.webkit.org/show_bug.cgi?id=252303
56
34
  const isRecording = !!recordingController.recordingState;
57
35
  /**
@@ -69,21 +47,18 @@ export const MessageInputFlat = () => {
69
47
  recordingEnabled &&
70
48
  recordingController.permissionState === 'denied' &&
71
49
  showRecordingPermissionDeniedNotification && (React.createElement(RecordingPermissionDeniedNotification, { onClose: closePermissionDeniedNotification, permissionName: RecordingPermission.MIC })),
72
- findAndEnqueueURLsToEnrich && (React.createElement(LinkPreviewList, { linkPreviews: Array.from(linkPreviews.values()) })),
73
- displayQuotedMessage && React.createElement(QuotedMessagePreviewHeader, null),
50
+ React.createElement(LinkPreviewList, null),
51
+ React.createElement(QuotedMessagePreviewHeader, null),
74
52
  React.createElement("div", { className: 'str-chat__message-input-inner' },
75
53
  React.createElement(AttachmentSelector, null),
76
54
  React.createElement("div", { className: 'str-chat__message-textarea-container' },
77
- displayQuotedMessage && React.createElement(QuotedMessagePreview, { quotedMessage: quotedMessage }),
78
- isUploadEnabled &&
79
- !!(numberOfUploads + failedUploadsCount || attachments.length > 0) && (React.createElement(AttachmentPreviewList, null)),
55
+ React.createElement(QuotedMessagePreview, null),
56
+ React.createElement(AttachmentPreviewList, null),
80
57
  React.createElement("div", { className: 'str-chat__message-textarea-with-emoji-picker' },
81
- React.createElement(ChatAutoComplete, null),
58
+ React.createElement(TextareaComposer, null),
82
59
  EmojiPicker && React.createElement(EmojiPicker, null))),
83
60
  shouldDisplayStopAIGeneration ? (React.createElement(StopAIGenerationButton, { onClick: stopGenerating })) : (!hideSendButton && (React.createElement(React.Fragment, null, cooldownRemaining ? (React.createElement(CooldownTimer, { cooldownInterval: cooldownRemaining, setCooldownRemaining: setCooldownRemaining })) : (React.createElement(React.Fragment, null,
84
- React.createElement(SendButton, { disabled: !numberOfUploads &&
85
- !text.length &&
86
- attachments.length - failedUploadsCount === 0, sendMessage: handleSubmit }),
61
+ React.createElement(SendButton, { sendMessage: handleSubmit }),
87
62
  recordingEnabled && (React.createElement(StartRecordingAudioButton, { disabled: isRecording ||
88
63
  (!asyncMessagesMultiSendEnabled &&
89
64
  attachments.some((a) => a.type === RecordingAttachmentType.VOICE_RECORDING)), onClick: () => {
@@ -1,10 +1,7 @@
1
1
  import React from 'react';
2
- import type { StreamMessage } from '../../context/ChannelStateContext';
3
2
  import type { MessageContextValue } from '../../context';
4
- import type { DefaultStreamChatGenerics } from '../../types/types';
5
- export declare const QuotedMessagePreviewHeader: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>() => React.JSX.Element;
6
- export type QuotedMessagePreviewProps<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> = {
7
- quotedMessage: StreamMessage<StreamChatGenerics>;
8
- renderText?: MessageContextValue<StreamChatGenerics>['renderText'];
3
+ export declare const QuotedMessagePreviewHeader: () => React.JSX.Element | null;
4
+ export type QuotedMessagePreviewProps = {
5
+ renderText?: MessageContextValue['renderText'];
9
6
  };
10
- export declare const QuotedMessagePreview: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>({ quotedMessage, renderText, }: QuotedMessagePreviewProps<StreamChatGenerics>) => React.JSX.Element | null;
7
+ export declare const QuotedMessagePreview: ({ renderText, }: QuotedMessagePreviewProps) => React.JSX.Element | null;
@@ -4,35 +4,41 @@ import { Attachment as DefaultAttachment } from '../Attachment';
4
4
  import { Avatar as DefaultAvatar } from '../Avatar';
5
5
  import { Poll } from '../Poll';
6
6
  import { useChatContext } from '../../context/ChatContext';
7
- import { useChannelActionContext } from '../../context/ChannelActionContext';
8
7
  import { useComponentContext } from '../../context/ComponentContext';
9
8
  import { useTranslationContext } from '../../context/TranslationContext';
10
- import { renderText as defaultRenderText } from '../Message';
9
+ import { useStateStore } from '../../store';
10
+ import { useMessageComposer } from './hooks';
11
+ import { renderText as defaultRenderText } from '../Message/renderText';
12
+ const messageComposerStateStoreSelector = (state) => ({
13
+ quotedMessage: state.quotedMessage,
14
+ });
11
15
  export const QuotedMessagePreviewHeader = () => {
12
- const { setQuotedMessage } = useChannelActionContext('QuotedMessagePreview');
13
16
  const { t } = useTranslationContext('QuotedMessagePreview');
17
+ const messageComposer = useMessageComposer();
18
+ const { quotedMessage } = useStateStore(messageComposer.state, messageComposerStateStoreSelector);
19
+ if (!quotedMessage)
20
+ return null;
14
21
  return (React.createElement("div", { className: 'str-chat__quoted-message-preview-header' },
15
22
  React.createElement("div", { className: 'str-chat__quoted-message-reply-to-message' }, t('Reply to Message')),
16
- React.createElement("button", { "aria-label": t('aria/Cancel Reply'), className: 'str-chat__quoted-message-remove', onClick: () => setQuotedMessage(undefined) },
23
+ React.createElement("button", { "aria-label": t('aria/Cancel Reply'), className: 'str-chat__quoted-message-remove', onClick: () => messageComposer.setQuotedMessage(null) },
17
24
  React.createElement(CloseIcon, null))));
18
25
  };
19
- export const QuotedMessagePreview = ({ quotedMessage, renderText = defaultRenderText, }) => {
26
+ export const QuotedMessagePreview = ({ renderText = defaultRenderText, }) => {
20
27
  const { client } = useChatContext();
21
28
  const { Attachment = DefaultAttachment, Avatar = DefaultAvatar } = useComponentContext('QuotedMessagePreview');
22
29
  const { userLanguage } = useTranslationContext('QuotedMessagePreview');
23
- const quotedMessageText = quotedMessage.i18n?.[`${userLanguage}_text`] ||
24
- quotedMessage.text;
25
- const renderedText = useMemo(() => renderText(quotedMessageText, quotedMessage.mentioned_users), [quotedMessage.mentioned_users, quotedMessageText, renderText]);
26
- const quotedMessageAttachment = useMemo(() => {
27
- const [attachment] = quotedMessage.attachments ?? [];
28
- return attachment ? [attachment] : [];
29
- }, [quotedMessage.attachments]);
30
- if (!quotedMessageText && !quotedMessageAttachment)
30
+ const messageComposer = useMessageComposer();
31
+ const { quotedMessage } = useStateStore(messageComposer.state, messageComposerStateStoreSelector);
32
+ const quotedMessageText = useMemo(() => quotedMessage?.i18n?.[`${userLanguage}_text`] ||
33
+ quotedMessage?.text, [quotedMessage?.i18n, quotedMessage?.text, userLanguage]);
34
+ const renderedText = useMemo(() => renderText(quotedMessageText, quotedMessage?.mentioned_users), [quotedMessage, quotedMessageText, renderText]);
35
+ const quotedMessageAttachments = useMemo(() => quotedMessage?.attachments?.length ? quotedMessage.attachments.slice(0, 1) : [], [quotedMessage]);
36
+ const poll = quotedMessage?.poll_id && client.polls.fromState(quotedMessage.poll_id);
37
+ if (!quotedMessageText && !quotedMessageAttachments.length && !poll)
31
38
  return null;
32
- const poll = quotedMessage.poll_id && client.polls.fromState(quotedMessage.poll_id);
33
39
  return (React.createElement("div", { className: 'str-chat__quoted-message-preview', "data-testid": 'quoted-message-preview' },
34
- quotedMessage.user && (React.createElement(Avatar, { className: 'str-chat__avatar--quoted-message-sender', image: quotedMessage.user.image, name: quotedMessage.user.name || quotedMessage.user.id, user: quotedMessage.user })),
40
+ quotedMessage?.user && (React.createElement(Avatar, { className: 'str-chat__avatar--quoted-message-sender', image: quotedMessage.user.image, name: quotedMessage.user.name || quotedMessage.user.id, user: quotedMessage.user })),
35
41
  React.createElement("div", { className: 'str-chat__quoted-message-bubble' }, poll ? (React.createElement(Poll, { isQuoted: true, poll: poll })) : (React.createElement(React.Fragment, null,
36
- !!quotedMessageAttachment.length && (React.createElement(Attachment, { attachments: quotedMessageAttachment, isQuoted: true })),
42
+ !!quotedMessageAttachments.length && (React.createElement(Attachment, { attachments: quotedMessageAttachments, isQuoted: true })),
37
43
  React.createElement("div", { className: 'str-chat__quoted-message-text', "data-testid": 'quoted-message-text' }, renderedText))))));
38
44
  };
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
- import { Message } from 'stream-chat';
3
- import type { DefaultStreamChatGenerics } from '../../types/types';
4
- export type SendButtonProps<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> = {
5
- sendMessage: (event: React.BaseSyntheticEvent, customMessageData?: Partial<Message<StreamChatGenerics>>) => void;
2
+ import type { UpdatedMessage } from 'stream-chat';
3
+ export type SendButtonProps = {
4
+ sendMessage: (event: React.BaseSyntheticEvent, customMessageData?: Omit<UpdatedMessage, 'mentioned_users'>) => void;
6
5
  } & React.ComponentProps<'button'>;
7
- export declare const SendButton: <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>({ sendMessage, ...rest }: SendButtonProps<StreamChatGenerics>) => React.JSX.Element;
6
+ export declare const SendButton: ({ sendMessage, ...rest }: SendButtonProps) => React.JSX.Element;
@@ -1,4 +1,8 @@
1
1
  import React from 'react';
2
2
  import { SendIcon } from './icons';
3
- export const SendButton = ({ sendMessage, ...rest }) => (React.createElement("button", { "aria-label": 'Send', className: 'str-chat__send-button', "data-testid": 'send-button', onClick: sendMessage, type: 'button', ...rest },
4
- React.createElement(SendIcon, null)));
3
+ import { useMessageComposerHasSendableData } from './hooks';
4
+ export const SendButton = ({ sendMessage, ...rest }) => {
5
+ const hasSendableData = useMessageComposerHasSendableData();
6
+ return (React.createElement("button", { "aria-label": 'Send', className: 'str-chat__send-button', "data-testid": 'send-button', disabled: !hasSendableData, onClick: sendMessage, type: 'button', ...rest },
7
+ React.createElement(SendIcon, null)));
8
+ };
@@ -1,5 +1,5 @@
1
- import React, { CSSProperties, ElementType, PropsWithChildren } from 'react';
2
- import { MessageInputContextValue } from '../../context';
1
+ import type { CSSProperties, ElementType, PropsWithChildren } from 'react';
2
+ import React from 'react';
3
3
  export declare const useDragAndDropUploadContext: () => {
4
4
  subscribeToDrop: ((fn: (files: File[]) => void) => () => void) | null;
5
5
  };
@@ -9,7 +9,7 @@ export declare const useDragAndDropUploadContext: () => {
9
9
  * will then be notified when the drop event occurs from within the `WithDragAndDropUpload`
10
10
  * component.
11
11
  */
12
- export declare const useRegisterDropHandlers: ({ uploadNewFiles }: MessageInputContextValue) => void;
12
+ export declare const useRegisterDropHandlers: () => void;
13
13
  /**
14
14
  * Wrapper to replace now deprecated `Channel.dragAndDropWindow` option.
15
15
  *
@@ -27,6 +27,7 @@ export declare const useRegisterDropHandlers: ({ uploadNewFiles }: MessageInputC
27
27
  * ```
28
28
  */
29
29
  export declare const WithDragAndDropUpload: ({ children, className, component: Component, style, }: PropsWithChildren<{
30
+ acceptedFiles?: string[];
30
31
  /**
31
32
  * @description An element to render as a wrapper onto which drag & drop functionality will be applied.
32
33
  * @default 'div'
@@ -1,7 +1,9 @@
1
- import React, { useCallback, useContext, useEffect, useMemo, useRef, } from 'react';
2
- import { useChannelStateContext, useMessageInputContext, useTranslationContext, } from '../../context';
1
+ import React, { useCallback, useContext, useEffect, useMemo, useRef } from 'react';
3
2
  import { useDropzone } from 'react-dropzone';
4
3
  import clsx from 'clsx';
4
+ import { useMessageInputContext, useTranslationContext } from '../../context';
5
+ import { useAttachmentManagerState, useMessageComposer } from './hooks';
6
+ import { useStateStore } from '../../store';
5
7
  const DragAndDropUploadContext = React.createContext({
6
8
  subscribeToDrop: null,
7
9
  });
@@ -12,13 +14,18 @@ export const useDragAndDropUploadContext = () => useContext(DragAndDropUploadCon
12
14
  * will then be notified when the drop event occurs from within the `WithDragAndDropUpload`
13
15
  * component.
14
16
  */
15
- export const useRegisterDropHandlers = ({ uploadNewFiles }) => {
17
+ export const useRegisterDropHandlers = () => {
16
18
  const { subscribeToDrop } = useDragAndDropUploadContext();
19
+ const messageComposer = useMessageComposer();
17
20
  useEffect(() => {
18
- const unsubscribe = subscribeToDrop?.(uploadNewFiles);
21
+ const unsubscribe = subscribeToDrop?.(messageComposer.attachmentManager.uploadFiles);
19
22
  return unsubscribe;
20
- }, [subscribeToDrop, uploadNewFiles]);
23
+ }, [subscribeToDrop, messageComposer]);
21
24
  };
25
+ const attachmentManagerConfigStateSelector = (state) => ({
26
+ acceptedFiles: state.attachments.acceptedFiles,
27
+ multipleUploads: state.attachments.maxNumberOfFilesPerMessage > 1,
28
+ });
22
29
  /**
23
30
  * Wrapper to replace now deprecated `Channel.dragAndDropWindow` option.
24
31
  *
@@ -37,12 +44,14 @@ export const useRegisterDropHandlers = ({ uploadNewFiles }) => {
37
44
  */
38
45
  export const WithDragAndDropUpload = ({ children, className, component: Component = 'div', style, }) => {
39
46
  const dropHandlersRef = useRef(new Set());
40
- const { acceptedFiles = [], multipleUploads } = useChannelStateContext();
41
47
  const { t } = useTranslationContext();
42
48
  const messageInputContext = useMessageInputContext();
43
49
  const dragAndDropUploadContext = useDragAndDropUploadContext();
50
+ const messageComposer = useMessageComposer();
51
+ const { isUploadEnabled } = useAttachmentManagerState();
52
+ const { acceptedFiles, multipleUploads } = useStateStore(messageComposer.configState, attachmentManagerConfigStateSelector);
44
53
  // if message input context is available, there's no need to use the queue
45
- const isWithinMessageInputContext = typeof messageInputContext.uploadNewFiles === 'function';
54
+ const isWithinMessageInputContext = Object.keys(messageInputContext).length > 0;
46
55
  const accept = useMemo(() => acceptedFiles.reduce((mediaTypeMap, mediaType) => {
47
56
  mediaTypeMap[mediaType] ?? (mediaTypeMap[mediaType] = []);
48
57
  return mediaTypeMap;
@@ -61,11 +70,13 @@ export const WithDragAndDropUpload = ({ children, className, component: Componen
61
70
  // apply `disabled` rules if available, otherwise allow anything and
62
71
  // let the `uploadNewFiles` handle the limitations internally
63
72
  disabled: isWithinMessageInputContext
64
- ? !messageInputContext.isUploadEnabled || messageInputContext.maxFilesLeft === 0
73
+ ? !isUploadEnabled || (messageInputContext.cooldownRemaining ?? 0) > 0
65
74
  : false,
66
75
  multiple: multipleUploads,
67
76
  noClick: true,
68
- onDrop: isWithinMessageInputContext ? messageInputContext.uploadNewFiles : handleDrop,
77
+ onDrop: isWithinMessageInputContext
78
+ ? messageComposer.attachmentManager.uploadFiles
79
+ : handleDrop,
69
80
  });
70
81
  // nested WithDragAndDropUpload components render wrappers without functionality
71
82
  // (MessageInputFlat has a default WithDragAndDropUpload)
@@ -1,2 +1,6 @@
1
+ export * from './useAttachmentManagerState';
2
+ export * from './useCanCreatePoll';
1
3
  export * from './useCooldownTimer';
2
- export * from './useMessageInputState';
4
+ export * from './useMessageInputControls';
5
+ export * from './useMessageComposer';
6
+ export * from './useMessageComposerHasSendableData';