stream-chat-react 14.12.0 → 15.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/ListItemLayout.60c3b287.js +2181 -0
- package/dist/cjs/ListItemLayout.60c3b287.js.map +1 -0
- package/dist/cjs/{ReactPlayerWrapper.7cc7b0d8.js → ReactPlayerWrapper.f04b1d06.js} +3 -3
- package/dist/cjs/{ReactPlayerWrapper.7cc7b0d8.js.map → ReactPlayerWrapper.f04b1d06.js.map} +1 -1
- package/dist/cjs/SlotLayout.de45be2d.js +1672 -0
- package/dist/cjs/SlotLayout.de45be2d.js.map +1 -0
- package/dist/cjs/Thread.373af587.js +7479 -0
- package/dist/cjs/Thread.373af587.js.map +1 -0
- package/dist/cjs/channel-detail.js +409 -389
- package/dist/cjs/channel-detail.js.map +1 -1
- package/dist/cjs/emojis.js +18 -16
- package/dist/cjs/emojis.js.map +1 -1
- package/dist/cjs/index.js +14467 -20208
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/slot-geometry.js +145 -0
- package/dist/cjs/slot-geometry.js.map +1 -0
- package/dist/cjs/slot-layout.js +37 -0
- package/dist/cjs/useChannel.1004ed4c.js +18 -0
- package/dist/cjs/useChannel.1004ed4c.js.map +1 -0
- package/dist/cjs/useComponentContextIcons.d16834d9.js +1729 -0
- package/dist/cjs/useComponentContextIcons.d16834d9.js.map +1 -0
- package/dist/cjs/useIsCooldownActive.1f778bc1.js +110 -0
- package/dist/cjs/useIsCooldownActive.1f778bc1.js.map +1 -0
- package/dist/css/channel-detail.css.map +1 -1
- package/dist/css/index.css +208 -103
- package/dist/css/index.css.map +1 -1
- package/dist/es/a11y/accessibleLabel.mjs +6 -2
- package/dist/es/a11y/accessibleLabel.mjs.map +1 -1
- package/dist/es/components/AIStateIndicator/AIStateIndicator.mjs +6 -5
- package/dist/es/components/AIStateIndicator/AIStateIndicator.mjs.map +1 -1
- package/dist/es/components/AIStateIndicator/hooks/useAIState.mjs +9 -33
- package/dist/es/components/AIStateIndicator/hooks/useAIState.mjs.map +1 -1
- package/dist/es/components/Accessibility/NotificationAnnouncer.mjs +2 -3
- package/dist/es/components/Accessibility/NotificationAnnouncer.mjs.map +1 -1
- package/dist/es/components/Accessibility/hooks/useIncomingMessageAnnouncements.mjs +10 -5
- package/dist/es/components/Accessibility/hooks/useIncomingMessageAnnouncements.mjs.map +1 -1
- package/dist/es/components/Accessibility/hooks/useInteractionAnnouncements.mjs +38 -28
- package/dist/es/components/Accessibility/hooks/useInteractionAnnouncements.mjs.map +1 -1
- package/dist/es/components/Accessibility/useAriaLiveAnnouncer.mjs +5 -8
- package/dist/es/components/Accessibility/useAriaLiveAnnouncer.mjs.map +1 -1
- package/dist/es/components/Attachment/Attachment.mjs +21 -6
- package/dist/es/components/Attachment/Attachment.mjs.map +1 -1
- package/dist/es/components/Attachment/AttachmentActions.mjs +10 -9
- package/dist/es/components/Attachment/AttachmentActions.mjs.map +1 -1
- package/dist/es/components/Attachment/AttachmentContainer.mjs +21 -17
- package/dist/es/components/Attachment/AttachmentContainer.mjs.map +1 -1
- package/dist/es/components/Attachment/Audio.mjs +15 -10
- package/dist/es/components/Attachment/Audio.mjs.map +1 -1
- package/dist/es/components/Attachment/FileAttachment.mjs +4 -5
- package/dist/es/components/Attachment/FileAttachment.mjs.map +1 -1
- package/dist/es/components/Attachment/Geolocation.mjs +29 -17
- package/dist/es/components/Attachment/Geolocation.mjs.map +1 -1
- package/dist/es/components/Attachment/Giphy.mjs +4 -4
- package/dist/es/components/Attachment/Giphy.mjs.map +1 -1
- package/dist/es/components/Attachment/LinkPreview/Card.mjs +4 -4
- package/dist/es/components/Attachment/LinkPreview/Card.mjs.map +1 -1
- package/dist/es/components/Attachment/LinkPreview/UnableToRenderCard.mjs +2 -2
- package/dist/es/components/Attachment/LinkPreview/UnableToRenderCard.mjs.map +1 -1
- package/dist/es/components/Attachment/ModalGallery.mjs +20 -8
- package/dist/es/components/Attachment/ModalGallery.mjs.map +1 -1
- package/dist/es/components/Attachment/UnsupportedAttachment.mjs +3 -3
- package/dist/es/components/Attachment/UnsupportedAttachment.mjs.map +1 -1
- package/dist/es/components/Attachment/VideoAttachment.mjs +10 -10
- package/dist/es/components/Attachment/VideoAttachment.mjs.map +1 -1
- package/dist/es/components/Attachment/VisibilityDisclaimer.mjs +2 -2
- package/dist/es/components/Attachment/VisibilityDisclaimer.mjs.map +1 -1
- package/dist/es/components/Attachment/VoiceRecording.mjs +17 -12
- package/dist/es/components/Attachment/VoiceRecording.mjs.map +1 -1
- package/dist/es/components/Attachment/components/AttachmentUploadProgressIndicator.mjs +1 -1
- package/dist/es/components/Attachment/components/DownloadButton.mjs +3 -3
- package/dist/es/components/Attachment/components/DownloadButton.mjs.map +1 -1
- package/dist/es/components/Attachment/hooks/useAttachmentUploadState.mjs +4 -30
- package/dist/es/components/Attachment/hooks/useAttachmentUploadState.mjs.map +1 -1
- package/dist/es/components/Attachment/utils.mjs.map +1 -1
- package/dist/es/components/AudioPlayback/AudioPlaybackArbiter.mjs +57 -0
- package/dist/es/components/AudioPlayback/AudioPlaybackArbiter.mjs.map +1 -0
- package/dist/es/components/AudioPlayback/AudioPlayer.mjs +329 -314
- package/dist/es/components/AudioPlayback/AudioPlayer.mjs.map +1 -1
- package/dist/es/components/AudioPlayback/AudioPlayerPool.mjs +54 -90
- package/dist/es/components/AudioPlayback/AudioPlayerPool.mjs.map +1 -1
- package/dist/es/components/AudioPlayback/WithAudioPlayback.mjs +20 -6
- package/dist/es/components/AudioPlayback/WithAudioPlayback.mjs.map +1 -1
- package/dist/es/components/AudioPlayback/components/ProgressBar.mjs +2 -2
- package/dist/es/components/AudioPlayback/components/ProgressBar.mjs.map +1 -1
- package/dist/es/components/AudioPlayback/components/WaveProgressBar.mjs +2 -2
- package/dist/es/components/AudioPlayback/components/WaveProgressBar.mjs.map +1 -1
- package/dist/es/components/AudioPlayback/components/progressBarA11y.mjs +2 -2
- package/dist/es/components/AudioPlayback/components/progressBarA11y.mjs.map +1 -1
- package/dist/es/components/AudioPlayback/plugins/AudioPlayerNotificationsPlugin.mjs +4 -4
- package/dist/es/components/AudioPlayback/plugins/AudioPlayerNotificationsPlugin.mjs.map +1 -1
- package/dist/es/components/Avatar/Avatar.mjs.map +1 -1
- package/dist/es/components/Avatar/AvatarStack.mjs +1 -1
- package/dist/es/components/Avatar/AvatarStack.mjs.map +1 -1
- package/dist/es/components/Badge/Badge.mjs.map +1 -1
- package/dist/es/components/Badge/MediaBadge.mjs +2 -1
- package/dist/es/components/Badge/MediaBadge.mjs.map +1 -1
- package/dist/es/components/BaseImage/ImagePlaceholder.mjs +3 -3
- package/dist/es/components/BaseImage/ImagePlaceholder.mjs.map +1 -1
- package/dist/es/components/Button/PlayButton.mjs +3 -3
- package/dist/es/components/Button/PlayButton.mjs.map +1 -1
- package/dist/es/components/Button/WorkspaceNavigationButtons.mjs +94 -0
- package/dist/es/components/Button/WorkspaceNavigationButtons.mjs.map +1 -0
- package/dist/es/components/Channel/Channel.mjs +34 -720
- package/dist/es/components/Channel/Channel.mjs.map +1 -1
- package/dist/es/components/Channel/hooks/useChannelCapabilities.mjs +21 -0
- package/dist/es/components/Channel/hooks/useChannelCapabilities.mjs.map +1 -0
- package/dist/es/components/Channel/hooks/useChannelContainerClasses.mjs +1 -1
- package/dist/es/components/Channel/hooks/useChannelContainerClasses.mjs.map +1 -1
- package/dist/es/components/ChannelHeader/ChannelHeader.mjs +17 -16
- package/dist/es/components/ChannelHeader/ChannelHeader.mjs.map +1 -1
- package/dist/es/components/ChannelHeader/hooks/useChannelHasMembersOnline.mjs +16 -41
- package/dist/es/components/ChannelHeader/hooks/useChannelHasMembersOnline.mjs.map +1 -1
- package/dist/es/components/ChannelHeader/hooks/useChannelHeaderOnlineStatus.mjs +19 -21
- package/dist/es/components/ChannelHeader/hooks/useChannelHeaderOnlineStatus.mjs.map +1 -1
- package/dist/es/components/ChannelList/ChannelList.mjs +60 -131
- package/dist/es/components/ChannelList/ChannelList.mjs.map +1 -1
- package/dist/es/components/ChannelList/ChannelListHeader.mjs +4 -4
- package/dist/es/components/ChannelList/ChannelListHeader.mjs.map +1 -1
- package/dist/es/components/ChannelList/ChannelLists.mjs +31 -0
- package/dist/es/components/ChannelList/ChannelLists.mjs.map +1 -0
- package/dist/es/components/ChannelList/ChannelNavigation.mjs +36 -0
- package/dist/es/components/ChannelList/ChannelNavigation.mjs.map +1 -0
- package/dist/es/components/ChannelList/hooks/useChannelMembersState.mjs.map +1 -1
- package/dist/es/components/ChannelList/hooks/useChannelMembershipState.mjs.map +1 -1
- package/dist/es/components/ChannelList/hooks/useChannelPaginatorState.mjs +21 -0
- package/dist/es/components/ChannelList/hooks/useChannelPaginatorState.mjs.map +1 -0
- package/dist/es/components/ChannelList/hooks/useSelectedChannelState.mjs.map +1 -1
- package/dist/es/components/ChannelListItem/ChannelListItem.mjs +23 -74
- package/dist/es/components/ChannelListItem/ChannelListItem.mjs.map +1 -1
- package/dist/es/components/ChannelListItem/ChannelListItemActionButtons.defaults.mjs +34 -34
- package/dist/es/components/ChannelListItem/ChannelListItemActionButtons.defaults.mjs.map +1 -1
- package/dist/es/components/ChannelListItem/ChannelListItemActionButtons.mjs +2 -2
- package/dist/es/components/ChannelListItem/ChannelListItemActionButtons.mjs.map +1 -1
- package/dist/es/components/ChannelListItem/ChannelListItemTimestamp.mjs +7 -6
- package/dist/es/components/ChannelListItem/ChannelListItemTimestamp.mjs.map +1 -1
- package/dist/es/components/ChannelListItem/ChannelListItemUI.mjs +15 -13
- package/dist/es/components/ChannelListItem/ChannelListItemUI.mjs.map +1 -1
- package/dist/es/components/ChannelListItem/hooks/useChannelDisplayName.mjs +7 -7
- package/dist/es/components/ChannelListItem/hooks/useChannelDisplayName.mjs.map +1 -1
- package/dist/es/components/ChannelListItem/hooks/useIsChannelMuted.mjs +8 -26
- package/dist/es/components/ChannelListItem/hooks/useIsChannelMuted.mjs.map +1 -1
- package/dist/es/components/ChannelListItem/hooks/useIsUserMuted.mjs +1 -1
- package/dist/es/components/ChannelListItem/hooks/useIsUserMuted.mjs.map +1 -1
- package/dist/es/components/ChannelListItem/hooks/useMessageDeliveryStatus.mjs +18 -50
- package/dist/es/components/ChannelListItem/hooks/useMessageDeliveryStatus.mjs.map +1 -1
- package/dist/es/components/ChannelListItem/utils.a11y.mjs +35 -21
- package/dist/es/components/ChannelListItem/utils.a11y.mjs.map +1 -1
- package/dist/es/components/ChannelListItem/utils.mjs +31 -30
- package/dist/es/components/ChannelListItem/utils.mjs.map +1 -1
- package/dist/es/components/Chat/Chat.mjs +17 -16
- package/dist/es/components/Chat/Chat.mjs.map +1 -1
- package/dist/es/components/Chat/hooks/useChat.mjs +7 -49
- package/dist/es/components/Chat/hooks/useChat.mjs.map +1 -1
- package/dist/es/components/Chat/hooks/useCreateChatClient.mjs +1 -1
- package/dist/es/components/Chat/hooks/useCreateChatClient.mjs.map +1 -1
- package/dist/es/components/Chat/hooks/useCreateChatContext.mjs +3 -11
- package/dist/es/components/Chat/hooks/useCreateChatContext.mjs.map +1 -1
- package/dist/es/components/Chat/hooks/useNetworkConnectionState.mjs +46 -0
- package/dist/es/components/Chat/hooks/useNetworkConnectionState.mjs.map +1 -0
- package/dist/es/components/Chat/hooks/useReportLostConnectionSystemNotification.mjs +112 -24
- package/dist/es/components/Chat/hooks/useReportLostConnectionSystemNotification.mjs.map +1 -1
- package/dist/es/components/Chat/hooks/useSplitActionSet.mjs +1 -1
- package/dist/es/components/Chat/hooks/useSplitActionSet.mjs.map +1 -1
- package/dist/es/components/Chat/hooks/useWSConnectionState.mjs +31 -0
- package/dist/es/components/Chat/hooks/useWSConnectionState.mjs.map +1 -0
- package/dist/es/components/DateSeparator/DateSeparator.mjs +2 -2
- package/dist/es/components/DateSeparator/DateSeparator.mjs.map +1 -1
- package/dist/es/components/Dialog/components/Alert.mjs +1 -1
- package/dist/es/components/Dialog/components/Callout.mjs +2 -2
- package/dist/es/components/Dialog/components/Callout.mjs.map +1 -1
- package/dist/es/components/Dialog/components/ContextMenu.mjs +9 -8
- package/dist/es/components/Dialog/components/ContextMenu.mjs.map +1 -1
- package/dist/es/components/Dialog/components/Prompt.mjs +5 -5
- package/dist/es/components/Dialog/components/Prompt.mjs.map +1 -1
- package/dist/es/components/Dialog/components/Viewer.mjs +5 -5
- package/dist/es/components/Dialog/components/Viewer.mjs.map +1 -1
- package/dist/es/components/Dialog/hooks/usePopoverPosition.mjs +9 -1
- package/dist/es/components/Dialog/hooks/usePopoverPosition.mjs.map +1 -1
- package/dist/es/components/Dialog/service/DialogManager.mjs +22 -19
- package/dist/es/components/Dialog/service/DialogManager.mjs.map +1 -1
- package/dist/es/components/EmptyStateIndicator/EmptyStateIndicator.mjs +6 -5
- package/dist/es/components/EmptyStateIndicator/EmptyStateIndicator.mjs.map +1 -1
- package/dist/es/components/Form/Dropdown.mjs +6 -3
- package/dist/es/components/Form/Dropdown.mjs.map +1 -1
- package/dist/es/components/Form/NumericInput.mjs +6 -5
- package/dist/es/components/Form/NumericInput.mjs.map +1 -1
- package/dist/es/components/Form/SwitchField.mjs +2 -2
- package/dist/es/components/Form/SwitchField.mjs.map +1 -1
- package/dist/es/components/Form/TextInput.mjs +1 -1
- package/dist/es/components/Gallery/GalleryContext.mjs +2 -8
- package/dist/es/components/Gallery/GalleryContext.mjs.map +1 -1
- package/dist/es/components/Gallery/GalleryHeader.mjs +39 -12
- package/dist/es/components/Gallery/GalleryHeader.mjs.map +1 -1
- package/dist/es/components/Gallery/GalleryUI.mjs +4 -4
- package/dist/es/components/Gallery/GalleryUI.mjs.map +1 -1
- package/dist/es/components/InfiniteScrollPaginator/InfiniteScrollPaginator.mjs +16 -14
- package/dist/es/components/InfiniteScrollPaginator/InfiniteScrollPaginator.mjs.map +1 -1
- package/dist/es/components/InfiniteScrollPaginator/InfiniteScrollWithComponents.mjs +43 -0
- package/dist/es/components/InfiniteScrollPaginator/InfiniteScrollWithComponents.mjs.map +1 -0
- package/dist/es/components/InfiniteScrollPaginator/hooks/useCursorPaginator.mjs +1 -1
- package/dist/es/components/InfiniteScrollPaginator/hooks/useCursorPaginator.mjs.map +1 -1
- package/dist/es/components/LoadMore/LoadMoreButton.mjs +3 -3
- package/dist/es/components/LoadMore/LoadMoreButton.mjs.map +1 -1
- package/dist/es/components/Loading/AttachmentUploadedSizeIndicator.mjs +2 -11
- package/dist/es/components/Loading/AttachmentUploadedSizeIndicator.mjs.map +1 -1
- package/dist/es/components/Loading/LoadingErrorIndicator.mjs +2 -2
- package/dist/es/components/Loading/LoadingErrorIndicator.mjs.map +1 -1
- package/dist/es/components/Loading/LoadingIndicator.mjs.map +1 -1
- package/dist/es/components/Loading/UploadProgressIndicator.mjs.map +1 -1
- package/dist/es/components/Loading/progress-indicators.mjs +2 -2
- package/dist/es/components/Loading/progress-indicators.mjs.map +1 -1
- package/dist/es/components/Location/ShareLocationDialog.mjs +13 -13
- package/dist/es/components/Location/ShareLocationDialog.mjs.map +1 -1
- package/dist/es/components/Location/hooks/useLiveLocationSharingManager.mjs +1 -0
- package/dist/es/components/Location/hooks/useLiveLocationSharingManager.mjs.map +1 -1
- package/dist/es/components/MediaRecorder/AudioRecorder/AudioRecorder.mjs +4 -4
- package/dist/es/components/MediaRecorder/AudioRecorder/AudioRecorder.mjs.map +1 -1
- package/dist/es/components/MediaRecorder/AudioRecorder/AudioRecorderRecordingControls.mjs +7 -7
- package/dist/es/components/MediaRecorder/AudioRecorder/AudioRecorderRecordingControls.mjs.map +1 -1
- package/dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingButtonWithNotification.mjs +4 -4
- package/dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingButtonWithNotification.mjs.map +1 -1
- package/dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingPlayback.mjs +2 -2
- package/dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingPlayback.mjs.map +1 -1
- package/dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingPreview.mjs +1 -1
- package/dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingPreview.mjs.map +1 -1
- package/dist/es/components/MediaRecorder/RecordingPermissionDeniedNotification.mjs +4 -4
- package/dist/es/components/MediaRecorder/RecordingPermissionDeniedNotification.mjs.map +1 -1
- package/dist/es/components/MediaRecorder/classes/AmplitudeRecorder.mjs +32 -26
- package/dist/es/components/MediaRecorder/classes/AmplitudeRecorder.mjs.map +1 -1
- package/dist/es/components/MediaRecorder/classes/BrowserPermission.mjs +5 -4
- package/dist/es/components/MediaRecorder/classes/BrowserPermission.mjs.map +1 -1
- package/dist/es/components/MediaRecorder/classes/MediaRecorderController.mjs +195 -181
- package/dist/es/components/MediaRecorder/classes/MediaRecorderController.mjs.map +1 -1
- package/dist/es/components/MediaRecorder/hooks/useMediaRecorder.mjs +7 -11
- package/dist/es/components/MediaRecorder/hooks/useMediaRecorder.mjs.map +1 -1
- package/dist/es/components/MediaRecorder/observable/BehaviorSubject.mjs +1 -0
- package/dist/es/components/MediaRecorder/observable/BehaviorSubject.mjs.map +1 -1
- package/dist/es/components/MediaRecorder/observable/Observable.mjs +2 -1
- package/dist/es/components/MediaRecorder/observable/Observable.mjs.map +1 -1
- package/dist/es/components/MediaRecorder/observable/Subject.mjs +3 -2
- package/dist/es/components/MediaRecorder/observable/Subject.mjs.map +1 -1
- package/dist/es/components/MediaRecorder/observable/Subscription.mjs +2 -1
- package/dist/es/components/MediaRecorder/observable/Subscription.mjs.map +1 -1
- package/dist/es/components/Message/Message.mjs +13 -54
- package/dist/es/components/Message/Message.mjs.map +1 -1
- package/dist/es/components/Message/MessageAlsoSentInChannelIndicator.mjs +10 -54
- package/dist/es/components/Message/MessageAlsoSentInChannelIndicator.mjs.map +1 -1
- package/dist/es/components/Message/MessageBlocked.mjs +2 -2
- package/dist/es/components/Message/MessageBlocked.mjs.map +1 -1
- package/dist/es/components/Message/MessageDeletedBubble.mjs +2 -2
- package/dist/es/components/Message/MessageDeletedBubble.mjs.map +1 -1
- package/dist/es/components/Message/MessageEditedIndicator.mjs +8 -7
- package/dist/es/components/Message/MessageEditedIndicator.mjs.map +1 -1
- package/dist/es/components/Message/MessageRepliesCountButton.mjs +43 -9
- package/dist/es/components/Message/MessageRepliesCountButton.mjs.map +1 -1
- package/dist/es/components/Message/MessageStatus.mjs +13 -11
- package/dist/es/components/Message/MessageStatus.mjs.map +1 -1
- package/dist/es/components/Message/MessageText.mjs +4 -4
- package/dist/es/components/Message/MessageText.mjs.map +1 -1
- package/dist/es/components/Message/MessageTimestamp.mjs +4 -3
- package/dist/es/components/Message/MessageTimestamp.mjs.map +1 -1
- package/dist/es/components/Message/MessageTranslationIndicator.mjs +7 -7
- package/dist/es/components/Message/MessageTranslationIndicator.mjs.map +1 -1
- package/dist/es/components/Message/MessageUI.mjs +22 -21
- package/dist/es/components/Message/MessageUI.mjs.map +1 -1
- package/dist/es/components/Message/PinIndicator.mjs +3 -3
- package/dist/es/components/Message/PinIndicator.mjs.map +1 -1
- package/dist/es/components/Message/QuotedMessage.mjs +4 -4
- package/dist/es/components/Message/QuotedMessage.mjs.map +1 -1
- package/dist/es/components/Message/ReminderNotification.mjs +13 -12
- package/dist/es/components/Message/ReminderNotification.mjs.map +1 -1
- package/dist/es/components/Message/StreamedMessageText.mjs +5 -4
- package/dist/es/components/Message/StreamedMessageText.mjs.map +1 -1
- package/dist/es/components/Message/Timestamp.mjs +5 -5
- package/dist/es/components/Message/Timestamp.mjs.map +1 -1
- package/dist/es/components/Message/hooks/useActionHandler.mjs +8 -7
- package/dist/es/components/Message/hooks/useActionHandler.mjs.map +1 -1
- package/dist/es/components/Message/hooks/useDeleteHandler.mjs +30 -11
- package/dist/es/components/Message/hooks/useDeleteHandler.mjs.map +1 -1
- package/dist/es/components/Message/hooks/useFlagHandler.mjs +3 -3
- package/dist/es/components/Message/hooks/useFlagHandler.mjs.map +1 -1
- package/dist/es/components/Message/hooks/useMarkUnreadHandler.mjs +8 -3
- package/dist/es/components/Message/hooks/useMarkUnreadHandler.mjs.map +1 -1
- package/dist/es/components/Message/hooks/useMentionsHandler.mjs +2 -4
- package/dist/es/components/Message/hooks/useMentionsHandler.mjs.map +1 -1
- package/dist/es/components/Message/hooks/useMessageAlsoSentInChannelNavigation.mjs +72 -0
- package/dist/es/components/Message/hooks/useMessageAlsoSentInChannelNavigation.mjs.map +1 -0
- package/dist/es/components/Message/hooks/useMessageReminder.mjs +1 -1
- package/dist/es/components/Message/hooks/useMuteHandler.mjs +26 -9
- package/dist/es/components/Message/hooks/useMuteHandler.mjs.map +1 -1
- package/dist/es/components/Message/hooks/useOpenThreadHandler.mjs +13 -5
- package/dist/es/components/Message/hooks/useOpenThreadHandler.mjs.map +1 -1
- package/dist/es/components/Message/hooks/usePinHandler.mjs +26 -21
- package/dist/es/components/Message/hooks/usePinHandler.mjs.map +1 -1
- package/dist/es/components/Message/hooks/useReactionHandler.mjs +25 -17
- package/dist/es/components/Message/hooks/useReactionHandler.mjs.map +1 -1
- package/dist/es/components/Message/hooks/useReactionsFetcher.mjs +6 -3
- package/dist/es/components/Message/hooks/useReactionsFetcher.mjs.map +1 -1
- package/dist/es/components/Message/hooks/useRetryHandler.mjs +9 -7
- package/dist/es/components/Message/hooks/useRetryHandler.mjs.map +1 -1
- package/dist/es/components/Message/hooks/useUserRole.mjs +16 -12
- package/dist/es/components/Message/hooks/useUserRole.mjs.map +1 -1
- package/dist/es/components/Message/renderText/renderText.mjs +1 -1
- package/dist/es/components/Message/utils.mjs +19 -56
- package/dist/es/components/Message/utils.mjs.map +1 -1
- package/dist/es/components/MessageActions/DeleteMessageAlert.mjs +5 -5
- package/dist/es/components/MessageActions/DeleteMessageAlert.mjs.map +1 -1
- package/dist/es/components/MessageActions/DownloadSubmenu.mjs +4 -4
- package/dist/es/components/MessageActions/DownloadSubmenu.mjs.map +1 -1
- package/dist/es/components/MessageActions/MessageActions.defaults.mjs +72 -73
- package/dist/es/components/MessageActions/MessageActions.defaults.mjs.map +1 -1
- package/dist/es/components/MessageActions/MessageActions.mjs +3 -3
- package/dist/es/components/MessageActions/MessageActions.mjs.map +1 -1
- package/dist/es/components/MessageActions/RemindMeSubmenu.mjs +7 -7
- package/dist/es/components/MessageActions/RemindMeSubmenu.mjs.map +1 -1
- package/dist/es/components/MessageActions/hooks/useBaseMessageActionSetFilter.mjs +7 -4
- package/dist/es/components/MessageActions/hooks/useBaseMessageActionSetFilter.mjs.map +1 -1
- package/dist/es/components/MessageBounce/MessageBounceModal.mjs +1 -1
- package/dist/es/components/MessageBounce/MessageBouncePrompt.mjs +8 -8
- package/dist/es/components/MessageBounce/MessageBouncePrompt.mjs.map +1 -1
- package/dist/es/components/MessageComposer/AttachmentPreviewList/AttachmentPreviewList.mjs +2 -2
- package/dist/es/components/MessageComposer/AttachmentPreviewList/AudioAttachmentPreview.mjs +14 -14
- package/dist/es/components/MessageComposer/AttachmentPreviewList/AudioAttachmentPreview.mjs.map +1 -1
- package/dist/es/components/MessageComposer/AttachmentPreviewList/FileAttachmentPreview.mjs +9 -9
- package/dist/es/components/MessageComposer/AttachmentPreviewList/FileAttachmentPreview.mjs.map +1 -1
- package/dist/es/components/MessageComposer/AttachmentPreviewList/GeolocationPreview.mjs +6 -6
- package/dist/es/components/MessageComposer/AttachmentPreviewList/GeolocationPreview.mjs.map +1 -1
- package/dist/es/components/MessageComposer/AttachmentPreviewList/MediaAttachmentPreview.mjs +3 -4
- package/dist/es/components/MessageComposer/AttachmentPreviewList/MediaAttachmentPreview.mjs.map +1 -1
- package/dist/es/components/MessageComposer/AttachmentPreviewList/UnsupportedAttachmentPreview.mjs +2 -2
- package/dist/es/components/MessageComposer/AttachmentPreviewList/UnsupportedAttachmentPreview.mjs.map +1 -1
- package/dist/es/components/MessageComposer/AttachmentPreviewList/VoiceRecordingPreviewSlot.mjs +2 -2
- package/dist/es/components/MessageComposer/AttachmentPreviewList/utils/AttachmentPreviewRoot.mjs +2 -2
- package/dist/es/components/MessageComposer/AttachmentPreviewList/utils/AttachmentPreviewRoot.mjs.map +1 -1
- package/dist/es/components/MessageComposer/AttachmentSelector/AttachmentSelector.mjs +33 -30
- package/dist/es/components/MessageComposer/AttachmentSelector/AttachmentSelector.mjs.map +1 -1
- package/dist/es/components/MessageComposer/AttachmentSelector/CommandsMenu.mjs +26 -31
- package/dist/es/components/MessageComposer/AttachmentSelector/CommandsMenu.mjs.map +1 -1
- package/dist/es/components/MessageComposer/CommandChip.mjs +3 -3
- package/dist/es/components/MessageComposer/CommandChip.mjs.map +1 -1
- package/dist/es/components/MessageComposer/EditedMessagePreview.mjs +1 -1
- package/dist/es/components/MessageComposer/EditedMessagePreview.mjs.map +1 -1
- package/dist/es/components/MessageComposer/LinkPreviewList.mjs +3 -3
- package/dist/es/components/MessageComposer/MessageComposer.mjs +12 -17
- package/dist/es/components/MessageComposer/MessageComposer.mjs.map +1 -1
- package/dist/es/components/MessageComposer/MessageComposerActions.mjs +17 -13
- package/dist/es/components/MessageComposer/MessageComposerActions.mjs.map +1 -1
- package/dist/es/components/MessageComposer/MessageComposerUI.mjs +8 -8
- package/dist/es/components/MessageComposer/MessageComposerUI.mjs.map +1 -1
- package/dist/es/components/MessageComposer/QuotedMessagePreview.mjs +40 -40
- package/dist/es/components/MessageComposer/QuotedMessagePreview.mjs.map +1 -1
- package/dist/es/components/MessageComposer/RemoveAttachmentPreviewButton.mjs +2 -2
- package/dist/es/components/MessageComposer/RemoveAttachmentPreviewButton.mjs.map +1 -1
- package/dist/es/components/MessageComposer/SendButton.mjs +2 -2
- package/dist/es/components/MessageComposer/SendButton.mjs.map +1 -1
- package/dist/es/components/MessageComposer/SendToChannelCheckbox.mjs +2 -2
- package/dist/es/components/MessageComposer/SendToChannelCheckbox.mjs.map +1 -1
- package/dist/es/components/MessageComposer/StopAIGenerationButton.mjs +1 -1
- package/dist/es/components/MessageComposer/StopAIGenerationButton.mjs.map +1 -1
- package/dist/es/components/MessageComposer/WithDragAndDropUpload.mjs +9 -13
- package/dist/es/components/MessageComposer/WithDragAndDropUpload.mjs.map +1 -1
- package/dist/es/components/MessageComposer/hooks/useAttachmentManagerState.mjs +15 -2
- package/dist/es/components/MessageComposer/hooks/useAttachmentManagerState.mjs.map +1 -1
- package/dist/es/components/MessageComposer/hooks/useCooldownRemaining.mjs +2 -3
- package/dist/es/components/MessageComposer/hooks/useCooldownRemaining.mjs.map +1 -1
- package/dist/es/components/MessageComposer/hooks/useCreateMessageComposerContext.mjs +1 -3
- package/dist/es/components/MessageComposer/hooks/useCreateMessageComposerContext.mjs.map +1 -1
- package/dist/es/components/MessageComposer/hooks/useIsCooldownActive.mjs +2 -3
- package/dist/es/components/MessageComposer/hooks/useIsCooldownActive.mjs.map +1 -1
- package/dist/es/components/MessageComposer/hooks/useMessageComposerBindings.mjs +0 -4
- package/dist/es/components/MessageComposer/hooks/useMessageComposerBindings.mjs.map +1 -1
- package/dist/es/components/MessageComposer/hooks/useMessageComposerCommands.mjs +4 -4
- package/dist/es/components/MessageComposer/hooks/useMessageComposerCommands.mjs.map +1 -1
- package/dist/es/components/MessageComposer/hooks/useMessageComposerController.mjs +8 -34
- package/dist/es/components/MessageComposer/hooks/useMessageComposerController.mjs.map +1 -1
- package/dist/es/components/MessageComposer/hooks/useMessageComposerHasSendableData.mjs.map +1 -1
- package/dist/es/components/MessageComposer/hooks/useMessageComposerSubmitFn.mjs +16 -0
- package/dist/es/components/MessageComposer/hooks/useMessageComposerSubmitFn.mjs.map +1 -0
- package/dist/es/components/MessageComposer/hooks/usePasteHandler.mjs +1 -1
- package/dist/es/components/MessageComposer/hooks/utils.mjs.map +1 -1
- package/dist/es/components/MessageComposer/icons.mjs +2 -2
- package/dist/es/components/MessageComposer/icons.mjs.map +1 -1
- package/dist/es/components/MessageComposer/preEditSnapshot.mjs +1 -7
- package/dist/es/components/MessageComposer/preEditSnapshot.mjs.map +1 -1
- package/dist/es/components/MessageList/FloatingDateSeparator.mjs +7 -7
- package/dist/es/components/MessageList/FloatingDateSeparator.mjs.map +1 -1
- package/dist/es/components/MessageList/MessageList.mjs +168 -213
- package/dist/es/components/MessageList/MessageList.mjs.map +1 -1
- package/dist/es/components/MessageList/NewMessageNotification.mjs +5 -1
- package/dist/es/components/MessageList/NewMessageNotification.mjs.map +1 -1
- package/dist/es/components/MessageList/ScrollToLatestMessageButton.mjs +27 -22
- package/dist/es/components/MessageList/ScrollToLatestMessageButton.mjs.map +1 -1
- package/dist/es/components/MessageList/UnreadMessagesNotification.mjs +25 -9
- package/dist/es/components/MessageList/UnreadMessagesNotification.mjs.map +1 -1
- package/dist/es/components/MessageList/UnreadMessagesSeparator.mjs +18 -7
- package/dist/es/components/MessageList/UnreadMessagesSeparator.mjs.map +1 -1
- package/dist/es/components/MessageList/VirtualizedMessageList.mjs +186 -167
- package/dist/es/components/MessageList/VirtualizedMessageList.mjs.map +1 -1
- package/dist/es/components/MessageList/VirtualizedMessageListComponents.mjs +12 -12
- package/dist/es/components/MessageList/VirtualizedMessageListComponents.mjs.map +1 -1
- package/dist/es/components/MessageList/hooks/MessageList/useEnrichedMessages.mjs +6 -7
- package/dist/es/components/MessageList/hooks/MessageList/useEnrichedMessages.mjs.map +1 -1
- package/dist/es/components/MessageList/hooks/MessageList/useFloatingDateSeparatorMessageList.mjs +6 -10
- package/dist/es/components/MessageList/hooks/MessageList/useFloatingDateSeparatorMessageList.mjs.map +1 -1
- package/dist/es/components/MessageList/hooks/MessageList/useMessageListElements.mjs +18 -10
- package/dist/es/components/MessageList/hooks/MessageList/useMessageListElements.mjs.map +1 -1
- package/dist/es/components/MessageList/hooks/MessageList/useMessageListScrollManager.mjs +6 -4
- package/dist/es/components/MessageList/hooks/MessageList/useMessageListScrollManager.mjs.map +1 -1
- package/dist/es/components/MessageList/hooks/MessageList/useScrollLocationLogic.mjs +27 -202
- package/dist/es/components/MessageList/hooks/MessageList/useScrollLocationLogic.mjs.map +1 -1
- package/dist/es/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.mjs +10 -5
- package/dist/es/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.mjs.map +1 -1
- package/dist/es/components/MessageList/hooks/VirtualizedMessageList/useFloatingDateSeparator.mjs +6 -5
- package/dist/es/components/MessageList/hooks/VirtualizedMessageList/useFloatingDateSeparator.mjs.map +1 -1
- package/dist/es/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.mjs +4 -4
- package/dist/es/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.mjs.map +1 -1
- package/dist/es/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.mjs +5 -1
- package/dist/es/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.mjs.map +1 -1
- package/dist/es/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.mjs +14 -9
- package/dist/es/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.mjs.map +1 -1
- package/dist/es/components/MessageList/hooks/useCanPaginateReplies.mjs +47 -0
- package/dist/es/components/MessageList/hooks/useCanPaginateReplies.mjs.map +1 -0
- package/dist/es/components/MessageList/hooks/useLastDeliveredData.mjs +6 -38
- package/dist/es/components/MessageList/hooks/useLastDeliveredData.mjs.map +1 -1
- package/dist/es/components/MessageList/hooks/useLastReadData.mjs +6 -23
- package/dist/es/components/MessageList/hooks/useLastReadData.mjs.map +1 -1
- package/dist/es/components/MessageList/hooks/useMarkRead.mjs +78 -48
- package/dist/es/components/MessageList/hooks/useMarkRead.mjs.map +1 -1
- package/dist/es/components/MessageList/hooks/useReceiptsByMessageId.mjs +71 -0
- package/dist/es/components/MessageList/hooks/useReceiptsByMessageId.mjs.map +1 -0
- package/dist/es/components/MessageList/hooks/useThreadHead.mjs +26 -0
- package/dist/es/components/MessageList/hooks/useThreadHead.mjs.map +1 -0
- package/dist/es/components/MessageList/messageSourceKey.mjs +37 -0
- package/dist/es/components/MessageList/messageSourceKey.mjs.map +1 -0
- package/dist/es/components/MessageList/renderMessages.mjs +11 -11
- package/dist/es/components/MessageList/renderMessages.mjs.map +1 -1
- package/dist/es/components/MessageList/utils.mjs +40 -33
- package/dist/es/components/MessageList/utils.mjs.map +1 -1
- package/dist/es/components/Modal/GlobalModal.mjs +2 -2
- package/dist/es/components/Notifications/Notification.mjs +10 -9
- package/dist/es/components/Notifications/Notification.mjs.map +1 -1
- package/dist/es/components/Notifications/NotificationList.mjs +5 -19
- package/dist/es/components/Notifications/NotificationList.mjs.map +1 -1
- package/dist/es/components/Notifications/hooks/useNotificationApi.mjs +69 -62
- package/dist/es/components/Notifications/hooks/useNotificationApi.mjs.map +1 -1
- package/dist/es/components/Notifications/hooks/useNotificationTarget.mjs +8 -12
- package/dist/es/components/Notifications/hooks/useNotificationTarget.mjs.map +1 -1
- package/dist/es/components/Notifications/hooks/useNotifications.mjs +1 -1
- package/dist/es/components/Notifications/hooks/useSystemNotifications.mjs +1 -1
- package/dist/es/components/Notifications/notificationTarget.mjs +17 -2
- package/dist/es/components/Notifications/notificationTarget.mjs.map +1 -1
- package/dist/es/components/Poll/Poll.mjs +1 -1
- package/dist/es/components/Poll/PollActions/AddCommentPrompt.mjs +8 -8
- package/dist/es/components/Poll/PollActions/AddCommentPrompt.mjs.map +1 -1
- package/dist/es/components/Poll/PollActions/EndPollAlert.mjs +9 -9
- package/dist/es/components/Poll/PollActions/EndPollAlert.mjs.map +1 -1
- package/dist/es/components/Poll/PollActions/PollActions.mjs +20 -14
- package/dist/es/components/Poll/PollActions/PollActions.mjs.map +1 -1
- package/dist/es/components/Poll/PollActions/PollAnswerList.mjs +8 -8
- package/dist/es/components/Poll/PollActions/PollAnswerList.mjs.map +1 -1
- package/dist/es/components/Poll/PollActions/PollOptionsFullList.mjs +4 -4
- package/dist/es/components/Poll/PollActions/PollOptionsFullList.mjs.map +1 -1
- package/dist/es/components/Poll/PollActions/PollQuestion.mjs +1 -1
- package/dist/es/components/Poll/PollActions/PollQuestion.mjs.map +1 -1
- package/dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotes.mjs +7 -5
- package/dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotes.mjs.map +1 -1
- package/dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.mjs +8 -4
- package/dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.mjs.map +1 -1
- package/dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotesList.mjs +1 -1
- package/dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotesList.mjs.map +1 -1
- package/dist/es/components/Poll/PollActions/PollResults/PollResults.mjs +11 -7
- package/dist/es/components/Poll/PollActions/PollResults/PollResults.mjs.map +1 -1
- package/dist/es/components/Poll/PollActions/SuggestPollOptionPrompt.mjs +15 -12
- package/dist/es/components/Poll/PollActions/SuggestPollOptionPrompt.mjs.map +1 -1
- package/dist/es/components/Poll/PollContent.mjs +2 -2
- package/dist/es/components/Poll/PollCreationDialog/MultipleAnswersField.mjs +13 -11
- package/dist/es/components/Poll/PollCreationDialog/MultipleAnswersField.mjs.map +1 -1
- package/dist/es/components/Poll/PollCreationDialog/NameField.mjs +6 -5
- package/dist/es/components/Poll/PollCreationDialog/NameField.mjs.map +1 -1
- package/dist/es/components/Poll/PollCreationDialog/OptionFieldSet.mjs +14 -13
- package/dist/es/components/Poll/PollCreationDialog/OptionFieldSet.mjs.map +1 -1
- package/dist/es/components/Poll/PollCreationDialog/PollCreationDialog.mjs +11 -12
- package/dist/es/components/Poll/PollCreationDialog/PollCreationDialog.mjs.map +1 -1
- package/dist/es/components/Poll/PollCreationDialog/PollCreationDialogControls.mjs +11 -20
- package/dist/es/components/Poll/PollCreationDialog/PollCreationDialogControls.mjs.map +1 -1
- package/dist/es/components/Poll/PollCreationDialog/PollOptionReorderHandle.mjs +5 -5
- package/dist/es/components/Poll/PollCreationDialog/PollOptionReorderHandle.mjs.map +1 -1
- package/dist/es/components/Poll/PollHeader.mjs +10 -6
- package/dist/es/components/Poll/PollHeader.mjs.map +1 -1
- package/dist/es/components/Poll/PollOptionList.mjs +8 -4
- package/dist/es/components/Poll/PollOptionList.mjs.map +1 -1
- package/dist/es/components/Poll/PollOptionSelector.mjs +13 -7
- package/dist/es/components/Poll/PollOptionSelector.mjs.map +1 -1
- package/dist/es/components/Poll/PollVote.mjs +6 -5
- package/dist/es/components/Poll/PollVote.mjs.map +1 -1
- package/dist/es/components/Poll/hooks/useManagePollVotesRealtime.mjs.map +1 -1
- package/dist/es/components/Poll/hooks/usePollAnswerPagination.mjs +5 -5
- package/dist/es/components/Poll/hooks/usePollAnswerPagination.mjs.map +1 -1
- package/dist/es/components/Poll/hooks/usePollOptionVotesPagination.mjs +6 -5
- package/dist/es/components/Poll/hooks/usePollOptionVotesPagination.mjs.map +1 -1
- package/dist/es/components/ReactFileUtilities/UploadButton.mjs +5 -5
- package/dist/es/components/ReactFileUtilities/UploadButton.mjs.map +1 -1
- package/dist/es/components/Reactions/MessageReactions.mjs +7 -7
- package/dist/es/components/Reactions/MessageReactions.mjs.map +1 -1
- package/dist/es/components/Reactions/MessageReactionsDetail.mjs +19 -12
- package/dist/es/components/Reactions/MessageReactionsDetail.mjs.map +1 -1
- package/dist/es/components/Reactions/ReactionSelector.mjs +15 -21
- package/dist/es/components/Reactions/ReactionSelector.mjs.map +1 -1
- package/dist/es/components/Reactions/ReactionSelectorWithButton.mjs +4 -4
- package/dist/es/components/Reactions/ReactionSelectorWithButton.mjs.map +1 -1
- package/dist/es/components/Reactions/hooks/useFetchReactions.mjs +3 -3
- package/dist/es/components/Reactions/hooks/useFetchReactions.mjs.map +1 -1
- package/dist/es/components/Reactions/hooks/useProcessReactions.mjs +5 -4
- package/dist/es/components/Reactions/hooks/useProcessReactions.mjs.map +1 -1
- package/dist/es/components/Search/Search.mjs +1 -1
- package/dist/es/components/Search/SearchBar/SearchBar.mjs +8 -7
- package/dist/es/components/Search/SearchBar/SearchBar.mjs.map +1 -1
- package/dist/es/components/Search/SearchContext.mjs +2 -3
- package/dist/es/components/Search/SearchContext.mjs.map +1 -1
- package/dist/es/components/Search/SearchResults/SearchResultItem.mjs +56 -39
- package/dist/es/components/Search/SearchResults/SearchResultItem.mjs.map +1 -1
- package/dist/es/components/Search/SearchResults/SearchResults.mjs +4 -4
- package/dist/es/components/Search/SearchResults/SearchResults.mjs.map +1 -1
- package/dist/es/components/Search/SearchResults/SearchResultsHeader.mjs +6 -5
- package/dist/es/components/Search/SearchResults/SearchResultsHeader.mjs.map +1 -1
- package/dist/es/components/Search/SearchResults/SearchResultsPresearch.mjs +1 -1
- package/dist/es/components/Search/SearchResults/SearchResultsPresearch.mjs.map +1 -1
- package/dist/es/components/Search/SearchResults/SearchSourceResultList.mjs +1 -1
- package/dist/es/components/Search/SearchResults/SearchSourceResultListFooter.mjs +2 -2
- package/dist/es/components/Search/SearchResults/SearchSourceResultListFooter.mjs.map +1 -1
- package/dist/es/components/Search/SearchResults/SearchSourceResults.mjs +1 -1
- package/dist/es/components/Search/SearchResults/SearchSourceResultsEmpty.mjs +1 -1
- package/dist/es/components/Search/SearchResults/SearchSourceResultsEmpty.mjs.map +1 -1
- package/dist/es/components/Search/SearchResults/SearchSourceResultsLoadingIndicator.mjs +1 -1
- package/dist/es/components/Search/SearchResults/SearchSourceResultsLoadingIndicator.mjs.map +1 -1
- package/dist/es/components/Search/SearchSourceResultsContext.mjs +2 -3
- package/dist/es/components/Search/SearchSourceResultsContext.mjs.map +1 -1
- package/dist/es/components/SummarizedMessagePreview/SummarizedMessagePreview.mjs +1 -1
- package/dist/es/components/SummarizedMessagePreview/SummarizedMessagePreview.mjs.map +1 -1
- package/dist/es/components/SummarizedMessagePreview/hooks/useLatestMessagePreview.mjs +44 -19
- package/dist/es/components/SummarizedMessagePreview/hooks/useLatestMessagePreview.mjs.map +1 -1
- package/dist/es/components/TextareaComposer/SuggestionList/CommandItem.mjs +1 -1
- package/dist/es/components/TextareaComposer/SuggestionList/CommandItem.mjs.map +1 -1
- package/dist/es/components/TextareaComposer/SuggestionList/MentionItem/BroadcastMentionItem.mjs +2 -2
- package/dist/es/components/TextareaComposer/SuggestionList/MentionItem/BroadcastMentionItem.mjs.map +1 -1
- package/dist/es/components/TextareaComposer/SuggestionList/MentionItem/RoleItem.mjs +2 -2
- package/dist/es/components/TextareaComposer/SuggestionList/MentionItem/RoleItem.mjs.map +1 -1
- package/dist/es/components/TextareaComposer/SuggestionList/MentionItem/UserGroupItem.mjs.map +1 -1
- package/dist/es/components/TextareaComposer/SuggestionList/SuggestionList.mjs +11 -11
- package/dist/es/components/TextareaComposer/SuggestionList/SuggestionList.mjs.map +1 -1
- package/dist/es/components/TextareaComposer/SuggestionList/SuggestionListItem.mjs +1 -1
- package/dist/es/components/TextareaComposer/TextareaComposer.mjs +13 -11
- package/dist/es/components/TextareaComposer/TextareaComposer.mjs.map +1 -1
- package/dist/es/components/TextareaComposer/hooks/useTextareaPlaceholder.mjs +12 -11
- package/dist/es/components/TextareaComposer/hooks/useTextareaPlaceholder.mjs.map +1 -1
- package/dist/es/components/Thread/Thread.mjs +89 -92
- package/dist/es/components/Thread/Thread.mjs.map +1 -1
- package/dist/es/components/Thread/ThreadHead.mjs +5 -4
- package/dist/es/components/Thread/ThreadHead.mjs.map +1 -1
- package/dist/es/components/Thread/ThreadHeader.mjs +31 -41
- package/dist/es/components/Thread/ThreadHeader.mjs.map +1 -1
- package/dist/es/components/Thread/ThreadStart.mjs +11 -10
- package/dist/es/components/Thread/ThreadStart.mjs.map +1 -1
- package/dist/es/components/Threads/ThreadContext.mjs +1 -5
- package/dist/es/components/Threads/ThreadContext.mjs.map +1 -1
- package/dist/es/components/Threads/ThreadList/ThreadList.mjs +19 -27
- package/dist/es/components/Threads/ThreadList/ThreadList.mjs.map +1 -1
- package/dist/es/components/Threads/ThreadList/ThreadListEmptyPlaceholder.mjs +3 -3
- package/dist/es/components/Threads/ThreadList/ThreadListEmptyPlaceholder.mjs.map +1 -1
- package/dist/es/components/Threads/ThreadList/ThreadListHeader.mjs +4 -4
- package/dist/es/components/Threads/ThreadList/ThreadListHeader.mjs.map +1 -1
- package/dist/es/components/Threads/ThreadList/ThreadListItemUI.mjs +30 -30
- package/dist/es/components/Threads/ThreadList/ThreadListItemUI.mjs.map +1 -1
- package/dist/es/components/Threads/ThreadList/ThreadListLoadingIndicator.mjs +1 -1
- package/dist/es/components/Threads/ThreadList/ThreadListUnseenThreadsBanner.mjs +7 -3
- package/dist/es/components/Threads/ThreadList/ThreadListUnseenThreadsBanner.mjs.map +1 -1
- package/dist/es/components/Threads/ThreadList/useThreadHighlighting.mjs +47 -0
- package/dist/es/components/Threads/ThreadList/useThreadHighlighting.mjs.map +1 -0
- package/dist/es/components/Threads/ThreadList/utils.a11y.mjs +13 -8
- package/dist/es/components/Threads/ThreadList/utils.a11y.mjs.map +1 -1
- package/dist/es/components/Threads/hooks/useCloseThread.mjs +30 -0
- package/dist/es/components/Threads/hooks/useCloseThread.mjs.map +1 -0
- package/dist/es/components/TypingIndicator/TypingIndicator.mjs +23 -17
- package/dist/es/components/TypingIndicator/TypingIndicator.mjs.map +1 -1
- package/dist/es/components/TypingIndicator/TypingIndicatorHeader.mjs +15 -11
- package/dist/es/components/TypingIndicator/TypingIndicatorHeader.mjs.map +1 -1
- package/dist/es/components/TypingIndicator/hooks/useDebouncedTypingActive.mjs.map +1 -1
- package/dist/es/components/TypingIndicator/utils/getTypingStatusMessage.mjs +7 -3
- package/dist/es/components/TypingIndicator/utils/getTypingStatusMessage.mjs.map +1 -1
- package/dist/es/components/VideoPlayer/VideoThumbnail.mjs +2 -2
- package/dist/es/components/VideoPlayer/VideoThumbnail.mjs.map +1 -1
- package/dist/es/context/AttachmentContext.mjs +16 -0
- package/dist/es/context/AttachmentContext.mjs.map +1 -0
- package/dist/es/context/ChannelInstanceContext.mjs +17 -0
- package/dist/es/context/ChannelInstanceContext.mjs.map +1 -0
- package/dist/es/context/ChannelListContext.mjs +3 -6
- package/dist/es/context/ChannelListContext.mjs.map +1 -1
- package/dist/es/context/ChatContext.mjs +2 -8
- package/dist/es/context/ChatContext.mjs.map +1 -1
- package/dist/es/context/ComponentContext.mjs +1 -1
- package/dist/es/context/ComponentContext.mjs.map +1 -1
- package/dist/es/context/DialogManagerContext.mjs +2 -2
- package/dist/es/context/DialogManagerContext.mjs.map +1 -1
- package/dist/es/context/MessageBounceContext.mjs +12 -14
- package/dist/es/context/MessageBounceContext.mjs.map +1 -1
- package/dist/es/context/MessageComposerContext.mjs +8 -6
- package/dist/es/context/MessageComposerContext.mjs.map +1 -1
- package/dist/es/context/MessageComposerControllerContext.mjs +19 -0
- package/dist/es/context/MessageComposerControllerContext.mjs.map +1 -0
- package/dist/es/context/MessageContext.mjs +2 -5
- package/dist/es/context/MessageContext.mjs.map +1 -1
- package/dist/es/context/MessageListContext.mjs +2 -8
- package/dist/es/context/MessageListContext.mjs.map +1 -1
- package/dist/es/context/MessageTranslationViewContext.mjs +3 -6
- package/dist/es/context/MessageTranslationViewContext.mjs.map +1 -1
- package/dist/es/context/ModalContext.mjs +6 -8
- package/dist/es/context/ModalContext.mjs.map +1 -1
- package/dist/es/context/PollContext.mjs +2 -3
- package/dist/es/context/PollContext.mjs.map +1 -1
- package/dist/es/context/TranslationContext.mjs +8 -21
- package/dist/es/context/TranslationContext.mjs.map +1 -1
- package/dist/es/context/VirtualizedMessageListContext.mjs +2 -1
- package/dist/es/context/VirtualizedMessageListContext.mjs.map +1 -1
- package/dist/es/context/WithComponents.mjs +3 -3
- package/dist/es/context/WithComponents.mjs.map +1 -1
- package/dist/es/context/WorkspaceNavigationContext.mjs +45 -0
- package/dist/es/context/WorkspaceNavigationContext.mjs.map +1 -0
- package/dist/es/context/requireContext.mjs +17 -0
- package/dist/es/context/requireContext.mjs.map +1 -0
- package/dist/es/context/useChannel.mjs +14 -0
- package/dist/es/context/useChannel.mjs.map +1 -0
- package/dist/es/context/useComponentContextIcons.mjs +8 -13
- package/dist/es/context/useComponentContextIcons.mjs.map +1 -1
- package/dist/es/hooks/useIsDmChannel.mjs +30 -0
- package/dist/es/hooks/useIsDmChannel.mjs.map +1 -0
- package/dist/es/hooks/useMessagePaginator.mjs +14 -0
- package/dist/es/hooks/useMessagePaginator.mjs.map +1 -0
- package/dist/es/i18n/Streami18n.mjs +38 -521
- package/dist/es/i18n/Streami18n.mjs.map +1 -1
- package/dist/es/i18n/TranslationBuilder/index.mjs +3 -0
- package/dist/es/i18n/TranslationBuilder/notifications/NotificationTranslationTopic.mjs +22 -24
- package/dist/es/i18n/TranslationBuilder/notifications/NotificationTranslationTopic.mjs.map +1 -1
- package/dist/es/i18n/TranslationBuilder/notifications/translators.mjs +20 -31
- package/dist/es/i18n/TranslationBuilder/notifications/translators.mjs.map +1 -1
- package/dist/es/i18n/TranslationBuilder/notifications/translatorsByNotificationType.mjs +42 -15
- package/dist/es/i18n/TranslationBuilder/notifications/translatorsByNotificationType.mjs.map +1 -1
- package/dist/es/i18n/runtimeDefaults.mjs +41 -0
- package/dist/es/i18n/runtimeDefaults.mjs.map +1 -0
- package/dist/es/i18n/useStreami18n.mjs +41 -0
- package/dist/es/i18n/useStreami18n.mjs.map +1 -0
- package/dist/es/i18n/utils.mjs +7 -125
- package/dist/es/i18n/utils.mjs.map +1 -1
- package/dist/es/index.mjs +175 -180
- package/dist/es/plugins/ChannelDetail/AvatarWithChannelDetail.mjs +4 -4
- package/dist/es/plugins/ChannelDetail/AvatarWithChannelDetail.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/ChannelDetail.mjs +1 -1
- package/dist/es/plugins/ChannelDetail/ChannelDetail.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/ChannelDetailEmptyList.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/ChannelDetailSearchInput.mjs +3 -3
- package/dist/es/plugins/ChannelDetail/ChannelDetailSearchInput.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/SectionNavigator/SectionNavigatorHeader.mjs +4 -5
- package/dist/es/plugins/ChannelDetail/SectionNavigator/SectionNavigatorHeader.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesEmptyList.mjs +4 -4
- package/dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesEmptyList.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.mjs +9 -8
- package/dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.utils.mjs +7 -6
- package/dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.utils.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/Views/ChannelFilesView/useChannelFilesSearch.mjs +1 -1
- package/dist/es/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementActions.defaults.mjs +44 -44
- package/dist/es/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementActions.defaults.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementView.mjs +25 -25
- package/dist/es/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementView.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaEmptyList.mjs +4 -4
- package/dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaEmptyList.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.mjs +13 -13
- package/dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.utils.mjs +8 -3
- package/dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.utils.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/Views/ChannelMediaView/useChannelMediaSearch.mjs +1 -1
- package/dist/es/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberActions.defaults.mjs +44 -41
- package/dist/es/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberActions.defaults.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberDetail.mjs +6 -5
- package/dist/es/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberDetail.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersAddView.mjs +19 -11
- package/dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersAddView.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersBrowseView.mjs +12 -11
- package/dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersBrowseView.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersHeaderActions.defaults.mjs +8 -8
- package/dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersHeaderActions.defaults.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.mjs +8 -4
- package/dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.utils.mjs +1 -1
- package/dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.utils.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesEmptyList.mjs +3 -3
- package/dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesEmptyList.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesView.mjs +24 -21
- package/dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesView.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/usePinnedMessagesCount.mjs +9 -17
- package/dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/usePinnedMessagesCount.mjs.map +1 -1
- package/dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/usePinnedMessagesSearch.mjs +1 -1
- package/dist/es/plugins/Emojis/EmojiPicker.mjs +9 -8
- package/dist/es/plugins/Emojis/EmojiPicker.mjs.map +1 -1
- package/dist/es/plugins/Emojis/middleware/textComposerEmojiMiddleware.mjs +2 -1
- package/dist/es/plugins/Emojis/middleware/textComposerEmojiMiddleware.mjs.map +1 -1
- package/dist/es/plugins/SlotGeometry/SlotGeometry.mjs +141 -0
- package/dist/es/plugins/SlotGeometry/SlotGeometry.mjs.map +1 -0
- package/dist/es/plugins/SlotLayout/ChannelSlot.mjs +30 -0
- package/dist/es/plugins/SlotLayout/ChannelSlot.mjs.map +1 -0
- package/dist/es/{components/ChatView → plugins/SlotLayout}/ChatView.a11y.utility.mjs +1 -1
- package/dist/es/plugins/SlotLayout/ChatView.a11y.utility.mjs.map +1 -0
- package/dist/es/plugins/SlotLayout/ChatView.mjs +277 -0
- package/dist/es/plugins/SlotLayout/ChatView.mjs.map +1 -0
- package/dist/es/plugins/SlotLayout/ChatViewNavigationContext.mjs +239 -0
- package/dist/es/plugins/SlotLayout/ChatViewNavigationContext.mjs.map +1 -0
- package/dist/es/plugins/SlotLayout/ThreadListSlot.mjs +42 -0
- package/dist/es/plugins/SlotLayout/ThreadListSlot.mjs.map +1 -0
- package/dist/es/plugins/SlotLayout/ThreadSlot.mjs +34 -0
- package/dist/es/plugins/SlotLayout/ThreadSlot.mjs.map +1 -0
- package/dist/es/plugins/SlotLayout/hooks/useLayoutViewState.mjs +26 -0
- package/dist/es/plugins/SlotLayout/hooks/useLayoutViewState.mjs.map +1 -0
- package/dist/es/plugins/SlotLayout/hooks/useSlotEntity.mjs +167 -0
- package/dist/es/plugins/SlotLayout/hooks/useSlotEntity.mjs.map +1 -0
- package/dist/es/plugins/SlotLayout/layout/Slot.mjs +46 -0
- package/dist/es/plugins/SlotLayout/layout/Slot.mjs.map +1 -0
- package/dist/es/plugins/SlotLayout/layout/WorkspaceLayout.mjs +23 -0
- package/dist/es/plugins/SlotLayout/layout/WorkspaceLayout.mjs.map +1 -0
- package/dist/es/plugins/SlotLayout/layoutController/LayoutController.mjs +376 -0
- package/dist/es/plugins/SlotLayout/layoutController/LayoutController.mjs.map +1 -0
- package/dist/es/plugins/SlotLayout/layoutController/serialization.mjs +80 -0
- package/dist/es/plugins/SlotLayout/layoutController/serialization.mjs.map +1 -0
- package/dist/es/plugins/SlotLayout/slotBinding.mjs +15 -0
- package/dist/es/plugins/SlotLayout/slotBinding.mjs.map +1 -0
- package/dist/es/plugins/SlotLayout/slotRegistry.mjs +64 -0
- package/dist/es/plugins/SlotLayout/slotRegistry.mjs.map +1 -0
- package/dist/es/plugins/SlotLayout/workspaceNavigationAdapter.mjs +130 -0
- package/dist/es/plugins/SlotLayout/workspaceNavigationAdapter.mjs.map +1 -0
- package/dist/es/slot-geometry.mjs +2 -0
- package/dist/es/slot-layout.mjs +14 -0
- package/dist/es/store/hooks/useStateStore.mjs.map +1 -1
- package/dist/es/utils/getChannel.mjs +5 -2
- package/dist/es/utils/getChannel.mjs.map +1 -1
- package/dist/es/utils/useStableCallback.mjs +1 -1
- package/dist/es/utils/useStableCallback.mjs.map +1 -1
- package/dist/types/a11y/accessibleLabel.d.ts.map +1 -1
- package/dist/types/components/AIStateIndicator/AIStateIndicator.d.ts.map +1 -1
- package/dist/types/components/AIStateIndicator/hooks/useAIState.d.ts +3 -8
- package/dist/types/components/AIStateIndicator/hooks/useAIState.d.ts.map +1 -1
- package/dist/types/components/Accessibility/NotificationAnnouncer.d.ts +1 -2
- package/dist/types/components/Accessibility/NotificationAnnouncer.d.ts.map +1 -1
- package/dist/types/components/Accessibility/hooks/useIncomingMessageAnnouncements.d.ts.map +1 -1
- package/dist/types/components/Accessibility/hooks/useInteractionAnnouncements.d.ts.map +1 -1
- package/dist/types/components/Accessibility/useAriaLiveAnnouncer.d.ts +4 -0
- package/dist/types/components/Accessibility/useAriaLiveAnnouncer.d.ts.map +1 -1
- package/dist/types/components/Attachment/Attachment.d.ts +13 -2
- package/dist/types/components/Attachment/Attachment.d.ts.map +1 -1
- package/dist/types/components/Attachment/AttachmentActions.d.ts.map +1 -1
- package/dist/types/components/Attachment/AttachmentContainer.d.ts +2 -2
- package/dist/types/components/Attachment/AttachmentContainer.d.ts.map +1 -1
- package/dist/types/components/Attachment/Audio.d.ts.map +1 -1
- package/dist/types/components/Attachment/FileAttachment.d.ts.map +1 -1
- package/dist/types/components/Attachment/Geolocation.d.ts +3 -3
- package/dist/types/components/Attachment/Geolocation.d.ts.map +1 -1
- package/dist/types/components/Attachment/Giphy.d.ts.map +1 -1
- package/dist/types/components/Attachment/LinkPreview/Card.d.ts.map +1 -1
- package/dist/types/components/Attachment/LinkPreview/CardAudio.d.ts +1 -1
- package/dist/types/components/Attachment/LinkPreview/CardAudio.d.ts.map +1 -1
- package/dist/types/components/Attachment/ModalGallery.d.ts.map +1 -1
- package/dist/types/components/Attachment/UnsupportedAttachment.d.ts.map +1 -1
- package/dist/types/components/Attachment/VideoAttachment.d.ts.map +1 -1
- package/dist/types/components/Attachment/VisibilityDisclaimer.d.ts.map +1 -1
- package/dist/types/components/Attachment/VoiceRecording.d.ts.map +1 -1
- package/dist/types/components/Attachment/components/DownloadButton.d.ts.map +1 -1
- package/dist/types/components/Attachment/components/index.d.ts +1 -1
- package/dist/types/components/Attachment/components/index.d.ts.map +1 -1
- package/dist/types/components/Attachment/hooks/useAttachmentUploadState.d.ts +0 -28
- package/dist/types/components/Attachment/hooks/useAttachmentUploadState.d.ts.map +1 -1
- package/dist/types/components/Attachment/index.d.ts +1 -1
- package/dist/types/components/Attachment/index.d.ts.map +1 -1
- package/dist/types/components/Attachment/utils.d.ts +2 -2
- package/dist/types/components/Attachment/utils.d.ts.map +1 -1
- package/dist/types/components/AudioPlayback/AudioPlaybackArbiter.d.ts +37 -0
- package/dist/types/components/AudioPlayback/AudioPlaybackArbiter.d.ts.map +1 -0
- package/dist/types/components/AudioPlayback/AudioPlayer.d.ts +1 -1
- package/dist/types/components/AudioPlayback/AudioPlayer.d.ts.map +1 -1
- package/dist/types/components/AudioPlayback/AudioPlayerPool.d.ts +19 -31
- package/dist/types/components/AudioPlayback/AudioPlayerPool.d.ts.map +1 -1
- package/dist/types/components/AudioPlayback/WithAudioPlayback.d.ts +17 -2
- package/dist/types/components/AudioPlayback/WithAudioPlayback.d.ts.map +1 -1
- package/dist/types/components/AudioPlayback/components/ProgressBar.d.ts.map +1 -1
- package/dist/types/components/AudioPlayback/components/WaveProgressBar.d.ts.map +1 -1
- package/dist/types/components/AudioPlayback/components/progressBarA11y.d.ts +2 -2
- package/dist/types/components/AudioPlayback/components/progressBarA11y.d.ts.map +1 -1
- package/dist/types/components/AudioPlayback/index.d.ts.map +1 -1
- package/dist/types/components/AudioPlayback/plugins/AudioPlayerNotificationsPlugin.d.ts +2 -2
- package/dist/types/components/AudioPlayback/plugins/AudioPlayerNotificationsPlugin.d.ts.map +1 -1
- package/dist/types/components/Avatar/Avatar.d.ts +1 -5
- package/dist/types/components/Avatar/Avatar.d.ts.map +1 -1
- package/dist/types/components/Badge/Badge.d.ts.map +1 -1
- package/dist/types/components/Badge/MediaBadge.d.ts.map +1 -1
- package/dist/types/components/BaseImage/ImagePlaceholder.d.ts.map +1 -1
- package/dist/types/components/Button/PlayButton.d.ts.map +1 -1
- package/dist/types/components/Button/WorkspaceNavigationButtons.d.ts +11 -0
- package/dist/types/components/Button/WorkspaceNavigationButtons.d.ts.map +1 -0
- package/dist/types/components/Button/index.d.ts +1 -0
- package/dist/types/components/Button/index.d.ts.map +1 -1
- package/dist/types/components/Channel/Channel.d.ts +9 -57
- package/dist/types/components/Channel/Channel.d.ts.map +1 -1
- package/dist/types/components/Channel/hooks/useChannelCapabilities.d.ts +4 -0
- package/dist/types/components/Channel/hooks/useChannelCapabilities.d.ts.map +1 -0
- package/dist/types/components/Channel/index.d.ts +1 -2
- package/dist/types/components/Channel/index.d.ts.map +1 -1
- package/dist/types/components/ChannelHeader/ChannelHeader.d.ts +12 -0
- package/dist/types/components/ChannelHeader/ChannelHeader.d.ts.map +1 -1
- package/dist/types/components/ChannelHeader/hooks/useChannelHasMembersOnline.d.ts +8 -0
- package/dist/types/components/ChannelHeader/hooks/useChannelHasMembersOnline.d.ts.map +1 -1
- package/dist/types/components/ChannelHeader/hooks/useChannelHeaderOnlineStatus.d.ts +7 -8
- package/dist/types/components/ChannelHeader/hooks/useChannelHeaderOnlineStatus.d.ts.map +1 -1
- package/dist/types/components/ChannelList/ChannelList.d.ts +11 -78
- package/dist/types/components/ChannelList/ChannelList.d.ts.map +1 -1
- package/dist/types/components/ChannelList/ChannelListHeader.d.ts.map +1 -1
- package/dist/types/components/ChannelList/ChannelLists.d.ts +10 -0
- package/dist/types/components/ChannelList/ChannelLists.d.ts.map +1 -0
- package/dist/types/components/ChannelList/ChannelNavigation.d.ts +9 -0
- package/dist/types/components/ChannelList/ChannelNavigation.d.ts.map +1 -0
- package/dist/types/components/ChannelList/hooks/index.d.ts +1 -2
- package/dist/types/components/ChannelList/hooks/index.d.ts.map +1 -1
- package/dist/types/components/ChannelList/hooks/useChannelMembersState.d.ts.map +1 -1
- package/dist/types/components/ChannelList/hooks/useChannelMembershipState.d.ts.map +1 -1
- package/dist/types/components/ChannelList/hooks/useChannelPaginatorState.d.ts +18 -0
- package/dist/types/components/ChannelList/hooks/useChannelPaginatorState.d.ts.map +1 -0
- package/dist/types/components/ChannelList/hooks/useSelectedChannelState.d.ts +3 -3
- package/dist/types/components/ChannelList/hooks/useSelectedChannelState.d.ts.map +1 -1
- package/dist/types/components/ChannelList/index.d.ts +3 -2
- package/dist/types/components/ChannelList/index.d.ts.map +1 -1
- package/dist/types/components/ChannelListItem/ChannelListItem.d.ts +9 -18
- package/dist/types/components/ChannelListItem/ChannelListItem.d.ts.map +1 -1
- package/dist/types/components/ChannelListItem/ChannelListItemActionButtons.defaults.d.ts.map +1 -1
- package/dist/types/components/ChannelListItem/ChannelListItemTimestamp.d.ts +3 -3
- package/dist/types/components/ChannelListItem/ChannelListItemTimestamp.d.ts.map +1 -1
- package/dist/types/components/ChannelListItem/ChannelListItemUI.d.ts.map +1 -1
- package/dist/types/components/ChannelListItem/hooks/useChannelDisplayName.d.ts +1 -1
- package/dist/types/components/ChannelListItem/hooks/useChannelDisplayName.d.ts.map +1 -1
- package/dist/types/components/ChannelListItem/hooks/useIsChannelMuted.d.ts +8 -5
- package/dist/types/components/ChannelListItem/hooks/useIsChannelMuted.d.ts.map +1 -1
- package/dist/types/components/ChannelListItem/hooks/useMessageDeliveryStatus.d.ts.map +1 -1
- package/dist/types/components/ChannelListItem/utils.a11y.d.ts +14 -5
- package/dist/types/components/ChannelListItem/utils.a11y.d.ts.map +1 -1
- package/dist/types/components/ChannelListItem/utils.d.ts +1 -1
- package/dist/types/components/ChannelListItem/utils.d.ts.map +1 -1
- package/dist/types/components/Chat/Chat.d.ts +1 -4
- package/dist/types/components/Chat/Chat.d.ts.map +1 -1
- package/dist/types/components/Chat/hooks/useChat.d.ts +4 -16
- package/dist/types/components/Chat/hooks/useChat.d.ts.map +1 -1
- package/dist/types/components/Chat/hooks/useCreateChatClient.d.ts +2 -2
- package/dist/types/components/Chat/hooks/useCreateChatClient.d.ts.map +1 -1
- package/dist/types/components/Chat/hooks/useCreateChatContext.d.ts.map +1 -1
- package/dist/types/components/Chat/hooks/useNetworkConnectionState.d.ts +34 -0
- package/dist/types/components/Chat/hooks/useNetworkConnectionState.d.ts.map +1 -0
- package/dist/types/components/Chat/hooks/useReportLostConnectionSystemNotification.d.ts +26 -2
- package/dist/types/components/Chat/hooks/useReportLostConnectionSystemNotification.d.ts.map +1 -1
- package/dist/types/components/Chat/hooks/useWSConnectionState.d.ts +22 -0
- package/dist/types/components/Chat/hooks/useWSConnectionState.d.ts.map +1 -0
- package/dist/types/components/Chat/index.d.ts +2 -0
- package/dist/types/components/Chat/index.d.ts.map +1 -1
- package/dist/types/components/Dialog/components/ContextMenu.d.ts +0 -4
- package/dist/types/components/Dialog/components/ContextMenu.d.ts.map +1 -1
- package/dist/types/components/Dialog/hooks/usePopoverPosition.d.ts +2 -2
- package/dist/types/components/Dialog/hooks/usePopoverPosition.d.ts.map +1 -1
- package/dist/types/components/Dialog/service/DialogManager.d.ts +1 -1
- package/dist/types/components/Dialog/service/DialogManager.d.ts.map +1 -1
- package/dist/types/components/EmptyStateIndicator/EmptyStateIndicator.d.ts.map +1 -1
- package/dist/types/components/Form/Dropdown.d.ts +4 -1
- package/dist/types/components/Form/Dropdown.d.ts.map +1 -1
- package/dist/types/components/Form/NumericInput.d.ts.map +1 -1
- package/dist/types/components/Gallery/GalleryContext.d.ts +5 -0
- package/dist/types/components/Gallery/GalleryContext.d.ts.map +1 -1
- package/dist/types/components/Gallery/GalleryHeader.d.ts.map +1 -1
- package/dist/types/components/Gallery/GalleryUI.d.ts.map +1 -1
- package/dist/types/components/Icons/index.d.ts +1 -1
- package/dist/types/components/Icons/index.d.ts.map +1 -1
- package/dist/types/components/Icons/slots.d.ts +18 -7
- package/dist/types/components/Icons/slots.d.ts.map +1 -1
- package/dist/types/components/InfiniteScrollPaginator/InfiniteScrollPaginator.d.ts +8 -2
- package/dist/types/components/InfiniteScrollPaginator/InfiniteScrollPaginator.d.ts.map +1 -1
- package/dist/types/components/InfiniteScrollPaginator/InfiniteScrollWithComponents.d.ts +43 -0
- package/dist/types/components/InfiniteScrollPaginator/InfiniteScrollWithComponents.d.ts.map +1 -0
- package/dist/types/components/InfiniteScrollPaginator/hooks/useCursorPaginator.d.ts +1 -1
- package/dist/types/components/InfiniteScrollPaginator/hooks/useCursorPaginator.d.ts.map +1 -1
- package/dist/types/components/LoadMore/LoadMoreButton.d.ts.map +1 -1
- package/dist/types/components/Loading/AttachmentUploadedSizeIndicator.d.ts +3 -0
- package/dist/types/components/Loading/AttachmentUploadedSizeIndicator.d.ts.map +1 -1
- package/dist/types/components/Loading/LoadingErrorIndicator.d.ts.map +1 -1
- package/dist/types/components/Loading/LoadingIndicator.d.ts +2 -3
- package/dist/types/components/Loading/LoadingIndicator.d.ts.map +1 -1
- package/dist/types/components/Loading/UploadProgressIndicator.d.ts +2 -2
- package/dist/types/components/Loading/index.d.ts +1 -1
- package/dist/types/components/Loading/index.d.ts.map +1 -1
- package/dist/types/components/Loading/progress-indicators.d.ts.map +1 -1
- package/dist/types/components/Location/ShareLocationDialog.d.ts.map +1 -1
- package/dist/types/components/Location/hooks/useLiveLocationSharingManager.d.ts.map +1 -1
- package/dist/types/components/MediaRecorder/AudioRecorder/AudioRecorderRecordingControls.d.ts.map +1 -1
- package/dist/types/components/MediaRecorder/AudioRecorder/AudioRecordingButtonWithNotification.d.ts.map +1 -1
- package/dist/types/components/MediaRecorder/AudioRecorder/AudioRecordingPlayback.d.ts.map +1 -1
- package/dist/types/components/MediaRecorder/AudioRecorder/AudioRecordingPreview.d.ts.map +1 -1
- package/dist/types/components/MediaRecorder/RecordingPermissionDeniedNotification.d.ts.map +1 -1
- package/dist/types/components/MediaRecorder/classes/MediaRecorderController.d.ts.map +1 -1
- package/dist/types/components/MediaRecorder/hooks/useMediaRecorder.d.ts +2 -2
- package/dist/types/components/MediaRecorder/hooks/useMediaRecorder.d.ts.map +1 -1
- package/dist/types/components/Message/Message.d.ts.map +1 -1
- package/dist/types/components/Message/MessageAlsoSentInChannelIndicator.d.ts +11 -1
- package/dist/types/components/Message/MessageAlsoSentInChannelIndicator.d.ts.map +1 -1
- package/dist/types/components/Message/MessageDeletedBubble.d.ts.map +1 -1
- package/dist/types/components/Message/MessageEditedIndicator.d.ts.map +1 -1
- package/dist/types/components/Message/MessageRepliesCountButton.d.ts.map +1 -1
- package/dist/types/components/Message/MessageStatus.d.ts.map +1 -1
- package/dist/types/components/Message/MessageText.d.ts.map +1 -1
- package/dist/types/components/Message/MessageTimestamp.d.ts.map +1 -1
- package/dist/types/components/Message/MessageTranslationIndicator.d.ts.map +1 -1
- package/dist/types/components/Message/MessageUI.d.ts.map +1 -1
- package/dist/types/components/Message/ReminderNotification.d.ts.map +1 -1
- package/dist/types/components/Message/StreamedMessageText.d.ts.map +1 -1
- package/dist/types/components/Message/Timestamp.d.ts.map +1 -1
- package/dist/types/components/Message/hooks/index.d.ts +1 -0
- package/dist/types/components/Message/hooks/index.d.ts.map +1 -1
- package/dist/types/components/Message/hooks/useActionHandler.d.ts +1 -1
- package/dist/types/components/Message/hooks/useActionHandler.d.ts.map +1 -1
- package/dist/types/components/Message/hooks/useDeleteHandler.d.ts +6 -2
- package/dist/types/components/Message/hooks/useDeleteHandler.d.ts.map +1 -1
- package/dist/types/components/Message/hooks/useMarkUnreadHandler.d.ts +6 -1
- package/dist/types/components/Message/hooks/useMarkUnreadHandler.d.ts.map +1 -1
- package/dist/types/components/Message/hooks/useMentionsHandler.d.ts.map +1 -1
- package/dist/types/components/Message/hooks/useMessageAlsoSentInChannelNavigation.d.ts +22 -0
- package/dist/types/components/Message/hooks/useMessageAlsoSentInChannelNavigation.d.ts.map +1 -0
- package/dist/types/components/Message/hooks/useMuteHandler.d.ts +7 -2
- package/dist/types/components/Message/hooks/useMuteHandler.d.ts.map +1 -1
- package/dist/types/components/Message/hooks/useOpenThreadHandler.d.ts +1 -0
- package/dist/types/components/Message/hooks/useOpenThreadHandler.d.ts.map +1 -1
- package/dist/types/components/Message/hooks/usePinHandler.d.ts +23 -2
- package/dist/types/components/Message/hooks/usePinHandler.d.ts.map +1 -1
- package/dist/types/components/Message/hooks/useReactionHandler.d.ts +1 -1
- package/dist/types/components/Message/hooks/useReactionHandler.d.ts.map +1 -1
- package/dist/types/components/Message/hooks/useReactionsFetcher.d.ts +2 -2
- package/dist/types/components/Message/hooks/useReactionsFetcher.d.ts.map +1 -1
- package/dist/types/components/Message/hooks/useRetryHandler.d.ts +3 -2
- package/dist/types/components/Message/hooks/useRetryHandler.d.ts.map +1 -1
- package/dist/types/components/Message/hooks/useUserRole.d.ts +1 -0
- package/dist/types/components/Message/hooks/useUserRole.d.ts.map +1 -1
- package/dist/types/components/Message/types.d.ts +11 -20
- package/dist/types/components/Message/types.d.ts.map +1 -1
- package/dist/types/components/Message/utils.d.ts +7 -38
- package/dist/types/components/Message/utils.d.ts.map +1 -1
- package/dist/types/components/MessageActions/DeleteMessageAlert.d.ts.map +1 -1
- package/dist/types/components/MessageActions/DownloadSubmenu.d.ts.map +1 -1
- package/dist/types/components/MessageActions/MessageActions.d.ts +6 -2
- package/dist/types/components/MessageActions/MessageActions.d.ts.map +1 -1
- package/dist/types/components/MessageActions/MessageActions.defaults.d.ts.map +1 -1
- package/dist/types/components/MessageActions/RemindMeSubmenu.d.ts.map +1 -1
- package/dist/types/components/MessageActions/hooks/useBaseMessageActionSetFilter.d.ts.map +1 -1
- package/dist/types/components/MessageBounce/MessageBouncePrompt.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/AttachmentPreviewList/AudioAttachmentPreview.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/AttachmentPreviewList/FileAttachmentPreview.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/AttachmentPreviewList/GeolocationPreview.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/AttachmentPreviewList/MediaAttachmentPreview.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/AttachmentPreviewList/UnsupportedAttachmentPreview.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/AttachmentPreviewList/index.d.ts +1 -1
- package/dist/types/components/MessageComposer/AttachmentPreviewList/index.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/AttachmentPreviewList/utils/AttachmentPreviewRoot.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/AttachmentSelector/AttachmentSelector.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/AttachmentSelector/CommandsMenu.d.ts +5 -5
- package/dist/types/components/MessageComposer/AttachmentSelector/CommandsMenu.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/CommandChip.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/EditMessageForm.d.ts +1 -0
- package/dist/types/components/MessageComposer/EditMessageForm.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/MessageComposer.d.ts +1 -17
- package/dist/types/components/MessageComposer/MessageComposer.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/MessageComposerActions.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/MessageComposerUI.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/QuotedMessagePreview.d.ts +3 -3
- package/dist/types/components/MessageComposer/QuotedMessagePreview.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/RemoveAttachmentPreviewButton.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/SendButton.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/SendToChannelCheckbox.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/StopAIGenerationButton.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/WithDragAndDropUpload.d.ts +2 -5
- package/dist/types/components/MessageComposer/WithDragAndDropUpload.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/hooks/index.d.ts +1 -0
- package/dist/types/components/MessageComposer/hooks/index.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/hooks/useAttachmentManagerState.d.ts +5 -1
- package/dist/types/components/MessageComposer/hooks/useAttachmentManagerState.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/hooks/useAttachmentsForPreview.d.ts +1 -2
- package/dist/types/components/MessageComposer/hooks/useAttachmentsForPreview.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/hooks/useCreateMessageComposerContext.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/hooks/useMessageComposerBindings.d.ts +0 -1
- package/dist/types/components/MessageComposer/hooks/useMessageComposerBindings.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/hooks/useMessageComposerCommands.d.ts +2 -2
- package/dist/types/components/MessageComposer/hooks/useMessageComposerCommands.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/hooks/useMessageComposerController.d.ts +1 -1
- package/dist/types/components/MessageComposer/hooks/useMessageComposerController.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/hooks/useMessageComposerHasSendableData.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/hooks/useMessageComposerSubmitFn.d.ts +7 -0
- package/dist/types/components/MessageComposer/hooks/useMessageComposerSubmitFn.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/index.d.ts +2 -1
- package/dist/types/components/MessageComposer/index.d.ts.map +1 -1
- package/dist/types/components/MessageList/FloatingDateSeparator.d.ts +1 -1
- package/dist/types/components/MessageList/FloatingDateSeparator.d.ts.map +1 -1
- package/dist/types/components/MessageList/MessageList.d.ts +24 -25
- package/dist/types/components/MessageList/MessageList.d.ts.map +1 -1
- package/dist/types/components/MessageList/NewMessageNotification.d.ts.map +1 -1
- package/dist/types/components/MessageList/ScrollToLatestMessageButton.d.ts +0 -1
- package/dist/types/components/MessageList/ScrollToLatestMessageButton.d.ts.map +1 -1
- package/dist/types/components/MessageList/UnreadMessagesNotification.d.ts +1 -4
- package/dist/types/components/MessageList/UnreadMessagesNotification.d.ts.map +1 -1
- package/dist/types/components/MessageList/UnreadMessagesSeparator.d.ts.map +1 -1
- package/dist/types/components/MessageList/VirtualizedMessageList.d.ts +23 -42
- package/dist/types/components/MessageList/VirtualizedMessageList.d.ts.map +1 -1
- package/dist/types/components/MessageList/VirtualizedMessageListComponents.d.ts.map +1 -1
- package/dist/types/components/MessageList/hooks/MessageList/useEnrichedMessages.d.ts +3 -3
- package/dist/types/components/MessageList/hooks/MessageList/useEnrichedMessages.d.ts.map +1 -1
- package/dist/types/components/MessageList/hooks/MessageList/useFloatingDateSeparatorMessageList.d.ts +2 -2
- package/dist/types/components/MessageList/hooks/MessageList/useFloatingDateSeparatorMessageList.d.ts.map +1 -1
- package/dist/types/components/MessageList/hooks/MessageList/useMessageListElements.d.ts +1 -3
- package/dist/types/components/MessageList/hooks/MessageList/useMessageListElements.d.ts.map +1 -1
- package/dist/types/components/MessageList/hooks/MessageList/useMessageListScrollManager.d.ts +1 -0
- package/dist/types/components/MessageList/hooks/MessageList/useMessageListScrollManager.d.ts.map +1 -1
- package/dist/types/components/MessageList/hooks/MessageList/useScrollLocationLogic.d.ts +6 -25
- package/dist/types/components/MessageList/hooks/MessageList/useScrollLocationLogic.d.ts.map +1 -1
- package/dist/types/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.d.ts +1 -1
- package/dist/types/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.d.ts.map +1 -1
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useFloatingDateSeparator.d.ts +2 -2
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useFloatingDateSeparator.d.ts.map +1 -1
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.d.ts +1 -1
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.d.ts.map +1 -1
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.d.ts +1 -5
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.d.ts.map +1 -1
- package/dist/types/components/MessageList/hooks/useCanPaginateReplies.d.ts +32 -0
- package/dist/types/components/MessageList/hooks/useCanPaginateReplies.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/useLastDeliveredData.d.ts +1 -0
- package/dist/types/components/MessageList/hooks/useLastDeliveredData.d.ts.map +1 -1
- package/dist/types/components/MessageList/hooks/useLastReadData.d.ts +1 -0
- package/dist/types/components/MessageList/hooks/useLastReadData.d.ts.map +1 -1
- package/dist/types/components/MessageList/hooks/useMarkRead.d.ts +5 -9
- package/dist/types/components/MessageList/hooks/useMarkRead.d.ts.map +1 -1
- package/dist/types/components/MessageList/hooks/useReceiptsByMessageId.d.ts +12 -0
- package/dist/types/components/MessageList/hooks/useReceiptsByMessageId.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/useThreadHead.d.ts +9 -0
- package/dist/types/components/MessageList/hooks/useThreadHead.d.ts.map +1 -0
- package/dist/types/components/MessageList/messageSourceKey.d.ts +14 -0
- package/dist/types/components/MessageList/messageSourceKey.d.ts.map +1 -0
- package/dist/types/components/MessageList/renderMessages.d.ts +11 -9
- package/dist/types/components/MessageList/renderMessages.d.ts.map +1 -1
- package/dist/types/components/MessageList/utils.d.ts +22 -13
- package/dist/types/components/MessageList/utils.d.ts.map +1 -1
- package/dist/types/components/Modal/CloseButtonOnModalOverlay.d.ts.map +1 -1
- package/dist/types/components/Notifications/Notification.d.ts.map +1 -1
- package/dist/types/components/Notifications/NotificationList.d.ts.map +1 -1
- package/dist/types/components/Notifications/hooks/useNotificationApi.d.ts +3 -0
- package/dist/types/components/Notifications/hooks/useNotificationApi.d.ts.map +1 -1
- package/dist/types/components/Notifications/hooks/useNotificationTarget.d.ts.map +1 -1
- package/dist/types/components/Notifications/notificationTarget.d.ts.map +1 -1
- package/dist/types/components/Poll/PollActions/AddCommentPrompt.d.ts.map +1 -1
- package/dist/types/components/Poll/PollActions/EndPollAlert.d.ts.map +1 -1
- package/dist/types/components/Poll/PollActions/PollActions.d.ts.map +1 -1
- package/dist/types/components/Poll/PollActions/PollAnswerList.d.ts.map +1 -1
- package/dist/types/components/Poll/PollActions/PollOptionsFullList.d.ts.map +1 -1
- package/dist/types/components/Poll/PollActions/PollQuestion.d.ts.map +1 -1
- package/dist/types/components/Poll/PollActions/PollResults/PollOptionWithVotes.d.ts +2 -2
- package/dist/types/components/Poll/PollActions/PollResults/PollOptionWithVotes.d.ts.map +1 -1
- package/dist/types/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.d.ts +2 -2
- package/dist/types/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.d.ts.map +1 -1
- package/dist/types/components/Poll/PollActions/PollResults/PollOptionWithVotesList.d.ts +2 -2
- package/dist/types/components/Poll/PollActions/PollResults/PollOptionWithVotesList.d.ts.map +1 -1
- package/dist/types/components/Poll/PollActions/PollResults/PollResults.d.ts.map +1 -1
- package/dist/types/components/Poll/PollActions/SuggestPollOptionPrompt.d.ts.map +1 -1
- package/dist/types/components/Poll/PollCreationDialog/MultipleAnswersField.d.ts.map +1 -1
- package/dist/types/components/Poll/PollCreationDialog/NameField.d.ts.map +1 -1
- package/dist/types/components/Poll/PollCreationDialog/OptionFieldSet.d.ts.map +1 -1
- package/dist/types/components/Poll/PollCreationDialog/PollCreationDialog.d.ts.map +1 -1
- package/dist/types/components/Poll/PollCreationDialog/PollCreationDialogControls.d.ts.map +1 -1
- package/dist/types/components/Poll/PollCreationDialog/PollOptionReorderHandle.d.ts.map +1 -1
- package/dist/types/components/Poll/PollHeader.d.ts.map +1 -1
- package/dist/types/components/Poll/PollOptionList.d.ts.map +1 -1
- package/dist/types/components/Poll/PollOptionSelector.d.ts +2 -2
- package/dist/types/components/Poll/PollOptionSelector.d.ts.map +1 -1
- package/dist/types/components/Poll/PollVote.d.ts +1 -1
- package/dist/types/components/Poll/PollVote.d.ts.map +1 -1
- package/dist/types/components/Poll/hooks/useManagePollVotesRealtime.d.ts +2 -2
- package/dist/types/components/Poll/hooks/useManagePollVotesRealtime.d.ts.map +1 -1
- package/dist/types/components/Poll/hooks/usePollAnswerPagination.d.ts +2 -2
- package/dist/types/components/Poll/hooks/usePollAnswerPagination.d.ts.map +1 -1
- package/dist/types/components/Poll/hooks/usePollOptionVotesPagination.d.ts +2 -2
- package/dist/types/components/Poll/hooks/usePollOptionVotesPagination.d.ts.map +1 -1
- package/dist/types/components/Reactions/MessageReactions.d.ts.map +1 -1
- package/dist/types/components/Reactions/MessageReactionsDetail.d.ts +2 -2
- package/dist/types/components/Reactions/MessageReactionsDetail.d.ts.map +1 -1
- package/dist/types/components/Reactions/ReactionSelector.d.ts.map +1 -1
- package/dist/types/components/Reactions/ReactionSelectorWithButton.d.ts +0 -5
- package/dist/types/components/Reactions/ReactionSelectorWithButton.d.ts.map +1 -1
- package/dist/types/components/Reactions/hooks/useFetchReactions.d.ts +2 -2
- package/dist/types/components/Reactions/hooks/useFetchReactions.d.ts.map +1 -1
- package/dist/types/components/Reactions/hooks/useProcessReactions.d.ts +1 -3
- package/dist/types/components/Reactions/hooks/useProcessReactions.d.ts.map +1 -1
- package/dist/types/components/Search/SearchBar/SearchBar.d.ts.map +1 -1
- package/dist/types/components/Search/SearchContext.d.ts.map +1 -1
- package/dist/types/components/Search/SearchResults/SearchResultItem.d.ts +20 -6
- package/dist/types/components/Search/SearchResults/SearchResultItem.d.ts.map +1 -1
- package/dist/types/components/Search/SearchResults/SearchResultsHeader.d.ts.map +1 -1
- package/dist/types/components/Search/SearchResults/SearchSourceResultsEmpty.d.ts.map +1 -1
- package/dist/types/components/Search/SearchResults/SearchSourceResultsLoadingIndicator.d.ts.map +1 -1
- package/dist/types/components/Search/SearchSourceResultsContext.d.ts.map +1 -1
- package/dist/types/components/Search/hooks/index.d.ts +0 -1
- package/dist/types/components/Search/hooks/index.d.ts.map +1 -1
- package/dist/types/components/SummarizedMessagePreview/SummarizedMessagePreview.d.ts +6 -0
- package/dist/types/components/SummarizedMessagePreview/SummarizedMessagePreview.d.ts.map +1 -1
- package/dist/types/components/SummarizedMessagePreview/hooks/useLatestMessagePreview.d.ts.map +1 -1
- package/dist/types/components/TextareaComposer/SuggestionList/CommandItem.d.ts +2 -2
- package/dist/types/components/TextareaComposer/SuggestionList/CommandItem.d.ts.map +1 -1
- package/dist/types/components/TextareaComposer/SuggestionList/MentionItem/BroadcastMentionItem.d.ts.map +1 -1
- package/dist/types/components/TextareaComposer/SuggestionList/MentionItem/RoleItem.d.ts.map +1 -1
- package/dist/types/components/TextareaComposer/SuggestionList/MentionItem/UserGroupItem.d.ts.map +1 -1
- package/dist/types/components/TextareaComposer/SuggestionList/SuggestionList.d.ts.map +1 -1
- package/dist/types/components/TextareaComposer/TextareaComposer.d.ts.map +1 -1
- package/dist/types/components/TextareaComposer/hooks/useTextareaPlaceholder.d.ts.map +1 -1
- package/dist/types/components/Thread/Thread.d.ts +31 -27
- package/dist/types/components/Thread/Thread.d.ts.map +1 -1
- package/dist/types/components/Thread/ThreadHead.d.ts.map +1 -1
- package/dist/types/components/Thread/ThreadHeader.d.ts +13 -6
- package/dist/types/components/Thread/ThreadHeader.d.ts.map +1 -1
- package/dist/types/components/Thread/ThreadStart.d.ts.map +1 -1
- package/dist/types/components/Thread/index.d.ts +0 -1
- package/dist/types/components/Thread/index.d.ts.map +1 -1
- package/dist/types/components/Threads/ThreadContext.d.ts.map +1 -1
- package/dist/types/components/Threads/ThreadList/ThreadList.d.ts.map +1 -1
- package/dist/types/components/Threads/ThreadList/ThreadListEmptyPlaceholder.d.ts.map +1 -1
- package/dist/types/components/Threads/ThreadList/ThreadListHeader.d.ts.map +1 -1
- package/dist/types/components/Threads/ThreadList/ThreadListItemUI.d.ts.map +1 -1
- package/dist/types/components/Threads/ThreadList/ThreadListUnseenThreadsBanner.d.ts.map +1 -1
- package/dist/types/components/Threads/ThreadList/useThreadHighlighting.d.ts +15 -0
- package/dist/types/components/Threads/ThreadList/useThreadHighlighting.d.ts.map +1 -0
- package/dist/types/components/Threads/ThreadList/utils.a11y.d.ts.map +1 -1
- package/dist/types/components/Threads/hooks/useCloseThread.d.ts +9 -0
- package/dist/types/components/Threads/hooks/useCloseThread.d.ts.map +1 -0
- package/dist/types/components/Threads/index.d.ts +1 -0
- package/dist/types/components/Threads/index.d.ts.map +1 -1
- package/dist/types/components/TypingIndicator/TypingIndicator.d.ts +4 -5
- package/dist/types/components/TypingIndicator/TypingIndicator.d.ts.map +1 -1
- package/dist/types/components/TypingIndicator/TypingIndicatorHeader.d.ts +1 -1
- package/dist/types/components/TypingIndicator/TypingIndicatorHeader.d.ts.map +1 -1
- package/dist/types/components/TypingIndicator/hooks/useDebouncedTypingActive.d.ts +2 -2
- package/dist/types/components/TypingIndicator/hooks/useDebouncedTypingActive.d.ts.map +1 -1
- package/dist/types/components/TypingIndicator/utils/getTypingStatusMessage.d.ts +2 -3
- package/dist/types/components/TypingIndicator/utils/getTypingStatusMessage.d.ts.map +1 -1
- package/dist/types/components/VideoPlayer/VideoThumbnail.d.ts.map +1 -1
- package/dist/types/components/index.d.ts +0 -2
- package/dist/types/components/index.d.ts.map +1 -1
- package/dist/types/context/AttachmentContext.d.ts +19 -0
- package/dist/types/context/AttachmentContext.d.ts.map +1 -0
- package/dist/types/context/ChannelInstanceContext.d.ts +16 -0
- package/dist/types/context/ChannelInstanceContext.d.ts.map +1 -0
- package/dist/types/context/ChannelListContext.d.ts +9 -18
- package/dist/types/context/ChannelListContext.d.ts.map +1 -1
- package/dist/types/context/ChatContext.d.ts +10 -23
- package/dist/types/context/ChatContext.d.ts.map +1 -1
- package/dist/types/context/ComponentContext.d.ts +30 -23
- package/dist/types/context/ComponentContext.d.ts.map +1 -1
- package/dist/types/context/DialogManagerContext.d.ts.map +1 -1
- package/dist/types/context/MessageBounceContext.d.ts +1 -1
- package/dist/types/context/MessageBounceContext.d.ts.map +1 -1
- package/dist/types/context/MessageComposerContext.d.ts +7 -2
- package/dist/types/context/MessageComposerContext.d.ts.map +1 -1
- package/dist/types/context/MessageComposerControllerContext.d.ts +13 -0
- package/dist/types/context/MessageComposerControllerContext.d.ts.map +1 -0
- package/dist/types/context/MessageContext.d.ts +8 -21
- package/dist/types/context/MessageContext.d.ts.map +1 -1
- package/dist/types/context/MessageListContext.d.ts +2 -2
- package/dist/types/context/MessageListContext.d.ts.map +1 -1
- package/dist/types/context/MessageTranslationViewContext.d.ts.map +1 -1
- package/dist/types/context/ModalContext.d.ts +4 -0
- package/dist/types/context/ModalContext.d.ts.map +1 -1
- package/dist/types/context/PollContext.d.ts.map +1 -1
- package/dist/types/context/TranslationContext.d.ts +21 -11
- package/dist/types/context/TranslationContext.d.ts.map +1 -1
- package/dist/types/context/VirtualizedMessageListContext.d.ts.map +1 -1
- package/dist/types/context/WithComponents.d.ts.map +1 -1
- package/dist/types/context/WorkspaceNavigationContext.d.ts +128 -0
- package/dist/types/context/WorkspaceNavigationContext.d.ts.map +1 -0
- package/dist/types/context/index.d.ts +6 -4
- package/dist/types/context/index.d.ts.map +1 -1
- package/dist/types/context/requireContext.d.ts +10 -0
- package/dist/types/context/requireContext.d.ts.map +1 -0
- package/dist/types/context/useChannel.d.ts +3 -0
- package/dist/types/context/useChannel.d.ts.map +1 -0
- package/dist/types/context/useComponentContextIcons.d.ts +4 -6
- package/dist/types/context/useComponentContextIcons.d.ts.map +1 -1
- package/dist/types/hooks/index.d.ts +3 -0
- package/dist/types/hooks/index.d.ts.map +1 -0
- package/dist/types/hooks/useIsDmChannel.d.ts +13 -0
- package/dist/types/hooks/useIsDmChannel.d.ts.map +1 -0
- package/dist/types/hooks/useMessagePaginator.d.ts +6 -0
- package/dist/types/hooks/useMessagePaginator.d.ts.map +1 -0
- package/dist/types/i18n/Streami18n.d.ts +48 -848
- package/dist/types/i18n/Streami18n.d.ts.map +1 -1
- package/dist/types/i18n/TranslationBuilder/index.d.ts +6 -1
- package/dist/types/i18n/TranslationBuilder/index.d.ts.map +1 -1
- package/dist/types/i18n/TranslationBuilder/notifications/NotificationTranslationTopic.d.ts.map +1 -1
- package/dist/types/i18n/TranslationBuilder/notifications/translators.d.ts.map +1 -1
- package/dist/types/i18n/TranslationBuilder/notifications/translatorsByNotificationType.d.ts +3 -1
- package/dist/types/i18n/TranslationBuilder/notifications/translatorsByNotificationType.d.ts.map +1 -1
- package/dist/types/i18n/index.d.ts +2 -2
- package/dist/types/i18n/index.d.ts.map +1 -1
- package/dist/types/i18n/keys.d.ts +583 -0
- package/dist/types/i18n/keys.d.ts.map +1 -0
- package/dist/types/i18n/runtimeDefaults.d.ts +37 -0
- package/dist/types/i18n/runtimeDefaults.d.ts.map +1 -0
- package/dist/types/i18n/types.d.ts +34 -104
- package/dist/types/i18n/types.d.ts.map +1 -1
- package/dist/types/i18n/useStreami18n.d.ts +19 -0
- package/dist/types/i18n/useStreami18n.d.ts.map +1 -0
- package/dist/types/i18n/utils.d.ts +18 -14
- package/dist/types/i18n/utils.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/AvatarWithChannelDetail.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/ChannelDetail.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/ChannelDetailEmptyList.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/ChannelDetailSearchInput.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/SectionNavigator/SectionNavigatorHeader.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesEmptyList.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.utils.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementActions.defaults.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementView.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaEmptyList.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.utils.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberActions.defaults.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberDetail.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersAddView.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersBrowseView.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersHeaderActions.defaults.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.utils.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesEmptyList.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesView.d.ts.map +1 -1
- package/dist/types/plugins/ChannelDetail/Views/PinnedMessagesView/usePinnedMessagesCount.d.ts +5 -1
- package/dist/types/plugins/ChannelDetail/Views/PinnedMessagesView/usePinnedMessagesCount.d.ts.map +1 -1
- package/dist/types/plugins/Emojis/EmojiPicker.d.ts +0 -4
- package/dist/types/plugins/Emojis/EmojiPicker.d.ts.map +1 -1
- package/dist/types/plugins/SlotGeometry/SlotGeometry.d.ts +72 -0
- package/dist/types/plugins/SlotGeometry/SlotGeometry.d.ts.map +1 -0
- package/dist/types/plugins/SlotGeometry/index.d.ts +3 -0
- package/dist/types/plugins/SlotGeometry/index.d.ts.map +1 -0
- package/dist/types/plugins/SlotLayout/ChannelSlot.d.ts +24 -0
- package/dist/types/plugins/SlotLayout/ChannelSlot.d.ts.map +1 -0
- package/dist/types/plugins/SlotLayout/ChatView.a11y.utility.d.ts.map +1 -0
- package/dist/types/plugins/SlotLayout/ChatView.d.ts +113 -0
- package/dist/types/plugins/SlotLayout/ChatView.d.ts.map +1 -0
- package/dist/types/plugins/SlotLayout/ChatViewNavigationContext.d.ts +111 -0
- package/dist/types/plugins/SlotLayout/ChatViewNavigationContext.d.ts.map +1 -0
- package/dist/types/plugins/SlotLayout/ThreadListSlot.d.ts +8 -0
- package/dist/types/plugins/SlotLayout/ThreadListSlot.d.ts.map +1 -0
- package/dist/types/plugins/SlotLayout/ThreadSlot.d.ts +10 -0
- package/dist/types/plugins/SlotLayout/ThreadSlot.d.ts.map +1 -0
- package/dist/types/plugins/SlotLayout/hooks/index.d.ts +3 -0
- package/dist/types/plugins/SlotLayout/hooks/index.d.ts.map +1 -0
- package/dist/types/plugins/SlotLayout/hooks/useLayoutViewState.d.ts +5 -0
- package/dist/types/plugins/SlotLayout/hooks/useLayoutViewState.d.ts.map +1 -0
- package/dist/types/plugins/SlotLayout/hooks/useSlotEntity.d.ts +162 -0
- package/dist/types/plugins/SlotLayout/hooks/useSlotEntity.d.ts.map +1 -0
- package/dist/types/plugins/SlotLayout/index.d.ts +12 -0
- package/dist/types/plugins/SlotLayout/index.d.ts.map +1 -0
- package/dist/types/plugins/SlotLayout/layout/Slot.d.ts +8 -0
- package/dist/types/plugins/SlotLayout/layout/Slot.d.ts.map +1 -0
- package/dist/types/plugins/SlotLayout/layout/WorkspaceLayout.d.ts +11 -0
- package/dist/types/plugins/SlotLayout/layout/WorkspaceLayout.d.ts.map +1 -0
- package/dist/types/plugins/SlotLayout/layoutController/LayoutController.d.ts +25 -0
- package/dist/types/plugins/SlotLayout/layoutController/LayoutController.d.ts.map +1 -0
- package/dist/types/plugins/SlotLayout/layoutController/layoutControllerTypes.d.ts +121 -0
- package/dist/types/plugins/SlotLayout/layoutController/layoutControllerTypes.d.ts.map +1 -0
- package/dist/types/plugins/SlotLayout/layoutController/serialization.d.ts +6 -0
- package/dist/types/plugins/SlotLayout/layoutController/serialization.d.ts.map +1 -0
- package/dist/types/plugins/SlotLayout/slotBinding.d.ts +85 -0
- package/dist/types/plugins/SlotLayout/slotBinding.d.ts.map +1 -0
- package/dist/types/plugins/SlotLayout/slotRegistry.d.ts +60 -0
- package/dist/types/plugins/SlotLayout/slotRegistry.d.ts.map +1 -0
- package/dist/types/plugins/SlotLayout/workspaceNavigationAdapter.d.ts +26 -0
- package/dist/types/plugins/SlotLayout/workspaceNavigationAdapter.d.ts.map +1 -0
- package/dist/types/store/hooks/useStateStore.d.ts +1 -1
- package/dist/types/store/hooks/useStateStore.d.ts.map +1 -1
- package/dist/types/types/index.d.ts +0 -1
- package/dist/types/types/index.d.ts.map +1 -1
- package/dist/types/types/types.d.ts +0 -10
- package/dist/types/types/types.d.ts.map +1 -1
- package/dist/types/utils/getChannel.d.ts +2 -2
- package/dist/types/utils/getChannel.d.ts.map +1 -1
- package/dist/types/utils/useStableCallback.d.ts +1 -1
- package/package.json +34 -16
- package/dist/cjs/NotificationList.4ce251ea.js +0 -9552
- package/dist/cjs/NotificationList.4ce251ea.js.map +0 -1
- package/dist/cjs/useChannelHeaderOnlineStatus.64c443f5.js +0 -961
- package/dist/cjs/useChannelHeaderOnlineStatus.64c443f5.js.map +0 -1
- package/dist/cjs/useInertWhenHidden.1a2a6a2b.js +0 -6573
- package/dist/cjs/useInertWhenHidden.1a2a6a2b.js.map +0 -1
- package/dist/es/components/Channel/channelState.mjs +0 -195
- package/dist/es/components/Channel/channelState.mjs.map +0 -1
- package/dist/es/components/Channel/hooks/useCreateChannelStateContext.mjs +0 -86
- package/dist/es/components/Channel/hooks/useCreateChannelStateContext.mjs.map +0 -1
- package/dist/es/components/Channel/hooks/useCreateTypingContext.mjs +0 -10
- package/dist/es/components/Channel/hooks/useCreateTypingContext.mjs.map +0 -1
- package/dist/es/components/Channel/hooks/useEditMessageHandler.mjs +0 -13
- package/dist/es/components/Channel/hooks/useEditMessageHandler.mjs.map +0 -1
- package/dist/es/components/Channel/hooks/useIsMounted.mjs +0 -16
- package/dist/es/components/Channel/hooks/useIsMounted.mjs.map +0 -1
- package/dist/es/components/Channel/hooks/useMentionsHandlers.mjs +0 -18
- package/dist/es/components/Channel/hooks/useMentionsHandlers.mjs.map +0 -1
- package/dist/es/components/Channel/utils.mjs +0 -156
- package/dist/es/components/Channel/utils.mjs.map +0 -1
- package/dist/es/components/ChannelList/ChannelListUI.mjs +0 -35
- package/dist/es/components/ChannelList/ChannelListUI.mjs.map +0 -1
- package/dist/es/components/ChannelList/hooks/useChannelListShape.mjs +0 -310
- package/dist/es/components/ChannelList/hooks/useChannelListShape.mjs.map +0 -1
- package/dist/es/components/ChannelList/hooks/useConnectionRecoveredListener.mjs +0 -19
- package/dist/es/components/ChannelList/hooks/useConnectionRecoveredListener.mjs.map +0 -1
- package/dist/es/components/ChannelList/hooks/usePaginatedChannels.mjs +0 -110
- package/dist/es/components/ChannelList/hooks/usePaginatedChannels.mjs.map +0 -1
- package/dist/es/components/ChannelList/utils.mjs +0 -86
- package/dist/es/components/ChannelList/utils.mjs.map +0 -1
- package/dist/es/components/Chat/hooks/useChannelsQueryState.mjs +0 -16
- package/dist/es/components/Chat/hooks/useChannelsQueryState.mjs.map +0 -1
- package/dist/es/components/ChatView/ChatView.a11y.utility.mjs.map +0 -1
- package/dist/es/components/ChatView/ChatView.mjs +0 -224
- package/dist/es/components/ChatView/ChatView.mjs.map +0 -1
- package/dist/es/components/MessageComposer/hooks/useSubmitHandler.mjs +0 -98
- package/dist/es/components/MessageComposer/hooks/useSubmitHandler.mjs.map +0 -1
- package/dist/es/components/MessageList/hooks/useReducedMotionPreference.mjs +0 -23
- package/dist/es/components/MessageList/hooks/useReducedMotionPreference.mjs.map +0 -1
- package/dist/es/components/Search/hooks/useSearchFocusedMessage.mjs +0 -13
- package/dist/es/components/Search/hooks/useSearchFocusedMessage.mjs.map +0 -1
- package/dist/es/components/Thread/LegacyThreadContext.mjs +0 -8
- package/dist/es/components/Thread/LegacyThreadContext.mjs.map +0 -1
- package/dist/es/components/UtilityComponents/NullComponent.mjs +0 -6
- package/dist/es/components/UtilityComponents/NullComponent.mjs.map +0 -1
- package/dist/es/components/Window/Window.mjs +0 -21
- package/dist/es/components/Window/Window.mjs.map +0 -1
- package/dist/es/context/ChannelActionContext.mjs +0 -20
- package/dist/es/context/ChannelActionContext.mjs.map +0 -1
- package/dist/es/context/ChannelStateContext.mjs +0 -24
- package/dist/es/context/ChannelStateContext.mjs.map +0 -1
- package/dist/es/context/TypingContext.mjs +0 -20
- package/dist/es/context/TypingContext.mjs.map +0 -1
- package/dist/es/i18n/TranslationBuilder/TranslationBuilder.mjs +0 -86
- package/dist/es/i18n/TranslationBuilder/TranslationBuilder.mjs.map +0 -1
- package/dist/es/i18n/de.mjs +0 -782
- package/dist/es/i18n/de.mjs.map +0 -1
- package/dist/es/i18n/en.mjs +0 -779
- package/dist/es/i18n/en.mjs.map +0 -1
- package/dist/es/i18n/es.mjs +0 -821
- package/dist/es/i18n/es.mjs.map +0 -1
- package/dist/es/i18n/fr.mjs +0 -822
- package/dist/es/i18n/fr.mjs.map +0 -1
- package/dist/es/i18n/hi.mjs +0 -786
- package/dist/es/i18n/hi.mjs.map +0 -1
- package/dist/es/i18n/it.mjs +0 -821
- package/dist/es/i18n/it.mjs.map +0 -1
- package/dist/es/i18n/ja.mjs +0 -760
- package/dist/es/i18n/ja.mjs.map +0 -1
- package/dist/es/i18n/ko.mjs +0 -760
- package/dist/es/i18n/ko.mjs.map +0 -1
- package/dist/es/i18n/nl.mjs +0 -786
- package/dist/es/i18n/nl.mjs.map +0 -1
- package/dist/es/i18n/pt.mjs +0 -819
- package/dist/es/i18n/pt.mjs.map +0 -1
- package/dist/es/i18n/ru.mjs +0 -868
- package/dist/es/i18n/ru.mjs.map +0 -1
- package/dist/es/i18n/tr.mjs +0 -781
- package/dist/es/i18n/tr.mjs.map +0 -1
- package/dist/es/utils/getChannelConfig.mjs +0 -11
- package/dist/es/utils/getChannelConfig.mjs.map +0 -1
- package/dist/types/components/Channel/channelState.d.ts +0 -90
- package/dist/types/components/Channel/channelState.d.ts.map +0 -1
- package/dist/types/components/Channel/hooks/useCreateChannelStateContext.d.ts +0 -6
- package/dist/types/components/Channel/hooks/useCreateChannelStateContext.d.ts.map +0 -1
- package/dist/types/components/Channel/hooks/useCreateTypingContext.d.ts +0 -3
- package/dist/types/components/Channel/hooks/useCreateTypingContext.d.ts.map +0 -1
- package/dist/types/components/Channel/hooks/useEditMessageHandler.d.ts +0 -5
- package/dist/types/components/Channel/hooks/useEditMessageHandler.d.ts.map +0 -1
- package/dist/types/components/Channel/hooks/useMentionsHandlers.d.ts +0 -10
- package/dist/types/components/Channel/hooks/useMentionsHandlers.d.ts.map +0 -1
- package/dist/types/components/Channel/utils.d.ts +0 -55
- package/dist/types/components/Channel/utils.d.ts.map +0 -1
- package/dist/types/components/ChannelList/ChannelListUI.d.ts +0 -18
- package/dist/types/components/ChannelList/ChannelListUI.d.ts.map +0 -1
- package/dist/types/components/ChannelList/hooks/useChannelListShape.d.ts +0 -61
- package/dist/types/components/ChannelList/hooks/useChannelListShape.d.ts.map +0 -1
- package/dist/types/components/ChannelList/hooks/useConnectionRecoveredListener.d.ts +0 -2
- package/dist/types/components/ChannelList/hooks/useConnectionRecoveredListener.d.ts.map +0 -1
- package/dist/types/components/ChannelList/hooks/usePaginatedChannels.d.ts +0 -29
- package/dist/types/components/ChannelList/hooks/usePaginatedChannels.d.ts.map +0 -1
- package/dist/types/components/ChannelList/utils.d.ts +0 -46
- package/dist/types/components/ChannelList/utils.d.ts.map +0 -1
- package/dist/types/components/Chat/hooks/useChannelsQueryState.d.ts +0 -12
- package/dist/types/components/Chat/hooks/useChannelsQueryState.d.ts.map +0 -1
- package/dist/types/components/ChatView/ChatView.a11y.utility.d.ts.map +0 -1
- package/dist/types/components/ChatView/ChatView.d.ts +0 -59
- package/dist/types/components/ChatView/ChatView.d.ts.map +0 -1
- package/dist/types/components/ChatView/index.d.ts +0 -2
- package/dist/types/components/ChatView/index.d.ts.map +0 -1
- package/dist/types/components/MessageComposer/hooks/useSubmitHandler.d.ts +0 -5
- package/dist/types/components/MessageComposer/hooks/useSubmitHandler.d.ts.map +0 -1
- package/dist/types/components/Search/hooks/useSearchFocusedMessage.d.ts +0 -2
- package/dist/types/components/Search/hooks/useSearchFocusedMessage.d.ts.map +0 -1
- package/dist/types/components/Thread/LegacyThreadContext.d.ts +0 -9
- package/dist/types/components/Thread/LegacyThreadContext.d.ts.map +0 -1
- package/dist/types/components/Window/Window.d.ts +0 -13
- package/dist/types/components/Window/Window.d.ts.map +0 -1
- package/dist/types/components/Window/index.d.ts +0 -2
- package/dist/types/components/Window/index.d.ts.map +0 -1
- package/dist/types/context/ChannelActionContext.d.ts +0 -46
- package/dist/types/context/ChannelActionContext.d.ts.map +0 -1
- package/dist/types/context/ChannelStateContext.d.ts +0 -51
- package/dist/types/context/ChannelStateContext.d.ts.map +0 -1
- package/dist/types/context/TypingContext.d.ts +0 -12
- package/dist/types/context/TypingContext.d.ts.map +0 -1
- package/dist/types/i18n/TranslationBuilder/TranslationBuilder.d.ts +0 -36
- package/dist/types/i18n/TranslationBuilder/TranslationBuilder.d.ts.map +0 -1
- package/dist/types/i18n/translations.d.ts +0 -14
- package/dist/types/i18n/translations.d.ts.map +0 -1
- package/dist/types/utils/getChannelConfig.d.ts +0 -8
- package/dist/types/utils/getChannelConfig.d.ts.map +0 -1
- /package/dist/types/{components/ChatView → plugins/SlotLayout}/ChatView.a11y.utility.d.ts +0 -0
|
@@ -5,45 +5,55 @@ import { useMemo, useRef } from "react";
|
|
|
5
5
|
//#region src/components/Accessibility/hooks/useInteractionAnnouncements.ts
|
|
6
6
|
/**
|
|
7
7
|
* One entry per interaction — the single place an interaction is registered. Each
|
|
8
|
-
* resolver contains a LITERAL `t('
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* resolver contains a LITERAL `t(key, 'English copy')` call, which is what puts the key in the
|
|
9
|
+
* catalog: `yarn build-translations` parses the call sites to generate `src/i18n/keys.ts`. Keys
|
|
10
|
+
* must never be built dynamically (e.g. `t(someVariable)`) or they are missed, and an integrator
|
|
11
|
+
* has no way to discover them. Adding an interaction = one line here + one
|
|
12
12
|
* line in {@link InteractionAnnouncementParams} (+ an override in
|
|
13
13
|
* {@link INTERACTION_PRIORITIES} only if it is not `polite`).
|
|
14
14
|
*/
|
|
15
15
|
var INTERACTION_MESSAGES = {
|
|
16
|
-
"audioPlayer.playbackRateChanged": (t, params) => t("Playback speed {{ rate }}x", { rate: params.rate }),
|
|
17
|
-
"channel.opened": (t, params) => t("
|
|
18
|
-
"command.selected": (t, params) => t("
|
|
19
|
-
"giphy.canceled": (t) => t("
|
|
20
|
-
"giphy.sent": (t) => t("
|
|
21
|
-
"giphy.shuffled": (t, params) => params.title ? t("
|
|
22
|
-
"poll.dialogOpened": (t) => `${t("
|
|
23
|
-
"poll.optionDropped": (t, params) => t("
|
|
16
|
+
"audioPlayer.playbackRateChanged": (t, params) => t("common.playbackSpeedX.label", "Playback speed {{ rate }}x", { rate: params.rate }),
|
|
17
|
+
"channel.opened": (t, params) => t("a11y.interactionAnnouncements.openedChannel.ariaLabel", "Opened channel: {{ name }}", { name: params.name }),
|
|
18
|
+
"command.selected": (t, params) => t("a11y.interactionAnnouncements.commandActivated.ariaLabel", "Command activated: {{ command }}", { command: params.command }),
|
|
19
|
+
"giphy.canceled": (t) => t("a11y.interactionAnnouncements.giphyCanceled.ariaLabel", "Giphy canceled"),
|
|
20
|
+
"giphy.sent": (t) => t("a11y.interactionAnnouncements.giphySent.ariaLabel", "Giphy sent"),
|
|
21
|
+
"giphy.shuffled": (t, params) => params.title ? t("a11y.interactionAnnouncements.giphyImageChanged.withTitle.ariaLabel", "Giphy image changed: {{ title }}", { title: params.title }) : t("a11y.interactionAnnouncements.giphyImageChanged.ariaLabel", "Giphy image changed"),
|
|
22
|
+
"poll.dialogOpened": (t) => `${t("a11y.interactionAnnouncements.pollDialogOpened.ariaLabel", "Poll dialog opened")}. ${t("common.createQuestionAddOptions.label", "Create a question, add options, and configure poll settings")}. ${t("a11y.interactionAnnouncements.pressEnterStartTyping.ariaLabel", "Press Enter to start typing")}.`,
|
|
23
|
+
"poll.optionDropped": (t, params) => t("a11y.interactionAnnouncements.droppedPosition.ariaLabel", "Dropped \"{{ option }}\" at position {{ position }}.", {
|
|
24
24
|
option: params.option,
|
|
25
25
|
position: params.position
|
|
26
26
|
}),
|
|
27
|
-
"poll.optionPickedUp": (t, params) => t("
|
|
28
|
-
"poll.optionRemoved": (t, params) => t("
|
|
29
|
-
"poll.sent": (t) => t("
|
|
30
|
-
"search.cleared": (t) => t("
|
|
27
|
+
"poll.optionPickedUp": (t, params) => t("a11y.interactionAnnouncements.pickedUpUseArrow.ariaLabel", "Picked up \"{{ option }}\". Use arrow keys to reorder. Press Space or Tab to drop.", { option: params.option }),
|
|
28
|
+
"poll.optionRemoved": (t, params) => t("a11y.interactionAnnouncements.removedOption.ariaLabel", "Removed option {{ option }}", { option: params.option }),
|
|
29
|
+
"poll.sent": (t) => t("a11y.interactionAnnouncements.pollSent.ariaLabel", "Poll sent"),
|
|
30
|
+
"search.cleared": (t) => t("a11y.interactionAnnouncements.searchCleared.ariaLabel", "Search cleared"),
|
|
31
31
|
"search.resultCount": (t, params) => {
|
|
32
|
-
if (params.count <= 0) return t("
|
|
33
|
-
const count = t("
|
|
34
|
-
|
|
32
|
+
if (params.count <= 0) return t("a11y.interactionAnnouncements.noSearchResultsFound.ariaLabel", "No search results found");
|
|
33
|
+
const count = t("a11y.interactionAnnouncements.searchResults.ariaLabel", {
|
|
34
|
+
count: params.count,
|
|
35
|
+
defaultValue_one: "{{ count }} search result",
|
|
36
|
+
defaultValue_other: "{{ count }} search results"
|
|
37
|
+
});
|
|
38
|
+
return params.allResultsLoaded ? `${count}. ${t("common.resultsLoaded.label", "All results loaded")}` : count;
|
|
35
39
|
},
|
|
36
|
-
"suggestions.count": (t, params) => params.suggestionsLabel ? t("
|
|
40
|
+
"suggestions.count": (t, params) => params.suggestionsLabel ? t("a11y.interactionAnnouncements.suggestionsWithLabel.ariaLabel", {
|
|
37
41
|
count: params.count,
|
|
42
|
+
defaultValue_one: "{{ count }} {{ suggestionsLabel }}",
|
|
43
|
+
defaultValue_other: "{{ count }} {{ suggestionsLabel }}",
|
|
38
44
|
suggestionsLabel: params.suggestionsLabel
|
|
39
|
-
}) : t("
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"voiceRecording.
|
|
45
|
+
}) : t("a11y.interactionAnnouncements.suggestions.ariaLabel", {
|
|
46
|
+
count: params.count,
|
|
47
|
+
defaultValue_one: "{{ count }} suggestion",
|
|
48
|
+
defaultValue_other: "{{ count }} suggestions"
|
|
49
|
+
}),
|
|
50
|
+
"thread.opened": (t, params) => t("a11y.interactionAnnouncements.openedThread.ariaLabel", "Opened thread in {{ name }}", { name: params.name }),
|
|
51
|
+
"user.selected": (t, params) => t("a11y.interactionAnnouncements.userSelected.ariaLabel", "User selected: {{ user }}", { user: params.user }),
|
|
52
|
+
"voiceRecording.attached": (t) => t("a11y.interactionAnnouncements.voiceRecordingAttached.ariaLabel", "Voice recording attached"),
|
|
53
|
+
"voiceRecording.paused": (t) => t("a11y.interactionAnnouncements.recordingPaused.ariaLabel", "Recording paused"),
|
|
54
|
+
"voiceRecording.resumed": (t) => t("a11y.interactionAnnouncements.recordingResumed.ariaLabel", "Recording resumed"),
|
|
55
|
+
"voiceRecording.sent": (t) => t("a11y.interactionAnnouncements.voiceMessageSent.ariaLabel", "Voice message sent"),
|
|
56
|
+
"voiceRecording.started": (t) => t("a11y.interactionAnnouncements.recordingStarted.ariaLabel", "Recording started")
|
|
47
57
|
};
|
|
48
58
|
/**
|
|
49
59
|
* Per-interaction aria-live priority. Interactions default to `polite`; list one
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInteractionAnnouncements.mjs","names":[],"sources":["../../../../../src/components/Accessibility/hooks/useInteractionAnnouncements.ts"],"sourcesContent":["import { useMemo, useRef } from 'react';\n\nimport type { AriaLivePriority } from '../useAriaLiveAnnouncer';\nimport { useAriaLiveAnnouncer } from '../useAriaLiveAnnouncer';\nimport { useDebouncedAnnounce } from '../scheduling';\nimport { useTranslationContext } from '../../../context/TranslationContext';\n\ntype TranslateFn = ReturnType<typeof useTranslationContext>['t'];\n\n/**\n * Optional delivery overrides a call site may pass ALONGSIDE an interaction's message params.\n * These are not consumed by the message resolver — they only affect how the announcement is\n * delivered. `debounceMs` overrides that interaction's default debounce ({@link\n * INTERACTION_DEBOUNCE_MS}) for THIS call, and enables debouncing for an interaction that has no\n * default. `delayMs` overrides the default delay ({@link INTERACTION_DELAY_MS}) for the\n * (non-debounced) immediate path. Param-less (discrete) interactions are always immediate and do\n * not accept overrides.\n *\n * `debounceMs` vs `delayMs`: a debounce collapses rapid repeats on a per-call-site timer and is\n * **cancelled if that call site unmounts** — right for a value that keeps changing in place (a\n * result count). `delayMs` schedules a single deferred emit in the shared announcer PROVIDER, so it\n * **survives the caller unmounting** — right for a one-shot confirmation whose origin (e.g. a list\n * row) disappears on the very action being confirmed (opening a channel/thread hides the list on\n * mobile). Both let the message land after a competing focus/typing read-out. `debounceMs` wins if\n * both are given.\n */\nexport type InteractionDeliveryOptions = { debounceMs?: number; delayMs?: number };\n\n/**\n * Parameters accepted by each parameterized interaction announcement.\n * Interactions that take no parameters map to `undefined`. Param-ful interactions additionally\n * accept {@link InteractionDeliveryOptions} (e.g. a per-call `debounceMs`).\n */\nexport type InteractionAnnouncementParams = {\n /** Audio playback speed was changed via the playback-rate button. `rate` is the new multiplier. */\n 'audioPlayer.playbackRateChanged': InteractionDeliveryOptions & { rate: number };\n /** A channel was opened from the channel list. `name` is its display title. */\n 'channel.opened': InteractionDeliveryOptions & { name: string };\n /** A slash command was activated from the Instant Commands menu. `command` is its name. */\n 'command.selected': InteractionDeliveryOptions & { command: string };\n 'giphy.canceled': undefined;\n 'giphy.sent': undefined;\n 'giphy.shuffled': InteractionDeliveryOptions & { title?: string };\n 'poll.dialogOpened': undefined;\n /** A poll option was dropped at a new position during keyboard reorder. */\n 'poll.optionDropped': InteractionDeliveryOptions & {\n option: string;\n position: number;\n };\n /** A poll option was picked up to start a keyboard reorder. `option` is its text (or a fallback). */\n 'poll.optionPickedUp': InteractionDeliveryOptions & { option: string };\n 'poll.optionRemoved': InteractionDeliveryOptions & { option: string };\n 'poll.sent': undefined;\n 'search.cleared': undefined;\n 'search.resultCount': InteractionDeliveryOptions & {\n /** Whether every active source is fully loaded — appends an \"all results loaded\" clause. */\n allResultsLoaded?: boolean;\n count: number;\n };\n 'suggestions.count': InteractionDeliveryOptions & {\n count: number;\n suggestionsLabel?: string;\n };\n /** A thread was opened from the thread list. `name` is its channel's display title. */\n 'thread.opened': InteractionDeliveryOptions & { name: string };\n 'user.selected': InteractionDeliveryOptions & { user: string };\n /** A finished voice recording was added to the composer (async multi-send: not sent yet). */\n 'voiceRecording.attached': undefined;\n 'voiceRecording.paused': undefined;\n 'voiceRecording.resumed': undefined;\n /** A finished voice recording was sent immediately as a message. */\n 'voiceRecording.sent': undefined;\n 'voiceRecording.started': undefined;\n};\n\nexport type InteractionAnnouncementType = keyof InteractionAnnouncementParams;\n\n/**\n * One entry per interaction — the single place an interaction is registered. Each\n * resolver contains a LITERAL `t('aria/…')` call so that `i18next-cli extract`\n * (run via `yarn build-translations`) discovers and generates the key across all\n * locales. Keys must never be built dynamically (e.g. `t(someVariable)`) or\n * extraction silently misses them. Adding an interaction = one line here + one\n * line in {@link InteractionAnnouncementParams} (+ an override in\n * {@link INTERACTION_PRIORITIES} only if it is not `polite`).\n */\nconst INTERACTION_MESSAGES: {\n [T in InteractionAnnouncementType]: (\n t: TranslateFn,\n params: InteractionAnnouncementParams[T],\n ) => string;\n} = {\n // Confirms the new audio playback speed after the user cycles it with the playback-rate button.\n // Reuses the existing (already-localized) button label so the spoken text matches the control.\n 'audioPlayer.playbackRateChanged': (t, params) =>\n t('Playback speed {{ rate }}x', { rate: params.rate }),\n // Confirms which channel was opened after selecting it from the list. Delayed (see\n // INTERACTION_DELAY_MS) so it lands AFTER the screen reader's announcement of the newly-focused\n // element (the message composer auto-focuses on channel change) rather than competing with — and\n // being superseded by — that native focus read-out. A provider-managed delay (not a per-row\n // debounce) so it still fires when selecting the channel unmounts the list (mobile).\n 'channel.opened': (t, params) =>\n t('aria/Opened channel: {{ name }}', { name: params.name }),\n // Confirms which slash command was activated after picking it from the Instant Commands menu.\n // Delayed (INTERACTION_DELAY_MS) for the same reason as the \"opened\" confirmations: selecting a\n // command closes the menu and focuses the composer textarea (whose name changes, e.g. to\n // \"Search GIFs\"), so the screen reader reads that focus first — this lands after it. A provider\n // delay (not a debounce) because the menu that fired it unmounts on selection.\n 'command.selected': (t, params) =>\n t('aria/Command activated: {{ command }}', { command: params.command }),\n 'giphy.canceled': (t) => t('aria/Giphy canceled'),\n 'giphy.sent': (t) => t('aria/Giphy sent'),\n // Giphy payloads rarely carry a human title, so include it only when present; otherwise a\n // generic \"changed\" confirmation. Both literal keys are extracted by i18next-cli.\n 'giphy.shuffled': (t, params) =>\n params.title\n ? t('aria/Giphy image changed: {{ title }}', { title: params.title })\n : t('aria/Giphy image changed'),\n // Spoken on poll-dialog open. Reuses the already-localized visible description for the middle\n // clause (so the spoken and visible text stay consistent) and adds two short aria-only phrases:\n // an explicit \"opened\" confirmation and the Enter affordance to step into the Question field.\n 'poll.dialogOpened': (t) =>\n `${t('aria/Poll dialog opened')}. ${t(\n 'Create a question, add options, and configure poll settings',\n )}. ${t('aria/Press Enter to start typing')}.`,\n // Keyboard reorder pickup/drop. Assertive (see INTERACTION_PRIORITIES) — immediate drag feedback\n // that must not be queued behind other polite messages.\n 'poll.optionDropped': (t, params) =>\n t('aria/Dropped \"{{ option }}\" at position {{ position }}.', {\n option: params.option,\n position: params.position,\n }),\n 'poll.optionPickedUp': (t, params) =>\n t(\n 'aria/Picked up \"{{ option }}\". Use arrow keys to reorder. Press Space or Tab to drop.',\n { option: params.option },\n ),\n // Confirms a poll option was removed, naming it by its text (or positional fallback). Polite so it\n // queues behind the focus move to the next option field instead of interrupting it.\n 'poll.optionRemoved': (t, params) =>\n t('aria/Removed option {{ option }}', { option: params.option }),\n 'poll.sent': (t) => t('aria/Poll sent'),\n 'search.cleared': (t) => t('aria/Search cleared'),\n // The number of items currently listed in the search results; an empty result set is spelled out\n // rather than announced as \"0\". When the list is fully loaded, the end-of-list status is folded\n // into THIS one announcement (reusing the visible footer's \"All results loaded\" text) instead of a\n // competing second live-region message that would supersede the count.\n 'search.resultCount': (t, params) => {\n if (params.count <= 0) return t('aria/No search results found');\n const count = t('aria/{{ count }} search results', { count: params.count });\n return params.allResultsLoaded ? `${count}. ${t('All results loaded')}` : count;\n },\n // Name the suggestion type by reusing the already-localized list label (\"5 Command\n // Suggestions\") so the user knows what the results are; fall back to the bare count when no\n // label is given. Both literal keys are extracted.\n 'suggestions.count': (t, params) =>\n params.suggestionsLabel\n ? t('aria/{{ count }} {{ suggestionsLabel }}', {\n count: params.count,\n suggestionsLabel: params.suggestionsLabel,\n })\n : t('aria/{{ count }} suggestions', { count: params.count }),\n // Confirms which thread was opened after selecting it from the list; `name` is the thread's\n // channel display title. Delayed for the same reason as `channel.opened` (the thread composer\n // auto-focuses on open, and its focus announcement would otherwise supersede this one).\n 'thread.opened': (t, params) =>\n t('aria/Opened thread in {{ name }}', { name: params.name }),\n 'user.selected': (t, params) =>\n t('aria/User selected: {{ user }}', { user: params.user }),\n // Voice recorder lifecycle — discrete, immediate, polite confirmations. Cancellation is NOT here:\n // it already emits an app notification (\"Voice message deleted\") announced by NotificationAnnouncer,\n // and recording errors surface as error notifications; adding them here would double-announce.\n 'voiceRecording.attached': (t) => t('aria/Voice recording attached'),\n 'voiceRecording.paused': (t) => t('aria/Recording paused'),\n 'voiceRecording.resumed': (t) => t('aria/Recording resumed'),\n 'voiceRecording.sent': (t) => t('aria/Voice message sent'),\n 'voiceRecording.started': (t) => t('aria/Recording started'),\n};\n\n/**\n * Per-interaction aria-live priority. Interactions default to `polite`; list one\n * here only to override it (e.g. with `assertive`).\n */\nconst INTERACTION_PRIORITIES: Partial<\n Record<InteractionAnnouncementType, AriaLivePriority>\n> = {\n // Assertive on open: a polite update fired around the dialog's focus-entry announcement is\n // dropped; assertive interrupts and is spoken (VoiceOver demotes the aria-describedby hint).\n 'poll.dialogOpened': 'assertive',\n // Keyboard reorder feedback must be immediate (interrupt), not queued behind polite messages.\n 'poll.optionDropped': 'assertive',\n 'poll.optionPickedUp': 'assertive',\n};\n\n/**\n * Per-interaction dedupe window (ms): an identical message for this interaction is announced at\n * most once per window (see {@link AriaLiveAnnounceOptions.dedupeMs}). List an interaction here\n * only when the SAME open/mount can fire it more than once in quick succession — e.g. a mount\n * effect double-invoked by React StrictMode (dev) — so the user does not hear a duplicate.\n */\nconst INTERACTION_DEDUPE_MS: Partial<Record<InteractionAnnouncementType, number>> = {\n // The audio player is pooled: if the same asset is rendered by two widgets they share one player,\n // so a single rate change fires this from both consumers. Dedupe collapses the identical message.\n // (Cycling always lands on a different rate → different text, so this never swallows a real change.)\n 'audioPlayer.playbackRateChanged': 300,\n 'poll.dialogOpened': 1000,\n};\n\n/**\n * Default per-interaction debounce delay (ms). Only list rapidly-updating streams where just the\n * settled value should be read (e.g. the autocomplete count as the query filters). Discrete\n * confirmations (Giphy/Poll sent, user selected) are NOT listed and announce immediately. A call\n * site can override (or opt into) a delay for a single call via `params.debounceMs` — see\n * {@link InteractionDeliveryOptions}.\n *\n * `suggestions.count` is a CONSEQUENCE OF TYPING, so the delay does double duty: it coalesces\n * rapid filters into the settled value AND lets the screen reader's per-keystroke typing echo\n * (the spoken character + field re-read) finish first. A polite update that lands mid-echo gets\n * queued behind a long re-read and is perceived as buried; waiting past the echo makes the count\n * the next thing spoken once the user pauses. This is a heuristic — echo length varies with the\n * SR's \"speak typed words/characters\" setting and field content — so tune if it still collides.\n */\nconst INTERACTION_DEBOUNCE_MS: Partial<Record<InteractionAnnouncementType, number>> = {\n // Coalesce the result count as the query filters / results stream in, and let the screen reader's\n // typing echo finish first (same rationale as `suggestions.count`, slightly longer as search\n // results can arrive over the network in bursts). The end-of-list status rides along in this same\n // message (see `search.resultCount` resolver), so there is no second announcement to compete.\n 'search.resultCount': 1000,\n 'suggestions.count': 500,\n};\n\n/**\n * Default per-interaction delay (ms) for the immediate (non-debounced) path — a single deferred\n * emit scheduled in the announcer PROVIDER (see {@link AriaLiveAnnounceOptions.delayMs}), so it\n * SURVIVES the calling component unmounting (unlike a debounce, whose timer is cleared on unmount).\n *\n * Opening a channel/thread moves focus to the (auto-focusing) message composer; the screen reader\n * announces that newly-focused element first, and a live-region message emitted alongside it is\n * superseded and dropped. The delay defers the confirmation past that focus read-out so it is spoken\n * next, in a calm moment. It is a provider delay rather than a debounce specifically because\n * selecting the item can unmount its list row (and the whole list, on mobile) — a per-row debounce\n * would be cancelled mid-flight, swallowing the confirmation.\n */\nconst INTERACTION_DELAY_MS: Partial<Record<InteractionAnnouncementType, number>> = {\n 'channel.opened': 1500,\n 'command.selected': 1500,\n 'thread.opened': 1500,\n};\n\n// Overloads enforce that parameterized interactions require their params and that\n// param-less interactions reject extra arguments.\ntype AnnounceInteraction = {\n <T extends InteractionAnnouncementType>(\n interaction: InteractionAnnouncementParams[T] extends undefined ? T : never,\n ): void;\n <T extends InteractionAnnouncementType>(\n interaction: InteractionAnnouncementParams[T] extends undefined ? never : T,\n params: InteractionAnnouncementParams[T],\n ): void;\n};\n\nexport type UseInteractionAnnouncementsValue = {\n /**\n * Announce a predefined interaction event to assistive technology. The\n * interaction name maps to a localized message and a baked-in aria-live\n * priority.\n */\n announceInteraction: AnnounceInteraction;\n /**\n * Cancel pending (debounced, not-yet-spoken) announcements: a single `interaction`, or all when\n * omitted. Call this when the source of a debounced announcement is torn down (e.g. search exited)\n * so a queued message is not spoken after its context is gone. An announcement already emitted into\n * the live region cannot be recalled.\n */\n cancelInteraction: (interaction?: InteractionAnnouncementType) => void;\n};\n\n/**\n * Thin, typed wrapper over the aria-live announcer exposing intention-revealing\n * helpers for transient, user-initiated UI interactions (e.g. a Giphy being\n * sent, a poll being created, a mention being picked). They map to i18n keys with\n * baked-in priorities and reuse the existing live region via\n * {@link useAriaLiveAnnouncer}. New interactions are registered as a single entry\n * in {@link INTERACTION_MESSAGES}.\n */\nexport const useInteractionAnnouncements = (): UseInteractionAnnouncementsValue => {\n const announce = useAriaLiveAnnouncer();\n const { t } = useTranslationContext();\n // Per-interaction debounce: each type has its own timer + delay from INTERACTION_DEBOUNCE_MS,\n // so e.g. the typing-driven `suggestions.count` can wait longer (to clear the screen reader's\n // typing echo) without affecting any other debounced interaction.\n const { announce: announceDebounced, cancel: cancelDebounced } =\n useDebouncedAnnounce(announce);\n // Cancel fn of the still-pending provider-delayed emit per interaction. A second trigger of the\n // same interaction within its delay window supersedes the first (so only the latest is spoken).\n // NOT cleared on unmount on purpose — provider-delayed emits are designed to survive the caller\n // unmounting (e.g. channel.opened fires after its list row is gone).\n const pendingImmediateCancelsRef = useRef<\n Partial<Record<InteractionAnnouncementType, () => void>>\n >({});\n\n return useMemo(\n () => ({\n announceInteraction: (\n interaction: InteractionAnnouncementType,\n params?: InteractionAnnouncementParams[InteractionAnnouncementType],\n ) => {\n const resolveMessage = INTERACTION_MESSAGES[interaction] as (\n t: TranslateFn,\n params: InteractionAnnouncementParams[InteractionAnnouncementType],\n ) => string;\n\n if (!resolveMessage) return;\n\n const message = resolveMessage(t, params as never);\n const priority = INTERACTION_PRIORITIES[interaction] ?? 'polite';\n\n // A per-call `params.debounceMs` overrides the registered default (and can opt an\n // otherwise-immediate interaction into debouncing).\n const debounceMs =\n (params as InteractionDeliveryOptions | undefined)?.debounceMs ??\n INTERACTION_DEBOUNCE_MS[interaction];\n if (debounceMs === undefined) {\n // Immediate path. `delayMs` (if any) is a provider-managed deferral that survives this\n // call site unmounting — used by the \"opened\" confirmations, whose list row disappears on\n // selection. `debounceMs` takes precedence over `delayMs` when both are set.\n const delayMs =\n (params as InteractionDeliveryOptions | undefined)?.delayMs ??\n INTERACTION_DELAY_MS[interaction];\n // Supersede a still-pending delayed emit of the same interaction so a rapid re-trigger\n // (e.g. selecting a second channel within the 1500ms window) speaks only the latest.\n pendingImmediateCancelsRef.current[interaction]?.();\n pendingImmediateCancelsRef.current[interaction] = announce(message, {\n dedupeMs: INTERACTION_DEDUPE_MS[interaction],\n delayMs,\n priority,\n });\n return;\n }\n\n // Debounced stream (e.g. suggestions.count): coalesce rapid updates into the settled\n // value, on a channel keyed by interaction type with that type's own delay. We do NOT\n // dedupe an unchanged message here — whether a repeat is meaningful is the caller's call\n // (e.g. SuggestionList re-announces the count on each genuine re-filter so the user gets\n // feedback even when the count is steady, such as emoji results capped at a constant N).\n // The debounce window already collapses idle/rapid duplicates.\n announceDebounced(interaction, message, debounceMs, priority);\n },\n cancelInteraction: (interaction?: InteractionAnnouncementType) => {\n cancelDebounced(interaction);\n const pending = pendingImmediateCancelsRef.current;\n if (interaction) {\n pending[interaction]?.();\n delete pending[interaction];\n } else {\n Object.values(pending).forEach((cancel) => cancel?.());\n pendingImmediateCancelsRef.current = {};\n }\n },\n }),\n [announce, announceDebounced, cancelDebounced, t],\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useInteractionAnnouncements.mjs","names":[],"sources":["../../../../../src/components/Accessibility/hooks/useInteractionAnnouncements.ts"],"sourcesContent":["import { useMemo, useRef } from 'react';\n\nimport type { AriaLivePriority } from '../useAriaLiveAnnouncer';\nimport { useAriaLiveAnnouncer } from '../useAriaLiveAnnouncer';\nimport { useDebouncedAnnounce } from '../scheduling';\nimport { useTranslationContext } from '../../../context/TranslationContext';\n\ntype TranslateFn = ReturnType<typeof useTranslationContext>['t'];\n\n/**\n * Optional delivery overrides a call site may pass ALONGSIDE an interaction's message params.\n * These are not consumed by the message resolver — they only affect how the announcement is\n * delivered. `debounceMs` overrides that interaction's default debounce ({@link\n * INTERACTION_DEBOUNCE_MS}) for THIS call, and enables debouncing for an interaction that has no\n * default. `delayMs` overrides the default delay ({@link INTERACTION_DELAY_MS}) for the\n * (non-debounced) immediate path. Param-less (discrete) interactions are always immediate and do\n * not accept overrides.\n *\n * `debounceMs` vs `delayMs`: a debounce collapses rapid repeats on a per-call-site timer and is\n * **cancelled if that call site unmounts** — right for a value that keeps changing in place (a\n * result count). `delayMs` schedules a single deferred emit in the shared announcer PROVIDER, so it\n * **survives the caller unmounting** — right for a one-shot confirmation whose origin (e.g. a list\n * row) disappears on the very action being confirmed (opening a channel/thread hides the list on\n * mobile). Both let the message land after a competing focus/typing read-out. `debounceMs` wins if\n * both are given.\n */\nexport type InteractionDeliveryOptions = { debounceMs?: number; delayMs?: number };\n\n/**\n * Parameters accepted by each parameterized interaction announcement.\n * Interactions that take no parameters map to `undefined`. Param-ful interactions additionally\n * accept {@link InteractionDeliveryOptions} (e.g. a per-call `debounceMs`).\n */\nexport type InteractionAnnouncementParams = {\n /** Audio playback speed was changed via the playback-rate button. `rate` is the new multiplier. */\n 'audioPlayer.playbackRateChanged': InteractionDeliveryOptions & { rate: number };\n /** A channel was opened from the channel list. `name` is its display title. */\n 'channel.opened': InteractionDeliveryOptions & { name: string };\n /** A slash command was activated from the Instant Commands menu. `command` is its name. */\n 'command.selected': InteractionDeliveryOptions & { command: string };\n 'giphy.canceled': undefined;\n 'giphy.sent': undefined;\n 'giphy.shuffled': InteractionDeliveryOptions & { title?: string };\n 'poll.dialogOpened': undefined;\n /** A poll option was dropped at a new position during keyboard reorder. */\n 'poll.optionDropped': InteractionDeliveryOptions & {\n option: string;\n position: number;\n };\n /** A poll option was picked up to start a keyboard reorder. `option` is its text (or a fallback). */\n 'poll.optionPickedUp': InteractionDeliveryOptions & { option: string };\n 'poll.optionRemoved': InteractionDeliveryOptions & { option: string };\n 'poll.sent': undefined;\n 'search.cleared': undefined;\n 'search.resultCount': InteractionDeliveryOptions & {\n /** Whether every active source is fully loaded — appends an \"all results loaded\" clause. */\n allResultsLoaded?: boolean;\n count: number;\n };\n 'suggestions.count': InteractionDeliveryOptions & {\n count: number;\n suggestionsLabel?: string;\n };\n /** A thread was opened from the thread list. `name` is its channel's display title. */\n 'thread.opened': InteractionDeliveryOptions & { name: string };\n 'user.selected': InteractionDeliveryOptions & { user: string };\n /** A finished voice recording was added to the composer (async multi-send: not sent yet). */\n 'voiceRecording.attached': undefined;\n 'voiceRecording.paused': undefined;\n 'voiceRecording.resumed': undefined;\n /** A finished voice recording was sent immediately as a message. */\n 'voiceRecording.sent': undefined;\n 'voiceRecording.started': undefined;\n};\n\nexport type InteractionAnnouncementType = keyof InteractionAnnouncementParams;\n\n/**\n * One entry per interaction — the single place an interaction is registered. Each\n * resolver contains a LITERAL `t(key, 'English copy')` call, which is what puts the key in the\n * catalog: `yarn build-translations` parses the call sites to generate `src/i18n/keys.ts`. Keys\n * must never be built dynamically (e.g. `t(someVariable)`) or they are missed, and an integrator\n * has no way to discover them. Adding an interaction = one line here + one\n * line in {@link InteractionAnnouncementParams} (+ an override in\n * {@link INTERACTION_PRIORITIES} only if it is not `polite`).\n */\nconst INTERACTION_MESSAGES: {\n [T in InteractionAnnouncementType]: (\n t: TranslateFn,\n params: InteractionAnnouncementParams[T],\n ) => string;\n} = {\n // Confirms the new audio playback speed after the user cycles it with the playback-rate button.\n // Reuses the existing (already-localized) button label so the spoken text matches the control.\n 'audioPlayer.playbackRateChanged': (t, params) =>\n t('common.playbackSpeedX.label', 'Playback speed {{ rate }}x', { rate: params.rate }),\n // Confirms which channel was opened after selecting it from the list. Delayed (see\n // INTERACTION_DELAY_MS) so it lands AFTER the screen reader's announcement of the newly-focused\n // element (the message composer auto-focuses on channel change) rather than competing with — and\n // being superseded by — that native focus read-out. A provider-managed delay (not a per-row\n // debounce) so it still fires when selecting the channel unmounts the list (mobile).\n 'channel.opened': (t, params) =>\n t(\n 'a11y.interactionAnnouncements.openedChannel.ariaLabel',\n 'Opened channel: {{ name }}',\n { name: params.name },\n ),\n // Confirms which slash command was activated after picking it from the Instant Commands menu.\n // Delayed (INTERACTION_DELAY_MS) for the same reason as the \"opened\" confirmations: selecting a\n // command closes the menu and focuses the composer textarea (whose name changes, e.g. to\n // \"Search GIFs\"), so the screen reader reads that focus first — this lands after it. A provider\n // delay (not a debounce) because the menu that fired it unmounts on selection.\n 'command.selected': (t, params) =>\n t(\n 'a11y.interactionAnnouncements.commandActivated.ariaLabel',\n 'Command activated: {{ command }}',\n { command: params.command },\n ),\n 'giphy.canceled': (t) =>\n t('a11y.interactionAnnouncements.giphyCanceled.ariaLabel', 'Giphy canceled'),\n 'giphy.sent': (t) =>\n t('a11y.interactionAnnouncements.giphySent.ariaLabel', 'Giphy sent'),\n // Giphy payloads rarely carry a human title, so include it only when present; otherwise a\n // generic \"changed\" confirmation. Both literal keys land in the catalog.\n 'giphy.shuffled': (t, params) =>\n params.title\n ? t(\n 'a11y.interactionAnnouncements.giphyImageChanged.withTitle.ariaLabel',\n 'Giphy image changed: {{ title }}',\n { title: params.title },\n )\n : t(\n 'a11y.interactionAnnouncements.giphyImageChanged.ariaLabel',\n 'Giphy image changed',\n ),\n // Spoken on poll-dialog open. Reuses the already-localized visible description for the middle\n // clause (so the spoken and visible text stay consistent) and adds two short aria-only phrases:\n // an explicit \"opened\" confirmation and the Enter affordance to step into the Question field.\n 'poll.dialogOpened': (t) =>\n `${t('a11y.interactionAnnouncements.pollDialogOpened.ariaLabel', 'Poll dialog opened')}. ${t(\n 'common.createQuestionAddOptions.label',\n 'Create a question, add options, and configure poll settings',\n )}. ${t('a11y.interactionAnnouncements.pressEnterStartTyping.ariaLabel', 'Press Enter to start typing')}.`,\n // Keyboard reorder pickup/drop. Assertive (see INTERACTION_PRIORITIES) — immediate drag feedback\n // that must not be queued behind other polite messages.\n 'poll.optionDropped': (t, params) =>\n t(\n 'a11y.interactionAnnouncements.droppedPosition.ariaLabel',\n 'Dropped \"{{ option }}\" at position {{ position }}.',\n {\n option: params.option,\n position: params.position,\n },\n ),\n 'poll.optionPickedUp': (t, params) =>\n t(\n 'a11y.interactionAnnouncements.pickedUpUseArrow.ariaLabel',\n 'Picked up \"{{ option }}\". Use arrow keys to reorder. Press Space or Tab to drop.',\n { option: params.option },\n ),\n // Confirms a poll option was removed, naming it by its text (or positional fallback). Polite so it\n // queues behind the focus move to the next option field instead of interrupting it.\n 'poll.optionRemoved': (t, params) =>\n t(\n 'a11y.interactionAnnouncements.removedOption.ariaLabel',\n 'Removed option {{ option }}',\n { option: params.option },\n ),\n 'poll.sent': (t) => t('a11y.interactionAnnouncements.pollSent.ariaLabel', 'Poll sent'),\n 'search.cleared': (t) =>\n t('a11y.interactionAnnouncements.searchCleared.ariaLabel', 'Search cleared'),\n // The number of items currently listed in the search results; an empty result set is spelled out\n // rather than announced as \"0\". When the list is fully loaded, the end-of-list status is folded\n // into THIS one announcement (reusing the visible footer's \"All results loaded\" text) instead of a\n // competing second live-region message that would supersede the count.\n 'search.resultCount': (t, params) => {\n if (params.count <= 0)\n return t(\n 'a11y.interactionAnnouncements.noSearchResultsFound.ariaLabel',\n 'No search results found',\n );\n const count = t('a11y.interactionAnnouncements.searchResults.ariaLabel', {\n count: params.count,\n defaultValue_one: '{{ count }} search result',\n defaultValue_other: '{{ count }} search results',\n });\n return params.allResultsLoaded\n ? `${count}. ${t('common.resultsLoaded.label', 'All results loaded')}`\n : count;\n },\n // Name the suggestion type by reusing the already-localized list label (\"5 Command\n // Suggestions\") so the user knows what the results are; fall back to the bare count when no\n // label is given. Both literal keys are extracted.\n 'suggestions.count': (t, params) =>\n params.suggestionsLabel\n ? t('a11y.interactionAnnouncements.suggestionsWithLabel.ariaLabel', {\n count: params.count,\n defaultValue_one: '{{ count }} {{ suggestionsLabel }}',\n defaultValue_other: '{{ count }} {{ suggestionsLabel }}',\n suggestionsLabel: params.suggestionsLabel,\n })\n : t('a11y.interactionAnnouncements.suggestions.ariaLabel', {\n count: params.count,\n defaultValue_one: '{{ count }} suggestion',\n defaultValue_other: '{{ count }} suggestions',\n }),\n // Confirms which thread was opened after selecting it from the list; `name` is the thread's\n // channel display title. Delayed for the same reason as `channel.opened` (the thread composer\n // auto-focuses on open, and its focus announcement would otherwise supersede this one).\n 'thread.opened': (t, params) =>\n t(\n 'a11y.interactionAnnouncements.openedThread.ariaLabel',\n 'Opened thread in {{ name }}',\n { name: params.name },\n ),\n 'user.selected': (t, params) =>\n t(\n 'a11y.interactionAnnouncements.userSelected.ariaLabel',\n 'User selected: {{ user }}',\n { user: params.user },\n ),\n // Voice recorder lifecycle — discrete, immediate, polite confirmations. Cancellation is NOT here:\n // it already emits an app notification (\"Voice message deleted\") announced by NotificationAnnouncer,\n // and recording errors surface as error notifications; adding them here would double-announce.\n 'voiceRecording.attached': (t) =>\n t(\n 'a11y.interactionAnnouncements.voiceRecordingAttached.ariaLabel',\n 'Voice recording attached',\n ),\n 'voiceRecording.paused': (t) =>\n t('a11y.interactionAnnouncements.recordingPaused.ariaLabel', 'Recording paused'),\n 'voiceRecording.resumed': (t) =>\n t('a11y.interactionAnnouncements.recordingResumed.ariaLabel', 'Recording resumed'),\n 'voiceRecording.sent': (t) =>\n t('a11y.interactionAnnouncements.voiceMessageSent.ariaLabel', 'Voice message sent'),\n 'voiceRecording.started': (t) =>\n t('a11y.interactionAnnouncements.recordingStarted.ariaLabel', 'Recording started'),\n};\n\n/**\n * Per-interaction aria-live priority. Interactions default to `polite`; list one\n * here only to override it (e.g. with `assertive`).\n */\nconst INTERACTION_PRIORITIES: Partial<\n Record<InteractionAnnouncementType, AriaLivePriority>\n> = {\n // Assertive on open: a polite update fired around the dialog's focus-entry announcement is\n // dropped; assertive interrupts and is spoken (VoiceOver demotes the aria-describedby hint).\n 'poll.dialogOpened': 'assertive',\n // Keyboard reorder feedback must be immediate (interrupt), not queued behind polite messages.\n 'poll.optionDropped': 'assertive',\n 'poll.optionPickedUp': 'assertive',\n};\n\n/**\n * Per-interaction dedupe window (ms): an identical message for this interaction is announced at\n * most once per window (see {@link AriaLiveAnnounceOptions.dedupeMs}). List an interaction here\n * only when the SAME open/mount can fire it more than once in quick succession — e.g. a mount\n * effect double-invoked by React StrictMode (dev) — so the user does not hear a duplicate.\n */\nconst INTERACTION_DEDUPE_MS: Partial<Record<InteractionAnnouncementType, number>> = {\n // The audio player is pooled: if the same asset is rendered by two widgets they share one player,\n // so a single rate change fires this from both consumers. Dedupe collapses the identical message.\n // (Cycling always lands on a different rate → different text, so this never swallows a real change.)\n 'audioPlayer.playbackRateChanged': 300,\n 'poll.dialogOpened': 1000,\n};\n\n/**\n * Default per-interaction debounce delay (ms). Only list rapidly-updating streams where just the\n * settled value should be read (e.g. the autocomplete count as the query filters). Discrete\n * confirmations (Giphy/Poll sent, user selected) are NOT listed and announce immediately. A call\n * site can override (or opt into) a delay for a single call via `params.debounceMs` — see\n * {@link InteractionDeliveryOptions}.\n *\n * `suggestions.count` is a CONSEQUENCE OF TYPING, so the delay does double duty: it coalesces\n * rapid filters into the settled value AND lets the screen reader's per-keystroke typing echo\n * (the spoken character + field re-read) finish first. A polite update that lands mid-echo gets\n * queued behind a long re-read and is perceived as buried; waiting past the echo makes the count\n * the next thing spoken once the user pauses. This is a heuristic — echo length varies with the\n * SR's \"speak typed words/characters\" setting and field content — so tune if it still collides.\n */\nconst INTERACTION_DEBOUNCE_MS: Partial<Record<InteractionAnnouncementType, number>> = {\n // Coalesce the result count as the query filters / results stream in, and let the screen reader's\n // typing echo finish first (same rationale as `suggestions.count`, slightly longer as search\n // results can arrive over the network in bursts). The end-of-list status rides along in this same\n // message (see `search.resultCount` resolver), so there is no second announcement to compete.\n 'search.resultCount': 1000,\n 'suggestions.count': 500,\n};\n\n/**\n * Default per-interaction delay (ms) for the immediate (non-debounced) path — a single deferred\n * emit scheduled in the announcer PROVIDER (see {@link AriaLiveAnnounceOptions.delayMs}), so it\n * SURVIVES the calling component unmounting (unlike a debounce, whose timer is cleared on unmount).\n *\n * Opening a channel/thread moves focus to the (auto-focusing) message composer; the screen reader\n * announces that newly-focused element first, and a live-region message emitted alongside it is\n * superseded and dropped. The delay defers the confirmation past that focus read-out so it is spoken\n * next, in a calm moment. It is a provider delay rather than a debounce specifically because\n * selecting the item can unmount its list row (and the whole list, on mobile) — a per-row debounce\n * would be cancelled mid-flight, swallowing the confirmation.\n */\nconst INTERACTION_DELAY_MS: Partial<Record<InteractionAnnouncementType, number>> = {\n 'channel.opened': 1500,\n 'command.selected': 1500,\n 'thread.opened': 1500,\n};\n\n// Overloads enforce that parameterized interactions require their params and that\n// param-less interactions reject extra arguments.\ntype AnnounceInteraction = {\n <T extends InteractionAnnouncementType>(\n interaction: InteractionAnnouncementParams[T] extends undefined ? T : never,\n ): void;\n <T extends InteractionAnnouncementType>(\n interaction: InteractionAnnouncementParams[T] extends undefined ? never : T,\n params: InteractionAnnouncementParams[T],\n ): void;\n};\n\nexport type UseInteractionAnnouncementsValue = {\n /**\n * Announce a predefined interaction event to assistive technology. The\n * interaction name maps to a localized message and a baked-in aria-live\n * priority.\n */\n announceInteraction: AnnounceInteraction;\n /**\n * Cancel pending (debounced, not-yet-spoken) announcements: a single `interaction`, or all when\n * omitted. Call this when the source of a debounced announcement is torn down (e.g. search exited)\n * so a queued message is not spoken after its context is gone. An announcement already emitted into\n * the live region cannot be recalled.\n */\n cancelInteraction: (interaction?: InteractionAnnouncementType) => void;\n};\n\n/**\n * Thin, typed wrapper over the aria-live announcer exposing intention-revealing\n * helpers for transient, user-initiated UI interactions (e.g. a Giphy being\n * sent, a poll being created, a mention being picked). They map to i18n keys with\n * baked-in priorities and reuse the existing live region via\n * {@link useAriaLiveAnnouncer}. New interactions are registered as a single entry\n * in {@link INTERACTION_MESSAGES}.\n */\nexport const useInteractionAnnouncements = (): UseInteractionAnnouncementsValue => {\n const announce = useAriaLiveAnnouncer();\n const { t } = useTranslationContext();\n // Per-interaction debounce: each type has its own timer + delay from INTERACTION_DEBOUNCE_MS,\n // so e.g. the typing-driven `suggestions.count` can wait longer (to clear the screen reader's\n // typing echo) without affecting any other debounced interaction.\n const { announce: announceDebounced, cancel: cancelDebounced } =\n useDebouncedAnnounce(announce);\n // Cancel fn of the still-pending provider-delayed emit per interaction. A second trigger of the\n // same interaction within its delay window supersedes the first (so only the latest is spoken).\n // NOT cleared on unmount on purpose — provider-delayed emits are designed to survive the caller\n // unmounting (e.g. channel.opened fires after its list row is gone).\n const pendingImmediateCancelsRef = useRef<\n Partial<Record<InteractionAnnouncementType, () => void>>\n >({});\n\n return useMemo(\n () => ({\n announceInteraction: (\n interaction: InteractionAnnouncementType,\n params?: InteractionAnnouncementParams[InteractionAnnouncementType],\n ) => {\n const resolveMessage = INTERACTION_MESSAGES[interaction] as (\n t: TranslateFn,\n params: InteractionAnnouncementParams[InteractionAnnouncementType],\n ) => string;\n\n if (!resolveMessage) return;\n\n const message = resolveMessage(t, params as never);\n const priority = INTERACTION_PRIORITIES[interaction] ?? 'polite';\n\n // A per-call `params.debounceMs` overrides the registered default (and can opt an\n // otherwise-immediate interaction into debouncing).\n const debounceMs =\n (params as InteractionDeliveryOptions | undefined)?.debounceMs ??\n INTERACTION_DEBOUNCE_MS[interaction];\n if (debounceMs === undefined) {\n // Immediate path. `delayMs` (if any) is a provider-managed deferral that survives this\n // call site unmounting — used by the \"opened\" confirmations, whose list row disappears on\n // selection. `debounceMs` takes precedence over `delayMs` when both are set.\n const delayMs =\n (params as InteractionDeliveryOptions | undefined)?.delayMs ??\n INTERACTION_DELAY_MS[interaction];\n // Supersede a still-pending delayed emit of the same interaction so a rapid re-trigger\n // (e.g. selecting a second channel within the 1500ms window) speaks only the latest.\n pendingImmediateCancelsRef.current[interaction]?.();\n pendingImmediateCancelsRef.current[interaction] = announce(message, {\n dedupeMs: INTERACTION_DEDUPE_MS[interaction],\n delayMs,\n priority,\n });\n return;\n }\n\n // Debounced stream (e.g. suggestions.count): coalesce rapid updates into the settled\n // value, on a channel keyed by interaction type with that type's own delay. We do NOT\n // dedupe an unchanged message here — whether a repeat is meaningful is the caller's call\n // (e.g. SuggestionList re-announces the count on each genuine re-filter so the user gets\n // feedback even when the count is steady, such as emoji results capped at a constant N).\n // The debounce window already collapses idle/rapid duplicates.\n announceDebounced(interaction, message, debounceMs, priority);\n },\n cancelInteraction: (interaction?: InteractionAnnouncementType) => {\n cancelDebounced(interaction);\n const pending = pendingImmediateCancelsRef.current;\n if (interaction) {\n pending[interaction]?.();\n delete pending[interaction];\n } else {\n Object.values(pending).forEach((cancel) => cancel?.());\n pendingImmediateCancelsRef.current = {};\n }\n },\n }),\n [announce, announceDebounced, cancelDebounced, t],\n );\n};\n"],"mappings":";;;;;;;;;;;;;;AAsFA,IAAM,uBAKF;CAGF,oCAAoC,GAAG,WACrC,EAAE,+BAA+B,8BAA8B,EAAE,MAAM,OAAO,KAAK,CAAC;CAMtF,mBAAmB,GAAG,WACpB,EACE,yDACA,8BACA,EAAE,MAAM,OAAO,KAAK,CACtB;CAMF,qBAAqB,GAAG,WACtB,EACE,4DACA,oCACA,EAAE,SAAS,OAAO,QAAQ,CAC5B;CACF,mBAAmB,MACjB,EAAE,yDAAyD,gBAAgB;CAC7E,eAAe,MACb,EAAE,qDAAqD,YAAY;CAGrE,mBAAmB,GAAG,WACpB,OAAO,QACH,EACE,uEACA,oCACA,EAAE,OAAO,OAAO,MAAM,CACxB,IACA,EACE,6DACA,qBACF;CAIN,sBAAsB,MACpB,GAAG,EAAE,4DAA4D,oBAAoB,EAAE,IAAI,EACzF,yCACA,6DACF,EAAE,IAAI,EAAE,iEAAiE,6BAA6B,EAAE;CAG1G,uBAAuB,GAAG,WACxB,EACE,2DACA,wDACA;EACE,QAAQ,OAAO;EACf,UAAU,OAAO;CACnB,CACF;CACF,wBAAwB,GAAG,WACzB,EACE,4DACA,sFACA,EAAE,QAAQ,OAAO,OAAO,CAC1B;CAGF,uBAAuB,GAAG,WACxB,EACE,yDACA,+BACA,EAAE,QAAQ,OAAO,OAAO,CAC1B;CACF,cAAc,MAAM,EAAE,oDAAoD,WAAW;CACrF,mBAAmB,MACjB,EAAE,yDAAyD,gBAAgB;CAK7E,uBAAuB,GAAG,WAAW;EACnC,IAAI,OAAO,SAAS,GAClB,OAAO,EACL,gEACA,yBACF;EACF,MAAM,QAAQ,EAAE,yDAAyD;GACvE,OAAO,OAAO;GACd,kBAAkB;GAClB,oBAAoB;EACtB,CAAC;EACD,OAAO,OAAO,mBACV,GAAG,MAAM,IAAI,EAAE,8BAA8B,oBAAoB,MACjE;CACN;CAIA,sBAAsB,GAAG,WACvB,OAAO,mBACH,EAAE,gEAAgE;EAChE,OAAO,OAAO;EACd,kBAAkB;EAClB,oBAAoB;EACpB,kBAAkB,OAAO;CAC3B,CAAC,IACD,EAAE,uDAAuD;EACvD,OAAO,OAAO;EACd,kBAAkB;EAClB,oBAAoB;CACtB,CAAC;CAIP,kBAAkB,GAAG,WACnB,EACE,wDACA,+BACA,EAAE,MAAM,OAAO,KAAK,CACtB;CACF,kBAAkB,GAAG,WACnB,EACE,wDACA,6BACA,EAAE,MAAM,OAAO,KAAK,CACtB;CAIF,4BAA4B,MAC1B,EACE,kEACA,0BACF;CACF,0BAA0B,MACxB,EAAE,2DAA2D,kBAAkB;CACjF,2BAA2B,MACzB,EAAE,4DAA4D,mBAAmB;CACnF,wBAAwB,MACtB,EAAE,4DAA4D,oBAAoB;CACpF,2BAA2B,MACzB,EAAE,4DAA4D,mBAAmB;AACrF;;;;;AAMA,IAAM,yBAEF;CAGF,qBAAqB;CAErB,sBAAsB;CACtB,uBAAuB;AACzB;;;;;;;AAQA,IAAM,wBAA8E;CAIlF,mCAAmC;CACnC,qBAAqB;AACvB;;;;;;;;;;;;;;;AAgBA,IAAM,0BAAgF;CAKpF,sBAAsB;CACtB,qBAAqB;AACvB;;;;;;;;;;;;;AAcA,IAAM,uBAA6E;CACjF,kBAAkB;CAClB,oBAAoB;CACpB,iBAAiB;AACnB;;;;;;;;;AAsCA,IAAa,oCAAsE;CACjF,MAAM,WAAW,qBAAqB;CACtC,MAAM,EAAE,MAAM,sBAAsB;CAIpC,MAAM,EAAE,UAAU,mBAAmB,QAAQ,oBAC3C,qBAAqB,QAAQ;CAK/B,MAAM,6BAA6B,OAEjC,CAAC,CAAC;CAEJ,OAAO,eACE;EACL,sBACE,aACA,WACG;GACH,MAAM,iBAAiB,qBAAqB;GAK5C,IAAI,CAAC,gBAAgB;GAErB,MAAM,UAAU,eAAe,GAAG,MAAe;GACjD,MAAM,WAAW,uBAAuB,gBAAgB;GAIxD,MAAM,aACH,QAAmD,cACpD,wBAAwB;GAC1B,IAAI,eAAe,KAAA,GAAW;IAI5B,MAAM,UACH,QAAmD,WACpD,qBAAqB;IAGvB,2BAA2B,QAAQ,YAAY,GAAG;IAClD,2BAA2B,QAAQ,eAAe,SAAS,SAAS;KAClE,UAAU,sBAAsB;KAChC;KACA;IACF,CAAC;IACD;GACF;GAQA,kBAAkB,aAAa,SAAS,YAAY,QAAQ;EAC9D;EACA,oBAAoB,gBAA8C;GAChE,gBAAgB,WAAW;GAC3B,MAAM,UAAU,2BAA2B;GAC3C,IAAI,aAAa;IACf,QAAQ,YAAY,GAAG;IACvB,OAAO,QAAQ;GACjB,OAAO;IACL,OAAO,OAAO,OAAO,CAAC,CAAC,SAAS,WAAW,SAAS,CAAC;IACrD,2BAA2B,UAAU,CAAC;GACxC;EACF;CACF,IACA;EAAC;EAAU;EAAmB;EAAiB;CAAC,CAClD;AACF"}
|
|
@@ -2,14 +2,11 @@ import { createContext, useContext } from "react";
|
|
|
2
2
|
//#region src/components/Accessibility/useAriaLiveAnnouncer.ts
|
|
3
3
|
var noopAnnounce = () => () => void 0;
|
|
4
4
|
var AriaLiveAnnouncerContext = createContext(void 0);
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
return contextValue.announce;
|
|
12
|
-
};
|
|
5
|
+
/**
|
|
6
|
+
* Announcements are a progressive enhancement: outside an `AriaLiveAnnouncerProvider` this is a
|
|
7
|
+
* no-op rather than an error.
|
|
8
|
+
*/
|
|
9
|
+
var useAriaLiveAnnouncer = () => useContext(AriaLiveAnnouncerContext)?.announce ?? noopAnnounce;
|
|
13
10
|
//#endregion
|
|
14
11
|
export { AriaLiveAnnouncerContext, useAriaLiveAnnouncer };
|
|
15
12
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAriaLiveAnnouncer.mjs","names":[],"sources":["../../../../src/components/Accessibility/useAriaLiveAnnouncer.ts"],"sourcesContent":["import { createContext, useContext } from 'react';\n\nexport type AriaLivePriority = 'assertive' | 'polite';\n\nexport type AriaLiveAnnounceOptions = {\n priority?: AriaLivePriority;\n /**\n * Delay (ms) before the message is placed in the live region. Use to let a competing\n * screen-reader utterance settle first — e.g. a dialog-identity announcement made while a\n * field is being auto-focused is otherwise superseded by the field's focus announcement.\n * Omitted/0 announces immediately.\n */\n delayMs?: number;\n /**\n * When set, an identical `message` is announced at most once per this window (ms); a repeat\n * within the window is suppressed (returns a no-op cancel). The window starts when the message\n * is actually announced. Guards against duplicate announcements — e.g. an effect double-invoked\n * by React StrictMode, or rapid re-renders firing the same message.\n */\n dedupeMs?: number;\n};\n\n/**\n * Announce `message` to assistive technology. Delivery is controlled by an options object\n * (`priority` defaults to `'polite'`). Returns a `cancel` function: for a delayed announcement it\n * prevents a still-pending message from being announced (call it from effect cleanup so a closing\n * surface does not announce after unmount); for an immediate announcement it is a no-op.\n */\nexport type AriaLiveAnnounce = (\n message: string,\n options?: AriaLiveAnnounceOptions,\n) => () => void;\n\nexport type AriaLiveAnnouncerContextValue = {\n announce: AriaLiveAnnounce;\n};\n\nconst noopAnnounce: AriaLiveAnnounce = () => () => undefined;\n\nexport const AriaLiveAnnouncerContext = createContext<\n AriaLiveAnnouncerContextValue | undefined\n>(undefined);\n\
|
|
1
|
+
{"version":3,"file":"useAriaLiveAnnouncer.mjs","names":[],"sources":["../../../../src/components/Accessibility/useAriaLiveAnnouncer.ts"],"sourcesContent":["import { createContext, useContext } from 'react';\n\nexport type AriaLivePriority = 'assertive' | 'polite';\n\nexport type AriaLiveAnnounceOptions = {\n priority?: AriaLivePriority;\n /**\n * Delay (ms) before the message is placed in the live region. Use to let a competing\n * screen-reader utterance settle first — e.g. a dialog-identity announcement made while a\n * field is being auto-focused is otherwise superseded by the field's focus announcement.\n * Omitted/0 announces immediately.\n */\n delayMs?: number;\n /**\n * When set, an identical `message` is announced at most once per this window (ms); a repeat\n * within the window is suppressed (returns a no-op cancel). The window starts when the message\n * is actually announced. Guards against duplicate announcements — e.g. an effect double-invoked\n * by React StrictMode, or rapid re-renders firing the same message.\n */\n dedupeMs?: number;\n};\n\n/**\n * Announce `message` to assistive technology. Delivery is controlled by an options object\n * (`priority` defaults to `'polite'`). Returns a `cancel` function: for a delayed announcement it\n * prevents a still-pending message from being announced (call it from effect cleanup so a closing\n * surface does not announce after unmount); for an immediate announcement it is a no-op.\n */\nexport type AriaLiveAnnounce = (\n message: string,\n options?: AriaLiveAnnounceOptions,\n) => () => void;\n\nexport type AriaLiveAnnouncerContextValue = {\n announce: AriaLiveAnnounce;\n};\n\nconst noopAnnounce: AriaLiveAnnounce = () => () => undefined;\n\nexport const AriaLiveAnnouncerContext = createContext<\n AriaLiveAnnouncerContextValue | undefined\n>(undefined);\n\n/**\n * Announcements are a progressive enhancement: outside an `AriaLiveAnnouncerProvider` this is a\n * no-op rather than an error.\n */\nexport const useAriaLiveAnnouncer = () =>\n useContext(AriaLiveAnnouncerContext)?.announce ?? noopAnnounce;\n"],"mappings":";;AAqCA,IAAM,2BAA6C,KAAA;AAEnD,IAAa,2BAA2B,cAEtC,KAAA,CAAS;;;;;AAMX,IAAa,6BACX,WAAW,wBAAwB,CAAC,EAAE,YAAY"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { AttachmentContextProvider, defaultAttachmentContextValue } from "../../context/AttachmentContext.mjs";
|
|
1
2
|
import { SUPPORTED_VIDEO_FORMATS } from "./utils.mjs";
|
|
2
3
|
import { defaultAttachmentActionsDefaultFocus } from "./AttachmentActions.mjs";
|
|
3
4
|
import { CardContainer, FileContainer, GeolocationContainer, GiphyContainer, MediaContainer, UnsupportedAttachmentContainer } from "./AttachmentContainer.mjs";
|
|
4
5
|
import { createElement, useMemo } from "react";
|
|
6
|
+
import { isAudioAttachment, isFileAttachment, isImageAttachment, isScrapedContent, isSharedLocationResponseData, isVideoAttachment, isVoiceRecordingAttachment } from "stream-chat";
|
|
5
7
|
import { jsx } from "react/jsx-runtime";
|
|
6
|
-
import { isAudioAttachment, isFileAttachment, isImageAttachment, isScrapedContent, isSharedLocationResponse, isVideoAttachment, isVoiceRecordingAttachment } from "stream-chat";
|
|
7
8
|
//#region src/components/Attachment/Attachment.tsx
|
|
8
9
|
var ATTACHMENT_GROUPS_ORDER = [
|
|
9
10
|
"media",
|
|
@@ -17,21 +18,35 @@ var ATTACHMENT_GROUPS_ORDER = [
|
|
|
17
18
|
* A component used for rendering message attachments.
|
|
18
19
|
*/
|
|
19
20
|
var Attachment = (props) => {
|
|
20
|
-
const { attachmentActionsDefaultFocus = defaultAttachmentActionsDefaultFocus, attachments, ...rest } = props;
|
|
21
|
+
const { attachmentActionsDefaultFocus = defaultAttachmentActionsDefaultFocus, attachments, giphyVersion, imageAttachmentSizeHandler, shouldGenerateVideoThumbnail, videoAttachmentSizeHandler, ...rest } = props;
|
|
22
|
+
const attachmentContextValue = useMemo(() => ({
|
|
23
|
+
giphyVersion: giphyVersion ?? defaultAttachmentContextValue.giphyVersion,
|
|
24
|
+
imageAttachmentSizeHandler: imageAttachmentSizeHandler ?? defaultAttachmentContextValue.imageAttachmentSizeHandler,
|
|
25
|
+
shouldGenerateVideoThumbnail: shouldGenerateVideoThumbnail ?? defaultAttachmentContextValue.shouldGenerateVideoThumbnail,
|
|
26
|
+
videoAttachmentSizeHandler: videoAttachmentSizeHandler ?? defaultAttachmentContextValue.videoAttachmentSizeHandler
|
|
27
|
+
}), [
|
|
28
|
+
giphyVersion,
|
|
29
|
+
imageAttachmentSizeHandler,
|
|
30
|
+
shouldGenerateVideoThumbnail,
|
|
31
|
+
videoAttachmentSizeHandler
|
|
32
|
+
]);
|
|
21
33
|
const groupedAttachments = useMemo(() => renderGroupedAttachments({
|
|
22
34
|
attachmentActionsDefaultFocus,
|
|
23
35
|
attachments,
|
|
24
36
|
...rest
|
|
25
37
|
}), [attachments, attachmentActionsDefaultFocus]);
|
|
26
|
-
return /* @__PURE__ */ jsx(
|
|
27
|
-
|
|
28
|
-
children:
|
|
38
|
+
return /* @__PURE__ */ jsx(AttachmentContextProvider, {
|
|
39
|
+
value: attachmentContextValue,
|
|
40
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
41
|
+
className: "str-chat__attachment-list",
|
|
42
|
+
children: ATTACHMENT_GROUPS_ORDER.reduce((acc, groupName) => [...acc, ...groupedAttachments[groupName]], [])
|
|
43
|
+
})
|
|
29
44
|
});
|
|
30
45
|
};
|
|
31
46
|
var renderGroupedAttachments = ({ attachments, ...rest }) => {
|
|
32
47
|
const mediaAttachments = [];
|
|
33
48
|
const containers = attachments.reduce((typeMap, attachment) => {
|
|
34
|
-
if (
|
|
49
|
+
if (isSharedLocationResponseData(attachment)) typeMap.geolocation.push(/* @__PURE__ */ createElement(GeolocationContainer, {
|
|
35
50
|
...rest,
|
|
36
51
|
key: `geolocation-${typeMap.geolocation.length}`,
|
|
37
52
|
location: attachment
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Attachment.mjs","names":[],"sources":["../../../../src/components/Attachment/Attachment.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport type { SharedLocationResponse, Attachment as StreamAttachment } from 'stream-chat';\nimport {\n isAudioAttachment,\n isFileAttachment,\n isImageAttachment,\n isScrapedContent,\n isSharedLocationResponse,\n isVideoAttachment,\n isVoiceRecordingAttachment,\n} from 'stream-chat';\n\nimport {\n CardContainer,\n FileContainer,\n GeolocationContainer,\n GiphyContainer,\n MediaContainer,\n UnsupportedAttachmentContainer,\n} from './AttachmentContainer';\nimport type { GroupedRenderedAttachment } from './utils';\nimport { SUPPORTED_VIDEO_FORMATS } from './utils';\nimport type {\n AttachmentActionsDefaultFocusByType,\n AttachmentActionsProps,\n} from './AttachmentActions';\nimport { defaultAttachmentActionsDefaultFocus } from './AttachmentActions';\nimport type { AudioProps } from './Audio';\nimport type { VoiceRecordingProps } from './VoiceRecording';\nimport type { CardProps } from './LinkPreview/Card';\nimport type { FileAttachmentProps } from './FileAttachment';\nimport type { GalleryItem } from '../Gallery';\nimport type { UnsupportedAttachmentProps } from './UnsupportedAttachment';\nimport type { ActionHandlerReturnType } from '../Message/hooks/useActionHandler';\nimport type { GeolocationProps } from './Geolocation';\nimport type { GiphyAttachmentProps } from './Giphy';\nimport type { VideoPlayerProps } from '../VideoPlayer';\nimport type { ModalGalleryProps } from './ModalGallery';\nimport type { ImageProps } from './Image';\n\nexport const ATTACHMENT_GROUPS_ORDER = [\n 'media',\n 'giphy',\n 'card',\n 'geolocation',\n 'file',\n 'unsupported',\n] as const;\n\nexport type AttachmentProps = {\n /** The message attachments to render, see [attachment structure](https://getstream.io/chat/docs/javascript/message_format/?language=javascript) **/\n attachments: (StreamAttachment | SharedLocationResponse)[];\n /**\tThe handler function to call when an action is performed on an attachment, examples include canceling a \\/giphy command or shuffling the results. */\n actionHandler?: ActionHandlerReturnType;\n /**\n * Which attachment action button receives focus on initial render, keyed by attachment type.\n * Values must match an action's `value` (e.g. `'send'`, `'cancel'`, `'shuffle'` for giphy attachment).\n * Default: `{ giphy: 'send' }`.\n * To disable auto-focus (e.g. when rendering the Giphy preview above the composer so focus\n * stays in the message input), pass an empty object: `attachmentActionsDefaultFocus={{}}`.\n */\n attachmentActionsDefaultFocus?: AttachmentActionsDefaultFocusByType;\n /** Custom UI component for displaying attachment actions, defaults to and accepts same props as: [AttachmentActions](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/AttachmentActions.tsx) */\n AttachmentActions?: React.ComponentType<AttachmentActionsProps>;\n /** Custom UI component for displaying an audio type attachment, defaults to and accepts same props as: [Audio](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/Audio.tsx) */\n Audio?: React.ComponentType<AudioProps>;\n /** Custom UI component for displaying a card type attachment, defaults to and accepts same props as: [Card](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/Card.tsx) */\n Card?: React.ComponentType<CardProps>;\n /** Custom UI component for displaying a file type attachment, defaults to and accepts same props as: [File](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/FileAttachment.tsx) */\n File?: React.ComponentType<FileAttachmentProps>;\n /** Custom UI component for displaying a gallery of image type attachments, defaults to and accepts same props as: [ModalGallery](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Gallery/ModalGallery.tsx) */\n ModalGallery?: React.ComponentType<ModalGalleryProps>;\n Geolocation?: React.ComponentType<GeolocationProps>;\n /** Custom UI component for displaying a Giphy image, defaults to and accepts same props as: [Giphy](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/Giphy.tsx) */\n Giphy?: React.ComponentType<GiphyAttachmentProps>;\n /** Custom UI component for displaying an image type attachment, defaults to and accepts same props as: [Image](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Gallery/Image.tsx) */\n Image?: React.ComponentType<ImageProps>;\n /** Optional flag to signal that an attachment is a displayed as a part of a quoted message */\n isQuoted?: boolean;\n /** Custom UI component for displaying a media type attachment, defaults to `ReactPlayer` from 'react-player' */\n Media?: React.ComponentType<VideoPlayerProps>;\n /** Custom UI component for displaying unsupported attachment types, defaults to NullComponent */\n UnsupportedAttachment?: React.ComponentType<UnsupportedAttachmentProps>;\n /** Custom UI component for displaying an audio recording attachment, defaults to and accepts same props as: [VoiceRecording](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/VoiceRecording.tsx) */\n VoiceRecording?: React.ComponentType<VoiceRecordingProps>;\n};\n\n/**\n * A component used for rendering message attachments.\n */\nexport const Attachment = (props: AttachmentProps) => {\n const {\n attachmentActionsDefaultFocus = defaultAttachmentActionsDefaultFocus,\n attachments,\n ...rest\n } = props;\n\n const groupedAttachments = useMemo(\n () =>\n renderGroupedAttachments({\n attachmentActionsDefaultFocus,\n attachments,\n ...rest,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [attachments, attachmentActionsDefaultFocus],\n );\n\n return (\n <div className='str-chat__attachment-list'>\n {ATTACHMENT_GROUPS_ORDER.reduce(\n (acc, groupName) => [...acc, ...groupedAttachments[groupName]],\n [] as React.ReactNode[],\n )}\n </div>\n );\n};\n\nconst renderGroupedAttachments = ({\n attachments,\n ...rest\n}: AttachmentProps): GroupedRenderedAttachment => {\n const mediaAttachments: GalleryItem[] = [];\n const containers = attachments.reduce<GroupedRenderedAttachment>(\n (typeMap, attachment) => {\n if (isSharedLocationResponse(attachment)) {\n typeMap.geolocation.push(\n <GeolocationContainer\n {...rest}\n key={`geolocation-${typeMap.geolocation.length}`}\n location={attachment}\n />,\n );\n } else if (attachment.type === 'giphy') {\n typeMap.card.push(\n <GiphyContainer\n key={`giphy-${typeMap.giphy.length}`}\n {...rest}\n attachment={attachment}\n />,\n );\n } else if (isScrapedContent(attachment)) {\n typeMap.card.push(\n <CardContainer\n key={`card-${typeMap.card.length}`}\n {...rest}\n attachment={attachment}\n />,\n );\n } else if (\n isImageAttachment(attachment) ||\n isVideoAttachment(attachment, SUPPORTED_VIDEO_FORMATS)\n ) {\n mediaAttachments.push(attachment as GalleryItem);\n } else if (\n isAudioAttachment(attachment) ||\n isVoiceRecordingAttachment(attachment) ||\n isFileAttachment(attachment, SUPPORTED_VIDEO_FORMATS)\n ) {\n typeMap.file.push(\n <FileContainer\n key={`file-${typeMap.file.length}`}\n {...rest}\n attachment={attachment}\n />,\n );\n } else {\n typeMap.unsupported.push(\n <UnsupportedAttachmentContainer\n key={`unsupported-${typeMap.unsupported.length}`}\n {...rest}\n attachment={attachment}\n />,\n );\n }\n\n return typeMap;\n },\n {\n card: [],\n file: [],\n geolocation: [],\n giphy: [],\n media: [],\n unsupported: [],\n },\n );\n\n if (mediaAttachments.length) {\n containers.media.push(\n <MediaContainer key='media-container' {...rest} attachments={mediaAttachments} />,\n );\n }\n\n return containers;\n};\n"],"mappings":";;;;;;;AAwCA,IAAa,0BAA0B;CACrC;CACA;CACA;CACA;CACA;CACA;AACF;;;;AA2CA,IAAa,cAAc,UAA2B;CACpD,MAAM,EACJ,gCAAgC,sCAChC,aACA,GAAG,SACD;CAEJ,MAAM,qBAAqB,cAEvB,yBAAyB;EACvB;EACA;EACA,GAAG;CACL,CAAC,GAEH,CAAC,aAAa,6BAA6B,CAC7C;CAEA,OACE,oBAAC,OAAD;EAAK,WAAU;YACZ,wBAAwB,QACtB,KAAK,cAAc,CAAC,GAAG,KAAK,GAAG,mBAAmB,UAAU,GAC7D,CAAC,CACH;CACG,CAAA;AAET;AAEA,IAAM,4BAA4B,EAChC,aACA,GAAG,WAC6C;CAChD,MAAM,mBAAkC,CAAC;CACzC,MAAM,aAAa,YAAY,QAC5B,SAAS,eAAe;EACvB,IAAI,yBAAyB,UAAU,GACrC,QAAQ,YAAY,KAClB,8BAAC,sBAAD;GACE,GAAI;GACJ,KAAK,eAAe,QAAQ,YAAY;GACxC,UAAU;EACX,CAAA,CACH;OACK,IAAI,WAAW,SAAS,SAC7B,QAAQ,KAAK,KACX,oBAAC,gBAAD;GAEE,GAAI;GACQ;EACb,GAHM,SAAS,QAAQ,MAAM,QAG7B,CACH;OACK,IAAI,iBAAiB,UAAU,GACpC,QAAQ,KAAK,KACX,oBAAC,eAAD;GAEE,GAAI;GACQ;EACb,GAHM,QAAQ,QAAQ,KAAK,QAG3B,CACH;OACK,IACL,kBAAkB,UAAU,KAC5B,kBAAkB,YAAY,uBAAuB,GAErD,iBAAiB,KAAK,UAAyB;OAC1C,IACL,kBAAkB,UAAU,KAC5B,2BAA2B,UAAU,KACrC,iBAAiB,YAAY,uBAAuB,GAEpD,QAAQ,KAAK,KACX,oBAAC,eAAD;GAEE,GAAI;GACQ;EACb,GAHM,QAAQ,QAAQ,KAAK,QAG3B,CACH;OAEA,QAAQ,YAAY,KAClB,oBAAC,gCAAD;GAEE,GAAI;GACQ;EACb,GAHM,eAAe,QAAQ,YAAY,QAGzC,CACH;EAGF,OAAO;CACT,GACA;EACE,MAAM,CAAC;EACP,MAAM,CAAC;EACP,aAAa,CAAC;EACd,OAAO,CAAC;EACR,OAAO,CAAC;EACR,aAAa,CAAC;CAChB,CACF;CAEA,IAAI,iBAAiB,QACnB,WAAW,MAAM,KACf,oBAAC,gBAAD;EAAsC,GAAI;EAAM,aAAa;CAAmB,GAA5D,iBAA4D,CAClF;CAGF,OAAO;AACT"}
|
|
1
|
+
{"version":3,"file":"Attachment.mjs","names":[],"sources":["../../../../src/components/Attachment/Attachment.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport type {\n GiphyVersions,\n SharedLocationResponseData,\n Attachment as StreamAttachment,\n} from 'stream-chat';\nimport {\n isAudioAttachment,\n isFileAttachment,\n isImageAttachment,\n isScrapedContent,\n isSharedLocationResponseData,\n isVideoAttachment,\n isVoiceRecordingAttachment,\n} from 'stream-chat';\n\nimport {\n CardContainer,\n FileContainer,\n GeolocationContainer,\n GiphyContainer,\n MediaContainer,\n UnsupportedAttachmentContainer,\n} from './AttachmentContainer';\nimport type { GroupedRenderedAttachment } from './utils';\nimport { SUPPORTED_VIDEO_FORMATS } from './utils';\nimport type {\n AttachmentActionsDefaultFocusByType,\n AttachmentActionsProps,\n} from './AttachmentActions';\nimport { defaultAttachmentActionsDefaultFocus } from './AttachmentActions';\nimport type { AudioProps } from './Audio';\nimport type { VoiceRecordingProps } from './VoiceRecording';\nimport type { CardProps } from './LinkPreview/Card';\nimport type { FileAttachmentProps } from './FileAttachment';\nimport type { UnsupportedAttachmentProps } from './UnsupportedAttachment';\nimport type { ActionHandlerReturnType } from '../Message/hooks/useActionHandler';\nimport type { GeolocationProps } from './Geolocation';\nimport type { GiphyAttachmentProps } from './Giphy';\nimport type { VideoPlayerProps } from '../VideoPlayer';\nimport type { ModalGalleryProps } from './ModalGallery';\nimport type { ImageProps } from './Image';\nimport {\n AttachmentContextProvider,\n defaultAttachmentContextValue,\n type ImageAttachmentConfiguration,\n type VideoAttachmentConfiguration,\n} from '../../context/AttachmentContext';\n\nexport const ATTACHMENT_GROUPS_ORDER = [\n 'media',\n 'giphy',\n 'card',\n 'geolocation',\n 'file',\n 'unsupported',\n] as const;\n\nexport type ImageAttachmentSizeHandler = (\n attachment: StreamAttachment,\n element: HTMLElement,\n) => ImageAttachmentConfiguration;\n\nexport type VideoAttachmentSizeHandler = (\n attachment: StreamAttachment,\n element: HTMLElement,\n shouldGenerateVideoThumbnail: boolean,\n) => VideoAttachmentConfiguration;\n\nexport type AttachmentProps = {\n /** The message attachments to render, see [attachment structure](https://getstream.io/chat/docs/javascript/message_format/?language=javascript) **/\n attachments: (StreamAttachment | SharedLocationResponseData)[];\n /**\tThe handler function to call when an action is performed on an attachment, examples include canceling a \\/giphy command or shuffling the results. */\n actionHandler?: ActionHandlerReturnType;\n /**\n * Which attachment action button receives focus on initial render, keyed by attachment type.\n * Values must match an action's `value` (e.g. `'send'`, `'cancel'`, `'shuffle'` for giphy attachment).\n * Default: `{ giphy: 'send' }`.\n * To disable auto-focus (e.g. when rendering the Giphy preview above the composer so focus\n * stays in the message input), pass an empty object: `attachmentActionsDefaultFocus={{}}`.\n */\n attachmentActionsDefaultFocus?: AttachmentActionsDefaultFocusByType;\n /** Custom UI component for displaying attachment actions, defaults to and accepts same props as: [AttachmentActions](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/AttachmentActions.tsx) */\n AttachmentActions?: React.ComponentType<AttachmentActionsProps>;\n /** Custom UI component for displaying an audio type attachment, defaults to and accepts same props as: [Audio](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/Audio.tsx) */\n Audio?: React.ComponentType<AudioProps>;\n /** Custom UI component for displaying a card type attachment, defaults to and accepts same props as: [Card](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/Card.tsx) */\n Card?: React.ComponentType<CardProps>;\n /** Custom UI component for displaying a file type attachment, defaults to and accepts same props as: [File](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/FileAttachment.tsx) */\n File?: React.ComponentType<FileAttachmentProps>;\n /** Custom UI component for displaying a gallery of image type attachments, defaults to and accepts same props as: [ModalGallery](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Gallery/ModalGallery.tsx) */\n ModalGallery?: React.ComponentType<ModalGalleryProps>;\n Geolocation?: React.ComponentType<GeolocationProps>;\n /** Custom UI component for displaying a Giphy image, defaults to and accepts same props as: [Giphy](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/Giphy.tsx) */\n Giphy?: React.ComponentType<GiphyAttachmentProps>;\n /** Custom UI component for displaying an image type attachment, defaults to and accepts same props as: [Image](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Gallery/Image.tsx) */\n Image?: React.ComponentType<ImageProps>;\n /** Giphy rendition to use when rendering giphy attachments */\n giphyVersion?: GiphyVersions;\n /** Handler used to size image attachments responsively */\n imageAttachmentSizeHandler?: ImageAttachmentSizeHandler;\n /** Optional flag to signal that an attachment is a displayed as a part of a quoted message */\n isQuoted?: boolean;\n /** Custom UI component for displaying a media type attachment, defaults to `ReactPlayer` from 'react-player' */\n Media?: React.ComponentType<VideoPlayerProps>;\n /** Whether a video thumbnail should be rendered before playback starts */\n shouldGenerateVideoThumbnail?: boolean;\n /** Custom UI component for displaying unsupported attachment types, defaults to NullComponent */\n UnsupportedAttachment?: React.ComponentType<UnsupportedAttachmentProps>;\n /** Handler used to size video attachments responsively */\n videoAttachmentSizeHandler?: VideoAttachmentSizeHandler;\n /** Custom UI component for displaying an audio recording attachment, defaults to and accepts same props as: [VoiceRecording](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/VoiceRecording.tsx) */\n VoiceRecording?: React.ComponentType<VoiceRecordingProps>;\n};\n\n/**\n * A component used for rendering message attachments.\n */\nexport const Attachment = (props: AttachmentProps) => {\n const {\n attachmentActionsDefaultFocus = defaultAttachmentActionsDefaultFocus,\n attachments,\n giphyVersion,\n imageAttachmentSizeHandler,\n shouldGenerateVideoThumbnail,\n videoAttachmentSizeHandler,\n ...rest\n } = props;\n const attachmentContextValue = useMemo(\n () => ({\n giphyVersion: giphyVersion ?? defaultAttachmentContextValue.giphyVersion,\n imageAttachmentSizeHandler:\n imageAttachmentSizeHandler ??\n defaultAttachmentContextValue.imageAttachmentSizeHandler,\n shouldGenerateVideoThumbnail:\n shouldGenerateVideoThumbnail ??\n defaultAttachmentContextValue.shouldGenerateVideoThumbnail,\n videoAttachmentSizeHandler:\n videoAttachmentSizeHandler ??\n defaultAttachmentContextValue.videoAttachmentSizeHandler,\n }),\n [\n giphyVersion,\n imageAttachmentSizeHandler,\n shouldGenerateVideoThumbnail,\n videoAttachmentSizeHandler,\n ],\n );\n\n const groupedAttachments = useMemo(\n () =>\n renderGroupedAttachments({\n attachmentActionsDefaultFocus,\n attachments,\n ...rest,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [attachments, attachmentActionsDefaultFocus],\n );\n\n return (\n <AttachmentContextProvider value={attachmentContextValue}>\n <div className='str-chat__attachment-list'>\n {ATTACHMENT_GROUPS_ORDER.reduce(\n (acc, groupName) => [...acc, ...groupedAttachments[groupName]],\n [] as React.ReactNode[],\n )}\n </div>\n </AttachmentContextProvider>\n );\n};\n\nconst renderGroupedAttachments = ({\n attachments,\n ...rest\n}: AttachmentProps): GroupedRenderedAttachment => {\n const mediaAttachments: StreamAttachment[] = [];\n const containers = attachments.reduce<GroupedRenderedAttachment>(\n (typeMap, attachment) => {\n if (isSharedLocationResponseData(attachment)) {\n typeMap.geolocation.push(\n <GeolocationContainer\n {...rest}\n key={`geolocation-${typeMap.geolocation.length}`}\n location={attachment}\n />,\n );\n } else if (attachment.type === 'giphy') {\n typeMap.card.push(\n <GiphyContainer\n key={`giphy-${typeMap.giphy.length}`}\n {...rest}\n attachment={attachment}\n />,\n );\n } else if (isScrapedContent(attachment)) {\n typeMap.card.push(\n <CardContainer\n key={`card-${typeMap.card.length}`}\n {...rest}\n attachment={attachment}\n />,\n );\n } else if (\n isImageAttachment(attachment) ||\n isVideoAttachment(attachment, SUPPORTED_VIDEO_FORMATS)\n ) {\n mediaAttachments.push(attachment);\n } else if (\n isAudioAttachment(attachment) ||\n isVoiceRecordingAttachment(attachment) ||\n isFileAttachment(attachment, SUPPORTED_VIDEO_FORMATS)\n ) {\n typeMap.file.push(\n <FileContainer\n key={`file-${typeMap.file.length}`}\n {...rest}\n attachment={attachment}\n />,\n );\n } else {\n typeMap.unsupported.push(\n <UnsupportedAttachmentContainer\n key={`unsupported-${typeMap.unsupported.length}`}\n {...rest}\n attachment={attachment}\n />,\n );\n }\n\n return typeMap;\n },\n {\n card: [],\n file: [],\n geolocation: [],\n giphy: [],\n media: [],\n unsupported: [],\n },\n );\n\n if (mediaAttachments.length) {\n containers.media.push(\n <MediaContainer key='media-container' {...rest} attachments={mediaAttachments} />,\n );\n }\n\n return containers;\n};\n"],"mappings":";;;;;;;;AAiDA,IAAa,0BAA0B;CACrC;CACA;CACA;CACA;CACA;CACA;AACF;;;;AA8DA,IAAa,cAAc,UAA2B;CACpD,MAAM,EACJ,gCAAgC,sCAChC,aACA,cACA,4BACA,8BACA,4BACA,GAAG,SACD;CACJ,MAAM,yBAAyB,eACtB;EACL,cAAc,gBAAgB,8BAA8B;EAC5D,4BACE,8BACA,8BAA8B;EAChC,8BACE,gCACA,8BAA8B;EAChC,4BACE,8BACA,8BAA8B;CAClC,IACA;EACE;EACA;EACA;EACA;CACF,CACF;CAEA,MAAM,qBAAqB,cAEvB,yBAAyB;EACvB;EACA;EACA,GAAG;CACL,CAAC,GAEH,CAAC,aAAa,6BAA6B,CAC7C;CAEA,OACE,oBAAC,2BAAD;EAA2B,OAAO;YAChC,oBAAC,OAAD;GAAK,WAAU;aACZ,wBAAwB,QACtB,KAAK,cAAc,CAAC,GAAG,KAAK,GAAG,mBAAmB,UAAU,GAC7D,CAAC,CACH;EACG,CAAA;CACoB,CAAA;AAE/B;AAEA,IAAM,4BAA4B,EAChC,aACA,GAAG,WAC6C;CAChD,MAAM,mBAAuC,CAAC;CAC9C,MAAM,aAAa,YAAY,QAC5B,SAAS,eAAe;EACvB,IAAI,6BAA6B,UAAU,GACzC,QAAQ,YAAY,KAClB,8BAAC,sBAAD;GACE,GAAI;GACJ,KAAK,eAAe,QAAQ,YAAY;GACxC,UAAU;EACX,CAAA,CACH;OACK,IAAI,WAAW,SAAS,SAC7B,QAAQ,KAAK,KACX,oBAAC,gBAAD;GAEE,GAAI;GACQ;EACb,GAHM,SAAS,QAAQ,MAAM,QAG7B,CACH;OACK,IAAI,iBAAiB,UAAU,GACpC,QAAQ,KAAK,KACX,oBAAC,eAAD;GAEE,GAAI;GACQ;EACb,GAHM,QAAQ,QAAQ,KAAK,QAG3B,CACH;OACK,IACL,kBAAkB,UAAU,KAC5B,kBAAkB,YAAY,uBAAuB,GAErD,iBAAiB,KAAK,UAAU;OAC3B,IACL,kBAAkB,UAAU,KAC5B,2BAA2B,UAAU,KACrC,iBAAiB,YAAY,uBAAuB,GAEpD,QAAQ,KAAK,KACX,oBAAC,eAAD;GAEE,GAAI;GACQ;EACb,GAHM,QAAQ,QAAQ,KAAK,QAG3B,CACH;OAEA,QAAQ,YAAY,KAClB,oBAAC,gCAAD;GAEE,GAAI;GACQ;EACb,GAHM,eAAe,QAAQ,YAAY,QAGzC,CACH;EAGF,OAAO;CACT,GACA;EACE,MAAM,CAAC;EACP,MAAM,CAAC;EACP,aAAa,CAAC;EACd,OAAO,CAAC;EACR,OAAO,CAAC;EACR,aAAa,CAAC;CAChB,CACF;CAEA,IAAI,iBAAiB,QACnB,WAAW,MAAM,KACf,oBAAC,gBAAD;EAAsC,GAAI;EAAM,aAAa;CAAmB,GAA5D,iBAA4D,CAClF;CAGF,OAAO;AACT"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { asDynamicKey } from "../../i18n/utils.mjs";
|
|
1
2
|
import { useTranslationContext } from "../../context/TranslationContext.mjs";
|
|
2
3
|
import { VisuallyHidden } from "../VisuallyHidden/VisuallyHidden.mjs";
|
|
3
|
-
import { useStableId } from "../UtilityComponents/useStableId.mjs";
|
|
4
4
|
import { Button } from "../Button/Button.mjs";
|
|
5
|
+
import { useFocusReturn } from "../Accessibility/hooks/useFocusReturn.mjs";
|
|
5
6
|
import { useInteractionAnnouncements } from "../Accessibility/hooks/useInteractionAnnouncements.mjs";
|
|
7
|
+
import { useStableId } from "../UtilityComponents/useStableId.mjs";
|
|
6
8
|
import { getGiphyDescriptiveTitle } from "./giphyAccessibility.mjs";
|
|
7
|
-
import { useFocusReturn } from "../Accessibility/hooks/useFocusReturn.mjs";
|
|
8
9
|
import React, { useEffect, useMemo, useRef } from "react";
|
|
9
10
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
11
|
import clsx from "clsx";
|
|
@@ -12,7 +13,7 @@ import clsx from "clsx";
|
|
|
12
13
|
var defaultAttachmentActionsDefaultFocus = { giphy: "send" };
|
|
13
14
|
var UnMemoizedAttachmentActions = (props) => {
|
|
14
15
|
const { actionHandler, actions, defaultFocusedActionValue, giphy, id, image_url: imageUrl, text, thumb_url: thumbUrl, title, type } = props;
|
|
15
|
-
const { t } = useTranslationContext(
|
|
16
|
+
const { t } = useTranslationContext();
|
|
16
17
|
const { announceInteraction } = useInteractionAnnouncements();
|
|
17
18
|
const { reserve: reserveFocusReturn, restore: restoreFocusReturn } = useFocusReturn();
|
|
18
19
|
const buttonRefs = useRef([]);
|
|
@@ -31,9 +32,9 @@ var UnMemoizedAttachmentActions = (props) => {
|
|
|
31
32
|
}
|
|
32
33
|
};
|
|
33
34
|
const knownActionText = useMemo(() => ({
|
|
34
|
-
Cancel: t("Cancel"),
|
|
35
|
-
Send: t("Send"),
|
|
36
|
-
Shuffle: t("Shuffle")
|
|
35
|
+
Cancel: t("common.cancel.label", "Cancel"),
|
|
36
|
+
Send: t("common.send.label", "Send"),
|
|
37
|
+
Shuffle: t("attachment.actions.shuffle.label", "Shuffle")
|
|
37
38
|
}), [t]);
|
|
38
39
|
const focusIndex = useMemo(() => {
|
|
39
40
|
if (!defaultFocusedActionValue) return null;
|
|
@@ -69,13 +70,13 @@ var UnMemoizedAttachmentActions = (props) => {
|
|
|
69
70
|
children: /* @__PURE__ */ jsxs("div", {
|
|
70
71
|
className: "str-chat__message-attachment-actions-form",
|
|
71
72
|
...isGiphy ? {
|
|
72
|
-
"aria-label": t("
|
|
73
|
+
"aria-label": t("attachment.actions.giphyActions.ariaLabel", "Giphy actions"),
|
|
73
74
|
role: "group"
|
|
74
75
|
} : {},
|
|
75
76
|
children: [
|
|
76
77
|
/* @__PURE__ */ jsx("span", { children: text }),
|
|
77
78
|
actions.map((action, index) => {
|
|
78
|
-
const label = action.text ? knownActionText[action.text] ?? t(action.text) : null;
|
|
79
|
+
const label = action.text ? knownActionText[action.text] ?? t(asDynamicKey(action.text)) : null;
|
|
79
80
|
return /* @__PURE__ */ jsx(Button, {
|
|
80
81
|
appearance: "ghost",
|
|
81
82
|
"aria-describedby": isGiphy && action.value === defaultFocusedActionValue ? giphyDescriptionId : void 0,
|
|
@@ -93,7 +94,7 @@ var UnMemoizedAttachmentActions = (props) => {
|
|
|
93
94
|
}),
|
|
94
95
|
isGiphy && /* @__PURE__ */ jsx(VisuallyHidden, {
|
|
95
96
|
id: giphyDescriptionId,
|
|
96
|
-
children: t("
|
|
97
|
+
children: t("attachment.actions.giphyPreviewOnlyVisible.ariaLabel", "Giphy preview, only visible to you. Use the Send, Shuffle, or Cancel actions.")
|
|
97
98
|
})
|
|
98
99
|
]
|
|
99
100
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AttachmentActions.mjs","names":[],"sources":["../../../../src/components/Attachment/AttachmentActions.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef } from 'react';\nimport type { Action, Attachment } from 'stream-chat';\n\nimport { useTranslationContext } from '../../context';\n\nimport { useFocusReturn, useInteractionAnnouncements } from '../Accessibility';\nimport { getGiphyDescriptiveTitle } from './giphyAccessibility';\nimport type { ActionHandlerReturnType } from '../Message/hooks/useActionHandler';\nimport { Button } from '../Button';\nimport { VisuallyHidden } from '../VisuallyHidden';\nimport { useStableId } from '../UtilityComponents/useStableId';\nimport clsx from 'clsx';\n\nexport type AttachmentActionsProps = Attachment & {\n /** A list of actions */\n actions: Action[];\n /** Unique id for action button key. Key is generated by concatenating this id with action value - {`${id}-${action.value}`} */\n id: string;\n /** The text for the form input */\n text: string;\n /** Click event handler */\n actionHandler?: ActionHandlerReturnType;\n /** Which action should be focused on initial render (match by action.value) */\n defaultFocusedActionValue?: string;\n};\n\nexport type AttachmentActionsDefaultFocusByType = Partial<\n Record<NonNullable<Attachment['type']>, string>\n>;\n\nexport const defaultAttachmentActionsDefaultFocus: AttachmentActionsDefaultFocusByType = {\n giphy: 'send',\n};\n\nconst UnMemoizedAttachmentActions = (props: AttachmentActionsProps) => {\n const {\n actionHandler,\n actions,\n defaultFocusedActionValue,\n giphy,\n id,\n image_url: imageUrl,\n text,\n thumb_url: thumbUrl,\n title,\n type,\n } = props;\n const { t } = useTranslationContext('UnMemoizedAttachmentActions');\n const { announceInteraction } = useInteractionAnnouncements();\n const { reserve: reserveFocusReturn, restore: restoreFocusReturn } = useFocusReturn();\n const buttonRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\n const isGiphy = type === 'giphy';\n // The giphy preview auto-focuses its primary action, so its purpose + available actions are\n // FOCUS-COUPLED: describe them on the focused control (aria-describedby) so the text rides\n // the focus event. A live-region announcement here would be preempted by that same focus\n // change and never heard. See `.cursor/skills/accessibility/SKILL.md` §3 (focus-coupled vs\n // decoupled) and specs/a11y-react-web/decisions.md.\n const giphyDescriptionId = useStableId();\n\n // A human, non-URL title for this giphy (usually absent — see RW6), reused for both the\n // preview description and the shuffle announcement.\n const descriptiveTitle = isGiphy ? getGiphyDescriptiveTitle(title) : undefined;\n // Identity used to detect the GIF changing on Shuffle. A giphy attachment carries the unique\n // GIF URL in `giphy.original.url` / `thumb_url` (there is usually no `image_url`); both change\n // on every shuffle, so the canonical GIF URL is the identity.\n const giphyImageIdentity = isGiphy\n ? (giphy?.original?.url ?? thumbUrl ?? imageUrl ?? null)\n : null;\n const previousGiphyImageRef = useRef<string | null>(null);\n const giphyImageInitializedRef = useRef(false);\n\n const handleActionClick = (\n event: React.MouseEvent<HTMLButtonElement, MouseEvent>,\n name?: string,\n value?: string,\n ) => {\n actionHandler?.(name, value, event);\n\n // For giphy actions, return focus to wherever it was before the preview stole it (the\n // composer — but this code never names it; see useFocusReturn) and announce the outcome.\n //\n // Order matters: restore focus FIRST, then announce on the next frame. The screen reader\n // speaks the focus change (\"Message input\") immediately and synchronously; a polite\n // live-region message fired in the same tick races with it (and can be dropped). Deferring\n // the announce to rAF makes the sequence deterministic — \"Message input\" then \"Giphy sent\" —\n // and guarantees the confirmation is heard. The gap between the two utterances is governed\n // by the screen reader's speech queue and is not controllable here. The rAF is intentionally\n // NOT cancelled on unmount: the preview unmounts when the giphy is sent, but the announcer\n // lives at the Chat root, so the confirmation must still fire.\n if (isGiphy && (value === 'send' || value === 'cancel')) {\n restoreFocusReturn();\n const interaction = value === 'send' ? 'giphy.sent' : 'giphy.canceled';\n requestAnimationFrame(() => announceInteraction(interaction));\n }\n };\n\n const knownActionText = useMemo<Record<string, string>>(\n () => ({\n Cancel: t('Cancel'),\n Send: t('Send'),\n Shuffle: t('Shuffle'),\n }),\n [t],\n );\n\n const focusIndex = useMemo(() => {\n if (!defaultFocusedActionValue) return null;\n const index = actions.findIndex(\n (action) => action.value === defaultFocusedActionValue,\n );\n return index >= 0 ? index : null;\n }, [actions, defaultFocusedActionValue]);\n\n useEffect(() => {\n if (focusIndex === null) return;\n const button = buttonRefs.current[focusIndex];\n if (button && document.activeElement !== button) {\n // Capture where focus is (e.g. the composer) BEFORE stealing it, so a terminal\n // action can return focus there via restoreFocusReturn() — without this component\n // knowing what that element is.\n reserveFocusReturn();\n button.focus();\n }\n }, [focusIndex, reserveFocusReturn]);\n\n // Shuffle swaps the GIF in place without moving focus (it stays on the Shuffle button), so\n // this is a DECOUPLED change → announce it via the live region (no focus/rAF dance). Skip the\n // initial mount: the preview's appearance is conveyed by the focused control's description\n // (RW4a), not a live announcement.\n useEffect(() => {\n if (!isGiphy) return;\n if (!giphyImageInitializedRef.current) {\n giphyImageInitializedRef.current = true;\n previousGiphyImageRef.current = giphyImageIdentity;\n return;\n }\n if (giphyImageIdentity === previousGiphyImageRef.current) return;\n previousGiphyImageRef.current = giphyImageIdentity;\n // Giphy payloads rarely have a human title, so this usually announces just \"Giphy image\n // changed\"; the title is included only when one genuinely exists.\n announceInteraction('giphy.shuffled', { title: descriptiveTitle });\n }, [announceInteraction, descriptiveTitle, giphyImageIdentity, isGiphy]);\n\n const groupProps = isGiphy\n ? { 'aria-label': t('aria/Giphy actions'), role: 'group' as const }\n : {};\n\n return (\n <div className='str-chat__message-attachment-actions'>\n <div className='str-chat__message-attachment-actions-form' {...groupProps}>\n <span>{text}</span>\n {actions.map((action, index) => {\n const label = action.text\n ? (knownActionText[action.text] ?? t(action.text))\n : null;\n\n return (\n <Button\n appearance='ghost'\n // aria-describedby: the auto-focused primary action carries the preview\n // description so it is spoken as part of the focus announcement (focus-coupled,\n // not a live region).\n aria-describedby={\n isGiphy && action.value === defaultFocusedActionValue\n ? giphyDescriptionId\n : undefined\n }\n // aria-label: for giphy actions, give each button a self-contained accessible\n // name so it is not announced with surrounding list/group context (e.g.\n // \"list 3 items\") swallowing the actual action label. Non-giphy untouched.\n aria-label={isGiphy ? (label ?? undefined) : undefined}\n className={clsx(\n `str-chat__message-attachment-actions-button str-chat__message-attachment-actions-button--${action.style}`,\n )}\n data-testid={`${action.name}`}\n data-value={action.value}\n key={`${id}-${action.value}`}\n onClick={(event) => handleActionClick(event, action.name, action.value)}\n ref={(element) => {\n buttonRefs.current[index] = element;\n }}\n variant='secondary'\n >\n {label}\n </Button>\n );\n })}\n {isGiphy && (\n <VisuallyHidden id={giphyDescriptionId}>\n {t(\n 'aria/Giphy preview, only visible to you. Use the Send, Shuffle, or Cancel actions.',\n )}\n </VisuallyHidden>\n )}\n </div>\n </div>\n );\n};\n\n/**\n * A component for rendering the actions you can take on an attachment.\n */\nexport const AttachmentActions = React.memo(\n UnMemoizedAttachmentActions,\n) as typeof UnMemoizedAttachmentActions;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AttachmentActions.mjs","names":[],"sources":["../../../../src/components/Attachment/AttachmentActions.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef } from 'react';\nimport type { Action, Attachment } from 'stream-chat';\n\nimport { useTranslationContext } from '../../context';\n\nimport { useFocusReturn, useInteractionAnnouncements } from '../Accessibility';\nimport { getGiphyDescriptiveTitle } from './giphyAccessibility';\nimport type { ActionHandlerReturnType } from '../Message/hooks/useActionHandler';\nimport { Button } from '../Button';\nimport { VisuallyHidden } from '../VisuallyHidden';\nimport { useStableId } from '../UtilityComponents/useStableId';\nimport clsx from 'clsx';\nimport { asDynamicKey } from '../../i18n/utils';\n\nexport type AttachmentActionsProps = Attachment & {\n /** A list of actions */\n actions: Action[];\n /** Unique id for action button key. Key is generated by concatenating this id with action value - {`${id}-${action.value}`} */\n id: string;\n /** The text for the form input */\n text: string;\n /** Click event handler */\n actionHandler?: ActionHandlerReturnType;\n /** Which action should be focused on initial render (match by action.value) */\n defaultFocusedActionValue?: string;\n};\n\nexport type AttachmentActionsDefaultFocusByType = Partial<\n Record<NonNullable<Attachment['type']>, string>\n>;\n\nexport const defaultAttachmentActionsDefaultFocus: AttachmentActionsDefaultFocusByType = {\n giphy: 'send',\n};\n\nconst UnMemoizedAttachmentActions = (props: AttachmentActionsProps) => {\n const {\n actionHandler,\n actions,\n defaultFocusedActionValue,\n giphy,\n id,\n image_url: imageUrl,\n text,\n thumb_url: thumbUrl,\n title,\n type,\n } = props;\n const { t } = useTranslationContext();\n const { announceInteraction } = useInteractionAnnouncements();\n const { reserve: reserveFocusReturn, restore: restoreFocusReturn } = useFocusReturn();\n const buttonRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\n const isGiphy = type === 'giphy';\n // The giphy preview auto-focuses its primary action, so its purpose + available actions are\n // FOCUS-COUPLED: describe them on the focused control (aria-describedby) so the text rides\n // the focus event. A live-region announcement here would be preempted by that same focus\n // change and never heard. See `.cursor/skills/accessibility/SKILL.md` §3 (focus-coupled vs\n // decoupled) and specs/a11y-react-web/decisions.md.\n const giphyDescriptionId = useStableId();\n\n // A human, non-URL title for this giphy (usually absent — see RW6), reused for both the\n // preview description and the shuffle announcement.\n const descriptiveTitle = isGiphy ? getGiphyDescriptiveTitle(title) : undefined;\n // Identity used to detect the GIF changing on Shuffle. A giphy attachment carries the unique\n // GIF URL in `giphy.original.url` / `thumb_url` (there is usually no `image_url`); both change\n // on every shuffle, so the canonical GIF URL is the identity.\n const giphyImageIdentity = isGiphy\n ? (giphy?.original?.url ?? thumbUrl ?? imageUrl ?? null)\n : null;\n const previousGiphyImageRef = useRef<string | null>(null);\n const giphyImageInitializedRef = useRef(false);\n\n const handleActionClick = (\n event: React.MouseEvent<HTMLButtonElement, MouseEvent>,\n name?: string,\n value?: string,\n ) => {\n actionHandler?.(name, value, event);\n\n // For giphy actions, return focus to wherever it was before the preview stole it (the\n // composer — but this code never names it; see useFocusReturn) and announce the outcome.\n //\n // Order matters: restore focus FIRST, then announce on the next frame. The screen reader\n // speaks the focus change (\"Message input\") immediately and synchronously; a polite\n // live-region message fired in the same tick races with it (and can be dropped). Deferring\n // the announce to rAF makes the sequence deterministic — \"Message input\" then \"Giphy sent\" —\n // and guarantees the confirmation is heard. The gap between the two utterances is governed\n // by the screen reader's speech queue and is not controllable here. The rAF is intentionally\n // NOT cancelled on unmount: the preview unmounts when the giphy is sent, but the announcer\n // lives at the Chat root, so the confirmation must still fire.\n if (isGiphy && (value === 'send' || value === 'cancel')) {\n restoreFocusReturn();\n const interaction = value === 'send' ? 'giphy.sent' : 'giphy.canceled';\n requestAnimationFrame(() => announceInteraction(interaction));\n }\n };\n\n const knownActionText = useMemo<Record<string, string>>(\n () => ({\n Cancel: t('common.cancel.label', 'Cancel'),\n Send: t('common.send.label', 'Send'),\n Shuffle: t('attachment.actions.shuffle.label', 'Shuffle'),\n }),\n [t],\n );\n\n const focusIndex = useMemo(() => {\n if (!defaultFocusedActionValue) return null;\n const index = actions.findIndex(\n (action) => action.value === defaultFocusedActionValue,\n );\n return index >= 0 ? index : null;\n }, [actions, defaultFocusedActionValue]);\n\n useEffect(() => {\n if (focusIndex === null) return;\n const button = buttonRefs.current[focusIndex];\n if (button && document.activeElement !== button) {\n // Capture where focus is (e.g. the composer) BEFORE stealing it, so a terminal\n // action can return focus there via restoreFocusReturn() — without this component\n // knowing what that element is.\n reserveFocusReturn();\n button.focus();\n }\n }, [focusIndex, reserveFocusReturn]);\n\n // Shuffle swaps the GIF in place without moving focus (it stays on the Shuffle button), so\n // this is a DECOUPLED change → announce it via the live region (no focus/rAF dance). Skip the\n // initial mount: the preview's appearance is conveyed by the focused control's description\n // (RW4a), not a live announcement.\n useEffect(() => {\n if (!isGiphy) return;\n if (!giphyImageInitializedRef.current) {\n giphyImageInitializedRef.current = true;\n previousGiphyImageRef.current = giphyImageIdentity;\n return;\n }\n if (giphyImageIdentity === previousGiphyImageRef.current) return;\n previousGiphyImageRef.current = giphyImageIdentity;\n // Giphy payloads rarely have a human title, so this usually announces just \"Giphy image\n // changed\"; the title is included only when one genuinely exists.\n announceInteraction('giphy.shuffled', { title: descriptiveTitle });\n }, [announceInteraction, descriptiveTitle, giphyImageIdentity, isGiphy]);\n\n const groupProps = isGiphy\n ? {\n 'aria-label': t('attachment.actions.giphyActions.ariaLabel', 'Giphy actions'),\n role: 'group' as const,\n }\n : {};\n\n return (\n <div className='str-chat__message-attachment-actions'>\n <div className='str-chat__message-attachment-actions-form' {...groupProps}>\n <span>{text}</span>\n {actions.map((action, index) => {\n const label = action.text\n ? (knownActionText[action.text] ?? t(asDynamicKey(action.text)))\n : null;\n\n return (\n <Button\n appearance='ghost'\n // aria-describedby: the auto-focused primary action carries the preview\n // description so it is spoken as part of the focus announcement (focus-coupled,\n // not a live region).\n aria-describedby={\n isGiphy && action.value === defaultFocusedActionValue\n ? giphyDescriptionId\n : undefined\n }\n // aria-label: for giphy actions, give each button a self-contained accessible\n // name so it is not announced with surrounding list/group context (e.g.\n // \"list 3 items\") swallowing the actual action label. Non-giphy untouched.\n aria-label={isGiphy ? (label ?? undefined) : undefined}\n className={clsx(\n `str-chat__message-attachment-actions-button str-chat__message-attachment-actions-button--${action.style}`,\n )}\n data-testid={`${action.name}`}\n data-value={action.value}\n key={`${id}-${action.value}`}\n onClick={(event) => handleActionClick(event, action.name, action.value)}\n ref={(element) => {\n buttonRefs.current[index] = element;\n }}\n variant='secondary'\n >\n {label}\n </Button>\n );\n })}\n {isGiphy && (\n <VisuallyHidden id={giphyDescriptionId}>\n {t(\n 'attachment.actions.giphyPreviewOnlyVisible.ariaLabel',\n 'Giphy preview, only visible to you. Use the Send, Shuffle, or Cancel actions.',\n )}\n </VisuallyHidden>\n )}\n </div>\n </div>\n );\n};\n\n/**\n * A component for rendering the actions you can take on an attachment.\n */\nexport const AttachmentActions = React.memo(\n UnMemoizedAttachmentActions,\n) as typeof UnMemoizedAttachmentActions;\n"],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useAttachmentContext } from "../../context/AttachmentContext.mjs";
|
|
2
2
|
import { useComponentContext } from "../../context/ComponentContext.mjs";
|
|
3
|
-
import { getAttachmentPreviewUrl, hasPendingUploadState } from "./hooks/useAttachmentUploadState.mjs";
|
|
4
3
|
import { AttachmentUploadProgressIndicator } from "./components/AttachmentUploadProgressIndicator.mjs";
|
|
5
4
|
import { SUPPORTED_VIDEO_FORMATS, getCssDimensionsVariables, isGalleryAttachmentType, isSvgAttachment } from "./utils.mjs";
|
|
6
5
|
import { Audio } from "./Audio.mjs";
|
|
@@ -17,20 +16,35 @@ import { UnsupportedAttachment } from "./UnsupportedAttachment.mjs";
|
|
|
17
16
|
import { VisibilityDisclaimer } from "./VisibilityDisclaimer.mjs";
|
|
18
17
|
import { VideoAttachment } from "./VideoAttachment.mjs";
|
|
19
18
|
import { useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
19
|
+
import { getAttachmentPreviewUrl, isAudioAttachment, isFileAttachment, isPendingUpload, isSharedLocationResponseData, isVideoAttachment, isVoiceRecordingAttachment } from "stream-chat";
|
|
20
20
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
21
21
|
import clsx from "clsx";
|
|
22
|
-
import { isAudioAttachment, isFileAttachment, isSharedLocationResponse, isVideoAttachment, isVoiceRecordingAttachment } from "stream-chat";
|
|
23
22
|
//#region src/components/Attachment/AttachmentContainer.tsx
|
|
23
|
+
/**
|
|
24
|
+
* Whether there is anything to render the attachment from: a CDN url, or the local file while
|
|
25
|
+
* its upload is in flight — or after it failed, since a failed message can be retried and the
|
|
26
|
+
* user has to see what they are retrying.
|
|
27
|
+
*
|
|
28
|
+
* Deliberately non-reactive (payload only): `UploadManager` drops its record a microtask before
|
|
29
|
+
* the resolved URL is written back, and gating on the live record would blink the attachment out
|
|
30
|
+
* of the DOM in between.
|
|
31
|
+
*/
|
|
32
|
+
var hasRenderableSource = (attachment) => isPendingUpload(attachment) || !!getAttachmentPreviewUrl(attachment, attachment.asset_url);
|
|
24
33
|
var AttachmentWithinContainer = ({ attachment, children, componentType }) => {
|
|
25
|
-
const isGAT = isGalleryAttachmentType(attachment);
|
|
26
34
|
let extra = "";
|
|
27
|
-
|
|
35
|
+
let isSvg = false;
|
|
36
|
+
if (!isSharedLocationResponseData(attachment)) {
|
|
37
|
+
if (!isGalleryAttachmentType(attachment)) {
|
|
38
|
+
extra = componentType === "card" && !attachment?.image_url && !attachment?.thumb_url ? "no-image" : attachment?.actions?.length ? "actions" : "";
|
|
39
|
+
isSvg = isSvgAttachment(attachment);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
28
42
|
return /* @__PURE__ */ jsx("div", {
|
|
29
43
|
className: clsx("str-chat__message-attachment str-chat__message-attachment-dynamic-size", {
|
|
30
44
|
[`str-chat__message-attachment--${componentType}`]: componentType,
|
|
31
45
|
[`str-chat__message-attachment--${attachment?.type}`]: attachment?.type,
|
|
32
46
|
[`str-chat__message-attachment--${componentType}--${extra}`]: componentType && extra,
|
|
33
|
-
"str-chat__message-attachment--svg-image":
|
|
47
|
+
"str-chat__message-attachment--svg-image": isSvg,
|
|
34
48
|
"str-chat__message-attachment-with-actions": extra === "actions"
|
|
35
49
|
}),
|
|
36
50
|
children
|
|
@@ -107,16 +121,6 @@ var GiphyContainer = (props) => {
|
|
|
107
121
|
children: /* @__PURE__ */ jsx(Giphy$1, { attachment })
|
|
108
122
|
});
|
|
109
123
|
};
|
|
110
|
-
/**
|
|
111
|
-
* Whether there is anything to render the attachment from: a CDN url, or the local file while
|
|
112
|
-
* its upload is in flight — or after it failed, since a failed message can be retried and the
|
|
113
|
-
* user has to see what they are retrying.
|
|
114
|
-
*
|
|
115
|
-
* Deliberately non-reactive (payload only): `UploadManager` drops its record a microtask before
|
|
116
|
-
* the resolved URL is written back, and gating on the live record would blink the attachment out
|
|
117
|
-
* of the DOM in between.
|
|
118
|
-
*/
|
|
119
|
-
var hasRenderableSource = (attachment) => hasPendingUploadState(attachment) || !!getAttachmentPreviewUrl(attachment, attachment.asset_url);
|
|
120
124
|
var FileContainer = (props) => {
|
|
121
125
|
const { attachment } = props;
|
|
122
126
|
if (isVoiceRecordingAttachment(attachment)) return hasRenderableSource(attachment) ? /* @__PURE__ */ jsx(VoiceRecordingContainer, { ...props }) : null;
|
|
@@ -147,7 +151,7 @@ var ImageContainer = (props) => {
|
|
|
147
151
|
const { AttachmentUploadProgressIndicator: AttachmentUploadProgressIndicator$2 = AttachmentUploadProgressIndicator } = useComponentContext();
|
|
148
152
|
const componentType = "image";
|
|
149
153
|
const imageElement = useRef(null);
|
|
150
|
-
const { imageAttachmentSizeHandler } =
|
|
154
|
+
const { imageAttachmentSizeHandler } = useAttachmentContext();
|
|
151
155
|
const [attachmentConfiguration, setAttachmentConfiguration] = useState(void 0);
|
|
152
156
|
useLayoutEffect(() => {
|
|
153
157
|
if (imageElement.current && imageAttachmentSizeHandler) setAttachmentConfiguration(imageAttachmentSizeHandler(attachment, imageElement.current));
|