stream-chat-react 12.13.1 → 13.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 (497) hide show
  1. package/README.md +27 -30
  2. package/dist/components/AIStateIndicator/AIStateIndicator.d.ts +4 -5
  3. package/dist/components/AIStateIndicator/hooks/useAIState.d.ts +2 -3
  4. package/dist/components/Attachment/Attachment.d.ts +8 -9
  5. package/dist/components/Attachment/Attachment.js +6 -5
  6. package/dist/components/Attachment/AttachmentActions.d.ts +2 -3
  7. package/dist/components/Attachment/AttachmentContainer.d.ts +15 -15
  8. package/dist/components/Attachment/AttachmentContainer.js +2 -2
  9. package/dist/components/Attachment/Audio.d.ts +3 -4
  10. package/dist/components/Attachment/Card.d.ts +1 -1
  11. package/dist/components/Attachment/FileAttachment.d.ts +3 -4
  12. package/dist/components/Attachment/FileAttachment.js +1 -1
  13. package/dist/components/Attachment/UnsupportedAttachment.d.ts +3 -4
  14. package/dist/components/Attachment/UnsupportedAttachment.js +1 -1
  15. package/dist/components/Attachment/VoiceRecording.d.ts +4 -5
  16. package/dist/components/Attachment/components/FileSizeIndicator.d.ts +1 -1
  17. package/dist/components/Attachment/components/FileSizeIndicator.js +4 -2
  18. package/dist/components/Attachment/utils.d.ts +8 -22
  19. package/dist/components/Attachment/utils.js +3 -18
  20. package/dist/components/Avatar/Avatar.d.ts +3 -4
  21. package/dist/components/Avatar/ChannelAvatar.d.ts +3 -4
  22. package/dist/components/Avatar/ChannelAvatar.js +1 -1
  23. package/dist/components/Avatar/GroupAvatar.d.ts +2 -2
  24. package/dist/components/Channel/Channel.d.ts +18 -37
  25. package/dist/components/Channel/Channel.js +31 -92
  26. package/dist/components/Channel/channelState.d.ts +17 -18
  27. package/dist/components/Channel/hooks/useChannelContainerClasses.d.ts +2 -3
  28. package/dist/components/Channel/hooks/useCreateChannelStateContext.d.ts +2 -3
  29. package/dist/components/Channel/hooks/useCreateChannelStateContext.js +1 -15
  30. package/dist/components/Channel/hooks/useCreateTypingContext.d.ts +1 -2
  31. package/dist/components/Channel/hooks/useEditMessageHandler.d.ts +3 -4
  32. package/dist/components/Channel/hooks/useMentionsHandlers.d.ts +3 -4
  33. package/dist/components/Channel/utils.d.ts +8 -6
  34. package/dist/components/Channel/utils.js +1 -0
  35. package/dist/components/ChannelHeader/ChannelHeader.d.ts +2 -3
  36. package/dist/components/ChannelList/ChannelList.d.ts +31 -30
  37. package/dist/components/ChannelList/ChannelList.js +8 -10
  38. package/dist/components/ChannelList/ChannelListMessenger.d.ts +6 -6
  39. package/dist/components/ChannelList/hooks/useChannelDeletedListener.d.ts +1 -2
  40. package/dist/components/ChannelList/hooks/useChannelHiddenListener.d.ts +1 -2
  41. package/dist/components/ChannelList/hooks/useChannelListShape.d.ts +44 -44
  42. package/dist/components/ChannelList/hooks/useChannelListShape.js +0 -2
  43. package/dist/components/ChannelList/hooks/useChannelMembershipState.d.ts +3 -3
  44. package/dist/components/ChannelList/hooks/useChannelTruncatedListener.d.ts +1 -2
  45. package/dist/components/ChannelList/hooks/useChannelUpdatedListener.d.ts +1 -2
  46. package/dist/components/ChannelList/hooks/useChannelVisibleListener.d.ts +1 -2
  47. package/dist/components/ChannelList/hooks/useConnectionRecoveredListener.d.ts +1 -2
  48. package/dist/components/ChannelList/hooks/useMessageNewListener.d.ts +1 -2
  49. package/dist/components/ChannelList/hooks/useNotificationAddedToChannelListener.d.ts +1 -2
  50. package/dist/components/ChannelList/hooks/useNotificationMessageNewListener.d.ts +1 -2
  51. package/dist/components/ChannelList/hooks/useNotificationRemovedFromChannelListener.d.ts +1 -2
  52. package/dist/components/ChannelList/hooks/usePaginatedChannels.d.ts +7 -8
  53. package/dist/components/ChannelList/hooks/usePaginatedChannels.js +3 -3
  54. package/dist/components/ChannelList/hooks/useSelectedChannelState.d.ts +7 -7
  55. package/dist/components/ChannelList/hooks/useUserPresenceChangedListener.d.ts +1 -2
  56. package/dist/components/ChannelList/utils.d.ts +20 -21
  57. package/dist/components/ChannelList/utils.js +2 -2
  58. package/dist/components/ChannelPreview/ChannelPreview.d.ts +15 -16
  59. package/dist/components/ChannelPreview/ChannelPreview.js +1 -1
  60. package/dist/components/ChannelPreview/ChannelPreviewActionButtons.d.ts +4 -4
  61. package/dist/components/ChannelPreview/ChannelPreviewMessenger.d.ts +1 -2
  62. package/dist/components/ChannelPreview/hooks/useChannelPreviewInfo.d.ts +3 -4
  63. package/dist/components/ChannelPreview/hooks/useIsChannelMuted.d.ts +1 -2
  64. package/dist/components/ChannelPreview/hooks/useMessageDeliveryStatus.d.ts +5 -7
  65. package/dist/components/ChannelPreview/icons.d.ts +1 -1
  66. package/dist/components/ChannelPreview/utils.d.ts +7 -7
  67. package/dist/components/ChannelSearch/ChannelSearch.d.ts +5 -6
  68. package/dist/components/ChannelSearch/ChannelSearch.js +2 -2
  69. package/dist/components/ChannelSearch/SearchBar.d.ts +1 -1
  70. package/dist/components/ChannelSearch/SearchBar.js +1 -1
  71. package/dist/components/ChannelSearch/SearchResults.d.ts +13 -14
  72. package/dist/components/ChannelSearch/SearchResults.js +1 -1
  73. package/dist/components/ChannelSearch/hooks/useChannelSearch.d.ts +17 -18
  74. package/dist/components/ChannelSearch/hooks/useChannelSearch.js +2 -6
  75. package/dist/components/ChannelSearch/utils.d.ts +2 -3
  76. package/dist/components/Chat/Chat.d.ts +9 -9
  77. package/dist/components/Chat/hooks/useChannelsQueryState.d.ts +1 -1
  78. package/dist/components/Chat/hooks/useChat.d.ts +10 -10
  79. package/dist/components/Chat/hooks/useChat.js +4 -3
  80. package/dist/components/Chat/hooks/useCreateChatClient.d.ts +4 -4
  81. package/dist/components/Chat/hooks/useCreateChatContext.d.ts +1 -2
  82. package/dist/components/Dialog/DialogAnchor.d.ts +4 -3
  83. package/dist/components/Dialog/DialogAnchor.js +2 -2
  84. package/dist/components/Dialog/DialogMenu.d.ts +2 -1
  85. package/dist/components/Dialog/DialogPortal.d.ts +2 -1
  86. package/dist/components/Dialog/FormDialog.d.ts +2 -1
  87. package/dist/components/Dialog/FormDialog.js +1 -1
  88. package/dist/components/Dialog/PromptDialog.d.ts +2 -1
  89. package/dist/components/DragAndDrop/DragAndDropContainer.d.ts +2 -1
  90. package/dist/components/EventComponent/EventComponent.d.ts +7 -6
  91. package/dist/components/Form/FieldError.d.ts +2 -1
  92. package/dist/components/Form/SwitchField.d.ts +2 -1
  93. package/dist/components/Form/SwitchField.js +1 -1
  94. package/dist/components/Gallery/Gallery.d.ts +5 -5
  95. package/dist/components/Gallery/Image.d.ts +6 -5
  96. package/dist/components/Gallery/ModalGallery.d.ts +3 -4
  97. package/dist/components/InfiniteScrollPaginator/InfiniteScroll.d.ts +2 -1
  98. package/dist/components/InfiniteScrollPaginator/InfiniteScrollPaginator.d.ts +2 -1
  99. package/dist/components/LoadMore/LoadMoreButton.d.ts +2 -1
  100. package/dist/components/LoadMore/LoadMorePaginator.d.ts +3 -2
  101. package/dist/components/LoadMore/LoadMorePaginator.js +1 -1
  102. package/dist/components/MediaRecorder/AudioRecorder/AudioRecorder.js +3 -2
  103. package/dist/components/MediaRecorder/AudioRecorder/AudioRecordingInProgress.js +1 -1
  104. package/dist/components/MediaRecorder/RecordingPermissionDeniedNotification.d.ts +1 -1
  105. package/dist/components/MediaRecorder/classes/MediaRecorderController.d.ts +11 -23
  106. package/dist/components/MediaRecorder/hooks/useMediaRecorder.d.ts +8 -8
  107. package/dist/components/MediaRecorder/hooks/useMediaRecorder.js +6 -4
  108. package/dist/components/MediaRecorder/observable/BehaviorSubject.d.ts +2 -2
  109. package/dist/components/MediaRecorder/observable/Observable.d.ts +1 -1
  110. package/dist/components/MediaRecorder/observable/Subject.d.ts +3 -2
  111. package/dist/components/Message/FixedHeightMessage.d.ts +4 -5
  112. package/dist/components/Message/Message.d.ts +1 -2
  113. package/dist/components/Message/MessageBlocked.d.ts +2 -0
  114. package/dist/components/Message/MessageBlocked.js +16 -0
  115. package/dist/components/Message/MessageDeleted.d.ts +4 -5
  116. package/dist/components/Message/MessageEditedTimestamp.d.ts +2 -3
  117. package/dist/components/Message/MessageErrorText.d.ts +4 -5
  118. package/dist/components/Message/MessageErrorText.js +2 -2
  119. package/dist/components/Message/MessageOptions.d.ts +3 -3
  120. package/dist/components/Message/MessageRepliesCountButton.d.ts +2 -1
  121. package/dist/components/Message/MessageSimple.d.ts +1 -2
  122. package/dist/components/Message/MessageSimple.js +14 -12
  123. package/dist/components/Message/MessageStatus.d.ts +3 -4
  124. package/dist/components/Message/MessageText.d.ts +6 -6
  125. package/dist/components/Message/MessageTimestamp.d.ts +4 -5
  126. package/dist/components/Message/QuotedMessage.d.ts +2 -3
  127. package/dist/components/Message/QuotedMessage.js +1 -1
  128. package/dist/components/Message/StreamedMessageText.d.ts +3 -4
  129. package/dist/components/Message/hooks/useActionHandler.d.ts +2 -3
  130. package/dist/components/Message/hooks/useActionHandler.js +1 -1
  131. package/dist/components/Message/hooks/useDeleteHandler.d.ts +4 -5
  132. package/dist/components/Message/hooks/useFlagHandler.d.ts +5 -6
  133. package/dist/components/Message/hooks/useMarkUnreadHandler.d.ts +5 -6
  134. package/dist/components/Message/hooks/useMentionsHandler.d.ts +6 -8
  135. package/dist/components/Message/hooks/useMessageTextStreaming.d.ts +2 -3
  136. package/dist/components/Message/hooks/useMuteHandler.d.ts +5 -7
  137. package/dist/components/Message/hooks/useMuteHandler.js +1 -1
  138. package/dist/components/Message/hooks/useOpenThreadHandler.d.ts +2 -3
  139. package/dist/components/Message/hooks/usePinHandler.d.ts +4 -5
  140. package/dist/components/Message/hooks/usePinHandler.js +1 -1
  141. package/dist/components/Message/hooks/useReactionHandler.d.ts +3 -4
  142. package/dist/components/Message/hooks/useReactionHandler.js +2 -4
  143. package/dist/components/Message/hooks/useReactionsFetcher.d.ts +5 -7
  144. package/dist/components/Message/hooks/useRetryHandler.d.ts +2 -3
  145. package/dist/components/Message/hooks/useRetryHandler.js +1 -1
  146. package/dist/components/Message/hooks/useUserHandler.d.ts +5 -6
  147. package/dist/components/Message/hooks/useUserRole.d.ts +2 -3
  148. package/dist/components/Message/hooks/useUserRole.js +1 -1
  149. package/dist/components/Message/icons.d.ts +2 -2
  150. package/dist/components/Message/icons.js +1 -1
  151. package/dist/components/Message/renderText/componentRenderers/Anchor.d.ts +2 -1
  152. package/dist/components/Message/renderText/componentRenderers/Emoji.d.ts +1 -1
  153. package/dist/components/Message/renderText/componentRenderers/Mention.d.ts +5 -5
  154. package/dist/components/Message/renderText/componentRenderers/Mention.js +1 -1
  155. package/dist/components/Message/renderText/rehypePlugins/mentionsMarkdownPlugin.d.ts +1 -2
  156. package/dist/components/Message/renderText/renderText.d.ts +6 -6
  157. package/dist/components/Message/renderText/types.d.ts +1 -1
  158. package/dist/components/Message/types.d.ts +27 -28
  159. package/dist/components/Message/utils.d.ts +21 -21
  160. package/dist/components/Message/utils.js +8 -4
  161. package/dist/components/MessageActions/CustomMessageActionsList.d.ts +6 -7
  162. package/dist/components/MessageActions/MessageActions.d.ts +6 -5
  163. package/dist/components/MessageActions/MessageActions.js +1 -1
  164. package/dist/components/MessageActions/MessageActionsBox.d.ts +5 -5
  165. package/dist/components/MessageActions/MessageActionsBox.js +4 -3
  166. package/dist/components/MessageActions/hooks/useMessageActionsBoxPopper.d.ts +1 -1
  167. package/dist/components/MessageBounce/MessageBounceModal.d.ts +4 -3
  168. package/dist/components/MessageBounce/MessageBouncePrompt.d.ts +1 -2
  169. package/dist/components/MessageInput/AttachmentPreviewList/AttachmentPreviewList.d.ts +11 -11
  170. package/dist/components/MessageInput/AttachmentPreviewList/AttachmentPreviewList.js +17 -14
  171. package/dist/components/MessageInput/AttachmentPreviewList/FileAttachmentPreview.d.ts +4 -12
  172. package/dist/components/MessageInput/AttachmentPreviewList/FileAttachmentPreview.js +8 -5
  173. package/dist/components/MessageInput/AttachmentPreviewList/ImageAttachmentPreview.d.ts +4 -5
  174. package/dist/components/MessageInput/AttachmentPreviewList/ImageAttachmentPreview.js +2 -2
  175. package/dist/components/MessageInput/AttachmentPreviewList/UnsupportedAttachmentPreview.d.ts +7 -5
  176. package/dist/components/MessageInput/AttachmentPreviewList/UnsupportedAttachmentPreview.js +5 -2
  177. package/dist/components/MessageInput/AttachmentPreviewList/VoiceRecordingPreview.d.ts +4 -5
  178. package/dist/components/MessageInput/AttachmentPreviewList/VoiceRecordingPreview.js +5 -2
  179. package/dist/components/MessageInput/AttachmentPreviewList/index.d.ts +1 -1
  180. package/dist/components/MessageInput/AttachmentPreviewList/types.d.ts +3 -4
  181. package/dist/components/MessageInput/AttachmentSelector.d.ts +1 -2
  182. package/dist/components/MessageInput/AttachmentSelector.js +5 -3
  183. package/dist/components/MessageInput/EditMessageForm.d.ts +3 -2
  184. package/dist/components/MessageInput/EditMessageForm.js +30 -6
  185. package/dist/components/MessageInput/LinkPreviewList.d.ts +6 -4
  186. package/dist/components/MessageInput/LinkPreviewList.js +24 -10
  187. package/dist/components/MessageInput/MessageInput.d.ts +23 -45
  188. package/dist/components/MessageInput/MessageInput.js +25 -15
  189. package/dist/components/MessageInput/MessageInputFlat.d.ts +1 -2
  190. package/dist/components/MessageInput/MessageInputFlat.js +31 -76
  191. package/dist/components/MessageInput/QuotedMessagePreview.d.ts +4 -7
  192. package/dist/components/MessageInput/QuotedMessagePreview.js +22 -16
  193. package/dist/components/MessageInput/SendButton.d.ts +4 -5
  194. package/dist/components/MessageInput/SendButton.js +6 -2
  195. package/dist/components/MessageInput/WithDragAndDropUpload.d.ts +38 -0
  196. package/dist/components/MessageInput/WithDragAndDropUpload.js +96 -0
  197. package/dist/components/MessageInput/hooks/index.d.ts +5 -1
  198. package/dist/components/MessageInput/hooks/index.js +5 -1
  199. package/dist/components/MessageInput/hooks/useAttachmentManagerState.d.ts +10 -0
  200. package/dist/components/MessageInput/hooks/useAttachmentManagerState.js +19 -0
  201. package/dist/components/MessageInput/hooks/useCanCreatePoll.d.ts +1 -0
  202. package/dist/components/MessageInput/hooks/useCanCreatePoll.js +10 -0
  203. package/dist/components/MessageInput/hooks/useCooldownTimer.d.ts +2 -3
  204. package/dist/components/MessageInput/hooks/useCreateMessageInputContext.d.ts +1 -2
  205. package/dist/components/MessageInput/hooks/useCreateMessageInputContext.js +1 -55
  206. package/dist/components/MessageInput/hooks/useMessageComposer.d.ts +2 -0
  207. package/dist/components/MessageInput/hooks/useMessageComposer.js +80 -0
  208. package/dist/components/MessageInput/hooks/useMessageComposerHasSendableData.d.ts +1 -0
  209. package/dist/components/MessageInput/hooks/useMessageComposerHasSendableData.js +8 -0
  210. package/dist/components/MessageInput/hooks/useMessageInputControls.d.ts +12 -0
  211. package/dist/components/MessageInput/hooks/useMessageInputControls.js +23 -0
  212. package/dist/components/MessageInput/hooks/useMessageInputText.d.ts +1 -5
  213. package/dist/components/MessageInput/hooks/useMessageInputText.js +19 -53
  214. package/dist/components/MessageInput/hooks/usePasteHandler.d.ts +1 -3
  215. package/dist/components/MessageInput/hooks/usePasteHandler.js +6 -8
  216. package/dist/components/MessageInput/hooks/useSubmitHandler.d.ts +2 -6
  217. package/dist/components/MessageInput/hooks/useSubmitHandler.js +30 -98
  218. package/dist/components/MessageInput/hooks/utils.d.ts +0 -27
  219. package/dist/components/MessageInput/hooks/utils.js +0 -124
  220. package/dist/components/MessageInput/index.d.ts +1 -2
  221. package/dist/components/MessageInput/index.js +1 -2
  222. package/dist/components/MessageList/ConnectionStatus.d.ts +1 -2
  223. package/dist/components/MessageList/ConnectionStatus.js +1 -1
  224. package/dist/components/MessageList/CustomNotification.d.ts +2 -1
  225. package/dist/components/MessageList/GiphyPreviewMessage.d.ts +4 -5
  226. package/dist/components/MessageList/MessageList.d.ts +11 -12
  227. package/dist/components/MessageList/MessageList.js +4 -4
  228. package/dist/components/MessageList/MessageNotification.d.ts +2 -1
  229. package/dist/components/MessageList/VirtualizedMessageList.d.ts +22 -21
  230. package/dist/components/MessageList/VirtualizedMessageList.js +6 -6
  231. package/dist/components/MessageList/VirtualizedMessageListComponents.d.ts +10 -10
  232. package/dist/components/MessageList/VirtualizedMessageListComponents.js +7 -7
  233. package/dist/components/MessageList/hooks/MessageList/useEnrichedMessages.d.ts +8 -10
  234. package/dist/components/MessageList/hooks/MessageList/useEnrichedMessages.js +1 -1
  235. package/dist/components/MessageList/hooks/MessageList/useMessageListElements.d.ts +11 -12
  236. package/dist/components/MessageList/hooks/MessageList/useMessageListScrollManager.d.ts +4 -5
  237. package/dist/components/MessageList/hooks/MessageList/useScrollLocationLogic.d.ts +5 -6
  238. package/dist/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.d.ts +4 -5
  239. package/dist/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.js +3 -2
  240. package/dist/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.d.ts +4 -5
  241. package/dist/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.js +1 -1
  242. package/dist/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.d.ts +2 -3
  243. package/dist/components/MessageList/hooks/VirtualizedMessageList/usePrependMessagesCount.d.ts +2 -3
  244. package/dist/components/MessageList/hooks/VirtualizedMessageList/usePrependMessagesCount.js +6 -2
  245. package/dist/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.d.ts +4 -5
  246. package/dist/components/MessageList/hooks/VirtualizedMessageList/useShouldForceScrollToBottom.d.ts +2 -3
  247. package/dist/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.d.ts +3 -4
  248. package/dist/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.js +5 -6
  249. package/dist/components/MessageList/hooks/useLastReadData.d.ts +5 -6
  250. package/dist/components/MessageList/hooks/useLastReadData.js +5 -1
  251. package/dist/components/MessageList/hooks/useMarkRead.d.ts +1 -2
  252. package/dist/components/MessageList/renderMessages.d.ts +14 -14
  253. package/dist/components/MessageList/renderMessages.js +8 -7
  254. package/dist/components/MessageList/utils.d.ts +34 -28
  255. package/dist/components/MessageList/utils.js +26 -21
  256. package/dist/components/Modal/Modal.d.ts +2 -1
  257. package/dist/components/Poll/Poll.d.ts +2 -3
  258. package/dist/components/Poll/Poll.js +1 -1
  259. package/dist/components/Poll/PollActions/AddCommentForm.d.ts +1 -2
  260. package/dist/components/Poll/PollActions/AddCommentForm.js +4 -2
  261. package/dist/components/Poll/PollActions/EndPollDialog.d.ts +1 -2
  262. package/dist/components/Poll/PollActions/EndPollDialog.js +1 -1
  263. package/dist/components/Poll/PollActions/PollAction.d.ts +2 -1
  264. package/dist/components/Poll/PollActions/PollActions.d.ts +7 -8
  265. package/dist/components/Poll/PollActions/PollActions.js +5 -5
  266. package/dist/components/Poll/PollActions/PollAnswerList.d.ts +1 -2
  267. package/dist/components/Poll/PollActions/PollOptionsFullList.d.ts +1 -2
  268. package/dist/components/Poll/PollActions/PollOptionsFullList.js +4 -2
  269. package/dist/components/Poll/PollActions/PollResults/PollOptionVotesList.d.ts +3 -4
  270. package/dist/components/Poll/PollActions/PollResults/PollOptionVotesList.js +1 -1
  271. package/dist/components/Poll/PollActions/PollResults/PollOptionWithLatestVotes.d.ts +3 -4
  272. package/dist/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.d.ts +4 -5
  273. package/dist/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.js +1 -1
  274. package/dist/components/Poll/PollActions/PollResults/PollResults.d.ts +1 -2
  275. package/dist/components/Poll/PollActions/PollResults/PollResults.js +1 -1
  276. package/dist/components/Poll/PollActions/SuggestPollOptionForm.d.ts +1 -2
  277. package/dist/components/Poll/PollActions/SuggestPollOptionForm.js +3 -1
  278. package/dist/components/Poll/PollContent.d.ts +1 -2
  279. package/dist/components/Poll/PollCreationDialog/MultipleAnswersField.d.ts +2 -0
  280. package/dist/components/Poll/PollCreationDialog/MultipleAnswersField.js +35 -0
  281. package/dist/components/Poll/PollCreationDialog/NameField.d.ts +2 -0
  282. package/dist/components/Poll/PollCreationDialog/NameField.js +26 -0
  283. package/dist/components/Poll/PollCreationDialog/OptionFieldSet.d.ts +1 -8
  284. package/dist/components/Poll/PollCreationDialog/OptionFieldSet.js +33 -65
  285. package/dist/components/Poll/PollCreationDialog/PollCreationDialog.js +31 -85
  286. package/dist/components/Poll/PollCreationDialog/PollCreationDialogControls.d.ts +1 -4
  287. package/dist/components/Poll/PollCreationDialog/PollCreationDialogControls.js +15 -41
  288. package/dist/components/Poll/PollCreationDialog/types.d.ts +0 -14
  289. package/dist/components/Poll/PollHeader.d.ts +1 -2
  290. package/dist/components/Poll/PollOptionList.d.ts +1 -2
  291. package/dist/components/Poll/PollOptionList.js +4 -2
  292. package/dist/components/Poll/PollOptionSelector.d.ts +3 -4
  293. package/dist/components/Poll/PollVote.d.ts +6 -7
  294. package/dist/components/Poll/PollVote.js +3 -3
  295. package/dist/components/Poll/QuotedPoll.d.ts +1 -2
  296. package/dist/components/Poll/constants.d.ts +0 -1
  297. package/dist/components/Poll/constants.js +0 -1
  298. package/dist/components/Poll/hooks/useManagePollVotesRealtime.d.ts +2 -3
  299. package/dist/components/Poll/hooks/usePollAnswerPagination.d.ts +2 -3
  300. package/dist/components/Poll/hooks/usePollAnswerPagination.js +2 -2
  301. package/dist/components/Poll/hooks/usePollOptionVotesPagination.d.ts +2 -3
  302. package/dist/components/Poll/hooks/usePollOptionVotesPagination.js +1 -1
  303. package/dist/components/Portal/Portal.d.ts +1 -1
  304. package/dist/components/ReactFileUtilities/FileIcon/FileIcon.d.ts +1 -1
  305. package/dist/components/ReactFileUtilities/FileIcon/FileIconSet.d.ts +2 -1
  306. package/dist/components/ReactFileUtilities/FileIcon/iconMap.d.ts +1 -1
  307. package/dist/components/ReactFileUtilities/UploadButton.d.ts +3 -2
  308. package/dist/components/ReactFileUtilities/UploadButton.js +16 -6
  309. package/dist/components/ReactFileUtilities/index.d.ts +0 -1
  310. package/dist/components/ReactFileUtilities/index.js +0 -1
  311. package/dist/components/ReactFileUtilities/utils.d.ts +2 -2
  312. package/dist/components/Reactions/ReactionSelector.d.ts +4 -5
  313. package/dist/components/Reactions/ReactionSelectorWithButton.d.ts +1 -2
  314. package/dist/components/Reactions/ReactionsList.d.ts +6 -7
  315. package/dist/components/Reactions/ReactionsList.js +2 -2
  316. package/dist/components/Reactions/ReactionsListModal.d.ts +9 -10
  317. package/dist/components/Reactions/SimpleReactionsList.d.ts +5 -6
  318. package/dist/components/Reactions/StreamEmoji.d.ts +1 -1
  319. package/dist/components/Reactions/hooks/useFetchReactions.d.ts +9 -10
  320. package/dist/components/Reactions/hooks/useProcessReactions.d.ts +1 -2
  321. package/dist/components/Reactions/types.d.ts +3 -4
  322. package/dist/components/Reactions/utils/utils.d.ts +1 -1
  323. package/dist/components/SafeAnchor/SafeAnchor.d.ts +2 -1
  324. package/dist/components/{CommandItem → TextareaComposer/SuggestionList}/CommandItem.d.ts +2 -1
  325. package/dist/components/{CommandItem → TextareaComposer/SuggestionList}/CommandItem.js +1 -2
  326. package/dist/components/{EmoticonItem → TextareaComposer/SuggestionList}/EmoticonItem.d.ts +7 -7
  327. package/dist/components/TextareaComposer/SuggestionList/EmoticonItem.js +12 -0
  328. package/dist/components/TextareaComposer/SuggestionList/SuggestionList.d.ts +16 -0
  329. package/dist/components/TextareaComposer/SuggestionList/SuggestionList.js +49 -0
  330. package/dist/components/TextareaComposer/SuggestionList/SuggestionListItem.d.ts +18 -0
  331. package/dist/components/TextareaComposer/SuggestionList/SuggestionListItem.js +25 -0
  332. package/dist/components/{UserItem → TextareaComposer/SuggestionList}/UserItem.d.ts +7 -4
  333. package/dist/components/TextareaComposer/SuggestionList/UserItem.js +24 -0
  334. package/dist/components/TextareaComposer/SuggestionList/index.d.ts +5 -0
  335. package/dist/components/TextareaComposer/SuggestionList/index.js +5 -0
  336. package/dist/components/TextareaComposer/TextareaComposer.d.ts +13 -0
  337. package/dist/components/TextareaComposer/TextareaComposer.js +155 -0
  338. package/dist/components/TextareaComposer/index.d.ts +2 -0
  339. package/dist/components/TextareaComposer/index.js +2 -0
  340. package/dist/components/Thread/Thread.d.ts +13 -10
  341. package/dist/components/Thread/Thread.js +23 -12
  342. package/dist/components/Thread/ThreadHead.d.ts +2 -3
  343. package/dist/components/Thread/ThreadHeader.d.ts +5 -6
  344. package/dist/components/Thread/ThreadHeader.js +1 -1
  345. package/dist/components/Threads/ThreadContext.d.ts +2 -2
  346. package/dist/components/Threads/ThreadContext.js +1 -4
  347. package/dist/components/Threads/ThreadList/ThreadList.d.ts +1 -1
  348. package/dist/components/Threads/ThreadList/ThreadListItem.d.ts +1 -1
  349. package/dist/components/Threads/hooks/useThreadManagerState.d.ts +1 -1
  350. package/dist/components/Threads/hooks/useThreadState.d.ts +1 -1
  351. package/dist/components/Threads/icons.d.ts +1 -1
  352. package/dist/components/Tooltip/Tooltip.d.ts +3 -2
  353. package/dist/components/Tooltip/hooks/useEnterLeaveHandlers.d.ts +1 -1
  354. package/dist/components/TypingIndicator/TypingIndicator.d.ts +1 -2
  355. package/dist/components/Window/Window.d.ts +6 -6
  356. package/dist/components/index.d.ts +1 -5
  357. package/dist/components/index.js +1 -5
  358. package/dist/context/AttachmentSelectorContext.d.ts +2 -1
  359. package/dist/context/ChannelActionContext.d.ts +26 -35
  360. package/dist/context/ChannelListContext.d.ts +9 -9
  361. package/dist/context/ChannelListContext.js +1 -1
  362. package/dist/context/ChannelStateContext.d.ts +24 -34
  363. package/dist/context/ChatContext.d.ts +18 -17
  364. package/dist/context/ComponentContext.d.ts +41 -37
  365. package/dist/context/DialogManagerContext.d.ts +2 -1
  366. package/dist/context/MessageBounceContext.d.ts +8 -7
  367. package/dist/context/MessageBounceContext.js +1 -1
  368. package/dist/context/MessageContext.d.ts +23 -23
  369. package/dist/context/MessageInputContext.d.ts +8 -26
  370. package/dist/context/MessageInputContext.js +3 -2
  371. package/dist/context/MessageListContext.d.ts +2 -1
  372. package/dist/context/PollContext.d.ts +8 -8
  373. package/dist/context/TranslationContext.d.ts +2 -1
  374. package/dist/context/TypingContext.d.ts +11 -10
  375. package/dist/context/VirtualizedMessageListContext.d.ts +2 -1
  376. package/dist/context/WithComponents.d.ts +3 -2
  377. package/dist/css/v2/index.css +1 -1
  378. package/dist/css/v2/index.layout.css +1 -1
  379. package/dist/experimental/MessageActions/MessageActions.d.ts +1 -1
  380. package/dist/experimental/MessageActions/MessageActions.js +1 -1
  381. package/dist/experimental/MessageActions/defaults.js +4 -3
  382. package/dist/experimental/Search/Search.d.ts +1 -2
  383. package/dist/experimental/Search/SearchContext.d.ts +8 -8
  384. package/dist/experimental/Search/SearchResults/SearchResultItem.d.ts +11 -11
  385. package/dist/experimental/Search/SearchResults/SearchResultItem.js +3 -3
  386. package/dist/experimental/Search/SearchResults/SearchResults.d.ts +1 -2
  387. package/dist/experimental/Search/SearchResults/SearchResultsHeader.d.ts +1 -2
  388. package/dist/experimental/Search/SearchResults/SearchResultsHeader.js +1 -1
  389. package/dist/experimental/Search/SearchResults/SearchSourceResultList.d.ts +2 -3
  390. package/dist/experimental/Search/SearchResults/SearchSourceResultListFooter.d.ts +1 -2
  391. package/dist/experimental/Search/SearchResults/SearchSourceResults.d.ts +1 -2
  392. package/dist/experimental/Search/SearchResults/SearchSourceResults.js +1 -1
  393. package/dist/experimental/Search/SearchSourceResultsContext.d.ts +2 -1
  394. package/dist/experimental/Search/hooks/useSearchFocusedMessage.d.ts +1 -2
  395. package/dist/experimental/Search/hooks/useSearchFocusedMessage.js +3 -1
  396. package/dist/experimental/Search/hooks/useSearchQueriesInProgress.d.ts +3 -4
  397. package/dist/experimental/index.browser.cjs +1139 -1075
  398. package/dist/experimental/index.browser.cjs.map +4 -4
  399. package/dist/experimental/index.node.cjs +1139 -1075
  400. package/dist/experimental/index.node.cjs.map +4 -4
  401. package/dist/i18n/Streami18n.d.ts +2 -1
  402. package/dist/i18n/de.json +1 -0
  403. package/dist/i18n/en.json +1 -0
  404. package/dist/i18n/es.json +1 -0
  405. package/dist/i18n/fr.json +1 -0
  406. package/dist/i18n/hi.json +1 -0
  407. package/dist/i18n/it.json +1 -0
  408. package/dist/i18n/ja.json +1 -0
  409. package/dist/i18n/ko.json +1 -0
  410. package/dist/i18n/nl.json +1 -0
  411. package/dist/i18n/pt.json +1 -0
  412. package/dist/i18n/ru.json +1 -0
  413. package/dist/i18n/tr.json +1 -0
  414. package/dist/i18n/types.d.ts +2 -2
  415. package/dist/i18n/utils.d.ts +1 -1
  416. package/dist/i18n/utils.js +3 -1
  417. package/dist/index.browser.cjs +28774 -30813
  418. package/dist/index.browser.cjs.map +4 -4
  419. package/dist/index.node.cjs +30798 -32844
  420. package/dist/index.node.cjs.map +4 -4
  421. package/dist/plugins/Emojis/index.browser.cjs +133 -5
  422. package/dist/plugins/Emojis/index.browser.cjs.map +4 -4
  423. package/dist/plugins/Emojis/index.d.ts +1 -0
  424. package/dist/plugins/Emojis/index.js +1 -0
  425. package/dist/plugins/Emojis/index.node.cjs +135 -6
  426. package/dist/plugins/Emojis/index.node.cjs.map +4 -4
  427. package/dist/plugins/Emojis/middleware/index.d.ts +1 -0
  428. package/dist/plugins/Emojis/middleware/index.js +1 -0
  429. package/dist/plugins/Emojis/middleware/textComposerEmojiMiddleware.d.ts +66 -0
  430. package/dist/plugins/Emojis/middleware/textComposerEmojiMiddleware.js +143 -0
  431. package/dist/plugins/encoders/mp3.browser.cjs.map +2 -2
  432. package/dist/plugins/encoders/mp3.node.cjs.map +2 -2
  433. package/dist/scss/v2/Autocomplete/Autocomplete-layout.scss +14 -0
  434. package/dist/scss/v2/Autocomplete/Autocomplete-theme.scss +11 -0
  435. package/dist/scss/v2/DropzoneContainer/DropzoneContainer-layout.scss +14 -0
  436. package/dist/scss/v2/DropzoneContainer/DropzoneContainer-theme.scss +17 -0
  437. package/dist/scss/v2/LinkPreview/LinkPreview-layout.scss +18 -0
  438. package/dist/scss/v2/LinkPreview/LinkPreview-theme.scss +15 -0
  439. package/dist/scss/v2/Message/Message-layout.scss +8 -0
  440. package/dist/scss/v2/Message/Message-theme.scss +29 -0
  441. package/dist/scss/v2/MessageInput/MessageInput-layout.scss +0 -13
  442. package/dist/scss/v2/MessageInput/MessageInput-theme.scss +8 -19
  443. package/dist/scss/v2/index.layout.scss +2 -1
  444. package/dist/scss/v2/index.scss +1 -0
  445. package/dist/types/defaultDataInterfaces.d.ts +25 -0
  446. package/dist/types/index.d.ts +2 -1
  447. package/dist/types/types.d.ts +2 -62
  448. package/dist/utils/getChannel.d.ts +5 -6
  449. package/dist/utils/mergeDeep.d.ts +2 -3
  450. package/package.json +8 -11
  451. package/dist/components/AutoCompleteTextarea/Item.d.ts +0 -2
  452. package/dist/components/AutoCompleteTextarea/Item.js +0 -10
  453. package/dist/components/AutoCompleteTextarea/List.d.ts +0 -17
  454. package/dist/components/AutoCompleteTextarea/List.js +0 -89
  455. package/dist/components/AutoCompleteTextarea/Textarea.d.ts +0 -114
  456. package/dist/components/AutoCompleteTextarea/Textarea.js +0 -593
  457. package/dist/components/AutoCompleteTextarea/index.d.ts +0 -4
  458. package/dist/components/AutoCompleteTextarea/index.js +0 -4
  459. package/dist/components/AutoCompleteTextarea/types.d.ts +0 -15
  460. package/dist/components/AutoCompleteTextarea/utils.d.ts +0 -6
  461. package/dist/components/AutoCompleteTextarea/utils.js +0 -40
  462. package/dist/components/ChatAutoComplete/ChatAutoComplete.d.ts +0 -78
  463. package/dist/components/ChatAutoComplete/ChatAutoComplete.js +0 -33
  464. package/dist/components/ChatAutoComplete/index.d.ts +0 -1
  465. package/dist/components/ChatAutoComplete/index.js +0 -1
  466. package/dist/components/CommandItem/index.d.ts +0 -1
  467. package/dist/components/CommandItem/index.js +0 -1
  468. package/dist/components/EmoticonItem/EmoticonItem.js +0 -16
  469. package/dist/components/EmoticonItem/index.d.ts +0 -1
  470. package/dist/components/EmoticonItem/index.js +0 -1
  471. package/dist/components/MessageInput/DefaultTriggerProvider.d.ts +0 -35
  472. package/dist/components/MessageInput/DefaultTriggerProvider.js +0 -24
  473. package/dist/components/MessageInput/DropzoneProvider.d.ts +0 -4
  474. package/dist/components/MessageInput/DropzoneProvider.js +0 -23
  475. package/dist/components/MessageInput/hooks/useAttachments.d.ts +0 -14
  476. package/dist/components/MessageInput/hooks/useAttachments.js +0 -209
  477. package/dist/components/MessageInput/hooks/useCommandTrigger.d.ts +0 -3
  478. package/dist/components/MessageInput/hooks/useCommandTrigger.js +0 -62
  479. package/dist/components/MessageInput/hooks/useEmojiTrigger.d.ts +0 -3
  480. package/dist/components/MessageInput/hooks/useEmojiTrigger.js +0 -29
  481. package/dist/components/MessageInput/hooks/useLinkPreviews.d.ts +0 -30
  482. package/dist/components/MessageInput/hooks/useLinkPreviews.js +0 -109
  483. package/dist/components/MessageInput/hooks/useMessageInputState.d.ts +0 -71
  484. package/dist/components/MessageInput/hooks/useMessageInputState.js +0 -200
  485. package/dist/components/MessageInput/hooks/useUserTrigger.d.ts +0 -12
  486. package/dist/components/MessageInput/hooks/useUserTrigger.js +0 -130
  487. package/dist/components/MessageInput/types.d.ts +0 -87
  488. package/dist/components/MessageInput/types.js +0 -19
  489. package/dist/components/ReactFileUtilities/ImageDropzone.d.ts +0 -16
  490. package/dist/components/ReactFileUtilities/ImageDropzone.js +0 -42
  491. package/dist/components/UserItem/UserItem.js +0 -26
  492. package/dist/components/UserItem/index.d.ts +0 -1
  493. package/dist/components/UserItem/index.js +0 -1
  494. /package/dist/components/{MessageInput → MediaRecorder/AudioRecorder}/hooks/useTimeElapsed.d.ts +0 -0
  495. /package/dist/components/{MessageInput → MediaRecorder/AudioRecorder}/hooks/useTimeElapsed.js +0 -0
  496. /package/dist/scss/v2/DragAndDropContainer/{DragAmdDropContainer-layout.scss → DragAndDropContainer-layout.scss} +0 -0
  497. /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,41 +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';
10
+ import { useRegisterDropHandlers } from './WithDragAndDropUpload';
11
11
  const MessageInputProvider = (props) => {
12
12
  const cooldownTimerState = useCooldownTimer();
13
- const messageInputState = useMessageInputState(props);
13
+ const messageInputUiApi = useMessageInputControls(props);
14
14
  const { emojiSearchIndex } = useComponentContext('MessageInput');
15
15
  const messageInputContextValue = useCreateMessageInputContext({
16
16
  ...cooldownTimerState,
17
- ...messageInputState,
17
+ ...messageInputUiApi,
18
18
  ...props,
19
19
  emojiSearchIndex: props.emojiSearchIndex ?? emojiSearchIndex,
20
20
  });
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();
21
37
  return (React.createElement(MessageInputContextProvider, { value: messageInputContextValue }, props.children));
22
38
  };
23
39
  const UnMemoizedMessageInput = (props) => {
24
40
  const { Input: PropInput } = props;
25
- const { dragAndDropWindow } = useChannelStateContext();
26
- const { Input: ContextInput, TriggerProvider = DefaultTriggerProvider } = useComponentContext('MessageInput');
41
+ const { Input: ContextInput } = useComponentContext('MessageInput');
27
42
  const Input = PropInput || ContextInput || MessageInputFlat;
28
43
  const dialogManagerId = props.isThreadInput
29
44
  ? 'message-input-dialog-manager-thread'
30
45
  : 'message-input-dialog-manager';
31
- if (dragAndDropWindow)
32
- return (React.createElement(DialogManagerProvider, { id: dialogManagerId },
33
- React.createElement(TriggerProvider, null,
34
- React.createElement(Input, null))));
35
46
  return (React.createElement(DialogManagerProvider, { id: dialogManagerId },
36
47
  React.createElement(MessageInputProvider, { ...props },
37
- React.createElement(TriggerProvider, null,
38
- React.createElement(Input, null)))));
48
+ React.createElement(Input, null))));
39
49
  };
40
50
  /**
41
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,6 +1,4 @@
1
- import React, { useCallback, useEffect, useMemo, useState } from 'react';
2
- import clsx from 'clsx';
3
- import { useDropzone } from 'react-dropzone';
1
+ import React, { useCallback, useState } from 'react';
4
2
  import { AttachmentSelector as DefaultAttachmentSelector, SimpleAttachmentSelector, } from './AttachmentSelector';
5
3
  import { AttachmentPreviewList as DefaultAttachmentPreviewList } from './AttachmentPreviewList';
6
4
  import { CooldownTimer as DefaultCooldownTimer } from './CooldownTimer';
@@ -9,21 +7,19 @@ import { StopAIGenerationButton as DefaultStopAIGenerationButton } from './StopA
9
7
  import { AudioRecorder as DefaultAudioRecorder, RecordingPermissionDeniedNotification as DefaultRecordingPermissionDeniedNotification, StartRecordingAudioButton as DefaultStartRecordingAudioButton, RecordingPermission, } from '../MediaRecorder';
10
8
  import { QuotedMessagePreview as DefaultQuotedMessagePreview, QuotedMessagePreviewHeader, } from './QuotedMessagePreview';
11
9
  import { LinkPreviewList as DefaultLinkPreviewList } from './LinkPreviewList';
12
- import { ChatAutoComplete } from '../ChatAutoComplete/ChatAutoComplete';
10
+ import { TextareaComposer } from '../TextareaComposer';
11
+ import { AIStates, useAIState } from '../AIStateIndicator';
13
12
  import { RecordingAttachmentType } from '../MediaRecorder/classes';
14
13
  import { useChatContext } from '../../context/ChatContext';
15
- import { useChannelActionContext } from '../../context/ChannelActionContext';
16
- import { useChannelStateContext } from '../../context/ChannelStateContext';
17
- import { useTranslationContext } from '../../context/TranslationContext';
18
14
  import { useMessageInputContext } from '../../context/MessageInputContext';
19
15
  import { useComponentContext } from '../../context/ComponentContext';
20
- import { AIStates, useAIState } from '../AIStateIndicator';
16
+ import { useAttachmentManagerState } from './hooks/useAttachmentManagerState';
17
+ import { useMessageContext } from '../../context';
18
+ import { WithDragAndDropUpload } from './WithDragAndDropUpload';
21
19
  export const MessageInputFlat = () => {
22
- const { t } = useTranslationContext('MessageInputFlat');
23
- const { asyncMessagesMultiSendEnabled, attachments, cooldownRemaining, findAndEnqueueURLsToEnrich, handleSubmit, hideSendButton, isUploadEnabled, linkPreviews, maxFilesLeft, message, numberOfUploads, parent, recordingController, setCooldownRemaining, text, uploadNewFiles, } = useMessageInputContext('MessageInputFlat');
20
+ const { message } = useMessageContext();
21
+ const { asyncMessagesMultiSendEnabled, cooldownRemaining, handleSubmit, hideSendButton, recordingController, setCooldownRemaining, } = useMessageInputContext('MessageInputFlat');
24
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');
25
- const { acceptedFiles = [], multipleUploads, quotedMessage, } = useChannelStateContext('MessageInputFlat');
26
- const { setQuotedMessage } = useChannelActionContext('MessageInputFlat');
27
23
  const { channel } = useChatContext('MessageInputFlat');
28
24
  const { aiState } = useAIState(channel);
29
25
  const stopGenerating = useCallback(() => channel?.stopAIResponse(), [channel]);
@@ -31,41 +27,9 @@ export const MessageInputFlat = () => {
31
27
  const closePermissionDeniedNotification = useCallback(() => {
32
28
  setShowRecordingPermissionDeniedNotification(false);
33
29
  }, []);
34
- const failedUploadsCount = useMemo(() => attachments.filter((a) => a.localMetadata?.uploadState === 'failed').length, [attachments]);
35
- const accept = useMemo(() => acceptedFiles.reduce((mediaTypeMap, mediaType) => {
36
- mediaTypeMap[mediaType] ?? (mediaTypeMap[mediaType] = []);
37
- return mediaTypeMap;
38
- }, {}), [acceptedFiles]);
39
- const { getRootProps, isDragActive, isDragReject } = useDropzone({
40
- accept,
41
- disabled: !isUploadEnabled || maxFilesLeft === 0,
42
- multiple: multipleUploads,
43
- noClick: true,
44
- onDrop: uploadNewFiles,
45
- });
46
- useEffect(() => {
47
- const handleQuotedMessageUpdate = (e) => {
48
- if (e.message?.id !== quotedMessage?.id)
49
- return;
50
- if (e.type === 'message.deleted') {
51
- setQuotedMessage(undefined);
52
- return;
53
- }
54
- setQuotedMessage(e.message);
55
- };
56
- channel?.on('message.deleted', handleQuotedMessageUpdate);
57
- channel?.on('message.updated', handleQuotedMessageUpdate);
58
- return () => {
59
- channel?.off('message.deleted', handleQuotedMessageUpdate);
60
- channel?.off('message.updated', handleQuotedMessageUpdate);
61
- };
62
- // eslint-disable-next-line react-hooks/exhaustive-deps
63
- }, [channel, quotedMessage]);
30
+ const { attachments } = useAttachmentManagerState();
64
31
  if (recordingController.recordingState)
65
32
  return React.createElement(AudioRecorder, null);
66
- // TODO: "!message" condition is a temporary fix for shared
67
- // state when editing a message (fix shared state issue)
68
- const displayQuotedMessage = !message && quotedMessage && quotedMessage.parent_id === parent?.id;
69
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
70
34
  const isRecording = !!recordingController.recordingState;
71
35
  /**
@@ -79,35 +43,26 @@ export const MessageInputFlat = () => {
79
43
  : StopAIGenerationButtonOverride;
80
44
  const shouldDisplayStopAIGeneration = [AIStates.Thinking, AIStates.Generating].includes(aiState) &&
81
45
  !!StopAIGenerationButton;
82
- return (React.createElement(React.Fragment, null,
83
- React.createElement("div", { ...getRootProps({ className: 'str-chat__message-input' }) },
84
- recordingEnabled &&
85
- recordingController.permissionState === 'denied' &&
86
- showRecordingPermissionDeniedNotification && (React.createElement(RecordingPermissionDeniedNotification, { onClose: closePermissionDeniedNotification, permissionName: RecordingPermission.MIC })),
87
- findAndEnqueueURLsToEnrich && (React.createElement(LinkPreviewList, { linkPreviews: Array.from(linkPreviews.values()) })),
88
- isDragActive && (React.createElement("div", { className: clsx('str-chat__dropzone-container', {
89
- 'str-chat__dropzone-container--not-accepted': isDragReject,
90
- }) },
91
- !isDragReject && React.createElement("p", null, t('Drag your files here')),
92
- isDragReject && React.createElement("p", null, t('Some of the files will not be accepted')))),
93
- displayQuotedMessage && React.createElement(QuotedMessagePreviewHeader, null),
94
- React.createElement("div", { className: 'str-chat__message-input-inner' },
95
- React.createElement(AttachmentSelector, null),
96
- React.createElement("div", { className: 'str-chat__message-textarea-container' },
97
- displayQuotedMessage && (React.createElement(QuotedMessagePreview, { quotedMessage: quotedMessage })),
98
- isUploadEnabled &&
99
- !!(numberOfUploads + failedUploadsCount || attachments.length > 0) && (React.createElement(AttachmentPreviewList, null)),
100
- React.createElement("div", { className: 'str-chat__message-textarea-with-emoji-picker' },
101
- React.createElement(ChatAutoComplete, null),
102
- EmojiPicker && React.createElement(EmojiPicker, null))),
103
- 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,
104
- React.createElement(SendButton, { disabled: !numberOfUploads &&
105
- !text.length &&
106
- attachments.length - failedUploadsCount === 0, sendMessage: handleSubmit }),
107
- recordingEnabled && (React.createElement(StartRecordingAudioButton, { disabled: isRecording ||
108
- (!asyncMessagesMultiSendEnabled &&
109
- attachments.some((a) => a.type === RecordingAttachmentType.VOICE_RECORDING)), onClick: () => {
110
- recordingController.recorder?.start();
111
- setShowRecordingPermissionDeniedNotification(true);
112
- } })))))))))));
46
+ return (React.createElement(WithDragAndDropUpload, { className: 'str-chat__message-input', component: 'div' },
47
+ recordingEnabled &&
48
+ recordingController.permissionState === 'denied' &&
49
+ showRecordingPermissionDeniedNotification && (React.createElement(RecordingPermissionDeniedNotification, { onClose: closePermissionDeniedNotification, permissionName: RecordingPermission.MIC })),
50
+ React.createElement(LinkPreviewList, null),
51
+ React.createElement(QuotedMessagePreviewHeader, null),
52
+ React.createElement("div", { className: 'str-chat__message-input-inner' },
53
+ React.createElement(AttachmentSelector, null),
54
+ React.createElement("div", { className: 'str-chat__message-textarea-container' },
55
+ React.createElement(QuotedMessagePreview, null),
56
+ React.createElement(AttachmentPreviewList, null),
57
+ React.createElement("div", { className: 'str-chat__message-textarea-with-emoji-picker' },
58
+ React.createElement(TextareaComposer, null),
59
+ EmojiPicker && React.createElement(EmojiPicker, null))),
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,
61
+ React.createElement(SendButton, { sendMessage: handleSubmit }),
62
+ recordingEnabled && (React.createElement(StartRecordingAudioButton, { disabled: isRecording ||
63
+ (!asyncMessagesMultiSendEnabled &&
64
+ attachments.some((a) => a.type === RecordingAttachmentType.VOICE_RECORDING)), onClick: () => {
65
+ recordingController.recorder?.start();
66
+ setShowRecordingPermissionDeniedNotification(true);
67
+ } }))))))))));
113
68
  };
@@ -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
+ };
@@ -0,0 +1,38 @@
1
+ import type { CSSProperties, ElementType, PropsWithChildren } from 'react';
2
+ import React from 'react';
3
+ export declare const useDragAndDropUploadContext: () => {
4
+ subscribeToDrop: ((fn: (files: File[]) => void) => () => void) | null;
5
+ };
6
+ /**
7
+ * @private This hook should be used only once directly in the `MessageInputProvider` to
8
+ * register `uploadNewFiles` functions of the rendered `MessageInputs`. Each `MessageInput`
9
+ * will then be notified when the drop event occurs from within the `WithDragAndDropUpload`
10
+ * component.
11
+ */
12
+ export declare const useRegisterDropHandlers: () => void;
13
+ /**
14
+ * Wrapper to replace now deprecated `Channel.dragAndDropWindow` option.
15
+ *
16
+ * @example
17
+ * ```tsx
18
+ * <Channel>
19
+ * <WithDragAndDropUpload component="section" className="message-list-dnd-wrapper">
20
+ * <Window>
21
+ * <MessageList />
22
+ * <MessageInput />
23
+ * </Window>
24
+ * </WithDragAndDropUpload>
25
+ * <Thread />
26
+ * <Channel>
27
+ * ```
28
+ */
29
+ export declare const WithDragAndDropUpload: ({ children, className, component: Component, style, }: PropsWithChildren<{
30
+ acceptedFiles?: string[];
31
+ /**
32
+ * @description An element to render as a wrapper onto which drag & drop functionality will be applied.
33
+ * @default 'div'
34
+ */
35
+ component?: ElementType;
36
+ className?: string;
37
+ style?: CSSProperties;
38
+ }>) => React.JSX.Element;