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.
- package/dist/components/AIStateIndicator/AIStateIndicator.d.ts +4 -5
- package/dist/components/AIStateIndicator/hooks/useAIState.d.ts +2 -3
- package/dist/components/Attachment/Attachment.d.ts +8 -9
- package/dist/components/Attachment/Attachment.js +6 -5
- package/dist/components/Attachment/AttachmentActions.d.ts +2 -3
- package/dist/components/Attachment/AttachmentContainer.d.ts +15 -15
- package/dist/components/Attachment/AttachmentContainer.js +2 -2
- package/dist/components/Attachment/Audio.d.ts +3 -4
- package/dist/components/Attachment/Card.d.ts +1 -1
- package/dist/components/Attachment/FileAttachment.d.ts +3 -4
- package/dist/components/Attachment/FileAttachment.js +1 -1
- package/dist/components/Attachment/UnsupportedAttachment.d.ts +3 -4
- package/dist/components/Attachment/UnsupportedAttachment.js +1 -1
- package/dist/components/Attachment/VoiceRecording.d.ts +4 -5
- package/dist/components/Attachment/components/FileSizeIndicator.d.ts +1 -1
- package/dist/components/Attachment/components/FileSizeIndicator.js +4 -2
- package/dist/components/Attachment/utils.d.ts +8 -22
- package/dist/components/Attachment/utils.js +3 -18
- package/dist/components/Avatar/Avatar.d.ts +3 -4
- package/dist/components/Avatar/ChannelAvatar.d.ts +3 -4
- package/dist/components/Avatar/ChannelAvatar.js +1 -1
- package/dist/components/Avatar/GroupAvatar.d.ts +2 -2
- package/dist/components/Channel/Channel.d.ts +18 -43
- package/dist/components/Channel/Channel.js +25 -88
- package/dist/components/Channel/channelState.d.ts +17 -18
- package/dist/components/Channel/hooks/useChannelContainerClasses.d.ts +2 -3
- package/dist/components/Channel/hooks/useCreateChannelStateContext.d.ts +2 -3
- package/dist/components/Channel/hooks/useCreateChannelStateContext.js +1 -15
- package/dist/components/Channel/hooks/useCreateTypingContext.d.ts +1 -2
- package/dist/components/Channel/hooks/useEditMessageHandler.d.ts +3 -4
- package/dist/components/Channel/hooks/useMentionsHandlers.d.ts +3 -4
- package/dist/components/Channel/utils.d.ts +8 -6
- package/dist/components/Channel/utils.js +1 -0
- package/dist/components/ChannelHeader/ChannelHeader.d.ts +2 -3
- package/dist/components/ChannelList/ChannelList.d.ts +31 -30
- package/dist/components/ChannelList/ChannelList.js +8 -10
- package/dist/components/ChannelList/ChannelListMessenger.d.ts +6 -6
- package/dist/components/ChannelList/hooks/useChannelDeletedListener.d.ts +1 -2
- package/dist/components/ChannelList/hooks/useChannelHiddenListener.d.ts +1 -2
- package/dist/components/ChannelList/hooks/useChannelListShape.d.ts +44 -44
- package/dist/components/ChannelList/hooks/useChannelListShape.js +0 -2
- package/dist/components/ChannelList/hooks/useChannelMembershipState.d.ts +3 -3
- package/dist/components/ChannelList/hooks/useChannelTruncatedListener.d.ts +1 -2
- package/dist/components/ChannelList/hooks/useChannelUpdatedListener.d.ts +1 -2
- package/dist/components/ChannelList/hooks/useChannelVisibleListener.d.ts +1 -2
- package/dist/components/ChannelList/hooks/useConnectionRecoveredListener.d.ts +1 -2
- package/dist/components/ChannelList/hooks/useMessageNewListener.d.ts +1 -2
- package/dist/components/ChannelList/hooks/useNotificationAddedToChannelListener.d.ts +1 -2
- package/dist/components/ChannelList/hooks/useNotificationMessageNewListener.d.ts +1 -2
- package/dist/components/ChannelList/hooks/useNotificationRemovedFromChannelListener.d.ts +1 -2
- package/dist/components/ChannelList/hooks/usePaginatedChannels.d.ts +7 -8
- package/dist/components/ChannelList/hooks/usePaginatedChannels.js +3 -3
- package/dist/components/ChannelList/hooks/useSelectedChannelState.d.ts +7 -7
- package/dist/components/ChannelList/hooks/useUserPresenceChangedListener.d.ts +1 -2
- package/dist/components/ChannelList/utils.d.ts +20 -21
- package/dist/components/ChannelList/utils.js +2 -2
- package/dist/components/ChannelPreview/ChannelPreview.d.ts +15 -16
- package/dist/components/ChannelPreview/ChannelPreview.js +1 -1
- package/dist/components/ChannelPreview/ChannelPreviewActionButtons.d.ts +4 -4
- package/dist/components/ChannelPreview/ChannelPreviewMessenger.d.ts +1 -2
- package/dist/components/ChannelPreview/hooks/useChannelPreviewInfo.d.ts +3 -4
- package/dist/components/ChannelPreview/hooks/useIsChannelMuted.d.ts +1 -2
- package/dist/components/ChannelPreview/hooks/useMessageDeliveryStatus.d.ts +5 -7
- package/dist/components/ChannelPreview/icons.d.ts +1 -1
- package/dist/components/ChannelPreview/utils.d.ts +7 -7
- package/dist/components/ChannelSearch/ChannelSearch.d.ts +5 -6
- package/dist/components/ChannelSearch/ChannelSearch.js +2 -2
- package/dist/components/ChannelSearch/SearchBar.d.ts +1 -1
- package/dist/components/ChannelSearch/SearchBar.js +1 -1
- package/dist/components/ChannelSearch/SearchResults.d.ts +13 -14
- package/dist/components/ChannelSearch/SearchResults.js +1 -1
- package/dist/components/ChannelSearch/hooks/useChannelSearch.d.ts +17 -18
- package/dist/components/ChannelSearch/hooks/useChannelSearch.js +2 -6
- package/dist/components/ChannelSearch/utils.d.ts +2 -3
- package/dist/components/Chat/Chat.d.ts +9 -9
- package/dist/components/Chat/hooks/useChannelsQueryState.d.ts +1 -1
- package/dist/components/Chat/hooks/useChat.d.ts +10 -10
- package/dist/components/Chat/hooks/useChat.js +3 -3
- package/dist/components/Chat/hooks/useCreateChatClient.d.ts +4 -4
- package/dist/components/Chat/hooks/useCreateChatContext.d.ts +1 -2
- package/dist/components/Dialog/DialogAnchor.d.ts +4 -3
- package/dist/components/Dialog/DialogAnchor.js +2 -2
- package/dist/components/Dialog/DialogMenu.d.ts +2 -1
- package/dist/components/Dialog/DialogPortal.d.ts +2 -1
- package/dist/components/Dialog/FormDialog.d.ts +2 -1
- package/dist/components/Dialog/FormDialog.js +1 -1
- package/dist/components/Dialog/PromptDialog.d.ts +2 -1
- package/dist/components/DragAndDrop/DragAndDropContainer.d.ts +2 -1
- package/dist/components/EventComponent/EventComponent.d.ts +7 -6
- package/dist/components/Form/FieldError.d.ts +2 -1
- package/dist/components/Form/SwitchField.d.ts +2 -1
- package/dist/components/Form/SwitchField.js +1 -1
- package/dist/components/Gallery/Gallery.d.ts +5 -5
- package/dist/components/Gallery/Image.d.ts +6 -5
- package/dist/components/Gallery/ModalGallery.d.ts +3 -4
- package/dist/components/InfiniteScrollPaginator/InfiniteScroll.d.ts +2 -1
- package/dist/components/InfiniteScrollPaginator/InfiniteScrollPaginator.d.ts +2 -1
- package/dist/components/LoadMore/LoadMoreButton.d.ts +2 -1
- package/dist/components/LoadMore/LoadMorePaginator.d.ts +3 -2
- package/dist/components/LoadMore/LoadMorePaginator.js +1 -1
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecorder.js +3 -2
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecordingInProgress.js +1 -1
- package/dist/components/MediaRecorder/RecordingPermissionDeniedNotification.d.ts +1 -1
- package/dist/components/MediaRecorder/classes/MediaRecorderController.d.ts +11 -23
- package/dist/components/MediaRecorder/hooks/useMediaRecorder.d.ts +8 -8
- package/dist/components/MediaRecorder/hooks/useMediaRecorder.js +6 -4
- package/dist/components/MediaRecorder/observable/BehaviorSubject.d.ts +2 -2
- package/dist/components/MediaRecorder/observable/Observable.d.ts +1 -1
- package/dist/components/MediaRecorder/observable/Subject.d.ts +3 -2
- package/dist/components/Message/FixedHeightMessage.d.ts +4 -5
- package/dist/components/Message/Message.d.ts +1 -2
- package/dist/components/Message/MessageDeleted.d.ts +4 -5
- package/dist/components/Message/MessageEditedTimestamp.d.ts +2 -3
- package/dist/components/Message/MessageErrorText.d.ts +4 -5
- package/dist/components/Message/MessageErrorText.js +2 -2
- package/dist/components/Message/MessageOptions.d.ts +3 -3
- package/dist/components/Message/MessageRepliesCountButton.d.ts +2 -1
- package/dist/components/Message/MessageSimple.d.ts +1 -2
- package/dist/components/Message/MessageSimple.js +8 -10
- package/dist/components/Message/MessageStatus.d.ts +3 -4
- package/dist/components/Message/MessageText.d.ts +6 -6
- package/dist/components/Message/MessageTimestamp.d.ts +4 -5
- package/dist/components/Message/QuotedMessage.d.ts +2 -3
- package/dist/components/Message/QuotedMessage.js +1 -1
- package/dist/components/Message/StreamedMessageText.d.ts +3 -4
- package/dist/components/Message/hooks/useActionHandler.d.ts +2 -3
- package/dist/components/Message/hooks/useActionHandler.js +1 -1
- package/dist/components/Message/hooks/useDeleteHandler.d.ts +4 -5
- package/dist/components/Message/hooks/useFlagHandler.d.ts +5 -6
- package/dist/components/Message/hooks/useMarkUnreadHandler.d.ts +5 -6
- package/dist/components/Message/hooks/useMentionsHandler.d.ts +6 -8
- package/dist/components/Message/hooks/useMessageTextStreaming.d.ts +2 -3
- package/dist/components/Message/hooks/useMuteHandler.d.ts +5 -7
- package/dist/components/Message/hooks/useMuteHandler.js +1 -1
- package/dist/components/Message/hooks/useOpenThreadHandler.d.ts +2 -3
- package/dist/components/Message/hooks/usePinHandler.d.ts +4 -5
- package/dist/components/Message/hooks/usePinHandler.js +1 -1
- package/dist/components/Message/hooks/useReactionHandler.d.ts +3 -4
- package/dist/components/Message/hooks/useReactionHandler.js +2 -4
- package/dist/components/Message/hooks/useReactionsFetcher.d.ts +5 -7
- package/dist/components/Message/hooks/useRetryHandler.d.ts +2 -3
- package/dist/components/Message/hooks/useRetryHandler.js +1 -1
- package/dist/components/Message/hooks/useUserHandler.d.ts +5 -6
- package/dist/components/Message/hooks/useUserRole.d.ts +2 -3
- package/dist/components/Message/hooks/useUserRole.js +1 -1
- package/dist/components/Message/icons.d.ts +2 -2
- package/dist/components/Message/icons.js +1 -1
- package/dist/components/Message/renderText/componentRenderers/Anchor.d.ts +2 -1
- package/dist/components/Message/renderText/componentRenderers/Emoji.d.ts +1 -1
- package/dist/components/Message/renderText/componentRenderers/Mention.d.ts +5 -5
- package/dist/components/Message/renderText/componentRenderers/Mention.js +1 -1
- package/dist/components/Message/renderText/rehypePlugins/mentionsMarkdownPlugin.d.ts +1 -2
- package/dist/components/Message/renderText/renderText.d.ts +6 -6
- package/dist/components/Message/renderText/types.d.ts +1 -1
- package/dist/components/Message/types.d.ts +27 -28
- package/dist/components/Message/utils.d.ts +21 -22
- package/dist/components/Message/utils.js +5 -4
- package/dist/components/MessageActions/CustomMessageActionsList.d.ts +6 -7
- package/dist/components/MessageActions/MessageActions.d.ts +6 -5
- package/dist/components/MessageActions/MessageActions.js +1 -1
- package/dist/components/MessageActions/MessageActionsBox.d.ts +5 -5
- package/dist/components/MessageActions/MessageActionsBox.js +4 -3
- package/dist/components/MessageActions/hooks/useMessageActionsBoxPopper.d.ts +1 -1
- package/dist/components/MessageBounce/MessageBounceModal.d.ts +4 -3
- package/dist/components/MessageBounce/MessageBouncePrompt.d.ts +1 -2
- package/dist/components/MessageInput/AttachmentPreviewList/AttachmentPreviewList.d.ts +11 -11
- package/dist/components/MessageInput/AttachmentPreviewList/AttachmentPreviewList.js +17 -14
- package/dist/components/MessageInput/AttachmentPreviewList/FileAttachmentPreview.d.ts +4 -12
- package/dist/components/MessageInput/AttachmentPreviewList/FileAttachmentPreview.js +8 -5
- package/dist/components/MessageInput/AttachmentPreviewList/ImageAttachmentPreview.d.ts +4 -5
- package/dist/components/MessageInput/AttachmentPreviewList/ImageAttachmentPreview.js +2 -2
- package/dist/components/MessageInput/AttachmentPreviewList/UnsupportedAttachmentPreview.d.ts +7 -5
- package/dist/components/MessageInput/AttachmentPreviewList/UnsupportedAttachmentPreview.js +5 -2
- package/dist/components/MessageInput/AttachmentPreviewList/VoiceRecordingPreview.d.ts +4 -5
- package/dist/components/MessageInput/AttachmentPreviewList/VoiceRecordingPreview.js +5 -2
- package/dist/components/MessageInput/AttachmentPreviewList/index.d.ts +1 -1
- package/dist/components/MessageInput/AttachmentPreviewList/types.d.ts +3 -4
- package/dist/components/MessageInput/AttachmentSelector.d.ts +1 -2
- package/dist/components/MessageInput/AttachmentSelector.js +5 -3
- package/dist/components/MessageInput/EditMessageForm.d.ts +3 -2
- package/dist/components/MessageInput/EditMessageForm.js +30 -6
- package/dist/components/MessageInput/LinkPreviewList.d.ts +6 -4
- package/dist/components/MessageInput/LinkPreviewList.js +24 -10
- package/dist/components/MessageInput/MessageInput.d.ts +23 -45
- package/dist/components/MessageInput/MessageInput.js +24 -17
- package/dist/components/MessageInput/MessageInputFlat.d.ts +1 -2
- package/dist/components/MessageInput/MessageInputFlat.js +14 -39
- package/dist/components/MessageInput/QuotedMessagePreview.d.ts +4 -7
- package/dist/components/MessageInput/QuotedMessagePreview.js +22 -16
- package/dist/components/MessageInput/SendButton.d.ts +4 -5
- package/dist/components/MessageInput/SendButton.js +6 -2
- package/dist/components/MessageInput/WithDragAndDropUpload.d.ts +4 -3
- package/dist/components/MessageInput/WithDragAndDropUpload.js +20 -9
- package/dist/components/MessageInput/hooks/index.d.ts +5 -1
- package/dist/components/MessageInput/hooks/index.js +5 -1
- package/dist/components/MessageInput/hooks/useAttachmentManagerState.d.ts +10 -0
- package/dist/components/MessageInput/hooks/useAttachmentManagerState.js +19 -0
- package/dist/components/MessageInput/hooks/useCanCreatePoll.d.ts +1 -0
- package/dist/components/MessageInput/hooks/useCanCreatePoll.js +10 -0
- package/dist/components/MessageInput/hooks/useCooldownTimer.d.ts +2 -3
- package/dist/components/MessageInput/hooks/useCreateMessageInputContext.d.ts +1 -2
- package/dist/components/MessageInput/hooks/useCreateMessageInputContext.js +1 -55
- package/dist/components/MessageInput/hooks/useMessageComposer.d.ts +2 -0
- package/dist/components/MessageInput/hooks/useMessageComposer.js +80 -0
- package/dist/components/MessageInput/hooks/useMessageComposerHasSendableData.d.ts +1 -0
- package/dist/components/MessageInput/hooks/useMessageComposerHasSendableData.js +8 -0
- package/dist/components/MessageInput/hooks/useMessageInputControls.d.ts +12 -0
- package/dist/components/MessageInput/hooks/useMessageInputControls.js +23 -0
- package/dist/components/MessageInput/hooks/useMessageInputText.d.ts +1 -5
- package/dist/components/MessageInput/hooks/useMessageInputText.js +19 -53
- package/dist/components/MessageInput/hooks/usePasteHandler.d.ts +1 -3
- package/dist/components/MessageInput/hooks/usePasteHandler.js +6 -8
- package/dist/components/MessageInput/hooks/useSubmitHandler.d.ts +2 -6
- package/dist/components/MessageInput/hooks/useSubmitHandler.js +30 -98
- package/dist/components/MessageInput/hooks/utils.d.ts +0 -27
- package/dist/components/MessageInput/hooks/utils.js +0 -124
- package/dist/components/MessageInput/index.d.ts +0 -2
- package/dist/components/MessageInput/index.js +0 -2
- package/dist/components/MessageList/ConnectionStatus.d.ts +1 -2
- package/dist/components/MessageList/ConnectionStatus.js +1 -1
- package/dist/components/MessageList/CustomNotification.d.ts +2 -1
- package/dist/components/MessageList/GiphyPreviewMessage.d.ts +4 -5
- package/dist/components/MessageList/MessageList.d.ts +11 -12
- package/dist/components/MessageList/MessageList.js +4 -4
- package/dist/components/MessageList/MessageNotification.d.ts +2 -1
- package/dist/components/MessageList/VirtualizedMessageList.d.ts +22 -21
- package/dist/components/MessageList/VirtualizedMessageList.js +6 -6
- package/dist/components/MessageList/VirtualizedMessageListComponents.d.ts +10 -10
- package/dist/components/MessageList/VirtualizedMessageListComponents.js +7 -7
- package/dist/components/MessageList/hooks/MessageList/useEnrichedMessages.d.ts +8 -10
- package/dist/components/MessageList/hooks/MessageList/useEnrichedMessages.js +1 -1
- package/dist/components/MessageList/hooks/MessageList/useMessageListElements.d.ts +11 -12
- package/dist/components/MessageList/hooks/MessageList/useMessageListScrollManager.d.ts +4 -5
- package/dist/components/MessageList/hooks/MessageList/useScrollLocationLogic.d.ts +5 -6
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.d.ts +4 -5
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.js +3 -2
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.d.ts +4 -5
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.js +1 -1
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.d.ts +2 -3
- package/dist/components/MessageList/hooks/VirtualizedMessageList/usePrependMessagesCount.d.ts +2 -3
- package/dist/components/MessageList/hooks/VirtualizedMessageList/usePrependMessagesCount.js +6 -2
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.d.ts +4 -5
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useShouldForceScrollToBottom.d.ts +2 -3
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.d.ts +3 -4
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.js +5 -6
- package/dist/components/MessageList/hooks/useLastReadData.d.ts +5 -6
- package/dist/components/MessageList/hooks/useLastReadData.js +5 -1
- package/dist/components/MessageList/hooks/useMarkRead.d.ts +1 -2
- package/dist/components/MessageList/renderMessages.d.ts +14 -14
- package/dist/components/MessageList/renderMessages.js +8 -7
- package/dist/components/MessageList/utils.d.ts +34 -28
- package/dist/components/MessageList/utils.js +26 -21
- package/dist/components/Modal/Modal.d.ts +2 -1
- package/dist/components/Poll/Poll.d.ts +2 -3
- package/dist/components/Poll/Poll.js +1 -1
- package/dist/components/Poll/PollActions/AddCommentForm.d.ts +1 -2
- package/dist/components/Poll/PollActions/AddCommentForm.js +4 -2
- package/dist/components/Poll/PollActions/EndPollDialog.d.ts +1 -2
- package/dist/components/Poll/PollActions/EndPollDialog.js +1 -1
- package/dist/components/Poll/PollActions/PollAction.d.ts +2 -1
- package/dist/components/Poll/PollActions/PollActions.d.ts +7 -8
- package/dist/components/Poll/PollActions/PollActions.js +5 -5
- package/dist/components/Poll/PollActions/PollAnswerList.d.ts +1 -2
- package/dist/components/Poll/PollActions/PollOptionsFullList.d.ts +1 -2
- package/dist/components/Poll/PollActions/PollOptionsFullList.js +4 -2
- package/dist/components/Poll/PollActions/PollResults/PollOptionVotesList.d.ts +3 -4
- package/dist/components/Poll/PollActions/PollResults/PollOptionVotesList.js +1 -1
- package/dist/components/Poll/PollActions/PollResults/PollOptionWithLatestVotes.d.ts +3 -4
- package/dist/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.d.ts +4 -5
- package/dist/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.js +1 -1
- package/dist/components/Poll/PollActions/PollResults/PollResults.d.ts +1 -2
- package/dist/components/Poll/PollActions/PollResults/PollResults.js +1 -1
- package/dist/components/Poll/PollActions/SuggestPollOptionForm.d.ts +1 -2
- package/dist/components/Poll/PollActions/SuggestPollOptionForm.js +3 -1
- package/dist/components/Poll/PollContent.d.ts +1 -2
- package/dist/components/Poll/PollCreationDialog/MultipleAnswersField.d.ts +2 -0
- package/dist/components/Poll/PollCreationDialog/MultipleAnswersField.js +35 -0
- package/dist/components/Poll/PollCreationDialog/NameField.d.ts +2 -0
- package/dist/components/Poll/PollCreationDialog/NameField.js +26 -0
- package/dist/components/Poll/PollCreationDialog/OptionFieldSet.d.ts +1 -8
- package/dist/components/Poll/PollCreationDialog/OptionFieldSet.js +33 -65
- package/dist/components/Poll/PollCreationDialog/PollCreationDialog.js +31 -85
- package/dist/components/Poll/PollCreationDialog/PollCreationDialogControls.d.ts +1 -4
- package/dist/components/Poll/PollCreationDialog/PollCreationDialogControls.js +15 -41
- package/dist/components/Poll/PollCreationDialog/types.d.ts +0 -14
- package/dist/components/Poll/PollHeader.d.ts +1 -2
- package/dist/components/Poll/PollOptionList.d.ts +1 -2
- package/dist/components/Poll/PollOptionList.js +4 -2
- package/dist/components/Poll/PollOptionSelector.d.ts +3 -4
- package/dist/components/Poll/PollVote.d.ts +6 -7
- package/dist/components/Poll/PollVote.js +3 -3
- package/dist/components/Poll/QuotedPoll.d.ts +1 -2
- package/dist/components/Poll/constants.d.ts +0 -1
- package/dist/components/Poll/constants.js +0 -1
- package/dist/components/Poll/hooks/useManagePollVotesRealtime.d.ts +2 -3
- package/dist/components/Poll/hooks/usePollAnswerPagination.d.ts +2 -3
- package/dist/components/Poll/hooks/usePollAnswerPagination.js +2 -2
- package/dist/components/Poll/hooks/usePollOptionVotesPagination.d.ts +2 -3
- package/dist/components/Poll/hooks/usePollOptionVotesPagination.js +1 -1
- package/dist/components/Portal/Portal.d.ts +1 -1
- package/dist/components/ReactFileUtilities/FileIcon/FileIcon.d.ts +1 -1
- package/dist/components/ReactFileUtilities/FileIcon/FileIconSet.d.ts +2 -1
- package/dist/components/ReactFileUtilities/FileIcon/iconMap.d.ts +1 -1
- package/dist/components/ReactFileUtilities/UploadButton.d.ts +3 -2
- package/dist/components/ReactFileUtilities/UploadButton.js +16 -6
- package/dist/components/ReactFileUtilities/index.d.ts +0 -1
- package/dist/components/ReactFileUtilities/index.js +0 -1
- package/dist/components/ReactFileUtilities/utils.d.ts +2 -2
- package/dist/components/Reactions/ReactionSelector.d.ts +4 -5
- package/dist/components/Reactions/ReactionSelectorWithButton.d.ts +1 -2
- package/dist/components/Reactions/ReactionsList.d.ts +6 -7
- package/dist/components/Reactions/ReactionsList.js +2 -2
- package/dist/components/Reactions/ReactionsListModal.d.ts +9 -10
- package/dist/components/Reactions/SimpleReactionsList.d.ts +5 -6
- package/dist/components/Reactions/StreamEmoji.d.ts +1 -1
- package/dist/components/Reactions/hooks/useFetchReactions.d.ts +9 -10
- package/dist/components/Reactions/hooks/useProcessReactions.d.ts +1 -2
- package/dist/components/Reactions/types.d.ts +3 -4
- package/dist/components/Reactions/utils/utils.d.ts +1 -1
- package/dist/components/SafeAnchor/SafeAnchor.d.ts +2 -1
- package/dist/components/TextareaComposer/SuggestionList/CommandItem.d.ts +7 -0
- package/dist/components/{CommandItem → TextareaComposer/SuggestionList}/CommandItem.js +1 -2
- package/dist/components/{EmoticonItem → TextareaComposer/SuggestionList}/EmoticonItem.d.ts +7 -7
- package/dist/components/TextareaComposer/SuggestionList/EmoticonItem.js +12 -0
- package/dist/components/TextareaComposer/SuggestionList/SuggestionList.d.ts +14 -0
- package/dist/components/TextareaComposer/SuggestionList/SuggestionList.js +50 -0
- package/dist/components/TextareaComposer/SuggestionList/SuggestionListItem.d.ts +18 -0
- package/dist/components/TextareaComposer/SuggestionList/SuggestionListItem.js +24 -0
- package/dist/components/{UserItem → TextareaComposer/SuggestionList}/UserItem.d.ts +7 -4
- package/dist/components/TextareaComposer/SuggestionList/UserItem.js +24 -0
- package/dist/components/TextareaComposer/SuggestionList/index.d.ts +5 -0
- package/dist/components/TextareaComposer/SuggestionList/index.js +5 -0
- package/dist/components/TextareaComposer/TextareaComposer.d.ts +13 -0
- package/dist/components/TextareaComposer/TextareaComposer.js +155 -0
- package/dist/components/TextareaComposer/index.d.ts +2 -0
- package/dist/components/TextareaComposer/index.js +2 -0
- package/dist/components/Thread/Thread.d.ts +13 -10
- package/dist/components/Thread/Thread.js +23 -12
- package/dist/components/Thread/ThreadHead.d.ts +2 -3
- package/dist/components/Thread/ThreadHeader.d.ts +5 -6
- package/dist/components/Thread/ThreadHeader.js +1 -1
- package/dist/components/Threads/ThreadContext.d.ts +2 -2
- package/dist/components/Threads/ThreadContext.js +1 -4
- package/dist/components/Threads/ThreadList/ThreadList.d.ts +1 -1
- package/dist/components/Threads/ThreadList/ThreadListItem.d.ts +1 -1
- package/dist/components/Threads/hooks/useThreadManagerState.d.ts +1 -1
- package/dist/components/Threads/hooks/useThreadState.d.ts +1 -1
- package/dist/components/Threads/icons.d.ts +1 -1
- package/dist/components/Tooltip/Tooltip.d.ts +3 -2
- package/dist/components/Tooltip/hooks/useEnterLeaveHandlers.d.ts +1 -1
- package/dist/components/TypingIndicator/TypingIndicator.d.ts +1 -2
- package/dist/components/Window/Window.d.ts +6 -6
- package/dist/components/index.d.ts +1 -5
- package/dist/components/index.js +1 -5
- package/dist/context/AttachmentSelectorContext.d.ts +2 -1
- package/dist/context/ChannelActionContext.d.ts +26 -35
- package/dist/context/ChannelListContext.d.ts +9 -9
- package/dist/context/ChannelListContext.js +1 -1
- package/dist/context/ChannelStateContext.d.ts +24 -34
- package/dist/context/ChatContext.d.ts +18 -17
- package/dist/context/ComponentContext.d.ts +39 -37
- package/dist/context/DialogManagerContext.d.ts +2 -1
- package/dist/context/MessageBounceContext.d.ts +8 -7
- package/dist/context/MessageBounceContext.js +1 -1
- package/dist/context/MessageContext.d.ts +23 -23
- package/dist/context/MessageInputContext.d.ts +8 -26
- package/dist/context/MessageListContext.d.ts +2 -1
- package/dist/context/PollContext.d.ts +8 -8
- package/dist/context/TranslationContext.d.ts +2 -1
- package/dist/context/TypingContext.d.ts +11 -10
- package/dist/context/VirtualizedMessageListContext.d.ts +2 -1
- package/dist/context/WithComponents.d.ts +3 -2
- package/dist/css/v2/index.css +1 -1
- package/dist/css/v2/index.layout.css +1 -1
- package/dist/experimental/MessageActions/MessageActions.d.ts +1 -1
- package/dist/experimental/MessageActions/MessageActions.js +1 -1
- package/dist/experimental/MessageActions/defaults.js +4 -3
- package/dist/experimental/Search/Search.d.ts +1 -2
- package/dist/experimental/Search/SearchContext.d.ts +8 -8
- package/dist/experimental/Search/SearchResults/SearchResultItem.d.ts +11 -11
- package/dist/experimental/Search/SearchResults/SearchResultItem.js +3 -3
- package/dist/experimental/Search/SearchResults/SearchResults.d.ts +1 -2
- package/dist/experimental/Search/SearchResults/SearchResultsHeader.d.ts +1 -2
- package/dist/experimental/Search/SearchResults/SearchResultsHeader.js +1 -1
- package/dist/experimental/Search/SearchResults/SearchSourceResultList.d.ts +2 -3
- package/dist/experimental/Search/SearchResults/SearchSourceResultListFooter.d.ts +1 -2
- package/dist/experimental/Search/SearchResults/SearchSourceResults.d.ts +1 -2
- package/dist/experimental/Search/SearchResults/SearchSourceResults.js +1 -1
- package/dist/experimental/Search/SearchSourceResultsContext.d.ts +2 -1
- package/dist/experimental/Search/hooks/useSearchFocusedMessage.d.ts +1 -2
- package/dist/experimental/Search/hooks/useSearchFocusedMessage.js +3 -1
- package/dist/experimental/Search/hooks/useSearchQueriesInProgress.d.ts +3 -4
- package/dist/experimental/index.browser.cjs +1139 -1075
- package/dist/experimental/index.browser.cjs.map +4 -4
- package/dist/experimental/index.node.cjs +1139 -1075
- package/dist/experimental/index.node.cjs.map +4 -4
- package/dist/i18n/Streami18n.d.ts +1 -1
- package/dist/i18n/types.d.ts +2 -2
- package/dist/i18n/utils.d.ts +1 -1
- package/dist/i18n/utils.js +3 -1
- package/dist/index.browser.cjs +28513 -30641
- package/dist/index.browser.cjs.map +4 -4
- package/dist/index.node.cjs +30740 -32877
- package/dist/index.node.cjs.map +4 -4
- package/dist/plugins/Emojis/index.browser.cjs +133 -2
- package/dist/plugins/Emojis/index.browser.cjs.map +4 -4
- package/dist/plugins/Emojis/index.d.ts +1 -0
- package/dist/plugins/Emojis/index.js +1 -0
- package/dist/plugins/Emojis/index.node.cjs +135 -3
- package/dist/plugins/Emojis/index.node.cjs.map +4 -4
- package/dist/plugins/Emojis/middleware/index.d.ts +1 -0
- package/dist/plugins/Emojis/middleware/index.js +1 -0
- package/dist/plugins/Emojis/middleware/textComposerEmojiMiddleware.d.ts +66 -0
- package/dist/plugins/Emojis/middleware/textComposerEmojiMiddleware.js +143 -0
- package/dist/plugins/encoders/mp3.browser.cjs.map +2 -2
- package/dist/plugins/encoders/mp3.node.cjs.map +2 -2
- package/dist/scss/v2/Autocomplete/Autocomplete-layout.scss +14 -0
- package/dist/scss/v2/Autocomplete/Autocomplete-theme.scss +11 -0
- package/dist/scss/v2/LinkPreview/LinkPreview-layout.scss +18 -0
- package/dist/scss/v2/LinkPreview/LinkPreview-theme.scss +15 -0
- package/dist/types/defaultDataInterfaces.d.ts +25 -0
- package/dist/types/index.d.ts +2 -1
- package/dist/types/types.d.ts +2 -62
- package/dist/utils/getChannel.d.ts +5 -6
- package/dist/utils/mergeDeep.d.ts +2 -3
- package/package.json +5 -5
- package/dist/components/AutoCompleteTextarea/Item.d.ts +0 -2
- package/dist/components/AutoCompleteTextarea/Item.js +0 -10
- package/dist/components/AutoCompleteTextarea/List.d.ts +0 -17
- package/dist/components/AutoCompleteTextarea/List.js +0 -89
- package/dist/components/AutoCompleteTextarea/Textarea.d.ts +0 -114
- package/dist/components/AutoCompleteTextarea/Textarea.js +0 -593
- package/dist/components/AutoCompleteTextarea/index.d.ts +0 -4
- package/dist/components/AutoCompleteTextarea/index.js +0 -4
- package/dist/components/AutoCompleteTextarea/types.d.ts +0 -15
- package/dist/components/AutoCompleteTextarea/utils.d.ts +0 -6
- package/dist/components/AutoCompleteTextarea/utils.js +0 -40
- package/dist/components/ChatAutoComplete/ChatAutoComplete.d.ts +0 -78
- package/dist/components/ChatAutoComplete/ChatAutoComplete.js +0 -33
- package/dist/components/ChatAutoComplete/index.d.ts +0 -1
- package/dist/components/ChatAutoComplete/index.js +0 -1
- package/dist/components/CommandItem/CommandItem.d.ts +0 -12
- package/dist/components/CommandItem/index.d.ts +0 -1
- package/dist/components/CommandItem/index.js +0 -1
- package/dist/components/EmoticonItem/EmoticonItem.js +0 -16
- package/dist/components/EmoticonItem/index.d.ts +0 -1
- package/dist/components/EmoticonItem/index.js +0 -1
- package/dist/components/MessageInput/DefaultTriggerProvider.d.ts +0 -35
- package/dist/components/MessageInput/DefaultTriggerProvider.js +0 -24
- package/dist/components/MessageInput/DropzoneProvider.d.ts +0 -4
- package/dist/components/MessageInput/DropzoneProvider.js +0 -23
- package/dist/components/MessageInput/hooks/useAttachments.d.ts +0 -14
- package/dist/components/MessageInput/hooks/useAttachments.js +0 -209
- package/dist/components/MessageInput/hooks/useCommandTrigger.d.ts +0 -3
- package/dist/components/MessageInput/hooks/useCommandTrigger.js +0 -62
- package/dist/components/MessageInput/hooks/useEmojiTrigger.d.ts +0 -3
- package/dist/components/MessageInput/hooks/useEmojiTrigger.js +0 -29
- package/dist/components/MessageInput/hooks/useLinkPreviews.d.ts +0 -30
- package/dist/components/MessageInput/hooks/useLinkPreviews.js +0 -109
- package/dist/components/MessageInput/hooks/useMessageInputState.d.ts +0 -71
- package/dist/components/MessageInput/hooks/useMessageInputState.js +0 -200
- package/dist/components/MessageInput/hooks/useUserTrigger.d.ts +0 -12
- package/dist/components/MessageInput/hooks/useUserTrigger.js +0 -130
- package/dist/components/MessageInput/types.d.ts +0 -87
- package/dist/components/MessageInput/types.js +0 -19
- package/dist/components/ReactFileUtilities/ImageDropzone.d.ts +0 -16
- package/dist/components/ReactFileUtilities/ImageDropzone.js +0 -42
- package/dist/components/UserItem/UserItem.js +0 -26
- package/dist/components/UserItem/index.d.ts +0 -1
- package/dist/components/UserItem/index.js +0 -1
- /package/dist/components/{MessageInput → MediaRecorder/AudioRecorder}/hooks/useTimeElapsed.d.ts +0 -0
- /package/dist/components/{MessageInput → MediaRecorder/AudioRecorder}/hooks/useTimeElapsed.js +0 -0
- /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 {
|
|
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
|
-
|
|
23
|
+
cancel();
|
|
11
24
|
};
|
|
12
25
|
document.addEventListener('keydown', onKeyDown);
|
|
13
26
|
return () => document.removeEventListener('keydown', onKeyDown);
|
|
14
|
-
}, [
|
|
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:
|
|
19
|
-
React.createElement(
|
|
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 '
|
|
3
|
-
export
|
|
4
|
-
|
|
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
|
|
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 {
|
|
4
|
-
import {
|
|
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
|
-
|
|
9
|
-
|
|
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' },
|
|
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 {
|
|
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
|
|
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: () =>
|
|
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 {
|
|
3
|
-
import {
|
|
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
|
|
21
|
-
search: (query: string) => PromiseLike<Array<EmojiSearchIndexResult
|
|
14
|
+
export interface EmojiSearchIndex {
|
|
15
|
+
search: (query: string) => PromiseLike<Array<EmojiSearchIndexResult>> | Array<EmojiSearchIndexResult> | null;
|
|
22
16
|
}
|
|
23
|
-
export type MessageInputProps
|
|
24
|
-
/**
|
|
25
|
-
|
|
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
|
|
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
|
-
/**
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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?:
|
|
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
|
|
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:
|
|
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 {
|
|
7
|
-
import {
|
|
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
|
|
13
|
+
const messageInputUiApi = useMessageInputControls(props);
|
|
15
14
|
const { emojiSearchIndex } = useComponentContext('MessageInput');
|
|
16
15
|
const messageInputContextValue = useCreateMessageInputContext({
|
|
17
16
|
...cooldownTimerState,
|
|
18
|
-
...
|
|
17
|
+
...messageInputUiApi,
|
|
19
18
|
...props,
|
|
20
19
|
emojiSearchIndex: props.emojiSearchIndex ?? emojiSearchIndex,
|
|
21
20
|
});
|
|
22
|
-
|
|
23
|
-
|
|
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 {
|
|
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(
|
|
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
|
-
|
|
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,
|
|
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 {
|
|
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 {
|
|
16
|
+
import { useAttachmentManagerState } from './hooks/useAttachmentManagerState';
|
|
17
|
+
import { useMessageContext } from '../../context';
|
|
18
18
|
import { WithDragAndDropUpload } from './WithDragAndDropUpload';
|
|
19
19
|
export const MessageInputFlat = () => {
|
|
20
|
-
const {
|
|
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
|
|
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
|
-
|
|
73
|
-
|
|
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
|
-
|
|
78
|
-
|
|
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(
|
|
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, {
|
|
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
|
-
|
|
5
|
-
export
|
|
6
|
-
|
|
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:
|
|
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 {
|
|
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(
|
|
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 = ({
|
|
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
|
|
24
|
-
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
if (!quotedMessageText && !
|
|
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
|
|
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
|
-
!!
|
|
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 {
|
|
3
|
-
|
|
4
|
-
|
|
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:
|
|
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
|
-
|
|
4
|
-
|
|
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
|
|
2
|
-
import
|
|
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: (
|
|
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
|
|
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 = (
|
|
17
|
+
export const useRegisterDropHandlers = () => {
|
|
16
18
|
const { subscribeToDrop } = useDragAndDropUploadContext();
|
|
19
|
+
const messageComposer = useMessageComposer();
|
|
17
20
|
useEffect(() => {
|
|
18
|
-
const unsubscribe = subscribeToDrop?.(
|
|
21
|
+
const unsubscribe = subscribeToDrop?.(messageComposer.attachmentManager.uploadFiles);
|
|
19
22
|
return unsubscribe;
|
|
20
|
-
}, [subscribeToDrop,
|
|
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 =
|
|
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
|
-
? !
|
|
73
|
+
? !isUploadEnabled || (messageInputContext.cooldownRemaining ?? 0) > 0
|
|
65
74
|
: false,
|
|
66
75
|
multiple: multipleUploads,
|
|
67
76
|
noClick: true,
|
|
68
|
-
onDrop: isWithinMessageInputContext
|
|
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 './
|
|
4
|
+
export * from './useMessageInputControls';
|
|
5
|
+
export * from './useMessageComposer';
|
|
6
|
+
export * from './useMessageComposerHasSendableData';
|