stream-chat-react 13.14.3 → 14.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/WithAudioPlayback-C1hfFIcu.mjs +4716 -0
- package/dist/WithAudioPlayback-C1hfFIcu.mjs.map +1 -0
- package/dist/WithAudioPlayback-myzUS2m6.js +4732 -0
- package/dist/WithAudioPlayback-myzUS2m6.js.map +1 -0
- package/dist/audioProcessing-BbOs2wMd.js +123 -0
- package/dist/audioProcessing-BbOs2wMd.js.map +1 -0
- package/dist/audioProcessing-ByEVSjGG.mjs +124 -0
- package/dist/audioProcessing-ByEVSjGG.mjs.map +1 -0
- package/dist/cjs/emojis.js +229 -0
- package/dist/cjs/emojis.js.map +1 -0
- package/dist/cjs/index.js +28604 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/mp3-encoder.js +63 -0
- package/dist/cjs/mp3-encoder.js.map +1 -0
- package/dist/css/index.css +9339 -0
- package/dist/css/index.css.map +1 -0
- package/dist/es/emojis.mjs +207 -0
- package/dist/es/emojis.mjs.map +1 -0
- package/dist/es/index.mjs +28589 -0
- package/dist/es/index.mjs.map +1 -0
- package/dist/es/mp3-encoder.mjs +41 -0
- package/dist/es/mp3-encoder.mjs.map +1 -0
- package/dist/types/components/AIStateIndicator/AIStateIndicator.d.ts +6 -0
- package/dist/types/components/AIStateIndicator/AIStateIndicator.d.ts.map +1 -0
- package/dist/types/components/AIStateIndicator/hooks/useAIState.d.ts +18 -0
- package/dist/types/components/AIStateIndicator/hooks/useAIState.d.ts.map +1 -0
- package/dist/types/components/AIStateIndicator/index.d.ts +3 -0
- package/dist/types/components/AIStateIndicator/index.d.ts.map +1 -0
- package/dist/types/components/Attachment/Attachment.d.ts +57 -0
- package/dist/types/components/Attachment/Attachment.d.ts.map +1 -0
- package/dist/types/components/Attachment/AttachmentActions.d.ts +21 -0
- package/dist/types/components/Attachment/AttachmentActions.d.ts.map +1 -0
- package/dist/types/components/Attachment/AttachmentContainer.d.ts +25 -0
- package/dist/types/components/Attachment/AttachmentContainer.d.ts.map +1 -0
- package/dist/types/components/Attachment/Audio.d.ts +9 -0
- package/dist/types/components/Attachment/Audio.d.ts.map +1 -0
- package/dist/types/components/Attachment/FileAttachment.d.ts +6 -0
- package/dist/types/components/Attachment/FileAttachment.d.ts.map +1 -0
- package/dist/types/components/Attachment/Geolocation.d.ts +13 -0
- package/dist/types/components/Attachment/Geolocation.d.ts.map +1 -0
- package/dist/types/components/Attachment/Giphy.d.ts +6 -0
- package/dist/types/components/Attachment/Giphy.d.ts.map +1 -0
- package/dist/types/components/Attachment/Image.d.ts +7 -0
- package/dist/types/components/Attachment/Image.d.ts.map +1 -0
- package/dist/types/components/Attachment/LinkPreview/Card.d.ts +9 -0
- package/dist/types/components/Attachment/LinkPreview/Card.d.ts.map +1 -0
- package/dist/types/components/Attachment/LinkPreview/CardAudio.d.ts +3 -0
- package/dist/types/components/Attachment/LinkPreview/CardAudio.d.ts.map +1 -0
- package/dist/types/components/Attachment/LinkPreview/UnableToRenderCard.d.ts +5 -0
- package/dist/types/components/Attachment/LinkPreview/UnableToRenderCard.d.ts.map +1 -0
- package/dist/types/components/Attachment/LinkPreview/index.d.ts +2 -0
- package/dist/types/components/Attachment/LinkPreview/index.d.ts.map +1 -0
- package/dist/types/components/Attachment/ModalGallery.d.ts +11 -0
- package/dist/types/components/Attachment/ModalGallery.d.ts.map +1 -0
- package/dist/types/components/Attachment/UnsupportedAttachment.d.ts +6 -0
- package/dist/types/components/Attachment/UnsupportedAttachment.d.ts.map +1 -0
- package/dist/types/components/Attachment/VideoAttachment.d.ts +9 -0
- package/dist/types/components/Attachment/VideoAttachment.d.ts.map +1 -0
- package/dist/types/components/Attachment/VisibilityDisclaimer.d.ts +2 -0
- package/dist/types/components/Attachment/VisibilityDisclaimer.d.ts.map +1 -0
- package/dist/types/components/Attachment/VoiceRecording.d.ts +16 -0
- package/dist/types/components/Attachment/VoiceRecording.d.ts.map +1 -0
- package/dist/types/components/Attachment/attachment-sizing.d.ts +9 -0
- package/dist/types/components/Attachment/attachment-sizing.d.ts.map +1 -0
- package/dist/types/components/Attachment/audioSampling.d.ts +10 -0
- package/dist/types/components/Attachment/audioSampling.d.ts.map +1 -0
- package/dist/types/components/Attachment/components/DownloadButton.d.ts +6 -0
- package/dist/types/components/Attachment/components/DownloadButton.d.ts.map +1 -0
- package/dist/types/components/Attachment/components/FileSizeIndicator.d.ts +12 -0
- package/dist/types/components/Attachment/components/FileSizeIndicator.d.ts.map +1 -0
- package/dist/types/components/Attachment/components/index.d.ts +3 -0
- package/dist/types/components/Attachment/components/index.d.ts.map +1 -0
- package/dist/types/components/Attachment/icons.d.ts +4 -0
- package/dist/types/components/Attachment/icons.d.ts.map +1 -0
- package/dist/types/components/Attachment/index.d.ts +16 -0
- package/dist/types/components/Attachment/index.d.ts.map +1 -0
- package/dist/types/components/Attachment/utils.d.ts +29 -0
- package/dist/types/components/Attachment/utils.d.ts.map +1 -0
- package/dist/types/components/AudioPlayback/AudioPlayer.d.ts +125 -0
- package/dist/types/components/AudioPlayback/AudioPlayer.d.ts.map +1 -0
- package/dist/types/components/AudioPlayback/AudioPlayerPool.d.ts +50 -0
- package/dist/types/components/AudioPlayback/AudioPlayerPool.d.ts.map +1 -0
- package/dist/types/components/AudioPlayback/WithAudioPlayback.d.ts +25 -0
- package/dist/types/components/AudioPlayback/WithAudioPlayback.d.ts.map +1 -0
- package/dist/types/components/AudioPlayback/components/DurationDisplay.d.ts +15 -0
- package/dist/types/components/AudioPlayback/components/DurationDisplay.d.ts.map +1 -0
- package/dist/types/components/AudioPlayback/components/PlaybackRateButton.d.ts +4 -0
- package/dist/types/components/AudioPlayback/components/PlaybackRateButton.d.ts.map +1 -0
- package/dist/types/components/AudioPlayback/components/ProgressBar.d.ts +11 -0
- package/dist/types/components/AudioPlayback/components/ProgressBar.d.ts.map +1 -0
- package/dist/types/components/AudioPlayback/components/WaveProgressBar.d.ts +17 -0
- package/dist/types/components/AudioPlayback/components/WaveProgressBar.d.ts.map +1 -0
- package/dist/types/components/AudioPlayback/components/index.d.ts +5 -0
- package/dist/types/components/AudioPlayback/components/index.d.ts.map +1 -0
- package/dist/types/components/AudioPlayback/components/useInteractiveProgressBar.d.ts +19 -0
- package/dist/types/components/AudioPlayback/components/useInteractiveProgressBar.d.ts.map +1 -0
- package/dist/types/components/AudioPlayback/index.d.ts +5 -0
- package/dist/types/components/AudioPlayback/index.d.ts.map +1 -0
- package/dist/types/components/AudioPlayback/plugins/AudioPlayerNotificationsPlugin.d.ts +10 -0
- package/dist/types/components/AudioPlayback/plugins/AudioPlayerNotificationsPlugin.d.ts.map +1 -0
- package/dist/types/components/AudioPlayback/plugins/AudioPlayerPlugin.d.ts +11 -0
- package/dist/types/components/AudioPlayback/plugins/AudioPlayerPlugin.d.ts.map +1 -0
- package/dist/types/components/AudioPlayback/plugins/index.d.ts +2 -0
- package/dist/types/components/AudioPlayback/plugins/index.d.ts.map +1 -0
- package/dist/types/components/Avatar/Avatar.d.ts +15 -0
- package/dist/types/components/Avatar/Avatar.d.ts.map +1 -0
- package/dist/types/components/Avatar/AvatarStack.d.ts +14 -0
- package/dist/types/components/Avatar/AvatarStack.d.ts.map +1 -0
- package/dist/types/components/Avatar/ChannelAvatar.d.ts +10 -0
- package/dist/types/components/Avatar/ChannelAvatar.d.ts.map +1 -0
- package/dist/types/components/Avatar/GroupAvatar.d.ts +21 -0
- package/dist/types/components/Avatar/GroupAvatar.d.ts.map +1 -0
- package/dist/types/components/Avatar/index.d.ts +5 -0
- package/dist/types/components/Avatar/index.d.ts.map +1 -0
- package/dist/types/components/Badge/Badge.d.ts +16 -0
- package/dist/types/components/Badge/Badge.d.ts.map +1 -0
- package/dist/types/components/Badge/index.d.ts +2 -0
- package/dist/types/components/Badge/index.d.ts.map +1 -0
- package/dist/types/components/BaseImage/BaseImage.d.ts +6 -0
- package/dist/types/components/BaseImage/BaseImage.d.ts.map +1 -0
- package/dist/types/components/BaseImage/ImagePlaceholder.d.ts +5 -0
- package/dist/types/components/BaseImage/ImagePlaceholder.d.ts.map +1 -0
- package/dist/types/components/BaseImage/index.d.ts +4 -0
- package/dist/types/components/BaseImage/index.d.ts.map +1 -0
- package/dist/types/components/BaseImage/toBaseImageDescriptors.d.ts +20 -0
- package/dist/types/components/BaseImage/toBaseImageDescriptors.d.ts.map +1 -0
- package/dist/types/components/Button/Button.d.ts +18 -0
- package/dist/types/components/Button/Button.d.ts.map +1 -0
- package/dist/types/components/Button/PlayButton.d.ts +6 -0
- package/dist/types/components/Button/PlayButton.d.ts.map +1 -0
- package/dist/types/components/Button/ToggleSidebarButton.d.ts +10 -0
- package/dist/types/components/Button/ToggleSidebarButton.d.ts.map +1 -0
- package/dist/types/components/Button/index.d.ts +3 -0
- package/dist/types/components/Button/index.d.ts.map +1 -0
- package/dist/types/components/Channel/Channel.d.ts +62 -0
- package/dist/types/components/Channel/Channel.d.ts.map +1 -0
- package/dist/types/components/Channel/channelState.d.ts +90 -0
- package/dist/types/components/Channel/channelState.d.ts.map +1 -0
- package/dist/types/components/Channel/constants.d.ts +2 -0
- package/dist/types/components/Channel/constants.d.ts.map +1 -0
- package/dist/types/components/Channel/hooks/useChannelContainerClasses.d.ts +10 -0
- package/dist/types/components/Channel/hooks/useChannelContainerClasses.d.ts.map +1 -0
- package/dist/types/components/Channel/hooks/useCreateChannelStateContext.d.ts +6 -0
- package/dist/types/components/Channel/hooks/useCreateChannelStateContext.d.ts.map +1 -0
- package/dist/types/components/Channel/hooks/useCreateTypingContext.d.ts +3 -0
- package/dist/types/components/Channel/hooks/useCreateTypingContext.d.ts.map +1 -0
- package/dist/types/components/Channel/hooks/useEditMessageHandler.d.ts +5 -0
- package/dist/types/components/Channel/hooks/useEditMessageHandler.d.ts.map +1 -0
- package/dist/types/components/Channel/hooks/useIsMounted.d.ts +3 -0
- package/dist/types/components/Channel/hooks/useIsMounted.d.ts.map +1 -0
- package/dist/types/components/Channel/hooks/useMentionsHandlers.d.ts +5 -0
- package/dist/types/components/Channel/hooks/useMentionsHandlers.d.ts.map +1 -0
- package/dist/types/components/Channel/index.d.ts +4 -0
- package/dist/types/components/Channel/index.d.ts.map +1 -0
- package/dist/types/components/Channel/utils.d.ts +33 -0
- package/dist/types/components/Channel/utils.d.ts.map +1 -0
- package/dist/types/components/ChannelHeader/ChannelHeader.d.ts +17 -0
- package/dist/types/components/ChannelHeader/ChannelHeader.d.ts.map +1 -0
- package/dist/types/components/ChannelHeader/hooks/useChannelHeaderOnlineStatus.d.ts +6 -0
- package/dist/types/components/ChannelHeader/hooks/useChannelHeaderOnlineStatus.d.ts.map +1 -0
- package/dist/types/components/ChannelHeader/hooks/useIsMobileViewport.d.ts +3 -0
- package/dist/types/components/ChannelHeader/hooks/useIsMobileViewport.d.ts.map +1 -0
- package/dist/types/components/ChannelHeader/index.d.ts +2 -0
- package/dist/types/components/ChannelHeader/index.d.ts.map +1 -0
- package/dist/types/components/ChannelList/ChannelList.d.ts +81 -0
- package/dist/types/components/ChannelList/ChannelList.d.ts.map +1 -0
- package/dist/types/components/ChannelList/ChannelListHeader.d.ts +6 -0
- package/dist/types/components/ChannelList/ChannelListHeader.d.ts.map +1 -0
- package/dist/types/components/ChannelList/ChannelListUI.d.ts +18 -0
- package/dist/types/components/ChannelList/ChannelListUI.d.ts.map +1 -0
- package/dist/types/components/ChannelList/hooks/index.d.ts +16 -0
- package/dist/types/components/ChannelList/hooks/index.d.ts.map +1 -0
- package/dist/types/components/ChannelList/hooks/useChannelDeletedListener.d.ts +3 -0
- package/dist/types/components/ChannelList/hooks/useChannelDeletedListener.d.ts.map +1 -0
- package/dist/types/components/ChannelList/hooks/useChannelHiddenListener.d.ts +3 -0
- package/dist/types/components/ChannelList/hooks/useChannelHiddenListener.d.ts.map +1 -0
- package/dist/types/components/ChannelList/hooks/useChannelListShape.d.ts +61 -0
- package/dist/types/components/ChannelList/hooks/useChannelListShape.d.ts.map +1 -0
- package/dist/types/components/ChannelList/hooks/useChannelMembersState.d.ts +4 -0
- package/dist/types/components/ChannelList/hooks/useChannelMembersState.d.ts.map +1 -0
- package/dist/types/components/ChannelList/hooks/useChannelMembershipState.d.ts +4 -0
- package/dist/types/components/ChannelList/hooks/useChannelMembershipState.d.ts.map +1 -0
- package/dist/types/components/ChannelList/hooks/useChannelTruncatedListener.d.ts +3 -0
- package/dist/types/components/ChannelList/hooks/useChannelTruncatedListener.d.ts.map +1 -0
- package/dist/types/components/ChannelList/hooks/useChannelUpdatedListener.d.ts +3 -0
- package/dist/types/components/ChannelList/hooks/useChannelUpdatedListener.d.ts.map +1 -0
- package/dist/types/components/ChannelList/hooks/useChannelVisibleListener.d.ts +3 -0
- package/dist/types/components/ChannelList/hooks/useChannelVisibleListener.d.ts.map +1 -0
- package/dist/types/components/ChannelList/hooks/useConnectionRecoveredListener.d.ts +2 -0
- package/dist/types/components/ChannelList/hooks/useConnectionRecoveredListener.d.ts.map +1 -0
- package/dist/types/components/ChannelList/hooks/useMessageNewListener.d.ts +3 -0
- package/dist/types/components/ChannelList/hooks/useMessageNewListener.d.ts.map +1 -0
- package/dist/types/components/ChannelList/hooks/useMobileNavigation.d.ts +2 -0
- package/dist/types/components/ChannelList/hooks/useMobileNavigation.d.ts.map +1 -0
- package/dist/types/components/ChannelList/hooks/useNotificationAddedToChannelListener.d.ts +3 -0
- package/dist/types/components/ChannelList/hooks/useNotificationAddedToChannelListener.d.ts.map +1 -0
- package/dist/types/components/ChannelList/hooks/useNotificationMessageNewListener.d.ts +3 -0
- package/dist/types/components/ChannelList/hooks/useNotificationMessageNewListener.d.ts.map +1 -0
- package/dist/types/components/ChannelList/hooks/useNotificationRemovedFromChannelListener.d.ts +3 -0
- package/dist/types/components/ChannelList/hooks/useNotificationRemovedFromChannelListener.d.ts.map +1 -0
- package/dist/types/components/ChannelList/hooks/usePaginatedChannels.d.ts +19 -0
- package/dist/types/components/ChannelList/hooks/usePaginatedChannels.d.ts.map +1 -0
- package/dist/types/components/ChannelList/hooks/useSelectedChannelState.d.ts +12 -0
- package/dist/types/components/ChannelList/hooks/useSelectedChannelState.d.ts.map +1 -0
- package/dist/types/components/ChannelList/hooks/useUserPresenceChangedListener.d.ts +3 -0
- package/dist/types/components/ChannelList/hooks/useUserPresenceChangedListener.d.ts.map +1 -0
- package/dist/types/components/ChannelList/index.d.ts +5 -0
- package/dist/types/components/ChannelList/index.d.ts.map +1 -0
- package/dist/types/components/ChannelList/utils.d.ts +55 -0
- package/dist/types/components/ChannelList/utils.d.ts.map +1 -0
- package/dist/types/components/ChannelListItem/ChannelListItem.d.ts +55 -0
- package/dist/types/components/ChannelListItem/ChannelListItem.d.ts.map +1 -0
- package/dist/types/components/ChannelListItem/ChannelListItemActionButtons.d.ts +10 -0
- package/dist/types/components/ChannelListItem/ChannelListItemActionButtons.d.ts.map +1 -0
- package/dist/types/components/ChannelListItem/ChannelListItemActionButtons.defaults.d.ts +13 -0
- package/dist/types/components/ChannelListItem/ChannelListItemActionButtons.defaults.d.ts.map +1 -0
- package/dist/types/components/ChannelListItem/ChannelListItemTimestamp.d.ts +7 -0
- package/dist/types/components/ChannelListItem/ChannelListItemTimestamp.d.ts.map +1 -0
- package/dist/types/components/ChannelListItem/ChannelListItemUI.d.ts +7 -0
- package/dist/types/components/ChannelListItem/ChannelListItemUI.d.ts.map +1 -0
- package/dist/types/components/ChannelListItem/hooks/index.d.ts +4 -0
- package/dist/types/components/ChannelListItem/hooks/index.d.ts.map +1 -0
- package/dist/types/components/ChannelListItem/hooks/useChannelDisplayName.d.ts +10 -0
- package/dist/types/components/ChannelListItem/hooks/useChannelDisplayName.d.ts.map +1 -0
- package/dist/types/components/ChannelListItem/hooks/useChannelPreviewInfo.d.ts +16 -0
- package/dist/types/components/ChannelListItem/hooks/useChannelPreviewInfo.d.ts.map +1 -0
- package/dist/types/components/ChannelListItem/hooks/useIsChannelMuted.d.ts +7 -0
- package/dist/types/components/ChannelListItem/hooks/useIsChannelMuted.d.ts.map +1 -0
- package/dist/types/components/ChannelListItem/hooks/useMessageDeliveryStatus.d.ts +16 -0
- package/dist/types/components/ChannelListItem/hooks/useMessageDeliveryStatus.d.ts.map +1 -0
- package/dist/types/components/ChannelListItem/index.d.ts +7 -0
- package/dist/types/components/ChannelListItem/index.d.ts.map +1 -0
- package/dist/types/components/ChannelListItem/utils.d.ts +21 -0
- package/dist/types/components/ChannelListItem/utils.d.ts.map +1 -0
- package/dist/types/components/Chat/Chat.d.ts +39 -0
- package/dist/types/components/Chat/Chat.d.ts.map +1 -0
- package/dist/types/components/Chat/hooks/useChannelsQueryState.d.ts +12 -0
- package/dist/types/components/Chat/hooks/useChannelsQueryState.d.ts.map +1 -0
- package/dist/types/components/Chat/hooks/useChat.d.ts +30 -0
- package/dist/types/components/Chat/hooks/useChat.d.ts.map +1 -0
- package/dist/types/components/Chat/hooks/useCreateChatClient.d.ts +12 -0
- package/dist/types/components/Chat/hooks/useCreateChatClient.d.ts.map +1 -0
- package/dist/types/components/Chat/hooks/useCreateChatContext.d.ts +3 -0
- package/dist/types/components/Chat/hooks/useCreateChatContext.d.ts.map +1 -0
- package/dist/types/components/Chat/hooks/useSplitActionSet.d.ts +13 -0
- package/dist/types/components/Chat/hooks/useSplitActionSet.d.ts.map +1 -0
- package/dist/types/components/Chat/index.d.ts +4 -0
- package/dist/types/components/Chat/index.d.ts.map +1 -0
- package/dist/types/components/ChatView/ChatView.d.ts +50 -0
- package/dist/types/components/ChatView/ChatView.d.ts.map +1 -0
- package/dist/types/components/ChatView/index.d.ts +2 -0
- package/dist/types/components/ChatView/index.d.ts.map +1 -0
- package/dist/types/components/DateSeparator/DateSeparator.d.ts +20 -0
- package/dist/types/components/DateSeparator/DateSeparator.d.ts.map +1 -0
- package/dist/types/components/DateSeparator/index.d.ts +2 -0
- package/dist/types/components/DateSeparator/index.d.ts.map +1 -0
- package/dist/types/components/Dialog/components/Alert.d.ts +14 -0
- package/dist/types/components/Dialog/components/Alert.d.ts.map +1 -0
- package/dist/types/components/Dialog/components/Callout.d.ts +21 -0
- package/dist/types/components/Dialog/components/Callout.d.ts.map +1 -0
- package/dist/types/components/Dialog/components/ContextMenu.d.ts +54 -0
- package/dist/types/components/Dialog/components/ContextMenu.d.ts.map +1 -0
- package/dist/types/components/Dialog/components/Prompt.d.ts +28 -0
- package/dist/types/components/Dialog/components/Prompt.d.ts.map +1 -0
- package/dist/types/components/Dialog/components/Viewer.d.ts +29 -0
- package/dist/types/components/Dialog/components/Viewer.d.ts.map +1 -0
- package/dist/types/components/Dialog/components/index.d.ts +88 -0
- package/dist/types/components/Dialog/components/index.d.ts.map +1 -0
- package/dist/types/components/Dialog/hooks/index.d.ts +3 -0
- package/dist/types/components/Dialog/hooks/index.d.ts.map +1 -0
- package/dist/types/components/Dialog/hooks/useDialog.d.ts +17 -0
- package/dist/types/components/Dialog/hooks/useDialog.d.ts.map +1 -0
- package/dist/types/components/Dialog/hooks/usePopoverPosition.d.ts +70 -0
- package/dist/types/components/Dialog/hooks/usePopoverPosition.d.ts.map +1 -0
- package/dist/types/components/Dialog/index.d.ts +4 -0
- package/dist/types/components/Dialog/index.d.ts.map +1 -0
- package/dist/types/components/Dialog/service/DialogAnchor.d.ts +25 -0
- package/dist/types/components/Dialog/service/DialogAnchor.d.ts.map +1 -0
- package/dist/types/components/Dialog/service/DialogManager.d.ts +54 -0
- package/dist/types/components/Dialog/service/DialogManager.d.ts.map +1 -0
- package/dist/types/components/Dialog/service/DialogPortal.d.ts +9 -0
- package/dist/types/components/Dialog/service/DialogPortal.d.ts.map +1 -0
- package/dist/types/components/Dialog/service/index.d.ts +4 -0
- package/dist/types/components/Dialog/service/index.d.ts.map +1 -0
- package/dist/types/components/DragAndDrop/DragAndDropContainer.d.ts +8 -0
- package/dist/types/components/DragAndDrop/DragAndDropContainer.d.ts.map +1 -0
- package/dist/types/components/EmptyStateIndicator/EmptyStateIndicator.d.ts +7 -0
- package/dist/types/components/EmptyStateIndicator/EmptyStateIndicator.d.ts.map +1 -0
- package/dist/types/components/EmptyStateIndicator/index.d.ts +2 -0
- package/dist/types/components/EmptyStateIndicator/index.d.ts.map +1 -0
- package/dist/types/components/EventComponent/EventComponent.d.ts +10 -0
- package/dist/types/components/EventComponent/EventComponent.d.ts.map +1 -0
- package/dist/types/components/EventComponent/index.d.ts +2 -0
- package/dist/types/components/EventComponent/index.d.ts.map +1 -0
- package/dist/types/components/FileIcon/FileIcon.d.ts +21 -0
- package/dist/types/components/FileIcon/FileIcon.d.ts.map +1 -0
- package/dist/types/components/FileIcon/FileIconSet.d.ts +32 -0
- package/dist/types/components/FileIcon/FileIconSet.d.ts.map +1 -0
- package/dist/types/components/FileIcon/iconMap.d.ts +9 -0
- package/dist/types/components/FileIcon/iconMap.d.ts.map +1 -0
- package/dist/types/components/FileIcon/index.d.ts +4 -0
- package/dist/types/components/FileIcon/index.d.ts.map +1 -0
- package/dist/types/components/FileIcon/mimeTypes.d.ts +9 -0
- package/dist/types/components/FileIcon/mimeTypes.d.ts.map +1 -0
- package/dist/types/components/Form/Dropdown.d.ts +22 -0
- package/dist/types/components/Form/Dropdown.d.ts.map +1 -0
- package/dist/types/components/Form/FieldError.d.ts +7 -0
- package/dist/types/components/Form/FieldError.d.ts.map +1 -0
- package/dist/types/components/Form/NumericInput.d.ts +17 -0
- package/dist/types/components/Form/NumericInput.d.ts.map +1 -0
- package/dist/types/components/Form/SwitchField.d.ts +31 -0
- package/dist/types/components/Form/SwitchField.d.ts.map +1 -0
- package/dist/types/components/Form/TextInput.d.ts +31 -0
- package/dist/types/components/Form/TextInput.d.ts.map +1 -0
- package/dist/types/components/Form/TextInputFieldSet.d.ts +6 -0
- package/dist/types/components/Form/TextInputFieldSet.d.ts.map +1 -0
- package/dist/types/components/Form/hooks/index.d.ts +2 -0
- package/dist/types/components/Form/hooks/index.d.ts.map +1 -0
- package/dist/types/components/Form/hooks/useFormState.d.ts +18 -0
- package/dist/types/components/Form/hooks/useFormState.d.ts.map +1 -0
- package/dist/types/components/Form/index.d.ts +6 -0
- package/dist/types/components/Form/index.d.ts.map +1 -0
- package/dist/types/components/Gallery/Gallery.d.ts +18 -0
- package/dist/types/components/Gallery/Gallery.d.ts.map +1 -0
- package/dist/types/components/Gallery/GalleryContext.d.ts +43 -0
- package/dist/types/components/Gallery/GalleryContext.d.ts.map +1 -0
- package/dist/types/components/Gallery/GalleryHeader.d.ts +7 -0
- package/dist/types/components/Gallery/GalleryHeader.d.ts.map +1 -0
- package/dist/types/components/Gallery/GalleryUI.d.ts +2 -0
- package/dist/types/components/Gallery/GalleryUI.d.ts.map +1 -0
- package/dist/types/components/Gallery/index.d.ts +4 -0
- package/dist/types/components/Gallery/index.d.ts.map +1 -0
- package/dist/types/components/Icons/BaseIcon.d.ts +3 -0
- package/dist/types/components/Icons/BaseIcon.d.ts.map +1 -0
- package/dist/types/components/Icons/IconGiphy.d.ts +3 -0
- package/dist/types/components/Icons/IconGiphy.d.ts.map +1 -0
- package/dist/types/components/Icons/createIcon.d.ts +6 -0
- package/dist/types/components/Icons/createIcon.d.ts.map +1 -0
- package/dist/types/components/Icons/icons.d.ts +626 -0
- package/dist/types/components/Icons/icons.d.ts.map +1 -0
- package/dist/types/components/Icons/index.d.ts +4 -0
- package/dist/types/components/Icons/index.d.ts.map +1 -0
- package/dist/types/components/InfiniteScrollPaginator/InfiniteScroll.d.ts +46 -0
- package/dist/types/components/InfiniteScrollPaginator/InfiniteScroll.d.ts.map +1 -0
- package/dist/types/components/InfiniteScrollPaginator/InfiniteScrollPaginator.d.ts +13 -0
- package/dist/types/components/InfiniteScrollPaginator/InfiniteScrollPaginator.d.ts.map +1 -0
- package/dist/types/components/InfiniteScrollPaginator/hooks/useCursorPaginator.d.ts +19 -0
- package/dist/types/components/InfiniteScrollPaginator/hooks/useCursorPaginator.d.ts.map +1 -0
- package/dist/types/components/InfiniteScrollPaginator/index.d.ts +2 -0
- package/dist/types/components/InfiniteScrollPaginator/index.d.ts.map +1 -0
- package/dist/types/components/LoadMore/LoadMoreButton.d.ts +15 -0
- package/dist/types/components/LoadMore/LoadMoreButton.d.ts.map +1 -0
- package/dist/types/components/LoadMore/LoadMorePaginator.d.ts +13 -0
- package/dist/types/components/LoadMore/LoadMorePaginator.d.ts.map +1 -0
- package/dist/types/components/LoadMore/index.d.ts +3 -0
- package/dist/types/components/LoadMore/index.d.ts.map +1 -0
- package/dist/types/components/Loading/LoadingChannel.d.ts +2 -0
- package/dist/types/components/Loading/LoadingChannel.d.ts.map +1 -0
- package/dist/types/components/Loading/LoadingChannels.d.ts +2 -0
- package/dist/types/components/Loading/LoadingChannels.d.ts.map +1 -0
- package/dist/types/components/Loading/LoadingErrorIndicator.d.ts +6 -0
- package/dist/types/components/Loading/LoadingErrorIndicator.d.ts.map +1 -0
- package/dist/types/components/Loading/LoadingIndicator.d.ts +5 -0
- package/dist/types/components/Loading/LoadingIndicator.d.ts.map +1 -0
- package/dist/types/components/Loading/index.d.ts +5 -0
- package/dist/types/components/Loading/index.d.ts.map +1 -0
- package/dist/types/components/Location/ShareLocationDialog.d.ts +19 -0
- package/dist/types/components/Location/ShareLocationDialog.d.ts.map +1 -0
- package/dist/types/components/Location/hooks/useLiveLocationSharingManager.d.ts +19 -0
- package/dist/types/components/Location/hooks/useLiveLocationSharingManager.d.ts.map +1 -0
- package/dist/types/components/Location/index.d.ts +2 -0
- package/dist/types/components/Location/index.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/AudioRecorder/AudioRecorder.d.ts +2 -0
- package/dist/types/components/MediaRecorder/AudioRecorder/AudioRecorder.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/AudioRecorder/AudioRecorderRecordingControls.d.ts +2 -0
- package/dist/types/components/MediaRecorder/AudioRecorder/AudioRecorderRecordingControls.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/AudioRecorder/AudioRecordingButtonWithNotification.d.ts +5 -0
- package/dist/types/components/MediaRecorder/AudioRecorder/AudioRecordingButtonWithNotification.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/AudioRecorder/AudioRecordingPlayback.d.ts +8 -0
- package/dist/types/components/MediaRecorder/AudioRecorder/AudioRecordingPlayback.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/AudioRecorder/AudioRecordingPreview.d.ts +2 -0
- package/dist/types/components/MediaRecorder/AudioRecorder/AudioRecordingPreview.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/AudioRecorder/RecordingTimer.d.ts +5 -0
- package/dist/types/components/MediaRecorder/AudioRecorder/RecordingTimer.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/AudioRecorder/hooks/useTimeElapsed.d.ts +11 -0
- package/dist/types/components/MediaRecorder/AudioRecorder/hooks/useTimeElapsed.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/AudioRecorder/index.d.ts +5 -0
- package/dist/types/components/MediaRecorder/AudioRecorder/index.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/AudioRecorder/recordingStateIdentity.d.ts +5 -0
- package/dist/types/components/MediaRecorder/AudioRecorder/recordingStateIdentity.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/RecordingPermissionDeniedNotification.d.ts +6 -0
- package/dist/types/components/MediaRecorder/RecordingPermissionDeniedNotification.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/classes/AmplitudeRecorder.d.ts +55 -0
- package/dist/types/components/MediaRecorder/classes/AmplitudeRecorder.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/classes/BrowserPermission.d.ts +23 -0
- package/dist/types/components/MediaRecorder/classes/BrowserPermission.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/classes/MediaRecorderController.d.ts +76 -0
- package/dist/types/components/MediaRecorder/classes/MediaRecorderController.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/classes/index.d.ts +4 -0
- package/dist/types/components/MediaRecorder/classes/index.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/hooks/index.d.ts +2 -0
- package/dist/types/components/MediaRecorder/hooks/index.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/hooks/useMediaRecorder.d.ts +19 -0
- package/dist/types/components/MediaRecorder/hooks/useMediaRecorder.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/index.d.ts +7 -0
- package/dist/types/components/MediaRecorder/index.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/observable/BehaviorSubject.d.ts +11 -0
- package/dist/types/components/MediaRecorder/observable/BehaviorSubject.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/observable/Observable.d.ts +18 -0
- package/dist/types/components/MediaRecorder/observable/Observable.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/observable/Observer.d.ts +10 -0
- package/dist/types/components/MediaRecorder/observable/Observer.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/observable/Subject.d.ts +17 -0
- package/dist/types/components/MediaRecorder/observable/Subject.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/observable/Subscription.d.ts +11 -0
- package/dist/types/components/MediaRecorder/observable/Subscription.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/observable/index.d.ts +6 -0
- package/dist/types/components/MediaRecorder/observable/index.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/transcode/audioProcessing.d.ts +16 -0
- package/dist/types/components/MediaRecorder/transcode/audioProcessing.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/transcode/index.d.ts +9 -0
- package/dist/types/components/MediaRecorder/transcode/index.d.ts.map +1 -0
- package/dist/types/components/MediaRecorder/transcode/wav.d.ts +8 -0
- package/dist/types/components/MediaRecorder/transcode/wav.d.ts.map +1 -0
- package/dist/types/components/Message/Message.d.ts +7 -0
- package/dist/types/components/Message/Message.d.ts.map +1 -0
- package/dist/types/components/Message/MessageAlsoSentInChannelIndicator.d.ts +5 -0
- package/dist/types/components/Message/MessageAlsoSentInChannelIndicator.d.ts.map +1 -0
- package/dist/types/components/Message/MessageBlocked.d.ts +2 -0
- package/dist/types/components/Message/MessageBlocked.d.ts.map +1 -0
- package/dist/types/components/Message/MessageBubble.d.ts +3 -0
- package/dist/types/components/Message/MessageBubble.d.ts.map +1 -0
- package/dist/types/components/Message/MessageDeletedBubble.d.ts +6 -0
- package/dist/types/components/Message/MessageDeletedBubble.d.ts.map +1 -0
- package/dist/types/components/Message/MessageEditedIndicator.d.ts +8 -0
- package/dist/types/components/Message/MessageEditedIndicator.d.ts.map +1 -0
- package/dist/types/components/Message/MessageErrorText.d.ts +1 -0
- package/dist/types/components/Message/MessageErrorText.d.ts.map +1 -0
- package/dist/types/components/Message/MessageRepliesCountButton.d.ts +13 -0
- package/dist/types/components/Message/MessageRepliesCountButton.d.ts.map +1 -0
- package/dist/types/components/Message/MessageStatus.d.ts +12 -0
- package/dist/types/components/Message/MessageStatus.d.ts.map +1 -0
- package/dist/types/components/Message/MessageText.d.ts +9 -0
- package/dist/types/components/Message/MessageText.d.ts.map +1 -0
- package/dist/types/components/Message/MessageTimestamp.d.ts +8 -0
- package/dist/types/components/Message/MessageTimestamp.d.ts.map +1 -0
- package/dist/types/components/Message/MessageTranslationIndicator.d.ts +6 -0
- package/dist/types/components/Message/MessageTranslationIndicator.d.ts.map +1 -0
- package/dist/types/components/Message/MessageUI.d.ts +6 -0
- package/dist/types/components/Message/MessageUI.d.ts.map +1 -0
- package/dist/types/components/Message/PinIndicator.d.ts +10 -0
- package/dist/types/components/Message/PinIndicator.d.ts.map +1 -0
- package/dist/types/components/Message/QuotedMessage.d.ts +4 -0
- package/dist/types/components/Message/QuotedMessage.d.ts.map +1 -0
- package/dist/types/components/Message/ReminderNotification.d.ts +6 -0
- package/dist/types/components/Message/ReminderNotification.d.ts.map +1 -0
- package/dist/types/components/Message/StreamedMessageText.d.ts +7 -0
- package/dist/types/components/Message/StreamedMessageText.d.ts.map +1 -0
- package/dist/types/components/Message/Timestamp.d.ts +7 -0
- package/dist/types/components/Message/Timestamp.d.ts.map +1 -0
- package/dist/types/components/Message/hooks/index.d.ts +16 -0
- package/dist/types/components/Message/hooks/index.d.ts.map +1 -0
- package/dist/types/components/Message/hooks/useActionHandler.d.ts +7 -0
- package/dist/types/components/Message/hooks/useActionHandler.d.ts.map +1 -0
- package/dist/types/components/Message/hooks/useDeleteHandler.d.ts +8 -0
- package/dist/types/components/Message/hooks/useDeleteHandler.d.ts.map +1 -0
- package/dist/types/components/Message/hooks/useFlagHandler.d.ts +10 -0
- package/dist/types/components/Message/hooks/useFlagHandler.d.ts.map +1 -0
- package/dist/types/components/Message/hooks/useMarkUnreadHandler.d.ts +9 -0
- package/dist/types/components/Message/hooks/useMarkUnreadHandler.d.ts.map +1 -0
- package/dist/types/components/Message/hooks/useMentionsHandler.d.ts +13 -0
- package/dist/types/components/Message/hooks/useMentionsHandler.d.ts.map +1 -0
- package/dist/types/components/Message/hooks/useMessageReminder.d.ts +2 -0
- package/dist/types/components/Message/hooks/useMessageReminder.d.ts.map +1 -0
- package/dist/types/components/Message/hooks/useMessageTextStreaming.d.ts +17 -0
- package/dist/types/components/Message/hooks/useMessageTextStreaming.d.ts.map +1 -0
- package/dist/types/components/Message/hooks/useMuteHandler.d.ts +10 -0
- package/dist/types/components/Message/hooks/useMuteHandler.d.ts.map +1 -0
- package/dist/types/components/Message/hooks/useOpenThreadHandler.d.ts +4 -0
- package/dist/types/components/Message/hooks/useOpenThreadHandler.d.ts.map +1 -0
- package/dist/types/components/Message/hooks/usePinHandler.d.ts +29 -0
- package/dist/types/components/Message/hooks/usePinHandler.d.ts.map +1 -0
- package/dist/types/components/Message/hooks/useReactionHandler.d.ts +5 -0
- package/dist/types/components/Message/hooks/useReactionHandler.d.ts.map +1 -0
- package/dist/types/components/Message/hooks/useReactionsFetcher.d.ts +9 -0
- package/dist/types/components/Message/hooks/useReactionsFetcher.d.ts.map +1 -0
- package/dist/types/components/Message/hooks/useRetryHandler.d.ts +3 -0
- package/dist/types/components/Message/hooks/useRetryHandler.d.ts.map +1 -0
- package/dist/types/components/Message/hooks/useUserHandler.d.ts +13 -0
- package/dist/types/components/Message/hooks/useUserHandler.d.ts.map +1 -0
- package/dist/types/components/Message/hooks/useUserRole.d.ts +18 -0
- package/dist/types/components/Message/hooks/useUserRole.d.ts.map +1 -0
- package/dist/types/components/Message/index.d.ts +21 -0
- package/dist/types/components/Message/index.d.ts.map +1 -0
- package/dist/types/components/Message/renderText/componentRenderers/Anchor.d.ts +3 -0
- package/dist/types/components/Message/renderText/componentRenderers/Anchor.d.ts.map +1 -0
- package/dist/types/components/Message/renderText/componentRenderers/Emoji.d.ts +3 -0
- package/dist/types/components/Message/renderText/componentRenderers/Emoji.d.ts.map +1 -0
- package/dist/types/components/Message/renderText/componentRenderers/Mention.d.ts +9 -0
- package/dist/types/components/Message/renderText/componentRenderers/Mention.d.ts.map +1 -0
- package/dist/types/components/Message/renderText/componentRenderers/index.d.ts +4 -0
- package/dist/types/components/Message/renderText/componentRenderers/index.d.ts.map +1 -0
- package/dist/types/components/Message/renderText/index.d.ts +6 -0
- package/dist/types/components/Message/renderText/index.d.ts.map +1 -0
- package/dist/types/components/Message/renderText/regex.d.ts +5 -0
- package/dist/types/components/Message/renderText/regex.d.ts.map +1 -0
- package/dist/types/components/Message/renderText/rehypePlugins/emojiMarkdownPlugin.d.ts +3 -0
- package/dist/types/components/Message/renderText/rehypePlugins/emojiMarkdownPlugin.d.ts.map +1 -0
- package/dist/types/components/Message/renderText/rehypePlugins/index.d.ts +3 -0
- package/dist/types/components/Message/renderText/rehypePlugins/index.d.ts.map +1 -0
- package/dist/types/components/Message/renderText/rehypePlugins/mentionsMarkdownPlugin.d.ts +4 -0
- package/dist/types/components/Message/renderText/rehypePlugins/mentionsMarkdownPlugin.d.ts.map +1 -0
- package/dist/types/components/Message/renderText/remarkPlugins/htmlToTextPlugin.d.ts +3 -0
- package/dist/types/components/Message/renderText/remarkPlugins/htmlToTextPlugin.d.ts.map +1 -0
- package/dist/types/components/Message/renderText/remarkPlugins/imageToLink.d.ts +13 -0
- package/dist/types/components/Message/renderText/remarkPlugins/imageToLink.d.ts.map +1 -0
- package/dist/types/components/Message/renderText/remarkPlugins/index.d.ts +6 -0
- package/dist/types/components/Message/renderText/remarkPlugins/index.d.ts.map +1 -0
- package/dist/types/components/Message/renderText/remarkPlugins/keepLineBreaksPlugin.d.ts +11 -0
- package/dist/types/components/Message/renderText/remarkPlugins/keepLineBreaksPlugin.d.ts.map +1 -0
- package/dist/types/components/Message/renderText/remarkPlugins/plusPlusToEmphasis.d.ts +7 -0
- package/dist/types/components/Message/renderText/remarkPlugins/plusPlusToEmphasis.d.ts.map +1 -0
- package/dist/types/components/Message/renderText/remarkPlugins/remarkIgnoreMarkdown.d.ts +9 -0
- package/dist/types/components/Message/renderText/remarkPlugins/remarkIgnoreMarkdown.d.ts.map +1 -0
- package/dist/types/components/Message/renderText/renderText.d.ts +21 -0
- package/dist/types/components/Message/renderText/renderText.d.ts.map +1 -0
- package/dist/types/components/Message/renderText/types.d.ts +3 -0
- package/dist/types/components/Message/renderText/types.d.ts.map +1 -0
- package/dist/types/components/Message/types.d.ts +106 -0
- package/dist/types/components/Message/types.d.ts.map +1 -0
- package/dist/types/components/Message/utils.d.ts +81 -0
- package/dist/types/components/Message/utils.d.ts.map +1 -0
- package/dist/types/components/MessageActions/DeleteMessageAlert.d.ts +6 -0
- package/dist/types/components/MessageActions/DeleteMessageAlert.d.ts.map +1 -0
- package/dist/types/components/MessageActions/MessageActions.d.ts +27 -0
- package/dist/types/components/MessageActions/MessageActions.d.ts.map +1 -0
- package/dist/types/components/MessageActions/MessageActions.defaults.d.ts +3 -0
- package/dist/types/components/MessageActions/MessageActions.defaults.d.ts.map +1 -0
- package/dist/types/components/MessageActions/QuickMessageActionButton.d.ts +3 -0
- package/dist/types/components/MessageActions/QuickMessageActionButton.d.ts.map +1 -0
- package/dist/types/components/MessageActions/RemindMeSubmenu.d.ts +3 -0
- package/dist/types/components/MessageActions/RemindMeSubmenu.d.ts.map +1 -0
- package/dist/types/components/MessageActions/hooks/index.d.ts +2 -0
- package/dist/types/components/MessageActions/hooks/index.d.ts.map +1 -0
- package/dist/types/components/MessageActions/hooks/useBaseMessageActionSetFilter.d.ts +9 -0
- package/dist/types/components/MessageActions/hooks/useBaseMessageActionSetFilter.d.ts.map +1 -0
- package/dist/types/components/MessageActions/index.d.ts +5 -0
- package/dist/types/components/MessageActions/index.d.ts.map +1 -0
- package/dist/types/components/MessageBounce/MessageBounceModal.d.ts +8 -0
- package/dist/types/components/MessageBounce/MessageBounceModal.d.ts.map +1 -0
- package/dist/types/components/MessageBounce/MessageBouncePrompt.d.ts +4 -0
- package/dist/types/components/MessageBounce/MessageBouncePrompt.d.ts.map +1 -0
- package/dist/types/components/MessageBounce/index.d.ts +3 -0
- package/dist/types/components/MessageBounce/index.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/AttachmentPreviewList.d.ts +15 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/AttachmentPreviewList.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/AudioAttachmentPreview.d.ts +5 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/AudioAttachmentPreview.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/FileAttachmentPreview.d.ts +5 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/FileAttachmentPreview.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/GeolocationPreview.d.ts +13 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/GeolocationPreview.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/ImageAttachmentPreview.d.ts +6 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/ImageAttachmentPreview.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/MediaAttachmentPreview.d.ts +7 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/MediaAttachmentPreview.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/UnsupportedAttachmentPreview.d.ts +8 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/UnsupportedAttachmentPreview.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/VoiceRecordingPreviewSlot.d.ts +13 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/VoiceRecordingPreviewSlot.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/index.d.ts +10 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/index.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/types.d.ts +7 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/types.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/utils/AttachmentPreviewRoot.d.ts +18 -0
- package/dist/types/components/MessageComposer/AttachmentPreviewList/utils/AttachmentPreviewRoot.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/AttachmentSelector/AttachmentSelector.d.ts +44 -0
- package/dist/types/components/MessageComposer/AttachmentSelector/AttachmentSelector.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/AttachmentSelector/CommandsMenu.d.ts +16 -0
- package/dist/types/components/MessageComposer/AttachmentSelector/CommandsMenu.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/AttachmentSelector/index.d.ts +2 -0
- package/dist/types/components/MessageComposer/AttachmentSelector/index.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/CommandChip.d.ts +6 -0
- package/dist/types/components/MessageComposer/CommandChip.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/CooldownTimer.d.ts +2 -0
- package/dist/types/components/MessageComposer/CooldownTimer.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/EditedMessagePreview.d.ts +7 -0
- package/dist/types/components/MessageComposer/EditedMessagePreview.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/LinkPreviewList.d.ts +11 -0
- package/dist/types/components/MessageComposer/LinkPreviewList.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/MessageComposer.d.ts +66 -0
- package/dist/types/components/MessageComposer/MessageComposer.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/MessageComposerActions.d.ts +3 -0
- package/dist/types/components/MessageComposer/MessageComposerActions.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/MessageComposerUI.d.ts +2 -0
- package/dist/types/components/MessageComposer/MessageComposerUI.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/QuotedMessageIndicator.d.ts +4 -0
- package/dist/types/components/MessageComposer/QuotedMessageIndicator.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/QuotedMessagePreview.d.ts +16 -0
- package/dist/types/components/MessageComposer/QuotedMessagePreview.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/RemoveAttachmentPreviewButton.d.ts +6 -0
- package/dist/types/components/MessageComposer/RemoveAttachmentPreviewButton.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/SendButton.d.ts +6 -0
- package/dist/types/components/MessageComposer/SendButton.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/SendToChannelCheckbox.d.ts +2 -0
- package/dist/types/components/MessageComposer/SendToChannelCheckbox.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/StopAIGenerationButton.d.ts +4 -0
- package/dist/types/components/MessageComposer/StopAIGenerationButton.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/WithDragAndDropUpload.d.ts +42 -0
- package/dist/types/components/MessageComposer/WithDragAndDropUpload.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/hooks/index.d.ts +9 -0
- package/dist/types/components/MessageComposer/hooks/index.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/hooks/useAttachmentManagerState.d.ts +11 -0
- package/dist/types/components/MessageComposer/hooks/useAttachmentManagerState.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/hooks/useAttachmentsForPreview.d.ts +18 -0
- package/dist/types/components/MessageComposer/hooks/useAttachmentsForPreview.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/hooks/useCanCreatePoll.d.ts +2 -0
- package/dist/types/components/MessageComposer/hooks/useCanCreatePoll.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/hooks/useCooldownRemaining.d.ts +8 -0
- package/dist/types/components/MessageComposer/hooks/useCooldownRemaining.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/hooks/useCreateMessageComposerContext.d.ts +3 -0
- package/dist/types/components/MessageComposer/hooks/useCreateMessageComposerContext.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/hooks/useIsCooldownActive.d.ts +2 -0
- package/dist/types/components/MessageComposer/hooks/useIsCooldownActive.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/hooks/useMessageComposerBindings.d.ts +11 -0
- package/dist/types/components/MessageComposer/hooks/useMessageComposerBindings.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/hooks/useMessageComposerController.d.ts +3 -0
- package/dist/types/components/MessageComposer/hooks/useMessageComposerController.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/hooks/useMessageComposerHasSendableData.d.ts +2 -0
- package/dist/types/components/MessageComposer/hooks/useMessageComposerHasSendableData.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/hooks/useMessageContentIsEmpty.d.ts +2 -0
- package/dist/types/components/MessageComposer/hooks/useMessageContentIsEmpty.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/hooks/usePasteHandler.d.ts +4 -0
- package/dist/types/components/MessageComposer/hooks/usePasteHandler.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/hooks/useSubmitHandler.d.ts +5 -0
- package/dist/types/components/MessageComposer/hooks/useSubmitHandler.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/hooks/useTextareaRef.d.ts +6 -0
- package/dist/types/components/MessageComposer/hooks/useTextareaRef.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/hooks/utils.d.ts +2 -0
- package/dist/types/components/MessageComposer/hooks/utils.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/icons.d.ts +7 -0
- package/dist/types/components/MessageComposer/icons.d.ts.map +1 -0
- package/dist/types/components/MessageComposer/index.d.ts +14 -0
- package/dist/types/components/MessageComposer/index.d.ts.map +1 -0
- package/dist/types/components/MessageList/ConnectionStatus.d.ts +3 -0
- package/dist/types/components/MessageList/ConnectionStatus.d.ts.map +1 -0
- package/dist/types/components/MessageList/CustomNotification.d.ts +8 -0
- package/dist/types/components/MessageList/CustomNotification.d.ts.map +1 -0
- package/dist/types/components/MessageList/FloatingDateSeparator.d.ts +21 -0
- package/dist/types/components/MessageList/FloatingDateSeparator.d.ts.map +1 -0
- package/dist/types/components/MessageList/GiphyPreviewMessage.d.ts +6 -0
- package/dist/types/components/MessageList/GiphyPreviewMessage.d.ts.map +1 -0
- package/dist/types/components/MessageList/MessageList.d.ts +80 -0
- package/dist/types/components/MessageList/MessageList.d.ts.map +1 -0
- package/dist/types/components/MessageList/MessageListMainPanel.d.ts +4 -0
- package/dist/types/components/MessageList/MessageListMainPanel.d.ts.map +1 -0
- package/dist/types/components/MessageList/NewMessageNotification.d.ts +10 -0
- package/dist/types/components/MessageList/NewMessageNotification.d.ts.map +1 -0
- package/dist/types/components/MessageList/ScrollToLatestMessageButton.d.ts +11 -0
- package/dist/types/components/MessageList/ScrollToLatestMessageButton.d.ts.map +1 -0
- package/dist/types/components/MessageList/UnreadMessagesNotification.d.ts +16 -0
- package/dist/types/components/MessageList/UnreadMessagesNotification.d.ts.map +1 -0
- package/dist/types/components/MessageList/UnreadMessagesSeparator.d.ts +13 -0
- package/dist/types/components/MessageList/UnreadMessagesSeparator.d.ts.map +1 -0
- package/dist/types/components/MessageList/VirtualizedMessageList.d.ts +145 -0
- package/dist/types/components/MessageList/VirtualizedMessageList.d.ts.map +1 -0
- package/dist/types/components/MessageList/VirtualizedMessageListComponents.d.ts +17 -0
- package/dist/types/components/MessageList/VirtualizedMessageListComponents.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/MessageList/index.d.ts +7 -0
- package/dist/types/components/MessageList/hooks/MessageList/index.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/MessageList/scrollInstrumentation.d.ts +2 -0
- package/dist/types/components/MessageList/hooks/MessageList/scrollInstrumentation.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/MessageList/useEnrichedMessages.d.ts +18 -0
- package/dist/types/components/MessageList/hooks/MessageList/useEnrichedMessages.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/MessageList/useFloatingDateSeparatorMessageList.d.ts +16 -0
- package/dist/types/components/MessageList/hooks/MessageList/useFloatingDateSeparatorMessageList.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/MessageList/useMessageListElements.d.ts +19 -0
- package/dist/types/components/MessageList/hooks/MessageList/useMessageListElements.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/MessageList/useMessageListScrollManager.d.ts +45 -0
- package/dist/types/components/MessageList/hooks/MessageList/useMessageListScrollManager.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/MessageList/useScrollLocationLogic.d.ts +21 -0
- package/dist/types/components/MessageList/hooks/MessageList/useScrollLocationLogic.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.d.ts +11 -0
- package/dist/types/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/index.d.ts +9 -0
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/index.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useFloatingDateSeparator.d.ts +12 -0
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useFloatingDateSeparator.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.d.ts +7 -0
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.d.ts +9 -0
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.d.ts +10 -0
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/usePrependMessagesCount.d.ts +3 -0
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/usePrependMessagesCount.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.d.ts +10 -0
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useShouldForceScrollToBottom.d.ts +3 -0
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useShouldForceScrollToBottom.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.d.ts +23 -0
- package/dist/types/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/index.d.ts +9 -0
- package/dist/types/components/MessageList/hooks/index.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/useLastDeliveredData.d.ts +10 -0
- package/dist/types/components/MessageList/hooks/useLastDeliveredData.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/useLastOwnMessage.d.ts +6 -0
- package/dist/types/components/MessageList/hooks/useLastOwnMessage.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/useLastReadData.d.ts +10 -0
- package/dist/types/components/MessageList/hooks/useLastReadData.d.ts.map +1 -0
- package/dist/types/components/MessageList/hooks/useMarkRead.d.ts +17 -0
- package/dist/types/components/MessageList/hooks/useMarkRead.d.ts.map +1 -0
- package/dist/types/components/MessageList/index.d.ts +12 -0
- package/dist/types/components/MessageList/index.d.ts.map +1 -0
- package/dist/types/components/MessageList/renderMessages.d.ts +36 -0
- package/dist/types/components/MessageList/renderMessages.d.ts.map +1 -0
- package/dist/types/components/MessageList/utils.d.ts +83 -0
- package/dist/types/components/MessageList/utils.d.ts.map +1 -0
- package/dist/types/components/Modal/CloseButtonOnModalOverlay.d.ts +3 -0
- package/dist/types/components/Modal/CloseButtonOnModalOverlay.d.ts.map +1 -0
- package/dist/types/components/Modal/GlobalModal.d.ts +17 -0
- package/dist/types/components/Modal/GlobalModal.d.ts.map +1 -0
- package/dist/types/components/Modal/icons.d.ts +2 -0
- package/dist/types/components/Modal/icons.d.ts.map +1 -0
- package/dist/types/components/Modal/index.d.ts +2 -0
- package/dist/types/components/Modal/index.d.ts.map +1 -0
- package/dist/types/components/Notifications/Notification.d.ts +26 -0
- package/dist/types/components/Notifications/Notification.d.ts.map +1 -0
- package/dist/types/components/Notifications/NotificationList.d.ts +27 -0
- package/dist/types/components/Notifications/NotificationList.d.ts.map +1 -0
- package/dist/types/components/Notifications/hooks/index.d.ts +3 -0
- package/dist/types/components/Notifications/hooks/index.d.ts.map +1 -0
- package/dist/types/components/Notifications/hooks/useNotificationTarget.d.ts +6 -0
- package/dist/types/components/Notifications/hooks/useNotificationTarget.d.ts.map +1 -0
- package/dist/types/components/Notifications/hooks/useNotifications.d.ts +26 -0
- package/dist/types/components/Notifications/hooks/useNotifications.d.ts.map +1 -0
- package/dist/types/components/Notifications/index.d.ts +5 -0
- package/dist/types/components/Notifications/index.d.ts.map +1 -0
- package/dist/types/components/Notifications/notificationTarget.d.ts +16 -0
- package/dist/types/components/Notifications/notificationTarget.d.ts.map +1 -0
- package/dist/types/components/Poll/Poll.d.ts +5 -0
- package/dist/types/components/Poll/Poll.d.ts.map +1 -0
- package/dist/types/components/Poll/PollActions/AddCommentPrompt.d.ts +5 -0
- package/dist/types/components/Poll/PollActions/AddCommentPrompt.d.ts.map +1 -0
- package/dist/types/components/Poll/PollActions/EndPollAlert.d.ts +2 -0
- package/dist/types/components/Poll/PollActions/EndPollAlert.d.ts.map +1 -0
- package/dist/types/components/Poll/PollActions/PollAction.d.ts +15 -0
- package/dist/types/components/Poll/PollActions/PollAction.d.ts.map +1 -0
- package/dist/types/components/Poll/PollActions/PollActions.d.ts +13 -0
- package/dist/types/components/Poll/PollActions/PollActions.d.ts.map +1 -0
- package/dist/types/components/Poll/PollActions/PollAnswerList.d.ts +5 -0
- package/dist/types/components/Poll/PollActions/PollAnswerList.d.ts.map +1 -0
- package/dist/types/components/Poll/PollActions/PollOptionsFullList.d.ts +2 -0
- package/dist/types/components/Poll/PollActions/PollOptionsFullList.d.ts.map +1 -0
- package/dist/types/components/Poll/PollActions/PollQuestion.d.ts +5 -0
- package/dist/types/components/Poll/PollActions/PollQuestion.d.ts.map +1 -0
- package/dist/types/components/Poll/PollActions/PollResults/PollOptionWithVotes.d.ts +9 -0
- package/dist/types/components/Poll/PollActions/PollResults/PollOptionWithVotes.d.ts.map +1 -0
- package/dist/types/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.d.ts +11 -0
- package/dist/types/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.d.ts.map +1 -0
- package/dist/types/components/Poll/PollActions/PollResults/PollOptionWithVotesList.d.ts +7 -0
- package/dist/types/components/Poll/PollActions/PollResults/PollOptionWithVotesList.d.ts.map +1 -0
- package/dist/types/components/Poll/PollActions/PollResults/PollResults.d.ts +2 -0
- package/dist/types/components/Poll/PollActions/PollResults/PollResults.d.ts.map +1 -0
- package/dist/types/components/Poll/PollActions/PollResults/index.d.ts +2 -0
- package/dist/types/components/Poll/PollActions/PollResults/index.d.ts.map +1 -0
- package/dist/types/components/Poll/PollActions/SuggestPollOptionPrompt.d.ts +3 -0
- package/dist/types/components/Poll/PollActions/SuggestPollOptionPrompt.d.ts.map +1 -0
- package/dist/types/components/Poll/PollActions/index.d.ts +8 -0
- package/dist/types/components/Poll/PollActions/index.d.ts.map +1 -0
- package/dist/types/components/Poll/PollContent.d.ts +2 -0
- package/dist/types/components/Poll/PollContent.d.ts.map +1 -0
- package/dist/types/components/Poll/PollCreationDialog/MultipleAnswersField.d.ts +2 -0
- package/dist/types/components/Poll/PollCreationDialog/MultipleAnswersField.d.ts.map +1 -0
- package/dist/types/components/Poll/PollCreationDialog/NameField.d.ts +2 -0
- package/dist/types/components/Poll/PollCreationDialog/NameField.d.ts.map +1 -0
- package/dist/types/components/Poll/PollCreationDialog/OptionFieldSet.d.ts +2 -0
- package/dist/types/components/Poll/PollCreationDialog/OptionFieldSet.d.ts.map +1 -0
- package/dist/types/components/Poll/PollCreationDialog/PollCreationDialog.d.ts +5 -0
- package/dist/types/components/Poll/PollCreationDialog/PollCreationDialog.d.ts.map +1 -0
- package/dist/types/components/Poll/PollCreationDialog/PollCreationDialogControls.d.ts +5 -0
- package/dist/types/components/Poll/PollCreationDialog/PollCreationDialogControls.d.ts.map +1 -0
- package/dist/types/components/Poll/PollCreationDialog/index.d.ts +2 -0
- package/dist/types/components/Poll/PollCreationDialog/index.d.ts.map +1 -0
- package/dist/types/components/Poll/PollCreationDialog/types.d.ts +8 -0
- package/dist/types/components/Poll/PollCreationDialog/types.d.ts.map +1 -0
- package/dist/types/components/Poll/PollHeader.d.ts +2 -0
- package/dist/types/components/Poll/PollHeader.d.ts.map +1 -0
- package/dist/types/components/Poll/PollOptionList.d.ts +7 -0
- package/dist/types/components/Poll/PollOptionList.d.ts.map +1 -0
- package/dist/types/components/Poll/PollOptionSelector.d.ts +18 -0
- package/dist/types/components/Poll/PollOptionSelector.d.ts.map +1 -0
- package/dist/types/components/Poll/PollVote.d.ts +11 -0
- package/dist/types/components/Poll/PollVote.d.ts.map +1 -0
- package/dist/types/components/Poll/constants.d.ts +4 -0
- package/dist/types/components/Poll/constants.d.ts.map +1 -0
- package/dist/types/components/Poll/hooks/index.d.ts +3 -0
- package/dist/types/components/Poll/hooks/index.d.ts.map +1 -0
- package/dist/types/components/Poll/hooks/useManagePollVotesRealtime.d.ts +4 -0
- package/dist/types/components/Poll/hooks/useManagePollVotesRealtime.d.ts.map +1 -0
- package/dist/types/components/Poll/hooks/usePollAnswerPagination.d.ts +13 -0
- package/dist/types/components/Poll/hooks/usePollAnswerPagination.d.ts.map +1 -0
- package/dist/types/components/Poll/hooks/usePollOptionVotesPagination.d.ts +13 -0
- package/dist/types/components/Poll/hooks/usePollOptionVotesPagination.d.ts.map +1 -0
- package/dist/types/components/Poll/index.d.ts +10 -0
- package/dist/types/components/Poll/index.d.ts.map +1 -0
- package/dist/types/components/Portal/Portal.d.ts +7 -0
- package/dist/types/components/Portal/Portal.d.ts.map +1 -0
- package/dist/types/components/ReactFileUtilities/LoadingIndicator.d.ts +8 -0
- package/dist/types/components/ReactFileUtilities/LoadingIndicator.d.ts.map +1 -0
- package/dist/types/components/ReactFileUtilities/UploadButton.d.ts +18 -0
- package/dist/types/components/ReactFileUtilities/UploadButton.d.ts.map +1 -0
- package/dist/types/components/ReactFileUtilities/index.d.ts +5 -0
- package/dist/types/components/ReactFileUtilities/index.d.ts.map +1 -0
- package/dist/types/components/ReactFileUtilities/types.d.ts +3 -0
- package/dist/types/components/ReactFileUtilities/types.d.ts.map +1 -0
- package/dist/types/components/ReactFileUtilities/utils.d.ts +16 -0
- package/dist/types/components/ReactFileUtilities/utils.d.ts.map +1 -0
- package/dist/types/components/Reactions/MessageReactions.d.ts +41 -0
- package/dist/types/components/Reactions/MessageReactions.d.ts.map +1 -0
- package/dist/types/components/Reactions/MessageReactionsDetail.d.ts +14 -0
- package/dist/types/components/Reactions/MessageReactionsDetail.d.ts.map +1 -0
- package/dist/types/components/Reactions/ReactionSelector.d.ts +19 -0
- package/dist/types/components/Reactions/ReactionSelector.d.ts.map +1 -0
- package/dist/types/components/Reactions/ReactionSelectorWithButton.d.ts +12 -0
- package/dist/types/components/Reactions/ReactionSelectorWithButton.d.ts.map +1 -0
- package/dist/types/components/Reactions/SpriteImage.d.ts +13 -0
- package/dist/types/components/Reactions/SpriteImage.d.ts.map +1 -0
- package/dist/types/components/Reactions/StreamEmoji.d.ts +19 -0
- package/dist/types/components/Reactions/StreamEmoji.d.ts.map +1 -0
- package/dist/types/components/Reactions/hooks/useFetchReactions.d.ts +15 -0
- package/dist/types/components/Reactions/hooks/useFetchReactions.d.ts.map +1 -0
- package/dist/types/components/Reactions/hooks/useProcessReactions.d.ts +14 -0
- package/dist/types/components/Reactions/hooks/useProcessReactions.d.ts.map +1 -0
- package/dist/types/components/Reactions/index.d.ts +7 -0
- package/dist/types/components/Reactions/index.d.ts.map +1 -0
- package/dist/types/components/Reactions/reactionOptions.d.ts +29 -0
- package/dist/types/components/Reactions/reactionOptions.d.ts.map +1 -0
- package/dist/types/components/Reactions/types.d.ts +16 -0
- package/dist/types/components/Reactions/types.d.ts.map +1 -0
- package/dist/types/components/Reactions/utils/utils.d.ts +4 -0
- package/dist/types/components/Reactions/utils/utils.d.ts.map +1 -0
- package/dist/types/components/SafeAnchor/SafeAnchor.d.ts +18 -0
- package/dist/types/components/SafeAnchor/SafeAnchor.d.ts.map +1 -0
- package/dist/types/components/SafeAnchor/index.d.ts +2 -0
- package/dist/types/components/SafeAnchor/index.d.ts.map +1 -0
- package/dist/types/components/Search/Search.d.ts +12 -0
- package/dist/types/components/Search/Search.d.ts.map +1 -0
- package/dist/types/components/Search/SearchBar/SearchBar.d.ts +2 -0
- package/dist/types/components/Search/SearchBar/SearchBar.d.ts.map +1 -0
- package/dist/types/components/Search/SearchBar/index.d.ts +2 -0
- package/dist/types/components/Search/SearchBar/index.d.ts.map +1 -0
- package/dist/types/components/Search/SearchContext.d.ts +21 -0
- package/dist/types/components/Search/SearchContext.d.ts.map +1 -0
- package/dist/types/components/Search/SearchResults/SearchResultItem.d.ts +19 -0
- package/dist/types/components/Search/SearchResults/SearchResultItem.d.ts.map +1 -0
- package/dist/types/components/Search/SearchResults/SearchResults.d.ts +2 -0
- package/dist/types/components/Search/SearchResults/SearchResults.d.ts.map +1 -0
- package/dist/types/components/Search/SearchResults/SearchResultsHeader.d.ts +2 -0
- package/dist/types/components/Search/SearchResults/SearchResultsHeader.d.ts.map +1 -0
- package/dist/types/components/Search/SearchResults/SearchResultsPresearch.d.ts +6 -0
- package/dist/types/components/Search/SearchResults/SearchResultsPresearch.d.ts.map +1 -0
- package/dist/types/components/Search/SearchResults/SearchSourceResultList.d.ts +8 -0
- package/dist/types/components/Search/SearchResults/SearchSourceResultList.d.ts.map +1 -0
- package/dist/types/components/Search/SearchResults/SearchSourceResultListFooter.d.ts +2 -0
- package/dist/types/components/Search/SearchResults/SearchSourceResultListFooter.d.ts.map +1 -0
- package/dist/types/components/Search/SearchResults/SearchSourceResults.d.ts +6 -0
- package/dist/types/components/Search/SearchResults/SearchSourceResults.d.ts.map +1 -0
- package/dist/types/components/Search/SearchResults/SearchSourceResultsEmpty.d.ts +2 -0
- package/dist/types/components/Search/SearchResults/SearchSourceResultsEmpty.d.ts.map +1 -0
- package/dist/types/components/Search/SearchResults/SearchSourceResultsHeader.d.ts +2 -0
- package/dist/types/components/Search/SearchResults/SearchSourceResultsHeader.d.ts.map +1 -0
- package/dist/types/components/Search/SearchResults/SearchSourceResultsLoadingIndicator.d.ts +2 -0
- package/dist/types/components/Search/SearchResults/SearchSourceResultsLoadingIndicator.d.ts.map +1 -0
- package/dist/types/components/Search/SearchResults/index.d.ts +10 -0
- package/dist/types/components/Search/SearchResults/index.d.ts.map +1 -0
- package/dist/types/components/Search/SearchSourceResultsContext.d.ts +15 -0
- package/dist/types/components/Search/SearchSourceResultsContext.d.ts.map +1 -0
- package/dist/types/components/Search/hooks/index.d.ts +3 -0
- package/dist/types/components/Search/hooks/index.d.ts.map +1 -0
- package/dist/types/components/Search/hooks/useSearchFocusedMessage.d.ts +2 -0
- package/dist/types/components/Search/hooks/useSearchFocusedMessage.d.ts.map +1 -0
- package/dist/types/components/Search/hooks/useSearchQueriesInProgress.d.ts +6 -0
- package/dist/types/components/Search/hooks/useSearchQueriesInProgress.d.ts.map +1 -0
- package/dist/types/components/Search/index.d.ts +6 -0
- package/dist/types/components/Search/index.d.ts.map +1 -0
- package/dist/types/components/SummarizedMessagePreview/SummarizedMessagePreview.d.ts +3 -0
- package/dist/types/components/SummarizedMessagePreview/SummarizedMessagePreview.d.ts.map +1 -0
- package/dist/types/components/SummarizedMessagePreview/hooks/index.d.ts +2 -0
- package/dist/types/components/SummarizedMessagePreview/hooks/index.d.ts.map +1 -0
- package/dist/types/components/SummarizedMessagePreview/hooks/useLatestMessagePreview.d.ts +51 -0
- package/dist/types/components/SummarizedMessagePreview/hooks/useLatestMessagePreview.d.ts.map +1 -0
- package/dist/types/components/SummarizedMessagePreview/index.d.ts +3 -0
- package/dist/types/components/SummarizedMessagePreview/index.d.ts.map +1 -0
- package/dist/types/components/TextareaComposer/SuggestionList/CommandItem.d.ts +8 -0
- package/dist/types/components/TextareaComposer/SuggestionList/CommandItem.d.ts.map +1 -0
- package/dist/types/components/TextareaComposer/SuggestionList/EmoticonItem.d.ts +19 -0
- package/dist/types/components/TextareaComposer/SuggestionList/EmoticonItem.d.ts.map +1 -0
- package/dist/types/components/TextareaComposer/SuggestionList/SuggestionList.d.ts +15 -0
- package/dist/types/components/TextareaComposer/SuggestionList/SuggestionList.d.ts.map +1 -0
- package/dist/types/components/TextareaComposer/SuggestionList/SuggestionListItem.d.ts +18 -0
- package/dist/types/components/TextareaComposer/SuggestionList/SuggestionListItem.d.ts.map +1 -0
- package/dist/types/components/TextareaComposer/SuggestionList/UserItem.d.ts +25 -0
- package/dist/types/components/TextareaComposer/SuggestionList/UserItem.d.ts.map +1 -0
- package/dist/types/components/TextareaComposer/SuggestionList/index.d.ts +6 -0
- package/dist/types/components/TextareaComposer/SuggestionList/index.d.ts.map +1 -0
- package/dist/types/components/TextareaComposer/TextareaComposer.d.ts +11 -0
- package/dist/types/components/TextareaComposer/TextareaComposer.d.ts.map +1 -0
- package/dist/types/components/TextareaComposer/hooks/index.d.ts +1 -0
- package/dist/types/components/TextareaComposer/hooks/index.d.ts.map +1 -0
- package/dist/types/components/TextareaComposer/hooks/useTextareaPlaceholder.d.ts +6 -0
- package/dist/types/components/TextareaComposer/hooks/useTextareaPlaceholder.d.ts.map +1 -0
- package/dist/types/components/TextareaComposer/index.d.ts +3 -0
- package/dist/types/components/TextareaComposer/index.d.ts.map +1 -0
- package/dist/types/components/Thread/LegacyThreadContext.d.ts +9 -0
- package/dist/types/components/Thread/LegacyThreadContext.d.ts.map +1 -0
- package/dist/types/components/Thread/Thread.d.ts +30 -0
- package/dist/types/components/Thread/Thread.d.ts.map +1 -0
- package/dist/types/components/Thread/ThreadHead.d.ts +3 -0
- package/dist/types/components/Thread/ThreadHead.d.ts.map +1 -0
- package/dist/types/components/Thread/ThreadHeader.d.ts +14 -0
- package/dist/types/components/Thread/ThreadHeader.d.ts.map +1 -0
- package/dist/types/components/Thread/ThreadStart.d.ts +2 -0
- package/dist/types/components/Thread/ThreadStart.d.ts.map +1 -0
- package/dist/types/components/Thread/index.d.ts +5 -0
- package/dist/types/components/Thread/index.d.ts.map +1 -0
- package/dist/types/components/Threads/ThreadContext.d.ts +10 -0
- package/dist/types/components/Threads/ThreadContext.d.ts.map +1 -0
- package/dist/types/components/Threads/ThreadList/ThreadList.d.ts +9 -0
- package/dist/types/components/Threads/ThreadList/ThreadList.d.ts.map +1 -0
- package/dist/types/components/Threads/ThreadList/ThreadListEmptyPlaceholder.d.ts +2 -0
- package/dist/types/components/Threads/ThreadList/ThreadListEmptyPlaceholder.d.ts.map +1 -0
- package/dist/types/components/Threads/ThreadList/ThreadListHeader.d.ts +6 -0
- package/dist/types/components/Threads/ThreadList/ThreadListHeader.d.ts.map +1 -0
- package/dist/types/components/Threads/ThreadList/ThreadListItem.d.ts +9 -0
- package/dist/types/components/Threads/ThreadList/ThreadListItem.d.ts.map +1 -0
- package/dist/types/components/Threads/ThreadList/ThreadListItemUI.d.ts +6 -0
- package/dist/types/components/Threads/ThreadList/ThreadListItemUI.d.ts.map +1 -0
- package/dist/types/components/Threads/ThreadList/ThreadListLoadingIndicator.d.ts +2 -0
- package/dist/types/components/Threads/ThreadList/ThreadListLoadingIndicator.d.ts.map +1 -0
- package/dist/types/components/Threads/ThreadList/ThreadListUnseenThreadsBanner.d.ts +2 -0
- package/dist/types/components/Threads/ThreadList/ThreadListUnseenThreadsBanner.d.ts.map +1 -0
- package/dist/types/components/Threads/ThreadList/index.d.ts +4 -0
- package/dist/types/components/Threads/ThreadList/index.d.ts.map +1 -0
- package/dist/types/components/Threads/UnreadCountBadge.d.ts +6 -0
- package/dist/types/components/Threads/UnreadCountBadge.d.ts.map +1 -0
- package/dist/types/components/Threads/hooks/useThreadManagerState.d.ts +3 -0
- package/dist/types/components/Threads/hooks/useThreadManagerState.d.ts.map +1 -0
- package/dist/types/components/Threads/hooks/useThreadState.d.ts +6 -0
- package/dist/types/components/Threads/hooks/useThreadState.d.ts.map +1 -0
- package/dist/types/components/Threads/index.d.ts +3 -0
- package/dist/types/components/Threads/index.d.ts.map +1 -0
- package/dist/types/components/Tooltip/Tooltip.d.ts +16 -0
- package/dist/types/components/Tooltip/Tooltip.d.ts.map +1 -0
- package/dist/types/components/Tooltip/hooks/index.d.ts +2 -0
- package/dist/types/components/Tooltip/hooks/index.d.ts.map +1 -0
- package/dist/types/components/Tooltip/hooks/useEnterLeaveHandlers.d.ts +7 -0
- package/dist/types/components/Tooltip/hooks/useEnterLeaveHandlers.d.ts.map +1 -0
- package/dist/types/components/Tooltip/index.d.ts +2 -0
- package/dist/types/components/Tooltip/index.d.ts.map +1 -0
- package/dist/types/components/TypingIndicator/TypingIndicator.d.ts +9 -0
- package/dist/types/components/TypingIndicator/TypingIndicator.d.ts.map +1 -0
- package/dist/types/components/TypingIndicator/TypingIndicatorDots.d.ts +3 -0
- package/dist/types/components/TypingIndicator/TypingIndicatorDots.d.ts.map +1 -0
- package/dist/types/components/TypingIndicator/TypingIndicatorHeader.d.ts +10 -0
- package/dist/types/components/TypingIndicator/TypingIndicatorHeader.d.ts.map +1 -0
- package/dist/types/components/TypingIndicator/hooks/index.d.ts +3 -0
- package/dist/types/components/TypingIndicator/hooks/index.d.ts.map +1 -0
- package/dist/types/components/TypingIndicator/hooks/useDebouncedTypingActive.d.ts +18 -0
- package/dist/types/components/TypingIndicator/hooks/useDebouncedTypingActive.d.ts.map +1 -0
- package/dist/types/components/TypingIndicator/index.d.ts +3 -0
- package/dist/types/components/TypingIndicator/index.d.ts.map +1 -0
- package/dist/types/components/UtilityComponents/ErrorBoundary.d.ts +17 -0
- package/dist/types/components/UtilityComponents/ErrorBoundary.d.ts.map +1 -0
- package/dist/types/components/UtilityComponents/NullComponent.d.ts +2 -0
- package/dist/types/components/UtilityComponents/NullComponent.d.ts.map +1 -0
- package/dist/types/components/UtilityComponents/index.d.ts +3 -0
- package/dist/types/components/UtilityComponents/index.d.ts.map +1 -0
- package/dist/types/components/UtilityComponents/useStableId.d.ts +6 -0
- package/dist/types/components/UtilityComponents/useStableId.d.ts.map +1 -0
- package/dist/types/components/VideoPlayer/VideoPlayer.d.ts +7 -0
- package/dist/types/components/VideoPlayer/VideoPlayer.d.ts.map +1 -0
- package/dist/types/components/VideoPlayer/VideoThumbnail.d.ts +6 -0
- package/dist/types/components/VideoPlayer/VideoThumbnail.d.ts.map +1 -0
- package/dist/types/components/VideoPlayer/index.d.ts +2 -0
- package/dist/types/components/VideoPlayer/index.d.ts.map +1 -0
- package/dist/types/components/Window/Window.d.ts +11 -0
- package/dist/types/components/Window/Window.d.ts.map +1 -0
- package/dist/types/components/Window/index.d.ts +2 -0
- package/dist/types/components/Window/index.d.ts.map +1 -0
- package/dist/types/components/index.d.ts +46 -0
- package/dist/types/components/index.d.ts.map +1 -0
- package/dist/types/constants/limits.d.ts +6 -0
- package/dist/types/constants/limits.d.ts.map +1 -0
- package/dist/types/constants/messageTypes.d.ts +5 -0
- package/dist/types/constants/messageTypes.d.ts.map +1 -0
- package/dist/types/context/AttachmentSelectorContext.d.ts +9 -0
- package/dist/types/context/AttachmentSelectorContext.d.ts.map +1 -0
- package/dist/types/context/ChannelActionContext.d.ts +46 -0
- package/dist/types/context/ChannelActionContext.d.ts.map +1 -0
- package/dist/types/context/ChannelListContext.d.ts +31 -0
- package/dist/types/context/ChannelListContext.d.ts.map +1 -0
- package/dist/types/context/ChannelStateContext.d.ts +51 -0
- package/dist/types/context/ChannelStateContext.d.ts.map +1 -0
- package/dist/types/context/ChatContext.d.ts +48 -0
- package/dist/types/context/ChatContext.d.ts.map +1 -0
- package/dist/types/context/ComponentContext.d.ts +209 -0
- package/dist/types/context/ComponentContext.d.ts.map +1 -0
- package/dist/types/context/DialogManagerContext.d.ts +30 -0
- package/dist/types/context/DialogManagerContext.d.ts.map +1 -0
- package/dist/types/context/MessageBounceContext.d.ts +12 -0
- package/dist/types/context/MessageBounceContext.d.ts.map +1 -0
- package/dist/types/context/MessageComposerContext.d.ts +11 -0
- package/dist/types/context/MessageComposerContext.d.ts.map +1 -0
- package/dist/types/context/MessageContext.d.ts +124 -0
- package/dist/types/context/MessageContext.d.ts.map +1 -0
- package/dist/types/context/MessageListContext.d.ts +20 -0
- package/dist/types/context/MessageListContext.d.ts.map +1 -0
- package/dist/types/context/MessageTranslationViewContext.d.ts +66 -0
- package/dist/types/context/MessageTranslationViewContext.d.ts.map +1 -0
- package/dist/types/context/ModalContext.d.ts +11 -0
- package/dist/types/context/ModalContext.d.ts.map +1 -0
- package/dist/types/context/PollContext.d.ts +12 -0
- package/dist/types/context/PollContext.d.ts.map +1 -0
- package/dist/types/context/TranslationContext.d.ts +16 -0
- package/dist/types/context/TranslationContext.d.ts.map +1 -0
- package/dist/types/context/TypingContext.d.ts +12 -0
- package/dist/types/context/TypingContext.d.ts.map +1 -0
- package/dist/types/context/VirtualizedMessageListContext.d.ts +15 -0
- package/dist/types/context/VirtualizedMessageListContext.d.ts.map +1 -0
- package/dist/types/context/WithComponents.d.ts +6 -0
- package/dist/types/context/WithComponents.d.ts.map +1 -0
- package/dist/types/context/index.d.ts +17 -0
- package/dist/types/context/index.d.ts.map +1 -0
- package/dist/types/i18n/Streami18n.d.ts +612 -0
- package/dist/types/i18n/Streami18n.d.ts.map +1 -0
- package/dist/types/i18n/TranslationBuilder/TranslationBuilder.d.ts +36 -0
- package/dist/types/i18n/TranslationBuilder/TranslationBuilder.d.ts.map +1 -0
- package/dist/types/i18n/TranslationBuilder/index.d.ts +3 -0
- package/dist/types/i18n/TranslationBuilder/index.d.ts.map +1 -0
- package/dist/types/i18n/TranslationBuilder/notifications/NotificationTranslationTopic.d.ts +12 -0
- package/dist/types/i18n/TranslationBuilder/notifications/NotificationTranslationTopic.d.ts.map +1 -0
- package/dist/types/i18n/TranslationBuilder/notifications/index.d.ts +3 -0
- package/dist/types/i18n/TranslationBuilder/notifications/index.d.ts.map +1 -0
- package/dist/types/i18n/TranslationBuilder/notifications/translators.d.ts +8 -0
- package/dist/types/i18n/TranslationBuilder/notifications/translators.d.ts.map +1 -0
- package/dist/types/i18n/TranslationBuilder/notifications/translatorsByNotificationType.d.ts +4 -0
- package/dist/types/i18n/TranslationBuilder/notifications/translatorsByNotificationType.d.ts.map +1 -0
- package/dist/types/i18n/TranslationBuilder/notifications/types.d.ts +5 -0
- package/dist/types/i18n/TranslationBuilder/notifications/types.d.ts.map +1 -0
- package/dist/types/i18n/index.d.ts +6 -0
- package/dist/types/i18n/index.d.ts.map +1 -0
- package/dist/types/i18n/translations.d.ts +14 -0
- package/dist/types/i18n/translations.d.ts.map +1 -0
- package/dist/types/i18n/types.d.ts +112 -0
- package/dist/types/i18n/types.d.ts.map +1 -0
- package/dist/types/i18n/utils.d.ts +15 -0
- package/dist/types/i18n/utils.d.ts.map +1 -0
- package/dist/types/index.d.ts +7 -2
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/plugins/Emojis/EmojiPicker.d.ts +28 -0
- package/dist/types/plugins/Emojis/EmojiPicker.d.ts.map +1 -0
- package/dist/types/plugins/Emojis/index.d.ts +3 -0
- package/dist/types/plugins/Emojis/index.d.ts.map +1 -0
- package/dist/types/plugins/Emojis/middleware/index.d.ts +2 -0
- package/dist/types/plugins/Emojis/middleware/index.d.ts.map +1 -0
- package/dist/types/plugins/Emojis/middleware/textComposerEmojiMiddleware.d.ts +23 -0
- package/dist/types/plugins/Emojis/middleware/textComposerEmojiMiddleware.d.ts.map +1 -0
- package/dist/types/plugins/encoders/mp3.d.ts +2 -0
- package/dist/types/plugins/encoders/mp3.d.ts.map +1 -0
- package/dist/types/store/hooks/index.d.ts +2 -0
- package/dist/types/store/hooks/index.d.ts.map +1 -0
- package/dist/types/store/hooks/useStateStore.d.ts +4 -0
- package/dist/types/store/hooks/useStateStore.d.ts.map +1 -0
- package/dist/types/store/index.d.ts +2 -0
- package/dist/types/store/index.d.ts.map +1 -0
- package/dist/types/types/defaultDataInterfaces.d.ts +29 -0
- package/dist/types/types/defaultDataInterfaces.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +3 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/dist/types/types/types.d.ts +57 -0
- package/dist/types/types/types.d.ts.map +1 -0
- package/dist/types/utils/browsers.d.ts +2 -0
- package/dist/types/utils/browsers.d.ts.map +1 -0
- package/dist/types/utils/deprecationWarning.d.ts +2 -0
- package/dist/types/utils/deprecationWarning.d.ts.map +1 -0
- package/dist/types/utils/findReverse.d.ts +2 -0
- package/dist/types/utils/findReverse.d.ts.map +1 -0
- package/dist/types/utils/getChannel.d.ts +21 -0
- package/dist/types/utils/getChannel.d.ts.map +1 -0
- package/dist/types/utils/getTextareaCaretRect.d.ts +8 -0
- package/dist/types/utils/getTextareaCaretRect.d.ts.map +1 -0
- package/dist/types/utils/getWholeChar.d.ts +2 -0
- package/dist/types/utils/getWholeChar.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +4 -0
- package/dist/types/utils/index.d.ts.map +1 -0
- package/dist/types/utils/mergeDeep.d.ts +3 -0
- package/dist/types/utils/mergeDeep.d.ts.map +1 -0
- package/dist/types/utils/useStableCallback.d.ts +26 -0
- package/dist/types/utils/useStableCallback.d.ts.map +1 -0
- package/package.json +44 -101
- package/dist/components/AIStateIndicator/AIStateIndicator.d.ts +0 -6
- package/dist/components/AIStateIndicator/AIStateIndicator.js +0 -15
- package/dist/components/AIStateIndicator/hooks/useAIState.d.ts +0 -17
- package/dist/components/AIStateIndicator/hooks/useAIState.js +0 -47
- package/dist/components/AIStateIndicator/index.d.ts +0 -2
- package/dist/components/AIStateIndicator/index.js +0 -2
- package/dist/components/Attachment/Attachment.d.ts +0 -44
- package/dist/components/Attachment/Attachment.js +0 -94
- package/dist/components/Attachment/AttachmentActions.d.ts +0 -17
- package/dist/components/Attachment/AttachmentActions.js +0 -20
- package/dist/components/Attachment/AttachmentContainer.d.ts +0 -19
- package/dist/components/Attachment/AttachmentContainer.js +0 -158
- package/dist/components/Attachment/Audio.d.ts +0 -9
- package/dist/components/Attachment/Audio.js +0 -52
- package/dist/components/Attachment/Card.d.ts +0 -9
- package/dist/components/Attachment/Card.js +0 -109
- package/dist/components/Attachment/FileAttachment.d.ts +0 -6
- package/dist/components/Attachment/FileAttachment.js +0 -11
- package/dist/components/Attachment/Geolocation.d.ts +0 -13
- package/dist/components/Attachment/Geolocation.js +0 -34
- package/dist/components/Attachment/UnsupportedAttachment.d.ts +0 -6
- package/dist/components/Attachment/UnsupportedAttachment.js +0 -10
- package/dist/components/Attachment/VoiceRecording.d.ts +0 -16
- package/dist/components/Attachment/VoiceRecording.js +0 -67
- package/dist/components/Attachment/attachment-sizing.d.ts +0 -8
- package/dist/components/Attachment/attachment-sizing.js +0 -81
- package/dist/components/Attachment/audioSampling.d.ts +0 -9
- package/dist/components/Attachment/audioSampling.js +0 -81
- package/dist/components/Attachment/components/DownloadButton.d.ts +0 -6
- package/dist/components/Attachment/components/DownloadButton.js +0 -5
- package/dist/components/Attachment/components/FileSizeIndicator.d.ts +0 -12
- package/dist/components/Attachment/components/FileSizeIndicator.js +0 -9
- package/dist/components/Attachment/components/PlayButton.d.ts +0 -7
- package/dist/components/Attachment/components/PlayButton.js +0 -3
- package/dist/components/Attachment/components/PlaybackRateButton.d.ts +0 -3
- package/dist/components/Attachment/components/PlaybackRateButton.js +0 -2
- package/dist/components/Attachment/components/ProgressBar.d.ts +0 -6
- package/dist/components/Attachment/components/ProgressBar.js +0 -6
- package/dist/components/Attachment/components/WaveProgressBar.d.ts +0 -16
- package/dist/components/Attachment/components/WaveProgressBar.js +0 -84
- package/dist/components/Attachment/components/index.d.ts +0 -6
- package/dist/components/Attachment/components/index.js +0 -6
- package/dist/components/Attachment/hooks/useAudioController.d.ts +0 -28
- package/dist/components/Attachment/hooks/useAudioController.js +0 -127
- package/dist/components/Attachment/icons.d.ts +0 -7
- package/dist/components/Attachment/icons.js +0 -12
- package/dist/components/Attachment/index.d.ts +0 -14
- package/dist/components/Attachment/index.js +0 -14
- package/dist/components/Attachment/utils.d.ts +0 -23
- package/dist/components/Attachment/utils.js +0 -29
- package/dist/components/AudioPlayback/AudioPlayer.d.ts +0 -116
- package/dist/components/AudioPlayback/AudioPlayer.js +0 -456
- package/dist/components/AudioPlayback/AudioPlayerPool.d.ts +0 -49
- package/dist/components/AudioPlayback/AudioPlayerPool.js +0 -156
- package/dist/components/AudioPlayback/WithAudioPlayback.d.ts +0 -24
- package/dist/components/AudioPlayback/WithAudioPlayback.js +0 -57
- package/dist/components/AudioPlayback/index.d.ts +0 -3
- package/dist/components/AudioPlayback/index.js +0 -3
- package/dist/components/AudioPlayback/plugins/AudioPlayerNotificationsPlugin.d.ts +0 -7
- package/dist/components/AudioPlayback/plugins/AudioPlayerNotificationsPlugin.js +0 -25
- package/dist/components/AudioPlayback/plugins/AudioPlayerPlugin.d.ts +0 -10
- package/dist/components/AudioPlayback/plugins/AudioPlayerPlugin.js +0 -1
- package/dist/components/AudioPlayback/plugins/index.d.ts +0 -1
- package/dist/components/AudioPlayback/plugins/index.js +0 -1
- package/dist/components/Avatar/Avatar.d.ts +0 -20
- package/dist/components/Avatar/Avatar.js +0 -24
- package/dist/components/Avatar/ChannelAvatar.d.ts +0 -4
- package/dist/components/Avatar/ChannelAvatar.js +0 -8
- package/dist/components/Avatar/GroupAvatar.d.ts +0 -8
- package/dist/components/Avatar/GroupAvatar.js +0 -6
- package/dist/components/Avatar/index.d.ts +0 -3
- package/dist/components/Avatar/index.js +0 -3
- package/dist/components/Channel/Channel.d.ts +0 -67
- package/dist/components/Channel/Channel.js +0 -878
- package/dist/components/Channel/channelState.d.ts +0 -82
- package/dist/components/Channel/channelState.js +0 -181
- package/dist/components/Channel/constants.d.ts +0 -1
- package/dist/components/Channel/constants.js +0 -1
- package/dist/components/Channel/hooks/useChannelContainerClasses.d.ts +0 -9
- package/dist/components/Channel/hooks/useChannelContainerClasses.js +0 -17
- package/dist/components/Channel/hooks/useCreateChannelStateContext.d.ts +0 -5
- package/dist/components/Channel/hooks/useCreateChannelStateContext.js +0 -95
- package/dist/components/Channel/hooks/useCreateTypingContext.d.ts +0 -2
- package/dist/components/Channel/hooks/useCreateTypingContext.js +0 -11
- package/dist/components/Channel/hooks/useEditMessageHandler.d.ts +0 -4
- package/dist/components/Channel/hooks/useEditMessageHandler.js +0 -10
- package/dist/components/Channel/hooks/useIsMounted.d.ts +0 -2
- package/dist/components/Channel/hooks/useIsMounted.js +0 -11
- package/dist/components/Channel/hooks/useMentionsHandlers.d.ts +0 -4
- package/dist/components/Channel/hooks/useMentionsHandlers.js +0 -23
- package/dist/components/Channel/index.d.ts +0 -3
- package/dist/components/Channel/index.js +0 -3
- package/dist/components/Channel/utils.d.ts +0 -37
- package/dist/components/Channel/utils.js +0 -66
- package/dist/components/ChannelHeader/ChannelHeader.d.ts +0 -18
- package/dist/components/ChannelHeader/ChannelHeader.js +0 -40
- package/dist/components/ChannelHeader/icons.d.ts +0 -4
- package/dist/components/ChannelHeader/icons.js +0 -8
- package/dist/components/ChannelHeader/index.d.ts +0 -1
- package/dist/components/ChannelHeader/index.js +0 -1
- package/dist/components/ChannelList/ChannelList.d.ts +0 -99
- package/dist/components/ChannelList/ChannelList.js +0 -150
- package/dist/components/ChannelList/ChannelListMessenger.d.ts +0 -22
- package/dist/components/ChannelList/ChannelListMessenger.js +0 -19
- package/dist/components/ChannelList/hooks/index.d.ts +0 -14
- package/dist/components/ChannelList/hooks/index.js +0 -14
- package/dist/components/ChannelList/hooks/useChannelDeletedListener.d.ts +0 -2
- package/dist/components/ChannelList/hooks/useChannelDeletedListener.js +0 -26
- package/dist/components/ChannelList/hooks/useChannelHiddenListener.d.ts +0 -2
- package/dist/components/ChannelList/hooks/useChannelHiddenListener.js +0 -26
- package/dist/components/ChannelList/hooks/useChannelListShape.d.ts +0 -60
- package/dist/components/ChannelList/hooks/useChannelListShape.js +0 -373
- package/dist/components/ChannelList/hooks/useChannelMembershipState.d.ts +0 -3
- package/dist/components/ChannelList/hooks/useChannelMembershipState.js +0 -6
- package/dist/components/ChannelList/hooks/useChannelTruncatedListener.d.ts +0 -2
- package/dist/components/ChannelList/hooks/useChannelTruncatedListener.js +0 -20
- package/dist/components/ChannelList/hooks/useChannelUpdatedListener.d.ts +0 -2
- package/dist/components/ChannelList/hooks/useChannelUpdatedListener.js +0 -33
- package/dist/components/ChannelList/hooks/useChannelVisibleListener.d.ts +0 -2
- package/dist/components/ChannelList/hooks/useChannelVisibleListener.js +0 -26
- package/dist/components/ChannelList/hooks/useConnectionRecoveredListener.d.ts +0 -1
- package/dist/components/ChannelList/hooks/useConnectionRecoveredListener.js +0 -16
- package/dist/components/ChannelList/hooks/useMessageNewListener.d.ts +0 -2
- package/dist/components/ChannelList/hooks/useMessageNewListener.js +0 -38
- package/dist/components/ChannelList/hooks/useMobileNavigation.d.ts +0 -1
- package/dist/components/ChannelList/hooks/useMobileNavigation.js +0 -17
- package/dist/components/ChannelList/hooks/useNotificationAddedToChannelListener.d.ts +0 -2
- package/dist/components/ChannelList/hooks/useNotificationAddedToChannelListener.js +0 -33
- package/dist/components/ChannelList/hooks/useNotificationMessageNewListener.d.ts +0 -2
- package/dist/components/ChannelList/hooks/useNotificationMessageNewListener.js +0 -26
- package/dist/components/ChannelList/hooks/useNotificationRemovedFromChannelListener.d.ts +0 -2
- package/dist/components/ChannelList/hooks/useNotificationRemovedFromChannelListener.js +0 -19
- package/dist/components/ChannelList/hooks/usePaginatedChannels.d.ts +0 -18
- package/dist/components/ChannelList/hooks/usePaginatedChannels.js +0 -90
- package/dist/components/ChannelList/hooks/useSelectedChannelState.d.ts +0 -11
- package/dist/components/ChannelList/hooks/useSelectedChannelState.js +0 -20
- package/dist/components/ChannelList/hooks/useUserPresenceChangedListener.d.ts +0 -2
- package/dist/components/ChannelList/hooks/useUserPresenceChangedListener.js +0 -24
- package/dist/components/ChannelList/index.d.ts +0 -4
- package/dist/components/ChannelList/index.js +0 -4
- package/dist/components/ChannelList/utils.d.ts +0 -54
- package/dist/components/ChannelList/utils.js +0 -121
- package/dist/components/ChannelPreview/ChannelPreview.d.ts +0 -55
- package/dist/components/ChannelPreview/ChannelPreview.js +0 -95
- package/dist/components/ChannelPreview/ChannelPreviewActionButtons.d.ts +0 -6
- package/dist/components/ChannelPreview/ChannelPreviewActionButtons.js +0 -30
- package/dist/components/ChannelPreview/ChannelPreviewMessenger.d.ts +0 -7
- package/dist/components/ChannelPreview/ChannelPreviewMessenger.js +0 -38
- package/dist/components/ChannelPreview/hooks/index.d.ts +0 -2
- package/dist/components/ChannelPreview/hooks/index.js +0 -2
- package/dist/components/ChannelPreview/hooks/useChannelPreviewInfo.d.ts +0 -13
- package/dist/components/ChannelPreview/hooks/useChannelPreviewInfo.js +0 -32
- package/dist/components/ChannelPreview/hooks/useIsChannelMuted.d.ts +0 -6
- package/dist/components/ChannelPreview/hooks/useIsChannelMuted.js +0 -13
- package/dist/components/ChannelPreview/hooks/useMessageDeliveryStatus.d.ts +0 -15
- package/dist/components/ChannelPreview/hooks/useMessageDeliveryStatus.js +0 -72
- package/dist/components/ChannelPreview/icons.d.ts +0 -6
- package/dist/components/ChannelPreview/icons.js +0 -7
- package/dist/components/ChannelPreview/index.d.ts +0 -5
- package/dist/components/ChannelPreview/index.js +0 -5
- package/dist/components/ChannelPreview/utils.d.ts +0 -14
- package/dist/components/ChannelPreview/utils.js +0 -98
- package/dist/components/ChannelSearch/ChannelSearch.d.ts +0 -18
- package/dist/components/ChannelSearch/ChannelSearch.js +0 -23
- package/dist/components/ChannelSearch/SearchBar.d.ts +0 -31
- package/dist/components/ChannelSearch/SearchBar.js +0 -67
- package/dist/components/ChannelSearch/SearchInput.d.ts +0 -18
- package/dist/components/ChannelSearch/SearchInput.js +0 -7
- package/dist/components/ChannelSearch/SearchResults.d.ts +0 -32
- package/dist/components/ChannelSearch/SearchResults.js +0 -86
- package/dist/components/ChannelSearch/hooks/useChannelSearch.d.ts +0 -53
- package/dist/components/ChannelSearch/hooks/useChannelSearch.js +0 -195
- package/dist/components/ChannelSearch/icons.d.ts +0 -6
- package/dist/components/ChannelSearch/icons.js +0 -9
- package/dist/components/ChannelSearch/index.d.ts +0 -6
- package/dist/components/ChannelSearch/index.js +0 -5
- package/dist/components/ChannelSearch/utils.d.ts +0 -3
- package/dist/components/ChannelSearch/utils.js +0 -1
- package/dist/components/Chat/Chat.d.ts +0 -37
- package/dist/components/Chat/Chat.js +0 -47
- package/dist/components/Chat/hooks/useChannelsQueryState.d.ts +0 -11
- package/dist/components/Chat/hooks/useChannelsQueryState.js +0 -11
- package/dist/components/Chat/hooks/useChat.d.ts +0 -24
- package/dist/components/Chat/hooks/useChat.js +0 -95
- package/dist/components/Chat/hooks/useCreateChatClient.d.ts +0 -11
- package/dist/components/Chat/hooks/useCreateChatClient.js +0 -33
- package/dist/components/Chat/hooks/useCreateChatContext.d.ts +0 -2
- package/dist/components/Chat/hooks/useCreateChatContext.js +0 -40
- package/dist/components/Chat/index.d.ts +0 -3
- package/dist/components/Chat/index.js +0 -3
- package/dist/components/ChatView/ChatView.d.ts +0 -18
- package/dist/components/ChatView/ChatView.js +0 -104
- package/dist/components/ChatView/index.d.ts +0 -1
- package/dist/components/ChatView/index.js +0 -1
- package/dist/components/DateSeparator/DateSeparator.d.ts +0 -16
- package/dist/components/DateSeparator/DateSeparator.js +0 -24
- package/dist/components/DateSeparator/index.d.ts +0 -1
- package/dist/components/DateSeparator/index.js +0 -1
- package/dist/components/Dialog/ButtonWithSubmenu.d.ts +0 -11
- package/dist/components/Dialog/ButtonWithSubmenu.js +0 -88
- package/dist/components/Dialog/DialogAnchor.d.ts +0 -20
- package/dist/components/Dialog/DialogAnchor.js +0 -69
- package/dist/components/Dialog/DialogManager.d.ts +0 -53
- package/dist/components/Dialog/DialogManager.js +0 -144
- package/dist/components/Dialog/DialogMenu.d.ts +0 -4
- package/dist/components/Dialog/DialogMenu.js +0 -5
- package/dist/components/Dialog/DialogPortal.d.ts +0 -9
- package/dist/components/Dialog/DialogPortal.js +0 -35
- package/dist/components/Dialog/FormDialog.d.ts +0 -24
- package/dist/components/Dialog/FormDialog.js +0 -76
- package/dist/components/Dialog/PromptDialog.d.ts +0 -9
- package/dist/components/Dialog/PromptDialog.js +0 -7
- package/dist/components/Dialog/hooks/index.d.ts +0 -2
- package/dist/components/Dialog/hooks/index.js +0 -1
- package/dist/components/Dialog/hooks/useDialog.d.ts +0 -16
- package/dist/components/Dialog/hooks/useDialog.js +0 -41
- package/dist/components/Dialog/hooks/usePopoverPosition.d.ts +0 -68
- package/dist/components/Dialog/hooks/usePopoverPosition.js +0 -54
- package/dist/components/Dialog/index.d.ts +0 -5
- package/dist/components/Dialog/index.js +0 -5
- package/dist/components/DragAndDrop/DragAndDropContainer.d.ts +0 -8
- package/dist/components/DragAndDrop/DragAndDropContainer.js +0 -93
- package/dist/components/EmptyStateIndicator/EmptyStateIndicator.d.ts +0 -6
- package/dist/components/EmptyStateIndicator/EmptyStateIndicator.js +0 -24
- package/dist/components/EmptyStateIndicator/icons.d.ts +0 -2
- package/dist/components/EmptyStateIndicator/icons.js +0 -3
- package/dist/components/EmptyStateIndicator/index.d.ts +0 -1
- package/dist/components/EmptyStateIndicator/index.js +0 -1
- package/dist/components/EventComponent/EventComponent.d.ts +0 -14
- package/dist/components/EventComponent/EventComponent.js +0 -39
- package/dist/components/EventComponent/index.d.ts +0 -1
- package/dist/components/EventComponent/index.js +0 -1
- package/dist/components/Form/Dropdown.d.ts +0 -14
- package/dist/components/Form/Dropdown.js +0 -49
- package/dist/components/Form/FieldError.d.ts +0 -7
- package/dist/components/Form/FieldError.js +0 -3
- package/dist/components/Form/SwitchField.d.ts +0 -8
- package/dist/components/Form/SwitchField.js +0 -23
- package/dist/components/Gallery/BaseImage.d.ts +0 -3
- package/dist/components/Gallery/BaseImage.js +0 -18
- package/dist/components/Gallery/Gallery.d.ts +0 -17
- package/dist/components/Gallery/Gallery.js +0 -57
- package/dist/components/Gallery/Image.d.ts +0 -21
- package/dist/components/Gallery/Image.js +0 -26
- package/dist/components/Gallery/ModalGallery.d.ts +0 -9
- package/dist/components/Gallery/ModalGallery.js +0 -25
- package/dist/components/Gallery/index.d.ts +0 -4
- package/dist/components/Gallery/index.js +0 -4
- package/dist/components/InfiniteScrollPaginator/InfiniteScroll.d.ts +0 -45
- package/dist/components/InfiniteScrollPaginator/InfiniteScroll.js +0 -99
- package/dist/components/InfiniteScrollPaginator/InfiniteScrollPaginator.d.ts +0 -12
- package/dist/components/InfiniteScrollPaginator/InfiniteScrollPaginator.js +0 -74
- package/dist/components/InfiniteScrollPaginator/hooks/useCursorPaginator.d.ts +0 -18
- package/dist/components/InfiniteScrollPaginator/hooks/useCursorPaginator.js +0 -41
- package/dist/components/InfiniteScrollPaginator/index.d.ts +0 -1
- package/dist/components/InfiniteScrollPaginator/index.js +0 -1
- package/dist/components/LoadMore/LoadMoreButton.d.ts +0 -14
- package/dist/components/LoadMore/LoadMoreButton.js +0 -16
- package/dist/components/LoadMore/LoadMorePaginator.d.ts +0 -12
- package/dist/components/LoadMore/LoadMorePaginator.js +0 -16
- package/dist/components/LoadMore/index.d.ts +0 -2
- package/dist/components/LoadMore/index.js +0 -2
- package/dist/components/Loading/LoadingChannel.d.ts +0 -2
- package/dist/components/Loading/LoadingChannel.js +0 -20
- package/dist/components/Loading/LoadingChannels.d.ts +0 -5
- package/dist/components/Loading/LoadingChannels.js +0 -14
- package/dist/components/Loading/LoadingErrorIndicator.d.ts +0 -6
- package/dist/components/Loading/LoadingErrorIndicator.js +0 -12
- package/dist/components/Loading/LoadingIndicator.d.ts +0 -11
- package/dist/components/Loading/LoadingIndicator.js +0 -15
- package/dist/components/Loading/index.d.ts +0 -4
- package/dist/components/Loading/index.js +0 -4
- package/dist/components/Location/ShareLocationDialog.d.ts +0 -18
- package/dist/components/Location/ShareLocationDialog.js +0 -139
- package/dist/components/Location/hooks/useLiveLocationSharingManager.d.ts +0 -18
- package/dist/components/Location/hooks/useLiveLocationSharingManager.js +0 -57
- package/dist/components/Location/index.d.ts +0 -1
- package/dist/components/Location/index.js +0 -1
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecorder.d.ts +0 -2
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecorder.js +0 -29
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecordingButtons.d.ts +0 -3
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecordingButtons.js +0 -4
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecordingInProgress.d.ts +0 -2
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecordingInProgress.js +0 -49
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecordingPreview.d.ts +0 -8
- package/dist/components/MediaRecorder/AudioRecorder/AudioRecordingPreview.js +0 -34
- package/dist/components/MediaRecorder/AudioRecorder/RecordingTimer.d.ts +0 -5
- package/dist/components/MediaRecorder/AudioRecorder/RecordingTimer.js +0 -6
- package/dist/components/MediaRecorder/AudioRecorder/hooks/useTimeElapsed.d.ts +0 -9
- package/dist/components/MediaRecorder/AudioRecorder/hooks/useTimeElapsed.js +0 -30
- package/dist/components/MediaRecorder/AudioRecorder/index.d.ts +0 -3
- package/dist/components/MediaRecorder/AudioRecorder/index.js +0 -3
- package/dist/components/MediaRecorder/RecordingPermissionDeniedNotification.d.ts +0 -7
- package/dist/components/MediaRecorder/RecordingPermissionDeniedNotification.js +0 -20
- package/dist/components/MediaRecorder/classes/AmplitudeRecorder.d.ts +0 -54
- package/dist/components/MediaRecorder/classes/AmplitudeRecorder.js +0 -85
- package/dist/components/MediaRecorder/classes/BrowserPermission.d.ts +0 -22
- package/dist/components/MediaRecorder/classes/BrowserPermission.js +0 -63
- package/dist/components/MediaRecorder/classes/MediaRecorderController.d.ts +0 -75
- package/dist/components/MediaRecorder/classes/MediaRecorderController.js +0 -255
- package/dist/components/MediaRecorder/classes/index.d.ts +0 -3
- package/dist/components/MediaRecorder/classes/index.js +0 -2
- package/dist/components/MediaRecorder/hooks/index.d.ts +0 -1
- package/dist/components/MediaRecorder/hooks/index.js +0 -1
- package/dist/components/MediaRecorder/hooks/useMediaRecorder.d.ts +0 -18
- package/dist/components/MediaRecorder/hooks/useMediaRecorder.js +0 -60
- package/dist/components/MediaRecorder/index.d.ts +0 -6
- package/dist/components/MediaRecorder/index.js +0 -5
- package/dist/components/MediaRecorder/observable/BehaviorSubject.d.ts +0 -10
- package/dist/components/MediaRecorder/observable/BehaviorSubject.js +0 -25
- package/dist/components/MediaRecorder/observable/Observable.d.ts +0 -17
- package/dist/components/MediaRecorder/observable/Observable.js +0 -21
- package/dist/components/MediaRecorder/observable/Observer.d.ts +0 -9
- package/dist/components/MediaRecorder/observable/Observer.js +0 -3
- package/dist/components/MediaRecorder/observable/Subject.d.ts +0 -16
- package/dist/components/MediaRecorder/observable/Subject.js +0 -58
- package/dist/components/MediaRecorder/observable/Subscription.d.ts +0 -10
- package/dist/components/MediaRecorder/observable/Subscription.js +0 -10
- package/dist/components/MediaRecorder/observable/index.d.ts +0 -5
- package/dist/components/MediaRecorder/observable/index.js +0 -5
- package/dist/components/MediaRecorder/transcode/audioProcessing.d.ts +0 -15
- package/dist/components/MediaRecorder/transcode/audioProcessing.js +0 -30
- package/dist/components/MediaRecorder/transcode/index.d.ts +0 -8
- package/dist/components/MediaRecorder/transcode/index.js +0 -7
- package/dist/components/MediaRecorder/transcode/wav.d.ts +0 -7
- package/dist/components/MediaRecorder/transcode/wav.js +0 -103
- package/dist/components/Message/FixedHeightMessage.d.ts +0 -13
- package/dist/components/Message/FixedHeightMessage.js +0 -64
- package/dist/components/Message/Message.d.ts +0 -7
- package/dist/components/Message/Message.js +0 -120
- package/dist/components/Message/MessageBlocked.d.ts +0 -2
- package/dist/components/Message/MessageBlocked.js +0 -16
- package/dist/components/Message/MessageDeleted.d.ts +0 -6
- package/dist/components/Message/MessageDeleted.js +0 -13
- package/dist/components/Message/MessageEditedTimestamp.d.ts +0 -6
- package/dist/components/Message/MessageEditedTimestamp.js +0 -20
- package/dist/components/Message/MessageErrorText.d.ts +0 -7
- package/dist/components/Message/MessageErrorText.js +0 -15
- package/dist/components/Message/MessageIsThreadReplyInChannelButtonIndicator.d.ts +0 -2
- package/dist/components/Message/MessageIsThreadReplyInChannelButtonIndicator.js +0 -63
- package/dist/components/Message/MessageOptions.d.ts +0 -11
- package/dist/components/Message/MessageOptions.js +0 -41
- package/dist/components/Message/MessageRepliesCountButton.d.ts +0 -9
- package/dist/components/Message/MessageRepliesCountButton.js +0 -20
- package/dist/components/Message/MessageSimple.d.ts +0 -6
- package/dist/components/Message/MessageSimple.js +0 -119
- package/dist/components/Message/MessageStatus.d.ts +0 -13
- package/dist/components/Message/MessageStatus.js +0 -67
- package/dist/components/Message/MessageText.d.ts +0 -10
- package/dist/components/Message/MessageText.js +0 -35
- package/dist/components/Message/MessageTimestamp.d.ts +0 -8
- package/dist/components/Message/MessageTimestamp.js +0 -12
- package/dist/components/Message/QuotedMessage.d.ts +0 -4
- package/dist/components/Message/QuotedMessage.js +0 -48
- package/dist/components/Message/ReminderNotification.d.ts +0 -6
- package/dist/components/Message/ReminderNotification.js +0 -30
- package/dist/components/Message/StreamedMessageText.d.ts +0 -7
- package/dist/components/Message/StreamedMessageText.js +0 -22
- package/dist/components/Message/Timestamp.d.ts +0 -7
- package/dist/components/Message/Timestamp.js +0 -32
- package/dist/components/Message/hooks/index.d.ts +0 -16
- package/dist/components/Message/hooks/index.js +0 -16
- package/dist/components/Message/hooks/useActionHandler.d.ts +0 -6
- package/dist/components/Message/hooks/useActionHandler.js +0 -35
- package/dist/components/Message/hooks/useDeleteHandler.d.ts +0 -7
- package/dist/components/Message/hooks/useDeleteHandler.js +0 -25
- package/dist/components/Message/hooks/useEditHandler.d.ts +0 -8
- package/dist/components/Message/hooks/useEditHandler.js +0 -19
- package/dist/components/Message/hooks/useFlagHandler.d.ts +0 -9
- package/dist/components/Message/hooks/useFlagHandler.js +0 -29
- package/dist/components/Message/hooks/useMarkUnreadHandler.d.ts +0 -8
- package/dist/components/Message/hooks/useMarkUnreadHandler.js +0 -32
- package/dist/components/Message/hooks/useMentionsHandler.d.ts +0 -12
- package/dist/components/Message/hooks/useMentionsHandler.js +0 -18
- package/dist/components/Message/hooks/useMessageReminder.d.ts +0 -1
- package/dist/components/Message/hooks/useMessageReminder.js +0 -11
- package/dist/components/Message/hooks/useMessageTextStreaming.d.ts +0 -16
- package/dist/components/Message/hooks/useMessageTextStreaming.js +0 -37
- package/dist/components/Message/hooks/useMuteHandler.d.ts +0 -9
- package/dist/components/Message/hooks/useMuteHandler.js +0 -56
- package/dist/components/Message/hooks/useOpenThreadHandler.d.ts +0 -3
- package/dist/components/Message/hooks/useOpenThreadHandler.js +0 -12
- package/dist/components/Message/hooks/usePinHandler.d.ts +0 -28
- package/dist/components/Message/hooks/usePinHandler.js +0 -59
- package/dist/components/Message/hooks/useReactionHandler.d.ts +0 -4
- package/dist/components/Message/hooks/useReactionHandler.js +0 -119
- package/dist/components/Message/hooks/useReactionsFetcher.d.ts +0 -9
- package/dist/components/Message/hooks/useReactionsFetcher.js +0 -30
- package/dist/components/Message/hooks/useRetryHandler.d.ts +0 -2
- package/dist/components/Message/hooks/useRetryHandler.js +0 -10
- package/dist/components/Message/hooks/useUserHandler.d.ts +0 -12
- package/dist/components/Message/hooks/useUserHandler.js +0 -14
- package/dist/components/Message/hooks/useUserRole.d.ts +0 -15
- package/dist/components/Message/hooks/useUserRole.js +0 -51
- package/dist/components/Message/icons.d.ts +0 -11
- package/dist/components/Message/icons.js +0 -35
- package/dist/components/Message/index.d.ts +0 -21
- package/dist/components/Message/index.js +0 -20
- package/dist/components/Message/renderText/componentRenderers/Anchor.d.ts +0 -3
- package/dist/components/Message/renderText/componentRenderers/Anchor.js +0 -9
- package/dist/components/Message/renderText/componentRenderers/Emoji.d.ts +0 -3
- package/dist/components/Message/renderText/componentRenderers/Emoji.js +0 -2
- package/dist/components/Message/renderText/componentRenderers/Mention.d.ts +0 -9
- package/dist/components/Message/renderText/componentRenderers/Mention.js +0 -2
- package/dist/components/Message/renderText/componentRenderers/index.d.ts +0 -3
- package/dist/components/Message/renderText/componentRenderers/index.js +0 -3
- package/dist/components/Message/renderText/index.d.ts +0 -5
- package/dist/components/Message/renderText/index.js +0 -4
- package/dist/components/Message/renderText/regex.d.ts +0 -4
- package/dist/components/Message/renderText/regex.js +0 -21
- package/dist/components/Message/renderText/rehypePlugins/emojiMarkdownPlugin.d.ts +0 -2
- package/dist/components/Message/renderText/rehypePlugins/emojiMarkdownPlugin.js +0 -8
- package/dist/components/Message/renderText/rehypePlugins/index.d.ts +0 -2
- package/dist/components/Message/renderText/rehypePlugins/index.js +0 -2
- package/dist/components/Message/renderText/rehypePlugins/mentionsMarkdownPlugin.d.ts +0 -3
- package/dist/components/Message/renderText/rehypePlugins/mentionsMarkdownPlugin.js +0 -50
- package/dist/components/Message/renderText/remarkPlugins/htmlToTextPlugin.d.ts +0 -2
- package/dist/components/Message/renderText/remarkPlugins/htmlToTextPlugin.js +0 -10
- package/dist/components/Message/renderText/remarkPlugins/imageToLink.d.ts +0 -12
- package/dist/components/Message/renderText/remarkPlugins/imageToLink.js +0 -27
- package/dist/components/Message/renderText/remarkPlugins/index.d.ts +0 -5
- package/dist/components/Message/renderText/remarkPlugins/index.js +0 -5
- package/dist/components/Message/renderText/remarkPlugins/keepLineBreaksPlugin.d.ts +0 -10
- package/dist/components/Message/renderText/remarkPlugins/keepLineBreaksPlugin.js +0 -48
- package/dist/components/Message/renderText/remarkPlugins/plusPlusToEmphasis.d.ts +0 -6
- package/dist/components/Message/renderText/remarkPlugins/plusPlusToEmphasis.js +0 -64
- package/dist/components/Message/renderText/remarkPlugins/remarkIgnoreMarkdown.d.ts +0 -8
- package/dist/components/Message/renderText/remarkPlugins/remarkIgnoreMarkdown.js +0 -11
- package/dist/components/Message/renderText/renderText.d.ts +0 -19
- package/dist/components/Message/renderText/renderText.js +0 -140
- package/dist/components/Message/renderText/types.d.ts +0 -2
- package/dist/components/Message/renderText/types.js +0 -1
- package/dist/components/Message/types.d.ts +0 -111
- package/dist/components/Message/types.js +0 -1
- package/dist/components/Message/utils.d.ts +0 -85
- package/dist/components/Message/utils.js +0 -336
- package/dist/components/MessageActions/CustomMessageActionsList.d.ts +0 -8
- package/dist/components/MessageActions/CustomMessageActionsList.js +0 -11
- package/dist/components/MessageActions/MessageActions.d.ts +0 -19
- package/dist/components/MessageActions/MessageActions.js +0 -56
- package/dist/components/MessageActions/MessageActionsBox.d.ts +0 -14
- package/dist/components/MessageActions/MessageActionsBox.js +0 -54
- package/dist/components/MessageActions/RemindMeSubmenu.d.ts +0 -6
- package/dist/components/MessageActions/RemindMeSubmenu.js +0 -18
- package/dist/components/MessageActions/index.d.ts +0 -3
- package/dist/components/MessageActions/index.js +0 -3
- package/dist/components/MessageBounce/MessageBounceModal.d.ts +0 -8
- package/dist/components/MessageBounce/MessageBounceModal.js +0 -9
- package/dist/components/MessageBounce/MessageBouncePrompt.d.ts +0 -5
- package/dist/components/MessageBounce/MessageBouncePrompt.js +0 -18
- package/dist/components/MessageBounce/index.d.ts +0 -2
- package/dist/components/MessageBounce/index.js +0 -2
- package/dist/components/MessageInput/AttachmentPreviewList/AttachmentPreviewList.d.ts +0 -17
- package/dist/components/MessageInput/AttachmentPreviewList/AttachmentPreviewList.js +0 -46
- package/dist/components/MessageInput/AttachmentPreviewList/FileAttachmentPreview.d.ts +0 -6
- package/dist/components/MessageInput/AttachmentPreviewList/FileAttachmentPreview.js +0 -25
- package/dist/components/MessageInput/AttachmentPreviewList/GeolocationPreview.d.ts +0 -13
- package/dist/components/MessageInput/AttachmentPreviewList/GeolocationPreview.js +0 -25
- package/dist/components/MessageInput/AttachmentPreviewList/ImageAttachmentPreview.d.ts +0 -5
- package/dist/components/MessageInput/AttachmentPreviewList/ImageAttachmentPreview.js +0 -23
- package/dist/components/MessageInput/AttachmentPreviewList/UnsupportedAttachmentPreview.d.ts +0 -8
- package/dist/components/MessageInput/AttachmentPreviewList/UnsupportedAttachmentPreview.js +0 -25
- package/dist/components/MessageInput/AttachmentPreviewList/VoiceRecordingPreview.d.ts +0 -5
- package/dist/components/MessageInput/AttachmentPreviewList/VoiceRecordingPreview.js +0 -41
- package/dist/components/MessageInput/AttachmentPreviewList/index.d.ts +0 -7
- package/dist/components/MessageInput/AttachmentPreviewList/index.js +0 -1
- package/dist/components/MessageInput/AttachmentPreviewList/types.d.ts +0 -6
- package/dist/components/MessageInput/AttachmentPreviewList/types.js +0 -1
- package/dist/components/MessageInput/AttachmentSelector.d.ts +0 -25
- package/dist/components/MessageInput/AttachmentSelector.js +0 -158
- package/dist/components/MessageInput/CooldownTimer.d.ts +0 -6
- package/dist/components/MessageInput/CooldownTimer.js +0 -6
- package/dist/components/MessageInput/EditMessageForm.d.ts +0 -5
- package/dist/components/MessageInput/EditMessageForm.js +0 -44
- package/dist/components/MessageInput/LinkPreviewList.d.ts +0 -8
- package/dist/components/MessageInput/LinkPreviewList.js +0 -44
- package/dist/components/MessageInput/MessageInput.d.ts +0 -75
- package/dist/components/MessageInput/MessageInput.js +0 -62
- package/dist/components/MessageInput/MessageInputFlat.d.ts +0 -2
- package/dist/components/MessageInput/MessageInputFlat.js +0 -70
- package/dist/components/MessageInput/QuotedMessagePreview.d.ts +0 -7
- package/dist/components/MessageInput/QuotedMessagePreview.js +0 -44
- package/dist/components/MessageInput/SendButton.d.ts +0 -5
- package/dist/components/MessageInput/SendButton.js +0 -10
- package/dist/components/MessageInput/SendToChannelCheckbox.d.ts +0 -2
- package/dist/components/MessageInput/SendToChannelCheckbox.js +0 -20
- package/dist/components/MessageInput/StopAIGenerationButton.d.ts +0 -3
- package/dist/components/MessageInput/StopAIGenerationButton.js +0 -6
- package/dist/components/MessageInput/WithDragAndDropUpload.d.ts +0 -38
- package/dist/components/MessageInput/WithDragAndDropUpload.js +0 -96
- package/dist/components/MessageInput/hooks/index.d.ts +0 -7
- package/dist/components/MessageInput/hooks/index.js +0 -7
- package/dist/components/MessageInput/hooks/useAttachmentManagerState.d.ts +0 -10
- package/dist/components/MessageInput/hooks/useAttachmentManagerState.js +0 -19
- package/dist/components/MessageInput/hooks/useAttachmentsForPreview.d.ts +0 -17
- package/dist/components/MessageInput/hooks/useAttachmentsForPreview.js +0 -22
- package/dist/components/MessageInput/hooks/useCanCreatePoll.d.ts +0 -1
- package/dist/components/MessageInput/hooks/useCanCreatePoll.js +0 -10
- package/dist/components/MessageInput/hooks/useCooldownTimer.d.ts +0 -7
- package/dist/components/MessageInput/hooks/useCooldownTimer.js +0 -39
- package/dist/components/MessageInput/hooks/useCreateMessageInputContext.d.ts +0 -2
- package/dist/components/MessageInput/hooks/useCreateMessageInputContext.js +0 -41
- package/dist/components/MessageInput/hooks/useMessageComposer.d.ts +0 -2
- package/dist/components/MessageInput/hooks/useMessageComposer.js +0 -82
- package/dist/components/MessageInput/hooks/useMessageComposerHasSendableData.d.ts +0 -1
- package/dist/components/MessageInput/hooks/useMessageComposerHasSendableData.js +0 -8
- package/dist/components/MessageInput/hooks/useMessageInputControls.d.ts +0 -10
- package/dist/components/MessageInput/hooks/useMessageInputControls.js +0 -22
- package/dist/components/MessageInput/hooks/usePasteHandler.d.ts +0 -3
- package/dist/components/MessageInput/hooks/usePasteHandler.js +0 -36
- package/dist/components/MessageInput/hooks/useSubmitHandler.d.ts +0 -4
- package/dist/components/MessageInput/hooks/useSubmitHandler.js +0 -87
- package/dist/components/MessageInput/hooks/useTextareaRef.d.ts +0 -5
- package/dist/components/MessageInput/hooks/useTextareaRef.js +0 -14
- package/dist/components/MessageInput/hooks/useTimer.d.ts +0 -3
- package/dist/components/MessageInput/hooks/useTimer.js +0 -19
- package/dist/components/MessageInput/hooks/utils.d.ts +0 -1
- package/dist/components/MessageInput/hooks/utils.js +0 -7
- package/dist/components/MessageInput/icons.d.ts +0 -15
- package/dist/components/MessageInput/icons.js +0 -48
- package/dist/components/MessageInput/index.d.ts +0 -13
- package/dist/components/MessageInput/index.js +0 -12
- package/dist/components/MessageList/ConnectionStatus.d.ts +0 -2
- package/dist/components/MessageList/ConnectionStatus.js +0 -19
- package/dist/components/MessageList/CustomNotification.d.ts +0 -9
- package/dist/components/MessageList/CustomNotification.js +0 -9
- package/dist/components/MessageList/GiphyPreviewMessage.d.ts +0 -6
- package/dist/components/MessageList/GiphyPreviewMessage.js +0 -7
- package/dist/components/MessageList/MessageList.d.ts +0 -77
- package/dist/components/MessageList/MessageList.js +0 -166
- package/dist/components/MessageList/MessageListMainPanel.d.ts +0 -4
- package/dist/components/MessageList/MessageListMainPanel.js +0 -3
- package/dist/components/MessageList/MessageListNotifications.d.ts +0 -14
- package/dist/components/MessageList/MessageListNotifications.js +0 -19
- package/dist/components/MessageList/MessageNotification.d.ts +0 -15
- package/dist/components/MessageList/MessageNotification.js +0 -8
- package/dist/components/MessageList/ScrollToBottomButton.d.ts +0 -3
- package/dist/components/MessageList/ScrollToBottomButton.js +0 -56
- package/dist/components/MessageList/UnreadMessagesNotification.d.ts +0 -16
- package/dist/components/MessageList/UnreadMessagesNotification.js +0 -13
- package/dist/components/MessageList/UnreadMessagesSeparator.d.ts +0 -13
- package/dist/components/MessageList/UnreadMessagesSeparator.js +0 -9
- package/dist/components/MessageList/VirtualizedMessageList.d.ts +0 -144
- package/dist/components/MessageList/VirtualizedMessageList.js +0 -271
- package/dist/components/MessageList/VirtualizedMessageListComponents.d.ts +0 -17
- package/dist/components/MessageList/VirtualizedMessageListComponents.js +0 -92
- package/dist/components/MessageList/hooks/MessageList/index.d.ts +0 -5
- package/dist/components/MessageList/hooks/MessageList/index.js +0 -5
- package/dist/components/MessageList/hooks/MessageList/useEnrichedMessages.d.ts +0 -17
- package/dist/components/MessageList/hooks/MessageList/useEnrichedMessages.js +0 -35
- package/dist/components/MessageList/hooks/MessageList/useMessageListElements.d.ts +0 -18
- package/dist/components/MessageList/hooks/MessageList/useMessageListElements.js +0 -53
- package/dist/components/MessageList/hooks/MessageList/useMessageListScrollManager.d.ts +0 -15
- package/dist/components/MessageList/hooks/MessageList/useMessageListScrollManager.js +0 -59
- package/dist/components/MessageList/hooks/MessageList/useScrollLocationLogic.d.ts +0 -17
- package/dist/components/MessageList/hooks/MessageList/useScrollLocationLogic.js +0 -67
- package/dist/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.d.ts +0 -8
- package/dist/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.js +0 -74
- package/dist/components/MessageList/hooks/VirtualizedMessageList/index.d.ts +0 -7
- package/dist/components/MessageList/hooks/VirtualizedMessageList/index.js +0 -7
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.d.ts +0 -6
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.js +0 -22
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.d.ts +0 -8
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.js +0 -18
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.d.ts +0 -9
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.js +0 -42
- package/dist/components/MessageList/hooks/VirtualizedMessageList/usePrependMessagesCount.d.ts +0 -2
- package/dist/components/MessageList/hooks/VirtualizedMessageList/usePrependMessagesCount.js +0 -60
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.d.ts +0 -9
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.js +0 -32
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useShouldForceScrollToBottom.d.ts +0 -2
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useShouldForceScrollToBottom.js +0 -24
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.d.ts +0 -22
- package/dist/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.js +0 -37
- package/dist/components/MessageList/hooks/index.d.ts +0 -8
- package/dist/components/MessageList/hooks/index.js +0 -8
- package/dist/components/MessageList/hooks/useLastDeliveredData.d.ts +0 -9
- package/dist/components/MessageList/hooks/useLastDeliveredData.js +0 -38
- package/dist/components/MessageList/hooks/useLastOwnMessage.d.ts +0 -5
- package/dist/components/MessageList/hooks/useLastOwnMessage.js +0 -4
- package/dist/components/MessageList/hooks/useLastReadData.d.ts +0 -9
- package/dist/components/MessageList/hooks/useLastReadData.js +0 -23
- package/dist/components/MessageList/hooks/useMarkRead.d.ts +0 -16
- package/dist/components/MessageList/hooks/useMarkRead.js +0 -87
- package/dist/components/MessageList/icons.d.ts +0 -9
- package/dist/components/MessageList/icons.js +0 -7
- package/dist/components/MessageList/index.d.ts +0 -12
- package/dist/components/MessageList/index.js +0 -12
- package/dist/components/MessageList/renderMessages.d.ts +0 -36
- package/dist/components/MessageList/renderMessages.js +0 -52
- package/dist/components/MessageList/utils.d.ts +0 -82
- package/dist/components/MessageList/utils.js +0 -246
- package/dist/components/Modal/GlobalModal.d.ts +0 -4
- package/dist/components/Modal/GlobalModal.js +0 -57
- package/dist/components/Modal/Modal.d.ts +0 -15
- package/dist/components/Modal/Modal.js +0 -45
- package/dist/components/Modal/ModalHeader.d.ts +0 -8
- package/dist/components/Modal/ModalHeader.js +0 -6
- package/dist/components/Modal/icons.d.ts +0 -2
- package/dist/components/Modal/icons.js +0 -5
- package/dist/components/Modal/index.d.ts +0 -2
- package/dist/components/Modal/index.js +0 -2
- package/dist/components/Notifications/hooks/index.d.ts +0 -1
- package/dist/components/Notifications/hooks/index.js +0 -1
- package/dist/components/Notifications/hooks/useNotifications.d.ts +0 -2
- package/dist/components/Notifications/hooks/useNotifications.js +0 -10
- package/dist/components/Notifications/index.d.ts +0 -1
- package/dist/components/Notifications/index.js +0 -1
- package/dist/components/Poll/Poll.d.ts +0 -6
- package/dist/components/Poll/Poll.js +0 -8
- package/dist/components/Poll/PollActions/AddCommentForm.d.ts +0 -6
- package/dist/components/Poll/PollActions/AddCommentForm.js +0 -34
- package/dist/components/Poll/PollActions/EndPollDialog.d.ts +0 -5
- package/dist/components/Poll/PollActions/EndPollDialog.js +0 -19
- package/dist/components/Poll/PollActions/PollAction.d.ts +0 -10
- package/dist/components/Poll/PollActions/PollAction.js +0 -9
- package/dist/components/Poll/PollActions/PollActions.d.ts +0 -16
- package/dist/components/Poll/PollActions/PollActions.js +0 -51
- package/dist/components/Poll/PollActions/PollAnswerList.d.ts +0 -6
- package/dist/components/Poll/PollActions/PollAnswerList.js +0 -28
- package/dist/components/Poll/PollActions/PollOptionsFullList.d.ts +0 -5
- package/dist/components/Poll/PollActions/PollOptionsFullList.js +0 -18
- package/dist/components/Poll/PollActions/PollResults/PollOptionVotesList.d.ts +0 -6
- package/dist/components/Poll/PollActions/PollResults/PollOptionVotesList.js +0 -18
- package/dist/components/Poll/PollActions/PollResults/PollOptionWithLatestVotes.d.ts +0 -8
- package/dist/components/Poll/PollActions/PollResults/PollOptionWithLatestVotes.js +0 -21
- package/dist/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.d.ts +0 -10
- package/dist/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.js +0 -18
- package/dist/components/Poll/PollActions/PollResults/PollResults.d.ts +0 -5
- package/dist/components/Poll/PollActions/PollResults/PollResults.js +0 -34
- package/dist/components/Poll/PollActions/PollResults/index.d.ts +0 -1
- package/dist/components/Poll/PollActions/PollResults/index.js +0 -1
- package/dist/components/Poll/PollActions/SuggestPollOptionForm.d.ts +0 -6
- package/dist/components/Poll/PollActions/SuggestPollOptionForm.js +0 -42
- package/dist/components/Poll/PollActions/index.d.ts +0 -7
- package/dist/components/Poll/PollActions/index.js +0 -7
- package/dist/components/Poll/PollContent.d.ts +0 -2
- package/dist/components/Poll/PollContent.js +0 -18
- package/dist/components/Poll/PollCreationDialog/MultipleAnswersField.d.ts +0 -2
- package/dist/components/Poll/PollCreationDialog/MultipleAnswersField.js +0 -46
- package/dist/components/Poll/PollCreationDialog/NameField.d.ts +0 -2
- package/dist/components/Poll/PollCreationDialog/NameField.js +0 -29
- package/dist/components/Poll/PollCreationDialog/OptionFieldSet.d.ts +0 -2
- package/dist/components/Poll/PollCreationDialog/OptionFieldSet.js +0 -50
- package/dist/components/Poll/PollCreationDialog/PollCreationDialog.d.ts +0 -5
- package/dist/components/Poll/PollCreationDialog/PollCreationDialog.js +0 -42
- package/dist/components/Poll/PollCreationDialog/PollCreationDialogControls.d.ts +0 -5
- package/dist/components/Poll/PollCreationDialog/PollCreationDialogControls.js +0 -24
- package/dist/components/Poll/PollCreationDialog/index.d.ts +0 -1
- package/dist/components/Poll/PollCreationDialog/index.js +0 -1
- package/dist/components/Poll/PollCreationDialog/types.d.ts +0 -7
- package/dist/components/Poll/PollCreationDialog/types.js +0 -1
- package/dist/components/Poll/PollHeader.d.ts +0 -2
- package/dist/components/Poll/PollHeader.js +0 -33
- package/dist/components/Poll/PollOptionList.d.ts +0 -5
- package/dist/components/Poll/PollOptionList.js +0 -16
- package/dist/components/Poll/PollOptionSelector.d.ts +0 -18
- package/dist/components/Poll/PollOptionSelector.js +0 -60
- package/dist/components/Poll/PollVote.d.ts +0 -11
- package/dist/components/Poll/PollVote.js +0 -31
- package/dist/components/Poll/QuotedPoll.d.ts +0 -2
- package/dist/components/Poll/QuotedPoll.js +0 -17
- package/dist/components/Poll/constants.d.ts +0 -2
- package/dist/components/Poll/constants.js +0 -2
- package/dist/components/Poll/hooks/index.d.ts +0 -2
- package/dist/components/Poll/hooks/index.js +0 -2
- package/dist/components/Poll/hooks/useManagePollVotesRealtime.d.ts +0 -3
- package/dist/components/Poll/hooks/useManagePollVotesRealtime.js +0 -41
- package/dist/components/Poll/hooks/usePollAnswerPagination.d.ts +0 -12
- package/dist/components/Poll/hooks/usePollAnswerPagination.js +0 -33
- package/dist/components/Poll/hooks/usePollOptionVotesPagination.d.ts +0 -12
- package/dist/components/Poll/hooks/usePollOptionVotesPagination.js +0 -33
- package/dist/components/Poll/index.d.ts +0 -10
- package/dist/components/Poll/index.js +0 -10
- package/dist/components/Portal/Portal.d.ts +0 -6
- package/dist/components/Portal/Portal.js +0 -14
- package/dist/components/ReactFileUtilities/FileIcon/FileIcon.d.ts +0 -13
- package/dist/components/ReactFileUtilities/FileIcon/FileIcon.js +0 -24
- package/dist/components/ReactFileUtilities/FileIcon/FileIconSet.d.ts +0 -25
- package/dist/components/ReactFileUtilities/FileIcon/FileIconSet.js +0 -122
- package/dist/components/ReactFileUtilities/FileIcon/iconMap.d.ts +0 -10
- package/dist/components/ReactFileUtilities/FileIcon/iconMap.js +0 -67
- package/dist/components/ReactFileUtilities/FileIcon/index.d.ts +0 -1
- package/dist/components/ReactFileUtilities/FileIcon/index.js +0 -1
- package/dist/components/ReactFileUtilities/FileIcon/mimeTypes.d.ts +0 -7
- package/dist/components/ReactFileUtilities/FileIcon/mimeTypes.js +0 -146
- package/dist/components/ReactFileUtilities/LoadingIndicator.d.ts +0 -8
- package/dist/components/ReactFileUtilities/LoadingIndicator.js +0 -9
- package/dist/components/ReactFileUtilities/UploadButton.d.ts +0 -17
- package/dist/components/ReactFileUtilities/UploadButton.js +0 -35
- package/dist/components/ReactFileUtilities/index.d.ts +0 -5
- package/dist/components/ReactFileUtilities/index.js +0 -5
- package/dist/components/ReactFileUtilities/types.d.ts +0 -2
- package/dist/components/ReactFileUtilities/types.js +0 -1
- package/dist/components/ReactFileUtilities/utils.d.ts +0 -15
- package/dist/components/ReactFileUtilities/utils.js +0 -105
- package/dist/components/Reactions/ReactionSelector.d.ts +0 -34
- package/dist/components/Reactions/ReactionSelector.js +0 -94
- package/dist/components/Reactions/ReactionSelectorWithButton.d.ts +0 -11
- package/dist/components/Reactions/ReactionSelectorWithButton.js +0 -23
- package/dist/components/Reactions/ReactionsList.d.ts +0 -35
- package/dist/components/Reactions/ReactionsList.js +0 -44
- package/dist/components/Reactions/ReactionsListModal.d.ts +0 -14
- package/dist/components/Reactions/ReactionsListModal.js +0 -39
- package/dist/components/Reactions/SimpleReactionsList.d.ts +0 -20
- package/dist/components/Reactions/SimpleReactionsList.js +0 -36
- package/dist/components/Reactions/SpriteImage.d.ts +0 -12
- package/dist/components/Reactions/SpriteImage.js +0 -30
- package/dist/components/Reactions/StreamEmoji.d.ts +0 -16
- package/dist/components/Reactions/StreamEmoji.js +0 -17
- package/dist/components/Reactions/hooks/useFetchReactions.d.ts +0 -13
- package/dist/components/Reactions/hooks/useFetchReactions.js +0 -38
- package/dist/components/Reactions/hooks/useProcessReactions.d.ts +0 -13
- package/dist/components/Reactions/hooks/useProcessReactions.js +0 -67
- package/dist/components/Reactions/index.d.ts +0 -7
- package/dist/components/Reactions/index.js +0 -7
- package/dist/components/Reactions/reactionOptions.d.ts +0 -7
- package/dist/components/Reactions/reactionOptions.js +0 -26
- package/dist/components/Reactions/types.d.ts +0 -15
- package/dist/components/Reactions/types.js +0 -1
- package/dist/components/Reactions/utils/utils.d.ts +0 -3
- package/dist/components/Reactions/utils/utils.js +0 -16
- package/dist/components/SafeAnchor/SafeAnchor.d.ts +0 -18
- package/dist/components/SafeAnchor/SafeAnchor.js +0 -12
- package/dist/components/SafeAnchor/index.d.ts +0 -1
- package/dist/components/SafeAnchor/index.js +0 -2
- package/dist/components/TextareaComposer/SuggestionList/CommandItem.d.ts +0 -7
- package/dist/components/TextareaComposer/SuggestionList/CommandItem.js +0 -29
- package/dist/components/TextareaComposer/SuggestionList/EmoticonItem.d.ts +0 -17
- package/dist/components/TextareaComposer/SuggestionList/EmoticonItem.js +0 -12
- package/dist/components/TextareaComposer/SuggestionList/SuggestionList.d.ts +0 -14
- package/dist/components/TextareaComposer/SuggestionList/SuggestionList.js +0 -50
- package/dist/components/TextareaComposer/SuggestionList/SuggestionListItem.d.ts +0 -18
- package/dist/components/TextareaComposer/SuggestionList/SuggestionListItem.js +0 -27
- package/dist/components/TextareaComposer/SuggestionList/UserItem.d.ts +0 -26
- package/dist/components/TextareaComposer/SuggestionList/UserItem.js +0 -24
- package/dist/components/TextareaComposer/SuggestionList/index.d.ts +0 -5
- package/dist/components/TextareaComposer/SuggestionList/index.js +0 -5
- package/dist/components/TextareaComposer/TextareaComposer.d.ts +0 -11
- package/dist/components/TextareaComposer/TextareaComposer.js +0 -190
- package/dist/components/TextareaComposer/index.d.ts +0 -2
- package/dist/components/TextareaComposer/index.js +0 -2
- package/dist/components/Thread/LegacyThreadContext.d.ts +0 -8
- package/dist/components/Thread/LegacyThreadContext.js +0 -3
- package/dist/components/Thread/Thread.d.ts +0 -31
- package/dist/components/Thread/Thread.js +0 -87
- package/dist/components/Thread/ThreadHead.d.ts +0 -3
- package/dist/components/Thread/ThreadHead.js +0 -10
- package/dist/components/Thread/ThreadHeader.d.ts +0 -10
- package/dist/components/Thread/ThreadHeader.js +0 -21
- package/dist/components/Thread/ThreadStart.d.ts +0 -2
- package/dist/components/Thread/ThreadStart.js +0 -10
- package/dist/components/Thread/icons.d.ts +0 -4
- package/dist/components/Thread/icons.js +0 -8
- package/dist/components/Thread/index.d.ts +0 -4
- package/dist/components/Thread/index.js +0 -4
- package/dist/components/Threads/ThreadContext.d.ts +0 -9
- package/dist/components/Threads/ThreadContext.js +0 -6
- package/dist/components/Threads/ThreadList/ThreadList.d.ts +0 -9
- package/dist/components/Threads/ThreadList/ThreadList.js +0 -41
- package/dist/components/Threads/ThreadList/ThreadListEmptyPlaceholder.d.ts +0 -2
- package/dist/components/Threads/ThreadList/ThreadListEmptyPlaceholder.js +0 -5
- package/dist/components/Threads/ThreadList/ThreadListItem.d.ts +0 -9
- package/dist/components/Threads/ThreadList/ThreadListItem.js +0 -52
- package/dist/components/Threads/ThreadList/ThreadListItemUI.d.ts +0 -15
- package/dist/components/Threads/ThreadList/ThreadListItemUI.js +0 -77
- package/dist/components/Threads/ThreadList/ThreadListLoadingIndicator.d.ts +0 -2
- package/dist/components/Threads/ThreadList/ThreadListLoadingIndicator.js +0 -16
- package/dist/components/Threads/ThreadList/ThreadListUnseenThreadsBanner.d.ts +0 -2
- package/dist/components/Threads/ThreadList/ThreadListUnseenThreadsBanner.js +0 -18
- package/dist/components/Threads/ThreadList/index.d.ts +0 -3
- package/dist/components/Threads/ThreadList/index.js +0 -3
- package/dist/components/Threads/UnreadCountBadge.d.ts +0 -6
- package/dist/components/Threads/UnreadCountBadge.js +0 -5
- package/dist/components/Threads/hooks/useThreadManagerState.d.ts +0 -2
- package/dist/components/Threads/hooks/useThreadManagerState.js +0 -6
- package/dist/components/Threads/hooks/useThreadState.d.ts +0 -5
- package/dist/components/Threads/hooks/useThreadState.js +0 -11
- package/dist/components/Threads/icons.d.ts +0 -8
- package/dist/components/Threads/icons.js +0 -12
- package/dist/components/Threads/index.d.ts +0 -2
- package/dist/components/Threads/index.js +0 -2
- package/dist/components/Tooltip/Tooltip.d.ts +0 -15
- package/dist/components/Tooltip/Tooltip.js +0 -19
- package/dist/components/Tooltip/hooks/index.d.ts +0 -1
- package/dist/components/Tooltip/hooks/index.js +0 -1
- package/dist/components/Tooltip/hooks/useEnterLeaveHandlers.d.ts +0 -6
- package/dist/components/Tooltip/hooks/useEnterLeaveHandlers.js +0 -13
- package/dist/components/Tooltip/index.d.ts +0 -1
- package/dist/components/Tooltip/index.js +0 -1
- package/dist/components/TypingIndicator/TypingIndicator.d.ts +0 -6
- package/dist/components/TypingIndicator/TypingIndicator.js +0 -59
- package/dist/components/TypingIndicator/index.d.ts +0 -1
- package/dist/components/TypingIndicator/index.js +0 -1
- package/dist/components/UtilityComponents/ErrorBoundary.d.ts +0 -16
- package/dist/components/UtilityComponents/ErrorBoundary.js +0 -19
- package/dist/components/UtilityComponents/NullComponent.d.ts +0 -1
- package/dist/components/UtilityComponents/NullComponent.js +0 -1
- package/dist/components/UtilityComponents/index.d.ts +0 -2
- package/dist/components/UtilityComponents/index.js +0 -2
- package/dist/components/UtilityComponents/useStableId.d.ts +0 -5
- package/dist/components/UtilityComponents/useStableId.js +0 -11
- package/dist/components/Window/Window.d.ts +0 -11
- package/dist/components/Window/Window.js +0 -14
- package/dist/components/Window/index.d.ts +0 -1
- package/dist/components/Window/index.js +0 -1
- package/dist/components/index.d.ts +0 -39
- package/dist/components/index.js +0 -38
- package/dist/constants/limits.d.ts +0 -5
- package/dist/constants/limits.js +0 -5
- package/dist/constants/messageTypes.d.ts +0 -4
- package/dist/constants/messageTypes.js +0 -4
- package/dist/context/AttachmentSelectorContext.d.ts +0 -9
- package/dist/context/AttachmentSelectorContext.js +0 -6
- package/dist/context/ChannelActionContext.d.ts +0 -55
- package/dist/context/ChannelActionContext.js +0 -26
- package/dist/context/ChannelListContext.d.ts +0 -30
- package/dist/context/ChannelListContext.js +0 -14
- package/dist/context/ChannelStateContext.d.ts +0 -58
- package/dist/context/ChannelStateContext.js +0 -26
- package/dist/context/ChatContext.d.ts +0 -57
- package/dist/context/ChatContext.js +0 -25
- package/dist/context/ComponentContext.d.ts +0 -199
- package/dist/context/ComponentContext.js +0 -24
- package/dist/context/DialogManagerContext.d.ts +0 -29
- package/dist/context/DialogManagerContext.js +0 -124
- package/dist/context/MessageBounceContext.d.ts +0 -12
- package/dist/context/MessageBounceContext.js +0 -36
- package/dist/context/MessageContext.d.ts +0 -137
- package/dist/context/MessageContext.js +0 -27
- package/dist/context/MessageInputContext.d.ts +0 -10
- package/dist/context/MessageInputContext.js +0 -12
- package/dist/context/MessageListContext.d.ts +0 -19
- package/dist/context/MessageListContext.js +0 -14
- package/dist/context/PollContext.d.ts +0 -11
- package/dist/context/PollContext.js +0 -7
- package/dist/context/TranslationContext.d.ts +0 -20
- package/dist/context/TranslationContext.js +0 -30
- package/dist/context/TypingContext.d.ts +0 -21
- package/dist/context/TypingContext.js +0 -26
- package/dist/context/VirtualizedMessageListContext.d.ts +0 -14
- package/dist/context/VirtualizedMessageListContext.js +0 -7
- package/dist/context/WithComponents.d.ts +0 -6
- package/dist/context/WithComponents.js +0 -7
- package/dist/context/index.d.ts +0 -14
- package/dist/context/index.js +0 -14
- package/dist/context/utils/getDisplayName.d.ts +0 -2
- package/dist/context/utils/getDisplayName.js +0 -1
- package/dist/experimental/MessageActions/MessageActions.d.ts +0 -17
- package/dist/experimental/MessageActions/MessageActions.js +0 -47
- package/dist/experimental/MessageActions/defaults.d.ts +0 -5
- package/dist/experimental/MessageActions/defaults.js +0 -141
- package/dist/experimental/MessageActions/hooks/index.d.ts +0 -2
- package/dist/experimental/MessageActions/hooks/index.js +0 -2
- package/dist/experimental/MessageActions/hooks/useBaseMessageActionSetFilter.d.ts +0 -8
- package/dist/experimental/MessageActions/hooks/useBaseMessageActionSetFilter.js +0 -61
- package/dist/experimental/MessageActions/hooks/useSplitMessageActionSet.d.ts +0 -5
- package/dist/experimental/MessageActions/hooks/useSplitMessageActionSet.js +0 -12
- package/dist/experimental/MessageActions/index.d.ts +0 -3
- package/dist/experimental/MessageActions/index.js +0 -3
- package/dist/experimental/Search/Search.d.ts +0 -11
- package/dist/experimental/Search/Search.js +0 -25
- package/dist/experimental/Search/SearchBar/SearchBar.d.ts +0 -2
- package/dist/experimental/Search/SearchBar/SearchBar.js +0 -56
- package/dist/experimental/Search/SearchBar/index.d.ts +0 -1
- package/dist/experimental/Search/SearchBar/index.js +0 -1
- package/dist/experimental/Search/SearchContext.d.ts +0 -23
- package/dist/experimental/Search/SearchContext.js +0 -10
- package/dist/experimental/Search/SearchResults/SearchResultItem.d.ts +0 -19
- package/dist/experimental/Search/SearchResults/SearchResultItem.js +0 -62
- package/dist/experimental/Search/SearchResults/SearchResults.d.ts +0 -2
- package/dist/experimental/Search/SearchResults/SearchResults.js +0 -21
- package/dist/experimental/Search/SearchResults/SearchResultsHeader.d.ts +0 -2
- package/dist/experimental/Search/SearchResults/SearchResultsHeader.js +0 -36
- package/dist/experimental/Search/SearchResults/SearchResultsPresearch.d.ts +0 -6
- package/dist/experimental/Search/SearchResults/SearchResultsPresearch.js +0 -6
- package/dist/experimental/Search/SearchResults/SearchSourceResultList.d.ts +0 -8
- package/dist/experimental/Search/SearchResults/SearchSourceResultList.js +0 -22
- package/dist/experimental/Search/SearchResults/SearchSourceResultListFooter.d.ts +0 -2
- package/dist/experimental/Search/SearchResults/SearchSourceResultListFooter.js +0 -16
- package/dist/experimental/Search/SearchResults/SearchSourceResults.d.ts +0 -6
- package/dist/experimental/Search/SearchResults/SearchSourceResults.js +0 -21
- package/dist/experimental/Search/SearchResults/SearchSourceResultsEmpty.d.ts +0 -2
- package/dist/experimental/Search/SearchResults/SearchSourceResultsEmpty.js +0 -6
- package/dist/experimental/Search/SearchResults/SearchSourceResultsHeader.d.ts +0 -1
- package/dist/experimental/Search/SearchResults/SearchSourceResultsHeader.js +0 -1
- package/dist/experimental/Search/SearchResults/SearchSourceResultsLoadingIndicator.d.ts +0 -2
- package/dist/experimental/Search/SearchResults/SearchSourceResultsLoadingIndicator.js +0 -10
- package/dist/experimental/Search/SearchResults/index.d.ts +0 -9
- package/dist/experimental/Search/SearchResults/index.js +0 -9
- package/dist/experimental/Search/SearchSourceResultsContext.d.ts +0 -14
- package/dist/experimental/Search/SearchSourceResultsContext.js +0 -10
- package/dist/experimental/Search/hooks/index.d.ts +0 -2
- package/dist/experimental/Search/hooks/index.js +0 -2
- package/dist/experimental/Search/hooks/useSearchFocusedMessage.d.ts +0 -1
- package/dist/experimental/Search/hooks/useSearchFocusedMessage.js +0 -10
- package/dist/experimental/Search/hooks/useSearchQueriesInProgress.d.ts +0 -5
- package/dist/experimental/Search/hooks/useSearchQueriesInProgress.js +0 -22
- package/dist/experimental/Search/index.d.ts +0 -5
- package/dist/experimental/Search/index.js +0 -5
- package/dist/experimental/index.browser.cjs +0 -15726
- package/dist/experimental/index.browser.cjs.map +0 -7
- package/dist/experimental/index.d.ts +0 -2
- package/dist/experimental/index.js +0 -2
- package/dist/experimental/index.node.cjs +0 -17624
- package/dist/experimental/index.node.cjs.map +0 -7
- package/dist/i18n/Streami18n.d.ts +0 -413
- package/dist/i18n/Streami18n.js +0 -648
- package/dist/i18n/TranslationBuilder/TranslationBuilder.d.ts +0 -35
- package/dist/i18n/TranslationBuilder/TranslationBuilder.js +0 -92
- package/dist/i18n/TranslationBuilder/index.d.ts +0 -2
- package/dist/i18n/TranslationBuilder/index.js +0 -2
- package/dist/i18n/TranslationBuilder/notifications/NotificationTranslationTopic.d.ts +0 -11
- package/dist/i18n/TranslationBuilder/notifications/NotificationTranslationTopic.js +0 -32
- package/dist/i18n/TranslationBuilder/notifications/attachmentUpload.d.ts +0 -5
- package/dist/i18n/TranslationBuilder/notifications/attachmentUpload.js +0 -37
- package/dist/i18n/TranslationBuilder/notifications/browserAudioPlaybackError.d.ts +0 -3
- package/dist/i18n/TranslationBuilder/notifications/browserAudioPlaybackError.js +0 -1
- package/dist/i18n/TranslationBuilder/notifications/index.d.ts +0 -2
- package/dist/i18n/TranslationBuilder/notifications/index.js +0 -2
- package/dist/i18n/TranslationBuilder/notifications/pollComposition.d.ts +0 -3
- package/dist/i18n/TranslationBuilder/notifications/pollComposition.js +0 -9
- package/dist/i18n/TranslationBuilder/notifications/pollVoteCountTrespass.d.ts +0 -3
- package/dist/i18n/TranslationBuilder/notifications/pollVoteCountTrespass.js +0 -1
- package/dist/i18n/TranslationBuilder/notifications/types.d.ts +0 -4
- package/dist/i18n/TranslationBuilder/notifications/types.js +0 -1
- package/dist/i18n/de.json +0 -262
- package/dist/i18n/en.json +0 -262
- package/dist/i18n/es.json +0 -270
- package/dist/i18n/fr.json +0 -270
- package/dist/i18n/hi.json +0 -263
- package/dist/i18n/index.d.ts +0 -5
- package/dist/i18n/index.js +0 -5
- package/dist/i18n/it.json +0 -270
- package/dist/i18n/ja.json +0 -256
- package/dist/i18n/ko.json +0 -256
- package/dist/i18n/nl.json +0 -262
- package/dist/i18n/pt.json +0 -270
- package/dist/i18n/ru.json +0 -278
- package/dist/i18n/tr.json +0 -262
- package/dist/i18n/translations.d.ts +0 -13
- package/dist/i18n/translations.js +0 -13
- package/dist/i18n/types.d.ts +0 -80
- package/dist/i18n/types.js +0 -1
- package/dist/i18n/utils.d.ts +0 -14
- package/dist/i18n/utils.js +0 -111
- package/dist/index.browser.cjs +0 -37672
- package/dist/index.browser.cjs.map +0 -7
- package/dist/index.d.ts +0 -6
- package/dist/index.js +0 -6
- package/dist/index.node.cjs +0 -39963
- package/dist/index.node.cjs.map +0 -7
- package/dist/plugins/Emojis/EmojiPicker.d.ts +0 -27
- package/dist/plugins/Emojis/EmojiPicker.js +0 -59
- package/dist/plugins/Emojis/icons.d.ts +0 -2
- package/dist/plugins/Emojis/icons.js +0 -4
- package/dist/plugins/Emojis/index.browser.cjs +0 -471
- package/dist/plugins/Emojis/index.browser.cjs.map +0 -7
- package/dist/plugins/Emojis/index.d.ts +0 -3
- package/dist/plugins/Emojis/index.js +0 -3
- package/dist/plugins/Emojis/index.node.cjs +0 -477
- package/dist/plugins/Emojis/index.node.cjs.map +0 -7
- package/dist/plugins/Emojis/middleware/index.d.ts +0 -1
- package/dist/plugins/Emojis/middleware/index.js +0 -1
- package/dist/plugins/Emojis/middleware/textComposerEmojiMiddleware.d.ts +0 -22
- package/dist/plugins/Emojis/middleware/textComposerEmojiMiddleware.js +0 -137
- package/dist/plugins/encoders/mp3.browser.cjs +0 -108
- package/dist/plugins/encoders/mp3.browser.cjs.map +0 -7
- package/dist/plugins/encoders/mp3.d.ts +0 -1
- package/dist/plugins/encoders/mp3.js +0 -33
- package/dist/plugins/encoders/mp3.node.cjs +0 -112
- package/dist/plugins/encoders/mp3.node.cjs.map +0 -7
- package/dist/store/hooks/index.d.ts +0 -1
- package/dist/store/hooks/index.js +0 -1
- package/dist/store/hooks/useStateStore.d.ts +0 -3
- package/dist/store/hooks/useStateStore.js +0 -39
- package/dist/store/index.d.ts +0 -1
- package/dist/store/index.js +0 -1
- package/dist/types/defaultDataInterfaces.d.ts +0 -28
- package/dist/types/defaultDataInterfaces.js +0 -1
- package/dist/types/index.js +0 -1
- package/dist/types/types.d.ts +0 -57
- package/dist/types/types.js +0 -1
- package/dist/utils/browsers.d.ts +0 -1
- package/dist/utils/browsers.js +0 -5
- package/dist/utils/deprecationWarning.d.ts +0 -1
- package/dist/utils/deprecationWarning.js +0 -12
- package/dist/utils/findReverse.d.ts +0 -1
- package/dist/utils/findReverse.js +0 -9
- package/dist/utils/getChannel.d.ts +0 -20
- package/dist/utils/getChannel.js +0 -52
- package/dist/utils/getWholeChar.d.ts +0 -1
- package/dist/utils/getWholeChar.js +0 -26
- package/dist/utils/index.d.ts +0 -2
- package/dist/utils/index.js +0 -2
- package/dist/utils/mergeDeep.d.ts +0 -2
- package/dist/utils/mergeDeep.js +0 -5
- package/dist/utils/useStableCallback.d.ts +0 -25
- package/dist/utils/useStableCallback.js +0 -29
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/components/AIStateIndicator/hooks/useAIState.ts","../../src/components/Dialog/service/DialogManager.ts","../../src/components/Dialog/hooks/useDialog.ts","../../src/components/Portal/Portal.ts","../../src/components/Dialog/service/DialogPortal.tsx","../../src/context/DialogManagerContext.tsx","../../src/context/MessageContext.tsx","../../src/context/MessageBounceContext.tsx","../../src/context/MessageListContext.tsx","../../src/context/MessageTranslationViewContext.tsx","../../src/context/ModalContext.tsx","../../src/context/PollContext.tsx","../../src/context/WithComponents.tsx","../../src/components/AIStateIndicator/AIStateIndicator.tsx","../../src/components/Attachment/icons.tsx","../../src/components/SafeAnchor/SafeAnchor.tsx","../../src/components/Attachment/components/DownloadButton.tsx","../../src/components/MessageComposer/hooks/utils.ts","../../src/components/Attachment/components/FileSizeIndicator.tsx","../../src/components/Notifications/hooks/useNotifications.ts","../../src/components/Icons/IconGiphy.tsx","../../src/components/Button/PlayButton.tsx","../../node_modules/dayjs/plugin/updateLocale.js","../../node_modules/dayjs/plugin/localeData.js","../../node_modules/dayjs/plugin/relativeTime.js","../../node_modules/dayjs/plugin/duration.js","../../node_modules/dayjs/plugin/utc.js","../../node_modules/dayjs/plugin/timezone.js","../../src/i18n/TranslationBuilder/TranslationBuilder.ts","../../src/i18n/TranslationBuilder/notifications/translators.ts","../../src/i18n/TranslationBuilder/notifications/translatorsByNotificationType.ts","../../src/i18n/TranslationBuilder/notifications/NotificationTranslationTopic.ts","../../node_modules/dayjs/locale/de.js","../../node_modules/dayjs/locale/es.js","../../node_modules/dayjs/locale/fr.js","../../node_modules/dayjs/locale/hi.js","../../node_modules/dayjs/locale/it.js","../../node_modules/dayjs/locale/ja.js","../../node_modules/dayjs/locale/ko.js","../../node_modules/dayjs/locale/nl.js","../../node_modules/dayjs/locale/pt.js","../../node_modules/dayjs/locale/ru.js","../../node_modules/dayjs/locale/tr.js","../../node_modules/dayjs/locale/en.js","../../src/i18n/Streami18n.ts","../../src/components/Loading/LoadingChannels.tsx","../../src/components/Loading/LoadingIndicator.tsx","../../src/components/MessageList/CustomNotification.tsx","../../src/components/MessageList/ConnectionStatus.tsx","../../src/utils/useStableCallback.ts","../../src/components/Message/hooks/useActionHandler.ts","../../src/components/Message/hooks/useDeleteHandler.ts","../../src/components/Message/hooks/useFlagHandler.ts","../../src/components/Message/hooks/useMentionsHandler.ts","../../src/components/Message/hooks/useMarkUnreadHandler.ts","../../src/components/Message/hooks/useMuteHandler.ts","../../src/components/Message/hooks/useOpenThreadHandler.ts","../../src/components/Message/hooks/usePinHandler.ts","../../src/components/Message/hooks/useReactionHandler.ts","../../src/components/Message/hooks/useRetryHandler.ts","../../src/components/Message/hooks/useUserHandler.ts","../../src/components/Message/hooks/useUserRole.ts","../../src/components/Message/hooks/useReactionsFetcher.ts","../../src/components/Message/hooks/useMessageTextStreaming.ts","../../src/components/Message/hooks/useMessageReminder.ts","../../src/components/Dialog/components/Alert.tsx","../../src/components/Dialog/service/DialogAnchor.tsx","../../src/components/Dialog/components/Callout.tsx","../../src/components/Avatar/Avatar.tsx","../../src/components/Badge/Badge.tsx","../../src/components/Avatar/AvatarStack.tsx","../../src/components/Avatar/ChannelAvatar.tsx","../../src/components/Avatar/GroupAvatar.tsx","../../src/components/Dialog/components/ContextMenu.tsx","../../src/components/Dialog/components/Prompt.tsx","../../src/components/Dialog/components/Viewer.tsx","../../src/components/Modal/GlobalModal.tsx","../../src/components/MessageBounce/MessageBounceModal.tsx","../../src/components/MessageBounce/MessageBouncePrompt.tsx","../../src/components/Message/MessageBubble.tsx","../../src/components/Message/MessageDeletedBubble.tsx","../../src/components/Message/MessageBlocked.tsx","../../src/components/MessageActions/hooks/useBaseMessageActionSetFilter.ts","../../src/components/Message/MessageAlsoSentInChannelIndicator.tsx","../../src/components/Message/MessageRepliesCountButton.tsx","../../src/components/Message/PinIndicator.tsx","../../src/components/Tooltip/Tooltip.tsx","../../src/components/Tooltip/hooks/useEnterLeaveHandlers.ts","../../src/components/Message/MessageStatus.tsx","../../src/components/Message/renderText/regex.ts","../../src/components/Message/renderText/rehypePlugins/emojiMarkdownPlugin.ts","../../src/components/Message/renderText/rehypePlugins/mentionsMarkdownPlugin.ts","../../src/components/Message/renderText/remarkPlugins/htmlToTextPlugin.ts","../../src/components/Message/renderText/remarkPlugins/imageToLink.ts","../../src/components/Message/renderText/remarkPlugins/keepLineBreaksPlugin.ts","../../src/components/Message/renderText/remarkPlugins/plusPlusToEmphasis.ts","../../src/components/Message/renderText/remarkPlugins/remarkIgnoreMarkdown.ts","../../src/components/Message/renderText/componentRenderers/Anchor.tsx","../../src/components/Message/renderText/componentRenderers/Emoji.tsx","../../src/components/Message/renderText/componentRenderers/Mention.tsx","../../src/components/UtilityComponents/NullComponent.tsx","../../src/components/UtilityComponents/ErrorBoundary.tsx","../../src/components/Message/renderText/renderText.tsx","../../src/components/Message/MessageText.tsx","../../src/components/Message/Timestamp.tsx","../../src/components/Message/MessageTimestamp.tsx","../../src/components/Message/MessageEditedIndicator.tsx","../../src/components/Message/MessageTranslationIndicator.tsx","../../src/components/MessageComposer/hooks/useAttachmentManagerState.ts","../../src/components/MessageComposer/hooks/useAttachmentsForPreview.ts","../../src/components/MessageComposer/hooks/useCanCreatePoll.ts","../../src/components/MessageComposer/hooks/useCooldownRemaining.tsx","../../src/components/MessageComposer/hooks/useTextareaRef.ts","../../src/components/MessageComposer/hooks/useSubmitHandler.ts","../../src/components/ReactFileUtilities/UploadButton.tsx","../../src/components/MessageComposer/hooks/usePasteHandler.ts","../../src/components/MediaRecorder/observable/Subscription.ts","../../src/components/MediaRecorder/observable/Observer.ts","../../src/components/MediaRecorder/observable/Observable.ts","../../src/components/MediaRecorder/observable/Subject.ts","../../src/components/MediaRecorder/observable/BehaviorSubject.ts","../../src/components/MediaRecorder/classes/BrowserPermission.ts","../../src/utils/mergeDeep.ts","../../src/components/MediaRecorder/classes/AmplitudeRecorder.ts","../../src/components/MediaRecorder/transcode/wav.ts","../../src/components/MediaRecorder/transcode/index.ts","../../src/components/MediaRecorder/classes/MediaRecorderController.ts","../../src/components/MediaRecorder/hooks/useMediaRecorder.ts","../../src/components/MessageComposer/hooks/useMessageComposerBindings.ts","../../src/components/MessageComposer/hooks/useMessageComposerHasSendableData.ts","../../src/components/MessageComposer/hooks/useMessageContentIsEmpty.ts","../../src/components/MessageComposer/RemoveAttachmentPreviewButton.tsx","../../src/components/BaseImage/ImagePlaceholder.tsx","../../src/components/BaseImage/BaseImage.tsx","../../src/components/BaseImage/toBaseImageDescriptors.ts","../../src/components/FileIcon/FileIconSet.tsx","../../src/components/FileIcon/mimeTypes.ts","../../src/components/FileIcon/iconMap.ts","../../src/components/FileIcon/FileIcon.tsx","../../src/components/MessageComposer/QuotedMessageIndicator.tsx","../../src/components/MessageComposer/QuotedMessagePreview.tsx","../../src/components/Message/QuotedMessage.tsx","../../src/components/Message/ReminderNotification.tsx","../../src/components/Message/StreamedMessageText.tsx","../../src/components/Form/Dropdown.tsx","../../src/components/Form/SwitchField.tsx","../../src/components/Location/ShareLocationDialog.tsx","../../src/components/Poll/PollHeader.tsx","../../src/components/Form/FieldError.tsx","../../src/components/UtilityComponents/useStableId.ts","../../src/components/Form/NumericInput.tsx","../../src/components/Form/TextInput.tsx","../../src/components/DragAndDrop/DragAndDropContainer.tsx","../../src/components/Form/TextInputFieldSet.tsx","../../src/components/Form/hooks/useFormState.ts","../../src/components/Poll/PollActions/AddCommentPrompt.tsx","../../src/components/Poll/PollActions/EndPollAlert.tsx","../../src/components/Poll/PollActions/PollAction.tsx","../../src/components/Poll/PollActions/SuggestPollOptionPrompt.tsx","../../src/components/Poll/PollVote.tsx","../../src/components/Poll/hooks/useManagePollVotesRealtime.ts","../../src/components/InfiniteScrollPaginator/hooks/useCursorPaginator.ts","../../src/components/Poll/hooks/usePollAnswerPagination.ts","../../src/components/Poll/hooks/usePollOptionVotesPagination.ts","../../src/components/InfiniteScrollPaginator/InfiniteScrollPaginator.tsx","../../src/components/Poll/PollActions/PollAnswerList.tsx","../../src/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.tsx","../../src/components/Poll/PollActions/PollResults/PollOptionWithVotes.tsx","../../src/components/Poll/constants.ts","../../src/components/Poll/PollActions/PollQuestion.tsx","../../src/components/Poll/PollActions/PollResults/PollOptionWithVotesList.tsx","../../src/components/Poll/PollActions/PollResults/PollResults.tsx","../../src/components/Poll/PollActions/PollActions.tsx","../../src/components/Poll/PollOptionSelector.tsx","../../src/components/Poll/PollOptionList.tsx","../../src/components/Poll/PollActions/PollOptionsFullList.tsx","../../src/components/Poll/PollContent.tsx","../../src/components/Poll/Poll.tsx","../../src/components/Poll/PollCreationDialog/MultipleAnswersField.tsx","../../src/components/Poll/PollCreationDialog/NameField.tsx","../../src/components/Poll/PollCreationDialog/OptionFieldSet.tsx","../../src/components/Poll/PollCreationDialog/PollCreationDialogControls.tsx","../../src/components/Poll/PollCreationDialog/PollCreationDialog.tsx","../../src/context/AttachmentSelectorContext.tsx","../../src/components/MessageComposer/AttachmentSelector/CommandsMenu.tsx","../../src/components/MessageComposer/AttachmentSelector/AttachmentSelector.tsx","../../src/components/MessageComposer/icons.tsx","../../src/components/MessageComposer/AttachmentPreviewList/utils/AttachmentPreviewRoot.tsx","../../src/components/MessageComposer/AttachmentPreviewList/FileAttachmentPreview.tsx","../../src/components/MessageComposer/AttachmentPreviewList/UnsupportedAttachmentPreview.tsx","../../src/components/AudioPlayback/components/DurationDisplay.tsx","../../src/components/AudioPlayback/components/PlaybackRateButton.tsx","../../src/components/AudioPlayback/components/useInteractiveProgressBar.ts","../../src/components/AudioPlayback/components/ProgressBar.tsx","../../src/components/Attachment/utils.tsx","../../src/components/Attachment/audioSampling.ts","../../src/components/AudioPlayback/components/WaveProgressBar.tsx","../../src/components/MessageComposer/AttachmentPreviewList/AudioAttachmentPreview.tsx","../../src/components/MessageComposer/AttachmentPreviewList/MediaAttachmentPreview.tsx","../../src/components/Gallery/GalleryContext.tsx","../../src/components/Gallery/GalleryHeader.tsx","../../src/components/VideoPlayer/VideoPlayer.tsx","../../src/components/VideoPlayer/VideoThumbnail.tsx","../../src/components/Gallery/GalleryUI.tsx","../../src/components/Gallery/Gallery.tsx","../../src/components/MessageComposer/AttachmentPreviewList/AttachmentPreviewList.tsx","../../src/components/MessageComposer/AttachmentPreviewList/VoiceRecordingPreviewSlot.tsx","../../src/components/MessageComposer/CommandChip.tsx","../../src/components/MessageComposer/CooldownTimer.tsx","../../src/components/MessageComposer/LinkPreviewList.tsx","../../src/components/MediaRecorder/RecordingPermissionDeniedNotification.tsx","../../src/components/MediaRecorder/AudioRecorder/AudioRecordingPlayback.tsx","../../src/components/MediaRecorder/AudioRecorder/hooks/useTimeElapsed.ts","../../src/components/MediaRecorder/AudioRecorder/RecordingTimer.tsx","../../src/components/MediaRecorder/AudioRecorder/AudioRecordingPreview.tsx","../../src/components/MediaRecorder/AudioRecorder/recordingStateIdentity.ts","../../src/components/MediaRecorder/AudioRecorder/AudioRecorderRecordingControls.tsx","../../src/components/MediaRecorder/AudioRecorder/AudioRecorder.tsx","../../src/components/MediaRecorder/AudioRecorder/AudioRecordingButtonWithNotification.tsx","../../src/components/MessageComposer/EditedMessagePreview.tsx","../../src/components/MessageComposer/SendToChannelCheckbox.tsx","../../src/components/TextareaComposer/SuggestionList/CommandItem.tsx","../../src/components/TextareaComposer/SuggestionList/EmoticonItem.tsx","../../src/components/TextareaComposer/SuggestionList/SuggestionListItem.tsx","../../src/components/TextareaComposer/SuggestionList/UserItem.tsx","../../src/utils/getTextareaCaretRect.ts","../../src/components/TextareaComposer/SuggestionList/SuggestionList.tsx","../../src/components/TextareaComposer/hooks/useTextareaPlaceholder.ts","../../src/components/TextareaComposer/TextareaComposer.tsx","../../src/components/MessageComposer/WithDragAndDropUpload.tsx","../../src/components/MessageComposer/StopAIGenerationButton.tsx","../../src/components/MessageComposer/SendButton.tsx","../../src/components/MessageComposer/MessageComposerActions.tsx","../../src/components/MessageComposer/AttachmentPreviewList/GeolocationPreview.tsx","../../src/components/MessageComposer/MessageComposerUI.tsx","../../src/components/MessageComposer/hooks/useCreateMessageComposerContext.ts","../../src/components/MessageComposer/MessageComposer.tsx","../../src/components/ChannelListItem/utils.tsx","../../src/components/ChannelListItem/hooks/useChannelDisplayName.ts","../../src/components/ChannelListItem/hooks/useChannelPreviewInfo.ts","../../src/components/TypingIndicator/TypingIndicatorDots.tsx","../../src/components/TypingIndicator/hooks/useDebouncedTypingActive.ts","../../src/components/TypingIndicator/TypingIndicatorHeader.tsx","../../src/components/Chat/hooks/useChat.ts","../../src/components/ChannelHeader/hooks/useIsMobileViewport.ts","../../src/components/Button/ToggleSidebarButton.tsx","../../src/components/Thread/ThreadHeader.tsx","../../src/components/Thread/ThreadStart.tsx","../../src/components/DateSeparator/DateSeparator.tsx","../../src/components/Thread/ThreadHead.tsx","../../src/components/Thread/Thread.tsx","../../src/components/Reactions/reactionOptions.tsx","../../src/components/Reactions/ReactionSelector.tsx","../../src/components/Reactions/ReactionSelectorWithButton.tsx","../../src/components/MessageActions/RemindMeSubmenu.tsx","../../src/components/MessageActions/QuickMessageActionButton.tsx","../../src/components/MessageActions/DeleteMessageAlert.tsx","../../src/components/MessageActions/MessageActions.defaults.tsx","../../src/components/Reactions/hooks/useFetchReactions.ts","../../src/components/Reactions/MessageReactionsDetail.tsx","../../src/components/Reactions/hooks/useProcessReactions.tsx","../../src/components/Reactions/MessageReactions.tsx","../../src/components/Reactions/utils/utils.ts","../../src/components/Reactions/SpriteImage.tsx","../../src/components/Reactions/StreamEmoji.tsx","../../src/components/Chat/hooks/useSplitActionSet.ts","../../src/components/MessageActions/MessageActions.tsx","../../src/components/Message/MessageUI.tsx","../../src/components/Message/Message.tsx","../../src/components/MessageList/GiphyPreviewMessage.tsx","../../src/components/MessageList/hooks/MessageList/useEnrichedMessages.ts","../../src/components/MessageList/hooks/MessageList/useFloatingDateSeparatorMessageList.ts","../../src/components/MessageList/hooks/useLastReadData.ts","../../src/components/MessageList/hooks/useLastDeliveredData.ts","../../src/components/MessageList/hooks/MessageList/useMessageListElements.tsx","../../src/components/MessageList/hooks/MessageList/useMessageListScrollManager.ts","../../src/components/MessageList/hooks/MessageList/useScrollLocationLogic.tsx","../../src/components/MessageList/MessageListMainPanel.tsx","../../src/components/MessageList/UnreadMessagesSeparator.tsx","../../src/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.ts","../../src/components/MessageList/hooks/useMarkRead.ts","../../src/components/MessageList/NewMessageNotification.tsx","../../src/components/MessageList/UnreadMessagesNotification.tsx","../../src/utils/deprecationWarning.ts","../../src/components/InfiniteScrollPaginator/InfiniteScroll.tsx","../../src/components/TypingIndicator/TypingIndicator.tsx","../../src/components/MessageList/hooks/VirtualizedMessageList/useFloatingDateSeparator.ts","../../src/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.ts","../../src/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.ts","../../src/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.ts","../../src/components/MessageList/hooks/VirtualizedMessageList/usePrependMessagesCount.ts","../../src/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.ts","../../src/components/MessageList/hooks/VirtualizedMessageList/useShouldForceScrollToBottom.ts","../../src/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.ts","../../src/components/MessageList/FloatingDateSeparator.tsx","../../src/components/EventComponent/EventComponent.tsx","../../src/components/MessageList/renderMessages.tsx","../../src/utils/findReverse.ts","../../src/components/MessageList/hooks/useLastOwnMessage.ts","../../src/components/MessageList/ScrollToLatestMessageButton.tsx","../../src/components/MessageList/MessageList.tsx","../../src/components/MessageList/VirtualizedMessageListComponents.tsx","../../src/context/VirtualizedMessageListContext.tsx","../../src/components/MessageList/VirtualizedMessageList.tsx","../../src/utils/getWholeChar.ts","../../src/components/Search/hooks/useSearchQueriesInProgress.ts","../../src/components/ChannelList/hooks/useConnectionRecoveredListener.ts","../../src/components/ChannelList/hooks/useMobileNavigation.ts","../../src/components/ChannelList/hooks/usePaginatedChannels.ts","../../src/components/ChannelList/utils.ts","../../src/components/ChannelList/hooks/useChannelListShape.ts","../../src/components/ChannelList/ChannelListUI.tsx","../../src/components/Search/SearchContext.tsx","../../src/components/Search/SearchBar/SearchBar.tsx","../../src/components/Search/SearchResults/SearchResultItem.tsx","../../src/components/Search/SearchSourceResultsContext.tsx","../../src/components/Search/SearchResults/SearchSourceResultsLoadingIndicator.tsx","../../src/components/Search/SearchResults/SearchSourceResultListFooter.tsx","../../src/components/Search/SearchResults/SearchSourceResultList.tsx","../../src/components/Search/SearchResults/SearchSourceResultsEmpty.tsx","../../src/components/Search/SearchResults/SearchSourceResultsHeader.tsx","../../src/components/Search/SearchResults/SearchSourceResults.tsx","../../src/components/Search/SearchResults/SearchResultsHeader.tsx","../../src/components/Search/SearchResults/SearchResultsPresearch.tsx","../../src/components/Search/SearchResults/SearchResults.tsx","../../src/components/Search/Search.tsx","../../src/components/LoadMore/LoadMoreButton.tsx","../../src/components/LoadMore/LoadMorePaginator.tsx","../../src/components/ChannelList/ChannelListHeader.tsx","../../src/components/ChannelList/ChannelList.tsx","../../src/components/ChannelList/hooks/useChannelDeletedListener.ts","../../src/components/ChannelList/hooks/useChannelHiddenListener.ts","../../src/components/ChannelList/hooks/useChannelTruncatedListener.ts","../../src/components/ChannelList/hooks/useChannelUpdatedListener.ts","../../src/components/ChannelList/hooks/useChannelVisibleListener.ts","../../src/components/ChannelList/hooks/useMessageNewListener.ts","../../src/components/ChannelList/hooks/useNotificationAddedToChannelListener.ts","../../src/components/ChannelList/hooks/useNotificationMessageNewListener.ts","../../src/components/ChannelList/hooks/useNotificationRemovedFromChannelListener.ts","../../src/components/ChannelList/hooks/useUserPresenceChangedListener.ts","../../src/components/ChannelList/hooks/useSelectedChannelState.ts","../../src/components/ChannelList/hooks/useChannelMembershipState.ts","../../src/components/ChannelList/hooks/useChannelMembersState.ts","../../src/components/ChannelListItem/hooks/useIsChannelMuted.ts","../../src/components/ChannelListItem/ChannelListItemActionButtons.defaults.tsx","../../src/components/ChannelListItem/ChannelListItemActionButtons.tsx","../../src/components/ChannelListItem/ChannelListItemTimestamp.tsx","../../src/components/SummarizedMessagePreview/hooks/useLatestMessagePreview.ts","../../src/components/SummarizedMessagePreview/SummarizedMessagePreview.tsx","../../src/components/ChannelListItem/ChannelListItemUI.tsx","../../src/components/ChannelListItem/hooks/useMessageDeliveryStatus.ts","../../src/components/ChannelListItem/ChannelListItem.tsx","../../src/components/Chat/hooks/useCreateChatContext.ts","../../src/components/Chat/hooks/useChannelsQueryState.ts","../../src/components/Chat/Chat.tsx","../../src/components/Chat/hooks/useCreateChatClient.ts","../../src/components/Threads/ThreadList/ThreadListItemUI.tsx","../../src/components/Threads/ThreadList/ThreadListItem.tsx","../../src/components/Threads/ThreadList/ThreadListEmptyPlaceholder.tsx","../../src/components/Threads/ThreadList/ThreadListUnseenThreadsBanner.tsx","../../src/components/Threads/ThreadList/ThreadListLoadingIndicator.tsx","../../src/components/Threads/ThreadList/ThreadListHeader.tsx","../../src/components/Threads/ThreadList/ThreadList.tsx","../../src/components/Notifications/Notification.tsx","../../src/components/Notifications/NotificationList.tsx","../../src/components/Attachment/Audio.tsx","../../src/components/Attachment/AttachmentActions.tsx","../../src/components/Attachment/VoiceRecording.tsx","../../src/components/Attachment/ModalGallery.tsx","../../src/components/Attachment/Image.tsx","../../src/components/Attachment/LinkPreview/UnableToRenderCard.tsx","../../src/components/Attachment/LinkPreview/Card.tsx","../../src/components/Attachment/FileAttachment.tsx","../../src/components/Attachment/Giphy.tsx","../../src/components/Attachment/Geolocation.tsx","../../src/components/Attachment/UnsupportedAttachment.tsx","../../src/components/Attachment/VisibilityDisclaimer.tsx","../../src/components/Attachment/VideoAttachment.tsx","../../src/components/Attachment/AttachmentContainer.tsx","../../src/components/Attachment/Attachment.tsx","../../src/components/Location/hooks/useLiveLocationSharingManager.ts","../../src/components/ChannelHeader/hooks/useChannelHeaderOnlineStatus.ts","../../src/components/ChannelHeader/ChannelHeader.tsx","../../src/components/Window/Window.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport type { AIState, Channel, Event } from 'stream-chat';\n\nexport const AIStates = {\n Error: 'AI_STATE_ERROR',\n ExternalSources: 'AI_STATE_EXTERNAL_SOURCES',\n Generating: 'AI_STATE_GENERATING',\n Idle: 'AI_STATE_IDLE',\n Stop: 'AI_STATE_STOP',\n Thinking: 'AI_STATE_THINKING',\n};\n\n/**\n * A hook that returns the current state of the AI.\n * @param {Channel} channel - The channel for which we want to know the AI state.\n * @returns {{ aiState: AIState }} The current AI state for the given channel.\n */\nexport const useAIState = (channel?: Channel): { aiState: AIState } => {\n const [aiState, setAiState] = useState<AIState>(AIStates.Idle);\n\n useEffect(() => {\n if (!channel) {\n return;\n }\n\n const indicatorChangedListener = channel.on('ai_indicator.update', (event: Event) => {\n const { cid } = event;\n const state = event.ai_state as AIState;\n if (channel.cid === cid) {\n setAiState(state);\n }\n });\n\n const indicatorClearedListener = channel.on('ai_indicator.clear', (event) => {\n const { cid } = event;\n if (channel.cid === cid) {\n setAiState(AIStates.Idle);\n }\n });\n\n const indicatorStoppedListener = channel.on('ai_indicator.stop', (event) => {\n const { cid } = event;\n if (channel.cid === cid) {\n setAiState(AIStates.Stop);\n }\n });\n\n return () => {\n indicatorChangedListener.unsubscribe();\n indicatorClearedListener.unsubscribe();\n indicatorStoppedListener.unsubscribe();\n };\n }, [channel]);\n\n return { aiState };\n};\n","import { nanoid } from 'nanoid';\nimport { StateStore } from 'stream-chat';\n\nexport type GetDialogParams = {\n id: DialogId;\n};\nexport type GetOrCreateDialogParams = GetDialogParams;\n\ntype DialogId = string;\n\nexport type Dialog = {\n close: () => void;\n id: DialogId;\n isOpen: boolean | undefined;\n open: (zIndex?: number) => void;\n removalTimeout: NodeJS.Timeout | undefined;\n remove: () => void;\n toggle: (closeAll?: boolean) => void;\n};\n\nexport type DialogManagerOptions = {\n id?: string;\n};\n\ntype Dialogs = Record<DialogId, Dialog>;\n\nexport type DialogManagerState = {\n dialogsById: Dialogs;\n};\n\n/**\n * Keeps a map of Dialog objects.\n * Dialog can be controlled via `Dialog` object retrieved using `useDialog()` hook.\n * The hook returns an object with the following API:\n *\n * - `dialog.open()` - opens the dialog\n * - `dialog.close()` - closes the dialog\n * - `dialog.toggle()` - toggles the dialog open state. Accepts boolean argument closeAll. If enabled closes any other dialog that would be open.\n * - `dialog.remove()` - removes the dialog object reference from the state (primarily for cleanup purposes)\n */\nexport class DialogManager {\n id: string;\n state = new StateStore<DialogManagerState>({\n dialogsById: {},\n });\n\n constructor({ id }: DialogManagerOptions = {}) {\n this.id = id ?? nanoid();\n }\n\n get openDialogCount() {\n return Object.values(this.state.getLatestValue().dialogsById).reduce(\n (count, dialog) => {\n if (dialog.isOpen) return count + 1;\n return count;\n },\n 0,\n );\n }\n\n get(id: DialogId) {\n return this.state.getLatestValue().dialogsById[id];\n }\n\n getOrCreate({ id }: GetOrCreateDialogParams) {\n let dialog = this.state.getLatestValue().dialogsById[id];\n if (!dialog) {\n dialog = {\n close: () => {\n this.close(id);\n },\n id,\n isOpen: false,\n open: () => {\n this.open({ id });\n },\n removalTimeout: undefined,\n remove: () => {\n this.remove(id);\n },\n toggle: (closeAll = false) => {\n this.toggle({ id }, closeAll);\n },\n };\n this.state.next((current) => ({\n ...current,\n ...{ dialogsById: { ...current.dialogsById, [id]: dialog } },\n }));\n }\n\n if (dialog.removalTimeout) {\n clearTimeout(dialog.removalTimeout);\n this.state.next((current) => ({\n ...current,\n ...{\n dialogsById: {\n ...current.dialogsById,\n [id]: {\n ...dialog,\n removalTimeout: undefined,\n },\n },\n },\n }));\n }\n\n return dialog;\n }\n\n open(params: GetOrCreateDialogParams, closeRest?: boolean) {\n const dialog = this.getOrCreate(params);\n if (dialog.isOpen) return;\n if (closeRest) {\n this.closeAll();\n }\n this.state.next((current) => ({\n ...current,\n dialogsById: { ...current.dialogsById, [dialog.id]: { ...dialog, isOpen: true } },\n }));\n }\n\n close(id: DialogId) {\n const dialog = this.state.getLatestValue().dialogsById[id];\n if (!dialog?.isOpen) return;\n this.state.next((current) => ({\n ...current,\n dialogsById: { ...current.dialogsById, [dialog.id]: { ...dialog, isOpen: false } },\n }));\n }\n\n closeAll() {\n Object.values(this.state.getLatestValue().dialogsById).forEach((dialog) =>\n dialog.close(),\n );\n }\n\n toggle(params: GetOrCreateDialogParams, closeAll = false) {\n if (this.state.getLatestValue().dialogsById[params.id]?.isOpen) {\n this.close(params.id);\n } else {\n this.open(params, closeAll);\n }\n }\n\n remove(id: DialogId) {\n const state = this.state.getLatestValue();\n const dialog = state.dialogsById[id];\n if (!dialog) return;\n\n if (dialog.removalTimeout) {\n clearTimeout(dialog.removalTimeout);\n }\n\n this.state.next((current) => {\n const newDialogs = { ...current.dialogsById };\n delete newDialogs[id];\n return {\n ...current,\n dialogsById: newDialogs,\n };\n });\n }\n\n /**\n * Marks the dialog state as unused. If the dialog id is referenced again quickly,\n * the state will not be removed. Otherwise, the state will be removed after\n * a short timeout.\n */\n markForRemoval(id: DialogId) {\n const dialog = this.state.getLatestValue().dialogsById[id];\n\n if (!dialog) {\n return;\n }\n\n this.state.next((current) => ({\n ...current,\n dialogsById: {\n ...current.dialogsById,\n [id]: {\n ...dialog,\n removalTimeout: setTimeout(() => {\n this.remove(id);\n }, 16),\n },\n },\n }));\n }\n}\n","import { useCallback, useEffect } from 'react';\nimport {\n modalDialogManagerId,\n useDialogManager,\n useNearestDialogManagerContext,\n} from '../../../context';\nimport { useStateStore } from '../../../store';\n\nimport type {\n DialogManagerState,\n GetOrCreateDialogParams,\n} from '../service/DialogManager';\n\nexport type UseDialogParams = GetOrCreateDialogParams & {\n dialogManagerId?: string;\n};\n\nexport const useDialog = ({ dialogManagerId, id }: UseDialogParams) => {\n const { dialogManager } = useDialogManager({ dialogManagerId });\n\n useEffect(\n () => () => {\n // Since this cleanup can run even if the component is still mounted\n // and dialog id is unchanged (e.g. in <StrictMode />), it's safer to\n // mark state as unused and only remove it after a timeout, rather than\n // to remove it immediately.\n dialogManager.markForRemoval(id);\n },\n [dialogManager, id],\n );\n\n return dialogManager.getOrCreate({ id });\n};\n\nexport const useDialogOnNearestManager = ({ id }: Pick<UseDialogParams, 'id'>) => {\n const { dialogManager } = useNearestDialogManagerContext() ?? {};\n const dialog = useDialog({ dialogManagerId: dialogManager?.id, id });\n\n return {\n dialog,\n dialogManager,\n };\n};\n\nexport const modalDialogId = 'modal-dialog' as const;\n\nexport const useModalDialog = () =>\n useDialog({ dialogManagerId: modalDialogManagerId, id: modalDialogId });\n\nexport const useDialogIsOpen = (id: string, dialogManagerId?: string) => {\n const { dialogManager } = useDialogManager({ dialogManagerId });\n const dialogIsOpenSelector = useCallback(\n ({ dialogsById }: DialogManagerState) => ({ isOpen: !!dialogsById[id]?.isOpen }),\n [id],\n );\n return useStateStore(dialogManager.state, dialogIsOpenSelector).isOpen;\n};\n\nexport const useModalDialogIsOpen = () =>\n useDialogIsOpen(modalDialogId, modalDialogManagerId);\n\nconst openedDialogCountSelector = (nextValue: DialogManagerState) => ({\n openedDialogCount: Object.values(nextValue.dialogsById).reduce((count, dialog) => {\n if (dialog.isOpen) return count + 1;\n return count;\n }, 0),\n});\n\nexport const useOpenedDialogCount = ({\n dialogManagerId,\n}: { dialogManagerId?: string } = {}) => {\n const { dialogManager } = useDialogManager({ dialogManagerId });\n return useStateStore(dialogManager.state, openedDialogCountSelector).openedDialogCount;\n};\n","import type { PropsWithChildren, ReactPortal } from 'react';\nimport { useLayoutEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport type PortalProps = {\n getPortalDestination: () => Element | null;\n isOpen?: boolean;\n};\n\nexport const Portal = ({\n children,\n getPortalDestination,\n isOpen,\n}: PropsWithChildren<PortalProps>): ReactPortal | null => {\n const [portalDestination, setPortalDestination] = useState<Element | null>(null);\n\n useLayoutEffect(() => {\n const destination = getPortalDestination();\n if (!destination || !isOpen) return;\n setPortalDestination(destination);\n }, [getPortalDestination, isOpen]);\n\n if (!portalDestination) return null;\n\n return createPortal(children, portalDestination);\n};\n","import type { PropsWithChildren } from 'react';\nimport React, { useCallback } from 'react';\nimport { useDialogIsOpen, useOpenedDialogCount } from '../hooks';\nimport { Portal } from '../../Portal/Portal';\nimport { useDialogManager, useNearestDialogManagerContext } from '../../../context';\n\nexport const DialogPortalDestination = () => {\n const { dialogManager } = useNearestDialogManagerContext() ?? {};\n const openedDialogCount = useOpenedDialogCount({ dialogManagerId: dialogManager?.id });\n // const [destinationRoot, setDestinationRoot] = useState<HTMLDivElement | null>(null);\n\n // todo: allow to configure and then enable\n // useEffect(() => {\n // if (!destinationRoot) return;\n // const handleClickOutside = (event: MouseEvent) => {\n // if (!destinationRoot?.contains(event.target as Node)) {\n // dialogManager?.closeAll();\n // }\n // };\n // document.addEventListener('click', handleClickOutside, { capture: true });\n // return () => {\n // document.removeEventListener('click', handleClickOutside, { capture: true });\n // };\n // }, [destinationRoot, dialogManager]);\n\n if (!openedDialogCount) return null;\n\n return (\n <div\n className='str-chat__dialog-overlay'\n data-str-chat__portal-id={dialogManager?.id}\n data-testid='str-chat__dialog-overlay'\n onClick={() => dialogManager?.closeAll()}\n // ref={setDestinationRoot}\n style={\n {\n '--str-chat__dialog-overlay-height': openedDialogCount > 0 ? '100%' : '0',\n } as React.CSSProperties\n }\n />\n );\n};\n\ntype DialogPortalEntryProps = {\n dialogId: string;\n dialogManagerId?: string;\n};\n\nexport const DialogPortalEntry = ({\n children,\n dialogId,\n dialogManagerId,\n}: PropsWithChildren<DialogPortalEntryProps>) => {\n const { dialogManager } = useDialogManager({ dialogId, dialogManagerId });\n const dialogIsOpen = useDialogIsOpen(dialogId, dialogManagerId);\n\n const getPortalDestination = useCallback(\n () => document.querySelector(`div[data-str-chat__portal-id=\"${dialogManager.id}\"]`),\n [dialogManager.id],\n );\n\n return (\n <Portal getPortalDestination={getPortalDestination} isOpen={dialogIsOpen}>\n {children}\n </Portal>\n );\n};\n","import React, {\n type PropsWithChildren,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { StateStore } from 'stream-chat';\n\nimport { DialogManager } from '../components/Dialog/service/DialogManager';\nimport { DialogPortalDestination } from '../components/Dialog/service/DialogPortal';\nimport type { PropsWithChildrenOnly } from '../types/types';\n\ntype DialogManagerId = string;\n\ntype DialogManagersState = Record<DialogManagerId, DialogManager | undefined>;\nconst dialogManagersRegistry: StateStore<DialogManagersState> = new StateStore({});\n\nconst getDialogManager = (id: string): DialogManager | undefined =>\n dialogManagersRegistry.getLatestValue()[id];\n\nconst getOrCreateDialogManager = (id: string) => {\n let manager = getDialogManager(id);\n if (!manager) {\n manager = new DialogManager({ id });\n dialogManagersRegistry.partialNext({ [id]: manager });\n }\n return manager;\n};\n\nconst removeDialogManager = (id: string) => {\n if (!getDialogManager(id)) return;\n dialogManagersRegistry.partialNext({ [id]: undefined });\n};\n\ntype DialogManagerProviderContextValue = {\n dialogManager: DialogManager;\n};\n\nconst DialogManagerProviderContext = React.createContext<\n DialogManagerProviderContextValue | undefined\n>(undefined);\n\n/**\n * Marks the portal location\n * @param children\n * @param id\n * @constructor\n */\nexport const DialogManagerProvider = ({\n children,\n id,\n}: PropsWithChildren<{ id?: string }>) => {\n const [dialogManager, setDialogManager] = useState<DialogManager | null>(() => {\n if (id) return getDialogManager(id) ?? null;\n return new DialogManager(); // will not be included in the registry\n });\n\n useEffect(() => {\n if (!id) return;\n setDialogManager(getOrCreateDialogManager(id));\n return () => {\n removeDialogManager(id);\n setDialogManager(null);\n };\n }, [id]);\n\n // temporarily do not render until a new dialog manager is created\n if (!dialogManager) return null;\n\n return (\n <DialogManagerProviderContext.Provider value={{ dialogManager }}>\n {children}\n <DialogPortalDestination />\n </DialogManagerProviderContext.Provider>\n );\n};\n\nexport type UseDialogManagerParams = {\n dialogId?: string;\n dialogManagerId?: string;\n};\n\nconst getManagerFromStore = ({\n dialogId,\n dialogManagerId,\n newState,\n previousState,\n}: UseDialogManagerParams & {\n newState: DialogManagersState;\n previousState: DialogManagersState | undefined;\n}) => {\n let managerInNewState: DialogManager | undefined;\n let managerInPrevState: DialogManager | undefined;\n if (dialogManagerId) {\n if (!dialogId) {\n managerInNewState = newState[dialogManagerId];\n managerInPrevState = previousState?.[dialogManagerId];\n } else {\n if (newState[dialogManagerId]?.get(dialogId)) {\n managerInNewState = newState[dialogManagerId];\n }\n if (previousState?.[dialogManagerId]?.get(dialogId)) {\n managerInPrevState = previousState[dialogManagerId];\n }\n }\n } else if (dialogId) {\n managerInNewState = Object.values(newState).find(\n (dialogMng) => dialogId && dialogMng?.get(dialogId),\n );\n managerInPrevState =\n previousState &&\n Object.values(previousState).find(\n (dialogMng) => dialogId && dialogMng?.get(dialogId),\n );\n }\n\n return { managerInNewState, managerInPrevState };\n};\n\n/**\n * Retrieves the nearest dialog manager or searches for the dialog manager by dialog manager id or dialog id.\n * Dialog id will take precedence over dialog manager id if both are provided and dialog manager is found by dialog id.\n */\nexport const useDialogManager = ({\n dialogId,\n dialogManagerId,\n}: UseDialogManagerParams = {}) => {\n const nearestDialogManagerContext = useContext(DialogManagerProviderContext);\n\n const [dialogManagerContext, setDialogManagerContext] = useState<\n DialogManagerProviderContextValue | undefined\n >(() => {\n const { managerInNewState } = getManagerFromStore({\n dialogId,\n dialogManagerId,\n newState: dialogManagersRegistry.getLatestValue(),\n previousState: undefined,\n });\n return managerInNewState\n ? { dialogManager: managerInNewState }\n : nearestDialogManagerContext;\n });\n\n useEffect(() => {\n if (!dialogId && !dialogManagerId) return;\n const unsubscribe = dialogManagersRegistry.subscribeWithSelector(\n (state) => state,\n (newState, previousState) => {\n const { managerInNewState, managerInPrevState } = getManagerFromStore({\n dialogId,\n dialogManagerId,\n newState,\n previousState,\n });\n\n if (!managerInPrevState || managerInNewState?.id !== managerInPrevState.id) {\n setDialogManagerContext((prevState) => {\n if (prevState?.dialogManager.id === managerInNewState?.id) return prevState;\n // fixme: need to handle the possibility that the dialogManager is undefined\n return {\n dialogManager:\n managerInNewState || nearestDialogManagerContext?.dialogManager,\n } as DialogManagerProviderContextValue;\n });\n }\n },\n );\n return () => {\n unsubscribe();\n };\n }, [dialogId, dialogManagerId, nearestDialogManagerContext?.dialogManager]);\n\n if (!dialogManagerContext?.dialogManager) {\n console.warn(\n `Dialog manager (manager id: ${dialogManagerId}, dialog id: ${dialogId}) is not available`,\n );\n }\n\n return dialogManagerContext as DialogManagerProviderContextValue;\n};\n\nexport const modalDialogManagerId = 'modal-dialog-manager' as const;\n\nexport const ModalDialogManagerProvider = ({ children }: PropsWithChildrenOnly) => (\n <DialogManagerProvider id={modalDialogManagerId}>{children}</DialogManagerProvider>\n);\n\nexport const useModalDialogManager = () =>\n useMemo(() => getDialogManager(modalDialogManagerId), []);\n\nexport const useNearestDialogManagerContext = () =>\n useContext(DialogManagerProviderContext);\n","import type { BaseSyntheticEvent, PropsWithChildren, ReactNode } from 'react';\nimport React, { useContext } from 'react';\n\nimport type {\n DeleteMessageOptions,\n LocalMessage,\n Mute,\n ReactionResponse,\n ReactionSort,\n UserResponse,\n} from 'stream-chat';\n\nimport type { ChannelActionContextValue } from './ChannelActionContext';\n\nimport type { ActionHandlerReturnType } from '../components/Message/hooks/useActionHandler';\nimport type { PinPermissions } from '../components/Message/hooks/usePinHandler';\nimport type { ReactEventHandler } from '../components/Message/types';\nimport type { MessageActionsArray } from '../components/Message/utils';\nimport type { GroupStyle } from '../components/MessageList/utils';\nimport type {\n ReactionDetailsComparator,\n ReactionsComparator,\n ReactionType,\n} from '../components/Reactions/types';\n\nimport type { RenderTextOptions } from '../components/Message/renderText';\n\nexport type MessageContextValue = {\n /** If actions such as edit, delete, flag, mute are enabled on Message */\n actionsEnabled: boolean;\n /**\n * Returns all allowed actions on message by current user e.g., ['edit', 'delete', 'flag', 'mute', 'pin', 'quote', 'react', 'reply'].\n * Please check [Message](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message.tsx) component for default implementation.\n */\n getMessageActions: () => MessageActionsArray<string>;\n /** Function to send an action in a Channel */\n handleAction: ActionHandlerReturnType;\n /** Function to delete a message in a Channel */\n handleDelete: (options?: DeleteMessageOptions) => Promise<void> | void;\n /** Function to fetch the message reactions */\n handleFetchReactions: (\n reactionType?: ReactionType,\n sort?: ReactionSort,\n ) => Promise<Array<ReactionResponse>>;\n /** Function to flag a message in a Channel */\n handleFlag: ReactEventHandler;\n /** Function to mark message and the messages that follow it as unread in a Channel */\n handleMarkUnread: ReactEventHandler;\n /** Function to mute a user in a Channel */\n handleMute: ReactEventHandler;\n /** Function to open a Thread on a Message */\n handleOpenThread: ReactEventHandler;\n /** Function to pin a Message in a Channel */\n handlePin: ReactEventHandler;\n /** Function to post a reaction on a Message */\n handleReaction: (\n reactionType: string,\n event: React.BaseSyntheticEvent,\n ) => Promise<void>;\n /** Function to retry sending a Message */\n handleRetry: ChannelActionContextValue['retrySendMessage'];\n /** Function that returns whether the Message belongs to the current user */\n isMyMessage: () => boolean;\n /** The message object */\n message: LocalMessage;\n /** Indicates whether a message has not been read yet or has been marked unread */\n messageIsUnread: boolean;\n /** Handler function for a click event on an @mention in Message */\n onMentionsClickMessage: ReactEventHandler;\n /** Handler function for a hover event on an @mention in Message */\n onMentionsHoverMessage: ReactEventHandler;\n /** Handler function for a click event on the user that posted the Message */\n onUserClick: ReactEventHandler;\n /** Handler function for a hover event on the user that posted the Message */\n onUserHover: ReactEventHandler;\n /** Call this function to keep message list scrolled to the bottom when the scroll height increases, e.g. an element appears below the last message (only used in the `VirtualizedMessageList`) */\n autoscrollToBottom?: () => void;\n /** Message component configuration prop. If true, picking a reaction from the `ReactionSelector` component will close the selector */\n closeReactionSelectorOnClick?: boolean;\n /** An array of user IDs that have confirmed the message delivery to their device */\n deliveredTo?: UserResponse[];\n /** If true, the message is the last one in a group sent by a specific user (only used in the `VirtualizedMessageList`) */\n endOfGroup?: boolean;\n /** If true, the message is the first one in a group sent by a specific user (only used in the `VirtualizedMessageList`) */\n firstOfGroup?: boolean;\n /** Override the default formatting of the date. This is a function that has access to the original date object, returns a string */\n formatDate?: (date: Date) => string;\n /** If true, group messages sent by each user (only used in the `VirtualizedMessageList`) */\n groupedByUser?: boolean;\n /** A list of styles to apply to this message, ie. top, bottom, single */\n groupStyles?: GroupStyle[];\n /** Whether to highlight and focus the message on load */\n highlighted?: boolean;\n /** Whether the threaded message is the first in the thread list */\n initialMessage?: boolean;\n /**\n * A factory function that determines whether a message is AI generated or not.\n */\n isMessageAIGenerated?: (message: LocalMessage) => boolean;\n /** Latest own message in currently displayed message set. */\n lastOwnMessage?: LocalMessage;\n /** Latest message id on current channel */\n lastReceivedId?: string | null;\n /** DOMRect object for parent MessageList component */\n messageListRect?: DOMRect;\n /** Array of muted users coming from [ChannelStateContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_state_context/#mutes) */\n mutes?: Mute[];\n /** @deprecated in favor of `channelCapabilities - The user roles allowed to pin Messages in various channel types */\n pinPermissions?: PinPermissions;\n /** Sort options to provide to a reactions query */\n reactionDetailsSort?: ReactionSort;\n /** A list of users that have read this Message */\n readBy?: UserResponse[];\n /** When set, shows the sender avatar in a grid layout. Values: true | 'incoming' | 'outgoing'. */\n showAvatar?: boolean | 'incoming' | 'outgoing';\n /** Custom function to render message text content, defaults to the renderText function: [utils](https://github.com/GetStream/stream-chat-react/blob/master/src/utils.tsx) */\n renderText?: (\n text?: string,\n mentioned_users?: UserResponse[],\n options?: RenderTextOptions,\n ) => ReactNode;\n /** Keep track of read receipts for each message sent by the user. When disabled, only the last own message delivery / read status is rendered. */\n returnAllReadData?: boolean;\n /** Comparator function to sort the list of reacted users\n * @deprecated use `reactionDetailsSort` instead\n */\n sortReactionDetails?: ReactionDetailsComparator;\n /** Comparator function to sort reactions, defaults to chronological order */\n sortReactions?: ReactionsComparator;\n /** Whether or not the Message is in a Thread */\n threadList?: boolean;\n /** render HTML instead of markdown. Posting HTML is only allowed server-side */\n unsafeHTML?: boolean;\n /**\n * User-specific view for translated messages: which text to show.\n * - `'original'`: show `message.text` (source language).\n * - `'translated'`: show the translation for the **current user language** (from\n * `useTranslationContext().userLanguage`), i.e. `message.i18n[userLanguage + '_text']`\n * or fallback to `message.text` when missing. Resolved via `getTranslatedMessageText`.\n */\n translationView?: 'original' | 'translated';\n /** Set whether this message shows original or translated text (user-specific, does not change message data). */\n setTranslationView?: (view: 'original' | 'translated') => void;\n};\n\nexport const MessageContext = React.createContext<MessageContextValue | undefined>(\n undefined,\n);\n\nexport const MessageProvider = ({\n children,\n value,\n}: PropsWithChildren<{\n value: MessageContextValue;\n}>) => (\n <MessageContext.Provider value={value as unknown as MessageContextValue}>\n {children}\n </MessageContext.Provider>\n);\n\nexport const useMessageContext = (\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _componentName?: string,\n) => {\n const contextValue = useContext(MessageContext);\n\n if (!contextValue) {\n return {} as MessageContextValue;\n }\n\n return contextValue as unknown as MessageContextValue;\n};\n","import type { ReactEventHandler } from 'react';\nimport React, { createContext, useCallback, useContext, useMemo } from 'react';\nimport { useMessageContext } from './MessageContext';\nimport { useChannelActionContext } from './ChannelActionContext';\nimport { isMessageBounced, useMessageComposerController } from '../components';\nimport type { LocalMessage } from 'stream-chat';\nimport type { PropsWithChildrenOnly } from '../types/types';\n\nexport interface MessageBounceContextValue {\n handleDelete: ReactEventHandler;\n handleEdit: ReactEventHandler;\n handleRetry: ReactEventHandler;\n message: LocalMessage;\n}\n\nconst MessageBounceContext = createContext<MessageBounceContextValue | undefined>(\n undefined,\n);\n\nexport function useMessageBounceContext(componentName?: string) {\n const contextValue = useContext(MessageBounceContext);\n\n if (!contextValue) {\n console.warn(\n `The useMessageBounceContext hook was called outside of the MessageBounceContext provider. The errored call is located in the ${componentName} component.`,\n );\n\n return {} as MessageBounceContextValue;\n }\n\n return contextValue;\n}\n\nexport function MessageBounceProvider({ children }: PropsWithChildrenOnly) {\n const messageComposer = useMessageComposerController();\n const { handleRetry: doHandleRetry, message } = useMessageContext(\n 'MessageBounceProvider',\n );\n\n if (!isMessageBounced(message)) {\n console.warn(\n `The MessageBounceProvider was rendered for a message that is not bounced. Have you missed the \"isMessageBounced\" check?`,\n );\n }\n\n const { removeMessage } = useChannelActionContext('MessageBounceProvider');\n\n const handleDelete: ReactEventHandler = useCallback(() => {\n removeMessage(message);\n }, [message, removeMessage]);\n\n const handleEdit: ReactEventHandler = useCallback(\n (e) => {\n e.preventDefault();\n messageComposer.initState({ composition: message });\n },\n [message, messageComposer],\n );\n\n const handleRetry = useCallback(() => {\n doHandleRetry(message);\n }, [doHandleRetry, message]);\n\n const value = useMemo(\n () => ({\n handleDelete,\n handleEdit,\n handleRetry,\n message,\n }),\n [handleDelete, handleEdit, handleRetry, message],\n );\n\n return (\n <MessageBounceContext.Provider value={value}>\n {children}\n </MessageBounceContext.Provider>\n );\n}\n","import React, { createContext, useContext } from 'react';\nimport type { PropsWithChildren } from 'react';\nimport type { RenderedMessage } from '../components';\n\nexport type MessageListContextValue = {\n /** Enriched message list, including date separators and intro message (if enabled) */\n processedMessages: RenderedMessage[];\n /** The scroll container within which the messages and typing indicator are rendered */\n listElement: HTMLDivElement | null;\n /** Function that scrolls the `listElement` to the bottom. */\n scrollToBottom: () => void;\n};\n\nexport const MessageListContext = createContext<MessageListContextValue | undefined>(\n undefined,\n);\n\n/**\n * Context provider for components rendered within the `MessageList`\n */\nexport const MessageListContextProvider = ({\n children,\n value,\n}: PropsWithChildren<{\n value: MessageListContextValue;\n}>) => (\n <MessageListContext.Provider value={value as MessageListContextValue}>\n {children}\n </MessageListContext.Provider>\n);\n\nexport const useMessageListContext = (componentName?: string) => {\n const contextValue = useContext(MessageListContext);\n\n if (!contextValue) {\n console.warn(\n `The useMessageListContext hook was called outside of the MessageListContext provider. Make sure this hook is called within the MessageList component. The errored call is located in the ${componentName} component.`,\n );\n\n return {} as MessageListContextValue;\n }\n\n return contextValue as MessageListContextValue;\n};\n","/**\n * Message translation view context: user-specific state for whether each message\n * shows original text or a translation.\n *\n * ## Spec\n *\n * - **State**: Per message list (channel vs thread), we store a map\n * `messageId → 'original' | 'translated'`. Default for messages with `message.i18n`\n * is `'translated'`; otherwise `'original'`.\n *\n * - **Provider placement**: The provider is tied to the **message list**, not the channel.\n * It is rendered inside `MessageList` and `VirtualizedMessageList`. That way the\n * main channel list and the thread list each have their own translation view state\n * (e.g. Thread.tsx gets correct behavior without sharing channel state).\n *\n * - **Multiple translations**: `message.i18n` can contain multiple languages, e.g.:\n * `{ en_text: \"Good morning\", fr_text: \"Bonjour\", it_text: \"Buongiorno\", language: \"en\" }`.\n * Which translation is shown is determined by the app’s **user language**\n * (`useTranslationContext().userLanguage`). We use `message.i18n[userLanguage + '_text']`;\n * if missing, we fall back to `message.text`. Only one translation is shown at a time.\n *\n * - **Source language**: When present, `message.i18n.language` is the original/source\n * language of `message.text`. It can be used for the indicator label, e.g.\n * \"Translated from English · View original\".\n *\n * - **Invariants**: The original message content, layout, grouping, and order stay\n * unchanged. Removing or toggling translation only changes the annotation and which\n * text is displayed. \"View original\" / \"View translation\" switch the displayed\n * text and update the annotation (e.g. \"Original · View translation\" when showing\n * original).\n *\n * - **Translation indicator visibility**: The translation indicator (e.g. \"Translated ·\n * View original\") is **not** shown when the currently viewed text already corresponds\n * to `userLanguage` — for example when viewing original and the original text is the\n * user-language version (i.e. `getTranslatedMessageText({ language: userLanguage, message })`\n * equals `message.text`). In that case there is no meaningful original/translated choice,\n * so the indicator is hidden.\n */\n\nimport React, { createContext, useCallback, useContext, useState } from 'react';\nimport type { LocalMessage, TranslationLanguages } from 'stream-chat';\n\n/**\n * Returns the translated message text for a given language from `message.i18n`, or\n * undefined if not present. Used to resolve which of the multiple translations to show.\n */\nexport const getTranslatedMessageText = ({\n language,\n message,\n}: {\n language: string;\n message?: LocalMessage;\n}): string | undefined =>\n message?.i18n?.[`${language}_text` as `${TranslationLanguages}_text`];\n\n/**\n * Which message text to show.\n * - `'original'`: `message.text` (source language).\n * - `'translated'`: translation for the **current user language** (TranslationContext’s\n * `userLanguage`), i.e. `getTranslatedMessageText({ language: userLanguage, message })`\n * or fallback to `message.text`.\n */\nexport type TranslationView = 'original' | 'translated';\n\nexport type MessageTranslationViewContextValue = {\n getTranslationView: (messageId: string, hasI18n: boolean) => TranslationView;\n setTranslationView: (messageId: string, view: TranslationView) => void;\n};\n\nconst defaultContextValue: MessageTranslationViewContextValue = {\n getTranslationView: (_messageId, hasI18n) => (hasI18n ? 'translated' : 'original'),\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n setTranslationView: () => {},\n};\n\nexport const MessageTranslationViewContext =\n createContext<MessageTranslationViewContextValue>(defaultContextValue);\n\nexport const MessageTranslationViewProvider = ({\n children,\n}: {\n children: React.ReactNode;\n}) => {\n const [viewByMessageId, setViewByMessageId] = useState<Record<string, TranslationView>>(\n {},\n );\n\n const setTranslationView = useCallback((messageId: string, view: TranslationView) => {\n setViewByMessageId((prev) => ({ ...prev, [messageId]: view }));\n }, []);\n\n const getTranslationView = useCallback(\n (messageId: string, hasI18n: boolean): TranslationView =>\n viewByMessageId[messageId] ?? (hasI18n ? 'translated' : 'original'),\n [viewByMessageId],\n );\n\n const stableValue = React.useMemo(\n () => ({ getTranslationView, setTranslationView }),\n [getTranslationView, setTranslationView],\n );\n\n return (\n <MessageTranslationViewContext.Provider value={stableValue}>\n {children}\n </MessageTranslationViewContext.Provider>\n );\n};\n\nexport const useMessageTranslationViewContext =\n (): MessageTranslationViewContextValue => {\n const context = useContext(MessageTranslationViewContext);\n return context ?? defaultContextValue;\n };\n","import type { PropsWithChildren } from 'react';\nimport React, { useContext } from 'react';\n\nexport type ModalContextValue = {\n close: () => void;\n};\n\nexport const ModalContext = React.createContext<ModalContextValue | undefined>(undefined);\n\nexport const ModalContextProvider = ({\n children,\n value,\n}: PropsWithChildren<{\n value: ModalContextValue;\n}>) => <ModalContext.Provider value={value}>{children}</ModalContext.Provider>;\n\nexport const useModalContext = () => {\n const contextValue = useContext(ModalContext);\n\n if (!contextValue) {\n console.warn(\n `The useModalContext hook was called outside of the ModalContext provider. Make sure this hook is called within a child of the GlobalModal.`,\n );\n\n return { close: () => null } as ModalContextValue;\n }\n\n return contextValue;\n};\n","import React, { useContext } from 'react';\nimport type { PropsWithChildren } from 'react';\nimport type { Poll } from 'stream-chat';\n\nexport type PollContextValue = {\n poll: Poll;\n};\n\nexport const PollContext = React.createContext<PollContextValue | undefined>(undefined);\n\nexport const PollProvider = ({\n children,\n poll,\n}: PropsWithChildren<{\n poll: Poll;\n}>) =>\n poll ? (\n <PollContext.Provider value={{ poll } as unknown as PollContextValue}>\n {children}\n </PollContext.Provider>\n ) : null;\n\nexport const usePollContext = () => {\n const contextValue = useContext(PollContext);\n return contextValue as unknown as PollContextValue;\n};\n","import React, { useContext } from 'react';\nimport type { PropsWithChildren } from 'react';\n\nimport { ComponentContext } from './ComponentContext';\nimport type { ComponentContextValue } from './ComponentContext';\n\nexport function WithComponents({\n children,\n overrides,\n}: PropsWithChildren<{ overrides: Partial<ComponentContextValue> }>) {\n const parentOverrides = useContext(ComponentContext);\n const actualOverrides: ComponentContextValue = { ...parentOverrides, ...overrides };\n return (\n <ComponentContext.Provider value={actualOverrides}>\n {children}\n </ComponentContext.Provider>\n );\n}\n","import React from 'react';\nimport type { Channel } from 'stream-chat';\n\nimport { AIStates, useAIState } from './hooks/useAIState';\n\nimport { useChannelStateContext, useTranslationContext } from '../../context';\n\nexport type AIStateIndicatorProps = {\n channel?: Channel;\n};\n\nexport const AIStateIndicator = ({\n channel: channelFromProps,\n}: AIStateIndicatorProps) => {\n const { t } = useTranslationContext();\n const { channel: channelFromContext } = useChannelStateContext('AIStateIndicator');\n const channel = channelFromProps || channelFromContext;\n const { aiState } = useAIState(channel);\n const allowedStates = {\n [AIStates.Thinking]: t('Thinking...'),\n [AIStates.Generating]: t('Generating...'),\n };\n\n return aiState in allowedStates ? (\n <div className='str-chat__ai-state-indicator-container'>\n <p className='str-chat__ai-state-indicator-text'>{allowedStates[aiState]}</p>\n </div>\n ) : null;\n};\n","import React from 'react';\nimport type { IconProps } from '../../types/types';\n\nexport const DownloadIcon = ({ className }: IconProps) => (\n <svg\n className={className}\n data-testid='download'\n fill='none'\n height='24'\n viewBox='0 0 24 24'\n width='24'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path\n d='M19.35 10.04C18.67 6.59 15.64 4 12 4C9.11 4 6.6 5.64 5.35 8.04C2.34 8.36 0 10.91 0 14C0 17.31 2.69 20 6 20H19C21.76 20 24 17.76 24 15C24 12.36 21.95 10.22 19.35 10.04ZM19 18H6C3.79 18 2 16.21 2 14C2 11.95 3.53 10.24 5.56 10.03L6.63 9.92L7.13 8.97C8.08 7.14 9.94 6 12 6C14.62 6 16.88 7.86 17.39 10.43L17.69 11.93L19.22 12.04C20.78 12.14 22 13.45 22 15C22 16.65 20.65 18 19 18ZM13.45 10H10.55V13H8L12 17L16 13H13.45V10Z'\n fill='black'\n />\n </svg>\n);\n\nexport const ExternalLinkIcon = () => (\n <svg fill='currentColor' viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'>\n <path d='M12.586 2H10a1 1 0 1 1 0-2h5a1 1 0 0 1 1 1v5a1 1 0 1 1-2 0V3.414l-6.793 6.793a1 1 0 0 1-1.414-1.414L12.586 2zM6 1a1 1 0 1 1 0 2H3a1 1 0 0 0-1 1v9a1 1 0 0 0 1 1h8.967a1 1 0 0 0 1-.99L13 9.99a1 1 0 1 1 2 .02l-.033 3.023a3 3 0 0 1-3 2.967H3a3 3 0 0 1-3-3V4a3 3 0 0 1 3-3h3z' />\n </svg>\n);\n","import type { PropsWithChildren } from 'react';\nimport React from 'react';\nimport { sanitizeUrl } from '@braintree/sanitize-url';\n\n/**\n * Similar to a regular anchor tag, but it sanitizes the href value and prevents XSS\n */\nexport type SafeAnchorProps = {\n /** Set the className for the anchor tag element */\n className?: string;\n /** Specifies that the target (href attribute) will be downloaded instead of navigating to a file */\n download?: boolean;\n /** Set the href attribute for the anchor tag element */\n href?: string;\n /** Set the rel attribute for the anchor tag element */\n rel?: string;\n /** Set the target attribute for the anchor tag element */\n target?: string;\n};\n\nconst UnMemoizedSafeAnchor = (props: PropsWithChildren<SafeAnchorProps>) => {\n const { children, className, download, href, rel, target } = props;\n if (!href) return null;\n const sanitized = sanitizeUrl(href);\n return (\n <a\n className={className}\n download={download}\n href={sanitized}\n rel={rel}\n target={target}\n >\n {children}\n </a>\n );\n};\n\nexport const SafeAnchor = React.memo(UnMemoizedSafeAnchor) as typeof UnMemoizedSafeAnchor;\n","import React from 'react';\n\nimport { DownloadIcon } from '../icons';\nimport { SafeAnchor } from '../../SafeAnchor';\n\ntype DownloadButtonProps = {\n assetUrl?: string;\n};\n\nexport const DownloadButton = ({ assetUrl }: DownloadButtonProps) => (\n <SafeAnchor\n className='str-chat__message-attachment-file--item-download'\n download\n href={assetUrl}\n target='_blank'\n >\n <DownloadIcon className='str-chat__message-attachment-download-icon' />\n </SafeAnchor>\n);\n","export function prettifyFileSize(bytes: number, precision = 3) {\n const units = ['B', 'kB', 'MB', 'GB'];\n const exponent = Math.min(\n Math.floor(Math.log(bytes) / Math.log(1024)),\n units.length - 1,\n );\n const mantissa = bytes / 1024 ** exponent;\n const formattedMantissa =\n precision === 0 ? Math.round(mantissa).toString() : mantissa.toPrecision(precision);\n return `${formattedMantissa} ${units[exponent]}`;\n}\n","import React from 'react';\nimport { prettifyFileSize } from '../../MessageComposer/hooks/utils';\n\ntype FileSizeIndicatorProps = {\n /** file size in byte */\n fileSize?: number | string;\n /**\n The maximum number of fraction digits to display. If not set, the default behavior is to round to 3 significant digits.\n @default undefined\n */\n maximumFractionDigits?: number;\n};\n\nexport const FileSizeIndicator = ({\n fileSize,\n maximumFractionDigits,\n}: FileSizeIndicatorProps) => {\n const actualFileSize = typeof fileSize === 'string' ? parseFloat(fileSize) : fileSize;\n\n if (typeof actualFileSize === 'undefined' || !Number.isFinite(Number(actualFileSize))) {\n return null;\n }\n\n return (\n <span\n className='str-chat__message-attachment-file--item-size'\n data-testid='file-size-indicator'\n >\n {prettifyFileSize(actualFileSize, maximumFractionDigits)}\n </span>\n );\n};\n","import { useCallback } from 'react';\nimport { useChatContext } from '../../../context';\nimport { useStateStore } from '../../../store';\nimport type { Notification, NotificationManagerState } from 'stream-chat';\nimport { isNotificationForPanel } from '../notificationTarget';\n\nimport type { NotificationTargetPanel } from '../notificationTarget';\n\nexport type UseNotificationsFilter = (notification: Notification) => boolean;\n\nexport type UseNotificationsOptions = {\n /**\n * When provided, only notifications that pass this filter are returned.\n * Use to have a given NotificationList consume only a subset of client.notifications\n * (e.g. by origin.emitter, origin.context, or metadata).\n */\n filter?: UseNotificationsFilter;\n /**\n * Panel target consumed by a specific notification list.\n */\n panel?: NotificationTargetPanel;\n /**\n * Fallback panel used when origin.context.panel is absent.\n * Defaults to `channel`.\n */\n fallbackPanel?: NotificationTargetPanel;\n};\n\n/**\n * Subscribes to client.notifications.store and returns the list of notifications.\n * Optionally pass a filter so only notifications that match are returned (e.g. for a specific NotificationList).\n */\nexport const useNotifications = (options?: UseNotificationsOptions): Notification[] => {\n const { client } = useChatContext();\n const selector = useCallback(\n (state: NotificationManagerState) => {\n const notifications = state.notifications;\n const panel = options?.panel;\n const byPanel = panel\n ? notifications.filter((notification) =>\n isNotificationForPanel(notification, panel, {\n fallbackPanel: options?.fallbackPanel,\n }),\n )\n : notifications;\n\n return {\n notifications: options?.filter ? byPanel.filter(options.filter) : byPanel,\n };\n },\n [options?.fallbackPanel, options?.filter, options?.panel],\n );\n\n const { notifications } = useStateStore(client.notifications.store, selector);\n\n return notifications;\n};\n","import type { ComponentProps } from 'react';\nimport { BaseIcon } from './BaseIcon';\nimport clsx from 'clsx';\n\nexport const IconGiphy = ({ className, ...props }: ComponentProps<'svg'>) => (\n <BaseIcon\n {...props}\n className={clsx('str-chat__icon--giphy', className)}\n viewBox='0 0 16 16'\n >\n <g clipPath='url(#clip0_4197_15218)'>\n <path\n clipRule='evenodd'\n d='M3.33674 1.82861H12.6639V14.171H3.33594L3.33674 1.82861Z'\n fill='black'\n fillRule='evenodd'\n />\n <path d='M1.47217 1.37109H3.33697V14.6287H1.47217V1.37109Z' fill='#04FF8E' />\n <path d='M12.6631 5.02881H14.5279V14.6288H12.6631V5.02881Z' fill='#8E2EFF' />\n <path d='M1.47217 14.1714H14.5282V16.0002H1.47217V14.1714Z' fill='#00C5FF' />\n <path d='M1.47217 0H8.93297V1.8288H1.47217V0Z' fill='#FFF152' />\n <path\n d='M12.663 3.6568V1.8288H10.7974V0H8.93262V5.4856H14.5278V3.6568'\n fill='#FF5B5B'\n />\n <path d='M12.6631 7.31464V5.48584H14.5279' fill='#551C99' />\n <path\n clipRule='evenodd'\n d='M8.93298 0V1.8288H7.06738'\n fill='#999131'\n fillRule='evenodd'\n />\n </g>\n <defs>\n <clipPath id='clip0_4197_15218'>\n <rect fill='white' height='16' width='16' />\n </clipPath>\n </defs>\n </BaseIcon>\n);\n","import React from 'react';\nimport { Button } from './Button';\nimport type { ComponentProps } from 'react';\nimport clsx from 'clsx';\nimport { IconPause, IconPlaySolid } from '../Icons';\n\nexport type PlayButtonProps = ComponentProps<'button'> & {\n isPlaying: boolean;\n};\n\nexport const PlayButton = ({ className, isPlaying, ...props }: PlayButtonProps) => (\n <Button\n appearance='outline'\n circular\n className={clsx('str-chat__button-play', className)}\n data-testid={isPlaying ? 'pause-audio' : 'play-audio'}\n size='sm'\n variant='secondary'\n {...props}\n >\n {isPlaying ? <IconPause /> : <IconPlaySolid />}\n </Button>\n);\n","!function(e,n){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=n():\"function\"==typeof define&&define.amd?define(n):e.dayjs_plugin_updateLocale=n()}(this,function(){\"use strict\";return function(e,n,t){t.updateLocale=function(e,n){var o=t.Ls[e];if(o)return(n?Object.keys(n):[]).forEach(function(e){o[e]=n[e]}),o}}});\n","!function(n,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):n.dayjs_plugin_localeData=t()}(this,function(){\"use strict\";return function(n,t,e){var r=function(n){return n&&(n.indexOf?n:n.s)},o=function(n,t,e,o,u){var a=n.name?n:n.$locale(),i=r(a[t]),s=r(a[e]),d=i||s.map(function(n){return n.substr(0,o)});if(!u)return d;var f=a.weekStart;return d.map(function(n,t){return d[(t+(f||0))%7]})},u=function(){return e.Ls[e.locale()]},a=function(n,t){return n.formats[t]||function(n){return n.replace(/(\\[[^\\]]+])|(MMMM|MM|DD|dddd)/g,function(n,t,e){return t||e.slice(1)})}(n.formats[t.toUpperCase()])};t.prototype.localeData=function(){return function(){var n=this;return{months:function(t){return t?t.format(\"MMMM\"):o(n,\"months\")},monthsShort:function(t){return t?t.format(\"MMM\"):o(n,\"monthsShort\",\"months\",3)},firstDayOfWeek:function(){return n.$locale().weekStart||0},weekdays:function(t){return t?t.format(\"dddd\"):o(n,\"weekdays\")},weekdaysMin:function(t){return t?t.format(\"dd\"):o(n,\"weekdaysMin\",\"weekdays\",2)},weekdaysShort:function(t){return t?t.format(\"ddd\"):o(n,\"weekdaysShort\",\"weekdays\",3)},longDateFormat:function(t){return a(n.$locale(),t)},meridiem:this.$locale().meridiem,ordinal:this.$locale().ordinal}}.bind(this)()},e.localeData=function(){var n=u();return{firstDayOfWeek:function(){return n.weekStart||0},weekdays:function(){return e.weekdays()},weekdaysShort:function(){return e.weekdaysShort()},weekdaysMin:function(){return e.weekdaysMin()},months:function(){return e.months()},monthsShort:function(){return e.monthsShort()},longDateFormat:function(t){return a(n,t)},meridiem:n.meridiem,ordinal:n.ordinal}},e.months=function(){return o(u(),\"months\")},e.monthsShort=function(){return o(u(),\"monthsShort\",\"months\",3)},e.weekdays=function(n){return o(u(),\"weekdays\",null,null,n)},e.weekdaysShort=function(n){return o(u(),\"weekdaysShort\",\"weekdays\",3,n)},e.weekdaysMin=function(n){return o(u(),\"weekdaysMin\",\"weekdays\",2,n)}}});\n","!function(r,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):r.dayjs_plugin_relativeTime=t()}(this,function(){\"use strict\";return function(r,t,e){r=r||{};var n=t.prototype,o={future:\"in %s\",past:\"%s ago\",s:\"a few seconds\",m:\"a minute\",mm:\"%d minutes\",h:\"an hour\",hh:\"%d hours\",d:\"a day\",dd:\"%d days\",M:\"a month\",MM:\"%d months\",y:\"a year\",yy:\"%d years\"};function i(r,t,e,o){return n.fromToBase(r,t,e,o)}e.en.relativeTime=o,n.fromToBase=function(t,n,i,d,u){for(var a,f,s,l=i.$locale().relativeTime||o,h=r.thresholds||[{l:\"s\",r:44,d:\"second\"},{l:\"m\",r:89},{l:\"mm\",r:44,d:\"minute\"},{l:\"h\",r:89},{l:\"hh\",r:21,d:\"hour\"},{l:\"d\",r:35},{l:\"dd\",r:25,d:\"day\"},{l:\"M\",r:45},{l:\"MM\",r:10,d:\"month\"},{l:\"y\",r:17},{l:\"yy\",d:\"year\"}],m=h.length,c=0;c<m;c+=1){var y=h[c];y.d&&(a=d?e(t).diff(i,y.d,!0):i.diff(t,y.d,!0));var p=(r.rounding||Math.round)(Math.abs(a));if(s=a>0,p<=y.r||!y.r){p<=1&&c>0&&(y=h[c-1]);var v=l[y.l];u&&(p=u(\"\"+p)),f=\"string\"==typeof v?v.replace(\"%d\",p):v(p,n,y.l,s);break}}if(n)return f;var M=s?l.future:l.past;return\"function\"==typeof M?M(f):M.replace(\"%s\",f)},n.to=function(r,t){return i(r,t,this,!0)},n.from=function(r,t){return i(r,t,this)};var d=function(r){return r.$u?e.utc():e()};n.toNow=function(r){return this.to(d(this),r)},n.fromNow=function(r){return this.from(d(this),r)}}});\n","!function(t,s){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=s():\"function\"==typeof define&&define.amd?define(s):t.dayjs_plugin_duration=s()}(this,function(){\"use strict\";var t,s,n=/\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,i=/^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/,e={years:31536e6,months:2592e6,days:864e5,hours:36e5,minutes:6e4,seconds:1e3,milliseconds:1,weeks:6048e5},r=function(t){return t instanceof c},o=function(t,s,n){return new c(t,n,s.$l)},u=function(t){return s.p(t)+\"s\"},h=function(t){return t<0},a=function(t){return h(t)?Math.ceil(t):Math.floor(t)},d=function(t,s){return t?h(t)?{negative:!0,format:\"\"+function(t){return Math.abs(t)}(t)+s}:{negative:!1,format:\"\"+t+s}:{negative:!1,format:\"\"}},c=function(){function h(t,s,n){var r=this;if(this.$d={},this.$l=n,s)return o(t*e[u(s)],this);if(\"number\"==typeof t)return this.$ms=t,this.parseFromMilliseconds(),this;if(\"object\"==typeof t)return Object.keys(t).forEach(function(s){r.$d[u(s)]=t[s]}),this.calMilliseconds(),this;if(\"string\"==typeof t){var h=t.match(i);if(h)return this.$d.years=h[2],this.$d.months=h[3],this.$d.weeks=h[4],this.$d.days=h[5],this.$d.hours=h[6],this.$d.minutes=h[7],this.$d.seconds=h[8],this.calMilliseconds(),this}return this}var c=h.prototype;return c.calMilliseconds=function(){var t=this;this.$ms=Object.keys(this.$d).reduce(function(s,n){return s+(t.$d[n]||0)*e[n]},0)},c.parseFromMilliseconds=function(){var t=this.$ms;this.$d.years=a(t/31536e6),t%=31536e6,this.$d.months=a(t/2592e6),t%=2592e6,this.$d.days=a(t/864e5),t%=864e5,this.$d.hours=a(t/36e5),t%=36e5,this.$d.minutes=a(t/6e4),t%=6e4,this.$d.seconds=a(t/1e3),t%=1e3,this.$d.milliseconds=t},c.toISOString=function(){var t=d(this.$d.years,\"Y\"),s=d(this.$d.months,\"M\"),n=+this.$d.days||0;this.$d.weeks&&(n+=7*this.$d.weeks);var i=d(n,\"D\"),e=d(this.$d.hours,\"H\"),r=d(this.$d.minutes,\"M\"),o=this.$d.seconds||0;this.$d.milliseconds&&(o+=this.$d.milliseconds/1e3);var u=d(o,\"S\"),h=t.negative||s.negative||i.negative||e.negative||r.negative||u.negative,a=e.format||r.format||u.format?\"T\":\"\",c=(h?\"-\":\"\")+\"P\"+t.format+s.format+i.format+a+e.format+r.format+u.format;return\"P\"===c||\"-P\"===c?\"P0D\":c},c.toJSON=function(){return this.toISOString()},c.format=function(t){var i=t||\"YYYY-MM-DDTHH:mm:ss\",e={Y:this.$d.years,YY:s.s(this.$d.years,2,\"0\"),YYYY:s.s(this.$d.years,4,\"0\"),M:this.$d.months,MM:s.s(this.$d.months,2,\"0\"),D:this.$d.days,DD:s.s(this.$d.days,2,\"0\"),H:this.$d.hours,HH:s.s(this.$d.hours,2,\"0\"),m:this.$d.minutes,mm:s.s(this.$d.minutes,2,\"0\"),s:this.$d.seconds,ss:s.s(this.$d.seconds,2,\"0\"),SSS:s.s(this.$d.milliseconds,3,\"0\")};return i.replace(n,function(t,s){return s||String(e[t])})},c.as=function(t){return this.$ms/e[u(t)]},c.get=function(t){var s=this.$ms,n=u(t);return\"milliseconds\"===n?s%=1e3:s=\"weeks\"===n?a(s/e[n]):this.$d[n],0===s?0:s},c.add=function(t,s,n){var i;return i=s?t*e[u(s)]:r(t)?t.$ms:o(t,this).$ms,o(this.$ms+i*(n?-1:1),this)},c.subtract=function(t,s){return this.add(t,s,!0)},c.locale=function(t){var s=this.clone();return s.$l=t,s},c.clone=function(){return o(this.$ms,this)},c.humanize=function(s){return t().add(this.$ms,\"ms\").locale(this.$l).fromNow(!s)},c.milliseconds=function(){return this.get(\"milliseconds\")},c.asMilliseconds=function(){return this.as(\"milliseconds\")},c.seconds=function(){return this.get(\"seconds\")},c.asSeconds=function(){return this.as(\"seconds\")},c.minutes=function(){return this.get(\"minutes\")},c.asMinutes=function(){return this.as(\"minutes\")},c.hours=function(){return this.get(\"hours\")},c.asHours=function(){return this.as(\"hours\")},c.days=function(){return this.get(\"days\")},c.asDays=function(){return this.as(\"days\")},c.weeks=function(){return this.get(\"weeks\")},c.asWeeks=function(){return this.as(\"weeks\")},c.months=function(){return this.get(\"months\")},c.asMonths=function(){return this.as(\"months\")},c.years=function(){return this.get(\"years\")},c.asYears=function(){return this.as(\"years\")},h}();return function(n,i,e){t=e,s=e().$utils(),e.duration=function(t,s){var n=e.locale();return o(t,{$l:n},s)},e.isDuration=r;var u=i.prototype.add,h=i.prototype.subtract;i.prototype.add=function(t,s){return r(t)&&(t=t.asMilliseconds()),u.bind(this)(t,s)},i.prototype.subtract=function(t,s){return r(t)&&(t=t.asMilliseconds()),h.bind(this)(t,s)}}});\n","!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):t.dayjs_plugin_utc=i()}(this,function(){\"use strict\";return function(t,i,e){var s=i.prototype;e.utc=function(t){return new i({date:t,utc:!0,args:arguments})},s.utc=function(t){var i=e(this.toDate(),{locale:this.$L,utc:!0});return t?i.add(this.utcOffset(),\"minute\"):i},s.local=function(){return e(this.toDate(),{locale:this.$L,utc:!1})};var f=s.parse;s.parse=function(t){t.utc&&(this.$u=!0),this.$utils().u(t.$offset)||(this.$offset=t.$offset),f.call(this,t)};var n=s.init;s.init=function(){if(this.$u){var t=this.$d;this.$y=t.getUTCFullYear(),this.$M=t.getUTCMonth(),this.$D=t.getUTCDate(),this.$W=t.getUTCDay(),this.$H=t.getUTCHours(),this.$m=t.getUTCMinutes(),this.$s=t.getUTCSeconds(),this.$ms=t.getUTCMilliseconds()}else n.call(this)};var u=s.utcOffset;s.utcOffset=function(t,i){var e=this.$utils().u;if(e(t))return this.$u?0:e(this.$offset)?u.call(this):this.$offset;var s=Math.abs(t)<=16?60*t:t,f=this;if(i)return f.$offset=s,f.$u=0===t,f;if(0!==t){var n=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();(f=this.local().add(s+n,\"minute\")).$offset=s,f.$x.$localOffset=n}else f=this.utc();return f};var o=s.format;s.format=function(t){var i=t||(this.$u?\"YYYY-MM-DDTHH:mm:ss[Z]\":\"\");return o.call(this,i)},s.valueOf=function(){var t=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||(new Date).getTimezoneOffset());return this.$d.valueOf()-6e4*t},s.isUTC=function(){return!!this.$u},s.toISOString=function(){return this.toDate().toISOString()},s.toString=function(){return this.toDate().toUTCString()};var r=s.toDate;s.toDate=function(t){return\"s\"===t&&this.$offset?e(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\")).toDate():r.call(this)};var a=s.diff;s.diff=function(t,i,s){if(t&&this.$u===t.$u)return a.call(this,t,i,s);var f=this.local(),n=e(t).local();return a.call(f,n,i,s)}}});\n","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):t.dayjs_plugin_timezone=e()}(this,function(){\"use strict\";var t={year:0,month:1,day:2,hour:3,minute:4,second:5},e={};return function(n,i,r){var o,u=r().utcOffset(),a=function(t,n,i){void 0===i&&(i={});var r=new Date(t);return function(t,n){void 0===n&&(n={});var i=n.timeZoneName||\"short\",r=t+\"|\"+i,o=e[r];return o||(o=new Intl.DateTimeFormat(\"en-US\",{hour12:!1,timeZone:t,year:\"numeric\",month:\"2-digit\",day:\"2-digit\",hour:\"2-digit\",minute:\"2-digit\",second:\"2-digit\",timeZoneName:i}),e[r]=o),o}(n,i).formatToParts(r)},f=function(e,n){for(var i=a(e,n),o=[],u=0;u<i.length;u+=1){var f=i[u],s=f.type,m=f.value,c=t[s];c>=0&&(o[c]=parseInt(m,10))}var d=o[3],v=24===d?0:d,h=o[0]+\"-\"+o[1]+\"-\"+o[2]+\" \"+v+\":\"+o[4]+\":\"+o[5]+\":000\",l=+e;return(r.utc(h).valueOf()-(l-=l%1e3))/6e4},s=i.prototype;s.tz=function(t,e){void 0===t&&(t=o);var n=this.utcOffset(),i=this.toDate().toLocaleString(\"en-US\",{timeZone:t}),a=Math.round((this.toDate()-new Date(i))/1e3/60),f=r(i).$set(\"millisecond\",this.$ms).utcOffset(u-a,!0);if(e){var s=f.utcOffset();f=f.add(n-s,\"minute\")}return f.$x.$timezone=t,f},s.offsetName=function(t){var e=this.$x.$timezone||r.tz.guess(),n=a(this.valueOf(),e,{timeZoneName:t}).find(function(t){return\"timezonename\"===t.type.toLowerCase()});return n&&n.value};var m=s.startOf;s.startOf=function(t,e){if(!this.$x||!this.$x.$timezone)return m.call(this,t,e);var n=r(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\"));return m.call(n,t,e).tz(this.$x.$timezone,!0)},r.tz=function(t,e,n){var i=n&&e,u=n||e||o,a=f(+r(),u);if(\"string\"!=typeof t)return r(t).tz(u);var s=function(t,e,n){var i=t-60*e*1e3,r=f(i,n);if(e===r)return[i,e];var o=f(i-=60*(r-e)*1e3,n);return r===o?[i,r]:[t-60*Math.min(r,o)*1e3,Math.max(r,o)]}(r.utc(t,i).valueOf(),a,u),m=s[0],c=s[1],d=r(m).utcOffset(c);return d.$x.$timezone=u,d},r.tz.guess=function(){return Intl.DateTimeFormat().resolvedOptions().timeZone},r.tz.setDefault=function(t){o=t}}});\n","import type { i18n, TFunction } from 'i18next';\n\ntype TopicName = string;\ntype TranslatorName = string;\n\nexport type Translator<O extends Record<string, unknown> = Record<string, unknown>> =\n (params: { key: string; value: string; t: TFunction; options: O }) => string | null;\n\nexport type TranslationTopicOptions<\n O extends Record<string, unknown> = Record<string, unknown>,\n> = {\n i18next: i18n;\n translators?: Record<string, Translator<O>>;\n};\n\nexport abstract class TranslationTopic<\n O extends Record<string, unknown> = Record<string, unknown>,\n> {\n protected translators: Map<string, Translator<O>> = new Map();\n protected i18next: i18n;\n\n constructor(protected options: TranslationTopicOptions<O>) {\n this.i18next = options.i18next;\n if (options.translators) {\n Object.entries(options.translators).forEach(([name, translator]) => {\n this.setTranslator(name, translator);\n });\n }\n }\n\n abstract translate(value: string, key: string, options: O): string;\n\n setTranslator = (name: string, translator: Translator<O>) => {\n this.translators.set(name, translator);\n };\n\n removeTranslator = (name: string) => {\n this.translators.delete(name);\n };\n}\n\nconst forwardTranslation: Translator = ({ value }) => value;\n\nexport type TranslationTopicConstructor = new (\n options: TranslationTopicOptions,\n) => TranslationTopic;\n\nexport class TranslationBuilder {\n private topics = new Map<string, TranslationTopic>();\n // need to keep a registration buffer so that translators can be registered once a topic is registered\n // what does not happen when Streami18n is instantiated but rather once Streami18n.init() is invoked\n private translatorRegistrationsBuffer: Record<\n TopicName,\n Record<TranslatorName, Translator>\n > = {};\n\n constructor(private i18next: i18n) {}\n\n registerTopic = (name: TopicName, Topic: TranslationTopicConstructor) => {\n let topic = this.topics.get(name);\n\n if (!topic) {\n topic = new Topic({ i18next: this.i18next });\n this.topics.set(name, topic);\n this.i18next.use({\n name,\n process: (value: string, key: string, options: Record<string, unknown>) => {\n const topic = this.topics.get(name);\n if (!topic) return value;\n return topic.translate(value, key, options);\n },\n type: 'postProcessor' as const,\n });\n }\n\n const additionalTranslatorsToRegister = this.translatorRegistrationsBuffer[name];\n if (additionalTranslatorsToRegister) {\n Object.entries(additionalTranslatorsToRegister).forEach(\n ([translatorName, translator]) => {\n topic.setTranslator(translatorName, translator);\n },\n );\n delete this.translatorRegistrationsBuffer[name];\n }\n return topic;\n };\n\n disableTopic = (topicName: TopicName) => {\n const topic = this.topics.get(topicName);\n if (!topic) return;\n this.i18next.use({\n name: topicName,\n process: forwardTranslation,\n type: 'postProcessor',\n });\n this.topics.delete(topicName);\n };\n\n getTopic = (topicName: TopicName) => this.topics.get(topicName);\n\n registerTranslators(\n topicName: TopicName,\n translators: Record<TranslatorName, Translator>,\n ) {\n const topic = this.getTopic(topicName);\n if (!topic) {\n if (!this.translatorRegistrationsBuffer[topicName])\n this.translatorRegistrationsBuffer[topicName] = {};\n\n Object.entries(translators).forEach(([translatorName, translator]) => {\n this.translatorRegistrationsBuffer[topicName][translatorName] = translator;\n });\n return;\n }\n Object.entries(translators).forEach(([name, translator]) => {\n topic.setTranslator(name, translator);\n });\n }\n\n removeTranslators(topicName: TopicName, translators: TranslatorName[]) {\n const topic = this.getTopic(topicName);\n if (this.translatorRegistrationsBuffer[topicName]) {\n translators.forEach((translatorName) => {\n delete this.translatorRegistrationsBuffer[topicName][translatorName];\n });\n }\n if (!topic) return;\n translators.forEach((name) => {\n topic.removeTranslator(name);\n });\n }\n}\n","import type { Notification } from 'stream-chat';\n\nimport type { NotificationTranslatorOptions } from './types';\nimport type { TranslationTopicOptions, Translator } from '../../index';\n\nconst normalizeReason = (notification?: Notification) => {\n const reason = notification?.metadata?.reason;\n if (typeof reason !== 'string' || !reason.length) return undefined;\n return reason.toLowerCase();\n};\n\nconst withReasonFallback = ({\n fallbackTranslationKey,\n notification,\n reasonTranslationKey,\n t,\n}: {\n fallbackTranslationKey: string;\n notification?: Notification;\n reasonTranslationKey: string;\n t: TranslationTopicOptions['i18next']['t'];\n}) => {\n const reason = normalizeReason(notification);\n if (!reason) return t(fallbackTranslationKey);\n return t(reasonTranslationKey, { reason });\n};\n\nexport const translateAttachmentUploadBlocked: Translator<\n NotificationTranslatorOptions\n> = ({ options: { notification }, t }) => {\n const rawReason = notification?.metadata?.reason;\n let reason = t('unsupported file type');\n if (typeof rawReason !== 'string') reason = t('unknown error');\n if (rawReason === 'size_limit') reason = t('size limit');\n return t('Attachment upload blocked due to {{reason}}', { reason });\n};\n\nexport const translateAttachmentUploadFailed: Translator<\n NotificationTranslatorOptions\n> = ({ options: { notification }, t }) =>\n withReasonFallback({\n fallbackTranslationKey: 'Error uploading attachment',\n notification,\n reasonTranslationKey: 'Attachment upload failed due to {{reason}}',\n t,\n });\n\nexport const translatePollCreateFailed: Translator<NotificationTranslatorOptions> = ({\n options: { notification },\n t,\n}) =>\n withReasonFallback({\n fallbackTranslationKey: 'Failed to create the poll',\n notification,\n reasonTranslationKey: 'Failed to create the poll due to {{reason}}',\n t,\n });\n\nexport const translatePollEndFailed: Translator<NotificationTranslatorOptions> = ({\n options: { notification },\n t,\n}) =>\n withReasonFallback({\n fallbackTranslationKey: 'Failed to end the poll',\n notification,\n reasonTranslationKey: 'Failed to end the poll due to {{reason}}',\n t,\n });\n\nexport const translateBrowserAudioPlaybackError: Translator<\n NotificationTranslatorOptions\n> = ({ options: { notification }, t }) =>\n notification?.message ? t(notification.message) : t('Error reproducing the recording');\n","import type { NotificationTranslatorOptions } from './types';\nimport {\n translateAttachmentUploadBlocked,\n translateAttachmentUploadFailed,\n translateBrowserAudioPlaybackError,\n translatePollCreateFailed,\n translatePollEndFailed,\n} from './translators';\nimport type { Translator } from '../../index';\n\nexport const translatorsByNotificationType: Record<\n string,\n Translator<NotificationTranslatorOptions>\n> = {\n 'api:attachment:upload:failed': translateAttachmentUploadFailed,\n 'api:location:create:failed': ({ t }) => t('Failed to share location'),\n 'api:location:share:failed': ({ t }) => t('Failed to share location'),\n 'api:poll:create:failed': translatePollCreateFailed,\n 'api:poll:end:failed': translatePollEndFailed,\n 'api:poll:end:success': ({ t }) => t('Poll ended'),\n 'api:reply:search:failed': ({ t }) => t('Thread has not been found'),\n 'browser:audio:playback:error': translateBrowserAudioPlaybackError,\n 'browser:location:get:failed': ({ t }) => t('Failed to retrieve location'),\n 'channel:jumpToFirstUnread:failed': ({ t }) =>\n t('Failed to jump to the first unread message'),\n 'validation:attachment:file:missing': ({ t }) =>\n t('File is required for upload attachment'),\n 'validation:attachment:id:missing': ({ t }) =>\n t('Local upload attachment missing local id'),\n 'validation:attachment:upload:blocked': translateAttachmentUploadBlocked,\n 'validation:attachment:upload:in-progress': ({ t }) =>\n t('Wait until all attachments have uploaded'),\n 'validation:poll:castVote:limit': ({ t }) =>\n t('Reached the vote limit. Remove an existing vote first.'),\n};\n","import { TranslationTopic } from '../../TranslationBuilder';\nimport type { Notification } from 'stream-chat';\nimport type { NotificationTranslatorOptions } from './types';\nimport { translatorsByNotificationType } from './translatorsByNotificationType';\nimport type { TranslationTopicOptions, Translator } from '../../index';\n\nconst translateByNotificationType: Translator<NotificationTranslatorOptions> = ({\n options: { notification },\n ...params\n}) => {\n if (!notification?.type) return null;\n const translator = translatorsByNotificationType[notification.type];\n if (!translator) return null;\n return translator({ ...params, options: { notification } });\n};\n\nexport const defaultNotificationTranslators: Record<\n string,\n Translator<NotificationTranslatorOptions>\n> = {\n '*': translateByNotificationType,\n};\n\nexport class NotificationTranslationTopic extends TranslationTopic<NotificationTranslatorOptions> {\n constructor({ i18next, translators }: TranslationTopicOptions) {\n super({ i18next, translators: defaultNotificationTranslators });\n if (translators) {\n Object.entries(translators).forEach(([name, translator]) => {\n this.setTranslator(name, translator);\n });\n }\n }\n\n translate = (value: string, key: string, options: { notification?: Notification }) => {\n const { notification } = options;\n if (!notification) return value;\n const byType = notification.type\n ? this.translators.get(notification.type)\n : undefined;\n if (byType) return byType({ key, options, t: this.i18next.t, value }) || value;\n\n const byFallback = this.translators.get('*');\n const translated = byFallback?.({ key, options, t: this.i18next.t, value }) ?? null;\n if (translated) return translated;\n if (!notification.message) return value;\n\n // Final fallback: attempt to translate message as natural key.\n return this.i18next.t(notification.message, {\n ...(notification.metadata ?? {}),\n value: notification.message,\n });\n };\n}\n","!function(e,n){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=n(require(\"dayjs\")):\"function\"==typeof define&&define.amd?define([\"dayjs\"],n):e.dayjs_locale_de=n(e.dayjs)}(this,function(e){\"use strict\";e=e&&e.hasOwnProperty(\"default\")?e.default:e;var n={s:\"ein paar Sekunden\",m:[\"eine Minute\",\"einer Minute\"],mm:\"%d Minuten\",h:[\"eine Stunde\",\"einer Stunde\"],hh:\"%d Stunden\",d:[\"ein Tag\",\"einem Tag\"],dd:[\"%d Tage\",\"%d Tagen\"],M:[\"ein Monat\",\"einem Monat\"],MM:[\"%d Monate\",\"%d Monaten\"],y:[\"ein Jahr\",\"einem Jahr\"],yy:[\"%d Jahre\",\"%d Jahren\"]};function t(e,t,a){var r=n[a];return Array.isArray(r)&&(r=r[t?0:1]),r.replace(\"%d\",e)}var a={name:\"de\",weekdays:\"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag\".split(\"_\"),weekdaysShort:\"So._Mo._Di._Mi._Do._Fr._Sa.\".split(\"_\"),weekdaysMin:\"So_Mo_Di_Mi_Do_Fr_Sa\".split(\"_\"),months:\"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember\".split(\"_\"),monthsShort:\"Jan_Feb_März_Apr_Mai_Juni_Juli_Aug_Sept_Okt_Nov_Dez\".split(\"_\"),ordinal:function(e){return e+\".\"},weekStart:1,yearStart:4,formats:{LTS:\"HH:mm:ss\",LT:\"HH:mm\",L:\"DD.MM.YYYY\",LL:\"D. MMMM YYYY\",LLL:\"D. MMMM YYYY HH:mm\",LLLL:\"dddd, D. MMMM YYYY HH:mm\"},relativeTime:{future:\"in %s\",past:\"vor %s\",s:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t}};return e.locale(a,null,!0),a});\n","!function(e,s){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=s(require(\"dayjs\")):\"function\"==typeof define&&define.amd?define([\"dayjs\"],s):e.dayjs_locale_es=s(e.dayjs)}(this,function(e){\"use strict\";e=e&&e.hasOwnProperty(\"default\")?e.default:e;var s={name:\"es\",monthsShort:\"ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic\".split(\"_\"),weekdays:\"domingo_lunes_martes_miércoles_jueves_viernes_sábado\".split(\"_\"),weekdaysShort:\"dom._lun._mar._mié._jue._vie._sáb.\".split(\"_\"),weekdaysMin:\"do_lu_ma_mi_ju_vi_sá\".split(\"_\"),months:\"Enero_Febrero_Marzo_Abril_Mayo_Junio_Julio_Agosto_Septiembre_Octubre_Noviembre_Diciembre\".split(\"_\"),weekStart:1,formats:{LT:\"H:mm\",LTS:\"H:mm:ss\",L:\"DD/MM/YYYY\",LL:\"D [de] MMMM [de] YYYY\",LLL:\"D [de] MMMM [de] YYYY H:mm\",LLLL:\"dddd, D [de] MMMM [de] YYYY H:mm\"},relativeTime:{future:\"en %s\",past:\"hace %s\",s:\"unos segundos\",m:\"un minuto\",mm:\"%d minutos\",h:\"una hora\",hh:\"%d horas\",d:\"un día\",dd:\"%d días\",M:\"un mes\",MM:\"%d meses\",y:\"un año\",yy:\"%d años\"},ordinal:function(e){return e+\"º\"}};return e.locale(s,null,!0),s});\n","!function(e,_){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=_(require(\"dayjs\")):\"function\"==typeof define&&define.amd?define([\"dayjs\"],_):e.dayjs_locale_fr=_(e.dayjs)}(this,function(e){\"use strict\";e=e&&e.hasOwnProperty(\"default\")?e.default:e;var _={name:\"fr\",weekdays:\"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi\".split(\"_\"),weekdaysShort:\"dim._lun._mar._mer._jeu._ven._sam.\".split(\"_\"),weekdaysMin:\"di_lu_ma_me_je_ve_sa\".split(\"_\"),months:\"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre\".split(\"_\"),monthsShort:\"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.\".split(\"_\"),weekStart:1,yearStart:4,formats:{LT:\"HH:mm\",LTS:\"HH:mm:ss\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY HH:mm\",LLLL:\"dddd D MMMM YYYY HH:mm\"},relativeTime:{future:\"dans %s\",past:\"il y a %s\",s:\"quelques secondes\",m:\"une minute\",mm:\"%d minutes\",h:\"une heure\",hh:\"%d heures\",d:\"un jour\",dd:\"%d jours\",M:\"un mois\",MM:\"%d mois\",y:\"un an\",yy:\"%d ans\"},ordinal:function(e){return\"\"+e+(1===e?\"er\":\"\")}};return e.locale(_,null,!0),_});\n","!function(_,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e(require(\"dayjs\")):\"function\"==typeof define&&define.amd?define([\"dayjs\"],e):_.dayjs_locale_hi=e(_.dayjs)}(this,function(_){\"use strict\";_=_&&_.hasOwnProperty(\"default\")?_.default:_;var e={name:\"hi\",weekdays:\"रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार\".split(\"_\"),months:\"जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर\".split(\"_\"),weekdaysShort:\"रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि\".split(\"_\"),monthsShort:\"जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.\".split(\"_\"),weekdaysMin:\"र_सो_मं_बु_गु_शु_श\".split(\"_\"),ordinal:function(_){return _},formats:{LT:\"A h:mm बजे\",LTS:\"A h:mm:ss बजे\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY, A h:mm बजे\",LLLL:\"dddd, D MMMM YYYY, A h:mm बजे\"},relativeTime:{future:\"%s में\",past:\"%s पहले\",s:\"कुछ ही क्षण\",m:\"एक मिनट\",mm:\"%d मिनट\",h:\"एक घंटा\",hh:\"%d घंटे\",d:\"एक दिन\",dd:\"%d दिन\",M:\"एक महीने\",MM:\"%d महीने\",y:\"एक वर्ष\",yy:\"%d वर्ष\"}};return _.locale(e,null,!0),e});\n","!function(e,o){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=o(require(\"dayjs\")):\"function\"==typeof define&&define.amd?define([\"dayjs\"],o):e.dayjs_locale_it=o(e.dayjs)}(this,function(e){\"use strict\";e=e&&e.hasOwnProperty(\"default\")?e.default:e;var o={name:\"it\",weekdays:\"domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato\".split(\"_\"),weekdaysShort:\"dom_lun_mar_mer_gio_ven_sab\".split(\"_\"),weekdaysMin:\"do_lu_ma_me_gi_ve_sa\".split(\"_\"),months:\"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre\".split(\"_\"),weekStart:1,monthsShort:\"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic\".split(\"_\"),formats:{LT:\"HH:mm\",LTS:\"HH:mm:ss\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY HH:mm\",LLLL:\"dddd D MMMM YYYY HH:mm\"},relativeTime:{future:\"tra %s\",past:\"%s fa\",s:\"qualche secondo\",m:\"un minuto\",mm:\"%d minuti\",h:\"un' ora\",hh:\"%d ore\",d:\"un giorno\",dd:\"%d giorni\",M:\"un mese\",MM:\"%d mesi\",y:\"un anno\",yy:\"%d anni\"},ordinal:function(e){return e+\"º\"}};return e.locale(o,null,!0),o});\n","!function(_,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e(require(\"dayjs\")):\"function\"==typeof define&&define.amd?define([\"dayjs\"],e):_.dayjs_locale_ja=e(_.dayjs)}(this,function(_){\"use strict\";_=_&&_.hasOwnProperty(\"default\")?_.default:_;var e={name:\"ja\",weekdays:\"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日\".split(\"_\"),weekdaysShort:\"日_月_火_水_木_金_土\".split(\"_\"),weekdaysMin:\"日_月_火_水_木_金_土\".split(\"_\"),months:\"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月\".split(\"_\"),monthsShort:\"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月\".split(\"_\"),ordinal:function(_){return _+\"日\"},formats:{LT:\"HH:mm\",LTS:\"HH:mm:ss\",L:\"YYYY/MM/DD\",LL:\"YYYY年M月D日\",LLL:\"YYYY年M月D日 HH:mm\",LLLL:\"YYYY年M月D日 dddd HH:mm\",l:\"YYYY/MM/DD\",ll:\"YYYY年M月D日\",lll:\"YYYY年M月D日 HH:mm\",llll:\"YYYY年M月D日(ddd) HH:mm\"},meridiem:function(_){return _<12?\"午前\":\"午後\"},relativeTime:{future:\"%s後\",past:\"%s前\",s:\"数秒\",m:\"1分\",mm:\"%d分\",h:\"1時間\",hh:\"%d時間\",d:\"1日\",dd:\"%d日\",M:\"1ヶ月\",MM:\"%dヶ月\",y:\"1年\",yy:\"%d年\"}};return _.locale(e,null,!0),e});\n","!function(_,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e(require(\"dayjs\")):\"function\"==typeof define&&define.amd?define([\"dayjs\"],e):_.dayjs_locale_ko=e(_.dayjs)}(this,function(_){\"use strict\";_=_&&_.hasOwnProperty(\"default\")?_.default:_;var e={name:\"ko\",weekdays:\"일요일_월요일_화요일_수요일_목요일_금요일_토요일\".split(\"_\"),weekdaysShort:\"일_월_화_수_목_금_토\".split(\"_\"),weekdaysMin:\"일_월_화_수_목_금_토\".split(\"_\"),months:\"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월\".split(\"_\"),monthsShort:\"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월\".split(\"_\"),ordinal:function(_){return _},formats:{LT:\"A h:mm\",LTS:\"A h:mm:ss\",L:\"YYYY.MM.DD.\",LL:\"YYYY년 MMMM D일\",LLL:\"YYYY년 MMMM D일 A h:mm\",LLLL:\"YYYY년 MMMM D일 dddd A h:mm\",l:\"YYYY.MM.DD.\",ll:\"YYYY년 MMMM D일\",lll:\"YYYY년 MMMM D일 A h:mm\",llll:\"YYYY년 MMMM D일 dddd A h:mm\"},meridiem:function(_){return _<12?\"오전\":\"오후\"},relativeTime:{future:\"%s 후\",past:\"%s 전\",s:\"몇 초\",m:\"1분\",mm:\"%d분\",h:\"한 시간\",hh:\"%d시간\",d:\"하루\",dd:\"%d일\",M:\"한 달\",MM:\"%d달\",y:\"일 년\",yy:\"%d년\"}};return _.locale(e,null,!0),e});\n","!function(e,a){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=a(require(\"dayjs\")):\"function\"==typeof define&&define.amd?define([\"dayjs\"],a):e.dayjs_locale_nl=a(e.dayjs)}(this,function(e){\"use strict\";e=e&&e.hasOwnProperty(\"default\")?e.default:e;var a={name:\"nl\",weekdays:\"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag\".split(\"_\"),weekdaysShort:\"zo._ma._di._wo._do._vr._za.\".split(\"_\"),weekdaysMin:\"zo_ma_di_wo_do_vr_za\".split(\"_\"),months:\"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december\".split(\"_\"),monthsShort:\"jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec\".split(\"_\"),ordinal:function(e){return e+\".\"},weekStart:1,yearStart:4,formats:{LT:\"HH:mm\",LTS:\"HH:mm:ss\",L:\"DD-MM-YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY HH:mm\",LLLL:\"dddd D MMMM YYYY HH:mm\"},relativeTime:{future:\"over %s\",past:\"%s geleden\",s:\"een paar seconden\",m:\"een minuut\",mm:\"%d minuten\",h:\"een uur\",hh:\"%d uur\",d:\"een dag\",dd:\"%d dagen\",M:\"een maand\",MM:\"%d maanden\",y:\"een jaar\",yy:\"%d jaar\"}};return e.locale(a,null,!0),a});\n","!function(e,a){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=a(require(\"dayjs\")):\"function\"==typeof define&&define.amd?define([\"dayjs\"],a):e.dayjs_locale_pt=a(e.dayjs)}(this,function(e){\"use strict\";e=e&&e.hasOwnProperty(\"default\")?e.default:e;var a={name:\"pt\",weekdays:\"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado\".split(\"_\"),weekdaysShort:\"Dom_Seg_Ter_Qua_Qui_Sex_Sab\".split(\"_\"),weekdaysMin:\"Do_2ª_3ª_4ª_5ª_6ª_Sa\".split(\"_\"),months:\"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro\".split(\"_\"),monthsShort:\"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez\".split(\"_\"),ordinal:function(e){return e+\"º\"},weekStart:1,yearStart:4,formats:{LT:\"HH:mm\",LTS:\"HH:mm:ss\",L:\"DD/MM/YYYY\",LL:\"D [de] MMMM [de] YYYY\",LLL:\"D [de] MMMM [de] YYYY [às] HH:mm\",LLLL:\"dddd, D [de] MMMM [de] YYYY [às] HH:mm\"},relativeTime:{future:\"em %s\",past:\"há %s\",s:\"alguns segundos\",m:\"um minuto\",mm:\"%d minutos\",h:\"uma hora\",hh:\"%d horas\",d:\"um dia\",dd:\"%d dias\",M:\"um mês\",MM:\"%d meses\",y:\"um ano\",yy:\"%d anos\"}};return e.locale(a,null,!0),a});\n","!function(_,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t(require(\"dayjs\")):\"function\"==typeof define&&define.amd?define([\"dayjs\"],t):_.dayjs_locale_ru=t(_.dayjs)}(this,function(_){\"use strict\";_=_&&_.hasOwnProperty(\"default\")?_.default:_;var t=\"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря\".split(\"_\"),e=\"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь\".split(\"_\"),n=\"янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.\".split(\"_\"),s=\"янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.\".split(\"_\"),r=/D[oD]?(\\[[^[\\]]*\\]|\\s)+MMMM?/;function o(_,t,e){var n,s;return\"m\"===e?t?\"минута\":\"минуту\":_+\" \"+(n=+_,s={mm:t?\"минута_минуты_минут\":\"минуту_минуты_минут\",hh:\"час_часа_часов\",dd:\"день_дня_дней\",MM:\"месяц_месяца_месяцев\",yy:\"год_года_лет\"}[e].split(\"_\"),n%10==1&&n%100!=11?s[0]:n%10>=2&&n%10<=4&&(n%100<10||n%100>=20)?s[1]:s[2])}var d=function(_,n){return r.test(n)?t[_.month()]:e[_.month()]};d.s=e,d.f=t;var i=function(_,t){return r.test(t)?n[_.month()]:s[_.month()]};i.s=s,i.f=n;var m={name:\"ru\",weekdays:\"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота\".split(\"_\"),weekdaysShort:\"вск_пнд_втр_срд_чтв_птн_сбт\".split(\"_\"),weekdaysMin:\"вс_пн_вт_ср_чт_пт_сб\".split(\"_\"),months:d,monthsShort:i,weekStart:1,formats:{LT:\"H:mm\",LTS:\"H:mm:ss\",L:\"DD.MM.YYYY\",LL:\"D MMMM YYYY г.\",LLL:\"D MMMM YYYY г., H:mm\",LLLL:\"dddd, D MMMM YYYY г., H:mm\"},relativeTime:{future:\"через %s\",past:\"%s назад\",s:\"несколько секунд\",m:o,mm:o,h:\"час\",hh:o,d:\"день\",dd:o,M:\"месяц\",MM:o,y:\"год\",yy:o},ordinal:function(_){return _}};return _.locale(m,null,!0),m});\n","!function(a,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e(require(\"dayjs\")):\"function\"==typeof define&&define.amd?define([\"dayjs\"],e):a.dayjs_locale_tr=e(a.dayjs)}(this,function(a){\"use strict\";a=a&&a.hasOwnProperty(\"default\")?a.default:a;var e={name:\"tr\",weekdays:\"Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi\".split(\"_\"),weekdaysShort:\"Paz_Pts_Sal_Çar_Per_Cum_Cts\".split(\"_\"),weekdaysMin:\"Pz_Pt_Sa_Ça_Pe_Cu_Ct\".split(\"_\"),months:\"Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık\".split(\"_\"),monthsShort:\"Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara\".split(\"_\"),weekStart:1,formats:{LT:\"HH:mm\",LTS:\"HH:mm:ss\",L:\"DD.MM.YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY HH:mm\",LLLL:\"dddd, D MMMM YYYY HH:mm\"},relativeTime:{future:\"%s sonra\",past:\"%s önce\",s:\"birkaç saniye\",m:\"bir dakika\",mm:\"%d dakika\",h:\"bir saat\",hh:\"%d saat\",d:\"bir gün\",dd:\"%d gün\",M:\"bir ay\",MM:\"%d ay\",y:\"bir yıl\",yy:\"%d yıl\"},ordinal:function(a){return a+\".\"}};return a.locale(e,null,!0),e});\n","!function(e,n){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=n():\"function\"==typeof define&&define.amd?define(n):e.dayjs_locale_en=n()}(this,function(){\"use strict\";return{name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\")}});\n","import i18n from 'i18next';\nimport Dayjs from 'dayjs';\nimport calendar from 'dayjs/plugin/calendar';\nimport updateLocale from 'dayjs/plugin/updateLocale';\nimport LocalizedFormat from 'dayjs/plugin/localizedFormat';\nimport localeData from 'dayjs/plugin/localeData';\nimport relativeTime from 'dayjs/plugin/relativeTime';\nimport duration from 'dayjs/plugin/duration';\nimport utc from 'dayjs/plugin/utc';\nimport timezone from 'dayjs/plugin/timezone';\nimport { NotificationTranslationTopic, TranslationBuilder } from './TranslationBuilder';\nimport { defaultTranslatorFunction, predefinedFormatters } from './utils';\n\nimport type { TFunction } from 'i18next';\nimport type momentTimezone from 'moment-timezone';\nimport type { TranslationLanguages } from 'stream-chat';\n\nimport type { TranslationTopicConstructor } from './TranslationBuilder';\nimport type { UnknownType } from '../types/types';\nimport type { CustomFormatters, PredefinedFormatters, TDateTimeParser } from './types';\n\nimport {\n deTranslations,\n enTranslations,\n esTranslations,\n frTranslations,\n hiTranslations,\n itTranslations,\n jaTranslations,\n koTranslations,\n nlTranslations,\n ptTranslations,\n ruTranslations,\n trTranslations,\n} from './translations';\n\nimport 'dayjs/locale/de';\nimport 'dayjs/locale/es';\nimport 'dayjs/locale/fr';\nimport 'dayjs/locale/hi';\nimport 'dayjs/locale/it';\nimport 'dayjs/locale/ja';\nimport 'dayjs/locale/ko';\nimport 'dayjs/locale/nl';\nimport 'dayjs/locale/pt';\nimport 'dayjs/locale/ru';\nimport 'dayjs/locale/tr';\n// These locale imports also set these locale globally.\n// So As a last step I am going to import english locale\n// to make sure I don't mess up language at other places in app.\nimport 'dayjs/locale/en';\n\nconst defaultNS = 'translation';\nconst defaultLng = 'en';\n\ntype CalendarLocaleConfig = {\n lastDay: string;\n lastWeek: string;\n nextDay: string;\n nextWeek: string;\n sameDay: string;\n sameElse: string;\n};\n\nDayjs.extend(updateLocale);\nDayjs.extend(utc);\nDayjs.extend(timezone);\n\nDayjs.updateLocale('de', {\n calendar: {\n lastDay: '[gestern um] LT',\n lastWeek: '[letzten] dddd [um] LT',\n nextDay: '[morgen um] LT',\n nextWeek: 'dddd [um] LT',\n sameDay: '[heute um] LT',\n sameElse: 'L',\n },\n});\n\nDayjs.updateLocale('es', {\n calendar: {\n lastDay: '[ayer a las] LT',\n lastWeek: '[pasado] dddd [a] LT',\n nextDay: '[mañana a] LT',\n nextWeek: 'dddd [a] LT',\n sameDay: '[hoy a las] LT',\n sameElse: 'L',\n },\n});\n\nDayjs.updateLocale('fr', {\n calendar: {\n lastDay: '[Hier à] LT',\n lastWeek: 'dddd [dernier à] LT',\n nextDay: '[Demain à] LT',\n nextWeek: 'dddd [à] LT',\n sameDay: \"[Aujourd'hui à] LT\",\n sameElse: 'L',\n },\n});\n\nDayjs.updateLocale('hi', {\n calendar: {\n lastDay: '[कल] LT',\n lastWeek: '[पिछले] dddd, LT',\n nextDay: '[कल] LT',\n nextWeek: 'dddd, LT',\n sameDay: '[आज] LT',\n sameElse: 'L',\n },\n // Hindi notation for meridiems are quite fuzzy in practice. While there exists\n // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.\n meridiem(hour: number) {\n if (hour < 4) {\n return 'रात';\n } else if (hour < 10) {\n return 'सुबह';\n } else if (hour < 17) {\n return 'दोपहर';\n } else if (hour < 20) {\n return 'शाम';\n } else {\n return 'रात';\n }\n },\n meridiemHour(hour: number, meridiem: string) {\n if (hour === 12) {\n hour = 0;\n }\n if (meridiem === 'रात') {\n return hour < 4 ? hour : hour + 12;\n } else if (meridiem === 'सुबह') {\n return hour;\n } else if (meridiem === 'दोपहर') {\n return hour >= 10 ? hour : hour + 12;\n } else if (meridiem === 'शाम') {\n return hour + 12;\n }\n return hour;\n },\n meridiemParse: /रात|सुबह|दोपहर|शाम/,\n});\n\nDayjs.updateLocale('it', {\n calendar: {\n lastDay: '[Ieri alle] LT',\n lastWeek: '[lo scorso] dddd [alle] LT',\n nextDay: '[Domani alle] LT',\n nextWeek: 'dddd [alle] LT',\n sameDay: '[Oggi alle] LT',\n sameElse: 'L',\n },\n});\n\nDayjs.updateLocale('ja', {\n calendar: {\n lastDay: '[昨日] LT',\n lastWeek: 'dddd LT',\n nextDay: '[明日] LT',\n nextWeek: '[次の] dddd LT',\n sameDay: '[今日] LT',\n sameElse: 'L',\n },\n});\n\nDayjs.updateLocale('ko', {\n calendar: {\n lastDay: '[어제] LT',\n lastWeek: '[지난] dddd LT',\n nextDay: '[내일] LT',\n nextWeek: 'dddd LT',\n sameDay: '[오늘] LT',\n sameElse: 'L',\n },\n});\n\nDayjs.updateLocale('nl', {\n calendar: {\n lastDay: '[gisteren om] LT',\n lastWeek: '[afgelopen] dddd [om] LT',\n nextDay: '[morgen om] LT',\n nextWeek: 'dddd [om] LT',\n sameDay: '[vandaag om] LT',\n sameElse: 'L',\n },\n});\n\nDayjs.updateLocale('pt', {\n calendar: {\n lastDay: '[ontem às] LT',\n lastWeek: 'dddd [passada às] LT',\n nextDay: '[amanhã às] LT',\n nextWeek: 'dddd [às] LT',\n sameDay: '[hoje às] LT',\n sameElse: 'L',\n },\n});\n\nDayjs.updateLocale('ru', {\n calendar: {\n lastDay: '[Вчера, в] LT',\n nextDay: '[Завтра, в] LT',\n sameDay: '[Сегодня, в] LT',\n },\n});\n\nDayjs.updateLocale('tr', {\n calendar: {\n lastDay: '[dün] LT',\n lastWeek: '[geçen] dddd [saat] LT',\n nextDay: '[yarın saat] LT',\n nextWeek: '[gelecek] dddd [saat] LT',\n sameDay: '[bugün saat] LT',\n sameElse: 'L',\n },\n});\n\nconst en_locale = {\n formats: {},\n months: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n relativeTime: {},\n weekdays: [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ],\n};\n\ntype DateTimeParserModule = typeof Dayjs | typeof momentTimezone;\n// Type guards to check DayJs\nconst isDayJs = (dateTimeParser: DateTimeParserModule): dateTimeParser is typeof Dayjs =>\n (dateTimeParser as typeof Dayjs).extend !== undefined;\n\ntype TimezoneParser = {\n tz: momentTimezone.MomentTimezone | Dayjs.Dayjs;\n};\nconst supportsTz = (dateTimeParser: unknown): dateTimeParser is TimezoneParser =>\n (dateTimeParser as TimezoneParser).tz !== undefined;\n\nexport type Streami18nOptions = {\n DateTimeParser?: DateTimeParserModule;\n dayjsLocaleConfigForLanguage?: Partial<ILocale> & { calendar?: CalendarLocaleConfig };\n debug?: boolean;\n disableDateTimeTranslations?: boolean;\n formatters?: Partial<PredefinedFormatters> & CustomFormatters;\n language?: TranslationLanguages;\n logger?: (message?: string) => void;\n translationBuilderTopics?: Record<string, TranslationTopicConstructor>;\n parseMissingKeyHandler?: (key: string, defaultValue?: string) => string;\n timezone?: string;\n translationsForLanguage?: Partial<typeof enTranslations>;\n};\n\n/**\n * Wrapper around [i18next](https://www.i18next.com/) class for Stream related i18n.\n * Instance of this class should be provided to Chat component to handle i18n.\n * Stream provides following list of in-built i18n:\n * 1. English (en)\n * 2. Dutch (nl)\n * 3. Russian (ru)\n * 4. Turkish (tr)\n * 5. French (fr)\n * 6. Italian (it)\n * 7. Hindi (hi)\n * 8. Spanish (es)\n * 9. Portuguese (pt)\n * 10. German (de)\n * 11. Japanese (ja)\n * 12. Korean (ko)\n *\n * Simplest way to start using chat components in one of the in-built languages would be following:\n *\n * ```\n * const i18n = new Streami18n({ language 'nl' });\n * <Chat client={chatClient} i18nInstance={i18n}>\n * ...\n * </Chat>\n * ```\n *\n * If you would like to override certain keys in in-built translation.\n * UI will be automatically updated in this case.\n *\n * ```\n * const i18n = new Streami18n({\n * language: 'nl',\n * translationsForLanguage: {\n * 'Nothing yet...': 'Nog Niet ...',\n * '{{ firstUser }} and {{ secondUser }} are typing...': '{{ firstUser }} en {{ secondUser }} zijn aan het typen...',\n * }\n * });\n *\n * If you would like to register additional languages, use registerTranslation. You can add as many languages as you want:\n *\n * i18n.registerTranslation('zh', {\n * 'Nothing yet...': 'Nog Niet ...',\n * '{{ firstUser }} and {{ secondUser }} are typing...': '{{ firstUser }} en {{ secondUser }} zijn aan het typen...',\n * });\n *\n * <Chat client={chatClient} i18nInstance={i18n}>\n * ...\n * </Chat>\n * ```\n *\n * You can use the same function to add whole new language as well.\n *\n * ```\n * const i18n = new Streami18n();\n *\n * i18n.registerTranslation('mr', {\n * 'Nothing yet...': 'काहीही नाही ...',\n * '{{ firstUser }} and {{ secondUser }} are typing...': '{{ firstUser }} आणि {{ secondUser }} टीपी करत आहेत ',\n * });\n *\n * // Make sure to call setLanguage to reflect new language in UI.\n * i18n.setLanguage('it');\n * <Chat client={chatClient} i18nInstance={i18n}>\n * ...\n * </Chat>\n * ```\n *\n * ## Datetime i18n\n *\n * Stream react chat components uses [dayjs](https://day.js.org/en/) internally by default to format datetime stamp.\n * e.g., in ChannelPreview, MessageContent components.\n * Dayjs has locale support as well - https://day.js.org/docs/en/i18n/i18n\n * Dayjs is a lightweight alternative to Momentjs with the same modern API.\n *\n * Dayjs provides locale config for plenty of languages, you can check the whole list of locale configs at following url\n * https://github.com/iamkun/dayjs/tree/dev/src/locale\n *\n * You can either provide the dayjs locale config while registering\n * language with Streami18n (either via constructor or registerTranslation()) or you can provide your own Dayjs or Moment instance\n * to Streami18n constructor, which will be then used internally (using the language locale) in components.\n *\n * 1. Via language registration\n *\n * e.g.,\n * ```\n * const i18n = new Streami18n({\n * language: 'nl',\n * dayjsLocaleConfigForLanguage: {\n * months: [...],\n * monthsShort: [...],\n * calendar: {\n * sameDay: ...'\n * }\n * }\n * });\n * ```\n *\n * Similarly, you can add locale config for moment while registering translation via `registerTranslation` function.\n *\n * e.g.,\n * ```\n * const i18n = new Streami18n();\n *\n * i18n.registerTranslation(\n * 'mr',\n * {\n * 'Nothing yet...': 'काहीही नाही ...',\n * '{{ firstUser }} and {{ secondUser }} are typing...': '{{ firstUser }} आणि {{ secondUser }} टीपी करत आहेत ',\n * },\n * {\n * months: [...],\n * monthsShort: [...],\n * calendar: {\n * sameDay: ...'\n * }\n * }\n * );\n *```\n * 2. Provide your own Moment object\n *\n * ```js\n * import 'moment/locale/nl';\n * import 'moment/locale/it';\n * // or if you want to include all locales\n * import 'moment/min/locales';\n *\n * import Moment from moment\n *\n * const i18n = new Streami18n({\n * language: 'nl',\n * DateTimeParser: Moment\n * })\n * ```\n *\n * 3. Provide your own Dayjs object\n *\n * ```js\n * import Dayjs from 'dayjs'\n *\n * import 'dayjs/locale/nl';\n * import 'dayjs/locale/it';\n * // or if you want to include all locales\n * import 'dayjs/min/locales';\n *\n * const i18n = new Streami18n({\n * language: 'nl',\n * DateTimeParser: Dayjs\n * })\n * ```\n * If you would like to stick with english language for datetimes in Stream components, you can set `disableDateTimeTranslations` to true.\n *\n */\nconst defaultStreami18nOptions = {\n DateTimeParser: Dayjs,\n dayjsLocaleConfigForLanguage: null,\n debug: false,\n disableDateTimeTranslations: false,\n language: 'en' as TranslationLanguages,\n logger: (message?: string) => console.warn(message),\n /**\n * Key in the translationBuilderTopics has to match postProcessorName in the translation value.\n *\n * {\n * \"key\": \"{{value, postProcessorName}}\"\n * }\n *\n * At least the default topics will be supported.\n */\n translationBuilderTopics: {\n notification: NotificationTranslationTopic,\n },\n};\n\nexport class Streami18n {\n i18nInstance = i18n.createInstance();\n translationBuilder: TranslationBuilder;\n private translationBuilderTopics: Record<string, TranslationTopicConstructor> = {};\n Dayjs = null;\n setLanguageCallback: (t: TFunction) => void = () => null;\n initialized = false;\n\n t: TFunction = defaultTranslatorFunction;\n tDateTimeParser: TDateTimeParser;\n\n translations: {\n [key: string]: {\n [key: string]: typeof enTranslations | UnknownType;\n };\n } = {\n de: { [defaultNS]: deTranslations },\n en: { [defaultNS]: enTranslations },\n es: { [defaultNS]: esTranslations },\n fr: { [defaultNS]: frTranslations },\n hi: { [defaultNS]: hiTranslations },\n it: { [defaultNS]: itTranslations },\n ja: { [defaultNS]: jaTranslations },\n ko: { [defaultNS]: koTranslations },\n nl: { [defaultNS]: nlTranslations },\n pt: { [defaultNS]: ptTranslations },\n ru: { [defaultNS]: ruTranslations },\n tr: { [defaultNS]: trTranslations },\n };\n\n /**\n * dayjs.defineLanguage('nl') also changes the global locale. We don't want to do that\n * when user calls registerTranslation() function. So instead we will store the locale configs\n * given to registerTranslation() function in `dayjsLocales` object, and register the required locale\n * with moment, when setLanguage is called.\n * */\n dayjsLocales: { [key: string]: Partial<ILocale> } = {};\n // dayjsLocales = {};\n\n /**\n * Initialize properties used in constructor\n */\n logger: (msg?: string) => void;\n currentLanguage: TranslationLanguages;\n DateTimeParser: DateTimeParserModule;\n formatters: PredefinedFormatters & CustomFormatters = predefinedFormatters;\n isCustomDateTimeParser: boolean;\n i18nextConfig: {\n debug: boolean;\n fallbackLng: false;\n interpolation: { escapeValue: boolean; formatSeparator: string };\n keySeparator: false;\n lng: string;\n nsSeparator: false;\n parseMissingKeyHandler?: (key: string, defaultValue?: string) => string;\n postProcess?: string[];\n };\n /**\n * A valid TZ identifier string (https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)\n */\n timezone?: string;\n /**\n * Constructor accepts following options:\n * - language (String) default: 'en'\n * Language code e.g., en, tr\n *\n * - translationsForLanguage (object)\n * Translations object. Please check src/i18n/en.json for example.\n *\n * - disableDateTimeTranslations (boolean) default: false\n * Disable translations for date-times\n *\n * - debug (boolean) default: false\n * Enable debug mode in internal i18n class\n *\n * - logger (function) default: () => {}\n * Logger function to log warnings/errors from this class\n *\n * - dayjsLocaleConfigForLanguage (object) default: 'enConfig'\n * [Config object](https://momentjs.com/docs/#/i18n/changing-locale/) for internal moment object,\n * corresponding to language (param)\n *\n * - DateTimeParser (function) Moment or Dayjs instance/function.\n * Make sure to load all the required locales in this Moment or Dayjs instance that you will be provide to Streami18n\n *\n * @param {*} options\n */\n constructor(options: Streami18nOptions = {}) {\n const finalOptions = {\n ...defaultStreami18nOptions,\n ...options,\n };\n // Prepare the i18next configuration.\n this.logger = finalOptions.logger;\n this.currentLanguage = finalOptions.language;\n this.DateTimeParser = finalOptions.DateTimeParser;\n this.timezone = finalOptions.timezone;\n this.formatters = { ...predefinedFormatters, ...options?.formatters };\n this.translationBuilder = new TranslationBuilder(this.i18nInstance);\n this.translationBuilderTopics = {\n ...defaultStreami18nOptions.translationBuilderTopics,\n ...options.translationBuilderTopics,\n };\n\n try {\n if (this.DateTimeParser && isDayJs(this.DateTimeParser)) {\n this.DateTimeParser.extend(LocalizedFormat);\n this.DateTimeParser.extend(calendar);\n this.DateTimeParser.extend(localeData);\n this.DateTimeParser.extend(relativeTime);\n this.DateTimeParser.extend(duration);\n }\n } catch (error) {\n throw Error(\n `Streami18n: Looks like you wanted to provide Dayjs instance, but something went wrong while adding plugins ${error}`,\n );\n }\n\n this.isCustomDateTimeParser = !!options.DateTimeParser;\n const translationsForLanguage = finalOptions.translationsForLanguage;\n\n if (translationsForLanguage) {\n this.translations[this.currentLanguage] = {\n [defaultNS]:\n this.translations[this.currentLanguage] &&\n this.translations[this.currentLanguage][defaultNS]\n ? {\n ...this.translations[this.currentLanguage][defaultNS],\n ...translationsForLanguage,\n }\n : translationsForLanguage,\n };\n }\n\n // If translations don't exist for given language, then set it as empty object.\n if (!this.translations[this.currentLanguage]) {\n this.translations[this.currentLanguage] = {\n [defaultNS]: {},\n };\n }\n\n this.i18nextConfig = {\n debug: finalOptions.debug,\n fallbackLng: false,\n interpolation: { escapeValue: false, formatSeparator: '|' },\n keySeparator: false,\n lng: this.currentLanguage,\n nsSeparator: false,\n };\n\n const postProcess = Object.keys(this.translationBuilderTopics);\n\n if (postProcess.length > 0) {\n this.i18nextConfig.postProcess = postProcess;\n }\n\n if (finalOptions.parseMissingKeyHandler) {\n this.i18nextConfig.parseMissingKeyHandler = finalOptions.parseMissingKeyHandler;\n }\n\n this.validateCurrentLanguage();\n\n const dayjsLocaleConfigForLanguage = finalOptions.dayjsLocaleConfigForLanguage;\n\n if (dayjsLocaleConfigForLanguage) {\n this.addOrUpdateLocale(this.currentLanguage, {\n ...dayjsLocaleConfigForLanguage,\n });\n } else if (!this.localeExists(this.currentLanguage)) {\n this.logger(\n `Streami18n: Streami18n(...) - Locale config for ${this.currentLanguage} does not exist in momentjs.` +\n `Please import the locale file using \"import 'moment/locale/${this.currentLanguage}';\" in your app or ` +\n `register the locale config with Streami18n using registerTranslation(language, translation, customDayjsLocale)`,\n );\n }\n\n this.tDateTimeParser = (timestamp) => {\n const language =\n finalOptions.disableDateTimeTranslations ||\n !this.localeExists(this.currentLanguage)\n ? defaultLng\n : this.currentLanguage;\n\n if (isDayJs(this.DateTimeParser)) {\n return supportsTz(this.DateTimeParser)\n ? this.DateTimeParser(timestamp).tz(this.timezone).locale(language)\n : this.DateTimeParser(timestamp).locale(language);\n }\n\n if (supportsTz(this.DateTimeParser) && this.timezone) {\n return this.DateTimeParser(timestamp).tz(this.timezone).locale(language);\n }\n return this.DateTimeParser(timestamp).locale(language);\n };\n }\n\n /**\n * Initializes the i18next instance with configuration (which enables natural language as default keys)\n */\n async init() {\n this.validateCurrentLanguage();\n\n try {\n this.t = await this.i18nInstance.init({\n ...this.i18nextConfig,\n lng: this.currentLanguage,\n resources: this.translations,\n });\n this.initialized = true;\n if (this.formatters) {\n Object.entries(this.formatters).forEach(([name, formatterFactory]) => {\n if (!formatterFactory) return;\n this.i18nInstance.services.formatter?.add(name, formatterFactory(this));\n });\n }\n // Register post-processors after initialization\n Object.entries(this.translationBuilderTopics).forEach(\n ([topic, TranslationTopic]) => {\n this.translationBuilder.registerTopic(topic, TranslationTopic);\n },\n );\n } catch (error) {\n this.logger(`Something went wrong with init: ${JSON.stringify(error)}`);\n }\n\n return {\n t: this.t,\n tDateTimeParser: this.tDateTimeParser,\n };\n }\n\n localeExists = (language: TranslationLanguages) => {\n if (this.isCustomDateTimeParser) return true;\n\n return Object.keys(Dayjs.Ls).indexOf(language) > -1;\n };\n\n validateCurrentLanguage = () => {\n const availableLanguages = Object.keys(this.translations);\n if (availableLanguages.indexOf(this.currentLanguage) === -1) {\n this.logger(\n `Streami18n: '${this.currentLanguage}' language is not registered.` +\n ` Please make sure to call streami18n.registerTranslation('${this.currentLanguage}', {...}) or ` +\n `use one the built-in supported languages - ${this.getAvailableLanguages()}`,\n );\n\n this.currentLanguage = defaultLng;\n }\n };\n\n /** Returns an instance of i18next used within this class instance */\n geti18Instance = () => this.i18nInstance;\n\n /** Returns list of available languages. */\n getAvailableLanguages = () => Object.keys(this.translations);\n\n /** Returns all the translation dictionary for all inbuilt-languages */\n getTranslations = () => this.translations;\n\n /**\n * Returns current version translator function.\n */\n async getTranslators() {\n if (!this.initialized) {\n if (this.dayjsLocales[this.currentLanguage]) {\n this.addOrUpdateLocale(\n this.currentLanguage,\n this.dayjsLocales[this.currentLanguage],\n );\n }\n\n return await this.init();\n } else {\n return {\n t: this.t,\n tDateTimeParser: this.tDateTimeParser,\n };\n }\n }\n\n registerTranslation(\n language: TranslationLanguages,\n translation: typeof enTranslations,\n customDayjsLocale?: Partial<ILocale>,\n ) {\n if (!translation) {\n this.logger(\n `Streami18n: registerTranslation(language, translation, customDayjsLocale) called without translation`,\n );\n return;\n }\n\n if (!this.translations[language]) {\n this.translations[language] = { [defaultNS]: translation };\n } else {\n this.translations[language][defaultNS] = translation;\n }\n\n if (customDayjsLocale) {\n this.dayjsLocales[language] = { ...customDayjsLocale };\n } else if (!this.localeExists(language)) {\n this.logger(\n `Streami18n: registerTranslation(language, translation, customDayjsLocale) - ` +\n `Locale config for ${language} does not exist in Dayjs.` +\n `Please import the locale file using \"import 'dayjs/locale/${language}';\" in your app or ` +\n `register the locale config with Streami18n using registerTranslation(language, translation, customDayjsLocale)`,\n );\n }\n\n if (this.initialized) {\n this.i18nInstance.addResources(language, defaultNS, translation);\n }\n }\n\n addOrUpdateLocale(key: TranslationLanguages, config: Partial<ILocale>) {\n if (this.localeExists(key)) {\n Dayjs.updateLocale(key, { ...config });\n } else {\n // Merging the custom locale config with en config, so missing keys can default to english.\n Dayjs.locale({ name: key, ...en_locale, ...config }, undefined, true);\n }\n }\n\n async setLanguage(language: TranslationLanguages) {\n this.currentLanguage = language;\n\n if (!this.initialized) return;\n\n try {\n const t = await this.i18nInstance.changeLanguage(language);\n if (this.dayjsLocales[language]) {\n this.addOrUpdateLocale(\n this.currentLanguage,\n this.dayjsLocales[this.currentLanguage],\n );\n }\n\n this.setLanguageCallback(t);\n return t;\n } catch (error) {\n this.logger(`Failed to set language: ${JSON.stringify(error)}`);\n return this.t;\n }\n }\n\n registerSetLanguageCallback(callback: (t: TFunction) => void) {\n this.setLanguageCallback = callback;\n }\n}\n","import React from 'react';\n\nconst LoadingItems = () => (\n <div className='str-chat__channel-list-item-container'>\n <div\n aria-hidden='true'\n className='str-chat__channel-list-item str-chat__channel-list-item--loading'\n >\n <div className='str-chat__loading-channels-avatar' />\n <div className='str-chat__channel-list-item-data str-chat__channel-list-item-data--loading'>\n <div className='str-chat__loading-channels-username' />\n <div className='str-chat__loading-channels-status' />\n </div>\n </div>\n </div>\n);\n\nexport const LoadingChannels = () => (\n <div className='str-chat__loading-channels'>\n <LoadingItems />\n <LoadingItems />\n <LoadingItems />\n <LoadingItems />\n <LoadingItems />\n </div>\n);\n","import React, { type ComponentProps } from 'react';\nimport { IconLoadingCircle } from '../Icons';\n\nexport type LoadingIndicatorProps = ComponentProps<typeof IconLoadingCircle>;\n\nexport const LoadingIndicator = (props: LoadingIndicatorProps) => (\n <IconLoadingCircle {...props} className='str-chat__loading-indicator' />\n);\n","import type { PropsWithChildren } from 'react';\nimport React from 'react';\nimport clsx from 'clsx';\n\nexport type CustomNotificationProps = {\n type: string;\n active?: boolean;\n className?: string;\n};\n\nconst UnMemoizedCustomNotification = (\n props: PropsWithChildren<CustomNotificationProps>,\n) => {\n const { active, children, className, type } = props;\n\n if (!active) return null;\n\n return (\n <div\n aria-live='polite'\n className={clsx(\n `str-chat__custom-notification notification-${type}`,\n `str-chat__notification`,\n `str-chat-react__notification`,\n className,\n )}\n data-testid='custom-notification'\n >\n {children}\n </div>\n );\n};\n\nexport const CustomNotification = React.memo(\n UnMemoizedCustomNotification,\n) as typeof UnMemoizedCustomNotification;\n","import React, { useEffect, useState } from 'react';\n\nimport type { Event } from 'stream-chat';\n\nimport { CustomNotification } from './CustomNotification';\nimport { useChatContext, useTranslationContext } from '../../context';\n\nconst UnMemoizedConnectionStatus = () => {\n const { client } = useChatContext('ConnectionStatus');\n const { t } = useTranslationContext('ConnectionStatus');\n\n const [online, setOnline] = useState(true);\n\n useEffect(() => {\n const connectionChanged = ({ online: onlineStatus = false }: Event) => {\n if (online !== onlineStatus) {\n setOnline(onlineStatus);\n }\n };\n\n client.on('connection.changed', connectionChanged);\n return () => client.off('connection.changed', connectionChanged);\n }, [client, online]);\n\n return (\n <CustomNotification\n active={!online}\n className='str-chat__connection-status-notification'\n type='error'\n >\n {t('Connection failure, reconnecting now...')}\n </CustomNotification>\n );\n};\n\nexport const ConnectionStatus = React.memo(UnMemoizedConnectionStatus);\n","import { useCallback, useRef } from 'react';\n\nexport type StableCallback<A extends unknown[], R> = (...args: A) => R;\n\n/**\n * A utility hook implementing a stable callback. It takes in an unstable method that\n * is supposed to be invoked somewhere deeper in the DOM tree without making it\n * change its reference every time the parent component rerenders. It will also return\n * the value of the callback if it does return one.\n * A common use-case would be having a function whose invocation depends on state\n * somewhere high up in the DOM tree and wanting to use the same function deeper\n * down, for example in a leaf node and simply using useCallback results in\n * cascading dependency hell. If we wrap it in useStableCallback, we would be able\n * to:\n * - Use the same function as a dependency of another hook (since it is stable)\n * - Still invoke it and get the latest state\n *\n * **Caveats:**\n * - Never wrap a function that is supposed to return a React.ReactElement in\n * useStableCallback, since React will not know that the DOM needs to be updated\n * whenever the callback value changes (for example, renderItem from FlatList must\n * never be wrapped in this hook)\n * - Always prefer using a standard useCallback/stable function wherever possible\n * (the purpose of useStableCallback is to bridge the gap between top level contexts\n * and cascading rereders in downstream components - **not** as an escape hatch)\n * @param callback - the callback we want to stabilize\n */\nexport const useStableCallback = <A extends unknown[], R>(\n callback: StableCallback<A, R>,\n): StableCallback<A, R> => {\n const ref = useRef(callback);\n ref.current = callback;\n\n return useCallback<StableCallback<A, R>>((...args) => ref.current(...args), []);\n};\n","import { useChannelActionContext } from '../../../context/ChannelActionContext';\nimport { useChannelStateContext } from '../../../context/ChannelStateContext';\n\nimport type React from 'react';\nimport type { LocalMessage } from 'stream-chat';\nimport { useStableCallback } from '../../../utils/useStableCallback';\n\nexport type FormData = Record<string, string>;\n\nexport type ActionHandlerReturnType = (\n dataOrName?: string | FormData,\n value?: string,\n event?: React.BaseSyntheticEvent,\n) => Promise<void> | void;\n\nexport const handleActionWarning = `Action handler was called, but it is missing one of its required arguments. \nMake sure the ChannelAction and ChannelState contexts are properly set and the hook is initialized with a valid message.`;\n\nexport function useActionHandler(message?: LocalMessage): ActionHandlerReturnType {\n const { removeMessage, updateMessage } = useChannelActionContext('useActionHandler');\n const { channel } = useChannelStateContext('useActionHandler');\n\n return useStableCallback(async (dataOrName, value, event) => {\n if (event) event.preventDefault();\n\n if (!message || !updateMessage || !removeMessage || !channel) {\n console.warn(handleActionWarning);\n return;\n }\n\n const messageId = message.id;\n let formData: FormData = {};\n\n // deprecated: value&name should be removed in favor of data obj\n if (typeof dataOrName === 'string') {\n formData[dataOrName] = value as string;\n } else {\n formData = { ...dataOrName };\n }\n\n if (messageId) {\n const data = await channel.sendAction(messageId, formData);\n\n if (data?.message) {\n updateMessage(data.message);\n } else {\n removeMessage(message);\n }\n }\n });\n}\n","import { isNetworkSendFailure, validateAndGetMessage } from '../utils';\n\nimport { useChannelActionContext } from '../../../context/ChannelActionContext';\nimport { useChatContext } from '../../../context/ChatContext';\nimport { useTranslationContext } from '../../../context/TranslationContext';\n\nimport type { DeleteMessageOptions, LocalMessage } from 'stream-chat';\nimport type { MessageContextValue } from '../../../context';\n\nexport type DeleteMessageNotifications = {\n getErrorNotification?: (message: LocalMessage) => string;\n notify?: (notificationText: string, type: 'success' | 'error') => void;\n};\n\nexport const useDeleteHandler = (\n message?: LocalMessage,\n notifications: DeleteMessageNotifications = {},\n): MessageContextValue['handleDelete'] => {\n const { getErrorNotification, notify } = notifications;\n\n const { deleteMessage, removeMessage, updateMessage } =\n useChannelActionContext('useDeleteHandler');\n const { client } = useChatContext('useDeleteHandler');\n const { t } = useTranslationContext('useDeleteHandler');\n\n return async (options?: DeleteMessageOptions) => {\n if (!message) {\n return;\n }\n\n if (message.type === 'error' || isNetworkSendFailure(message)) {\n removeMessage?.(message);\n return;\n }\n\n if (!message.id || !client || !updateMessage) {\n return;\n }\n\n try {\n const deletedMessage = await deleteMessage(message, options);\n updateMessage(deletedMessage);\n } catch (e) {\n const errorMessage =\n getErrorNotification && validateAndGetMessage(getErrorNotification, [message]);\n\n if (notify) notify(errorMessage || t('Error deleting message'), 'error');\n throw e;\n }\n };\n};\n","import { validateAndGetMessage } from '../utils';\n\nimport { useChatContext } from '../../../context/ChatContext';\nimport { useTranslationContext } from '../../../context/TranslationContext';\n\nimport type { LocalMessage } from 'stream-chat';\nimport type { ReactEventHandler } from '../types';\n\nexport const missingUseFlagHandlerParameterWarning =\n 'useFlagHandler was called but it is missing one or more necessary parameters.';\n\nexport type FlagMessageNotifications = {\n getErrorNotification?: (message: LocalMessage) => string;\n getSuccessNotification?: (message: LocalMessage) => string;\n notify?: (notificationText: string, type: 'success' | 'error') => void;\n};\n\nexport const useFlagHandler = (\n message?: LocalMessage,\n notifications: FlagMessageNotifications = {},\n): ReactEventHandler => {\n const { client } = useChatContext('useFlagHandler');\n const { t } = useTranslationContext('useFlagHandler');\n\n return async (event) => {\n event.preventDefault();\n\n const { getErrorNotification, getSuccessNotification, notify } = notifications;\n\n if (!client || !t || !notify || !message?.id) {\n console.warn(missingUseFlagHandlerParameterWarning);\n return;\n }\n\n if (client.user?.banned) {\n return notify(t('Error adding flag'), 'error');\n }\n\n try {\n await client.flagMessage(message.id);\n\n const successMessage =\n getSuccessNotification &&\n validateAndGetMessage(getSuccessNotification, [message]);\n\n notify(successMessage || t('Message has been successfully flagged'), 'success');\n } catch (e) {\n const errorMessage =\n getErrorNotification && validateAndGetMessage(getErrorNotification, [message]);\n\n notify(errorMessage || t('Error adding flag'), 'error');\n }\n };\n};\n","import { useChannelActionContext } from '../../../context/ChannelActionContext';\n\nimport type React from 'react';\nimport type { LocalMessage, UserResponse } from 'stream-chat';\n\nimport type { ReactEventHandler } from '../types';\n\nexport type CustomMentionHandler = (\n event: React.BaseSyntheticEvent,\n mentioned_users: UserResponse[],\n) => void;\n\nexport type MentionedUserEventHandler = (\n event: React.BaseSyntheticEvent,\n mentionedUsers: UserResponse[],\n) => void;\n\nfunction createEventHandler(\n fn?: CustomMentionHandler,\n message?: LocalMessage,\n): ReactEventHandler {\n return (event) => {\n if (typeof fn !== 'function' || !message?.mentioned_users?.length) {\n return;\n }\n fn(event, message.mentioned_users);\n };\n}\n\nexport const useMentionsHandler = (\n message?: LocalMessage,\n customMentionHandler?: {\n onMentionsClick?: CustomMentionHandler;\n onMentionsHover?: CustomMentionHandler;\n },\n) => {\n const {\n onMentionsClick: contextOnMentionsClick,\n onMentionsHover: contextOnMentionsHover,\n } = useChannelActionContext('useMentionsHandler');\n\n const onMentionsClick =\n customMentionHandler?.onMentionsClick || contextOnMentionsClick || (() => null);\n\n const onMentionsHover =\n customMentionHandler?.onMentionsHover || contextOnMentionsHover || (() => null);\n\n return {\n onMentionsClick: createEventHandler(onMentionsClick, message),\n onMentionsHover: createEventHandler(onMentionsHover, message),\n };\n};\n","import { validateAndGetMessage } from '../utils';\nimport { useChannelStateContext, useTranslationContext } from '../../../context';\n\nimport type { LocalMessage } from 'stream-chat';\nimport type { ReactEventHandler } from '../types';\n\nexport type MarkUnreadHandlerNotifications = {\n getErrorNotification?: (message: LocalMessage) => string;\n getSuccessNotification?: (message: LocalMessage) => string;\n notify?: (notificationText: string, type: 'success' | 'error') => void;\n};\n\nexport const useMarkUnreadHandler = (\n message?: LocalMessage,\n notifications: MarkUnreadHandlerNotifications = {},\n): ReactEventHandler => {\n const { getErrorNotification, getSuccessNotification, notify } = notifications;\n\n const { channel } = useChannelStateContext('useMarkUnreadHandler');\n const { t } = useTranslationContext('useMarkUnreadHandler');\n\n return async (event) => {\n event.preventDefault();\n if (!message?.id) {\n console.warn('Mark unread handler does not have access to message id');\n return;\n }\n\n try {\n await channel.markUnread({ message_id: message.id });\n if (!notify) return;\n const successMessage =\n getSuccessNotification &&\n validateAndGetMessage(getSuccessNotification, [message]);\n if (successMessage) notify(successMessage, 'success');\n } catch (e) {\n if (!notify) return;\n const errorMessage =\n getErrorNotification && validateAndGetMessage(getErrorNotification, [message]);\n if (getErrorNotification && !errorMessage) return;\n notify(\n errorMessage ||\n t(\n 'Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.',\n ),\n 'error',\n );\n }\n };\n};\n","import { isUserMuted, validateAndGetMessage } from '../utils';\n\nimport { useChannelStateContext } from '../../../context/ChannelStateContext';\nimport { useChatContext } from '../../../context/ChatContext';\nimport { useTranslationContext } from '../../../context/TranslationContext';\n\nimport type { LocalMessage, UserResponse } from 'stream-chat';\n\nimport type { ReactEventHandler } from '../types';\n\nexport const missingUseMuteHandlerParamsWarning =\n 'useMuteHandler was called but it is missing one or more necessary parameter.';\n\nexport type MuteUserNotifications = {\n getErrorNotification?: (user: UserResponse) => string;\n getSuccessNotification?: (user: UserResponse) => string;\n notify?: (notificationText: string, type: 'success' | 'error') => void;\n};\n\nexport const useMuteHandler = (\n message?: LocalMessage,\n notifications: MuteUserNotifications = {},\n): ReactEventHandler => {\n const { mutes } = useChannelStateContext('useMuteHandler');\n const { client } = useChatContext('useMuteHandler');\n const { t } = useTranslationContext('useMuteHandler');\n\n return async (event) => {\n event.preventDefault();\n\n const { getErrorNotification, getSuccessNotification, notify } = notifications;\n\n if (!t || !message?.user || !notify || !client) {\n console.warn(missingUseMuteHandlerParamsWarning);\n return;\n }\n\n if (!isUserMuted(message, mutes)) {\n try {\n await client.muteUser(message.user.id);\n\n const successMessage =\n getSuccessNotification &&\n validateAndGetMessage(getSuccessNotification, [message.user]);\n\n notify(\n successMessage ||\n t('{{ user }} has been muted', {\n user: message.user.name || message.user.id,\n }),\n 'success',\n );\n } catch (e) {\n const errorMessage =\n getErrorNotification &&\n validateAndGetMessage(getErrorNotification, [message.user]);\n\n notify(errorMessage || t('Error muting a user ...'), 'error');\n }\n } else {\n try {\n await client.unmuteUser(message.user.id);\n\n const fallbackMessage = t('{{ user }} has been unmuted', {\n user: message.user.name || message.user.id,\n });\n\n const successMessage =\n (getSuccessNotification &&\n validateAndGetMessage(getSuccessNotification, [message.user])) ||\n fallbackMessage;\n\n if (typeof successMessage === 'string') {\n notify(successMessage, 'success');\n }\n } catch (e) {\n const errorMessage =\n (getErrorNotification &&\n validateAndGetMessage(getErrorNotification, [message.user])) ||\n t('Error unmuting a user ...');\n\n if (typeof errorMessage === 'string') {\n notify(errorMessage, 'error');\n }\n }\n }\n };\n};\n","import { useChannelActionContext } from '../../../context/ChannelActionContext';\n\nimport type { LocalMessage } from 'stream-chat';\nimport type { ReactEventHandler } from '../types';\n\nexport const useOpenThreadHandler = (\n message?: LocalMessage,\n customOpenThread?: (message: LocalMessage, event: React.BaseSyntheticEvent) => void,\n): ReactEventHandler => {\n const { openThread: channelOpenThread } =\n useChannelActionContext('useOpenThreadHandler');\n\n const openThread = customOpenThread || channelOpenThread;\n\n return (event) => {\n if (!openThread || !message) {\n console.warn(\n 'Open thread handler was called but it is missing one of its parameters',\n );\n return;\n }\n\n openThread(message, event);\n };\n};\n","import { defaultPinPermissions, validateAndGetMessage } from '../utils';\n\nimport { useChannelActionContext } from '../../../context/ChannelActionContext';\nimport { useChannelStateContext } from '../../../context/ChannelStateContext';\nimport { useChatContext } from '../../../context/ChatContext';\nimport { useTranslationContext } from '../../../context/TranslationContext';\n\nimport type { LocalMessage } from 'stream-chat';\nimport type { ReactEventHandler } from '../types';\n\n// @deprecated in favor of `channelCapabilities` - TODO: remove in next major release\nexport type PinEnabledUserRoles<T extends string = string> = Partial<\n Record<T, boolean>\n> & {\n admin?: boolean;\n anonymous?: boolean;\n channel_member?: boolean;\n channel_moderator?: boolean;\n guest?: boolean;\n member?: boolean;\n moderator?: boolean;\n owner?: boolean;\n user?: boolean;\n};\n\n// @deprecated in favor of `channelCapabilities` - TODO: remove in next major release\nexport type PinPermissions<\n T extends string = string,\n U extends string = string,\n> = Partial<Record<T, PinEnabledUserRoles<U>>> & {\n commerce?: PinEnabledUserRoles<U>;\n gaming?: PinEnabledUserRoles<U>;\n livestream?: PinEnabledUserRoles<U>;\n messaging?: PinEnabledUserRoles<U>;\n team?: PinEnabledUserRoles<U>;\n};\n\nexport type PinMessageNotifications = {\n getErrorNotification?: (message: LocalMessage) => string;\n notify?: (notificationText: string, type: 'success' | 'error') => void;\n};\n\nexport const usePinHandler = (\n message: LocalMessage,\n // @deprecated in favor of `channelCapabilities` - TODO: remove in next major release\n _permissions: PinPermissions = defaultPinPermissions, // eslint-disable-line\n notifications: PinMessageNotifications = {},\n) => {\n const { getErrorNotification, notify } = notifications;\n\n const { updateMessage } = useChannelActionContext('usePinHandler');\n const { channelCapabilities = {} } = useChannelStateContext('usePinHandler');\n const { client } = useChatContext('usePinHandler');\n const { t } = useTranslationContext('usePinHandler');\n\n const canPin = !!channelCapabilities['pin-message'];\n\n const handlePin: ReactEventHandler = async (event) => {\n event.preventDefault();\n\n if (!message) return;\n\n if (!message.pinned) {\n try {\n const optimisticMessage: LocalMessage = {\n ...message,\n pinned: true,\n pinned_at: new Date(),\n pinned_by: client.user,\n };\n\n updateMessage(optimisticMessage);\n\n await client.pinMessage(message);\n } catch (e) {\n const errorMessage =\n getErrorNotification && validateAndGetMessage(getErrorNotification, [message]);\n\n if (notify) notify(errorMessage || t('Error pinning message'), 'error');\n updateMessage(message);\n }\n } else {\n try {\n const optimisticMessage = {\n ...message,\n pin_expires: null,\n pinned: false,\n pinned_at: null,\n pinned_by: null,\n };\n\n updateMessage(optimisticMessage);\n\n await client.unpinMessage(message);\n } catch (e) {\n const errorMessage =\n getErrorNotification && validateAndGetMessage(getErrorNotification, [message]);\n\n if (notify) notify(errorMessage || t('Error removing message pin'), 'error');\n updateMessage(message);\n }\n }\n };\n\n return { canPin, handlePin };\n};\n","import type React from 'react';\nimport { useCallback } from 'react';\nimport throttle from 'lodash.throttle';\n\nimport { useThreadContext } from '../../Threads';\nimport { useChannelActionContext } from '../../../context/ChannelActionContext';\nimport { useChannelStateContext } from '../../../context/ChannelStateContext';\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { LocalMessage, Reaction, ReactionResponse } from 'stream-chat';\n\nexport const reactionHandlerWarning = `Reaction handler was called, but it is missing one of its required arguments.\nMake sure the ChannelAction and ChannelState contexts are properly set and the hook is initialized with a valid message.`;\n\nexport const useReactionHandler = (message?: LocalMessage) => {\n const thread = useThreadContext();\n const { updateMessage } = useChannelActionContext('useReactionHandler');\n const { channel, channelCapabilities } = useChannelStateContext('useReactionHandler');\n const { client } = useChatContext('useReactionHandler');\n\n const createMessagePreview = useCallback(\n (add: boolean, reaction: ReactionResponse, message: LocalMessage): LocalMessage => {\n const newReactionGroups = message?.reaction_groups || {};\n const reactionType = reaction.type;\n const hasReaction = !!newReactionGroups[reactionType];\n\n if (add) {\n const timestamp = new Date().toISOString();\n newReactionGroups[reactionType] = hasReaction\n ? {\n ...newReactionGroups[reactionType],\n count: newReactionGroups[reactionType].count + 1,\n }\n : {\n count: 1,\n first_reaction_at: timestamp,\n last_reaction_at: timestamp,\n sum_scores: 1,\n };\n } else {\n if (hasReaction && newReactionGroups[reactionType].count > 1) {\n newReactionGroups[reactionType] = {\n ...newReactionGroups[reactionType],\n count: newReactionGroups[reactionType].count - 1,\n };\n } else {\n delete newReactionGroups[reactionType];\n }\n }\n\n const newReactions: ReactionResponse[] | undefined = add\n ? [reaction, ...(message?.latest_reactions || [])]\n : message.latest_reactions?.filter(\n (item) => !(item.type === reaction.type && item.user_id === reaction.user_id),\n );\n\n const newOwnReactions = add\n ? [reaction, ...(message?.own_reactions || [])]\n : message?.own_reactions?.filter((item) => item.type !== reaction.type);\n\n return {\n ...message,\n latest_reactions: newReactions || message.latest_reactions,\n own_reactions: newOwnReactions,\n reaction_groups: newReactionGroups,\n };\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client.user, client.userID],\n );\n\n const createReactionPreview = (type: string) => ({\n message_id: message?.id,\n score: 1,\n type,\n user: client.user,\n user_id: client.user?.id,\n });\n\n const toggleReaction = throttle(async (id: string, type: string, add: boolean) => {\n if (!message || !channelCapabilities['send-reaction']) return;\n\n const newReaction = createReactionPreview(type) as ReactionResponse;\n const tempMessage = createMessagePreview(add, newReaction, message);\n\n try {\n updateMessage(tempMessage);\n thread?.upsertReplyLocally({ message: tempMessage });\n\n const messageResponse = add\n ? await channel.sendReaction(id, { type } as Reaction)\n : await channel.deleteReaction(id, type);\n\n // seems useless as we're expecting WS event to come in and replace this anyway\n updateMessage(messageResponse.message);\n } catch (error) {\n // revert to the original message if the API call fails\n updateMessage(message);\n thread?.upsertReplyLocally({ message });\n }\n }, 1000);\n\n return async (reactionType: string, event?: React.BaseSyntheticEvent) => {\n if (event?.preventDefault) {\n event.preventDefault();\n }\n\n if (!message) {\n return console.warn(reactionHandlerWarning);\n }\n\n let userExistingReaction = null as unknown as ReactionResponse;\n\n if (message.own_reactions) {\n message.own_reactions.forEach((reaction) => {\n // own user should only ever contain the current user id\n // just in case we check to prevent bugs with message updates from breaking reactions\n if (\n reaction.user &&\n client.userID === reaction.user.id &&\n reaction.type === reactionType\n ) {\n userExistingReaction = reaction;\n } else if (reaction.user && client.userID !== reaction.user.id) {\n console.warn(\n `message.own_reactions contained reactions from a different user, this indicates a bug`,\n );\n }\n });\n }\n\n try {\n if (userExistingReaction) {\n await toggleReaction(message.id, userExistingReaction.type, false);\n } else {\n await toggleReaction(message.id, reactionType, true);\n }\n } catch (error) {\n console.log({ error });\n }\n };\n};\n","import type { RetrySendMessage } from '../../../context/ChannelActionContext';\nimport { useChannelActionContext } from '../../../context/ChannelActionContext';\n\nexport const useRetryHandler = (\n customRetrySendMessage?: RetrySendMessage,\n): RetrySendMessage => {\n const { retrySendMessage: contextRetrySendMessage } =\n useChannelActionContext('useRetryHandler');\n\n const retrySendMessage = customRetrySendMessage || contextRetrySendMessage;\n\n return async (message) => {\n if (message) {\n await retrySendMessage(message);\n }\n };\n};\n","import type { User } from 'stream-chat';\n\nimport type { ReactEventHandler } from '../types';\nimport type { LocalMessage } from 'stream-chat';\n\nexport type UserEventHandler = (event: React.BaseSyntheticEvent, user: User) => void;\n\nexport const useUserHandler = (\n message?: LocalMessage,\n eventHandlers?: {\n onUserClickHandler?: UserEventHandler;\n onUserHoverHandler?: UserEventHandler;\n },\n): {\n onUserClick: ReactEventHandler;\n onUserHover: ReactEventHandler;\n} => ({\n onUserClick: (event) => {\n if (typeof eventHandlers?.onUserClickHandler !== 'function' || !message?.user) {\n return;\n }\n eventHandlers.onUserClickHandler(event, message.user);\n },\n onUserHover: (event) => {\n if (typeof eventHandlers?.onUserHoverHandler !== 'function' || !message?.user) {\n return;\n }\n\n eventHandlers.onUserHoverHandler(event, message.user);\n },\n});\n","import { useChannelStateContext } from '../../../context/ChannelStateContext';\nimport { useChatContext } from '../../../context/ChatContext';\nimport type { LocalMessage } from 'stream-chat';\n\nexport const useUserRole = (\n message: LocalMessage,\n onlySenderCanEdit?: boolean,\n disableQuotedMessages?: boolean,\n) => {\n const { channel, channelCapabilities = {} } = useChannelStateContext('useUserRole');\n const { client } = useChatContext('useUserRole');\n\n /**\n * @deprecated as it relies on `membership.role` check which is already deprecated and shouldn't be used anymore.\n * `isAdmin` will be removed in future release. See `channelCapabilities`.\n */\n const isAdmin =\n client.user?.role === 'admin' || channel.state.membership.role === 'admin';\n\n /**\n * @deprecated as it relies on `membership.role` check which is already deprecated and shouldn't be used anymore.\n * `isOwner` will be removed in future release. See `channelCapabilities`.\n */\n const isOwner = channel.state.membership.role === 'owner';\n\n /**\n * @deprecated as it relies on `membership.role` check which is already deprecated and shouldn't be used anymore.\n * `isModerator` will be removed in future release. See `channelCapabilities`.\n */\n const isModerator =\n client.user?.role === 'channel_moderator' ||\n channel.state.membership.role === 'channel_moderator' ||\n channel.state.membership.role === 'moderator' ||\n channel.state.membership.is_moderator === true ||\n channel.state.membership.channel_role === 'channel_moderator';\n\n const isMyMessage = client.userID === message.user?.id;\n\n const canEdit =\n !message.poll &&\n ((!onlySenderCanEdit && channelCapabilities['update-any-message']) ||\n (isMyMessage && channelCapabilities['update-own-message']));\n\n const canDelete =\n channelCapabilities['delete-any-message'] ||\n (isMyMessage && channelCapabilities['delete-own-message']);\n\n const canFlag = !isMyMessage && channelCapabilities['flag-message'];\n const canMute = !isMyMessage && channelCapabilities['mute-channel'];\n const canBlockUser = !isMyMessage;\n const canMarkUnread = !isMyMessage && channelCapabilities['read-events'];\n const canQuote = !disableQuotedMessages && channelCapabilities['quote-message'];\n const canReact = channelCapabilities['send-reaction'];\n const canReply = channelCapabilities['send-reply'];\n const canSendMessage = channelCapabilities['send-message'];\n\n return {\n canBlockUser,\n canDelete,\n canEdit,\n canFlag,\n canMarkUnread,\n canMute,\n canQuote,\n canReact,\n canReply,\n canSendMessage,\n isAdmin,\n isModerator,\n isMyMessage,\n isOwner,\n };\n};\n","import { useChatContext, useTranslationContext } from '../../../context';\nimport { useStableCallback } from '../../../utils/useStableCallback';\nimport type {\n LocalMessage,\n ReactionResponse,\n ReactionSort,\n StreamChat,\n} from 'stream-chat';\nimport type { ReactionType } from '../../Reactions/types';\n\nexport const MAX_MESSAGE_REACTIONS_TO_FETCH = 1000;\n\ntype FetchMessageReactionsNotifications = {\n getErrorNotification?: (message: LocalMessage) => string;\n notify?: (notificationText: string, type: 'success' | 'error') => void;\n};\n\nexport function useReactionsFetcher(\n message: LocalMessage,\n notifications: FetchMessageReactionsNotifications = {},\n) {\n const { client } = useChatContext('useRectionsFetcher');\n const { t } = useTranslationContext('useReactionFetcher');\n const { getErrorNotification, notify } = notifications;\n\n return useStableCallback(async (reactionType?: ReactionType, sort?: ReactionSort) => {\n try {\n return await fetchMessageReactions(client, message.id, reactionType, sort);\n } catch (e) {\n const errorMessage = getErrorNotification?.(message);\n notify?.(errorMessage || t('Error fetching reactions'), 'error');\n throw e;\n }\n });\n}\n\nasync function fetchMessageReactions(\n client: StreamChat,\n messageId: string,\n reactionType?: ReactionType,\n sort?: ReactionSort,\n) {\n const reactions: ReactionResponse[] = [];\n const limit = 25;\n let next: string | undefined;\n let hasNext = true;\n\n while (hasNext && reactions.length < MAX_MESSAGE_REACTIONS_TO_FETCH) {\n const response = await client.queryReactions(\n messageId,\n reactionType ? { type: reactionType } : {},\n sort,\n { limit, next },\n );\n\n reactions.push(...response.reactions);\n next = response.next;\n hasNext = Boolean(next);\n }\n\n return reactions;\n}\n","import { useEffect, useRef, useState } from 'react';\n\nimport { useStableCallback } from '../../../utils/useStableCallback';\nimport type { StreamedMessageTextProps } from '../StreamedMessageText';\n\nexport type UseMessageTextStreamingProps = Pick<\n StreamedMessageTextProps,\n 'streamingLetterIntervalMs' | 'renderingLetterCount'\n> & { text: string };\n\nconst DEFAULT_LETTER_INTERVAL = 30;\nconst DEFAULT_RENDERING_LETTER_COUNT = 2;\n\n/**\n * A hook that returns text in a streamed, typewriter fashion. The speed of streaming is\n * configurable.\n * @param {number} [streamingLetterIntervalMs=30] - The timeout between each typing animation in milliseconds.\n * @param {number} [renderingLetterCount=2] - The number of letters to be rendered each time we update.\n * @param {string} text - The text that we want to render in a typewriter fashion.\n * @returns {{ streamedMessageText: string }} - A substring of the text property, up until we've finished rendering the typewriter animation.\n */\nexport const useMessageTextStreaming = ({\n renderingLetterCount = DEFAULT_RENDERING_LETTER_COUNT,\n streamingLetterIntervalMs = DEFAULT_LETTER_INTERVAL,\n text,\n}: UseMessageTextStreamingProps) => {\n const [streamedMessageText, setStreamedMessageText] = useState<string>(text);\n const textCursor = useRef<number>(text.length);\n\n useEffect(() => {\n const textLength = text.length;\n\n const interval = setInterval(() => {\n if (!text || textCursor.current >= textLength) {\n clearInterval(interval);\n return;\n }\n const newCursorValue = textCursor.current + renderingLetterCount;\n const newText = text.substring(0, newCursorValue);\n textCursor.current += newText.length - textCursor.current;\n setStreamedMessageText(newText);\n }, streamingLetterIntervalMs);\n\n return () => {\n clearInterval(interval);\n };\n }, [streamingLetterIntervalMs, renderingLetterCount, text]);\n\n const skipAnimation = useStableCallback(() => {\n textCursor.current = text.length;\n setStreamedMessageText(text);\n });\n\n return { skipAnimation, streamedMessageText } as const;\n};\n","import { useCallback } from 'react';\nimport { useChatContext } from '../../../context';\nimport { useStateStore } from '../../../store';\nimport type { ReminderManagerState } from 'stream-chat';\n\nexport const useMessageReminder = (messageId: string) => {\n const { client } = useChatContext();\n const reminderSelector = useCallback(\n (state: ReminderManagerState) => ({\n reminder: state.reminders.get(messageId),\n }),\n [messageId],\n );\n const { reminder } = useStateStore(client.reminders.state, reminderSelector);\n return reminder;\n};\n","import React, { type ComponentProps, type ComponentType, forwardRef } from 'react';\nimport clsx from 'clsx';\n\nexport const Root = forwardRef<HTMLDivElement, ComponentProps<'div'>>(function AlertRoot(\n { children, className, ...props }: ComponentProps<'div'>,\n ref,\n) {\n return (\n <div {...props} className={clsx('str-chat__alert-root', className)} ref={ref}>\n {children}\n </div>\n );\n});\n\nexport type AlertHeaderProps = ComponentProps<'div'> & {\n title?: string;\n description?: string;\n Icon?: ComponentType;\n};\n\nexport const Header = forwardRef<HTMLDivElement, AlertHeaderProps>(function AlertHeader(\n { children, className, description, Icon, title, ...props },\n ref,\n) {\n return (\n <div {...props} className={clsx('str-chat__alert-header', className)} ref={ref}>\n {title ? (\n <>\n {Icon && <Icon />}\n <div className='str-chat__alert-header__copy'>\n <div className='str-chat__alert-header__title'>{title}</div>\n {description && (\n <div className='str-chat__alert-header__description'>{description}</div>\n )}\n </div>\n </>\n ) : (\n children\n )}\n </div>\n );\n});\n\nconst Actions = forwardRef<HTMLDivElement, ComponentProps<'div'>>(function AlertActions(\n { children, className, ...props },\n ref,\n) {\n return (\n <div {...props} className={clsx('str-chat__alert-actions', className)} ref={ref}>\n {children}\n </div>\n );\n});\n\nexport const Alert = {\n Actions,\n Header,\n Root,\n};\n","import clsx from 'clsx';\nimport type { ComponentProps, PropsWithChildren } from 'react';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { FocusScope } from '@react-aria/focus';\nimport { DialogPortalEntry } from './DialogPortal';\nimport { useDialog, useDialogIsOpen } from '../hooks';\nimport { type OffsetOpt, usePopoverPosition } from '../hooks/usePopoverPosition';\nimport type { PopperLikePlacement } from '../hooks';\nimport type { Placement } from '@floating-ui/react';\n\nexport interface DialogAnchorOptions {\n open: boolean;\n placement: PopperLikePlacement;\n referenceElement: HTMLElement | null;\n allowFlip?: boolean;\n updateKey?: unknown;\n updatePositionOnContentResize?: boolean;\n offset?: OffsetOpt;\n}\n\nexport function useDialogAnchor<T extends HTMLElement>({\n allowFlip,\n offset,\n open,\n placement,\n referenceElement,\n updateKey,\n updatePositionOnContentResize = false,\n}: DialogAnchorOptions) {\n const [popperElement, setPopperElement] = useState<T | null>(null);\n // keeps track of the first \"chosen\" placement (after popperElement is set) to avoid popper \"jumping\" to a different placement when it updates and finds a better fit; resets when popperElement is unset (!open)\n const [stabilisedChosenPlacement, setStabilisedChosenPlacement] =\n useState<Placement | null>(null);\n\n const {\n placement: chosenPlacement,\n refs,\n strategy,\n update,\n x,\n y,\n } = usePopoverPosition({\n allowFlip,\n freeze: true,\n offset,\n placement: stabilisedChosenPlacement ?? placement,\n });\n\n if (!stabilisedChosenPlacement && popperElement && placement !== chosenPlacement) {\n setStabilisedChosenPlacement(chosenPlacement);\n } else if (stabilisedChosenPlacement && !popperElement) {\n setStabilisedChosenPlacement(null);\n }\n\n // Freeze reference when dialog opens so submenus (e.g. ContextMenu level 2+) stay aligned to the original anchor\n const frozenReferenceRef = useRef<HTMLElement | null>(null);\n if (open && referenceElement && !frozenReferenceRef.current) {\n frozenReferenceRef.current = referenceElement;\n }\n if (!open) {\n frozenReferenceRef.current = null;\n }\n const effectiveReference = open ? frozenReferenceRef.current : referenceElement;\n\n useEffect(() => {\n refs.setReference(effectiveReference);\n }, [effectiveReference, refs]);\n\n useEffect(() => {\n refs.setFloating(popperElement);\n }, [popperElement, refs]);\n\n useEffect(() => {\n if (open && popperElement && effectiveReference) {\n // Re-run when reference becomes available (e.g. after ref is set) or when updateKey changes (e.g. submenu open)\n // Since the popper's reference element might not be (and usually is not) visible\n // all the time, it's safer to force popper update before showing it.\n // update is non-null only if popperElement is non-null\n update?.();\n }\n }, [open, placement, popperElement, update, updateKey, effectiveReference]);\n\n useEffect(() => {\n if (!popperElement || !updatePositionOnContentResize) return;\n\n const resizeObserver = new ResizeObserver(update);\n\n resizeObserver.observe(popperElement);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [popperElement, update, updatePositionOnContentResize]);\n\n if (popperElement && !open) {\n setPopperElement(null);\n }\n\n return {\n setPopperElement,\n styles: {\n left: x ?? 0,\n position: strategy,\n top: y ?? 0,\n } as React.CSSProperties,\n };\n}\n\nexport type DialogAnchorProps = PropsWithChildren<Partial<DialogAnchorOptions>> & {\n id: string;\n dialogManagerId?: string;\n focus?: boolean;\n trapFocus?: boolean;\n} & ComponentProps<'div'>;\n\nexport const DialogAnchor = ({\n allowFlip = true,\n children,\n className,\n dialogManagerId,\n focus = true,\n id,\n offset,\n placement = 'auto',\n referenceElement = null,\n tabIndex,\n trapFocus,\n updateKey,\n updatePositionOnContentResize,\n ...restDivProps\n}: DialogAnchorProps) => {\n const dialog = useDialog({ dialogManagerId, id });\n const open = useDialogIsOpen(id, dialogManagerId);\n\n const { setPopperElement, styles } = useDialogAnchor<HTMLDivElement>({\n allowFlip,\n offset,\n open,\n placement,\n referenceElement,\n updateKey,\n updatePositionOnContentResize,\n });\n\n useEffect(() => {\n if (!open) return;\n const hideOnEscape = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n dialog?.close();\n };\n\n document.addEventListener('keyup', hideOnEscape);\n\n return () => {\n document.removeEventListener('keyup', hideOnEscape);\n };\n }, [dialog, open]);\n\n // prevent rendering the dialog contents if the dialog should not be open / shown\n if (!open) {\n return null;\n }\n\n return (\n <DialogPortalEntry dialogId={id} dialogManagerId={dialogManagerId}>\n <FocusScope autoFocus={focus} contain={trapFocus} restoreFocus>\n <div\n {...restDivProps}\n className={clsx('str-chat__dialog-contents', className)}\n data-testid='str-chat__dialog-contents'\n ref={setPopperElement}\n style={styles}\n tabIndex={typeof tabIndex !== 'undefined' ? tabIndex : 0}\n >\n {children}\n </div>\n </FocusScope>\n </DialogPortalEntry>\n );\n};\n","import React, { type PropsWithChildren } from 'react';\nimport { DialogAnchor, type DialogAnchorProps } from '../service';\nimport { useDialogIsOpen } from '../hooks';\nimport { Button } from '../../Button';\nimport clsx from 'clsx';\nimport { IconCrossMedium } from '../../Icons';\nimport { useComponentContext } from '../../../context';\n\nexport type CalloutProps = PropsWithChildren<\n DialogAnchorProps & {\n onClose: () => void;\n className?: string;\n }\n>;\n\n/**\n * Callout is a general purpose component that displays content in dialog that has been previously opened by clicking on a reference element\n * and has to be dismissed to disappear.\n * Tooltip on the other side is a dialog that appears upon pointer device cursor hovering above a reference element.\n * @param children\n * @param className\n * @param dialogManagerId\n * @param dialogId\n * @param onClose\n * @param anchorProps\n * @constructor\n */\n\nexport const Callout = ({\n children,\n className,\n dialogManagerId,\n id: dialogId,\n onClose,\n ...anchorProps\n}: CalloutProps) => {\n const { CalloutDialog = DefaultCalloutDialog } = useComponentContext();\n\n const dialogIsOpen = useDialogIsOpen(dialogId, dialogManagerId);\n return (\n <DialogAnchor {...anchorProps} dialogManagerId={dialogManagerId} id={dialogId}>\n {dialogIsOpen && (\n <CalloutDialog className={className} onClose={onClose}>\n {children}\n </CalloutDialog>\n )}\n </DialogAnchor>\n );\n};\n\nexport type CalloutDialogProps = Pick<CalloutProps, 'children' | 'className' | 'onClose'>;\n\nconst DefaultCalloutDialog = ({ children, className, onClose }: CalloutDialogProps) => (\n <div className='str-chat__callout'>\n {children}\n <Button\n appearance='ghost'\n circular\n className={clsx(className, 'str-chat__callout__close-button')}\n onClick={onClose}\n size='sm'\n variant='secondary'\n >\n <IconCrossMedium />\n </Button>\n </div>\n);\n","import clsx from 'clsx';\nimport React, {\n type ComponentPropsWithoutRef,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { IconPeople } from '../Icons';\n\nexport type AvatarProps = {\n /** URL of the avatar image */\n imageUrl?: string;\n /** Name of the user, used for title tag fallback */\n userName?: string;\n /** Online status indicator, not rendered if not of type boolean */\n isOnline?: boolean;\n\n size: '2xl' | 'xl' | 'lg' | 'md' | 'sm' | 'xs' | null;\n} & ComponentPropsWithoutRef<'div'>;\n\nconst getInitials = (name?: string) => {\n const regex = /(\\p{L}{1})\\p{L}+/gu;\n\n if (!name || name.trim().length === 0) {\n return '';\n }\n\n const initials = Array.from(name?.matchAll(regex) || []);\n\n if (!initials.length) {\n return '';\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const startInitial = initials.at(0)![1];\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const endInitial = initials.length > 1 ? initials.at(-1)![1] : '';\n\n return `${startInitial}${endInitial}`;\n};\n\n/**\n * A round avatar image with fallback to username's first letter\n */\nexport const Avatar = ({\n className,\n imageUrl,\n isOnline,\n size,\n userName,\n ...rest\n}: AvatarProps) => {\n const [error, setError] = useState(false);\n\n useEffect(() => () => setError(false), [imageUrl]);\n\n const nameString = userName?.toString() || '';\n\n const sizeAwareInitials = useMemo(() => {\n const initials = getInitials(nameString);\n\n if (size === 'sm' || size === 'xs') {\n return initials.charAt(0);\n }\n\n return initials;\n }, [nameString, size]);\n\n const showImage = typeof imageUrl === 'string' && !error;\n\n return (\n <div\n className={clsx(`str-chat__avatar`, className, {\n 'str-chat__avatar--multiple-letters': sizeAwareInitials.length > 1,\n 'str-chat__avatar--no-letters': !sizeAwareInitials.length,\n 'str-chat__avatar--one-letter': sizeAwareInitials.length === 1,\n [`str-chat__avatar--size-${size}`]: typeof size === 'string',\n })}\n data-testid='avatar'\n role='button'\n title={userName}\n {...rest}\n >\n {typeof isOnline === 'boolean' && (\n <div\n className={clsx('str-chat__avatar-status-badge', {\n 'str-chat__avatar-status-badge--offline': !isOnline,\n 'str-chat__avatar-status-badge--online': isOnline,\n })}\n />\n )}\n {showImage ? (\n <img\n alt={sizeAwareInitials}\n className='str-chat__avatar-image'\n data-testid='avatar-img'\n onError={() => setError(true)}\n src={imageUrl}\n />\n ) : (\n <>\n {!!sizeAwareInitials.length && (\n <div className='str-chat__avatar-initials' data-testid='avatar-fallback'>\n {sizeAwareInitials}\n </div>\n )}\n {!sizeAwareInitials.length && <IconPeople />}\n </>\n )}\n </div>\n );\n};\n","import clsx from 'clsx';\nimport React, { type ComponentProps } from 'react';\nimport { IconExclamation } from '../Icons';\n\nexport type BadgeVariant =\n | 'default'\n | 'primary'\n | 'error'\n | 'neutral'\n | 'counter'\n | 'inverse';\n\nexport type BadgeSize = 'xs' | 'sm' | 'md' | 'lg' | null;\n\nexport type BadgeProps = ComponentProps<'div'> & {\n /** Visual variant mapping to design tokens */\n variant?: BadgeVariant;\n /** Size preset (typography and padding) */\n size?: BadgeSize;\n};\n\n/**\n * Compact pill/circle badge for counts and labels.\n * Uses design tokens: --badge-bg-*, --badge-text-*, --badge-border.\n */\nexport const Badge = ({\n children,\n className,\n size = 'md',\n variant = 'default',\n ...spanProps\n}: BadgeProps) => (\n <div\n {...spanProps}\n className={clsx(\n 'str-chat__badge',\n `str-chat__badge--variant-${variant}`,\n { [`str-chat__badge--size-${size}`]: size },\n className,\n )}\n >\n {children}\n </div>\n);\n\nexport const ErrorBadge = ({\n className,\n size = 'sm',\n ...rest\n}: Omit<BadgeProps, 'variant'>) => (\n <Badge {...rest} className={className} size={size} variant='error'>\n <IconExclamation />\n </Badge>\n);\n","import React, { type ComponentProps, type ElementType } from 'react';\nimport { useComponentContext } from '../../context';\nimport { type AvatarProps, Avatar as DefaultAvatar } from './Avatar';\nimport clsx from 'clsx';\nimport { Badge, type BadgeSize } from '../Badge';\n\nexport function AvatarStack({\n badgeSize,\n component: Component = 'div',\n displayInfo = [],\n overflowCount,\n size,\n}: {\n component?: ElementType;\n displayInfo?: (Pick<AvatarProps, 'imageUrl' | 'userName'> & { id?: string })[];\n overflowCount?: number;\n size: 'md' | 'sm' | 'xs' | null;\n badgeSize?: BadgeSize;\n}) {\n const { Avatar = DefaultAvatar } = useComponentContext(AvatarStack.name);\n\n if (!displayInfo.length) {\n return null;\n }\n\n return (\n <Component\n className={clsx('str-chat__avatar-stack', {\n [`str-chat__avatar-stack--size-${size}`]: typeof size === 'string',\n })}\n >\n {displayInfo.map((info, index) => (\n <Avatar\n imageUrl={info.imageUrl}\n key={info.id ?? `${info.userName}-${info.imageUrl}-${index}`}\n size={size}\n userName={info.userName}\n />\n ))}\n {typeof overflowCount === 'number' && overflowCount > 0 && (\n <Badge\n className='str-chat__avatar-stack__count-badge'\n size={badgeSize ?? size}\n variant='counter'\n >\n +{overflowCount}\n </Badge>\n )}\n </Component>\n );\n}\n\nexport type AvatarStackProps = ComponentProps<typeof AvatarStack>;\n","import React from 'react';\n\nimport { Avatar, GroupAvatar } from './';\nimport type { AvatarProps, GroupAvatarProps } from './';\nimport type { GroupAvatarMember } from './GroupAvatar';\n\nexport type ChannelAvatarProps = Partial<Omit<GroupAvatarProps & AvatarProps, 'size'>> & {\n size: GroupAvatarProps['size'];\n /** When set with length >= 2, GroupAvatar is used. */\n displayMembers?: GroupAvatarMember[];\n overflowCount?: number;\n};\n\nexport const ChannelAvatar = ({\n displayMembers,\n imageUrl,\n overflowCount,\n size,\n userName,\n ...sharedProps\n}: ChannelAvatarProps) => {\n if ((displayMembers?.length ?? 0) >= 2) {\n return (\n <GroupAvatar\n displayMembers={displayMembers}\n overflowCount={overflowCount}\n size={size}\n {...sharedProps}\n />\n );\n }\n return <Avatar imageUrl={imageUrl} size={size} userName={userName} {...sharedProps} />;\n};\n","import clsx from 'clsx';\nimport React, { type ComponentPropsWithoutRef } from 'react';\nimport { Avatar, type AvatarProps } from './Avatar';\nimport { Badge, type BadgeSize } from '../Badge';\n\nexport type GroupAvatarMember = {\n imageUrl?: string;\n userName?: string;\n};\n\nexport type GroupAvatarProps = ComponentPropsWithoutRef<'div'> & {\n /** List of members to show as avatars; at most 2 when overflowCount is set, otherwise 4. Defaults to [] when omitted. */\n displayMembers?: GroupAvatarMember[];\n /** Optional count for the \"+N\" badge when there are more members than shown. */\n overflowCount?: number;\n size: '2xl' | 'xl' | 'lg' | null;\n badgeSize?: BadgeSize;\n isOnline?: boolean;\n};\n\n/**\n * Avatar component to display multiple users' avatars in a group.\n * Renders a single Avatar if fewer than 2 members. Otherwise, renders up to 2 avatars (when overflowCount is set) or 4, plus an optional +N badge.\n */\n// TODO: rename to AvatarGroup\nexport const GroupAvatar = ({\n badgeSize,\n className,\n displayMembers = [],\n isOnline,\n overflowCount,\n size,\n ...rest\n}: GroupAvatarProps) => {\n const displayCountBadge = typeof overflowCount === 'number' && overflowCount > 0;\n\n if (displayMembers.length < 2) {\n const firstUser = displayMembers[0];\n\n return (\n <Avatar\n imageUrl={firstUser?.imageUrl}\n isOnline={isOnline}\n size={size}\n userName={firstUser?.userName}\n {...rest}\n />\n );\n }\n\n let avatarSize: AvatarProps['size'] = null;\n if (size === '2xl') {\n avatarSize = 'lg';\n } else if (size === 'xl') {\n avatarSize = 'md';\n } else if (size === 'lg') {\n avatarSize = 'sm';\n }\n\n return (\n <div\n className={clsx(\n 'str-chat__avatar-group',\n {\n 'str-chat__avatar-group--offline': typeof isOnline === 'boolean' && !isOnline,\n 'str-chat__avatar-group--online': typeof isOnline === 'boolean' && isOnline,\n [`str-chat__avatar-group--size-${size}`]: typeof size === 'string',\n },\n className,\n )}\n data-testid='group-avatar'\n role='button'\n {...rest}\n >\n {displayMembers\n .slice(0, displayCountBadge ? 2 : 4)\n .map(({ imageUrl, userName }, index) => (\n <Avatar\n imageUrl={imageUrl}\n key={`${userName}-${imageUrl}-${index}`}\n size={avatarSize}\n userName={userName}\n />\n ))}\n {displayCountBadge && (\n <Badge\n className='str-chat__avatar-group__count-badge'\n size={badgeSize}\n variant='counter'\n >\n +{overflowCount}\n </Badge>\n )}\n </div>\n );\n};\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport clsx from 'clsx';\nimport React, {\n type ComponentProps,\n type ComponentPropsWithoutRef,\n type ComponentType,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { Avatar, type AvatarProps } from '../../Avatar';\nimport { IconChevronLeft, IconChevronRight } from '../../Icons';\nimport type { PopperLikePlacement } from '../hooks';\nimport { useDialogIsOpen, useDialogOnNearestManager } from '../hooks';\nimport type { DialogAnchorProps } from '../service/DialogAnchor';\nimport { DialogAnchor, useDialogAnchor } from '../service/DialogAnchor';\n\nexport type BaseContextMenuButtonProps = {\n details?: ReactNode;\n hasSubMenu?: boolean;\n label?: ReactNode;\n Icon?: ComponentType<ComponentProps<'svg'>>;\n SubmenuIcon?: ComponentType<ComponentProps<'svg'>>;\n variant?: 'destructive';\n} & ComponentProps<'button'>;\n\nexport const BaseContextMenuButton = ({\n children,\n className,\n details,\n hasSubMenu,\n Icon,\n label,\n SubmenuIcon = IconChevronRight,\n variant,\n ...props\n}: BaseContextMenuButtonProps) => (\n <button\n {...props}\n className={clsx(\n 'str-chat__context-menu__button',\n {\n 'str-chat__context-menu__button--with-submenu': hasSubMenu,\n [`str-chat__context-menu__button--${variant}`]: typeof variant === 'string',\n },\n className,\n )}\n type='button'\n >\n {Icon && <Icon className='str-chat__context-menu__button__icon' />}\n {label ? (\n <>\n <div className='str-chat__context-menu__button__label'>{label}</div>\n <div className='str-chat__context-menu__button__details'>{details}</div>\n </>\n ) : (\n <div className='str-chat__context-menu__button__label'>{children}</div>\n )}\n {!!hasSubMenu && (\n <SubmenuIcon className='str-chat__context-menu__button__submenu-icon' />\n )}\n </button>\n);\n\nexport type UserContextMenuButtonProps = Pick<AvatarProps, 'imageUrl' | 'userName'> &\n ComponentProps<'button'>;\n\nexport const UserContextMenuButton = ({\n children,\n className,\n imageUrl,\n userName,\n ...props\n}: UserContextMenuButtonProps) => (\n <button\n {...props}\n className={clsx(\n 'str-chat__context-menu__button str-chat__user-context-menu__button',\n className,\n )}\n type='button'\n >\n <Avatar imageUrl={imageUrl} size='sm' userName={userName} />\n <div className='str-chat__context-menu__button__label'>{children ?? userName}</div>\n </button>\n);\n\nexport type EmojiContextMenuButtonProps = { emoji: string } & Pick<\n BaseContextMenuButtonProps,\n 'label'\n> &\n ComponentProps<'button'>;\n\nexport const EmojiContextMenuButton = ({\n children,\n className,\n emoji,\n label,\n ...props\n}: EmojiContextMenuButtonProps) => (\n <button\n {...props}\n className={clsx(\n 'str-chat__context-menu__button str-chat__emoji-context-menu__button',\n className,\n )}\n type='button'\n >\n <span className='str-chat__context-menu__button__emoji str-chat__emoji-item--entity'>\n {emoji}\n </span>\n <div className='str-chat__context-menu__button__label'>{children ?? label}</div>\n </button>\n);\n\ntype ButtonWithSubmenuProps = {\n Submenu: ComponentType;\n submenuContainerProps?: ComponentProps<'div'>;\n submenuPlacement?: PopperLikePlacement;\n};\n\nconst ContextMenuButtonWithSubmenu = ({\n children,\n className,\n Submenu,\n submenuContainerProps,\n submenuPlacement = 'right-start',\n ...buttonProps\n}: BaseContextMenuButtonProps & ButtonWithSubmenuProps) => {\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n const [dialogContainer, setDialogContainer] = useState<HTMLDivElement | null>(null);\n const keepSubmenuOpen = useRef(false);\n const dialogCloseTimeout = useRef<NodeJS.Timeout | null>(null);\n const dialogId = useMemo(() => `submenu-${Math.random().toString(36).slice(2)}`, []);\n const { dialog, dialogManager } = useDialogOnNearestManager({ id: dialogId });\n const dialogIsOpen = useDialogIsOpen(dialogId, dialogManager?.id);\n const { setPopperElement, styles } = useDialogAnchor<HTMLDivElement>({\n open: dialogIsOpen,\n placement: submenuPlacement,\n referenceElement: buttonRef.current,\n });\n\n const closeDialogLazily = useCallback(() => {\n if (dialogCloseTimeout.current) clearTimeout(dialogCloseTimeout.current);\n dialogCloseTimeout.current = setTimeout(() => {\n if (keepSubmenuOpen.current) return;\n dialog.close();\n }, 100);\n }, [dialog]);\n\n const handleClose = useCallback(\n (event: Event) => {\n const parentButton = buttonRef.current;\n if (!dialogIsOpen || !parentButton) return;\n event.stopPropagation();\n closeDialogLazily();\n parentButton.focus();\n },\n [closeDialogLazily, dialogIsOpen, buttonRef],\n );\n\n const handleFocusParentButton = () => {\n if (dialogIsOpen) return;\n dialog.open();\n keepSubmenuOpen.current = true;\n };\n\n useEffect(() => {\n const parentButton = buttonRef.current;\n if (!dialogIsOpen || !parentButton) return;\n const hideOnEscape = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n handleClose(event);\n keepSubmenuOpen.current = false;\n };\n\n document.addEventListener('keyup', hideOnEscape, { capture: true });\n\n return () => {\n document.removeEventListener('keyup', hideOnEscape, { capture: true });\n };\n }, [dialogIsOpen, handleClose]);\n\n return (\n <>\n <BaseContextMenuButton\n aria-selected='false'\n className={clsx(className, 'str_chat__button-with-submenu', {\n 'str_chat__button-with-submenu--submenu-open': dialogIsOpen,\n })}\n hasSubMenu\n onBlur={() => {\n keepSubmenuOpen.current = false;\n closeDialogLazily();\n }}\n onClick={(event) => {\n event.stopPropagation();\n dialog.toggle();\n }}\n onFocus={handleFocusParentButton}\n onMouseEnter={handleFocusParentButton}\n onMouseLeave={() => {\n keepSubmenuOpen.current = false;\n closeDialogLazily();\n }}\n role='option'\n {...buttonProps}\n ref={buttonRef}\n >\n {children}\n </BaseContextMenuButton>\n {dialogIsOpen && (\n <div\n onBlur={(event) => {\n const isBlurredDescendant =\n event.relatedTarget instanceof Node &&\n dialogContainer?.contains(event.relatedTarget);\n if (isBlurredDescendant) return;\n keepSubmenuOpen.current = false;\n closeDialogLazily();\n }}\n onFocus={() => {\n keepSubmenuOpen.current = true;\n }}\n onMouseEnter={() => {\n keepSubmenuOpen.current = true;\n }}\n onMouseLeave={() => {\n keepSubmenuOpen.current = false;\n closeDialogLazily();\n }}\n ref={(element) => {\n setPopperElement(element);\n setDialogContainer(element);\n }}\n style={styles}\n tabIndex={-1}\n {...submenuContainerProps}\n >\n <Submenu />\n </div>\n )}\n </>\n );\n};\n\ntype ContextMenuButtonProps = BaseContextMenuButtonProps;\n\nexport const ContextMenuButton = ({\n onBlur,\n onFocus,\n ...props\n}: ContextMenuButtonProps) => {\n const [isFocused, setIsFocused] = useState(false);\n return (\n <BaseContextMenuButton\n {...props}\n aria-selected={isFocused ? 'true' : 'false'}\n onBlur={(e) => {\n setIsFocused(false);\n onBlur?.(e);\n }}\n onFocus={(e) => {\n setIsFocused(true);\n onFocus?.(e);\n }}\n />\n );\n};\n\nexport const ContextMenuBackButton = ({\n children,\n className,\n ...props\n}: ComponentProps<'button'>) => (\n <button\n {...props}\n className={clsx('str-chat__context-menu__back-button', className)}\n type='button'\n >\n {children}\n </button>\n);\n\nexport const ContextMenuHeader = ({\n children,\n className,\n ...props\n}: ComponentProps<'div'>) => (\n <div {...props} className={clsx('str-chat__context-menu__header', className)}>\n {children}\n </div>\n);\n\nexport const ContextMenuBody = ({\n children,\n className,\n ...props\n}: ComponentProps<'div'>) => (\n <div {...props} className={clsx('str-chat__context-menu__body', className)}>\n {children}\n </div>\n);\n\nexport const ContextMenuRoot = React.forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n function ContextMenuRoot({ className, ...props }, ref) {\n return (\n <div {...props} className={clsx('str-chat__context-menu', className)} ref={ref} />\n );\n },\n);\n\nexport type ContextMenuHeaderComponent = ComponentType;\nexport type ContextMenuSubmenu = ComponentType;\n\nexport type ContextMenuOpenSubmenuParams = Omit<ContextMenuLevel, 'items'>;\n\nexport type ContextMenuItemProps = ComponentProps<'button'>;\n\nexport type ContextMenuItemComponent = ComponentType<ContextMenuItemProps>;\n\ntype ContextMenuContextValue = {\n closeMenu: () => void;\n openSubmenu: (params: ContextMenuOpenSubmenuParams) => void;\n returnToParentMenu: () => void;\n};\n\nconst ContextMenuContext = React.createContext<ContextMenuContextValue | undefined>(\n undefined,\n);\n\nexport const useContextMenuContext = () =>\n useContext(ContextMenuContext) as ContextMenuContextValue;\n\ntype ContextMenuLevel = {\n items?: ContextMenuItemComponent[];\n Submenu?: ContextMenuSubmenu;\n Header?: ContextMenuHeaderComponent;\n ItemsWrapper?: ComponentType;\n menuClassName?: string;\n};\n\ntype ContextMenuBaseProps = ComponentPropsWithoutRef<'div'> & {\n backLabel?: ReactNode;\n Header?: ContextMenuHeaderComponent;\n onClose?: () => void;\n onMenuLevelChange?: (level: number) => void;\n} & ContextMenuLevel;\n\n/** When provided, ContextMenu renders inside DialogAnchor and wires menu level for submenu alignment. */\ntype ContextMenuAnchorProps = Partial<\n Pick<\n DialogAnchorProps,\n | 'id'\n | 'dialogManagerId'\n | 'placement'\n | 'referenceElement'\n | 'tabIndex'\n | 'trapFocus'\n | 'allowFlip'\n | 'focus'\n >\n>;\n\nexport type ContextMenuProps = ContextMenuBaseProps & ContextMenuAnchorProps;\n\nfunction ContextMenuContent({\n backLabel = 'Back',\n children,\n className,\n Header,\n items,\n ItemsWrapper,\n menuClassName,\n onClose,\n onMenuLevelChange,\n ...props\n}: ContextMenuBaseProps) {\n const rootLevel = useMemo<ContextMenuLevel>(\n () => ({\n Header,\n items,\n ItemsWrapper,\n menuClassName,\n }),\n [Header, items, ItemsWrapper, menuClassName],\n );\n const [menuStack, setMenuStack] = useState<ContextMenuLevel[]>(() => [rootLevel]);\n const activeMenu = menuStack[menuStack.length - 1];\n\n const ActiveMenuItemsWrapper = activeMenu.ItemsWrapper ?? React.Fragment;\n\n const closeMenu = useCallback(() => {\n onClose?.();\n }, [onClose]);\n\n const openSubmenu = useCallback(\n ({\n Header,\n ItemsWrapper: SubmenuItemsWrapper,\n menuClassName,\n Submenu,\n }: ContextMenuOpenSubmenuParams) => {\n const nextLevel: ContextMenuLevel = {\n Header,\n ItemsWrapper: SubmenuItemsWrapper ?? ItemsWrapper,\n menuClassName,\n Submenu,\n };\n setMenuStack((current) => [...current, nextLevel]);\n },\n [ItemsWrapper],\n );\n\n const returnToParentMenu = useCallback(() => {\n setMenuStack((current) =>\n current.length > 1 ? current.slice(0, current.length - 1) : current,\n );\n }, []);\n\n useEffect(() => {\n setMenuStack((current) => {\n if (current.length === 1 && current[0] === rootLevel) return current;\n return [rootLevel];\n });\n }, [rootLevel]);\n\n useEffect(() => {\n onMenuLevelChange?.(menuStack.length);\n }, [menuStack.length, onMenuLevelChange]);\n\n return (\n <ContextMenuContext.Provider value={{ closeMenu, openSubmenu, returnToParentMenu }}>\n <ContextMenuRoot className={clsx(className, activeMenu.menuClassName)} {...props}>\n {activeMenu.Header ? (\n <activeMenu.Header />\n ) : menuStack.length > 1 ? (\n <ContextMenuHeader>\n <ContextMenuBackButton onClick={returnToParentMenu}>\n <IconChevronLeft />\n <span>{backLabel}</span>\n </ContextMenuBackButton>\n </ContextMenuHeader>\n ) : null}\n <ContextMenuBody>\n {activeMenu.Submenu ? (\n <activeMenu.Submenu />\n ) : (\n <ActiveMenuItemsWrapper>\n {typeof children !== 'undefined'\n ? children\n : activeMenu.items?.map((Item, index) => (\n <Item key={`context-menu-item-${index}`} />\n ))}\n </ActiveMenuItemsWrapper>\n )}\n </ContextMenuBody>\n </ContextMenuRoot>\n </ContextMenuContext.Provider>\n );\n}\n\nexport const ContextMenu = (props: ContextMenuProps) => {\n const {\n allowFlip,\n dialogManagerId,\n focus,\n id,\n placement,\n referenceElement,\n tabIndex,\n trapFocus,\n ...menuProps\n } = props;\n\n const isAnchored = id != null;\n\n const [menuLevel, setMenuLevel] = useState(1);\n const open = useDialogIsOpen(id ?? '', dialogManagerId);\n\n useEffect(() => {\n if (isAnchored && !open) setMenuLevel(1);\n }, [isAnchored, open]);\n\n const content = (\n <ContextMenuContent\n {...menuProps}\n onMenuLevelChange={isAnchored ? setMenuLevel : menuProps.onMenuLevelChange}\n />\n );\n\n if (isAnchored) {\n const {\n backLabel: _b,\n Header: _h,\n items: _i,\n ItemsWrapper: _w,\n menuClassName: _m,\n onClose: _c,\n onMenuLevelChange: _l,\n ...anchorDivProps\n } = menuProps;\n return (\n <DialogAnchor\n allowFlip={allowFlip}\n dialogManagerId={dialogManagerId}\n focus={focus}\n id={id}\n placement={placement}\n referenceElement={referenceElement}\n tabIndex={tabIndex}\n trapFocus={trapFocus}\n updateKey={menuLevel}\n {...anchorDivProps}\n >\n {content}\n </DialogAnchor>\n );\n }\n\n return content;\n};\n","import React, { type ComponentProps, type PropsWithChildren } from 'react';\nimport clsx from 'clsx';\nimport { Button, type ButtonProps } from '../../Button';\nimport { IconCrossMedium } from '../../Icons';\n\nconst PromptRoot = ({ children, className, ...props }: ComponentProps<'div'>) => (\n <div {...props} className={clsx('str-chat__prompt', className)}>\n {children}\n </div>\n);\n\nexport type PromptHeaderProps = {\n title: string;\n description?: string;\n className?: string;\n close?: () => void;\n};\n\nconst PromptHeader = ({ className, close, description, title }: PromptHeaderProps) => (\n <div className={clsx('str-chat__prompt__header', className)}>\n <div className='str-chat__prompt__header__title-group'>\n <div className='str-chat__prompt__header__title'>{title}</div>\n {description != null && description !== '' && (\n <div className='str-chat__prompt__header__description'>{description}</div>\n )}\n </div>\n {close && (\n <Button\n appearance='ghost'\n circular\n className='str-chat__prompt__header__close-button'\n onClick={close}\n size='sm'\n variant='secondary'\n >\n <IconCrossMedium />\n </Button>\n )}\n </div>\n);\n\nexport type PromptBodyProps = PropsWithChildren<{\n className?: string;\n}>;\n\nconst PromptBody = ({ children, className }: PromptBodyProps) => (\n <div className={clsx('str-chat__prompt__body', className)}>{children}</div>\n);\n\nexport type PromptFooterProps = PropsWithChildren<{\n className?: string;\n}>;\n\nconst PromptFooter = ({ children, className }: PromptFooterProps) => (\n <div className={clsx('str-chat__prompt__footer', className)}>{children}</div>\n);\n\ntype PromptFooterControlsProps = PropsWithChildren<{\n className?: string;\n}>;\n\nconst PromptFooterControls = ({ children, className }: PromptFooterControlsProps) => (\n <div className={clsx('str-chat__prompt__footer__controls', className)}>{children}</div>\n);\n\nconst PromptFooterControlsButtonSecondary = ({ className, ...props }: ButtonProps) => (\n <Button\n appearance='ghost'\n className={clsx('str-chat__prompt__footer__controls-button', className)}\n size='md'\n variant='secondary'\n {...props}\n />\n);\n\nconst PromptFooterControlsButtonPrimary = ({ className, ...props }: ButtonProps) => (\n <Button\n appearance='solid'\n className={clsx('str-chat__prompt__footer__controls-button', className)}\n size='md'\n variant='primary'\n {...props}\n />\n);\n\nexport const Prompt = {\n Body: PromptBody,\n Footer: PromptFooter,\n FooterControls: PromptFooterControls,\n FooterControlsButtonPrimary: PromptFooterControlsButtonPrimary,\n FooterControlsButtonSecondary: PromptFooterControlsButtonSecondary,\n Header: PromptHeader,\n Root: PromptRoot,\n};\n","import React, { type ComponentProps, type PropsWithChildren } from 'react';\nimport clsx from 'clsx';\nimport { Button, type ButtonProps } from '../../Button';\nimport { IconArrowLeft, IconCrossMedium } from '../../Icons';\n\nconst ViewerRoot = ({ children, className, ...props }: ComponentProps<'div'>) => (\n <div {...props} className={clsx('str-chat__viewer', className)}>\n {children}\n </div>\n);\n\nexport type ViewerHeaderProps = {\n title: string;\n description?: string;\n className?: string;\n close?: () => void;\n goBack?: () => void;\n};\n\nconst ViewerHeader = ({\n className,\n close,\n description,\n goBack,\n title,\n}: ViewerHeaderProps) => (\n <div className={clsx('str-chat__viewer__header', className)}>\n {goBack && (\n <Button\n appearance='ghost'\n circular\n className='str-chat__viewer__header__go-back-button'\n onClick={goBack}\n size='sm'\n variant='secondary'\n >\n <IconArrowLeft />\n </Button>\n )}\n <div className='str-chat__viewer__header__title-group'>\n <div className='str-chat__viewer__header__title'>{title}</div>\n {description != null && description !== '' && (\n <div className='str-chat__viewer__header__description'>{description}</div>\n )}\n </div>\n {close && (\n <Button\n appearance='ghost'\n circular\n className='str-chat__viewer__header__close-button'\n onClick={close}\n size='sm'\n variant='secondary'\n >\n <IconCrossMedium />\n </Button>\n )}\n </div>\n);\n\nexport type ViewerBodyProps = PropsWithChildren<{\n className?: string;\n}>;\n\nconst ViewerBody = ({ children, className }: ViewerBodyProps) => (\n <div className={clsx('str-chat__viewer__body', className)}>{children}</div>\n);\n\nexport type ViewerFooterProps = PropsWithChildren<{\n className?: string;\n}>;\n\nconst ViewerFooter = ({ children, className }: ViewerFooterProps) => (\n <div className={clsx('str-chat__viewer__footer', className)}>{children}</div>\n);\n\ntype ViewerFooterControlsProps = PropsWithChildren<{\n className?: string;\n}>;\n\nconst ViewerFooterControls = ({ children, className }: ViewerFooterControlsProps) => (\n <div className={clsx('str-chat__viewer__footer__controls', className)}>{children}</div>\n);\n\nconst ViewerFooterControlsButtonSecondary = ({ className, ...props }: ButtonProps) => (\n <Button\n appearance='ghost'\n className={clsx('str-chat__viewer__footer__controls-button', className)}\n size='md'\n variant='secondary'\n {...props}\n />\n);\n\nconst ViewerFooterControlsButtonPrimary = ({ className, ...props }: ButtonProps) => (\n <Button\n appearance='solid'\n className={clsx('str-chat__viewer__footer__controls-button', className)}\n size='md'\n variant='primary'\n {...props}\n />\n);\n\nexport const Viewer = {\n Body: ViewerBody,\n Footer: ViewerFooter,\n FooterControls: ViewerFooterControls,\n FooterControlsButtonPrimary: ViewerFooterControlsButtonPrimary,\n FooterControlsButtonSecondary: ViewerFooterControlsButtonSecondary,\n Header: ViewerHeader,\n Root: ViewerRoot,\n};\n","import clsx from 'clsx';\nimport React, {\n type ComponentProps,\n type ComponentType,\n type PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from 'react';\nimport { FocusScope } from '@react-aria/focus';\n\nimport {\n ModalContextProvider,\n modalDialogManagerId,\n useChatContext,\n} from '../../context';\nimport {\n DialogPortalEntry,\n modalDialogId,\n useModalDialog,\n useModalDialogIsOpen,\n} from '../Dialog';\n\nexport type ModalCloseEvent =\n | KeyboardEvent\n | React.KeyboardEvent\n | React.MouseEvent<HTMLButtonElement | HTMLDivElement>;\n\nexport type ModalCloseSource = 'overlay' | 'button' | 'escape';\n\nexport type ModalProps = {\n /** If true, modal is opened or visible. */\n open: boolean;\n /** Custom class to be applied to the modal root div */\n className?: string;\n /** If provided, the close button is rendered on overlay */\n CloseButtonOnOverlay?: ComponentType<ComponentProps<'button'>>;\n /** Callback handler for closing of modal. */\n onClose?: (event: ModalCloseEvent) => void;\n /** Optional handler to intercept closing logic. Return false to prevent onClose. */\n onCloseAttempt?: (source: ModalCloseSource, event: ModalCloseEvent) => boolean;\n};\n\nexport const GlobalModal = ({\n children,\n className,\n CloseButtonOnOverlay,\n onClose,\n onCloseAttempt,\n open,\n}: PropsWithChildren<ModalProps>) => {\n const dialog = useModalDialog();\n const isOpen = useModalDialogIsOpen();\n const overlayRef = useRef<HTMLDivElement | null>(null);\n const closeButtonRef = useRef<HTMLButtonElement | null>(null);\n const closingRef = useRef(false);\n const { theme } = useChatContext('GlobalModal');\n\n const maybeClose = useCallback(\n (source: ModalCloseSource, event: ModalCloseEvent) => {\n const allow = onCloseAttempt?.(source, event);\n if (allow !== false) {\n dialog.close();\n closingRef.current = true;\n onClose?.(event);\n }\n },\n [dialog, onClose, onCloseAttempt],\n );\n\n const modalContextValue = useMemo<{ close: () => void }>(\n () => ({\n close: () => maybeClose('button', {} as ModalCloseEvent),\n }),\n [maybeClose],\n );\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement | HTMLDivElement>) => {\n const target = event.target as HTMLButtonElement | HTMLDivElement;\n if (closeButtonRef.current?.contains(target)) {\n maybeClose('button', event);\n } else if (overlayRef.current === target) {\n maybeClose('overlay', event);\n }\n };\n\n useEffect(() => {\n if (!open || !isOpen) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') maybeClose('escape', event);\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, maybeClose, open]);\n\n // Sync open prop → dialog open. Don't close here (dialog ref changes after close → effect loop).\n // closingRef blocks re-open when we just closed and parent hasn't set open=false yet.\n useEffect(() => {\n if (!open) {\n closingRef.current = false;\n }\n if (open && !isOpen && !closingRef.current) {\n dialog.open();\n }\n }, [dialog, isOpen, open]);\n\n if (!open || !isOpen) return null;\n\n return (\n <DialogPortalEntry dialogId={modalDialogId} dialogManagerId={modalDialogManagerId}>\n <ModalContextProvider value={modalContextValue}>\n <div\n className={clsx(\n 'str-chat',\n theme,\n 'str-chat__modal str-chat-react__modal str-chat__modal--open',\n className,\n )}\n onClick={handleClick}\n ref={overlayRef}\n >\n <FocusScope autoFocus contain>\n {children}\n </FocusScope>\n {CloseButtonOnOverlay && (\n <CloseButtonOnOverlay onClick={handleClick} ref={closeButtonRef} />\n )}\n </div>\n </ModalContextProvider>\n </DialogPortalEntry>\n );\n};\n","import type { ComponentType, PropsWithChildren } from 'react';\nimport React from 'react';\nimport { GlobalModal, type ModalProps } from '../Modal';\nimport { MessageBounceProvider, useComponentContext } from '../../context';\nimport type { MessageBouncePromptProps } from './MessageBouncePrompt';\n\nexport type MessageBounceModalProps = PropsWithChildren<\n ModalProps & {\n MessageBouncePrompt: ComponentType<MessageBouncePromptProps>;\n }\n>;\n\nexport function MessageBounceModal({\n MessageBouncePrompt,\n ...modalProps\n}: MessageBounceModalProps) {\n const { Modal = GlobalModal } = useComponentContext();\n return (\n <Modal className='str-chat__message-bounce-modal' {...modalProps}>\n <MessageBounceProvider>\n <MessageBouncePrompt />\n </MessageBounceProvider>\n </Modal>\n );\n}\n","import type { MouseEventHandler } from 'react';\nimport React from 'react';\nimport {\n useMessageBounceContext,\n useModalContext,\n useTranslationContext,\n} from '../../context';\nimport { Button } from '../Button';\nimport { IconExclamationCircle } from '../Icons';\nimport { Alert } from '../Dialog';\nimport type { PropsWithChildrenOnly } from '../../types/types';\n\nexport type MessageBouncePromptProps = PropsWithChildrenOnly;\n\n// todo: shall we rename this to MessageBounceAlert?\nexport function MessageBouncePrompt({ children }: MessageBouncePromptProps) {\n const { handleDelete, handleEdit, handleRetry } = useMessageBounceContext();\n const { t } = useTranslationContext();\n const { close } = useModalContext();\n\n function createHandler(\n handle: MouseEventHandler<HTMLButtonElement>,\n ): MouseEventHandler<HTMLButtonElement> {\n return (e) => {\n handle(e);\n close();\n };\n }\n\n return (\n <Alert.Root\n className='str-chat__message-bounce-alert'\n data-testid='message-bounce-prompt'\n >\n <Alert.Header\n className='str-chat__message-bounce-alert-header'\n Icon={IconExclamationCircle}\n title={\n !children ? t('This message did not meet our content guidelines') : undefined\n }\n >\n {children}\n </Alert.Header>\n <Alert.Actions className={'str-chat__message-bounce-actions'}>\n <Button\n appearance='outline'\n className='str-chat__message-bounce-delete'\n data-testid='message-bounce-delete'\n onClick={createHandler(handleDelete)}\n size='md'\n variant='danger'\n >\n {t('Delete')}\n </Button>\n <Button\n appearance='outline'\n className='str-chat__message-bounce-edit'\n data-testid='message-bounce-edit'\n onClick={createHandler(handleEdit)}\n size='md'\n variant='secondary'\n >\n {t('Edit Message')}\n </Button>\n <Button\n appearance='outline'\n className='str-chat__message-bounce-send'\n data-testid='message-bounce-send'\n onClick={createHandler(handleRetry)}\n size='md'\n variant='secondary'\n >\n {t('Send Anyway')}\n </Button>\n </Alert.Actions>\n </Alert.Root>\n );\n}\n","import React, { type ComponentProps } from 'react';\nimport clsx from 'clsx';\n\nexport const MessageBubble = ({ className, ...props }: ComponentProps<'div'>) => (\n <div {...props} className={clsx('str-chat__message-bubble', className)} />\n);\n","import React from 'react';\n\nimport { IconCircleBanSign } from '../Icons';\nimport { useTranslationContext } from '../../context/TranslationContext';\n\nimport type { LocalMessage } from 'stream-chat';\nimport { MessageBubble } from './MessageBubble';\n\nexport type MessageDeletedProps = {\n message: LocalMessage;\n};\n\nexport const MessageDeletedBubble = () => {\n const { t } = useTranslationContext();\n\n return (\n <MessageBubble data-testid={'message-deleted-bubble'}>\n <div className='str-chat__message-text'>\n <IconCircleBanSign />\n <span>{t('Message deleted')}</span>\n </div>\n </MessageBubble>\n );\n};\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport { useUserRole } from './hooks/useUserRole';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { useMessageContext } from '../../context';\n\nexport const MessageBlocked = () => {\n const { message } = useMessageContext();\n const { t } = useTranslationContext('MessageBlocked');\n\n const { isMyMessage } = useUserRole(message);\n\n const messageClasses = clsx(\n 'str-chat__message str-chat__message--blocked',\n message.type,\n {\n 'str-chat__message--me': isMyMessage,\n 'str-chat__message--other': !isMyMessage,\n },\n );\n\n return (\n <div\n className={messageClasses}\n data-testid='message-blocked-component'\n key={message.id}\n >\n <div className='str-chat__message--blocked-inner'>\n {t('Message was blocked by moderation policies')}\n </div>\n </div>\n );\n};\n","import { useMemo } from 'react';\n\nimport { useChannelStateContext, useMessageContext } from '../../../context';\nimport { useUserRole } from '../../Message/hooks';\nimport {\n ACTIONS_NOT_WORKING_IN_THREAD,\n isMessageBounced,\n isMessageErrorRetryable,\n isNetworkSendFailure,\n} from '../../Message/utils';\n\nimport type { MessageActionSetItem } from '../MessageActions';\n\n/**\n * Base filter hook which covers actions of type `delete`, `edit`,\n * `flag`, `markUnread`, `mute`, `quote`, `react` and `reply`, whether\n * the rendered message is a reply (replies are limited to certain actions) and\n * whether the message has appropriate type and status.\n */\nexport const useBaseMessageActionSetFilter = (\n messageActionSet: MessageActionSetItem[],\n disable = false,\n) => {\n const { initialMessage: isInitialMessage, message } = useMessageContext();\n const { channelConfig } = useChannelStateContext();\n const {\n canBlockUser,\n canDelete,\n canEdit,\n canFlag,\n canMarkUnread,\n canMute,\n canQuote,\n canReact,\n canReply,\n canSendMessage,\n } = useUserRole(message);\n const isMessageThreadReply = typeof message.parent_id === 'string';\n const isBounced = isMessageBounced(message);\n const allowRetry = isMessageErrorRetryable(message);\n const hasNetworkSendFailure = isNetworkSendFailure(message);\n\n return useMemo(() => {\n if (disable) return messageActionSet;\n\n // filter out all actions if any of these are true\n if (\n isBounced ||\n isInitialMessage || // not sure whether this thing even works anymore\n !message.type ||\n message.type === 'system' ||\n message.type === 'ephemeral' ||\n message.status === 'sending'\n )\n return [];\n\n return messageActionSet.filter(({ type }: MessageActionSetItem) => {\n // filter out actions with types that do not work in thread\n if (ACTIONS_NOT_WORKING_IN_THREAD.includes(type) && isMessageThreadReply)\n return false;\n\n // failed message menu has special treatment\n if (message.error) {\n return (\n (type === 'resendMessage' && canSendMessage && (allowRetry || isBounced)) ||\n (type === 'edit' && ((isBounced && canEdit) || hasNetworkSendFailure)) ||\n (type === 'delete' && ((isBounced && canDelete) || hasNetworkSendFailure))\n );\n }\n\n if (\n type === 'resendMessage' ||\n (type === 'blockUser' && !canBlockUser) ||\n (type === 'copyMessageText' && !message.text) ||\n (type === 'delete' && !canDelete) ||\n (type === 'edit' && !canEdit) ||\n (type === 'flag' && !canFlag) ||\n (type === 'markUnread' && !canMarkUnread) ||\n (type === 'mute' && !canMute) ||\n (type === 'quote' && !canQuote) ||\n (type === 'react' && !canReact) ||\n (type === 'reply' && !canReply) ||\n (type === 'remindMe' && !channelConfig?.['user_message_reminders']) ||\n (type === 'saveForLater' && !channelConfig?.['user_message_reminders'])\n )\n return false;\n\n return true;\n });\n }, [\n allowRetry,\n canBlockUser,\n canDelete,\n canEdit,\n canFlag,\n canMarkUnread,\n canMute,\n canQuote,\n canReact,\n canReply,\n canSendMessage,\n channelConfig,\n isBounced,\n isInitialMessage,\n isMessageThreadReply,\n message.error,\n message.status,\n message.text,\n message.type,\n disable,\n hasNetworkSendFailure,\n messageActionSet,\n ]);\n};\n","import React, { useEffect, useRef } from 'react';\n\nimport { IconArrowRightUp } from '../Icons';\nimport { addNotificationTargetTag, useNotificationTarget } from '../Notifications';\nimport {\n useChannelActionContext,\n useChannelStateContext,\n useChatContext,\n useMessageContext,\n useTranslationContext,\n} from '../../context';\nimport { formatMessage, type LocalMessage } from 'stream-chat';\n\n/**\n * Indicator shown when the message was also sent to the main channel (show_in_channel === true).\n */\nexport const MessageAlsoSentInChannelIndicator = () => {\n const { client } = useChatContext();\n const { t } = useTranslationContext();\n const { channel } = useChannelStateContext();\n const { jumpToMessage, openThread } = useChannelActionContext();\n const { message, threadList } = useMessageContext('MessageAlsoSentInChannelIndicator');\n const panel = useNotificationTarget();\n const targetMessageRef = useRef<LocalMessage | null | undefined>(undefined);\n\n const queryParent = () =>\n channel\n .getClient()\n .search({ cid: channel.cid }, { id: message.parent_id })\n .then(({ results }) => {\n if (!results.length) {\n throw new Error('Thread has not been found');\n }\n targetMessageRef.current = formatMessage(results[0].message);\n })\n .catch((error: Error) => {\n client.notifications.addError({\n message: t('Thread has not been found'),\n options: {\n originalError: error,\n tags: addNotificationTargetTag(panel),\n type: 'api:reply:search:failed',\n },\n origin: {\n context: { threadReply: message },\n emitter: 'MessageIsThreadReplyInChannelButtonIndicator',\n },\n });\n });\n\n // todo: it is not possible to jump to a message in thread\n const jumpToReplyInChannelMessages = async (id: string) => {\n await jumpToMessage(id);\n // todo: we do not have API to control, whether thread of channel message list is show - on mobile devices important\n };\n\n useEffect(() => {\n if (\n targetMessageRef.current ||\n targetMessageRef.current === null ||\n !message.parent_id\n )\n return;\n const localMessage = channel.state.findMessage(message.parent_id);\n if (localMessage) {\n targetMessageRef.current = localMessage;\n return;\n }\n }, [channel, message]);\n\n const handleClickViewReference = async () => {\n if (!targetMessageRef.current) {\n // search query is performed here in order to prevent multiple search queries in useEffect\n // due to the message list 3x remounting its items\n if (threadList) {\n await jumpToReplyInChannelMessages(message.id); // we are in thread, and we want to jump to this reply in the main message list\n return;\n } else await queryParent(); // we are in the main list and need to query the thread\n }\n const target = targetMessageRef.current;\n if (!target) {\n // prevent further search queries if the message is not found in the DB\n targetMessageRef.current = null;\n return;\n }\n\n if (threadList) await jumpToReplyInChannelMessages(message.id);\n else openThread(target);\n };\n\n if (!message?.show_in_channel) return null;\n\n return (\n <div className='str-chat__message-also-sent-in-channel' role='status'>\n <IconArrowRightUp />\n <span>{threadList ? t('Also sent in channel') : t('Replied to a thread')}</span>\n <span> · </span>\n <button\n className='str-chat__message-also-sent-in-channel__link-button'\n onClick={handleClickViewReference}\n type='button'\n >\n {t('View')}\n </button>\n </div>\n );\n};\n","import type { MouseEventHandler } from 'react';\nimport type { UserResponse } from 'stream-chat';\nimport React, { useMemo } from 'react';\n\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { useChannelStateContext, useComponentContext } from '../../context';\nimport { AvatarStack as DefaultAvatarStack } from '../Avatar';\n\nexport type MessageRepliesCountButtonProps = {\n /* If supplied, adds custom text to the end of a multiple replies message */\n labelPlural?: string;\n /* If supplied, adds custom text to the end of a single reply message */\n labelSingle?: string;\n /* Function to navigate into an existing thread on a message */\n onClick?: MouseEventHandler;\n /* The amount of replies (i.e., threaded messages) on a message */\n reply_count?: number;\n thread_participants?: UserResponse[];\n};\n\nfunction UnMemoizedMessageRepliesCountButton(props: MessageRepliesCountButtonProps) {\n const { AvatarStack = DefaultAvatarStack } = useComponentContext(\n MessageRepliesCountButton.name,\n );\n const {\n labelPlural,\n labelSingle,\n onClick,\n reply_count: replyCount = 0,\n thread_participants: threadParticipants = [],\n } = props;\n const { channelCapabilities } = useChannelStateContext();\n\n const { t } = useTranslationContext('MessageRepliesCountButton');\n\n const avatarStackDisplayInfo = useMemo(\n () =>\n threadParticipants.slice(0, 3).map((participant) => ({\n imageUrl: participant.image,\n userName: participant.name || participant.id,\n })),\n [threadParticipants],\n );\n\n if (!replyCount) return null;\n\n let replyCountText = t('replyCount', { count: replyCount });\n\n if (labelPlural && replyCount > 1) {\n replyCountText = `${replyCount} ${labelPlural}`;\n } else if (labelSingle) {\n replyCountText = `1 ${labelSingle}`;\n }\n\n return (\n <div className='str-chat__message-replies-count-button-wrapper'>\n <button\n className='str-chat__message-replies-count-button'\n data-testid='replies-count-button'\n disabled={!channelCapabilities['send-reply']}\n onClick={onClick}\n >\n {replyCountText}\n\n <AvatarStack displayInfo={avatarStackDisplayInfo} size='xs' />\n </button>\n </div>\n );\n}\n\nexport const MessageRepliesCountButton = React.memo(\n UnMemoizedMessageRepliesCountButton,\n) as typeof UnMemoizedMessageRepliesCountButton;\n","import React from 'react';\n\nimport { IconPin } from '../Icons';\nimport { useChatContext, useTranslationContext } from '../../context';\nimport type { LocalMessage } from 'stream-chat';\n\nexport type PinIndicatorProps = {\n message?: LocalMessage;\n};\n\n/**\n * Default pinned message indicator. Renders \"Pinned by [name]\" with pin icon above the message bubble.\n * Name is taken from message.pinned_by (who pinned).\n */\nexport const PinIndicator = ({ message }: PinIndicatorProps) => {\n const { t } = useTranslationContext();\n const { client } = useChatContext();\n\n if (!message) return null;\n\n const isOwnPin = !!message.pinned_by?.id && message.pinned_by.id === client.user?.id;\n const name = message.pinned_by?.name ?? message.pinned_by?.id ?? '';\n\n const label = isOwnPin\n ? t('Pinned by You')\n : name\n ? t('Pinned by {{ name }}', { name })\n : t('Message pinned');\n\n return (\n <div className='str-chat__message-pin-indicator'>\n <div className='str-chat__message-pin-indicator__content'>\n <span aria-hidden className='str-chat__message-pin-indicator__icon'>\n <IconPin />\n </span>\n <span>{label}</span>\n </div>\n </div>\n );\n};\n","import type { ComponentProps } from 'react';\nimport React, { useEffect, useState } from 'react';\nimport type { PopperLikePlacement } from '../Dialog';\nimport { usePopoverPosition } from '../Dialog/hooks/usePopoverPosition';\n\nexport const Tooltip = ({ children, ...rest }: ComponentProps<'div'>) => (\n <div className='str-chat__tooltip' {...rest}>\n {children}\n </div>\n);\n\nexport type PopperTooltipProps<T extends HTMLElement> = React.PropsWithChildren<{\n /** Reference element to which the tooltip should attach to */\n referenceElement: T | null;\n /** Popper's modifier (offset) property - [xAxis offset, yAxis offset], default [0, 10] */\n offset?: [number, number];\n /** Popper's placement property defining default position of the tooltip, default 'top' */\n placement?: PopperLikePlacement;\n /** Tells component whether to render its contents */\n visible?: boolean;\n}>;\n\nexport const PopperTooltip = <T extends HTMLElement>({\n children,\n offset = [0, 10],\n placement = 'top',\n referenceElement,\n visible = false,\n}: PopperTooltipProps<T>) => {\n const [popperElement, setPopperElement] = useState<HTMLDivElement | null>(null);\n const {\n placement: resolvedPlacement,\n refs,\n strategy,\n x,\n y,\n } = usePopoverPosition({\n offset,\n placement,\n });\n\n useEffect(() => {\n refs.setReference(referenceElement);\n }, [referenceElement, refs]);\n\n useEffect(() => {\n refs.setFloating(popperElement);\n }, [popperElement, refs]);\n\n if (!visible) return null;\n\n return (\n <div\n className='str-chat__tooltip'\n data-placement={resolvedPlacement}\n ref={setPopperElement}\n style={{ left: x ?? 0, position: strategy, top: y ?? 0 }}\n >\n {children}\n </div>\n );\n};\n","import type React from 'react';\nimport { useCallback, useState } from 'react';\n\nexport const useEnterLeaveHandlers = <T extends HTMLElement>({\n onMouseEnter,\n onMouseLeave,\n}: Partial<Record<'onMouseEnter' | 'onMouseLeave', React.MouseEventHandler<T>>> = {}) => {\n const [tooltipVisible, setTooltipVisible] = useState(false);\n\n const handleEnter: React.MouseEventHandler<T> = useCallback(\n (e) => {\n setTooltipVisible(true);\n onMouseEnter?.(e);\n },\n [onMouseEnter],\n );\n\n const handleLeave: React.MouseEventHandler<T> = useCallback(\n (e) => {\n setTooltipVisible(false);\n onMouseLeave?.(e);\n },\n [onMouseLeave],\n );\n\n return { handleEnter, handleLeave, tooltipVisible };\n};\n","import React, { useState } from 'react';\nimport clsx from 'clsx';\nimport type { TooltipUsernameMapper } from './utils';\nimport { getReadByTooltipText, mapToUserNameOrId } from './utils';\nimport { PopperTooltip } from '../Tooltip';\nimport { useEnterLeaveHandlers } from '../Tooltip/hooks';\n\nimport { useChatContext } from '../../context/ChatContext';\nimport { useMessageContext } from '../../context/MessageContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { IconCheckmark1Small, IconClock, IconDoubleCheckmark1Small } from '../Icons';\n\nexport type MessageStatusProps = {\n /* Custom component to render when message is considered delivered, not read. The default UI renders MessageDeliveredIcon and a tooltip with string 'Delivered'. */\n MessageDeliveredStatus?: React.ComponentType;\n /* Custom component to render when message is considered delivered and read. The default UI renders the last reader's Avatar and a tooltip with string readers' names. */\n MessageReadStatus?: React.ComponentType;\n /* Custom component to render when message is considered as being the in the process of delivery. The default UI renders a clock icon and a tooltip with string 'Sending...'. */\n MessageSendingStatus?: React.ComponentType;\n /* Custom component to render when message is considered created on the server, but not delivered. The default UI renders MessageSentIcon and a tooltip with string 'Sent'. */\n MessageSentStatus?: React.ComponentType;\n /* Message type string to be added to CSS class names. */\n messageType?: string;\n /* Allows to customize the username(s) that appear on the message status tooltip */\n tooltipUserNameMapper?: TooltipUsernameMapper;\n};\n\nconst UnMemoizedMessageStatus = (props: MessageStatusProps) => {\n const {\n MessageDeliveredStatus,\n MessageReadStatus,\n MessageSendingStatus,\n MessageSentStatus,\n messageType = 'simple',\n tooltipUserNameMapper = mapToUserNameOrId,\n } = props;\n\n const { handleEnter, handleLeave, tooltipVisible } =\n useEnterLeaveHandlers<HTMLSpanElement>();\n\n const { client } = useChatContext('MessageStatus');\n const {\n deliveredTo,\n isMyMessage,\n lastOwnMessage,\n message,\n readBy,\n returnAllReadData,\n threadList,\n } = useMessageContext('MessageStatus');\n const { t } = useTranslationContext('MessageStatus');\n const [referenceElement, setReferenceElement] = useState<HTMLSpanElement | null>(null);\n\n if (!isMyMessage() || message.type === 'error') return null;\n\n const justReadByMe = readBy?.length === 1 && readBy[0].id === client.user?.id;\n const deliveredOnlyToMe =\n deliveredTo?.length === 1 && deliveredTo[0].id === client.user?.id;\n const sending = message.status === 'sending';\n const read = !!(readBy?.length && !justReadByMe && !threadList);\n const delivered = !!(deliveredTo?.length && !deliveredOnlyToMe && !read && !threadList);\n const sent =\n (returnAllReadData || lastOwnMessage?.id === message.id) &&\n message.status === 'received' &&\n !delivered &&\n !read &&\n !threadList;\n\n const readersWithoutOwnUser = read\n ? readBy.filter((item) => item.id !== client.user?.id)\n : [];\n\n return (\n <span\n className={clsx(\n `str-chat__message-${messageType}-status str-chat__message-status`,\n {\n 'str-chat__message-status-delivered': delivered,\n 'str-chat__message-status-read-by': read,\n 'str-chat__message-status-sending': sending,\n 'str-chat__message-status-sent': sent,\n },\n )}\n data-testid={clsx({\n 'message-status-delivered': delivered,\n 'message-status-read-by': read,\n 'message-status-sending': sending,\n 'message-status-sent': sent,\n })}\n onMouseEnter={handleEnter}\n onMouseLeave={handleLeave}\n ref={setReferenceElement}\n >\n {sending &&\n (MessageSendingStatus ? (\n <MessageSendingStatus />\n ) : (\n <>\n <PopperTooltip\n offset={[0, 5]}\n referenceElement={referenceElement}\n visible={tooltipVisible}\n >\n {t('Sending...')}\n </PopperTooltip>\n <IconClock className='str-chat__message-status-sending' />\n </>\n ))}\n\n {sent &&\n (MessageSentStatus ? (\n <MessageSentStatus />\n ) : (\n <>\n <PopperTooltip\n offset={[0, 5]}\n referenceElement={referenceElement}\n visible={tooltipVisible}\n >\n {t('Sent')}\n </PopperTooltip>\n <IconCheckmark1Small className='str-chat__message-status-sent' />\n </>\n ))}\n\n {delivered &&\n (MessageDeliveredStatus ? (\n <MessageDeliveredStatus />\n ) : (\n <>\n <PopperTooltip\n offset={[0, 5]}\n referenceElement={referenceElement}\n visible={tooltipVisible}\n >\n {t('Delivered')}\n </PopperTooltip>\n <IconDoubleCheckmark1Small className='str-chat__message-status-delivered' />\n </>\n ))}\n\n {read &&\n (MessageReadStatus ? (\n <MessageReadStatus />\n ) : (\n <>\n <PopperTooltip\n offset={[0, 5]}\n referenceElement={referenceElement}\n visible={tooltipVisible}\n >\n {getReadByTooltipText(readBy, t, client, tooltipUserNameMapper)}\n </PopperTooltip>\n\n <IconDoubleCheckmark1Small className='str-chat__message-status-read' />\n\n {readersWithoutOwnUser.length > 1 && (\n <span\n className={`str-chat__message-${messageType}-status-number`}\n data-testid='message-status-read-by-many'\n >\n {readersWithoutOwnUser.length}\n </span>\n )}\n </>\n ))}\n </span>\n );\n};\n\nexport const MessageStatus = React.memo(\n UnMemoizedMessageStatus,\n) as typeof UnMemoizedMessageStatus;\n","export function escapeRegExp(text: string) {\n return text.replace(/[-[\\]{}()*+?.,/\\\\^$|#]/g, '\\\\$&');\n}\n\nexport const detectHttp = /(http(s?):\\/\\/)?(www\\.)?/;\n\nexport const messageCodeBlocks = (message: string) => {\n const codeRegex = /```[a-z]*\\n[\\s\\S]*?\\n```|`[a-z]*[\\s\\S]*?`/gm;\n const matches = message.match(codeRegex);\n return matches || [];\n};\n\nexport const matchMarkdownLinks = (message: string) => {\n const regexMdLinks = /\\[([^[]+)\\](\\(.*\\))/gm;\n const matches = message.match(regexMdLinks);\n const singleMatch = /\\[([^[]+)\\]\\((.*)\\)/;\n\n const links = matches\n ? matches.map((match) => {\n const i = singleMatch.exec(match);\n return i && [i[1], i[2]];\n })\n : [];\n\n return links.flat();\n};\n","import type { ReplaceFunction } from 'hast-util-find-and-replace';\nimport { findAndReplace } from 'hast-util-find-and-replace';\nimport { u } from 'unist-builder';\nimport emojiRegex from 'emoji-regex';\n\nimport type { Nodes } from 'hast-util-find-and-replace/lib';\n\nexport const emojiMarkdownPlugin = () => {\n const replace: ReplaceFunction = (match) =>\n u('element', { properties: {}, tagName: 'emoji' }, [u('text', match)]);\n\n const transform = (node: Nodes) => findAndReplace(node, [emojiRegex(), replace]);\n\n return transform;\n};\n","import { escapeRegExp } from '../regex';\nimport type { ReplaceFunction } from 'hast-util-find-and-replace';\nimport { findAndReplace } from 'hast-util-find-and-replace';\nimport { u } from 'unist-builder';\nimport { visit } from 'unist-util-visit';\n\nimport type { Nodes } from 'hast-util-find-and-replace/lib';\nimport type { Element } from 'hast';\nimport type { UserResponse } from 'stream-chat';\n\nexport const mentionsMarkdownPlugin = (mentioned_users: UserResponse[]) => () => {\n const mentioned_usernames = mentioned_users\n .map((user) => user.name || user.id)\n .filter(Boolean)\n .map(escapeRegExp);\n\n const mentionedUsersRegex = new RegExp(\n mentioned_usernames.map((username) => `@${username}`).join('|'),\n 'g',\n );\n\n const replace: ReplaceFunction = (match) => {\n const usernameOrId = match.replace('@', '');\n const user = mentioned_users.find(\n ({ id, name }) => name === usernameOrId || id === usernameOrId,\n );\n return u('element', { mentionedUser: user, properties: {}, tagName: 'mention' }, [\n u('text', match),\n ]);\n };\n\n const transform = (tree: Nodes) => {\n if (!mentioned_usernames.length) return;\n\n // handles special cases of mentions where user.name is an e-mail\n // Remark GFM translates all e-mail-like text nodes to links creating\n // two separate child nodes \"@\" and \"your.name@as.email\" instead of\n // keeping it as one text node with value \"@your.name@as.email\"\n // this piece finds these two separated nodes and merges them together\n // before \"replace\" function takes over\n visit(tree, (node, index, parent) => {\n if (typeof index === 'undefined') return;\n if (!parent) return;\n\n const nextChild = parent.children.at(index + 1) as Element;\n const nextChildHref = nextChild?.properties?.href as string | undefined;\n\n if (\n node.type === 'text' &&\n // text value has to have @ sign at the end of the string\n // and no other characters except whitespace can precede it\n // valid cases: \"text @\", \"@\", \" @\"\n // invalid cases: \"text@\", \"@text\",\n /.?\\s?@$|^@$/.test(node.value) &&\n nextChildHref?.startsWith('mailto:')\n ) {\n const newTextValue = node.value.replace(/@$/, '');\n const username = nextChildHref.replace('mailto:', '');\n parent.children[index] = u('text', newTextValue);\n parent.children[index + 1] = u('text', `@${username}`);\n }\n });\n\n findAndReplace(tree, [mentionedUsersRegex, replace]);\n };\n\n return transform;\n};\n","import type { Visitor } from 'unist-util-visit';\nimport { visit } from 'unist-util-visit';\n\nimport type { Nodes } from 'hast-util-find-and-replace/lib';\n\nconst visitor: Visitor = (node) => {\n if (node.type !== 'html') return;\n\n node.type = 'text';\n};\nconst transform = (tree: Nodes) => {\n visit(tree, visitor);\n};\n\nexport const htmlToTextPlugin = () => transform;\n","import { SKIP, visit, type VisitorResult } from 'unist-util-visit';\nimport type { Image, Link, Parent, Text } from 'mdast';\nimport type { Node } from 'unist';\n\ntype ImgVisitor = (\n node: Image,\n index: number | null,\n parent: Parent | null,\n) => VisitorResult;\n\nexport type ImageToLinkPluginOptions = {\n getTextLabelFrom?: 'alt' | 'title' | 'url';\n};\n\nconst text = (value: string): Text => ({ type: 'text', value });\n\n/**\n * Converts image Markdown links ()\n * to HTML <a href={url}>{url | title | alt}</a>\n *\n * By default, the anchor text content is the image url so that image preview can be generated / enriched on the server.\n * @param getTextLabelFrom\n */\nexport function imageToLink({ getTextLabelFrom = 'url' }: ImageToLinkPluginOptions = {}) {\n return (tree: Node) => {\n const visitor: ImgVisitor = (node, index, parent) => {\n if (parent == null || index == null) return;\n\n const label = node[getTextLabelFrom] ?? node.url; // node.alt || node.title || node.url;\n const link: Link = {\n children: [text(label)],\n title: node.title ?? node.alt ?? node.url,\n type: 'link',\n url: node.url,\n };\n\n parent.children.splice(index, 1, link);\n return [SKIP, index + 1] as const;\n };\n\n visit(tree, 'image', visitor);\n };\n}\n","import type { Plugin } from 'unified';\nimport { visit } from 'unist-util-visit';\nimport type { Node, Parent as UnistParent } from 'unist';\nimport type { Root, RootContent, ThematicBreak } from 'mdast';\n\n/** Type guard: does the node have mdast children? */\nfunction isParentWithChildren(\n node: Node,\n): node is UnistParent & { children: RootContent[] } {\n const maybe = node as unknown as { children?: unknown };\n return Array.isArray(maybe.children);\n}\n\n/** Build a single <br> by mapping a standard mdast node via data.hName */\nfunction brNode(): ThematicBreak {\n return { data: { hName: 'br' }, type: 'thematicBreak' };\n}\n\n/**\n * Inserts runs of <br> between sibling block nodes to preserve the exact\n * number of *blank source lines* between them. No paragraph wrappers are added.\n *\n * Works because `mdast-util-to-hast` respects `data.hName`, turning our\n * `thematicBreak` into `<br>`. Multiple blank lines -> multiple `<br>` siblings.\n */\nexport const keepLineBreaksPlugin: Plugin<[], Root> = () => (tree) => {\n visit(\n tree as unknown as UnistParent, // visit needs a Unist parent-like root\n isParentWithChildren, // limit to parents with children\n (parent) => {\n const children = parent.children as RootContent[];\n if (children.length < 2) return;\n\n const out: RootContent[] = [];\n\n for (let i = 0; i < children.length; i++) {\n const curr = children[i];\n out.push(curr);\n\n if (i === children.length - 1) break;\n\n const next = children[i + 1];\n\n const currEndLine =\n curr.position && curr.position.end ? curr.position.end.line : undefined;\n const nextStartLine =\n next.position && next.position.start ? next.position.start.line : undefined;\n\n if (typeof currEndLine !== 'number' || typeof nextStartLine !== 'number') {\n continue;\n }\n\n // Markdown already separates blocks by at least one visual gap.\n // We add back only the *extra* blank lines from the source.\n const extraBlankLines = Math.max(0, nextStartLine - currEndLine - 1);\n if (extraBlankLines > 0) {\n for (let k = 0; k < extraBlankLines; k++) {\n out.push(brNode());\n }\n }\n }\n\n parent.children = out;\n },\n );\n};\n","// remark-plusplus-ins.ts\nimport type { Plugin } from 'unified';\nimport { SKIP, visit } from 'unist-util-visit';\nimport type { Visitor } from 'unist-util-visit';\nimport type { Parent, PhrasingContent, Text } from 'mdast';\n\n/**\n * \\S → first char must be non-whitespace\n * (?:...)?→ optional middle+closing when length > 1\n * [\\s\\S]*?→ anything (including newlines), lazy\n * final \\S→ last char non-whitespace (only required when there’s more than 1)\n *\n * Matches:\n * ++a++\n * Does not match:\n * ++++\n * ++ ++\n */\nconst INS_REGEX = /\\+\\+(\\S(?:[\\s\\S]*?\\S)?)\\+\\+/g;\nconst IGNORE_NODE_TYPES = new Set([\n 'code',\n 'inlineCode',\n 'link',\n 'linkReference',\n 'definition',\n 'math',\n 'inlineMath',\n]);\n\n/**\n * Converts MD \"++Some text++\" to inserted text element rendered in HTML as <ins>Some text</ins>\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/ins\n */\nexport const plusPlusToEmphasis: Plugin<[]> = () => {\n const visitor: Visitor = (node, index, parent) => {\n // 1) Don’t traverse inside ignored nodes\n if (IGNORE_NODE_TYPES.has(node.type)) return SKIP;\n\n // 2) Only transform text nodes with a valid parent + index\n if (node.type !== 'text' || parent == null || typeof index !== 'number') return;\n\n const value = (node as Text).value;\n\n // Reset lastIndex to 0 per node so each node is scanned from the beginning\n INS_REGEX.lastIndex = 0;\n\n let match: RegExpExecArray | null;\n let last = 0;\n const out: PhrasingContent[] = [];\n\n while ((match = INS_REGEX.exec(value))) {\n const [full, inner] = match;\n const start = match.index;\n\n if (start > last) out.push({ type: 'text', value: value.slice(last, start) });\n\n // Render as <ins>…</ins> (remark-rehype respects data.hName)\n out.push({\n children: [{ type: 'text', value: inner }],\n data: { hName: 'ins' },\n type: 'emphasis',\n });\n\n last = start + full.length;\n }\n\n if (out.length === 0) return; // nothing to change\n if (last < value.length) out.push({ type: 'text', value: value.slice(last) });\n\n (parent as Parent).children.splice(index, 1, ...out);\n\n // Skip re-visiting the replaced range; continue after inserted nodes\n return [SKIP, index + out.length];\n };\n\n return (tree) => visit(tree, visitor);\n};\n","import type { Plugin } from 'unified';\nimport type { Paragraph, Root, Text } from 'mdast';\n\n/**\n * Replace the parsed Markdown tree with a single paragraph containing the\n * original source as a plain text node. No Markdown formatting is interpreted.\n * React will escape it.\n */\nexport const remarkIgnoreMarkdown: Plugin<[], Root> = () => (tree, file) => {\n const source = String(file.value ?? '');\n\n const text: Text = { type: 'text', value: source };\n const paragraph: Paragraph = { children: [text], type: 'paragraph' };\n\n tree.children = [paragraph];\n};\n","import clsx from 'clsx';\nimport type { ComponentProps } from 'react';\nimport React from 'react';\n\nexport const Anchor = ({ children, href }: ComponentProps<'a'>) => {\n const isEmail = href?.startsWith('mailto:');\n const isUrl = href?.startsWith('http');\n\n if (!href || (!isEmail && !isUrl)) return <>{children}</>;\n\n return (\n <a\n className={clsx({ 'str-chat__message-url-link': isUrl })}\n href={href}\n rel='nofollow noreferrer noopener'\n target='_blank'\n >\n {children}\n </a>\n );\n};\n","import React from 'react';\nimport type { PropsWithChildrenOnly } from '../../../../types/types';\n\nexport const Emoji = ({ children }: PropsWithChildrenOnly) => (\n <span className='inline-text-emoji' data-testid='inline-text-emoji'>\n {children}\n </span>\n);\n","import type { PropsWithChildren } from 'react';\nimport React from 'react';\n\nimport type { UserResponse } from 'stream-chat';\n\nexport type MentionProps = PropsWithChildren<{\n node: {\n mentionedUser: UserResponse;\n };\n}>;\n\nexport const Mention = ({ children, node: { mentionedUser } }: MentionProps) => (\n <span className='str-chat__message-mention' data-user-id={mentionedUser.id}>\n {children}\n </span>\n);\n","export const NullComponent = () => null;\n","import { Component } from 'react';\nimport type { PropsWithChildren, ReactNode } from 'react';\n\ntype ErrorBoundaryProps = PropsWithChildren<{ fallback?: ReactNode }>;\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, { hasError: boolean }> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError() {\n return { hasError: true };\n }\n\n componentDidCatch(error: unknown, information: unknown) {\n console.error(error, information);\n }\n\n render() {\n if (this.state.hasError) {\n return this.props.fallback;\n }\n\n return this.props.children;\n }\n}\n","import React from 'react';\nimport ReactMarkdown, { defaultUrlTransform } from 'react-markdown';\nimport { find } from 'linkifyjs';\nimport remarkGfm from 'remark-gfm';\nimport type { ComponentType, JSX } from 'react';\nimport type { Options } from 'react-markdown/lib';\nimport type { UserResponse } from 'stream-chat';\nimport type { PluggableList } from 'unified'; // A sub-dependency of react-markdown. The type is not declared or re-exported from anywhere else\n\nimport { Anchor, Emoji, Mention } from './componentRenderers';\nimport { detectHttp, matchMarkdownLinks, messageCodeBlocks } from './regex';\nimport { emojiMarkdownPlugin, mentionsMarkdownPlugin } from './rehypePlugins';\nimport {\n htmlToTextPlugin,\n imageToLink,\n keepLineBreaksPlugin,\n plusPlusToEmphasis,\n} from './remarkPlugins';\nimport { ErrorBoundary } from '../../UtilityComponents';\nimport type { MentionProps } from './componentRenderers';\n\nexport type RenderTextPluginConfigurator = (\n defaultPlugins: PluggableList,\n) => PluggableList;\n\ntype IntrinsicElementTagName = keyof JSX.IntrinsicElements & string;\n\nexport const defaultAllowedTagNames: Array<\n IntrinsicElementTagName | 'emoji' | 'mention'\n> = [\n 'html',\n 'text',\n 'br',\n 'p',\n 'em',\n 'strong',\n 'a',\n 'ol',\n 'ul',\n 'li',\n 'code',\n 'pre',\n 'blockquote',\n 'del',\n 'table',\n 'thead',\n 'tbody',\n 'th',\n 'tr',\n 'td',\n 'tfoot',\n // custom types (tagNames)\n 'emoji',\n 'mention',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'ins',\n];\n\nfunction formatUrlForDisplay(url: string) {\n try {\n return decodeURIComponent(url).replace(detectHttp, '');\n } catch (e) {\n return url;\n }\n}\n\nfunction encodeDecode(url: string) {\n try {\n return encodeURI(decodeURIComponent(url));\n } catch (error) {\n return url;\n }\n}\n\nconst urlTransform = (uri: string) =>\n uri.startsWith('app://') ? uri : defaultUrlTransform(uri);\n\nconst getPluginsForward: RenderTextPluginConfigurator = (plugins: PluggableList) =>\n plugins;\n\nexport const markDownRenderers: RenderTextOptions['customMarkDownRenderers'] = {\n a: Anchor,\n emoji: Emoji,\n mention: Mention,\n};\n\nexport type RenderTextOptions = {\n allowedTagNames?: Array<IntrinsicElementTagName | 'emoji' | 'mention' | (string & {})>;\n customMarkDownRenderers?: Options['components'] &\n Partial<{\n emoji: ComponentType;\n mention: ComponentType<MentionProps>;\n }>;\n getRehypePlugins?: RenderTextPluginConfigurator;\n getRemarkPlugins?: RenderTextPluginConfigurator;\n};\n\nexport const renderText = (\n text?: string,\n mentionedUsers?: UserResponse[],\n {\n allowedTagNames = defaultAllowedTagNames,\n customMarkDownRenderers,\n getRehypePlugins = getPluginsForward,\n getRemarkPlugins = getPluginsForward,\n }: RenderTextOptions = {},\n) => {\n // take the @ mentions and turn them into markdown?\n // translate links\n if (!text) return null;\n if (text.trim().length === 1) return <>{text}</>;\n\n let newText = text;\n const markdownLinks = matchMarkdownLinks(newText);\n const codeBlocks = messageCodeBlocks(newText);\n\n // Extract all valid links/emails within text and replace it with proper markup\n // Revert the link order to avoid getting out of sync of the original start and end positions of links\n // - due to the addition of new characters when creating Markdown links\n const links = [...find(newText, 'email'), ...find(newText, 'url')];\n for (let i = links.length - 1; i >= 0; i--) {\n const { end, href, start, type, value } = links[i];\n const linkIsInBlock = codeBlocks.some((block) => block?.includes(value));\n\n // check if message is already markdown\n const noParsingNeeded =\n markdownLinks &&\n markdownLinks.filter((text) => {\n const strippedHref = href?.replace(detectHttp, '');\n const strippedText = text?.replace(detectHttp, '');\n\n if (!strippedHref || !strippedText) return false;\n\n return strippedHref.includes(strippedText) || strippedText.includes(strippedHref);\n });\n\n if (noParsingNeeded.length > 0 || linkIsInBlock) continue;\n\n try {\n // special case for mentions:\n // it could happen that a user's name matches with an e-mail format pattern.\n // in that case, we check whether the found e-mail is actually a mention\n // by naively checking for an existence of @ sign in front of it.\n if (type === 'email' && mentionedUsers) {\n const emailMatchesWithName = mentionedUsers.find((u) => u.name === value);\n if (emailMatchesWithName) {\n // FIXME: breaks if the mention symbol is not '@'\n const isMention = newText.charAt(start - 1) === '@';\n // in case of mention, we leave the match in its original form,\n // and we let `mentionsMarkdownPlugin` to do its job\n newText =\n newText.slice(0, start) +\n (isMention ? value : `[${value}](${encodeDecode(href)})`) +\n newText.slice(end);\n }\n } else {\n const displayLink = type === 'email' ? value : formatUrlForDisplay(href);\n\n newText =\n newText.slice(0, start) +\n `[${displayLink}](${encodeDecode(href)})` +\n newText.slice(end);\n }\n } catch (e) {\n void e;\n }\n }\n\n const remarkPlugins: PluggableList = [\n htmlToTextPlugin,\n keepLineBreaksPlugin,\n [remarkGfm, { singleTilde: false }],\n plusPlusToEmphasis,\n imageToLink,\n ];\n const rehypePlugins: PluggableList = [emojiMarkdownPlugin];\n\n if (mentionedUsers?.length) {\n rehypePlugins.push(mentionsMarkdownPlugin(mentionedUsers));\n }\n\n return (\n <ErrorBoundary fallback={<>{text}</>}>\n <ReactMarkdown\n allowedElements={allowedTagNames}\n components={{\n ...markDownRenderers,\n ...customMarkDownRenderers,\n }}\n rehypePlugins={getRehypePlugins(rehypePlugins)}\n remarkPlugins={getRemarkPlugins(remarkPlugins)}\n skipHtml\n unwrapDisallowed\n urlTransform={urlTransform}\n >\n {newText}\n </ReactMarkdown>\n </ErrorBoundary>\n );\n};\n","import clsx from 'clsx';\nimport React, { useMemo } from 'react';\nimport { messageHasAttachments, messageTextHasEmojisOnly } from './utils';\n\nimport type { MessageContextValue } from '../../context';\nimport { useMessageContext, useTranslationContext } from '../../context';\nimport { renderText as defaultRenderText } from './renderText';\n\nimport type { LocalMessage } from 'stream-chat';\nimport { getTranslatedMessageText } from '../../context/MessageTranslationViewContext';\n\nexport type MessageTextProps = {\n /* Replaces the CSS class name placed on the component's inner `div` container */\n customInnerClass?: string;\n /* Adds a CSS class name to the component's outer `div` container */\n customWrapperClass?: string;\n /* The `StreamChat` message object, which provides necessary data to the underlying UI components (overrides the value stored in `MessageContext`) */\n message?: LocalMessage;\n} & Pick<MessageContextValue, 'renderText'>;\n\nconst UnMemoizedMessageTextComponent = (props: MessageTextProps) => {\n const {\n customInnerClass,\n customWrapperClass = '',\n message: propMessage,\n renderText: propsRenderText,\n } = props;\n\n const {\n message: contextMessage,\n onMentionsClickMessage,\n onMentionsHoverMessage,\n renderText: contextRenderText,\n translationView = 'translated',\n unsafeHTML,\n } = useMessageContext('MessageText');\n\n const renderText = propsRenderText ?? contextRenderText ?? defaultRenderText;\n\n const { userLanguage } = useTranslationContext('MessageText');\n const message = propMessage || contextMessage;\n const hasAttachment = messageHasAttachments(message);\n\n const messageTextToRender =\n translationView === 'original'\n ? message.text\n : getTranslatedMessageText({ language: userLanguage, message }) || message.text;\n\n const messageText = useMemo(\n () => renderText(messageTextToRender, message.mentioned_users),\n [message.mentioned_users, messageTextToRender, renderText],\n );\n\n const wrapperClass = customWrapperClass || 'str-chat__message-text';\n const innerClass = customInnerClass;\n\n if (!messageTextToRender) return null;\n\n return (\n <div className={wrapperClass} tabIndex={0}>\n <div\n className={clsx(innerClass, {\n [` str-chat__message-text-inner--is-emoji`]:\n messageTextHasEmojisOnly(message) && !message.quoted_message,\n [`str-chat__message-text-inner--has-attachment`]: hasAttachment,\n })}\n data-testid='message-text-inner-wrapper'\n onClick={onMentionsClickMessage}\n onMouseOver={onMentionsHoverMessage}\n >\n {unsafeHTML && message.html ? (\n <div dangerouslySetInnerHTML={{ __html: message.html }} />\n ) : (\n <div>{messageText}</div>\n )}\n </div>\n </div>\n );\n};\n\nexport const MessageText = React.memo(\n UnMemoizedMessageTextComponent,\n) as typeof UnMemoizedMessageTextComponent;\n","import React, { useMemo } from 'react';\n\nimport { useMessageContext } from '../../context/MessageContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { getDateString, isDate } from '../../i18n/utils';\nimport type { TimestampFormatterOptions } from '../../i18n/types';\n\nexport interface TimestampProps extends TimestampFormatterOptions {\n /* Adds a CSS class name to the component's outer `time` container. */\n customClass?: string;\n /* Timestamp to display */\n timestamp?: Date | string;\n}\n\nexport function Timestamp(props: TimestampProps) {\n const { calendar, calendarFormats, customClass, format, timestamp } = props;\n\n const { formatDate } = useMessageContext('MessageTimestamp');\n const { t, tDateTimeParser } = useTranslationContext('MessageTimestamp');\n\n const normalizedTimestamp =\n timestamp && isDate(timestamp) ? timestamp.toISOString() : timestamp;\n\n const when = useMemo(\n () =>\n getDateString({\n calendar,\n calendarFormats,\n format,\n formatDate,\n messageCreatedAt: normalizedTimestamp,\n t,\n tDateTimeParser,\n timestampTranslationKey: 'timestamp/MessageTimestamp',\n }),\n [\n calendar,\n calendarFormats,\n format,\n formatDate,\n normalizedTimestamp,\n t,\n tDateTimeParser,\n ],\n );\n\n if (!when) {\n return null;\n }\n\n return (\n <time\n className={customClass}\n dateTime={normalizedTimestamp}\n title={normalizedTimestamp}\n >\n {when}\n </time>\n );\n}\n","import React from 'react';\nimport { useMessageContext } from '../../context/MessageContext';\nimport { Timestamp as DefaultTimestamp } from './Timestamp';\nimport { useComponentContext } from '../../context';\n\nimport type { LocalMessage } from 'stream-chat';\nimport type { TimestampFormatterOptions } from '../../i18n/types';\n\nexport type MessageTimestampProps = TimestampFormatterOptions & {\n /* Adds a CSS class name to the component's outer `time` container. */\n customClass?: string;\n /* The `StreamChat` message object, which provides necessary data to the underlying UI components (overrides the value from `MessageContext`) */\n message?: LocalMessage;\n};\n\nconst UnMemoizedMessageTimestamp = (props: MessageTimestampProps) => {\n const { message: propMessage, ...timestampProps } = props;\n const { message: contextMessage } = useMessageContext('MessageTimestamp');\n const { Timestamp = DefaultTimestamp } = useComponentContext('MessageTimestamp');\n const message = propMessage || contextMessage;\n return <Timestamp timestamp={message.created_at} {...timestampProps} />;\n};\n\nexport const MessageTimestamp = React.memo(\n UnMemoizedMessageTimestamp,\n) as typeof UnMemoizedMessageTimestamp;\n","import React, { useState } from 'react';\nimport type { LocalMessage } from 'stream-chat';\nimport type { TimestampFormatterOptions } from '../../i18n/types';\nimport { PopperTooltip } from '../Tooltip';\nimport { useEnterLeaveHandlers } from '../Tooltip/hooks';\nimport { Timestamp as DefaultTimestamp } from './Timestamp';\nimport {\n useComponentContext,\n useMessageContext,\n useTranslationContext,\n} from '../../context';\n\nexport type MessageEditedIndicatorProps = TimestampFormatterOptions & {\n /* Adds a CSS class name to the component's outer container. */\n customClass?: string;\n /* The `StreamChat` message object, which provides necessary data to the underlying UI components (overrides the value from `MessageContext`) */\n message?: LocalMessage;\n};\n\nconst UnMemoizedMessageEditedIndicator = (props: MessageEditedIndicatorProps) => {\n const { customClass, message: propMessage, ...timestampProps } = props;\n const { message: contextMessage } = useMessageContext('MessageEditedIndicator');\n const { t } = useTranslationContext('MessageEditedIndicator');\n const { Timestamp = DefaultTimestamp } = useComponentContext('MessageEditedIndicator');\n const message = propMessage ?? contextMessage;\n\n const [referenceElement, setReferenceElement] = useState<HTMLSpanElement | null>(null);\n const { handleEnter, handleLeave, tooltipVisible } =\n useEnterLeaveHandlers<HTMLSpanElement>();\n\n if (!message?.message_text_updated_at) {\n return null;\n }\n\n return (\n <span\n className={customClass ?? 'str-chat__message-edited-indicator'}\n data-testid='message-edited-indicator'\n onMouseEnter={handleEnter}\n onMouseLeave={handleLeave}\n ref={setReferenceElement}\n >\n {t('Edited')}\n <PopperTooltip\n offset={[0, 5]}\n placement='top'\n referenceElement={referenceElement}\n visible={tooltipVisible}\n >\n <Timestamp timestamp={message.message_text_updated_at} {...timestampProps} />\n </PopperTooltip>\n </span>\n );\n};\n\nexport const MessageEditedIndicator = React.memo(\n UnMemoizedMessageEditedIndicator,\n) as typeof UnMemoizedMessageEditedIndicator;\n","import type { LocalMessage } from 'stream-chat';\nimport React, { useCallback, useMemo } from 'react';\nimport { IconTranslate } from '../Icons';\nimport {\n getTranslatedMessageText,\n useMessageContext,\n useTranslationContext,\n} from '../../context';\nimport { Button } from '../Button';\n\nexport type TranslationIndicatorProps = {\n message?: LocalMessage;\n};\n\nexport const MessageTranslationIndicator = ({\n message: propMessage,\n}: TranslationIndicatorProps) => {\n const { t, userLanguage } = useTranslationContext();\n const {\n message: contextMessage,\n setTranslationView,\n translationView,\n } = useMessageContext('MessageTranslationIndicator');\n const message = propMessage ?? contextMessage;\n\n const translatedTextForUser = useMemo(\n () => getTranslatedMessageText({ language: userLanguage, message }),\n [userLanguage, message],\n );\n\n const hasTranslationForUserLanguage = useMemo(\n () =>\n translatedTextForUser != null &&\n message?.text !== undefined &&\n translatedTextForUser !== message.text,\n [translatedTextForUser, message?.text],\n );\n\n const viewingOriginal = useMemo(\n () =>\n translationView === 'original' ||\n (translationView === undefined && !hasTranslationForUserLanguage),\n [translationView, hasTranslationForUserLanguage],\n );\n\n const handleToggle = useCallback(() => {\n setTranslationView?.(viewingOriginal ? 'translated' : 'original');\n }, [setTranslationView, viewingOriginal]);\n\n const sourceLanguageName = useMemo(() => {\n const sourceLanguageCode = message?.i18n?.language;\n if (!sourceLanguageCode) return '';\n const languageKey = 'language/' + sourceLanguageCode;\n const translatedName = t(languageKey);\n return translatedName && translatedName !== languageKey\n ? translatedName\n : sourceLanguageCode;\n }, [message?.i18n?.language, t]);\n\n if (!message?.i18n || !setTranslationView) return null;\n if (!hasTranslationForUserLanguage) return null;\n\n return (\n <div className='str-chat__message-translation-indicator'>\n <IconTranslate />\n <span className='str-chat__message-translation-indicator__sign'>\n {viewingOriginal\n ? t('Original')\n : sourceLanguageName\n ? t('Translated from {{ language }}', { language: sourceLanguageName })\n : t('Translated')}\n </span>\n <span> · </span>\n <Button\n className='str-chat__message-translation-indicator__translation-toggle'\n onClick={handleToggle}\n type='button'\n >\n {viewingOriginal ? t('View translation') : t('View original')}\n </Button>\n </div>\n );\n};\n","import { useMessageComposerController } from './useMessageComposerController';\nimport { useStateStore } from '../../../store';\nimport type { AttachmentManagerState } from 'stream-chat';\n\nconst stateSelector = (state: AttachmentManagerState) => ({\n attachments: state.attachments,\n});\n\nexport const useAttachmentManagerState = () => {\n const { attachmentManager } = useMessageComposerController();\n const { attachments } = useStateStore(attachmentManager.state, stateSelector);\n return {\n attachments,\n availableUploadSlots: attachmentManager.availableUploadSlots,\n blockedUploadsCount: attachmentManager.blockedUploadsCount,\n failedUploadsCount: attachmentManager.failedUploadsCount,\n isUploadEnabled: attachmentManager.isUploadEnabled,\n pendingUploadsCount: attachmentManager.pendingUploadsCount,\n successfulUploadsCount: attachmentManager.successfulUploadsCount,\n uploadsInProgressCount: attachmentManager.uploadsInProgressCount,\n };\n};\n","import { useMessageComposerController } from './useMessageComposerController';\nimport { useStateStore } from '../../../store';\nimport type {\n AttachmentManagerState,\n LocationComposerState,\n PollComposerState,\n} from 'stream-chat';\n\nconst attachmentManagerStateSelector = (state: AttachmentManagerState) => ({\n attachments: state.attachments,\n});\nconst pollComposerStateSelector = (state: PollComposerState) => ({\n poll: state.data,\n});\nconst locationComposerStateSelector = (state: LocationComposerState) => ({\n location: state.location,\n});\n\nexport const useAttachmentsForPreview = () => {\n const { attachmentManager, locationComposer, pollComposer } =\n useMessageComposerController();\n const { attachments } = useStateStore(\n attachmentManager.state,\n attachmentManagerStateSelector,\n );\n const { poll } = useStateStore(pollComposer.state, pollComposerStateSelector);\n const { location } = useStateStore(\n locationComposer.state,\n locationComposerStateSelector,\n );\n\n return {\n attachments,\n location,\n poll,\n };\n};\n","import { useMessageComposerController } from './useMessageComposerController';\nimport { useEffect, useState } from 'react';\n\nexport const useCanCreatePoll = () => {\n const { pollComposer } = useMessageComposerController();\n const [canCreatePoll, setCanCreatePoll] = useState(pollComposer.canCreatePoll);\n useEffect(\n () =>\n pollComposer.state.subscribe(() => {\n setCanCreatePoll(pollComposer.canCreatePoll);\n }),\n [pollComposer],\n );\n return canCreatePoll;\n};\n","import { type CooldownTimerState } from 'stream-chat';\n\nimport { useChannelStateContext } from '../../../context';\nimport { useStateStore } from '../../../store';\n\nconst cooldownTimerStateSelector = (state: CooldownTimerState) => ({\n cooldownRemaining: state.cooldownRemaining,\n});\n\n/**\n * Provides and initial value of cooldown, from which the countdown should start, e.g.:\n *\n * The value of channel.data.cooldown is 100s but 30s has already elapsed, user reloads the page,\n * the initial value is now 70s from which the countdown will continue using useTimer() hook.\n */\nexport const useCooldownRemaining = (): number => {\n const { channel } = useChannelStateContext();\n return (\n useStateStore(channel.cooldownTimer.state, cooldownTimerStateSelector)\n .cooldownRemaining ?? 0\n );\n};\n","import { useEffect, useRef } from 'react';\nimport type { MessageComposerProps } from '../MessageComposer';\n\nexport const useTextareaRef = (props: MessageComposerProps) => {\n const { focus } = props;\n const textareaRef = useRef<HTMLTextAreaElement>(undefined);\n // Focus\n useEffect(() => {\n if (focus && textareaRef.current) {\n textareaRef.current.focus();\n }\n }, [focus]);\n\n return {\n textareaRef,\n };\n};\n","import { useCallback } from 'react';\nimport { MessageComposer } from 'stream-chat';\nimport { useChatContext } from '../../../context/ChatContext';\nimport { useMessageComposerController } from './useMessageComposerController';\nimport { useChannelActionContext } from '../../../context/ChannelActionContext';\nimport { useTranslationContext } from '../../../context/TranslationContext';\nimport { addNotificationTargetTag, useNotificationTarget } from '../../Notifications';\n\nimport type { MessageComposerProps } from '../MessageComposer';\n\nconst takeStateSnapshot = (messageComposer: MessageComposer) => {\n const textComposerState = messageComposer.textComposer.state.getLatestValue();\n const attachmentManagerState = messageComposer.attachmentManager.state.getLatestValue();\n const linkPreviewsManagerState =\n messageComposer.linkPreviewsManager.state.getLatestValue();\n const pollComposerState = messageComposer.pollComposer.state.getLatestValue();\n const customDataManagerState = messageComposer.customDataManager.state.getLatestValue();\n const state = messageComposer.state.getLatestValue();\n\n return () => {\n messageComposer.state.next(state);\n messageComposer.textComposer.state.next(textComposerState);\n messageComposer.attachmentManager.state.next(attachmentManagerState);\n messageComposer.linkPreviewsManager.state.next(linkPreviewsManagerState);\n messageComposer.pollComposer.state.next(pollComposerState);\n messageComposer.customDataManager.state.next(customDataManagerState);\n };\n};\n\nexport const useSubmitHandler = (props: MessageComposerProps) => {\n const { overrideSubmitHandler } = props;\n\n const { client } = useChatContext('useSubmitHandler');\n const { editMessage, sendMessage } = useChannelActionContext('useSubmitHandler');\n const { t } = useTranslationContext('useSubmitHandler');\n const panel = useNotificationTarget();\n const messageComposer = useMessageComposerController();\n\n const handleSubmit = useCallback(\n async (event?: React.BaseSyntheticEvent) => {\n event?.preventDefault();\n const composition = await messageComposer.compose();\n if (!composition || !composition.message) return;\n\n const { localMessage, message, sendOptions } = composition;\n\n if (messageComposer.editedMessage && localMessage.type !== 'error') {\n try {\n await editMessage(localMessage, sendOptions);\n messageComposer.clear();\n } catch (err) {\n client.notifications.addError({\n message: t('Edit message request failed'),\n options: { tags: addNotificationTargetTag(panel) },\n origin: { emitter: 'MessageComposer' },\n });\n }\n } else {\n const restoreComposerStateSnapshot = takeStateSnapshot(messageComposer);\n try {\n // FIXME: once MessageComposer has sendMessage method, then the following condition should be encapsulated by it\n // keep attachments, text, quoted message (treat them as draft) ... if sending a poll\n const sentPollMessage = !!message.poll_id;\n if (sentPollMessage) {\n messageComposer.state.partialNext({\n id: MessageComposer.generateId(),\n pollId: null,\n });\n } else {\n messageComposer.clear();\n }\n // todo: get rid of overrideSubmitHandler once MessageComposer supports submission flow\n if (overrideSubmitHandler) {\n await overrideSubmitHandler({\n cid: messageComposer.channel.cid,\n localMessage,\n message,\n sendOptions,\n });\n } else {\n await sendMessage({ localMessage, message, options: sendOptions });\n }\n if (messageComposer.config.text.publishTypingEvents)\n await messageComposer.channel.stopTyping();\n } catch (err) {\n restoreComposerStateSnapshot();\n client.notifications.addError({\n message: t('Send message request failed'),\n options: { tags: addNotificationTargetTag(panel) },\n origin: { emitter: 'MessageComposer' },\n });\n }\n }\n },\n [client, editMessage, messageComposer, overrideSubmitHandler, panel, sendMessage, t],\n );\n\n return { handleSubmit };\n};\n","import clsx from 'clsx';\nimport { nanoid } from 'nanoid';\nimport type { ComponentProps } from 'react';\nimport React, { forwardRef, useCallback, useMemo } from 'react';\n\nimport { useHandleFileChangeWrapper } from './utils';\nimport { useMessageComposerContext, useTranslationContext } from '../../context';\nimport { useMessageComposerController } from '../MessageComposer/hooks/useMessageComposerController';\nimport { useAttachmentManagerState } from '../MessageComposer/hooks/useAttachmentManagerState';\nimport { useIsCooldownActive } from '../MessageComposer/hooks/useIsCooldownActive';\nimport { useStateStore } from '../../store';\nimport type { MessageComposerConfig } from 'stream-chat';\nimport type { PartialSelected } from '../../types/types';\n\nconst attachmentManagerConfigStateSelector = (state: MessageComposerConfig) => ({\n acceptedFiles: state.attachments.acceptedFiles,\n maxNumberOfFilesPerMessage: state.attachments.maxNumberOfFilesPerMessage,\n});\n\n/**\n * @deprecated Use FileInputProps instead.\n */\nexport type UploadButtonProps = {\n onFileChange: (files: Array<File>) => void;\n resetOnChange?: boolean;\n} & Omit<ComponentProps<'input'>, 'type' | 'onChange'>;\n\n/**\n * @deprecated Use FileInput instead\n */\n\nexport const UploadButton = forwardRef(function UploadButton(\n { onFileChange, resetOnChange = true, ...rest }: UploadButtonProps,\n ref: React.ForwardedRef<HTMLInputElement>,\n) {\n const handleInputChange = useHandleFileChangeWrapper(resetOnChange, onFileChange);\n\n return <input onChange={handleInputChange} ref={ref} type='file' {...rest} />;\n});\n\nexport type FileInputProps = UploadButtonProps;\n\nexport const FileInput = UploadButton;\n\nexport const UploadFileInput = forwardRef(function UploadFileInput(\n {\n className,\n onFileChange: onFileChangeCustom,\n ...props\n }: PartialSelected<FileInputProps, 'onFileChange'>,\n ref: React.ForwardedRef<HTMLInputElement>,\n) {\n const { t } = useTranslationContext('UploadFileInput');\n const { textareaRef } = useMessageComposerContext();\n const messageComposer = useMessageComposerController();\n const { attachmentManager } = messageComposer;\n const { isUploadEnabled } = useAttachmentManagerState();\n const { acceptedFiles, maxNumberOfFilesPerMessage } = useStateStore(\n messageComposer.configState,\n attachmentManagerConfigStateSelector,\n );\n const isCooldownActive = useIsCooldownActive();\n const id = useMemo(() => nanoid(), []);\n\n const onFileChange = useCallback(\n (files: Array<File>) => {\n attachmentManager.uploadFiles(files);\n textareaRef.current?.focus();\n onFileChangeCustom?.(files);\n },\n [onFileChangeCustom, attachmentManager, textareaRef],\n );\n\n return (\n <FileInput\n accept={acceptedFiles?.join(',')}\n aria-label={t('aria/File upload')}\n data-testid='file-input'\n disabled={!isUploadEnabled || isCooldownActive}\n id={id}\n multiple={maxNumberOfFilesPerMessage > 1}\n {...props}\n className={clsx('str-chat__file-input', className)}\n onFileChange={onFileChange}\n ref={ref}\n />\n );\n});\n","import { useCallback } from 'react';\nimport { useMessageComposerController } from './useMessageComposerController';\nimport { dataTransferItemsToFiles } from '../../ReactFileUtilities';\n\nexport const usePasteHandler = () => {\n const { attachmentManager, textComposer } = useMessageComposerController();\n const onPaste = useCallback(\n (clipboardEvent: React.ClipboardEvent<HTMLTextAreaElement>) => {\n (async (event) => {\n const { items } = event.clipboardData;\n event.preventDefault();\n // Get a promise for the plain text in case no files are\n // found. This needs to be done here because chrome cleans\n // up the DataTransferItems after resolving of a promise.\n let plainTextPromise: Promise<string> | undefined = undefined;\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.kind === 'string' && item.type === 'text/plain') {\n plainTextPromise = new Promise((resolve) => {\n item.getAsString((string) => {\n resolve(string);\n });\n });\n break;\n }\n }\n\n const fileLikes = await dataTransferItemsToFiles(Array.from(items));\n\n if (plainTextPromise) {\n const pastedText = await plainTextPromise;\n textComposer.insertText({ text: pastedText });\n } else {\n attachmentManager.uploadFiles(fileLikes);\n }\n })(clipboardEvent);\n },\n [attachmentManager, textComposer],\n );\n\n return { onPaste };\n};\n","export interface SubscriptionLike {\n closed: boolean;\n\n unsubscribe(): void;\n}\n\nexport class Subscription implements SubscriptionLike {\n closed = false;\n private _unsubscribe: (() => void) | undefined;\n\n constructor(unsubscribe?: () => void) {\n this._unsubscribe = unsubscribe;\n }\n\n unsubscribe() {\n this.closed = true;\n this._unsubscribe?.();\n }\n}\n","type Next<T> = (value: T) => void;\nexport type Observer<T> = {\n next(value: T): void;\n complete?(): void;\n error?(error: Error): void;\n};\nexport type ObserverOrNext<T> = Next<T> | Observer<T>;\n\nexport function createObserver<T>(observerOrNext: ObserverOrNext<T>): Observer<T> {\n return typeof observerOrNext === 'function' ? { next: observerOrNext } : observerOrNext;\n}\n","import type { ObserverOrNext } from './Observer';\nimport { createObserver } from './Observer';\nimport { Subscription } from './Subscription';\n\nexport interface Unsubscribable {\n unsubscribe(): void;\n}\n\ntype Producer<T> = (observer: ObserverOrNext<T>) => Subscription;\n\nexport interface Subscribable<T> {\n subscribe(observerOrNext: ObserverOrNext<T>): Unsubscribable;\n}\n\nexport class Observable<T> implements Subscribable<T> {\n protected _closed = false;\n private _producer: Producer<T> | undefined;\n\n constructor(producer?: Producer<T>) {\n if (producer) this._producer = producer;\n }\n\n get closed() {\n return this._closed;\n }\n\n subscribe(observerOrNext: ObserverOrNext<T>): Subscription {\n const observer = createObserver<T>(observerOrNext);\n if (!this.closed) {\n this._producer?.(observer);\n }\n return new Subscription(() => {\n this._closed = true;\n });\n }\n}\n","import { Observable } from './Observable';\nimport type { SubscriptionLike } from './Subscription';\nimport { Subscription } from './Subscription';\nimport type { Observer, ObserverOrNext } from './Observer';\nimport { createObserver } from './Observer';\n\nexport class Subject<T> extends Observable<T> implements SubscriptionLike {\n private _observers: Map<number, Observer<T>> = new Map();\n private _observerCounter = 0;\n thrownError: Error | undefined;\n\n constructor() {\n super();\n }\n\n get observers() {\n return Array.from(this._observers.values());\n }\n\n next(value: T) {\n if (this.closed) return;\n const observers = this.observers;\n for (let i = 0; i < observers.length; i++) {\n observers[i].next(value);\n }\n }\n\n error(err: Error) {\n if (this.closed) return;\n this.thrownError = err;\n const { observers } = this;\n for (let i = 0; i < observers.length; i++) {\n observers[i].error?.(err);\n }\n this._observers.clear();\n }\n\n complete() {\n if (this.closed) return;\n this._closed = true;\n const { observers } = this;\n for (let i = 0; i < observers.length; i++) {\n observers[i].complete?.();\n }\n this._observers.clear();\n }\n\n subscribe(observerOrNext: ObserverOrNext<T>): Subscription {\n const observer = createObserver<T>(observerOrNext);\n if (this.thrownError || this.closed) {\n const subscription = new Subscription();\n subscription.closed = true;\n return subscription;\n }\n\n const observerId = this._observerCounter++;\n this._observers.set(observerId, observer);\n return new Subscription(() => {\n this._observers.delete(observerId);\n });\n }\n\n unsubscribe(): void {\n this._closed = true;\n this._observers.clear();\n }\n}\n","import { Subject } from './Subject';\nimport type { ObserverOrNext } from './Observer';\nimport { createObserver } from './Observer';\nimport type { Subscription } from './Subscription';\n\nexport class BehaviorSubject<T> extends Subject<T> {\n constructor(private _value: T) {\n super();\n }\n\n get value(): T {\n const { _value, thrownError } = this;\n if (thrownError) {\n throw thrownError;\n }\n return _value;\n }\n\n subscribe(observerOrNext: ObserverOrNext<T>): Subscription {\n const observer = createObserver<T>(observerOrNext);\n const subscription = super.subscribe(observerOrNext);\n if (!subscription.closed) observer.next(this._value);\n return subscription;\n }\n\n next(value: T): void {\n super.next((this._value = value));\n }\n}\n","import type { RecordedMediaType } from '../../ReactFileUtilities';\nimport type { ChangeEvent } from 'react';\nimport { Subscription } from '../observable/Subscription';\nimport { Subject } from '../observable/Subject';\nimport { BehaviorSubject } from '../observable/BehaviorSubject';\n\nexport enum RecordingPermission {\n CAM = 'camera',\n MIC = 'microphone',\n}\n\nconst MEDIA_TO_PERMISSION: Record<RecordedMediaType, RecordingPermission> = {\n audio: RecordingPermission.MIC,\n video: RecordingPermission.CAM,\n};\n\nexport type BrowserPermissionOptions = {\n mediaType: RecordedMediaType;\n};\n\nexport class BrowserPermission {\n name: string;\n state = new BehaviorSubject<PermissionState | undefined>(undefined);\n status = new BehaviorSubject<PermissionStatus | undefined>(undefined);\n error = new Subject<Error | undefined>();\n\n private changeSubscriptions: Subscription[] = [];\n\n constructor({ mediaType }: BrowserPermissionOptions) {\n this.name = MEDIA_TO_PERMISSION[mediaType];\n }\n\n get isWatching() {\n return this.changeSubscriptions.some((subscription) => !subscription.closed);\n }\n\n async watch() {\n if (!this.status.value) {\n await this.check();\n if (!this.status.value) return;\n }\n\n const status = this.status.value;\n const handlePermissionChange = (e: Event) => {\n const { state } = (e as unknown as ChangeEvent<PermissionStatus>).target;\n this.state.next(state);\n };\n status.addEventListener('change', handlePermissionChange);\n\n this.changeSubscriptions.push(\n new Subscription(() => {\n status.removeEventListener('change', handlePermissionChange);\n }),\n );\n }\n\n unwatch() {\n this.changeSubscriptions.forEach((subscription) => subscription.unsubscribe());\n }\n\n async check() {\n if (!this.name) {\n this.error.next(new Error('Unknown media recording permission'));\n return;\n }\n\n let permissionState: PermissionState;\n try {\n const permissionStatus = await navigator.permissions.query({\n name: this.name as unknown as PermissionName,\n });\n permissionState = permissionStatus.state;\n this.status.next(permissionStatus);\n } catch (e) {\n // permission does not exist - cannot be queried\n // an example would be Firefox - camera, neither microphone perms can be queried\n permissionState = 'granted' as PermissionState;\n }\n this.state.next(permissionState);\n }\n}\n","import mergeWith from 'lodash.mergewith';\n\nconst overrideEverything = (_: unknown, source: unknown) => source;\n\nexport const mergeDeep = <TObject, TSource>(target: TObject, source: TSource) =>\n mergeWith<TObject, TSource>(target, source, overrideEverything);\n\nconst overrideUndefinedOnly = (object: unknown, source: unknown) => object ?? source;\n\nexport const mergeDeepUndefined = <TObject, TSource>(target: TObject, source: TSource) =>\n mergeWith<TObject, TSource>(target, source, overrideUndefinedOnly);\n","import { BehaviorSubject } from '../observable/BehaviorSubject';\nimport { Subject } from '../observable/Subject';\nimport { mergeDeepUndefined } from '../../../utils/mergeDeep';\n\nconst MAX_FREQUENCY_AMPLITUDE = 255 as const;\n\nconst logError = (e?: Error) => e && console.error('[AMPLITUDE RECORDER ERROR]', e);\n\nconst rootMeanSquare = (values: Uint8Array) =>\n Math.sqrt(values.reduce((acc, val) => acc + Math.pow(val, 2), 0) / values.length);\n\n/**\n * fftSize\n * An unsigned integer, representing the window size of the FFT, given in number of samples.\n * A higher value will result in more details in the frequency domain but fewer details\n * in the amplitude domain.\n *\n * Must be a power of 2 between 2^5 and 2^15, so one of: 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, and 32768.\n * Defaults to 32.\n *\n * maxDecibels\n * A double, representing the maximum decibel value for scaling the FFT analysis data,\n * where 0 dB is the loudest possible sound, -10 dB is a 10th of that, etc.\n * The default value is -30 dB.\n *\n * minDecibels\n * A double, representing the minimum decibel value for scaling the FFT analysis data,\n * where 0 dB is the loudest possible sound, -10 dB is a 10th of that, etc.\n * The default value is -100 dB.\n */\nexport type AmplitudeAnalyserConfig = Pick<\n AnalyserNode,\n 'fftSize' | 'maxDecibels' | 'minDecibels'\n>;\nexport type AmplitudeRecorderConfig = {\n analyserConfig: AmplitudeAnalyserConfig;\n sampleCount: number;\n samplingFrequencyMs: number;\n};\n\nexport const DEFAULT_AMPLITUDE_RECORDER_CONFIG: AmplitudeRecorderConfig = {\n analyserConfig: {\n fftSize: 32,\n maxDecibels: 0,\n minDecibels: -100,\n } as AmplitudeAnalyserConfig,\n sampleCount: 100,\n samplingFrequencyMs: 60,\n};\n\ntype AmplitudeAnalyserOptions = {\n stream: MediaStream;\n config?: AmplitudeRecorderConfig;\n};\n\nexport enum AmplitudeRecorderState {\n CLOSED = 'closed',\n RECORDING = 'recording',\n STOPPED = 'stopped',\n}\n\nexport class AmplitudeRecorder {\n audioContext: AudioContext | undefined;\n analyserNode: AnalyserNode | undefined;\n microphone: MediaStreamAudioSourceNode | undefined;\n stream: MediaStream;\n\n config: AmplitudeRecorderConfig;\n\n amplitudeSamplingInterval: ReturnType<typeof setInterval> | undefined;\n\n amplitudes = new BehaviorSubject<number[]>([]);\n state = new BehaviorSubject<AmplitudeRecorderState | undefined>(undefined);\n error = new Subject<Error | undefined>();\n\n constructor({ config, stream }: AmplitudeAnalyserOptions) {\n this.config = mergeDeepUndefined({ ...config }, DEFAULT_AMPLITUDE_RECORDER_CONFIG);\n this.stream = stream;\n }\n\n init() {\n this.audioContext = new AudioContext();\n this.analyserNode = this.audioContext.createAnalyser();\n const { analyserConfig } = this.config;\n this.analyserNode.fftSize = analyserConfig.fftSize;\n this.analyserNode.maxDecibels = analyserConfig.maxDecibels;\n this.analyserNode.minDecibels = analyserConfig.minDecibels;\n\n this.microphone = this.audioContext.createMediaStreamSource(this.stream);\n this.microphone.connect(this.analyserNode);\n }\n\n stop() {\n clearInterval(this.amplitudeSamplingInterval);\n this.amplitudeSamplingInterval = undefined;\n this.state.next(AmplitudeRecorderState.STOPPED);\n }\n\n start = () => {\n if (this.state.value === AmplitudeRecorderState.CLOSED) return;\n if (!this.stream) {\n throw new Error(\n 'Missing MediaStream instance. Cannot to start amplitude recording',\n );\n }\n\n if (this.state.value === AmplitudeRecorderState.RECORDING) this.stop();\n\n if (!this.analyserNode) {\n if (!this.stream) return;\n this.init();\n }\n\n this.state.next(AmplitudeRecorderState.RECORDING);\n\n this.amplitudeSamplingInterval = setInterval(() => {\n if (!(this.analyserNode && this.state.value === AmplitudeRecorderState.RECORDING))\n return;\n const frequencyBins = new Uint8Array(this.analyserNode.frequencyBinCount);\n try {\n this.analyserNode.getByteFrequencyData(frequencyBins);\n } catch (e) {\n logError(e as Error);\n this.error.next(e as Error);\n return;\n }\n const normalizedSignalStrength =\n rootMeanSquare(frequencyBins) / MAX_FREQUENCY_AMPLITUDE;\n this.amplitudes.next([...this.amplitudes.value, normalizedSignalStrength]);\n }, this.config.samplingFrequencyMs);\n };\n\n close() {\n if (this.state.value !== AmplitudeRecorderState.STOPPED) this.stop();\n this.state.next(AmplitudeRecorderState.CLOSED);\n this.amplitudes.next([]);\n this.microphone?.disconnect();\n this.analyserNode?.disconnect();\n if (this.audioContext?.state !== 'closed') this.audioContext?.close();\n }\n}\n","import { renderAudio, toAudioBuffer } from './audioProcessing';\n\nconst WAV_HEADER_LENGTH_BYTES = 44 as const;\nconst BYTES_PER_SAMPLE = 2 as const;\nconst RIFF_FILE_MAX_BYTES = 4294967295 as const;\n\nconst HEADER = {\n AUDIO_FORMAT: { offset: 20, value: 1 }, // PCM = 1\n BITS_PER_SAMPLE: { offset: 34, value: BYTES_PER_SAMPLE * 8 }, // 16 bits encoding\n BLOCK_ALIGN: { offset: 32 },\n BYTE_RATE: { offset: 28 },\n CHANNEL_COUNT: { offset: 22 }, // 1 - mono, 2 - stereo\n CHUNK_ID: { offset: 0, value: 0x52494646 }, // hex representation of string \"RIFF\" (Resource Interchange File Format) - identifies the file structure that defines a class of more specific file formats, e.g. WAVE\n CHUNK_SIZE: { offset: 4 },\n FILE_FORMAT: { offset: 8, value: 0x57415645 }, // hex representation of string \"WAVE\"\n SAMPLE_RATE: { offset: 24 },\n SUBCHUNK1_ID: { offset: 12, value: 0x666d7420 }, // hex representation of string \"fmt \" - identifies the start of \"format\" section of the header\n SUBCHUNK1_SIZE: { offset: 16, value: 16 }, // Subchunk1 Size without SUBCHUNK1_ID and SUBCHUNK1_SIZE fields\n SUBCHUNK2_ID: { offset: 36, value: 0x64617461 }, // hex representation of string \"data\" - identifies the start of actual audio data section\n SUBCHUNK2_SIZE: { offset: 40 }, // actual audio data size\n} as const;\n\nconst fourCharsToInt = (chars: string) =>\n (chars.charCodeAt(0) << 24) |\n (chars.charCodeAt(1) << 16) |\n (chars.charCodeAt(2) << 8) |\n chars.charCodeAt(3);\n\nconst WAV_HEADER_FLAGS = {\n data: fourCharsToInt('data'),\n fmt: fourCharsToInt('fmt '),\n RIFF: fourCharsToInt('RIFF'),\n WAVE: fourCharsToInt('WAVE'),\n};\n\ntype WriteWaveHeaderParams = {\n arrayBuffer: ArrayBuffer;\n // 1 - mono, 2 - stereo\n channelCount: number;\n // Number of samples per second, e.g. 44100Hz\n sampleRate: number;\n};\nconst writeWavHeader = ({\n arrayBuffer,\n channelCount,\n sampleRate,\n}: WriteWaveHeaderParams) => {\n const byteRate = sampleRate * channelCount * BYTES_PER_SAMPLE; // bytes/sec\n const blockAlign = channelCount * BYTES_PER_SAMPLE;\n\n const dataView = new DataView(arrayBuffer);\n /*\n * The maximum size of a RIFF file is 4294967295 bytes and since the header takes up 44 bytes there are 4294967251 bytes left for the\n * data chunk.\n */\n const dataChunkSize = Math.min(\n dataView.byteLength - WAV_HEADER_LENGTH_BYTES,\n RIFF_FILE_MAX_BYTES - WAV_HEADER_LENGTH_BYTES,\n );\n\n dataView.setUint32(HEADER.CHUNK_ID.offset, HEADER.CHUNK_ID.value); // \"RIFF\"\n dataView.setUint32(HEADER.CHUNK_SIZE.offset, arrayBuffer.byteLength - 8, true); // adjustment for the first two headers - chunk id + file size\n dataView.setUint32(HEADER.FILE_FORMAT.offset, HEADER.FILE_FORMAT.value); // \"WAVE\"\n\n dataView.setUint32(HEADER.SUBCHUNK1_ID.offset, HEADER.SUBCHUNK1_ID.value); // \"fmt \"\n dataView.setUint32(HEADER.SUBCHUNK1_SIZE.offset, HEADER.SUBCHUNK1_SIZE.value, true);\n dataView.setUint16(HEADER.AUDIO_FORMAT.offset, HEADER.AUDIO_FORMAT.value, true);\n dataView.setUint16(HEADER.CHANNEL_COUNT.offset, channelCount, true);\n dataView.setUint32(HEADER.SAMPLE_RATE.offset, sampleRate, true);\n dataView.setUint32(HEADER.BYTE_RATE.offset, byteRate, true);\n dataView.setUint16(HEADER.BLOCK_ALIGN.offset, blockAlign, true);\n dataView.setUint16(HEADER.BITS_PER_SAMPLE.offset, HEADER.BITS_PER_SAMPLE.value, true);\n\n dataView.setUint32(HEADER.SUBCHUNK2_ID.offset, HEADER.SUBCHUNK2_ID.value); // \"data\"\n dataView.setUint32(HEADER.SUBCHUNK2_SIZE.offset, dataChunkSize, true);\n};\n\nexport const readWavHeader = (dataView: DataView) => {\n const header = dataView.getUint32(0, false);\n if (WAV_HEADER_FLAGS.RIFF !== header) {\n console.error('Missing RIFF header in WAVE file');\n return;\n }\n if (WAV_HEADER_FLAGS.WAVE !== dataView.getUint32(HEADER.FILE_FORMAT.offset, false)) {\n console.error('Missing WAVE header in WAVE file');\n return;\n }\n if (WAV_HEADER_FLAGS.fmt !== dataView.getUint32(HEADER.SUBCHUNK1_ID.offset, false)) {\n console.error('Missing fmt header in WAVE file');\n return;\n }\n\n return {\n audioDataSizeBytes: dataView.getUint32(HEADER.SUBCHUNK2_SIZE.offset, true),\n audioDataStartOffset: WAV_HEADER_LENGTH_BYTES,\n channelCount: dataView.getUint16(HEADER.CHANNEL_COUNT.offset, true),\n sampleRate: dataView.getUint32(HEADER.SAMPLE_RATE.offset, true),\n };\n};\n\nconst splitDataByChannel = (audioBuffer: AudioBuffer) =>\n Array.from({ length: audioBuffer.numberOfChannels }, (_, i) =>\n audioBuffer.getChannelData(i),\n );\n\ntype WriteAudioDataParams = {\n arrayBuffer: ArrayBuffer;\n dataByChannel: Float32Array[];\n};\n\n/**\n * In a WAV file, samples for each channel are usually interleaved, meaning samples from each channel are grouped together sequentially.\n * For example, in a stereo audio file (2 channels), samples alternate between the left and right channels.\n * @param arrayBuffer\n * @param dataByChannel\n */\nconst writeWavAudioData = ({ arrayBuffer, dataByChannel }: WriteAudioDataParams) => {\n const dataView = new DataView(arrayBuffer);\n const channelCount = dataByChannel.length;\n\n dataByChannel.forEach((channelData, channelIndex) => {\n let writeOffset = WAV_HEADER_LENGTH_BYTES + channelCount * channelIndex;\n\n channelData.forEach((float32Value) => {\n dataView.setInt16(\n writeOffset,\n float32Value < 0\n ? Math.max(-1, float32Value) * 32768\n : Math.min(1, float32Value) * 32767,\n true,\n );\n writeOffset += channelCount * BYTES_PER_SAMPLE;\n });\n });\n};\n\nexport const encodeToWaw = async (file: File, sampleRate: number) => {\n const audioBuffer = await renderAudio(await toAudioBuffer(file), sampleRate);\n const numberOfSamples = audioBuffer.duration * sampleRate;\n const fileSizeBytes =\n numberOfSamples * audioBuffer.numberOfChannels * BYTES_PER_SAMPLE +\n WAV_HEADER_LENGTH_BYTES;\n\n const arrayBuffer = new ArrayBuffer(fileSizeBytes);\n writeWavHeader({ arrayBuffer, channelCount: audioBuffer.numberOfChannels, sampleRate });\n writeWavAudioData({ arrayBuffer, dataByChannel: splitDataByChannel(audioBuffer) });\n return new Blob([arrayBuffer], { type: 'audio/wav' });\n};\n","import { encodeToWaw } from './wav';\nimport { createFileFromBlobs, getExtensionFromMimeType } from '../../ReactFileUtilities';\n\nexport type TranscoderConfig = {\n // defaults to 16000Hz\n sampleRate: number;\n // Custom encoder function that converts the recorded audio file into a blob with the desired MIME type\n encoder?: (file: File, sampleRate: number) => Promise<Blob>;\n};\n\nexport type TranscodeParams = TranscoderConfig & {\n blob: Blob;\n};\n\nexport const transcode = ({\n blob,\n encoder = encodeToWaw,\n sampleRate,\n}: TranscodeParams): Promise<Blob> =>\n encoder(\n createFileFromBlobs({\n blobsArray: [blob],\n fileName: `audio_recording_${new Date().toISOString()}.${getExtensionFromMimeType(\n blob.type,\n )}`,\n mimeType: blob.type,\n }),\n sampleRate,\n );\n","import fixWebmDuration from 'fix-webm-duration';\nimport { nanoid } from 'nanoid';\nimport {\n AmplitudeRecorder,\n DEFAULT_AMPLITUDE_RECORDER_CONFIG,\n} from './AmplitudeRecorder';\nimport { BrowserPermission } from './BrowserPermission';\nimport { BehaviorSubject, Subject } from '../observable';\nimport type { TranscoderConfig } from '../transcode';\nimport { transcode } from '../transcode';\nimport { resampleWaveformData } from '../../Attachment';\nimport type { RecordedMediaType } from '../../ReactFileUtilities';\nimport {\n createFileFromBlobs,\n getExtensionFromMimeType,\n getRecordedMediaTypeFromMimeType,\n} from '../../ReactFileUtilities';\nimport { defaultTranslatorFunction } from '../../../i18n';\nimport { mergeDeepUndefined } from '../../../utils/mergeDeep';\nimport type { LocalVoiceRecordingAttachment } from 'stream-chat';\nimport type { AmplitudeRecorderConfig } from './AmplitudeRecorder';\nimport type { TranslationContextValue } from '../../../context';\n\nexport const RECORDED_MIME_TYPE_BY_BROWSER = {\n audio: {\n others: 'audio/webm',\n safari: 'audio/mp4;codecs=mp4a.40.2',\n },\n} as const;\n\nexport const DEFAULT_AUDIO_TRANSCODER_CONFIG: TranscoderConfig = {\n sampleRate: 16000,\n} as const;\n\nconst disposeOfMediaStream = (stream?: MediaStream) => {\n if (!stream?.active) return;\n stream.getTracks().forEach((track) => {\n track.stop();\n stream.removeTrack(track);\n });\n};\n\nconst logError = (e?: Error) => e && console.error('[MEDIA RECORDER ERROR]', e);\n\ntype MediaRecorderConfig = Omit<MediaRecorderOptions, 'mimeType'> &\n Required<Pick<MediaRecorderOptions, 'mimeType'>>;\n\nexport type AudioRecorderConfig = {\n amplitudeRecorderConfig: AmplitudeRecorderConfig;\n mediaRecorderConfig: MediaRecorderOptions;\n transcoderConfig: TranscoderConfig;\n};\n\ntype PartialValues<T> = { [P in keyof T]?: Partial<T[P]> };\n\nexport type CustomAudioRecordingConfig = PartialValues<AudioRecorderConfig>;\n\nexport type AudioRecorderOptions = {\n config?: CustomAudioRecordingConfig;\n generateRecordingTitle?: (mimeType: string) => string;\n t?: TranslationContextValue['t'];\n};\n\nexport enum MediaRecordingState {\n PAUSED = 'paused',\n RECORDING = 'recording',\n STOPPED = 'stopped',\n}\n\nexport enum RecordingAttachmentType {\n VOICE_RECORDING = 'voiceRecording',\n}\n\nexport class MediaRecorderController {\n permission: BrowserPermission;\n mediaRecorder: MediaRecorder | undefined;\n amplitudeRecorder: AmplitudeRecorder | undefined;\n\n amplitudeRecorderConfig: AmplitudeRecorderConfig;\n mediaRecorderConfig: MediaRecorderConfig;\n transcoderConfig: TranscoderConfig;\n\n startTime: number | undefined;\n recordedChunkDurations: number[] = [];\n recordedData: Blob[] = [];\n recordingUri: string | undefined;\n mediaType: RecordedMediaType;\n\n signalRecordingReady: ((r: LocalVoiceRecordingAttachment) => void) | undefined;\n\n recordingState = new BehaviorSubject<MediaRecordingState | undefined>(undefined);\n recording = new BehaviorSubject<LocalVoiceRecordingAttachment | undefined>(undefined);\n error = new Subject<Error | undefined>();\n notification = new Subject<{ text: string; type: 'success' | 'error' } | undefined>();\n\n customGenerateRecordingTitle: ((mimeType: string) => string) | undefined;\n t: TranslationContextValue['t'];\n\n constructor({ config, generateRecordingTitle, t }: AudioRecorderOptions = {}) {\n this.t = t || defaultTranslatorFunction;\n\n this.amplitudeRecorderConfig = mergeDeepUndefined(\n { ...config?.amplitudeRecorderConfig },\n DEFAULT_AMPLITUDE_RECORDER_CONFIG,\n );\n\n this.mediaRecorderConfig = mergeDeepUndefined(\n { ...config?.mediaRecorderConfig },\n {\n mimeType: MediaRecorder.isTypeSupported('audio/webm')\n ? RECORDED_MIME_TYPE_BY_BROWSER.audio.others\n : RECORDED_MIME_TYPE_BY_BROWSER.audio.safari,\n },\n );\n\n this.transcoderConfig = mergeDeepUndefined(\n { ...config?.transcoderConfig },\n DEFAULT_AUDIO_TRANSCODER_CONFIG,\n );\n\n const mediaType = getRecordedMediaTypeFromMimeType(this.mediaRecorderConfig.mimeType);\n if (!mediaType) {\n throw new Error(\n `Unsupported media type (supported audio or video only). Provided mimeType: ${this.mediaRecorderConfig.mimeType}`,\n );\n }\n this.mediaType = mediaType;\n\n this.permission = new BrowserPermission({ mediaType });\n\n this.customGenerateRecordingTitle = generateRecordingTitle;\n }\n\n get durationMs() {\n return this.recordedChunkDurations.reduce((acc, val) => acc + val, 0);\n }\n\n generateRecordingTitle = (mimeType: string) => {\n if (this.customGenerateRecordingTitle) {\n return this.customGenerateRecordingTitle(mimeType);\n }\n return `${this.mediaType}_recording_${new Date().toISOString()}.${getExtensionFromMimeType(\n mimeType,\n )}`; // extension needed so that desktop Safari can play the asset\n };\n\n makeVoiceRecording = async () => {\n if (this.recordingUri) URL.revokeObjectURL(this.recordingUri);\n\n if (!this.recordedData.length) return;\n const { mimeType } = this.mediaRecorderConfig;\n let blob = new Blob(this.recordedData, { type: mimeType });\n if (mimeType.match('audio/webm')) {\n // The browser does not include duration metadata with the recorded blob\n blob = await fixWebmDuration(blob, this.durationMs, {\n logger: () => null, // prevents polluting the browser console\n });\n }\n if (!mimeType.match('audio/mp4')) {\n blob = await transcode({\n blob,\n ...this.transcoderConfig,\n });\n }\n\n if (!blob) return;\n\n this.recordingUri = URL.createObjectURL(blob);\n const file = createFileFromBlobs({\n blobsArray: [blob],\n fileName: this.generateRecordingTitle(blob.type),\n mimeType: blob.type,\n });\n\n return {\n asset_url: this.recordingUri,\n duration: this.durationMs / 1000,\n file_size: blob.size,\n localMetadata: {\n file,\n id: nanoid(),\n },\n mime_type: blob.type,\n title: file.name,\n type: RecordingAttachmentType.VOICE_RECORDING,\n waveform_data: resampleWaveformData(\n this.amplitudeRecorder?.amplitudes.value ?? [],\n this.amplitudeRecorderConfig.sampleCount,\n ),\n } as LocalVoiceRecordingAttachment;\n };\n\n handleErrorEvent = (e: Event) => {\n const { error } = e as ErrorEvent;\n logError(error);\n this.error.next(error);\n this.notification.next({\n text: this.t('An error has occurred during recording'),\n type: 'error',\n });\n };\n\n handleDataavailableEvent = async (e: BlobEvent) => {\n if (!e.data.size) return;\n if (this.mediaType !== 'audio') return;\n try {\n this.recordedData.push(e.data);\n const recording = await this.makeVoiceRecording();\n if (!recording) return;\n this.signalRecordingReady?.(recording);\n this.recording.next(recording);\n } catch (e) {\n logError(e as Error);\n this.error.next(e as Error);\n this.notification.next({\n text: this.t('An error has occurred during the recording processing'),\n type: 'error',\n });\n }\n };\n\n resetRecordingState = () => {\n this.recordedData = [];\n this.recording.next(undefined);\n this.recordingState.next(undefined);\n this.recordedChunkDurations = [];\n this.startTime = undefined;\n };\n\n cleanUp = () => {\n this.resetRecordingState();\n if (this.recordingUri) URL.revokeObjectURL(this.recordingUri);\n this.amplitudeRecorder?.close();\n if (this.mediaRecorder) {\n disposeOfMediaStream(this.mediaRecorder.stream);\n this.mediaRecorder.removeEventListener(\n 'dataavailable',\n this.handleDataavailableEvent,\n );\n this.mediaRecorder.removeEventListener('error', this.handleErrorEvent);\n }\n };\n\n start = async () => {\n if (\n [MediaRecordingState.RECORDING, MediaRecordingState.PAUSED].includes(\n this.recordingState.value as MediaRecordingState,\n )\n ) {\n const error = new Error('Cannot start recording. Recording already in progress');\n logError(error);\n this.error.next(error);\n return;\n }\n\n // account for requirement on iOS as per this bug report: https://bugs.webkit.org/show_bug.cgi?id=252303\n if (!navigator.mediaDevices) {\n const error = new Error('Media recording is not supported');\n logError(error);\n this.error.next(error);\n this.notification.next({ text: this.t('Error starting recording'), type: 'error' });\n return;\n }\n\n if (this.mediaType === 'video') {\n const error = new Error(\n `Video recording is not supported. Provided MIME type: ${this.mediaRecorderConfig.mimeType}`,\n );\n logError(error);\n this.error.next(error);\n this.notification.next({ text: this.t('Error starting recording'), type: 'error' });\n return;\n }\n\n if (!this.permission.state.value) {\n await this.permission.check();\n }\n\n if (this.permission.state.value === 'denied') {\n logError(new Error('Permission denied'));\n return;\n }\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n this.mediaRecorder = new MediaRecorder(stream, this.mediaRecorderConfig);\n\n this.mediaRecorder.addEventListener('dataavailable', this.handleDataavailableEvent);\n this.mediaRecorder.addEventListener('error', this.handleErrorEvent);\n\n this.startTime = new Date().getTime();\n this.mediaRecorder.start();\n\n if (this.mediaType === 'audio' && stream) {\n this.amplitudeRecorder = new AmplitudeRecorder({\n config: this.amplitudeRecorderConfig,\n stream,\n });\n this.amplitudeRecorder.start();\n }\n\n this.recordingState.next(MediaRecordingState.RECORDING);\n } catch (error) {\n logError(error as Error);\n this.cancel();\n this.error.next(error as Error);\n this.notification.next({ text: this.t('Error starting recording'), type: 'error' });\n }\n };\n\n pause = () => {\n if (this.recordingState.value !== MediaRecordingState.RECORDING) return;\n if (this.startTime) {\n this.recordedChunkDurations.push(new Date().getTime() - this.startTime);\n this.startTime = undefined;\n }\n this.mediaRecorder?.pause();\n // Flush current chunk so preview is available while paused.\n this.mediaRecorder?.requestData();\n this.amplitudeRecorder?.stop();\n this.recordingState.next(MediaRecordingState.PAUSED);\n };\n\n resume = () => {\n if (this.recordingState.value !== MediaRecordingState.PAUSED) return;\n this.startTime = new Date().getTime();\n this.mediaRecorder?.resume();\n this.amplitudeRecorder?.start();\n this.recordingState.next(MediaRecordingState.RECORDING);\n };\n\n stop = () => {\n const recording = this.recording.value;\n if (recording && this.mediaRecorder?.state === 'inactive')\n return Promise.resolve(recording);\n\n if (\n ![MediaRecordingState.PAUSED, MediaRecordingState.RECORDING].includes(\n (this.mediaRecorder?.state || '') as MediaRecordingState,\n )\n )\n return Promise.resolve(undefined);\n\n if (this.startTime) {\n this.recordedChunkDurations.push(new Date().getTime() - this.startTime);\n this.startTime = undefined;\n }\n const result = new Promise<LocalVoiceRecordingAttachment>((res) => {\n this.signalRecordingReady = res;\n });\n this.mediaRecorder?.stop();\n this.amplitudeRecorder?.stop();\n this.recordingState.next(MediaRecordingState.STOPPED);\n return result;\n };\n\n cancel = () => {\n this.stop();\n this.cleanUp();\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { MediaRecorderController } from '../classes';\nimport { useTranslationContext } from '../../../context';\nimport { useMessageComposerController } from '../../MessageComposer/hooks/useMessageComposerController';\n\nimport type { LocalVoiceRecordingAttachment } from 'stream-chat';\nimport type { CustomAudioRecordingConfig, MediaRecordingState } from '../classes';\nimport type { MessageComposerContextValue } from '../../../context';\n\nexport type RecordingController = {\n completeRecording: () => void;\n permissionState?: PermissionState;\n recorder?: MediaRecorderController;\n recording?: LocalVoiceRecordingAttachment;\n recordingState?: MediaRecordingState;\n};\n\ntype UseMediaRecorderParams = Pick<\n MessageComposerContextValue,\n 'asyncMessagesMultiSendEnabled' | 'handleSubmit'\n> & {\n enabled: boolean;\n generateRecordingTitle?: (mimeType: string) => string;\n recordingConfig?: CustomAudioRecordingConfig;\n};\n\nexport const useMediaRecorder = ({\n asyncMessagesMultiSendEnabled,\n enabled,\n generateRecordingTitle,\n handleSubmit,\n recordingConfig,\n}: UseMediaRecorderParams): RecordingController => {\n const { t } = useTranslationContext('useMediaRecorder');\n const messageComposer = useMessageComposerController();\n const [recording, setRecording] = useState<LocalVoiceRecordingAttachment>();\n const [recordingState, setRecordingState] = useState<MediaRecordingState>();\n const [permissionState, setPermissionState] = useState<PermissionState>();\n const [isScheduledForSubmit, scheduleForSubmit] = useState(false);\n\n const recorder = useMemo(\n () =>\n enabled\n ? new MediaRecorderController({\n config: recordingConfig ?? {},\n generateRecordingTitle,\n t,\n })\n : undefined,\n [recordingConfig, enabled, generateRecordingTitle, t],\n );\n\n const completeRecording = useCallback(async () => {\n if (!recorder) return;\n const recording = await recorder.stop();\n if (!recording) return;\n await messageComposer.attachmentManager.uploadAttachment(recording);\n if (!asyncMessagesMultiSendEnabled) {\n // FIXME: cannot call handleSubmit() directly as the function has stale reference to attachments\n scheduleForSubmit(true);\n }\n recorder.cleanUp();\n }, [asyncMessagesMultiSendEnabled, messageComposer, recorder]);\n\n useEffect(() => {\n if (!isScheduledForSubmit) return;\n handleSubmit();\n scheduleForSubmit(false);\n }, [handleSubmit, isScheduledForSubmit]);\n\n useEffect(() => {\n if (!recorder) return;\n recorder.permission.watch();\n const recordingSubscription = recorder.recording.subscribe(setRecording);\n const recordingStateSubscription =\n recorder.recordingState.subscribe(setRecordingState);\n const permissionStateSubscription =\n recorder.permission.state.subscribe(setPermissionState);\n\n return () => {\n recorder.cancel();\n recorder.permission.unwatch();\n recordingSubscription.unsubscribe();\n recordingStateSubscription.unsubscribe();\n permissionStateSubscription.unsubscribe();\n };\n }, [recorder]);\n\n return {\n completeRecording,\n permissionState,\n recorder,\n recording,\n recordingState,\n };\n};\n","import type React from 'react';\nimport { useTextareaRef } from './useTextareaRef';\nimport { useSubmitHandler } from './useSubmitHandler';\nimport { usePasteHandler } from './usePasteHandler';\nimport type { RecordingController } from '../../MediaRecorder/hooks/useMediaRecorder';\nimport { useMediaRecorder } from '../../MediaRecorder/hooks/useMediaRecorder';\nimport type { MessageComposerProps } from '../MessageComposer';\n\nexport type UseMessageComposerBindingsParams = {\n handleSubmit: (event?: React.BaseSyntheticEvent) => void;\n onPaste: (event: React.ClipboardEvent<HTMLTextAreaElement>) => void;\n recordingController: RecordingController;\n textareaRef: React.RefObject<HTMLTextAreaElement | null | undefined>;\n};\n\nexport const useMessageComposerBindings = (\n props: MessageComposerProps,\n): UseMessageComposerBindingsParams => {\n const { asyncMessagesMultiSendEnabled, audioRecordingConfig, audioRecordingEnabled } =\n props;\n\n const { textareaRef } = useTextareaRef(props);\n\n const { handleSubmit } = useSubmitHandler(props);\n\n const recordingController = useMediaRecorder({\n asyncMessagesMultiSendEnabled,\n enabled: !!audioRecordingEnabled,\n handleSubmit,\n recordingConfig: audioRecordingConfig,\n });\n\n const { onPaste } = usePasteHandler();\n\n return {\n handleSubmit,\n onPaste,\n recordingController,\n textareaRef,\n };\n};\n","import { useMessageComposerController } from './useMessageComposerController';\nimport { useStateStore } from '../../../store';\nimport type { EditingAuditState } from 'stream-chat';\n\nconst editingAuditStateStateSelector = (state: EditingAuditState) => state;\n\nexport const useMessageComposerHasSendableData = () => {\n const messageComposer = useMessageComposerController();\n useStateStore(messageComposer.editingAuditState, editingAuditStateStateSelector);\n return messageComposer.hasSendableData;\n};\n","import type { EditingAuditState } from 'stream-chat';\nimport { useMessageComposerController } from './useMessageComposerController';\nimport { useStateStore } from '../../../store';\n\nconst editingAuditStateStateSelector = (state: EditingAuditState) => state;\n\nexport const useMessageContentIsEmpty = () => {\n const messageComposer = useMessageComposerController();\n useStateStore(messageComposer.editingAuditState, editingAuditStateStateSelector);\n return messageComposer.contentIsEmpty;\n};\n","import clsx from 'clsx';\nimport { IconCrossSmall } from '../Icons';\nimport { Button } from '../Button';\nimport React, { type ComponentProps } from 'react';\nimport { useTranslationContext } from '../../context';\nimport type { AttachmentLoadingState } from 'stream-chat';\n\nexport const RemoveAttachmentPreviewButton = ({\n className,\n uploadState,\n ...props\n}: ComponentProps<'button'> & {\n uploadState?: AttachmentLoadingState;\n}) => {\n const { t } = useTranslationContext();\n return (\n <Button\n aria-label={t('aria/Remove attachment')}\n circular\n className={clsx('str-chat__attachment-preview__remove-button', className)}\n data-testid='preview-item-delete-button'\n disabled={uploadState === 'uploading'}\n {...props}\n >\n <IconCrossSmall />\n </Button>\n );\n};\n","import React from 'react';\nimport clsx from 'clsx';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { IconImages1Alt } from '../Icons';\n\nexport type ImagePlaceholderProps = {\n className?: string;\n};\n\nexport const ImagePlaceholder = ({ className }: ImagePlaceholderProps) => {\n const { t } = useTranslationContext();\n return (\n <div\n aria-label={t('aria/Image failed to load')}\n className={clsx('str-chat__image-placeholder', className)}\n data-testid='str-chat__base-image-placeholder'\n role='img'\n >\n <IconImages1Alt />\n </div>\n );\n};\n","import React, { forwardRef, useEffect, useMemo, useState } from 'react';\nimport clsx from 'clsx';\nimport { useComponentContext } from '../../context/ComponentContext';\nimport { DownloadButton } from '../Attachment';\nimport { ImagePlaceholder as DefaultImagePlaceholder } from './ImagePlaceholder';\nimport { sanitizeUrl } from '@braintree/sanitize-url';\n\nexport type BaseImageProps = React.ComponentPropsWithRef<'img'> & {\n showDownloadButtonOnError?: boolean;\n};\n\nexport const BaseImage = forwardRef<HTMLImageElement, BaseImageProps>(function BaseImage(\n { src, ...props },\n ref,\n) {\n const {\n alt: propsAlt,\n className: propsClassName,\n onError: propsOnError,\n showDownloadButtonOnError = false,\n ...imgProps\n } = props;\n const [error, setError] = useState(false);\n const { ImagePlaceholder: ImagePlaceholderComponent = DefaultImagePlaceholder } =\n useComponentContext();\n\n const sanitizedUrl = useMemo(() => sanitizeUrl(src), [src]);\n useEffect(\n () => () => {\n setError(false);\n },\n [sanitizedUrl],\n );\n\n if (error) {\n return (\n <>\n <ImagePlaceholderComponent\n className={clsx(propsClassName, 'str-chat__base-image--load-failed')}\n />\n {showDownloadButtonOnError && <DownloadButton assetUrl={sanitizedUrl} />}\n </>\n );\n }\n\n return (\n <img\n data-testid='str-chat__base-image'\n {...imgProps}\n alt={propsAlt}\n className={clsx(propsClassName, 'str-chat__base-image')}\n onError={(e) => {\n setError(true);\n propsOnError?.(e);\n }}\n ref={ref}\n src={sanitizedUrl}\n />\n );\n});\n","import {\n type Attachment,\n isGiphyAttachment,\n isImageAttachment,\n isLocalImageAttachment,\n isLocalVideoAttachment,\n isScrapedContent,\n isVideoAttachment,\n type LinkPreview,\n type LocalImageAttachment,\n type LocalVideoAttachment,\n} from 'stream-chat';\nimport type { Dimensions } from '../../types/types';\n\ntype AttachmentPreviewableInGallery =\n | LocalImageAttachment\n | LocalVideoAttachment\n | LinkPreview\n | Attachment;\n\n/** Fields shared with gallery items for image/video preview from an attachment. */\nexport type BaseImageDescriptor = {\n alt?: string;\n dimensions?: Dimensions;\n imageUrl?: string;\n title?: string;\n videoThumbnailUrl?: string;\n videoUrl?: string;\n};\n\n/**\n * Maps an attachment (or link preview) to image/video URLs and metadata for {@link BaseImage} or the gallery.\n */\nexport const toBaseImageDescriptors = (\n attachment: AttachmentPreviewableInGallery,\n options: { giphyVersionName?: string } = {},\n): BaseImageDescriptor | void => {\n if (isGiphyAttachment(attachment)) {\n const giphyVersion =\n options?.giphyVersionName && attachment.giphy\n ? attachment.giphy[\n options.giphyVersionName as keyof NonNullable<Attachment['giphy']>\n ]\n : undefined;\n\n return {\n alt: giphyVersion?.url || attachment.thumb_url,\n dimensions: giphyVersion\n ? {\n height: giphyVersion.height,\n width: giphyVersion.width,\n }\n : undefined,\n imageUrl: attachment.thumb_url,\n title: attachment.title || attachment.thumb_url,\n };\n }\n\n if (isScrapedContent(attachment)) {\n const imageUrl = attachment.image_url || attachment.thumb_url;\n return {\n alt: attachment.title || imageUrl,\n imageUrl,\n title: attachment.title,\n };\n }\n\n if (isLocalVideoAttachment(attachment)) {\n return {\n title: attachment.title,\n videoThumbnailUrl: attachment.thumb_url ?? attachment.localMetadata.previewUri,\n videoUrl: attachment.asset_url ?? attachment.localMetadata.previewUri,\n };\n }\n\n if (isVideoAttachment(attachment)) {\n return {\n title: attachment.title,\n videoThumbnailUrl: attachment.thumb_url,\n videoUrl: attachment.asset_url,\n };\n }\n\n if (isLocalImageAttachment(attachment)) {\n const imageUrl = attachment.image_url || attachment.localMetadata.previewUri;\n return {\n alt: attachment.title || imageUrl,\n imageUrl,\n title: attachment.title,\n };\n }\n\n if (isImageAttachment(attachment)) {\n const imageUrl = attachment.image_url;\n return {\n alt: attachment.title || imageUrl,\n imageUrl,\n title: attachment.title,\n };\n }\n};\n","import type { ComponentPropsWithoutRef } from 'react';\nimport React from 'react';\nimport clsx from 'clsx';\n\nexport const BASE_FILE_ICON_CLASSNAME = 'str-chat__file-icon' as const;\nexport const FILE_ICON_GRAPHIC_CLASSNAME = 'str-chat__file-icon__graphic' as const;\n/** Add this class (e.g. via className) when hiding the label with CSS to center the icon graphic. */\nexport const FILE_ICON_NO_LABEL_CLASSNAME = 'str-chat__file-icon--no-label' as const;\n\nexport type FileIconSize = 'sm' | 'md' | 'lg';\n\nexport type FileIconSizeConfigEntry = {\n width: number;\n height: number;\n labelX: number;\n labelY: number;\n};\n\n/** Rendered dimensions (px) and label position in viewBox coords for consistent spacing. */\nexport const FILE_ICON_SIZE_CONFIG: Record<FileIconSize, FileIconSizeConfigEntry> = {\n lg: { height: 48, labelX: 16, labelY: 36, width: 40 },\n md: { height: 40, labelX: 16, labelY: 35, width: 32 },\n sm: { height: 24, labelX: 16, labelY: 31.5, width: 19 },\n};\n\n/** Merge partial overrides with default config. Use for Chat-level fileIconSizeConfig. */\nexport const mergeFileIconSizeConfig = (\n overrides?: Partial<Record<FileIconSize, Partial<FileIconSizeConfigEntry>>>,\n): Record<FileIconSize, FileIconSizeConfigEntry> => {\n if (!overrides) return FILE_ICON_SIZE_CONFIG;\n return (['sm', 'md', 'lg'] as const).reduce(\n (acc, size) => ({\n ...acc,\n [size]: { ...FILE_ICON_SIZE_CONFIG[size], ...overrides[size] },\n }),\n {} as Record<FileIconSize, FileIconSizeConfigEntry>,\n );\n};\n\nconst VIEWBOX_WIDTH = 32;\nconst VIEWBOX_HEIGHT = 40;\n\nexport type BaseFileIconProps = {\n label?: string;\n /** Resolved size config (defaults from FILE_ICON_SIZE_CONFIG when omitted). Pass sizeConfig on FileIcon or use AttachmentFileIcon to override. */\n sizeConfig?: Record<FileIconSize, FileIconSizeConfigEntry>;\n size?: FileIconSize;\n} & ComponentPropsWithoutRef<'svg'>;\n\ntype SvgProps = Omit<BaseFileIconProps, 'label'>;\n\nconst Svg = ({ className, size, sizeConfig, ...props }: SvgProps) => {\n const config = sizeConfig ?? FILE_ICON_SIZE_CONFIG;\n const dimensions = size ? config[size] : undefined;\n return (\n <svg\n height={dimensions?.height}\n viewBox={`0 0 ${VIEWBOX_WIDTH} ${VIEWBOX_HEIGHT}`}\n width={dimensions?.width}\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n className={clsx(\n BASE_FILE_ICON_CLASSNAME,\n { [`${BASE_FILE_ICON_CLASSNAME}--size-${size}`]: size },\n className,\n )}\n />\n );\n};\n\ntype FileIconLabelProps = {\n label?: string;\n size?: FileIconSize;\n sizeConfig?: Record<FileIconSize, FileIconSizeConfigEntry>;\n};\n\nconst FileIconLabel = ({ label, size, sizeConfig }: FileIconLabelProps) => {\n const configMap = sizeConfig ?? FILE_ICON_SIZE_CONFIG;\n const config = size ? configMap[size] : { labelX: 16, labelY: 33 };\n return (\n <text className='str-chat__file-icon__label' x={config.labelX} y={config.labelY}>\n {label}\n </text>\n );\n};\n\nexport const FilePdfIcon = ({\n className,\n ...props\n}: Omit<BaseFileIconProps, 'label'>) => (\n <Svg\n {...props}\n className={clsx('str-chat__file-icon--pdf', FILE_ICON_NO_LABEL_CLASSNAME, className)}\n >\n <g className={FILE_ICON_GRAPHIC_CLASSNAME}>\n <path\n d='M0 4C0 1.79086 1.79086 0 4 0H22.4L32 10V36C32 38.2091 30.2091 40 28 40H4C1.79086 40 0 38.2091 0 36V4Z'\n fill='#E71A01'\n />\n <path\n d='M32 10H25.4C23.7431 10 22.4 8.65685 22.4 7V0L32 10Z'\n fill='white'\n opacity='0.5'\n />\n <g clipPath='url(#clip0_1008_7871)'>\n <path\n d='M23.7533 19.2C23.28 18.7033 22.3093 18.42 20.9373 18.42C20.204 18.42 19.3526 18.4906 18.43 18.656C17.8647 18.1124 17.3499 17.5186 16.892 16.882C16.5373 16.4086 16.2293 15.8886 15.9453 15.3913C16.49 13.7353 16.75 12.3866 16.75 11.4166C16.75 10.3286 16.348 9.19263 15.1886 9.19263C14.834 9.19263 14.4786 9.40596 14.2893 9.71329C13.7693 10.636 14.006 12.6466 14.9046 14.634C14.5664 15.6502 14.1877 16.6526 13.7693 17.6386C13.3906 18.538 12.9646 19.4606 12.4913 20.312C9.88931 21.3533 8.20931 22.56 8.01998 23.5053C7.94931 23.8606 8.06731 24.192 8.32798 24.452C8.42265 24.5233 8.75398 24.8073 9.32131 24.8073C11.048 24.8073 12.87 22.0153 13.7926 20.336C14.5026 20.0993 15.2126 19.8626 15.922 19.6733C16.6704 19.4701 17.4284 19.3043 18.1933 19.1766C20.0146 20.8086 21.6233 21.0693 22.428 21.0693C23.4213 21.0693 23.7766 20.6666 23.8946 20.336C24.108 19.9093 23.966 19.4366 23.7533 19.2ZM22.8066 19.8866C22.7353 20.2413 22.38 20.478 21.884 20.478C21.742 20.478 21.624 20.454 21.4813 20.4306C20.5826 20.2173 19.7306 19.768 18.8793 19.058C19.5357 18.947 20.2003 18.8917 20.866 18.8926C21.3633 18.8926 21.7893 18.916 22.0726 18.9873C22.404 19.058 22.9246 19.2713 22.806 19.886L22.8066 19.8866ZM17.7906 18.7746C17.1305 18.8983 16.4755 19.0482 15.8273 19.224C15.262 19.3709 14.7017 19.5366 14.1473 19.7206C14.4355 19.1625 14.7039 18.5944 14.952 18.0173C15.236 17.3546 15.472 16.6686 15.7093 16.03C15.9453 16.432 16.206 16.8346 16.466 17.1893C16.8911 17.7313 17.3329 18.26 17.7906 18.7746ZM14.692 9.97329C14.7338 9.88949 14.7978 9.81875 14.877 9.7688C14.9563 9.71884 15.0477 9.69157 15.1413 9.68996C15.638 9.68996 15.7326 10.2573 15.7326 10.7073C15.7326 11.464 15.496 12.6233 15.094 13.948C14.4073 12.1026 14.3606 10.5653 14.692 9.97329ZM12.0893 20.998C10.8826 22.9853 9.72331 24.2153 9.01398 24.2153C8.88599 24.2161 8.76132 24.1746 8.65931 24.0973C8.51731 23.9553 8.44598 23.79 8.49331 23.6006C8.63531 22.8906 10.0073 21.8973 12.0893 20.998Z'\n fill='white'\n />\n </g>\n <path\n d='M9.74219 34.4258V28.6992H10.8828V29.3633H10.9531C11.0286 29.2096 11.1276 29.0781 11.25 28.9688C11.375 28.8594 11.5208 28.776 11.6875 28.7188C11.8542 28.6589 12.0391 28.6289 12.2422 28.6289C12.6016 28.6289 12.9115 28.7188 13.1719 28.8984C13.4323 29.0781 13.6328 29.3333 13.7734 29.6641C13.9167 29.9922 13.9883 30.3854 13.9883 30.8438V30.8516C13.9883 31.3125 13.918 31.7083 13.7773 32.0391C13.6367 32.3698 13.4362 32.6237 13.1758 32.8008C12.9154 32.9779 12.6042 33.0664 12.2422 33.0664C12.0443 33.0664 11.8607 33.0365 11.6914 32.9766C11.5247 32.9141 11.3776 32.8268 11.25 32.7148C11.125 32.6029 11.026 32.4688 10.9531 32.3125H10.8828V34.4258H9.74219ZM11.8516 32.1211C12.0547 32.1211 12.2279 32.0703 12.3711 31.9688C12.5169 31.8672 12.6289 31.7214 12.707 31.5312C12.7878 31.3411 12.8281 31.1146 12.8281 30.8516V30.8438C12.8281 30.5807 12.7878 30.3542 12.707 30.1641C12.6289 29.974 12.5169 29.8281 12.3711 29.7266C12.2279 29.625 12.0547 29.5742 11.8516 29.5742C11.651 29.5742 11.4766 29.625 11.3281 29.7266C11.1823 29.8281 11.069 29.974 10.9883 30.1641C10.9102 30.3516 10.8711 30.5781 10.8711 30.8438V30.8516C10.8711 31.112 10.9115 31.3385 10.9922 31.5312C11.0729 31.7214 11.1862 31.8672 11.332 31.9688C11.4805 32.0703 11.6536 32.1211 11.8516 32.1211ZM16.457 33.0664C16.1003 33.0664 15.7904 32.9779 15.5273 32.8008C15.2669 32.6211 15.0651 32.3659 14.9219 32.0352C14.7812 31.7044 14.7109 31.3099 14.7109 30.8516V30.8438C14.7109 30.3828 14.7799 29.987 14.918 29.6562C15.0586 29.3255 15.2591 29.0716 15.5195 28.8945C15.7799 28.7174 16.0924 28.6289 16.457 28.6289C16.6523 28.6289 16.8333 28.6602 17 28.7227C17.1693 28.7826 17.3177 28.8685 17.4453 28.9805C17.5729 29.0924 17.6719 29.2279 17.7422 29.3867H17.8125V27.0547H18.9531V33H17.8125V32.332H17.7422C17.6693 32.4857 17.5703 32.6172 17.4453 32.7266C17.3229 32.8359 17.1784 32.9206 17.0117 32.9805C16.8451 33.0378 16.6602 33.0664 16.457 33.0664ZM16.8438 32.1211C17.0469 32.1211 17.2214 32.0703 17.3672 31.9688C17.513 31.8672 17.625 31.7214 17.7031 31.5312C17.7839 31.3411 17.8242 31.1159 17.8242 30.8555V30.8477C17.8242 30.582 17.7839 30.3555 17.7031 30.168C17.625 29.9779 17.5117 29.832 17.3633 29.7305C17.2174 29.6263 17.0443 29.5742 16.8438 29.5742C16.6458 29.5742 16.4727 29.6263 16.3242 29.7305C16.1784 29.832 16.0664 29.9779 15.9883 30.168C15.9102 30.3555 15.8711 30.5807 15.8711 30.8438V30.8516C15.8711 31.1146 15.9102 31.3411 15.9883 31.5312C16.0664 31.7214 16.1784 31.8672 16.3242 31.9688C16.4701 32.0703 16.6432 32.1211 16.8438 32.1211ZM20.4648 33V29.5586H19.7695V28.6992H20.4648V28.2969C20.4648 28.0104 20.5156 27.7721 20.6172 27.582C20.7188 27.3919 20.8776 27.25 21.0938 27.1562C21.3125 27.0599 21.5951 27.0117 21.9414 27.0117C22.0586 27.0117 22.1641 27.0156 22.2578 27.0234C22.3542 27.0312 22.444 27.0417 22.5273 27.0547V27.8164C22.4909 27.8086 22.4427 27.8034 22.3828 27.8008C22.3255 27.7956 22.2604 27.793 22.1875 27.793C21.9661 27.793 21.8099 27.8438 21.7188 27.9453C21.6276 28.0443 21.582 28.1875 21.582 28.375V28.6992H22.4922V29.5586H21.6055V33H20.4648Z'\n fill='white'\n />\n <defs>\n <clipPath id='clip0_1008_7871'>\n <rect fill='white' height='16' transform='translate(8 9)' width='16' />\n </clipPath>\n </defs>\n </g>\n </Svg>\n);\n\nexport const FileWordIcon = ({\n className,\n label = 'doc',\n size,\n sizeConfig,\n ...props\n}: BaseFileIconProps) => (\n <Svg\n {...props}\n className={clsx(\n 'str-chat__file-icon--doc',\n !label && FILE_ICON_NO_LABEL_CLASSNAME,\n className,\n )}\n size={size}\n sizeConfig={sizeConfig}\n >\n <g className={FILE_ICON_GRAPHIC_CLASSNAME}>\n <path\n d='M0 4C0 1.79086 1.79086 0 4 0H22.4L32 10V36C32 38.2091 30.2091 40 28 40H4C1.79086 40 0 38.2091 0 36V4Z'\n fill='#3375E2'\n />\n <path\n d='M32 10H25.4C23.7431 10 22.4 8.65685 22.4 7V0L32 10Z'\n fill='white'\n opacity='0.5'\n />\n <rect fill='white' height='1.6' rx='0.8' width='14.4' x='8' y='12.2' />\n <rect fill='white' height='1.6' rx='0.8' width='14.4' x='8' y='20.2' />\n <rect fill='white' height='1.6' rx='0.8' width='9.6' x='8' y='16.2' />\n </g>\n <FileIconLabel label={label} size={size} sizeConfig={sizeConfig} />\n </Svg>\n);\n\nexport const FilePowerPointIcon = ({\n className,\n label = 'ppt',\n size,\n sizeConfig,\n ...props\n}: BaseFileIconProps) => (\n <Svg\n {...props}\n className={clsx(\n 'str-chat__file-icon--ppt',\n !label && FILE_ICON_NO_LABEL_CLASSNAME,\n className,\n )}\n size={size}\n sizeConfig={sizeConfig}\n >\n <g className={FILE_ICON_GRAPHIC_CLASSNAME}>\n <path\n d='M0 4C0 1.79086 1.79086 0 4 0H22.4L32 10V36C32 38.2091 30.2091 40 28 40H4C1.79086 40 0 38.2091 0 36V4Z'\n fill='#D14423'\n />\n <path\n d='M32 10H25.4C23.7431 10 22.4 8.65685 22.4 7V0L32 10Z'\n fill='white'\n opacity='0.5'\n />\n <path\n d='M11.1666 11.5H20.8333M11.1666 21.8333C10.4303 21.8333 9.83331 21.2364 9.83331 20.5V14.8333C9.83331 14.097 10.4303 13.5 11.1666 13.5H20.8333C21.5697 13.5 22.1666 14.097 22.1666 14.8333V20.5C22.1666 21.2364 21.5697 21.8333 20.8333 21.8333H11.1666Z'\n stroke='white'\n strokeLinecap='round'\n strokeLinejoin='round'\n strokeWidth='1.2'\n />\n </g>\n <FileIconLabel label={label} size={size} sizeConfig={sizeConfig} />\n </Svg>\n);\n\nexport const FileExcelIcon = ({\n className = '',\n label = 'xls',\n size,\n sizeConfig,\n ...props\n}: BaseFileIconProps) => (\n <Svg\n {...props}\n className={clsx(\n 'str-chat__file-icon--xls',\n !label && FILE_ICON_NO_LABEL_CLASSNAME,\n className,\n )}\n size={size}\n sizeConfig={sizeConfig}\n >\n <g className={FILE_ICON_GRAPHIC_CLASSNAME}>\n <path\n d='M0 4C0 1.79086 1.79086 0 4 0H22.4L32 10V36C32 38.2091 30.2091 40 28 40H4C1.79086 40 0 38.2091 0 36V4Z'\n fill='#0C864B'\n />\n <path\n d='M15 11.5V11H14V11.5H15ZM14 22.5V23H15V22.5H14ZM10.5 15H10V16H10.5V15ZM21.5 16H22V15H21.5V16ZM21 13.6333V20.3667H22V13.6333H21ZM19.3667 22H12.6333V23H19.3667V22ZM11 20.3667V13.6333H10V20.3667H11ZM12.6333 12H19.3667V11H12.6333V12ZM12.6333 22C12.2517 22 11.9956 21.9996 11.7983 21.9835C11.6069 21.9679 11.5154 21.9399 11.455 21.9092L11.001 22.8002C11.2259 22.9147 11.4636 22.9595 11.7169 22.9802C11.9643 23.0004 12.2682 23 12.6333 23V22ZM10 20.3667C10 20.7318 9.99961 21.0357 10.0198 21.2831C10.0405 21.5364 10.0853 21.7741 10.1998 21.999L11.0908 21.545C11.0601 21.4846 11.0321 21.3931 11.0165 21.2017C11.0004 21.0044 11 20.7483 11 20.3667H10ZM11.455 21.9092C11.2982 21.8293 11.1707 21.7018 11.0908 21.545L10.1998 21.999C10.3756 22.3439 10.6561 22.6244 11.001 22.8002L11.455 21.9092ZM21 20.3667C21 20.7483 20.9996 21.0044 20.9835 21.2017C20.9679 21.3931 20.9399 21.4846 20.9092 21.545L21.8002 21.999C21.9147 21.7741 21.9595 21.5364 21.9802 21.2831C22.0004 21.0357 22 20.7318 22 20.3667H21ZM19.3667 23C19.7318 23 20.0357 23.0004 20.2831 22.9802C20.5364 22.9595 20.7741 22.9147 20.999 22.8002L20.545 21.9092C20.4846 21.9399 20.3931 21.9679 20.2017 21.9835C20.0044 21.9996 19.7483 22 19.3667 22V23ZM20.9092 21.545C20.8293 21.7018 20.7018 21.8293 20.545 21.9092L20.999 22.8002C21.3439 22.6244 21.6244 22.3439 21.8002 21.999L20.9092 21.545ZM22 13.6333C22 13.2682 22.0004 12.9643 21.9802 12.7169C21.9595 12.4636 21.9147 12.2259 21.8002 12.001L20.9092 12.455C20.9399 12.5154 20.9679 12.6069 20.9835 12.7983C20.9996 12.9956 21 13.2517 21 13.6333H22ZM19.3667 12C19.7483 12 20.0044 12.0004 20.2017 12.0165C20.3931 12.0321 20.4846 12.0601 20.545 12.0908L20.999 11.1998C20.7741 11.0853 20.5364 11.0405 20.2831 11.0198C20.0357 10.9996 19.7318 11 19.3667 11V12ZM21.8002 12.001C21.6244 11.6561 21.3439 11.3756 20.999 11.1998L20.545 12.0908C20.7018 12.1707 20.8293 12.2982 20.9092 12.455L21.8002 12.001ZM11 13.6333C11 13.2517 11.0004 12.9956 11.0165 12.7983C11.0321 12.6069 11.0601 12.5154 11.0908 12.455L10.1998 12.001C10.0853 12.2259 10.0405 12.4636 10.0198 12.7169C9.99961 12.9643 10 13.2682 10 13.6333H11ZM12.6333 11C12.2682 11 11.9643 10.9996 11.7169 11.0198C11.4636 11.0405 11.2259 11.0853 11.001 11.1998L11.455 12.0908C11.5154 12.0601 11.6069 12.0321 11.7983 12.0165C11.9956 12.0004 12.2517 12 12.6333 12V11ZM11.0908 12.455C11.1707 12.2982 11.2982 12.1707 11.455 12.0908L11.001 11.1998C10.6561 11.3756 10.3756 11.6561 10.1998 12.001L11.0908 12.455ZM14 11.5V15.5H15V11.5H14ZM14 15.5V22.5H15V15.5H14ZM10.5 16H14.5V15H10.5V16ZM14.5 16H21.5V15H14.5V16Z'\n fill='white'\n />\n <path\n d='M32 10H25.4C23.7431 10 22.4 8.65685 22.4 7V0L32 10Z'\n fill='white'\n opacity='0.5'\n />\n </g>\n <FileIconLabel label={label} size={size} sizeConfig={sizeConfig} />\n </Svg>\n);\n\nexport const FileArchiveIcon = ({\n className = '',\n label = '',\n size,\n sizeConfig,\n ...props\n}: BaseFileIconProps) => (\n <Svg\n {...props}\n className={clsx(\n 'str-chat__file-icon--compressed',\n !label && FILE_ICON_NO_LABEL_CLASSNAME,\n className,\n )}\n size={size}\n sizeConfig={sizeConfig}\n >\n <g className={FILE_ICON_GRAPHIC_CLASSNAME}>\n <path\n d='M0 4C0 1.79086 1.79086 0 4 0H22.4L32 10V36C32 38.2091 30.2091 40 28 40H4C1.79086 40 0 38.2091 0 36V4Z'\n fill='#E59E34'\n />\n <path\n clipRule='evenodd'\n d='M9.41177 0H7.52942V2H9.41177V4H7.52942V6H9.41177V8H7.52942V10H9.41177V12H7.52942V14H9.41177V12H11.2941V10H9.41177V8H11.2941V6H9.41177V4H11.2941V2H9.41177V0ZM7.52942 17C7.52942 16.4477 7.9508 16 8.4706 16H10.3529C10.8727 16 11.2941 16.4477 11.2941 17V23C11.2941 23.5523 10.8727 24 10.3529 24H8.4706C7.9508 24 7.52942 23.5523 7.52942 23V17ZM8.4706 23V20H10.3529V23H8.4706Z'\n fill='white'\n fillRule='evenodd'\n />\n <path\n d='M32 10H25.4C23.7431 10 22.4 8.65685 22.4 7V0L32 10Z'\n fill='white'\n opacity='0.5'\n />\n </g>\n <FileIconLabel label={label} size={size} sizeConfig={sizeConfig} />\n </Svg>\n);\n\nexport const FileCodeIcon = ({\n className = '',\n label = 'code',\n size,\n sizeConfig,\n ...props\n}: BaseFileIconProps) => (\n <Svg\n {...props}\n className={clsx(\n 'str-chat__file-icon--code',\n !label && FILE_ICON_NO_LABEL_CLASSNAME,\n className,\n )}\n size={size}\n sizeConfig={sizeConfig}\n >\n <g className={FILE_ICON_GRAPHIC_CLASSNAME}>\n <path\n d='M0 4C0 1.79086 1.79086 0 4 0H22.4L32 10V36C32 38.2091 30.2091 40 28 40H4C1.79086 40 0 38.2091 0 36V4Z'\n fill='#00ACA1'\n />\n <path\n d='M14.8333 15L13.3047 16.5286C13.0444 16.7889 13.0444 17.2111 13.3047 17.4714L14.8333 19M17.1667 15L18.6953 16.5286C18.9556 16.7889 18.9556 17.2111 18.6953 17.4714L17.1667 19M11.8333 22.5H20.1667C20.9031 22.5 21.5 21.9031 21.5 21.1667V12.8333C21.5 12.097 20.9031 11.5 20.1667 11.5H11.8333C11.097 11.5 10.5 12.097 10.5 12.8333V21.1667C10.5 21.9031 11.097 22.5 11.8333 22.5Z'\n stroke='white'\n strokeLinecap='round'\n strokeLinejoin='round'\n strokeWidth='1.2'\n />\n <path\n d='M32 10H25.4C23.7431 10 22.4 8.65685 22.4 7V0L32 10Z'\n fill='white'\n opacity='0.5'\n />\n </g>\n <FileIconLabel label={label} size={size} sizeConfig={sizeConfig} />\n </Svg>\n);\n\nexport const FileAudioIcon = ({\n className = '',\n label = 'audio',\n size,\n sizeConfig,\n ...props\n}: BaseFileIconProps) => (\n <Svg\n {...props}\n className={clsx(\n 'str-chat__file-icon--audio',\n !label && FILE_ICON_NO_LABEL_CLASSNAME,\n className,\n )}\n size={size}\n sizeConfig={sizeConfig}\n >\n <g className={FILE_ICON_GRAPHIC_CLASSNAME}>\n <path\n d='M0 4C0 1.79086 1.79086 0 4 0H22.4L32 10V36C32 38.2091 30.2091 40 28 40H4C1.79086 40 0 38.2091 0 36V4Z'\n fill='#2727B0'\n />\n <path\n d='M20.8318 12.1679C22.0684 13.4045 22.8333 15.1128 22.8333 16.9998C22.8333 18.8867 22.0684 20.595 20.8318 21.8316M18.5927 14.4075C19.2562 15.071 19.6666 15.9876 19.6666 17.0002C19.6666 18.0127 19.2562 18.9294 18.5927 19.5929M10.5 14.1666H11.5699C11.8495 14.1666 12.1221 14.0787 12.349 13.9153L15.6385 11.5468C15.859 11.3881 16.1666 11.5456 16.1666 11.8173V22.1825C16.1666 22.4542 15.859 22.6118 15.6385 22.453L12.349 20.0845C12.1221 19.9211 11.8495 19.8332 11.5699 19.8332H10.5C9.76358 19.8332 9.16663 19.2363 9.16663 18.4999V15.4999C9.16663 14.7635 9.76358 14.1666 10.5 14.1666Z'\n stroke='white'\n strokeLinecap='round'\n strokeLinejoin='round'\n strokeWidth='1.2'\n />\n <path\n d='M32 10H25.4C23.7431 10 22.4 8.65685 22.4 7V0L32 10Z'\n fill='white'\n opacity='0.5'\n />\n </g>\n <FileIconLabel label={label} size={size} sizeConfig={sizeConfig} />\n </Svg>\n);\n\n// todo: can we remove this type of icon? missing design\nexport const FileVideoIcon = ({ className = '', ...props }: BaseFileIconProps) => (\n <svg\n className={clsx('rfu-file-video', className)}\n fill='none'\n viewBox='0 0 34 40'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n >\n <path\n clipRule='evenodd'\n d='M17.7168 33.172C18.2348 33.172 18.4238 33.655 18.4238 34.18C18.4238 34.642 18.2978 35.195 17.7168 35.195C17.1708 35.195 16.9888 34.642 16.9888 34.145C16.9888 33.683 17.1708 33.172 17.7168 33.172ZM19.5718 31.002H18.3818V32.7589H18.3678C18.1228 32.43 17.7798 32.262 17.3318 32.262C16.3028 32.262 15.7988 33.158 15.7988 34.103C15.7988 35.125 16.2818 36.1049 17.4228 36.1049C17.8428 36.1049 18.1928 35.923 18.4238 35.58H18.4378V36H19.5718V31.002ZM12.7095 34.1872C12.7095 33.7252 12.8775 33.1722 13.4305 33.1722C13.9835 33.1722 14.1585 33.7252 14.1585 34.1872C14.1585 34.6492 13.9835 35.1952 13.4305 35.1952C12.8775 35.1952 12.7095 34.6492 12.7095 34.1872ZM11.5195 34.1872C11.5195 35.2792 12.3035 36.1052 13.4305 36.1052C14.5575 36.1052 15.3485 35.2792 15.3485 34.1872C15.3485 33.0952 14.5575 32.2622 13.4305 32.2622C12.3035 32.2622 11.5195 33.0952 11.5195 34.1872ZM21.839 32.3671H22.574V33.1371H21.839V34.7891C21.839 35.0761 22.007 35.1391 22.266 35.1391C22.3142 35.1391 22.364 35.1357 22.4147 35.1323C22.4672 35.1287 22.5206 35.1251 22.574 35.1251V36.0001C22.481 36.0031 22.388 36.0099 22.295 36.0168C22.171 36.0259 22.047 36.0351 21.923 36.0351C20.908 36.0351 20.649 35.7411 20.649 34.7541V33.1371H20.047V32.3671H20.649V31.2681H21.839V32.3671Z'\n fill='white'\n fillRule='evenodd'\n />\n <path\n d='M0 28H34V37C34 38.6569 32.6569 40 31 40H3C1.34315 40 0 38.6569 0 37V28Z'\n fill='#9D27B0'\n />\n <path d='M0 3C0 1.34315 1.34315 0 3 0H23L34 11V28H0V3Z' fill='#F5F5F5' />\n <path d='M34 11L26 11C24.3431 11 23 9.65685 23 8V0L34 11Z' fill='#DBDBDB' />\n <path\n d='M9 17H25V24H9V17ZM27 14C27 12.8954 26.1046 12 25 12H22L24 15H21L19 12H17L19 15H16L14 12H12L14 15H11L9 12C7.9 12 7.01 12.9 7.01 14L7 24C7 25.1 7.9 26 9 26H25C26.1 26 27 25.1 27 24V14Z'\n fill='#9D27B0'\n />\n </svg>\n);\n\nexport const FileFallbackIcon = ({ className = '', ...props }: BaseFileIconProps) => (\n <Svg\n {...props}\n className={clsx(\n 'str-chat__file-icon--other',\n FILE_ICON_NO_LABEL_CLASSNAME,\n className,\n )}\n >\n <g className={FILE_ICON_GRAPHIC_CLASSNAME}>\n <path\n d='M0 4C0 1.79086 1.79086 0 4 0H22.4L32 10V36C32 38.2091 30.2091 40 28 40H4C1.79086 40 0 38.2091 0 36V4Z'\n fill='#888888'\n />\n <path\n d='M32 10H25.4C23.7431 10 22.4 8.65685 22.4 7V0L32 10Z'\n fill='white'\n opacity='0.5'\n />\n <rect fill='white' height='1.6' rx='0.8' width='14.4' x='8' y='13.2' />\n <rect fill='white' height='1.6' rx='0.8' width='14.4' x='8' y='21.2' />\n <rect fill='white' height='1.6' rx='0.8' width='9.6' x='8' y='17.2' />\n </g>\n </Svg>\n);\n","export type GeneralType = 'audio/' | 'video/' | 'image/' | 'text/';\n\nexport type SupportedMimeType =\n | (typeof wordMimeTypes)[number]\n | (typeof excelMimeTypes)[number]\n | (typeof powerpointMimeTypes)[number]\n | (typeof archiveFileTypes)[number]\n | (typeof codeFileTypes)[number];\n\nexport const wordMimeTypes = [\n // Microsoft Word\n // .doc .dot\n 'application/msword',\n // .doc .dot\n 'application/msword-template',\n // .docx\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n // .dotx (no test)\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',\n // .docm\n 'application/vnd.ms-word.document.macroEnabled.12',\n // .dotm (no test)\n 'application/vnd.ms-word.template.macroEnabled.12',\n\n // LibreOffice/OpenOffice Writer\n // .odt\n 'application/vnd.oasis.opendocument.text',\n // .ott\n 'application/vnd.oasis.opendocument.text-template',\n // .fodt\n 'application/vnd.oasis.opendocument.text-flat-xml',\n // .uot\n // NOTE: firefox doesn't know mimetype so maybe ignore\n];\n\nexport const excelMimeTypes = [\n // .csv\n 'text/csv',\n // TODO: maybe more data files\n\n // Microsoft Excel\n // .xls .xlt .xla (no test for .xla)\n 'application/vnd.ms-excel',\n // .xlsx\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n // .xltx (no test)\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\n // .xlsm\n 'application/vnd.ms-excel.sheet.macroEnabled.12',\n // .xltm (no test)\n 'application/vnd.ms-excel.template.macroEnabled.12',\n // .xlam (no test)\n 'application/vnd.ms-excel.addin.macroEnabled.12',\n // .xlsb (no test)\n 'application/vnd.ms-excel.addin.macroEnabled.12',\n\n // LibreOffice/OpenOffice Calc\n // .ods\n 'application/vnd.oasis.opendocument.spreadsheet',\n // .ots\n 'application/vnd.oasis.opendocument.spreadsheet-template',\n // .fods\n 'application/vnd.oasis.opendocument.spreadsheet-flat-xml',\n // .uos\n // NOTE: firefox doesn't know mimetype so maybe ignore\n];\n\nexport const powerpointMimeTypes = [\n // Microsoft Word\n // .ppt .pot .pps .ppa (no test for .ppa)\n 'application/vnd.ms-powerpoint',\n // .pptx\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n // .potx (no test)\n 'application/vnd.openxmlformats-officedocument.presentationml.template',\n // .ppsx\n 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\n // .ppam\n 'application/vnd.ms-powerpoint.addin.macroEnabled.12',\n // .pptm\n 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',\n // .potm\n 'application/vnd.ms-powerpoint.template.macroEnabled.12',\n // .ppsm\n 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',\n\n // LibreOffice/OpenOffice Writer\n // .odp\n 'application/vnd.oasis.opendocument.presentation',\n // .otp\n 'application/vnd.oasis.opendocument.presentation-template',\n // .fodp\n 'application/vnd.oasis.opendocument.presentation-flat-xml',\n // .uop\n // NOTE: firefox doesn't know mimetype so maybe ignore\n];\n\nexport const archiveFileTypes = [\n // .zip\n 'application/zip',\n // .z7\n 'application/x-7z-compressed',\n // .ar\n 'application/x-archive',\n // .tar\n 'application/x-tar',\n // .tar.gz\n 'application/gzip',\n // .tar.Z\n 'application/x-compress',\n // .tar.bz2\n 'application/x-bzip',\n // .tar.lz\n 'application/x-lzip',\n // .tar.lz4\n 'application/x-lz4',\n // .tar.lzma\n 'application/x-lzma',\n // .tar.lzo (no test)\n 'application/x-lzop',\n // .tar.xz\n 'application/x-xz',\n // .war\n 'application/x-webarchive',\n // .rar\n 'application/vnd.rar',\n];\n\nexport const codeFileTypes = [\n // .html .htm\n 'text/html',\n // .css\n 'text/css',\n // .js\n 'application/x-javascript',\n 'text/javascript',\n // .json\n 'application/json',\n // .py\n 'text/x-python',\n // .go\n 'text/x-go',\n // .c\n 'text/x-csrc',\n // .cpp\n 'text/x-c++src',\n // .rb\n 'application/x-ruby',\n // .rust\n 'text/rust',\n // .java\n 'text/x-java',\n // .php\n 'application/x-php',\n // .cs\n 'text/x-csharp',\n // .scala\n 'text/x-scala',\n // .erl\n 'text/x-erlang',\n // .sh\n 'application/x-shellscript',\n];\n\nexport const mimeTypeToExtensionMap: Record<string, string> = {\n // Application types (sorted alphabetically)\n 'application/epub+zip': 'epub',\n 'application/gzip': 'gz',\n 'application/java-archive': 'jar',\n 'application/json': 'json',\n 'application/ld+json': 'jsonld',\n 'application/msword': 'doc',\n 'application/msword-template': 'dot',\n 'application/octet-stream': 'bin',\n 'application/ogg': 'ogx',\n 'application/pdf': 'pdf',\n 'application/postscript': 'ps',\n 'application/rtf': 'rtf',\n 'application/vnd.amazon.ebook': 'azw',\n 'application/vnd.apple.installer+xml': 'mpkg',\n 'application/vnd.mozilla.xul+xml': 'xul',\n 'application/vnd.ms-excel': 'xls',\n 'application/vnd.ms-excel.addin.macroEnabled.12': 'xlam',\n 'application/vnd.ms-excel.sheet.macroEnabled.12': 'xlsm',\n 'application/vnd.ms-excel.template.macroEnabled.12': 'xltm',\n 'application/vnd.ms-fontobject': 'eot',\n 'application/vnd.ms-powerpoint': 'ppt',\n 'application/vnd.ms-powerpoint.addin.macroEnabled.12': 'ppam',\n 'application/vnd.ms-powerpoint.presentation.macroEnabled.12': 'pptm',\n 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12': 'ppsm',\n 'application/vnd.ms-powerpoint.template.macroEnabled.12': 'potm',\n 'application/vnd.ms-word.document.macroEnabled.12': 'docm',\n 'application/vnd.ms-word.template.macroEnabled.12': 'dotm',\n 'application/vnd.oasis.opendocument.presentation': 'odp',\n 'application/vnd.oasis.opendocument.presentation-flat-xml': 'fodp',\n 'application/vnd.oasis.opendocument.presentation-template': 'otp',\n 'application/vnd.oasis.opendocument.spreadsheet': 'ods',\n 'application/vnd.oasis.opendocument.spreadsheet-flat-xml': 'fods',\n 'application/vnd.oasis.opendocument.spreadsheet-template': 'ots',\n 'application/vnd.oasis.opendocument.text': 'odt',\n 'application/vnd.oasis.opendocument.text-flat-xml': 'fodt',\n 'application/vnd.oasis.opendocument.text-template': 'ott',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'pptx',\n 'application/vnd.openxmlformats-officedocument.presentationml.slideshow': 'ppsx',\n 'application/vnd.openxmlformats-officedocument.presentationml.template': 'potx',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.template': 'xltx',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.template': 'dotx',\n 'application/vnd.rar': 'rar',\n 'application/vnd.visio': 'vsd',\n 'application/wasm': 'wasm',\n 'application/x-7z-compressed': '7z',\n 'application/x-abiword': 'abw',\n 'application/x-archive': 'ar',\n 'application/x-bzip': 'bz',\n 'application/x-bzip2': 'bz2',\n 'application/x-cdf': 'cda',\n 'application/x-compress': 'Z',\n 'application/x-csh': 'csh',\n 'application/x-dosexec': 'exe',\n 'application/x-freearc': 'arc',\n 'application/x-httpd-php': 'php',\n 'application/x-iso9660-image': 'iso',\n 'application/x-javascript': 'js',\n 'application/x-lz4': 'lz4',\n 'application/x-lzip': 'lz',\n 'application/x-lzma': 'lzma',\n 'application/x-lzop': 'lzo',\n 'application/x-mobipocket-ebook': 'mobi',\n 'application/x-msdownload': 'exe',\n 'application/x-perl': 'pl',\n 'application/x-php': 'php',\n 'application/x-rar-compressed': 'rar',\n 'application/x-ruby': 'rb',\n 'application/x-sh': 'sh',\n 'application/x-shellscript': 'sh',\n 'application/x-shockwave-flash': 'swf',\n 'application/x-sql': 'sql',\n 'application/x-stuffit': 'sit',\n 'application/x-tar': 'tar',\n 'application/x-webarchive': 'war',\n 'application/x-xz': 'xz',\n 'application/x-yaml': 'yaml',\n 'application/xhtml+xml': 'xhtml',\n 'application/xml': 'xml',\n 'application/zip': 'zip',\n\n // Audio types\n 'audio/aac': 'aac',\n 'audio/flac': 'flac',\n 'audio/midi': 'midi',\n 'audio/mp4': 'm4a',\n 'audio/mpeg': 'mp3',\n 'audio/ogg': 'oga',\n 'audio/opus': 'opus',\n 'audio/wav': 'wav',\n 'audio/webm': 'weba',\n 'audio/x-aiff': 'aiff',\n 'audio/x-m4a': 'm4a',\n 'audio/x-midi': 'midi',\n 'audio/x-ms-wma': 'wma',\n 'audio/x-wav': 'wav',\n\n // Font types\n 'font/otf': 'otf',\n 'font/ttf': 'ttf',\n 'font/woff': 'woff',\n 'font/woff2': 'woff2',\n\n // Image types\n 'image/apng': 'apng',\n 'image/avif': 'avif',\n 'image/bmp': 'bmp',\n 'image/gif': 'gif',\n 'image/heic': 'heic',\n 'image/heif': 'heif',\n 'image/jpeg': 'jpg',\n 'image/png': 'png',\n 'image/svg+xml': 'svg',\n 'image/tiff': 'tiff',\n 'image/vnd.microsoft.icon': 'ico',\n 'image/webp': 'webp',\n 'image/x-icon': 'ico',\n\n // Text types\n 'text/calendar': 'ics',\n 'text/css': 'css',\n 'text/csv': 'csv',\n 'text/html': 'html',\n 'text/javascript': 'js',\n 'text/markdown': 'md',\n 'text/plain': 'txt',\n 'text/rtf': 'rtf',\n 'text/rust': 'rs',\n 'text/tab-separated-values': 'tsv',\n 'text/vcard': 'vcf',\n 'text/x-c': 'c',\n 'text/x-c++src': 'cpp',\n 'text/x-csharp': 'cs',\n 'text/x-csrc': 'c',\n 'text/x-diff': 'diff',\n 'text/x-erlang': 'erl',\n 'text/x-go': 'go',\n 'text/x-java': 'java',\n 'text/x-java-source': 'java',\n 'text/x-kotlin': 'kt',\n 'text/x-lua': 'lua',\n 'text/x-markdown': 'md',\n 'text/x-objectivec': 'm',\n 'text/x-pascal': 'pas',\n 'text/x-perl': 'pl',\n 'text/x-python': 'py',\n 'text/x-ruby': 'rb',\n 'text/x-rust': 'rs',\n 'text/x-scala': 'scala',\n 'text/x-sh': 'sh',\n 'text/x-shellscript': 'sh',\n 'text/x-sql': 'sql',\n 'text/x-swift': 'swift',\n 'text/x-typescript': 'ts',\n 'text/x-yaml': 'yaml',\n 'text/xml': 'xml',\n 'text/yaml': 'yaml',\n\n // Video types\n 'video/3gpp': '3gp',\n 'video/3gpp2': '3g2',\n 'video/mp2t': 'ts',\n 'video/mp4': 'mp4',\n 'video/mpeg': 'mpeg',\n 'video/ogg': 'ogv',\n 'video/quicktime': 'mov',\n 'video/webm': 'webm',\n 'video/x-flv': 'flv',\n 'video/x-m4v': 'm4v',\n 'video/x-matroska': 'mkv',\n 'video/x-ms-wmv': 'wmv',\n 'video/x-msvideo': 'avi',\n};\n","import * as fileIconSet from './FileIconSet';\nimport type { GeneralType, SupportedMimeType } from './mimeTypes';\nimport {\n archiveFileTypes,\n codeFileTypes,\n excelMimeTypes,\n powerpointMimeTypes,\n wordMimeTypes,\n} from './mimeTypes';\nimport type { ComponentType } from 'react';\nimport type { BaseFileIconProps } from './FileIconSet';\n\ntype MimeTypeMappedComponent =\n | 'FilePdfIcon'\n | 'FileWordIcon'\n | 'FileExcelIcon'\n | 'FilePowerPointIcon'\n | 'FileArchiveIcon'\n | 'FileCodeIcon';\n\ntype GeneralContentTypeComponent = 'FileAudioIcon' | 'FileVideoIcon' | 'FileAltIcon';\n\ntype IconComponents<Props> = {\n FileAltIcon: ComponentType<Props>;\n FileArchiveIcon: ComponentType<Props>;\n FileAudioIcon: ComponentType<Props>;\n FileCodeIcon: ComponentType<Props>;\n FileExcelIcon: ComponentType<Props>;\n FileFallbackIcon: ComponentType<Props>;\n FilePdfIcon: ComponentType<Props>;\n FilePowerPointIcon: ComponentType<Props>;\n FileVideoIcon: ComponentType<Props>;\n FileWordIcon: ComponentType<Props>;\n};\n\ntype MimeTypeToIconMap<Props> = {\n [key: string]: ComponentType<Props>;\n};\n\nfunction generateMimeTypeToIconMap<Props>({\n FileArchiveIcon,\n FileCodeIcon,\n FileExcelIcon,\n FilePdfIcon,\n FilePowerPointIcon,\n FileWordIcon,\n}: Pick<IconComponents<Props>, MimeTypeMappedComponent>) {\n const mimeTypeToIconMap: MimeTypeToIconMap<Props> = {\n 'application/pdf': FilePdfIcon,\n };\n\n for (const type of wordMimeTypes) {\n mimeTypeToIconMap[type] = FileWordIcon;\n }\n\n for (const type of excelMimeTypes) {\n mimeTypeToIconMap[type] = FileExcelIcon;\n }\n\n for (const type of powerpointMimeTypes) {\n mimeTypeToIconMap[type] = FilePowerPointIcon;\n }\n\n for (const type of archiveFileTypes) {\n mimeTypeToIconMap[type] = FileArchiveIcon;\n }\n\n for (const type of codeFileTypes) {\n mimeTypeToIconMap[type] = FileCodeIcon;\n }\n return mimeTypeToIconMap;\n}\n\nfunction generateGeneralTypeToIconMap<Props>({\n FileAltIcon,\n FileAudioIcon,\n FileVideoIcon,\n}: Pick<IconComponents<Props>, GeneralContentTypeComponent>) {\n return {\n 'audio/': FileAudioIcon,\n 'text/': FileAltIcon,\n 'video/': FileVideoIcon,\n };\n}\n\ntype IconMap = {\n standard: Record<\n SupportedMimeType | GeneralType | 'fallback',\n ComponentType<BaseFileIconProps>\n >;\n};\n\nexport const iconMap: IconMap = {\n standard: {\n ...generateMimeTypeToIconMap<BaseFileIconProps>({\n FileArchiveIcon: fileIconSet.FileArchiveIcon,\n FileCodeIcon: fileIconSet.FileCodeIcon,\n FileExcelIcon: fileIconSet.FileExcelIcon,\n FilePdfIcon: fileIconSet.FilePdfIcon,\n FilePowerPointIcon: fileIconSet.FilePowerPointIcon,\n FileWordIcon: fileIconSet.FileWordIcon,\n }),\n ...generateGeneralTypeToIconMap<BaseFileIconProps>({\n FileAltIcon: fileIconSet.FileFallbackIcon,\n FileAudioIcon: fileIconSet.FileAudioIcon,\n FileVideoIcon: fileIconSet.FileVideoIcon,\n }),\n fallback: fileIconSet.FileFallbackIcon,\n },\n};\n","import React, { useMemo } from 'react';\nimport clsx from 'clsx';\nimport { iconMap } from './iconMap';\nimport { FILE_ICON_NO_LABEL_CLASSNAME, mergeFileIconSizeConfig } from './FileIconSet';\nimport { mimeTypeToExtensionMap } from './mimeTypes';\nimport type { FileIconSize } from './FileIconSet';\n\nexport type FileIconSizeConfigOverride = Partial<\n Record<\n FileIconSize,\n Partial<{ width: number; height: number; labelX: number; labelY: number }>\n >\n>;\n\nexport type FileIconProps = {\n className?: string;\n fileName?: string;\n /** When true, label is not rendered and the icon graphic is centered (adds str-chat__file-icon--no-label). */\n hideLabel?: boolean;\n mimeType?: string;\n /** Override dimensions/label position per size (sm, md, lg). */\n sizeConfig?: FileIconSizeConfigOverride;\n size?: FileIconSize;\n};\n\nexport function mimeTypeToIcon(mimeType?: string) {\n const theMap = iconMap['standard'];\n\n if (!mimeType) return theMap.fallback;\n\n const icon = theMap[mimeType];\n if (icon) return icon;\n\n if (mimeType.startsWith('audio/')) return theMap['audio/'];\n if (mimeType.startsWith('video/')) return theMap['video/'];\n if (mimeType.startsWith('image/')) return theMap['image/'];\n if (mimeType.startsWith('text/')) return theMap['text/'];\n\n return theMap.fallback;\n}\n\nconst labelFromMimeType = ({\n fileName,\n mimeType,\n}: Pick<FileIconProps, 'fileName' | 'mimeType'>) => {\n let label;\n\n if (mimeType) {\n label = mimeTypeToExtensionMap[mimeType];\n }\n\n if (!label && fileName) {\n label = fileName.split('.').slice(-1)[0];\n }\n return label;\n};\n\nexport const FileIcon = (props: FileIconProps) => {\n const {\n className,\n fileName,\n hideLabel,\n mimeType,\n size = 'md',\n sizeConfig: sizeConfigOverride,\n ...rest\n } = props;\n const sizeConfig = useMemo(\n () => mergeFileIconSizeConfig(sizeConfigOverride),\n [sizeConfigOverride],\n );\n const Icon = mimeTypeToIcon(mimeType);\n const label = hideLabel ? undefined : labelFromMimeType({ fileName, mimeType });\n return (\n <Icon\n {...rest}\n className={clsx(className, hideLabel && FILE_ICON_NO_LABEL_CLASSNAME)}\n label={label}\n size={size}\n sizeConfig={sizeConfig}\n />\n );\n};\n","import React from 'react';\nimport clsx from 'clsx';\n\nexport const QuotedMessageIndicator = ({ isOwnMessage }: { isOwnMessage?: boolean }) => (\n <div\n className={clsx('str-chat__quoted-message-indicator', {\n 'str-chat__quoted-message-indicator--own-message': isOwnMessage,\n })}\n />\n);\n","import React, {\n type ComponentType,\n type MouseEventHandler,\n type ReactElement,\n type ReactNode,\n useMemo,\n} from 'react';\n\nimport { displayDuration, SUPPORTED_VIDEO_FORMATS } from '../Attachment';\n\nimport { useChatContext } from '../../context/ChatContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\n\nimport { useStateStore } from '../../store';\nimport { useMessageComposerController } from './hooks';\nimport {\n type Attachment,\n type GiphyVersions,\n isAudioAttachment,\n isFileAttachment,\n isGiphyAttachment,\n isImageAttachment,\n isScrapedContent,\n isVideoAttachment,\n isVoiceRecordingAttachment,\n type LocalMessage,\n type LocalMessageBase,\n type MessageComposerState,\n type PollResponse,\n type SharedLocationResponse,\n type TranslationLanguages,\n} from 'stream-chat';\nimport { useChannelStateContext } from '../../context/ChannelStateContext';\nimport type { MessageContextValue } from '../../context';\nimport { RemoveAttachmentPreviewButton } from './RemoveAttachmentPreviewButton';\nimport {\n IconChainLink,\n IconChart5,\n IconFileBend,\n IconMapPin,\n IconMicrophone,\n IconPlaySolid,\n IconVideo,\n IconVideoSolid,\n} from '../Icons';\nimport clsx from 'clsx';\nimport { BaseImage } from '../BaseImage';\nimport { FileIcon } from '../FileIcon';\nimport { QuotedMessageIndicator } from './QuotedMessageIndicator';\n\nconst messageComposerStateStoreSelector = (state: MessageComposerState) => ({\n quotedMessage: state.quotedMessage,\n});\n\nexport type QuotedMessagePreviewProps = {\n getQuotedMessageAuthor?: (message: LocalMessage) => string;\n renderText?: MessageContextValue['renderText'];\n};\n\nconst NullAttachmentIcon = () => null;\n\nconst QUOTED_GIPHY_PREVIEW_LABEL = 'Giphy';\n\ntype AttachmentType = 'documents' | 'images' | 'links' | 'videos' | 'voiceRecordings';\n\n/** Giphy GIFs: only native type (e.g. /giphy command) is recognized as Giphy. */\nconst isQuotedGiphyAttachment = (attachment: Attachment) => isGiphyAttachment(attachment);\n\nconst getAttachmentType = (attachment: Attachment) => {\n if (isQuotedGiphyAttachment(attachment)) {\n return 'giphy';\n }\n if (isScrapedContent(attachment)) {\n return 'link';\n } else if (isVideoAttachment(attachment, SUPPORTED_VIDEO_FORMATS)) {\n return 'video';\n } else if (isImageAttachment(attachment)) {\n return 'image';\n } else if (isAudioAttachment(attachment)) {\n return 'audio';\n } else if (isVoiceRecordingAttachment(attachment)) {\n return 'voiceRecording';\n } else if (isFileAttachment(attachment, SUPPORTED_VIDEO_FORMATS)) {\n return 'file';\n }\n\n return 'unsupported';\n};\n\ntype GroupedAttachments = Record<AttachmentType, Attachment[]> & {\n giphies: Attachment[];\n locations: SharedLocationResponse[];\n polls: PollResponse[];\n total: number;\n};\n\nconst getGroupedAttachments = (quotedMessage: LocalMessage | null) => {\n const groupedAttachments = {\n documents: [],\n giphies: [],\n images: [],\n links: [],\n locations: [],\n polls: [],\n total: 0,\n videos: [],\n voiceRecordings: [],\n };\n\n if (!quotedMessage || !quotedMessage.attachments) return groupedAttachments;\n\n const result = quotedMessage.attachments.reduce<GroupedAttachments>(\n (count, attachment) => {\n switch (getAttachmentType(attachment)) {\n case 'giphy':\n count.giphies.push(attachment);\n count.total += 1;\n break;\n case 'link':\n count.links.push(attachment);\n count.total += 1;\n break;\n case 'video':\n count.videos.push(attachment);\n count.total += 1;\n break;\n case 'voiceRecording':\n count.voiceRecordings.push(attachment);\n count.total += 1;\n break;\n case 'audio':\n case 'file':\n count.documents.push(attachment);\n count.total += 1;\n break;\n default:\n if (isImageAttachment(attachment)) {\n count.images.push(attachment);\n count.total += 1;\n }\n }\n\n return count;\n },\n groupedAttachments,\n );\n if (quotedMessage.shared_location) {\n result.locations.push(quotedMessage.shared_location);\n result.total += 1;\n } else if (quotedMessage.poll) {\n result.polls.push(quotedMessage.poll);\n result.total += 1;\n }\n\n return result;\n};\n\ntype PreviewType =\n | 'voice'\n | 'file'\n | 'image'\n | 'giphy'\n | 'link'\n | 'location'\n | 'poll'\n | 'video'\n | 'mixed';\n\nconst getAttachmentIconWithType = (\n quotedMessage: LocalMessage | null,\n giphyVersionName: GiphyVersions,\n): {\n groupedAttachments: GroupedAttachments;\n Icon: ComponentType;\n PreviewImage: ReactElement | null;\n previewType: PreviewType | null;\n} => {\n const groupedAttachments = getGroupedAttachments(quotedMessage);\n const result = {\n groupedAttachments,\n Icon: NullAttachmentIcon,\n PreviewImage: null,\n previewType: null,\n };\n if (!groupedAttachments.total) return result;\n if (groupedAttachments.polls.length > 0)\n return { ...result, Icon: IconChart5, previewType: 'poll' };\n if (groupedAttachments.locations.length > 0)\n // todo: we do not generate the location preview image\n return { ...result, Icon: IconMapPin, previewType: 'location' };\n if (\n groupedAttachments.giphies.length > 0 &&\n groupedAttachments.giphies.length === groupedAttachments.total\n ) {\n const giphyAttachment = groupedAttachments.giphies[0] as Attachment & {\n giphy?: Record<string, { url?: string } | undefined>;\n };\n const giphyVersion =\n giphyAttachment.giphy?.[giphyVersionName as keyof NonNullable<Attachment['giphy']>];\n const src =\n giphyVersion?.url || giphyAttachment.thumb_url || giphyAttachment.image_url || '';\n return {\n ...result,\n Icon: IconFileBend,\n PreviewImage: (\n <BaseImage\n alt={QUOTED_GIPHY_PREVIEW_LABEL}\n className='str-chat__attachment-preview__thumbnail'\n src={src}\n title={QUOTED_GIPHY_PREVIEW_LABEL}\n />\n ),\n previewType: 'giphy',\n };\n }\n if (\n groupedAttachments.documents.length === groupedAttachments.total &&\n groupedAttachments.documents.length === 1\n ) {\n const fileAttachment = groupedAttachments.documents[0] as Attachment;\n return {\n ...result,\n Icon: IconFileBend,\n PreviewImage: (\n <FileIcon fileName={fileAttachment.title} mimeType={fileAttachment.mime_type} />\n ),\n previewType: 'file',\n };\n }\n if (groupedAttachments.links.length === groupedAttachments.total) {\n const linkAttachment = groupedAttachments.links[0];\n return {\n ...result,\n Icon: IconChainLink,\n PreviewImage: (\n <BaseImage\n alt={linkAttachment.title}\n className='str-chat__attachment-preview__thumbnail'\n src={linkAttachment.thumb_url || linkAttachment.image_url}\n title={linkAttachment.title}\n />\n ),\n previewType: 'link',\n };\n }\n if (groupedAttachments.videos.length === groupedAttachments.total) {\n const videoAttachment = groupedAttachments.videos[0];\n return {\n ...result,\n Icon: IconVideo,\n PreviewImage: (\n <>\n <BaseImage\n alt={videoAttachment.asset_url}\n className='str-chat__attachment-preview__thumbnail'\n src={videoAttachment.thumb_url}\n title={videoAttachment.title}\n />\n <div className='str-chat__attachment-preview__thumbnail__play-indicator'>\n <IconPlaySolid />\n </div>\n </>\n ),\n previewType: 'video',\n };\n }\n if (groupedAttachments.images.length === groupedAttachments.total) {\n const imageAttachment = groupedAttachments.images[0];\n return {\n ...result,\n Icon: IconVideoSolid,\n PreviewImage: (\n <BaseImage\n alt={imageAttachment.fallback}\n className='str-chat__attachment-preview__thumbnail'\n src={imageAttachment.image_url}\n title={imageAttachment.title}\n />\n ),\n previewType: 'image',\n };\n }\n if (groupedAttachments.voiceRecordings.length === groupedAttachments.total)\n return { ...result, Icon: IconMicrophone, previewType: 'voice' };\n\n return { ...result, Icon: IconFileBend, previewType: 'mixed' };\n};\n\nexport const QuotedMessagePreview = ({\n getQuotedMessageAuthor,\n renderText,\n}: QuotedMessagePreviewProps) => {\n const messageComposer = useMessageComposerController();\n const { quotedMessage } = useStateStore(\n messageComposer.state,\n messageComposerStateStoreSelector,\n );\n\n return quotedMessage ? (\n <div className='str-chat__message-composer__quoted-message-preview-slot'>\n <QuotedMessagePreviewUI\n getQuotedMessageAuthor={getQuotedMessageAuthor}\n onRemove={() => messageComposer.setQuotedMessage(null)}\n quotedMessage={quotedMessage}\n renderText={renderText}\n />\n </div>\n ) : null;\n};\n\ntype QuotedMessagePreviewUIProps = QuotedMessagePreviewProps & {\n quotedMessage: LocalMessageBase;\n onClick?: MouseEventHandler<HTMLDivElement>;\n onRemove?: () => void;\n};\n\nexport const QuotedMessagePreviewUI = ({\n getQuotedMessageAuthor,\n onClick,\n onRemove,\n quotedMessage,\n renderText,\n}: QuotedMessagePreviewUIProps) => {\n const { client } = useChatContext();\n const { t, userLanguage } = useTranslationContext();\n const { giphyVersion: giphyVersionName = 'fixed_height' } =\n useChannelStateContext('QuotedMessagePreview');\n\n const quotedMessageText = useMemo(\n () =>\n quotedMessage?.i18n?.[`${userLanguage}_text` as `${TranslationLanguages}_text`] ||\n quotedMessage?.text,\n [quotedMessage?.i18n, quotedMessage?.text, userLanguage],\n );\n\n const { AttachmentIcon, PreviewImage, renderedText } = useMemo(() => {\n if (!quotedMessage) return { AttachmentIcon: NullAttachmentIcon, renderedText: null };\n\n const {\n groupedAttachments,\n Icon: AttachmentIcon,\n PreviewImage,\n previewType,\n } = getAttachmentIconWithType(quotedMessage, giphyVersionName);\n\n let renderedText: ReactNode | undefined;\n\n if (!quotedMessageText) {\n if (previewType === 'poll') {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n renderedText = quotedMessage.poll!.name;\n } else if (previewType === 'location') {\n renderedText = t('Live location');\n } else if (previewType === 'voice') {\n {\n const voiceRecording = groupedAttachments.voiceRecordings[0];\n renderedText = t('Voice message {{ duration }}', {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n duration: displayDuration(voiceRecording!.duration),\n });\n }\n } else if (previewType === 'giphy') {\n renderedText = QUOTED_GIPHY_PREVIEW_LABEL;\n } else if (previewType === 'link') {\n renderedText = groupedAttachments.links[0].title;\n } else if (previewType === 'mixed') {\n renderedText = t('{{ count }} files', { count: groupedAttachments.total });\n } else if (previewType === 'video') {\n renderedText =\n groupedAttachments.videos.length === 1\n ? t('Video')\n : t('{{ count }} videos', {\n count: groupedAttachments.videos.length,\n });\n } else if (previewType === 'file') {\n renderedText = groupedAttachments.documents[0].title;\n } else if (previewType === 'image') {\n renderedText =\n groupedAttachments.images.length === 1\n ? t('Photo')\n : t('{{ count }} photos', {\n count: groupedAttachments.images.length,\n });\n }\n } else if (renderText) {\n renderedText = renderText(quotedMessageText, quotedMessage?.mentioned_users);\n } else {\n renderedText = quotedMessageText;\n }\n\n return {\n AttachmentIcon,\n PreviewImage,\n renderedText,\n };\n }, [giphyVersionName, quotedMessage, quotedMessageText, renderText, t]);\n\n const isOwnMessage = client.user?.id === quotedMessage?.user?.id;\n\n if (!renderedText && !AttachmentIcon && !PreviewImage) return null;\n\n const authorName = getQuotedMessageAuthor?.(quotedMessage) ?? quotedMessage.user?.name;\n return (\n <div\n className={clsx('str-chat__quoted-message-preview', {\n 'str-chat__quoted-message-preview--own': isOwnMessage,\n })}\n data-testid='quoted-message-preview'\n onClick={onClick}\n tabIndex={onClick && 0}\n >\n <QuotedMessageIndicator isOwnMessage={isOwnMessage} />\n <div className='str-chat__quoted-message-preview__content'>\n <div className='str-chat__quoted-message-preview__author'>\n {isOwnMessage\n ? t('You')\n : authorName\n ? t('Reply to {{ authorName }}', { authorName })\n : t('Reply')}\n </div>\n\n <div\n className='str-chat__quoted-message-preview__message'\n data-testid='quoted-message-text'\n >\n <AttachmentIcon />\n <div className='str-chat__quoted-message-preview__message-text'>\n {renderedText}\n </div>\n </div>\n </div>\n {PreviewImage && (\n <div className='str-chat__quoted-message-preview__image'>{PreviewImage}</div>\n )}\n\n {onRemove && (\n <RemoveAttachmentPreviewButton\n aria-label={t('aria/Cancel Reply')}\n data-testid='quoted-message-preview-dismiss-btn'\n onClick={onRemove}\n />\n )}\n </div>\n );\n};\n","import React from 'react';\nimport type { MessageContextValue } from '../../context/MessageContext';\nimport { useMessageContext } from '../../context/MessageContext';\nimport { useChannelActionContext } from '../../context/ChannelActionContext';\nimport { QuotedMessagePreviewUI } from '../MessageComposer/QuotedMessagePreview';\n\nexport type QuotedMessageProps = Pick<MessageContextValue, 'renderText'>;\n\nexport const QuotedMessage = ({ renderText: propsRenderText }: QuotedMessageProps) => {\n const { message, renderText: contextRenderText } = useMessageContext('QuotedMessage');\n const { jumpToMessage } = useChannelActionContext('QuotedMessage');\n\n const renderText = propsRenderText ?? contextRenderText;\n\n const { quoted_message } = message;\n\n return quoted_message ? (\n <QuotedMessagePreviewUI\n onClick={(e) => {\n if (!quoted_message) return;\n e.stopPropagation();\n e.preventDefault();\n jumpToMessage(quoted_message.id);\n }}\n quotedMessage={quoted_message}\n renderText={renderText}\n />\n ) : null;\n};\n","import React from 'react';\nimport { useTranslationContext } from '../../context';\nimport { useStateStore } from '../../store';\nimport type { Reminder, ReminderState } from 'stream-chat';\nimport { IconBellNotification, IconBookmark } from '../Icons';\n\nexport type ReminderNotificationProps = {\n reminder?: Reminder;\n};\n\nconst reminderStateSelector = (state: ReminderState) => ({\n timeLeftMs: state.timeLeftMs,\n});\n\nfunction SavedForLaterContent() {\n const { t } = useTranslationContext();\n return (\n <p className='str-chat__message-saved-for-later'>\n <IconBookmark />\n <span>{t('Saved for later')}</span>\n </p>\n );\n}\n\nconst THRESHOLD_RELATIVE_MINUTES = 59;\n\nfunction RemindMeContent({ reminder }: { reminder: Reminder }) {\n const { t } = useTranslationContext();\n const { timeLeftMs } = useStateStore(reminder?.state, reminderStateSelector) ?? {};\n\n const stopRefreshBoundaryMs = reminder?.timer.stopRefreshBoundaryMs;\n const stopRefreshTimeStamp =\n reminder?.remindAt && stopRefreshBoundaryMs\n ? reminder.remindAt.getTime() + stopRefreshBoundaryMs\n : undefined;\n\n const isBehindRefreshBoundary =\n !!stopRefreshTimeStamp && new Date().getTime() > stopRefreshTimeStamp;\n\n if (timeLeftMs === null || !reminder.remindAt) return null;\n\n const nowMs = Date.now();\n const remindAtMs = reminder.remindAt.getTime();\n const diffMs = remindAtMs - nowMs;\n const diffMinutes = Math.abs(diffMs) / (60 * 1000);\n const useAbsoluteFormat = diffMinutes > THRESHOLD_RELATIVE_MINUTES;\n\n const renderTime = () => {\n if (isBehindRefreshBoundary) {\n // Past: reminder time has passed\n if (useAbsoluteFormat) {\n // > 59 min ago: calendar + time (same as DateSeparator + HH:mm)\n // e.g. \"Due since Today at 15:00\", \"Due since Yesterday at 09:30\"\n return t('Due since {{ dueSince }}', {\n dueSince: t('timestamp/ReminderNotification', {\n timestamp: reminder.remindAt,\n }),\n });\n }\n // Within 59 min ago: relative\n // e.g. \"Due since 5 minutes ago\", \"Due since a minute ago\"\n return t('Due since {{ dueSince }}', {\n dueSince: t('duration/Message reminder', {\n milliseconds: diffMs,\n }),\n });\n }\n // Future: reminder not yet due\n if (useAbsoluteFormat) {\n // > 59 min from now: calendar + time (no \"Due\" prefix)\n // e.g. \"Today at 15:00\", \"Tomorrow at 09:30\"\n return t('timestamp/ReminderNotification', {\n timestamp: reminder.remindAt,\n });\n }\n // Within 59 min from now: relative\n // e.g. \"Due in 30 minutes\", \"Due in a minute\"\n return t('Due {{ timeLeft }}', {\n timeLeft: t('duration/Message reminder', {\n milliseconds: timeLeftMs,\n }),\n });\n };\n\n return (\n <p className='str-chat__message-reminder'>\n <IconBellNotification />\n <span>{t('Reminder set')}</span>\n <span> · </span>\n <span className='str-chat__message-reminder__time-left'>{renderTime()}</span>\n </p>\n );\n}\n\nexport const ReminderNotification = ({ reminder }: ReminderNotificationProps) => {\n if (!reminder) return null;\n\n if (!reminder.remindAt) {\n return <SavedForLaterContent />;\n }\n\n return <RemindMeContent reminder={reminder} />;\n};\n","import React, { useEffect } from 'react';\n\nimport type { MessageTextProps } from './MessageText';\nimport { MessageText } from './MessageText';\n\nimport { useChannelStateContext, useMessageContext } from '../../context';\nimport { useMessageTextStreaming } from './hooks';\n\nexport type StreamedMessageTextProps = Pick<\n MessageTextProps,\n 'message' | 'renderText'\n> & {\n renderingLetterCount?: number;\n streamingLetterIntervalMs?: number;\n};\n\nexport const StreamedMessageText = (props: StreamedMessageTextProps) => {\n const {\n message: messageFromProps,\n renderingLetterCount,\n renderText,\n streamingLetterIntervalMs,\n } = props;\n const { message: messageFromContext } = useMessageContext('StreamedMessageText');\n const { channel } = useChannelStateContext();\n const message = messageFromProps || messageFromContext;\n const { text = '' } = message;\n const { skipAnimation, streamedMessageText } = useMessageTextStreaming({\n renderingLetterCount,\n streamingLetterIntervalMs,\n text,\n });\n\n useEffect(() => {\n channel?.on('ai_indicator.stop', () => {\n skipAnimation();\n });\n }, [channel, skipAnimation]);\n\n return (\n <MessageText\n message={{ ...message, text: streamedMessageText }}\n renderText={renderText}\n />\n );\n};\n","import { FocusScope } from '@react-aria/focus';\nimport clsx from 'clsx';\nimport type {\n ComponentProps,\n ComponentType,\n PropsWithChildren,\n ReactNode,\n Ref,\n} from 'react';\nimport React, { useCallback, useEffect, useState } from 'react';\n\nimport {\n type PopperLikePlacement,\n usePopoverPosition,\n} from '../Dialog/hooks/usePopoverPosition';\n\ntype DropdownContextValue = {\n close(): void;\n};\n\nconst DropdownContext = React.createContext<DropdownContextValue>({\n close: () => null,\n});\n\ntype DropdownContextProviderProps = DropdownContextValue;\n\nconst DropdownContextProvider = ({\n children,\n ...props\n}: PropsWithChildren<DropdownContextProviderProps>) => (\n <DropdownContext.Provider value={props}>{children}</DropdownContext.Provider>\n);\n\nexport const useDropdownContext = () => React.useContext(DropdownContext);\n\nexport type DropdownTriggerProps = Pick<\n ComponentProps<'button'>,\n 'aria-expanded' | 'onClick'\n> & {\n children?: ReactNode;\n referenceRef?: Ref<HTMLElement>;\n};\n\nexport type DropdownProps = PropsWithChildren<{\n className?: string;\n onClose?: () => void;\n onOpen?: () => void;\n placement?: PopperLikePlacement;\n TriggerComponent?: ComponentType<DropdownTriggerProps>;\n triggerProps?: Omit<DropdownTriggerProps, 'aria-expanded' | 'onClick' | 'referenceRef'>;\n referenceElement?: HTMLElement | null;\n}>;\n\nexport const Dropdown = ({\n children,\n className,\n onClose,\n onOpen,\n placement = 'bottom',\n referenceElement,\n TriggerComponent,\n triggerProps,\n}: DropdownProps) => {\n const [mountedReferenceElement, setMountedReferenceElement] =\n useState<HTMLElement | null>(null);\n const resolvedReferenceElement = TriggerComponent\n ? mountedReferenceElement\n : (referenceElement ?? null);\n const [isOpen, setIsOpen] = useState(!TriggerComponent);\n const [floatingElement, setFloatingElement] = useState<HTMLDivElement | null>(null);\n const { refs, strategy, update, x, y } = usePopoverPosition({\n placement,\n });\n\n useEffect(() => {\n if (!TriggerComponent) return;\n setIsOpen(false);\n }, [TriggerComponent]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n onClose?.();\n }, [onClose]);\n\n const open = useCallback(() => {\n setIsOpen(true);\n onOpen?.();\n }, [onOpen]);\n\n const toggle = useCallback(() => {\n if (isOpen) {\n close();\n return;\n }\n open();\n }, [close, isOpen, open]);\n\n useEffect(() => {\n refs.setReference(resolvedReferenceElement);\n }, [refs, resolvedReferenceElement]);\n\n useEffect(() => {\n refs.setFloating(floatingElement);\n }, [floatingElement, refs]);\n\n useEffect(() => {\n if (!isOpen || !floatingElement || !resolvedReferenceElement) return;\n update?.();\n }, [floatingElement, isOpen, resolvedReferenceElement, update]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (!(event.target instanceof Node)) return;\n if (floatingElement?.contains(event.target)) return;\n if (resolvedReferenceElement?.contains(event.target)) return;\n close();\n };\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n close();\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keyup', handleEscape);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keyup', handleEscape);\n };\n }, [close, floatingElement, isOpen, resolvedReferenceElement]);\n\n const DropdownTriggerComponent = TriggerComponent;\n\n const trigger = DropdownTriggerComponent ? (\n <DropdownTriggerComponent\n aria-expanded={isOpen}\n onClick={toggle}\n referenceRef={setMountedReferenceElement}\n {...triggerProps}\n />\n ) : null;\n\n const content =\n isOpen && resolvedReferenceElement ? (\n <FocusScope autoFocus restoreFocus>\n <DropdownContextProvider close={close}>\n <div\n className={clsx('str-chat__dropdown__items', className)}\n onClick={close}\n ref={setFloatingElement}\n style={{\n left: x ?? 0,\n position: strategy,\n top: y ?? 0,\n }}\n >\n {children}\n </div>\n </DropdownContextProvider>\n </FocusScope>\n ) : null;\n\n return (\n <div className='str-chat__dropdown'>\n {trigger}\n {content}\n </div>\n );\n};\n","import clsx from 'clsx';\nimport type {\n ComponentProps,\n KeyboardEventHandler,\n PropsWithChildren,\n ReactNode,\n} from 'react';\nimport React, { useRef } from 'react';\n\nexport type SwitchFieldProps = Omit<\n PropsWithChildren<ComponentProps<'input'>>,\n 'children'\n> & {\n /** Main label content when title/description are not used */\n children?: ReactNode;\n /** Optional description line below title */\n description?: string;\n /** Class applied to the root div element of the SwitchField component */\n fieldClassName?: string;\n /** Optional title line */\n title?: string;\n};\n\nexport const SwitchField = ({\n children,\n description,\n fieldClassName,\n title,\n ...props\n}: SwitchFieldProps) => {\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const handleSwitchKeyDown: KeyboardEventHandler<HTMLDivElement> = (e) => {\n if (![' ', 'Enter'].includes(e.key) || !inputRef.current) return;\n e.preventDefault();\n inputRef.current.click();\n };\n\n const id = props.id;\n\n return (\n <div\n className={clsx(\n 'str-chat__form__switch-field',\n fieldClassName,\n props.disabled && 'str-chat__form__switch-field--disabled',\n )}\n >\n <input\n aria-hidden\n className='str-chat__form__switch-field__input'\n id={id}\n type='checkbox'\n {...props}\n ref={inputRef}\n />\n {title ? (\n <SwitchFieldLabel\n description={description}\n htmlFor={id}\n onClick={() => inputRef.current?.click()}\n title={title}\n ></SwitchFieldLabel>\n ) : (\n children\n )}\n <Switch\n on={props.checked}\n onClick={() => inputRef.current?.click()}\n onKeyDown={handleSwitchKeyDown}\n />\n </div>\n );\n};\n\nexport type SwitchProps = ComponentProps<'div'> & {\n on?: boolean;\n};\n\nconst Switch = ({ on, ...props }: SwitchProps) => (\n <div\n {...props}\n aria-checked={on}\n className={clsx('str-chat__form__switch-field__switch', {\n 'str-chat__form__switch-field__switch--on': on,\n })}\n role='button'\n tabIndex={0}\n >\n <span className='str-chat__form__switch-field__switch-handle' />\n </div>\n);\n\nexport type SwitchFieldLabelProps = ComponentProps<'label'> & {\n /** Adds className str-chat__form__switch-field__label--as-error to the root */\n asError?: boolean;\n title?: string;\n description?: string;\n};\n\nexport const SwitchFieldLabel = ({\n asError,\n children,\n className,\n description,\n title,\n ...props\n}: SwitchFieldLabelProps) => (\n <label\n className={clsx(\n 'str-chat__form__switch-field__label',\n { 'str-chat__form__switch-field__label--as-error': asError },\n className,\n )}\n {...props}\n >\n <div className='str-chat__form__switch-field__label__content'>\n {title ? (\n <>\n <SwitchFieldTitle>{title}</SwitchFieldTitle>\n {description != null && description !== '' && (\n <SwitchFieldDescription>{description}</SwitchFieldDescription>\n )}\n </>\n ) : (\n children\n )}\n </div>\n </label>\n);\n\nexport type SwitchFieldTitleProps = ComponentProps<'div'> & {\n title?: string;\n};\n\nexport const SwitchFieldTitle = ({\n children,\n className,\n title,\n ...props\n}: SwitchFieldTitleProps) => (\n <div\n className={clsx('str-chat__form__switch-field__label__text', className)}\n {...props}\n >\n {children ?? title}\n </div>\n);\n\nexport type SwitchFieldDescriptionProps = ComponentProps<'div'> & {\n description?: string;\n};\n\nexport const SwitchFieldDescription = ({\n children,\n className,\n description,\n ...props\n}: SwitchFieldDescriptionProps) => (\n <div\n className={clsx('str-chat__form__switch-field__label__description', className)}\n {...props}\n >\n {children ?? description}\n </div>\n);\n","import React, {\n type ComponentType,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { useChatContext, useTranslationContext } from '../../context';\nimport { ContextMenuBody, ContextMenuButton, ContextMenuRoot, Prompt } from '../Dialog';\nimport {\n Dropdown,\n type DropdownTriggerProps,\n useDropdownContext,\n} from '../Form/Dropdown';\nimport { IconChevronDown } from '../Icons';\nimport { useMessageComposerController } from '../MessageComposer/hooks/useMessageComposerController';\nimport { SwitchField } from '../Form/SwitchField';\nimport { addNotificationTargetTag, useNotificationTarget } from '../Notifications';\nimport type { Coords } from 'stream-chat';\nimport { Button } from '../Button';\nimport clsx from 'clsx';\n\nconst MIN_LIVE_LOCATION_SHARE_DURATION = 60 * 1000; // 1 minute;\n\nconst DEFAULT_SHARE_LOCATION_DURATIONS = [\n 15 * 60 * 1000, // 15 minutes\n 60 * 60 * 1000, // 1 hour\n 8 * 60 * 60 * 1000, // 8 hours\n];\n\nexport type ShareGeolocationMapProps = Partial<Coords> & {\n loadingLocation: boolean;\n restartLocationWatching: () => void;\n geolocationPositionError?: GeolocationPositionError;\n};\n\nexport type ShareLocationDialogProps = {\n close: () => void;\n shareDurations?: number[];\n GeolocationMap?: ComponentType<ShareGeolocationMapProps>;\n DurationDropdownItems?: ComponentType<DurationDropdownItemsProps>;\n};\n\nconst DefaultGeolocationMap = () => null;\n\nconst LiveLocationDurationTrigger = ({\n children,\n onClick,\n referenceRef,\n ...props\n}: DropdownTriggerProps) => (\n <Button\n {...props}\n className='str-chat__live-location-sharing-duration-selector__button'\n onClick={onClick}\n ref={referenceRef as React.Ref<HTMLButtonElement>}\n type='button'\n >\n {children}\n </Button>\n);\n\nexport const ShareLocationDialog = ({\n close,\n GeolocationMap = DefaultGeolocationMap,\n shareDurations = DEFAULT_SHARE_LOCATION_DURATIONS,\n}: ShareLocationDialogProps) => {\n const { client } = useChatContext();\n const { t } = useTranslationContext();\n const panel = useNotificationTarget();\n const messageComposer = useMessageComposerController();\n const [durations, setDurations] = useState<number[]>([]);\n const [selectedDuration, setSelectedDuration] = useState<number | undefined>(undefined);\n const [geolocationPosition, setGeolocationPosition] =\n useState<GeolocationPosition | null>(null);\n const [loadingLocation, setLoadingLocation] = useState<boolean>(false);\n const [geolocationPositionError, setGeolocationPositionError] = useState<\n GeolocationPositionError | undefined\n >(undefined);\n\n const validShareDurations = useMemo(\n () => shareDurations.filter((d) => d >= MIN_LIVE_LOCATION_SHARE_DURATION),\n [shareDurations],\n );\n\n const selectedDurationLabel = useMemo(\n () =>\n durations.length > 0\n ? t('duration/Share Location', {\n milliseconds: selectedDuration ?? durations[0],\n })\n : undefined,\n [durations, selectedDuration, t],\n );\n\n const durationTriggerProps = useMemo(\n () => ({\n children: selectedDurationLabel ? (\n <>\n <span>{selectedDurationLabel}</span>\n <IconChevronDown />\n </>\n ) : null,\n }),\n [selectedDurationLabel],\n );\n\n const getPosition = useCallback(\n (): Promise<GeolocationPosition> =>\n new Promise((resolve, reject) => {\n navigator.geolocation.getCurrentPosition(\n (position) => {\n resolve(position);\n },\n (positionError) => {\n console.warn(positionError);\n reject(positionError);\n },\n { timeout: 1000 },\n );\n }),\n [],\n );\n\n const setupPositionWatching = useCallback(() => {\n setLoadingLocation(true);\n const watch = navigator.geolocation.watchPosition(\n (position) => {\n setGeolocationPosition(position);\n setLoadingLocation(false);\n setGeolocationPositionError(undefined);\n },\n (error) => {\n setGeolocationPosition(null);\n setLoadingLocation(false);\n setGeolocationPositionError(error);\n },\n { timeout: 1000 },\n );\n\n return () => {\n navigator.geolocation.clearWatch(watch);\n };\n }, []);\n\n useEffect(() => setupPositionWatching(), [setupPositionWatching]);\n\n const liveLocationSwitchEnabled = durations.length > 0;\n return (\n <Prompt.Root\n className='str-chat__share-location-dialog'\n data-testid='share-location-dialog'\n >\n <Prompt.Header close={close} title={t('Share Location')} />\n <Prompt.Body>\n <GeolocationMap\n geolocationPositionError={geolocationPositionError}\n latitude={geolocationPosition?.coords.latitude}\n loadingLocation={loadingLocation}\n longitude={geolocationPosition?.coords.longitude}\n restartLocationWatching={setupPositionWatching}\n />\n {validShareDurations.length > 0 && (\n <div\n className={clsx('str-chat__live-location-activation', {\n 'str-chat__live-location-activation--expanded': liveLocationSwitchEnabled,\n })}\n >\n <SwitchField\n checked={liveLocationSwitchEnabled}\n data-testid='share-location-dialog-live-location-switch'\n disabled={!geolocationPosition}\n onChange={(e) => {\n e.stopPropagation();\n if (liveLocationSwitchEnabled) {\n setDurations([]);\n setSelectedDuration(undefined);\n } else {\n setDurations(validShareDurations);\n setSelectedDuration(validShareDurations[0]);\n }\n }}\n title={t('Share live location for')}\n />\n {liveLocationSwitchEnabled && selectedDurationLabel && (\n <div className='str-chat__live-location-sharing-duration-selector'>\n <Dropdown\n placement='bottom-start'\n TriggerComponent={LiveLocationDurationTrigger}\n triggerProps={durationTriggerProps}\n >\n <DurationDropdownItems\n durations={durations}\n selectDuration={setSelectedDuration}\n />\n </Dropdown>\n </div>\n )}\n </div>\n )}\n </Prompt.Body>\n <Prompt.Footer>\n <Prompt.FooterControls>\n <Prompt.FooterControlsButtonSecondary\n className='str-chat__prompt__footer__controls-button--cancel'\n onClick={() => {\n messageComposer.locationComposer.initState();\n close();\n }}\n >\n {t('Cancel')}\n </Prompt.FooterControlsButtonSecondary>\n <Prompt.FooterControlsButtonSecondary\n className='str-chat__prompt__footer__controls-button--submit'\n disabled={!geolocationPosition}\n onClick={async () => {\n let coords = geolocationPosition && {\n latitude: geolocationPosition.coords.latitude,\n longitude: geolocationPosition.coords.longitude,\n };\n if (!coords) {\n coords = (await getPosition()).coords;\n }\n messageComposer.locationComposer.setData({\n ...coords,\n durationMs: selectedDuration,\n });\n close();\n }}\n type='submit'\n >\n {t('Attach')}\n </Prompt.FooterControlsButtonSecondary>\n <Prompt.FooterControlsButtonPrimary\n className='str-chat__prompt__footer__controls-button--submit'\n disabled={!geolocationPosition}\n onClick={async () => {\n let coords = geolocationPosition && {\n latitude: geolocationPosition.coords.latitude,\n longitude: geolocationPosition.coords.longitude,\n };\n if (!coords) {\n try {\n coords = (await getPosition()).coords;\n } catch (e) {\n client.notifications.addError({\n message: t('Failed to retrieve location'),\n options: {\n originalError: e instanceof Error ? e : undefined,\n tags: addNotificationTargetTag(panel),\n type: 'browser:location:get:failed',\n },\n origin: { emitter: 'ShareLocationDialog' },\n });\n return;\n }\n }\n\n messageComposer.locationComposer.setData({\n ...coords,\n durationMs: selectedDuration,\n });\n try {\n await messageComposer.sendLocation();\n } catch (err) {\n client.notifications.addError({\n message: t('Failed to share location'),\n options: {\n originalError: err instanceof Error ? err : undefined,\n tags: addNotificationTargetTag(panel),\n type: 'api:location:share:failed',\n },\n origin: { emitter: 'ShareLocationDialog' },\n });\n return;\n }\n close();\n }}\n type='submit'\n >\n {t('Share')}\n </Prompt.FooterControlsButtonPrimary>\n </Prompt.FooterControls>\n </Prompt.Footer>\n </Prompt.Root>\n );\n};\n\nexport type DurationDropdownItemsProps = {\n durations: number[];\n selectDuration: (duration: number) => void;\n};\nconst DurationDropdownItems = ({\n durations,\n selectDuration,\n}: DurationDropdownItemsProps) => {\n const { t } = useTranslationContext();\n const { close } = useDropdownContext();\n return (\n <ContextMenuRoot>\n <ContextMenuBody>\n {durations.map((duration) => (\n <ContextMenuButton\n className='str-chat__live-location-sharing-duration-option'\n key={`duration-${duration}`}\n onClick={() => {\n selectDuration(duration);\n close();\n }}\n role='option'\n >\n {t('duration/Share Location', { milliseconds: duration })}\n </ContextMenuButton>\n ))}\n </ContextMenuBody>\n </ContextMenuRoot>\n );\n};\n","import React, { useMemo } from 'react';\nimport { usePollContext, useTranslationContext } from '../../context';\nimport { useStateStore } from '../../store';\nimport type { PollOption, PollState } from 'stream-chat';\n\ntype PollStateSelectorReturnValue = {\n enforce_unique_vote: boolean;\n is_closed: boolean | undefined;\n max_votes_allowed: number;\n name: string;\n options: PollOption[];\n};\nconst pollStateSelector = (nextValue: PollState): PollStateSelectorReturnValue => ({\n enforce_unique_vote: nextValue.enforce_unique_vote,\n is_closed: nextValue.is_closed,\n max_votes_allowed: nextValue.max_votes_allowed,\n name: nextValue.name,\n options: nextValue.options,\n});\n\nexport const PollHeader = () => {\n const { t } = useTranslationContext('PollHeader');\n\n const { poll } = usePollContext();\n const { enforce_unique_vote, is_closed, max_votes_allowed, name, options } =\n useStateStore(poll.state, pollStateSelector);\n\n const selectionInstructions = useMemo(() => {\n if (is_closed) return t('Vote ended');\n if (enforce_unique_vote || options.length === 1) return t('Select one');\n if (max_votes_allowed)\n return t('Select up to {{count}}', {\n count: max_votes_allowed > options.length ? options.length : max_votes_allowed,\n });\n if (options.length > 1) return t('Select one or more');\n return '';\n }, [is_closed, enforce_unique_vote, max_votes_allowed, options.length, t]);\n\n if (!name) return;\n\n return (\n <div className='str-chat__poll-header'>\n <div className='str-chat__poll-title'>{name}</div>\n <div className='str-chat__poll-subtitle'>{selectionInstructions}</div>\n </div>\n );\n};\n","import clsx from 'clsx';\nimport type { ComponentProps, ReactNode } from 'react';\nimport React from 'react';\n\nexport type FieldErrorProps = ComponentProps<'div'> & {\n /** Error message (string or custom content e.g. icon + text) */\n text?: ReactNode;\n};\n\nexport const FieldError = ({ className, text, ...props }: FieldErrorProps) => (\n <div {...props} className={clsx('str-chat__form-field-error', className)}>\n {text}\n </div>\n);\n","import { nanoid } from 'nanoid';\nimport { useMemo } from 'react';\n\n/**\n * The ID is generated using the `nanoid` library and is memoized to ensure\n * that it remains the same across renders unless the key changes.\n */\nexport const useStableId = (key?: string) => {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const id = useMemo(() => nanoid(), [key]);\n\n return id;\n};\n","import clsx from 'clsx';\nimport React, { forwardRef, useCallback } from 'react';\nimport type { ChangeEvent, ComponentProps, KeyboardEvent } from 'react';\nimport { useStableId } from '../UtilityComponents/useStableId';\nimport { IconPlusSmall } from '../Icons';\nimport { Button } from '../Button';\n\nexport type NumericInputProps = Omit<\n ComponentProps<'input'>,\n 'className' | 'type' | 'value' | 'onChange'\n> & {\n value: string;\n onChange: (e: ChangeEvent<HTMLInputElement>) => void;\n /** Optional label above the input */\n label?: string;\n /** Minimum value (stepper) */\n min?: number;\n /** Maximum value (stepper) */\n max?: number;\n /** Step for increment/decrement (default 1) */\n step?: number;\n className?: string;\n};\n\nconst parseNumeric = (s: string): number | null => {\n const trimmed = s.trim();\n if (trimmed === '') return null;\n const n = Number(trimmed);\n return Number.isFinite(n) ? n : null;\n};\n\nconst clamp = (n: number, min: number, max: number): number =>\n Math.min(Math.max(n, min), max);\n\nexport const NumericInput = forwardRef<HTMLInputElement, NumericInputProps>(\n function NumericInput(\n {\n className,\n disabled = false,\n id: idProp,\n label,\n max,\n min,\n onChange,\n step = 1,\n value,\n ...inputProps\n },\n ref,\n ) {\n const generatedId = useStableId();\n const id = idProp ?? generatedId;\n\n const num = parseNumeric(value);\n const minDef = min ?? -Infinity;\n const maxDef = max ?? Infinity;\n const atMin = num !== null && num <= minDef;\n const atMax = num !== null && num >= maxDef;\n\n const handleInputChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n const next = e.target.value;\n if (next === '' || /^\\d+$/.test(next)) {\n onChange(e);\n }\n },\n [onChange],\n );\n\n const createChangeEvent = useCallback(\n (newValue: string): ChangeEvent<HTMLInputElement> =>\n ({\n currentTarget: { value: newValue },\n target: { value: newValue },\n }) as ChangeEvent<HTMLInputElement>,\n [],\n );\n\n const handleDecrement = useCallback(() => {\n if (disabled || atMin) return;\n const next = num !== null ? clamp(num - step, minDef, maxDef) : minDef;\n onChange(createChangeEvent(String(next)));\n }, [disabled, atMin, num, step, minDef, maxDef, onChange, createChangeEvent]);\n\n const handleIncrement = useCallback(() => {\n if (disabled || atMax) return;\n const next = num !== null ? clamp(num + step, minDef, maxDef) : minDef;\n onChange(createChangeEvent(String(next)));\n }, [disabled, atMax, num, step, minDef, maxDef, onChange, createChangeEvent]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n handleDecrement();\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n handleIncrement();\n }\n },\n [handleDecrement, handleIncrement],\n );\n\n return (\n <div\n className={clsx(\n 'str-chat__form-numeric-input',\n disabled && 'str-chat__form-numeric-input--disabled',\n className,\n )}\n >\n {!!label && (\n <label className='str-chat__form-numeric-input__label' htmlFor={id}>\n {label}\n </label>\n )}\n <div className={clsx('str-chat__form-numeric-input__wrapper')}>\n <Button\n appearance='outline'\n aria-label='Decrease value'\n circular\n className={clsx(\n 'str-chat__form-numeric-input__stepper str-chat__form-numeric-input__stepper--decrement',\n )}\n disabled={disabled || atMin}\n onClick={handleDecrement}\n variant='secondary'\n >\n <span aria-hidden className='str-chat__form-numeric-input__stepper-icon'>\n −\n </span>\n </Button>\n <input\n className='str-chat__form-numeric-input__input'\n disabled={disabled}\n id={id}\n inputMode='numeric'\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n ref={ref}\n type='text'\n value={value}\n {...inputProps}\n />\n <Button\n appearance='outline'\n aria-label='Increase value'\n circular\n className={clsx(\n 'str-chat__form-numeric-input__stepper str-chat__form-numeric-input__stepper--increment',\n )}\n disabled={disabled || atMax}\n onClick={handleIncrement}\n size='sm'\n variant='secondary'\n >\n <IconPlusSmall className='str-chat__form-numeric-input__stepper-icon' />\n </Button>\n </div>\n </div>\n );\n },\n);\n","import clsx from 'clsx';\nimport React, { forwardRef } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport { useStableId } from '../UtilityComponents/useStableId';\nimport { IconCheckmark2, IconExclamationCircle } from '../Icons';\n\nexport type TextInputVariant = 'outline' | 'ghost';\n\nexport type TextInputProps = Omit<ComponentProps<'input'>, 'className'> & {\n /** Optional label above the input */\n label?: string;\n /** Optional leading content (e.g. icon) inside the input area */\n leading?: ReactNode;\n /** Optional trailing content (e.g. clear button) inside the input area */\n trailing?: ReactNode;\n /** Optional suffix text shown after the input value, inside the field */\n trailingText?: string;\n /** Neutral/helper message below the input (no icon) */\n message?: ReactNode;\n /** Error message below the input; shown when error is true, with errorMessageIcon */\n errorMessage?: ReactNode;\n /** Icon shown before error message (default: IconExclamationCircle) */\n errorMessageIcon?: ReactNode;\n /** Success message below the input; shown when provided, with successMessageIcon */\n successMessage?: ReactNode;\n /** Icon shown before success message (default: IconCheckmark2) */\n successMessageIcon?: ReactNode;\n /** When true, shows error border and error message styling */\n error?: boolean;\n /** Visual variant: outline = border always visible, ghost = border only on focus */\n variant?: TextInputVariant;\n /** Optional class name for the root wrapper */\n className?: string;\n};\n\nexport const TextInput = forwardRef<HTMLInputElement, TextInputProps>(function TextInput(\n {\n className,\n disabled,\n error = false,\n errorMessage,\n errorMessageIcon,\n id: idProp,\n label,\n leading,\n message,\n successMessage,\n successMessageIcon,\n trailing,\n trailingText,\n variant = 'outline',\n ...inputProps\n },\n ref,\n) {\n const generatedId = useStableId();\n const id = idProp ?? generatedId;\n\n const displayError = error && (errorMessage != null || message != null);\n const displaySuccess = successMessage != null;\n const displayNeutralMessage = message != null && !error;\n const displayMessage = displayError || displaySuccess || displayNeutralMessage;\n\n const messageId = displayMessage ? `${id}-message` : undefined;\n\n const messageContent = displayError ? (\n <>\n <span aria-hidden className='str-chat__form-text-input__message-icon'>\n {errorMessageIcon ?? <IconExclamationCircle />}\n </span>\n {errorMessage ?? message}\n </>\n ) : displaySuccess ? (\n <>\n <span aria-hidden className='str-chat__form-text-input__message-icon'>\n {successMessageIcon ?? <IconCheckmark2 />}\n </span>\n {successMessage}\n </>\n ) : displayNeutralMessage ? (\n (message as ReactNode)\n ) : null;\n\n return (\n <div\n className={clsx(\n 'str-chat__form-text-input',\n error && 'str-chat__form-text-input--error',\n displaySuccess && 'str-chat__form-text-input--success',\n disabled && 'str-chat__form-text-input--disabled',\n className,\n )}\n >\n {!!label && (\n <label className='str-chat__form-text-input__label' htmlFor={id}>\n {label}\n </label>\n )}\n <div\n className={clsx(\n 'str-chat__form-text-input__wrapper',\n `str-chat__form-text-input__wrapper--${variant}`,\n )}\n >\n {!!leading && (\n <span aria-hidden className='str-chat__form-text-input__leading'>\n {leading}\n </span>\n )}\n <input\n aria-describedby={messageId}\n aria-invalid={error}\n className='str-chat__form-text-input__input'\n disabled={disabled}\n id={id}\n ref={ref}\n {...inputProps}\n />\n {trailingText != null && (\n <span aria-hidden className='str-chat__form-text-input__suffix'>\n {trailingText}\n </span>\n )}\n {!!trailing && (\n <span aria-hidden className='str-chat__form-text-input__trailing'>\n {trailing}\n </span>\n )}\n </div>\n {messageContent != null && (\n <div\n className={clsx(\n 'str-chat__form-text-input__message',\n displayError && 'str-chat__form-field-error',\n displaySuccess && 'str-chat__form-text-input__message--success',\n )}\n id={messageId}\n role={error ? 'alert' : undefined}\n >\n {messageContent}\n </div>\n )}\n </div>\n );\n});\n","import type { PropsWithChildren } from 'react';\nimport React, { useEffect, useState } from 'react';\nimport clsx from 'clsx';\n\nexport type DragAndDropContainerProps = PropsWithChildren<{\n className?: string;\n draggable?: boolean;\n onSetNewOrder?: (newOrder: number[]) => void;\n}>;\n\nexport const DragAndDropContainer = ({\n children,\n className,\n draggable,\n onSetNewOrder,\n}: DragAndDropContainerProps) => {\n const [order, setOrder] = useState<number[]>([]);\n const [dragStartIndex, setDragStartIndex] = useState<number | null>(null);\n const [dragOverIndex, setDragOverIndex] = useState<number | null>(null);\n const [container, setContainer] = useState<HTMLDivElement | null>(null);\n\n const moveDirection =\n dragStartIndex === null || dragOverIndex === null\n ? undefined\n : dragStartIndex <= dragOverIndex\n ? 'down'\n : 'up';\n\n const childrenArray = React.Children.toArray(children);\n\n useEffect(() => {\n setOrder(React.Children.map(children, (_, index) => index) || []);\n }, [children]);\n\n useEffect(() => {\n if (!container) return;\n\n const handleDragStart = (e: DragEvent) => {\n const target = e.target as HTMLElement;\n const draggableItem = target.closest('.str-chat__drag-and-drop-container__item');\n if (e.dataTransfer) {\n e.dataTransfer.effectAllowed = 'move';\n }\n\n if (draggableItem instanceof HTMLElement) {\n const index = Array.from(draggableItem.parentElement?.children || []).indexOf(\n draggableItem,\n );\n setDragStartIndex(index);\n e.dataTransfer?.setData('text/plain', index.toString());\n draggableItem.style.opacity = '0.3';\n }\n };\n\n const handleDragOver = (e: DragEvent) => {\n e.preventDefault();\n const target = e.target as HTMLElement;\n const draggableItem = target.closest('.str-chat__drag-and-drop-container__item');\n if (draggableItem instanceof HTMLElement) {\n const index = Array.from(draggableItem.parentElement?.children || []).indexOf(\n draggableItem,\n );\n setDragOverIndex(index);\n }\n };\n\n const handleDragLeave = () => {\n setDragOverIndex(null);\n };\n\n const handleDrop = (e: DragEvent) => {\n e.preventDefault();\n const draggedIndex = parseInt(e.dataTransfer?.getData('text/plain') || '-1', 10);\n const target = e.target as HTMLElement;\n const draggableItem = target.closest('.str-chat__drag-and-drop-container__item');\n if (draggableItem instanceof HTMLElement) {\n const dropIndex = Array.from(draggableItem.parentElement?.children || []).indexOf(\n draggableItem,\n );\n if (draggedIndex !== -1 && draggedIndex !== dropIndex) {\n setOrder((prevOrder) => {\n const newOrder = [...prevOrder];\n const [removed] = newOrder.splice(draggedIndex, 1);\n newOrder.splice(dropIndex, 0, removed);\n onSetNewOrder?.(newOrder);\n return newOrder;\n });\n }\n }\n setDragStartIndex(null);\n setDragOverIndex(null);\n };\n\n const handleDragEnd = (e: DragEvent) => {\n const target = e.target as HTMLElement;\n if (target instanceof HTMLElement) {\n target.style.opacity = '';\n }\n setDragStartIndex(null);\n setDragOverIndex(null);\n };\n\n container.addEventListener('dragstart', handleDragStart);\n container.addEventListener('dragover', handleDragOver);\n container.addEventListener('dragleave', handleDragLeave);\n container.addEventListener('drop', handleDrop);\n container.addEventListener('dragend', handleDragEnd);\n\n return () => {\n container.removeEventListener('dragstart', handleDragStart);\n container.removeEventListener('dragover', handleDragOver);\n container.removeEventListener('dragleave', handleDragLeave);\n container.removeEventListener('drop', handleDrop);\n container.removeEventListener('dragend', handleDragEnd);\n };\n }, [container, onSetNewOrder]);\n\n return (\n <div\n className={clsx('str-chat__drag-and-drop-container', className)}\n ref={setContainer}\n >\n {order.map((originalIndex, currentIndex) => {\n const child = childrenArray[originalIndex];\n return (\n <div\n className={clsx('str-chat__drag-and-drop-container__item', {\n 'str-chat__drag-and-drop-container__item--dragged-over-from-bottom':\n moveDirection === 'up' && dragOverIndex === currentIndex,\n 'str-chat__drag-and-drop-container__item--dragged-over-from-top':\n moveDirection === 'down' && dragOverIndex === currentIndex,\n })}\n draggable={draggable}\n key={\n React.isValidElement(child) ? child.key : `draggable-item-${originalIndex}`\n }\n >\n {child}\n </div>\n );\n })}\n </div>\n );\n};\n","import React from 'react';\nimport clsx from 'clsx';\nimport {\n DragAndDropContainer,\n type DragAndDropContainerProps,\n} from '../DragAndDrop/DragAndDropContainer';\n\nexport type TextInputFieldSetProps = DragAndDropContainerProps & {\n label?: string;\n};\n\nexport const TextInputFieldSet = ({\n children,\n className,\n draggable,\n label,\n onSetNewOrder,\n}: TextInputFieldSetProps) => (\n <fieldset className={clsx('str-chat__form__input-fieldset', className)}>\n <legend className='str-chat__form__input-fieldset__label'>{label}</legend>\n <DragAndDropContainer\n className='str-chat__form__input-fieldset__values'\n draggable={draggable}\n onSetNewOrder={onSetNewOrder}\n >\n {children}\n </DragAndDropContainer>\n </fieldset>\n);\n","import type { Dispatch, SetStateAction } from 'react';\nimport { useCallback, useState } from 'react';\n\nexport type Validators<V extends Record<string, unknown>> = {\n [K in keyof V]?: (value: V[K]) => Error | undefined;\n};\n\nexport type UseFormStateOptions<V extends Record<string, unknown>> = {\n initialValue: V;\n validators?: Validators<V>;\n onSubmit: (value: V) => Promise<void>;\n};\n\nexport type UseFormStateReturn<V extends Record<string, unknown>> = {\n value: V;\n setValue: Dispatch<SetStateAction<V>>;\n setFieldValue: (field: keyof V, value: V[keyof V]) => void;\n fieldErrors: Record<string, Error>;\n handleSubmit: (e?: React.FormEvent) => void;\n};\n\nexport function useFormState<V extends Record<string, unknown>>(\n options: UseFormStateOptions<V>,\n): UseFormStateReturn<V> {\n const { initialValue, onSubmit, validators = {} as Validators<V> } = options;\n const [value, setValue] = useState<V>(initialValue);\n const [fieldErrors, setFieldErrors] = useState<Record<string, Error>>({});\n\n const setFieldValue = useCallback(\n (field: keyof V, fieldValue: V[keyof V]) => {\n setValue((prev) => ({ ...prev, [field]: fieldValue }) as V);\n const validator = validators[field];\n if (validator) {\n const err = validator(fieldValue);\n setFieldErrors((prev) => {\n const next = { ...prev };\n if (err) next[field as string] = err;\n else delete next[field as string];\n return next;\n });\n }\n },\n [validators],\n );\n\n const handleSubmit = useCallback(\n (e?: React.FormEvent) => {\n e?.preventDefault();\n const errors: Record<string, Error> = {};\n for (const key of Object.keys(value) as (keyof V)[]) {\n const validator = validators[key];\n if (validator) {\n const err = validator(value[key]);\n if (err) errors[key as string] = err;\n }\n }\n if (Object.keys(errors).length > 0) {\n setFieldErrors(errors);\n return;\n }\n setFieldErrors({});\n void onSubmit(value);\n },\n [value, validators, onSubmit],\n );\n\n return {\n fieldErrors,\n handleSubmit,\n setFieldValue,\n setValue,\n value,\n };\n}\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useStateStore } from '../../../store';\nimport { useModalContext, usePollContext, useTranslationContext } from '../../../context';\nimport type { PollAnswer, PollState } from 'stream-chat';\nimport { Prompt } from '../../Dialog';\nimport { TextInput } from '../../Form';\nimport { useFormState } from '../../Form/hooks';\n\ntype PollStateSelectorReturnValue = { ownAnswer: PollAnswer | undefined };\nconst pollStateSelector = (nextValue: PollState): PollStateSelectorReturnValue => ({\n ownAnswer: nextValue.ownAnswer,\n});\n\nexport type AddCommentPromptProps = {\n messageId: string;\n};\n\nexport const AddCommentPrompt = ({ messageId }: AddCommentPromptProps) => {\n const { t } = useTranslationContext();\n const { close } = useModalContext();\n const { poll } = usePollContext();\n const { ownAnswer } = useStateStore(poll.state, pollStateSelector);\n const [input, setInput] = useState<HTMLInputElement | null>(null);\n\n const initialComment = ownAnswer?.answer_text ?? '';\n const initialValue = useMemo(() => ({ comment: initialComment }), [initialComment]);\n const validators = useMemo(\n () => ({\n comment: (v: string) => {\n const trimmed = typeof v === 'string' ? v.trim() : '';\n if (!trimmed) {\n return new Error(t('This field cannot be empty or contain only spaces'));\n }\n return undefined;\n },\n }),\n [t],\n );\n const onSubmit = useCallback(\n async (formValue: { comment: string }) => {\n await poll.addAnswer(formValue.comment, messageId);\n close();\n },\n [poll, messageId, close],\n );\n const { fieldErrors, handleSubmit, setFieldValue, value } = useFormState<{\n comment: string;\n }>({\n initialValue,\n onSubmit,\n validators,\n });\n\n useEffect(() => {\n input?.focus();\n }, [input]);\n\n const title = ownAnswer ? t('Update your comment') : t('Add a comment');\n const submitDisabled =\n !value.comment?.trim() || value.comment === ownAnswer?.answer_text;\n\n return (\n <Prompt.Root className='str-chat__modal__poll-add-comment'>\n {title && <Prompt.Header close={close} title={title} />}\n <form autoComplete='off' onSubmit={handleSubmit}>\n <Prompt.Body>\n <TextInput\n aria-label={title}\n error={!!fieldErrors.comment}\n errorMessage={fieldErrors.comment?.message}\n id='comment'\n name='comment'\n onChange={(e) => setFieldValue('comment', e.target.value)}\n placeholder={t('placeholder/PollComment')}\n ref={setInput}\n required\n type='text'\n value={value.comment}\n />\n </Prompt.Body>\n <Prompt.Footer>\n <Prompt.FooterControls>\n <Prompt.FooterControlsButtonSecondary\n className='str-chat__prompt__footer__controls-button--cancel'\n onClick={close}\n type='button'\n >\n {t('Cancel')}\n </Prompt.FooterControlsButtonSecondary>\n <Prompt.FooterControlsButtonPrimary\n className='str-chat__prompt__footer__controls-button--submit'\n disabled={Object.keys(fieldErrors).length > 0 || submitDisabled}\n type='submit'\n >\n {initialComment ? t('Update') : t('Send')}\n </Prompt.FooterControlsButtonPrimary>\n </Prompt.FooterControls>\n </Prompt.Footer>\n </form>\n </Prompt.Root>\n );\n};\n","import React from 'react';\nimport { Alert } from '../../Dialog';\nimport {\n useChatContext,\n useModalContext,\n usePollContext,\n useTranslationContext,\n} from '../../../context';\nimport { Button } from '../../Button';\nimport { addNotificationTargetTag, useNotificationTarget } from '../../Notifications';\n\nexport const EndPollAlert = () => {\n const { client } = useChatContext();\n const { t } = useTranslationContext();\n const { poll } = usePollContext();\n const { close } = useModalContext();\n const panel = useNotificationTarget();\n\n return (\n <Alert.Root className={'str-chat__end-poll-alert'}>\n <Alert.Header\n description={t(\n 'Do you want to end this poll now? Nobody will be able to vote in this poll anymore.',\n )}\n title={t('End this poll?')}\n ></Alert.Header>\n <Alert.Actions>\n <Button\n appearance='outline'\n className='str-chat__end-poll-alert__end-vote-button'\n data-testid='end-poll-alert-end-vote-button'\n onClick={async () => {\n try {\n await poll.close();\n close();\n client.notifications.addSuccess({\n message: t('Poll ended'),\n options: {\n tags: addNotificationTargetTag(panel),\n type: 'api:poll:end:success',\n },\n origin: { emitter: 'EndPollAlert' },\n });\n } catch (e) {\n client.notifications.addError({\n message: t('Failed to end the poll'),\n options: {\n originalError: e instanceof Error ? e : undefined,\n tags: addNotificationTargetTag(panel),\n type: 'api:poll:end:failed',\n },\n origin: { emitter: 'EndPollAlert' },\n });\n }\n }}\n size='md'\n variant='danger'\n >\n {t('End poll')}\n </Button>\n <Button\n appearance='outline'\n className='str-chat__end-poll-alert__cancel-button'\n data-testid='end-poll-alert-cancel-button'\n onClick={close}\n size='md'\n variant='secondary'\n >\n {t('Cancel')}\n </Button>\n </Alert.Actions>\n </Alert.Root>\n );\n};\n","import type { PropsWithChildren } from 'react';\nimport React from 'react';\nimport { GlobalModal } from '../../Modal';\nimport { useComponentContext } from '../../../context';\nimport { Button } from '../../Button';\nimport clsx from 'clsx';\n\nexport type PollActionProps = {\n buttonText: string;\n closeModal: () => void;\n modalIsOpen: boolean;\n openModal: () => void;\n /**\n * Additional actions are shown based on the poll settings defined by the creator.\n * Examples are \"Suggest an option\", \"Add a comment\", \"View N comment(s)\".\n */\n isAdditionalAction?: boolean;\n modalClassName?: string;\n};\n\nexport const PollAction = ({\n buttonText,\n children,\n closeModal,\n isAdditionalAction,\n modalClassName,\n modalIsOpen,\n openModal,\n}: PropsWithChildren<PollActionProps>) => {\n const { Modal = GlobalModal } = useComponentContext();\n return (\n <>\n <Button\n appearance='outline'\n className={clsx('str-chat__poll-action', {\n 'str-chat__poll-action--additional': isAdditionalAction,\n })}\n onClick={openModal}\n size='md'\n variant='secondary'\n >\n {buttonText}\n </Button>\n <Modal className={modalClassName} onClose={closeModal} open={modalIsOpen}>\n {children}\n </Modal>\n </>\n );\n};\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n useChatContext,\n useModalContext,\n usePollContext,\n useTranslationContext,\n} from '../../../context';\nimport { useStateStore } from '../../../store';\nimport type { PollOption, PollState } from 'stream-chat';\nimport { Prompt } from '../../Dialog';\nimport { TextInput } from '../../Form';\nimport { useFormState } from '../../Form/hooks';\n\ntype PollStateSelectorReturnValue = { options: PollOption[] };\nconst pollStateSelector = (nextValue: PollState): PollStateSelectorReturnValue => ({\n options: nextValue.options,\n});\n\nexport type SuggestPollOptionFormProps = Record<string, never>;\n\nexport const SuggestPollOptionPrompt = () => {\n const { client } = useChatContext();\n const { t } = useTranslationContext();\n const { poll } = usePollContext();\n const { close } = useModalContext();\n const { options } = useStateStore(poll.state, pollStateSelector);\n const [input, setInput] = useState<HTMLInputElement | null>(null);\n\n const initialValue = useMemo(() => ({ optionText: '' }), []);\n const validators = useMemo(\n () => ({\n optionText: (v: string) => {\n const trimmed = typeof v === 'string' ? v.trim() : '';\n if (!trimmed) {\n return new Error(t('This field cannot be empty or contain only spaces'));\n }\n const existingOption = options.find((option) => option.text === trimmed);\n if (existingOption) {\n return new Error(t('Option already exists'));\n }\n return undefined;\n },\n }),\n [t, options],\n );\n\n const onSubmit = useCallback(\n async (formValue: { optionText: string }) => {\n await client.createPollOption(poll.id, {\n text: formValue.optionText,\n });\n close();\n },\n [client, poll, close],\n );\n\n const { fieldErrors, handleSubmit, setFieldValue, value } = useFormState<{\n optionText: string;\n }>({\n initialValue,\n onSubmit,\n validators,\n });\n\n useEffect(() => {\n input?.focus();\n }, [input]);\n\n const submitDisabled = !value.optionText?.trim();\n\n return (\n <Prompt.Root className='str-chat__modal__suggest-poll-option-prompt'>\n <Prompt.Header close={close} title={t('Suggest an option')} />\n <form autoComplete='off' onSubmit={handleSubmit}>\n <Prompt.Body>\n <TextInput\n aria-label={t('Suggest an option')}\n error={!!fieldErrors.optionText}\n errorMessage={fieldErrors.optionText?.message}\n id='optionText'\n name='optionText'\n onChange={(e) => setFieldValue('optionText', e.target.value)}\n placeholder={t('placeholder/PollOptionSuggestion')}\n ref={setInput}\n required\n type='text'\n value={value.optionText}\n />\n </Prompt.Body>\n <Prompt.Footer>\n <Prompt.FooterControls>\n <Prompt.FooterControlsButtonSecondary\n className='str-chat__prompt__footer__controls-button--cancel'\n onClick={close}\n >\n {t('Cancel')}\n </Prompt.FooterControlsButtonSecondary>\n <Prompt.FooterControlsButtonPrimary\n className='str-chat__prompt__footer__controls-button--submit'\n disabled={Object.keys(fieldErrors).length > 0 || submitDisabled}\n type='submit'\n >\n {t('Send')}\n </Prompt.FooterControlsButtonPrimary>\n </Prompt.FooterControls>\n </Prompt.Footer>\n </form>\n </Prompt.Root>\n );\n};\n","import React, { useState } from 'react';\nimport { Avatar } from '../Avatar';\nimport { PopperTooltip } from '../Tooltip';\nimport { useEnterLeaveHandlers } from '../Tooltip/hooks';\nimport { useChatContext, useTranslationContext } from '../../context';\n\nimport type { PollVote as PollVoteType } from 'stream-chat';\n\nconst PollVoteTimestamp = ({ timestamp }: { timestamp: string }) => {\n const { t } = useTranslationContext();\n const { handleEnter, handleLeave, tooltipVisible } =\n useEnterLeaveHandlers<HTMLSpanElement>();\n const [referenceElement, setReferenceElement] = useState<HTMLSpanElement | null>(null);\n const timestampDate = new Date(timestamp);\n return (\n <div\n className='str-chat__poll-vote__timestamp'\n onMouseEnter={handleEnter}\n onMouseLeave={handleLeave}\n ref={setReferenceElement}\n >\n {t('timestamp/PollVote', { timestamp: timestampDate })}\n <PopperTooltip\n offset={[0, 5]}\n placement='bottom'\n referenceElement={referenceElement}\n visible={tooltipVisible}\n >\n {t('timestamp/PollVoteTooltip', { timestamp: timestampDate })}\n </PopperTooltip>\n </div>\n );\n};\n\ntype PollVoteProps = {\n vote: PollVoteType;\n};\n\ntype PollVoteAuthor = PollVoteProps;\n\nconst PollVoteAuthor = ({ vote }: PollVoteAuthor) => {\n const { t } = useTranslationContext();\n const { client } = useChatContext();\n const displayName =\n client.user?.id && client.user.id === vote.user?.id\n ? t('You')\n : vote.user?.name || t('Anonymous');\n\n return (\n <div className='str-chat__poll-vote__author'>\n {vote.user && (\n <Avatar\n className='str-chat__avatar--poll-vote-author'\n imageUrl={vote.user.image}\n key={`poll-vote-${vote.id}-avatar-${vote.user.id}`}\n size='md'\n userName={vote.user.name}\n />\n )}\n <div className='str-chat__poll-vote__author__name'>{displayName}</div>\n </div>\n );\n};\n\nexport const PollVote = ({ vote }: PollVoteProps) => (\n <div className='str-chat__poll-vote'>\n <PollVoteAuthor vote={vote} />\n <PollVoteTimestamp timestamp={vote.created_at} />\n </div>\n);\n\nexport type PollVoteListingProps = {\n votes: PollVoteType[];\n};\n\nexport const PollVoteListing = ({ votes }: PollVoteListingProps) => (\n <div className='str-chat__poll-vote-listing'>\n {votes.map((vote) => (\n <PollVote key={`poll-vote-${vote.id}`} vote={vote} />\n ))}\n </div>\n);\n","import { useEffect, useState } from 'react';\nimport { isVoteAnswer } from 'stream-chat';\nimport { useChatContext } from '../../../context';\nimport type { Event, PollAnswer, PollVote } from 'stream-chat';\n\nimport type { CursorPaginatorStateStore } from '../../InfiniteScrollPaginator/hooks/useCursorPaginator';\n\nexport function useManagePollVotesRealtime<T extends PollVote | PollAnswer = PollVote>(\n managedVoteType: 'answer' | 'vote',\n cursorPaginatorState?: CursorPaginatorStateStore<T>,\n optionId?: string,\n) {\n const { client } = useChatContext();\n const [votesInRealtime, setVotesInRealtime] = useState<T[]>(\n cursorPaginatorState?.getLatestValue().items ?? [],\n );\n\n useEffect(\n () =>\n cursorPaginatorState?.subscribeWithSelector(\n (state) => [state.latestPageItems],\n ([latestPageItems]) =>\n setVotesInRealtime((prev) => [...prev, ...latestPageItems]),\n ),\n [cursorPaginatorState],\n );\n\n useEffect(() => {\n const handleVoteEvent = (event: Event) => {\n if (!event.poll_vote) return;\n const isAnswer = isVoteAnswer(event.poll_vote);\n if (\n (managedVoteType === 'answer' && !isAnswer) ||\n (managedVoteType === 'vote' &&\n (isAnswer || event.poll_vote.option_id !== optionId))\n )\n return;\n\n if (event.type === 'poll.vote_removed') {\n setVotesInRealtime((prev) =>\n event.poll_vote\n ? prev.filter((vote) => vote.id !== (event.poll_vote as T).id)\n : prev,\n );\n }\n if (event.type === 'poll.vote_changed') {\n setVotesInRealtime((prev) =>\n event.poll_vote\n ? prev.filter((vote) => vote.id !== (event.poll_vote as T).id)\n : prev,\n );\n }\n if (['poll.vote_casted', 'poll.vote_changed'].includes(event.type)) {\n setVotesInRealtime((prev) =>\n event.poll_vote ? [event.poll_vote as T, ...prev] : prev,\n );\n }\n };\n\n const voteCastedSubscription = client.on('poll.vote_casted', handleVoteEvent);\n const voteRemovedSubscription = client.on('poll.vote_removed', handleVoteEvent);\n const voteChangedSubscription = client.on('poll.vote_changed', handleVoteEvent);\n\n return () => {\n voteCastedSubscription.unsubscribe();\n voteRemovedSubscription.unsubscribe();\n voteChangedSubscription.unsubscribe();\n };\n }, [client, optionId, managedVoteType]);\n\n return votesInRealtime;\n}\n","import uniqBy from 'lodash.uniqby';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport { StateStore } from 'stream-chat';\n\nexport type CursorPaginatorState<T> = {\n hasNextPage: boolean;\n items: T[];\n latestPageItems: T[];\n loading: boolean;\n error?: Error;\n next?: string | null;\n};\n\nexport type CursorPaginatorStateStore<T> = StateStore<CursorPaginatorState<T>>;\n\nexport type PaginationFn<T> = (next?: string) => Promise<{ items: T[]; next?: string }>;\n\nexport const useCursorPaginator = <T>(\n paginationFn: PaginationFn<T>,\n loadFirstPage?: boolean,\n) => {\n const cursorPaginatorState = useMemo(\n () =>\n new StateStore<CursorPaginatorState<T>>({\n hasNextPage: true,\n items: [],\n latestPageItems: [],\n loading: false,\n }),\n [],\n );\n\n const loadMore = useCallback(async () => {\n const { loading, next: currentNext } = cursorPaginatorState.getLatestValue();\n if (currentNext === null || loading) return;\n\n cursorPaginatorState.partialNext({ loading: true });\n\n try {\n const { items, next } = await paginationFn(currentNext);\n cursorPaginatorState.next((prev) => ({\n ...prev,\n hasNextPage: !!next,\n items: uniqBy(prev.items.concat(items), 'id'),\n latestPageItems: items,\n next: next || null,\n }));\n } catch (error) {\n cursorPaginatorState.partialNext({ error: error as Error });\n }\n cursorPaginatorState.partialNext({ loading: false });\n }, [cursorPaginatorState, paginationFn]);\n\n useEffect(() => {\n const { items } = cursorPaginatorState.getLatestValue();\n if (!loadFirstPage || items.length) return;\n loadMore();\n }, [cursorPaginatorState, loadFirstPage, loadMore]);\n\n return {\n cursorPaginatorState,\n loadMore,\n };\n};\n","import { useCallback } from 'react';\nimport { useManagePollVotesRealtime } from './useManagePollVotesRealtime';\nimport type {\n CursorPaginatorState,\n PaginationFn,\n} from '../../InfiniteScrollPaginator/hooks/useCursorPaginator';\nimport { useCursorPaginator } from '../../InfiniteScrollPaginator/hooks/useCursorPaginator';\nimport { usePollContext } from '../../../context';\n\nimport { useStateStore } from '../../../store';\nimport type { PollAnswer, PollAnswersQueryParams, PollVote } from 'stream-chat';\n\nconst paginationStateSelector = (\n state: CursorPaginatorState<PollVote>,\n): [Error | undefined, boolean, boolean] => [\n state.error,\n state.hasNextPage,\n state.loading,\n];\n\ntype UsePollAnswerPaginationParams = {\n paginationParams?: PollAnswersQueryParams;\n};\n\nexport const usePollAnswerPagination = ({\n paginationParams,\n}: UsePollAnswerPaginationParams = {}) => {\n const { poll } = usePollContext();\n\n const paginationFn = useCallback<PaginationFn<PollAnswer>>(\n async (next) => {\n const { next: newNext, votes } = await poll.queryAnswers({\n filter: paginationParams?.filter,\n options: !next\n ? paginationParams?.options\n : { ...paginationParams?.options, next },\n sort: { created_at: -1, ...paginationParams?.sort },\n });\n return { items: votes, next: newNext };\n },\n [paginationParams, poll],\n );\n\n const { cursorPaginatorState, loadMore } = useCursorPaginator(paginationFn, true);\n const answers = useManagePollVotesRealtime<PollAnswer>('answer', cursorPaginatorState);\n const [error, hasNextPage, loading] = useStateStore(\n cursorPaginatorState,\n paginationStateSelector,\n );\n\n return {\n answers,\n error,\n hasNextPage,\n loading,\n loadMore,\n };\n};\n","import { useCallback } from 'react';\nimport { useManagePollVotesRealtime } from './useManagePollVotesRealtime';\nimport type {\n CursorPaginatorState,\n PaginationFn,\n} from '../../InfiniteScrollPaginator/hooks/useCursorPaginator';\nimport { useCursorPaginator } from '../../InfiniteScrollPaginator/hooks/useCursorPaginator';\nimport { useStateStore } from '../../../store';\nimport { usePollContext } from '../../../context';\n\nimport type { PollOptionVotesQueryParams, PollVote } from 'stream-chat';\n\nconst paginationStateSelector = (\n state: CursorPaginatorState<PollVote>,\n): [Error | undefined, boolean, boolean] => [\n state.error,\n state.hasNextPage,\n state.loading,\n];\n\ntype UsePollOptionVotesPaginationParams = {\n paginationParams: PollOptionVotesQueryParams;\n};\n\nexport const usePollOptionVotesPagination = ({\n paginationParams,\n}: UsePollOptionVotesPaginationParams) => {\n const { poll } = usePollContext();\n\n const paginationFn = useCallback<PaginationFn<PollVote>>(\n async (next) => {\n const { next: newNext, votes } = await poll.queryOptionVotes({\n filter: paginationParams.filter,\n options: !next\n ? paginationParams?.options\n : { ...paginationParams?.options, next },\n sort: { created_at: -1, ...paginationParams?.sort },\n });\n return { items: votes, next: newNext };\n },\n [paginationParams, poll],\n );\n\n const { cursorPaginatorState, loadMore } = useCursorPaginator(paginationFn, true);\n const votes = useManagePollVotesRealtime<PollVote>(\n 'vote',\n cursorPaginatorState,\n paginationParams.filter.option_id,\n );\n const [error, hasNextPage, loading] = useStateStore(\n cursorPaginatorState,\n paginationStateSelector,\n );\n\n return {\n error,\n hasNextPage,\n loading,\n loadMore,\n votes,\n };\n};\n","import clsx from 'clsx';\nimport debounce from 'lodash.debounce';\nimport type { PropsWithChildren } from 'react';\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD } from '../../constants/limits';\n\n/**\n * Prevents Chrome hangups\n * See: https://stackoverflow.com/questions/47524205/random-high-content-download-time-in-chrome/47684257#47684257\n */\nconst mousewheelListener = (event: Event) => {\n if (event instanceof WheelEvent && event.deltaY === 1) {\n event.preventDefault();\n }\n};\n\nexport type InfiniteScrollPaginatorProps = React.ComponentProps<'div'> & {\n listenToScroll?: (\n distanceFromBottom: number,\n distanceFromTop: number,\n threshold: number,\n ) => void;\n loadNextDebounceMs?: number;\n loadNextOnScrollToBottom?: () => void;\n loadNextOnScrollToTop?: () => void;\n /** Offset from when to start the loadNextPage call */\n threshold?: number;\n useCapture?: boolean;\n};\n\nexport const InfiniteScrollPaginator = (\n props: PropsWithChildren<InfiniteScrollPaginatorProps>,\n) => {\n const {\n children,\n className,\n listenToScroll,\n loadNextDebounceMs = 500,\n loadNextOnScrollToBottom,\n loadNextOnScrollToTop,\n threshold = DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD,\n useCapture = false,\n ...componentProps\n } = props;\n\n const rootRef = useRef<HTMLDivElement | null>(null);\n const childRef = useRef<HTMLDivElement | null>(null);\n\n const scrollListener = useMemo(\n () =>\n debounce(() => {\n const root = rootRef.current;\n const child = childRef.current;\n if (!root || root.offsetParent === null || !child) {\n return;\n }\n\n const distanceFromBottom =\n child.scrollHeight - root.scrollTop - root.clientHeight;\n const distanceFromTop = root.scrollTop;\n\n if (listenToScroll) {\n listenToScroll(distanceFromBottom, distanceFromTop, threshold);\n }\n\n if (distanceFromTop < Number(threshold)) {\n loadNextOnScrollToTop?.();\n }\n\n if (distanceFromBottom < Number(threshold)) {\n loadNextOnScrollToBottom?.();\n }\n }, loadNextDebounceMs),\n [\n listenToScroll,\n loadNextDebounceMs,\n loadNextOnScrollToBottom,\n loadNextOnScrollToTop,\n threshold,\n ],\n );\n\n useEffect(() => {\n const scrollElement = rootRef.current;\n if (!scrollElement) return;\n\n scrollElement.addEventListener('scroll', scrollListener, useCapture);\n\n return () => {\n scrollElement.removeEventListener('scroll', scrollListener, useCapture);\n };\n }, [scrollListener, useCapture]);\n\n useEffect(() => {\n const root = rootRef.current;\n if (!root || typeof ResizeObserver === 'undefined' || !scrollListener) return;\n const observer = new ResizeObserver(scrollListener);\n observer.observe(root as Element);\n\n return () => {\n observer.disconnect();\n };\n }, [scrollListener]);\n\n useEffect(() => {\n const root = rootRef.current;\n if (root) {\n root.addEventListener('wheel', mousewheelListener, { passive: false });\n }\n return () => {\n if (root) {\n root.removeEventListener('wheel', mousewheelListener, useCapture);\n }\n };\n }, [useCapture]);\n\n return (\n <div\n {...componentProps}\n className={clsx('str-chat__infinite-scroll-paginator', className)}\n ref={rootRef}\n >\n <div className='str-chat__infinite-scroll-paginator__content' ref={childRef}>\n {children}\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { Button } from '../../Button';\nimport { Viewer } from '../../Dialog';\nimport { PollVote } from '../PollVote';\nimport { usePollAnswerPagination } from '../hooks';\nimport { InfiniteScrollPaginator } from '../../InfiniteScrollPaginator/InfiniteScrollPaginator';\nimport { LoadingIndicator } from '../../Loading';\nimport { useStateStore } from '../../../store';\nimport {\n useChatContext,\n useModalContext,\n usePollContext,\n useTranslationContext,\n} from '../../../context';\n\nimport type { PollAnswer, PollState } from 'stream-chat';\n\ntype PollStateSelectorReturnValue = {\n is_closed: boolean | undefined;\n ownAnswer: PollAnswer | undefined;\n};\nconst pollStateSelector = (nextValue: PollState): PollStateSelectorReturnValue => ({\n is_closed: nextValue.is_closed,\n ownAnswer: nextValue.ownAnswer,\n});\n\nexport type PollAnswerListProps = {\n onUpdateOwnAnswerClick: () => void;\n};\n\nexport const PollAnswerList = ({ onUpdateOwnAnswerClick }: PollAnswerListProps) => {\n const { client } = useChatContext();\n const { t } = useTranslationContext();\n const { poll } = usePollContext();\n const { close } = useModalContext();\n const { is_closed } = useStateStore(poll.state, pollStateSelector);\n\n const { answers, error, hasNextPage, loading, loadMore } = usePollAnswerPagination();\n\n return (\n <Viewer.Root className='str-chat__modal__poll-answer-list'>\n <Viewer.Header close={close} title={t('Poll comments')} />\n <Viewer.Body className='str-chat__modal__poll-answer-list__body'>\n <div className='str-chat__poll-answer-list'>\n <InfiniteScrollPaginator loadNextOnScrollToBottom={loadMore} threshold={40}>\n {answers.map((answer) => (\n <div className='str-chat__poll-answer' key={`comment-${answer.id}`}>\n <div className='str-chat__poll-answer__data'>\n {answer.answer_text && (\n <p className='str-chat__poll-answer__text'>{answer.answer_text}</p>\n )}\n <PollVote key={`poll-vote-${answer.id}`} vote={answer} />\n </div>\n {!is_closed && answer.user?.id === client.user?.id && (\n <div className='str-chat__poll-vote__update-vote-button-container'>\n <Button\n appearance='ghost'\n className='str-chat__poll-vote__update-vote-button'\n onClick={onUpdateOwnAnswerClick}\n size='md'\n variant='secondary'\n >\n {t('Update your comment')}\n </Button>\n </div>\n )}\n </div>\n ))}\n\n {hasNextPage && (\n <div className='str-chat__loading-indicator-placeholder'>\n {loading && <LoadingIndicator />}\n </div>\n )}\n </InfiniteScrollPaginator>\n </div>\n {error?.message && <div>{error?.message}</div>}\n </Viewer.Body>\n {/*<Viewer.Footer>*/}\n {/* {answers.length > 0 && !is_closed && (*/}\n {/* <Viewer.FooterControls>*/}\n {/* <Viewer.FooterControlsButtonSecondary*/}\n {/* className='str-chat__poll-action'*/}\n {/* onClick={onUpdateOwnAnswerClick}*/}\n {/* >*/}\n {/* {ownAnswer ? t('Update your comment') : t('Add a comment')}*/}\n {/* </Viewer.FooterControlsButtonSecondary>*/}\n {/* </Viewer.FooterControls>*/}\n {/* )}*/}\n {/*</Viewer.Footer>*/}\n </Viewer.Root>\n );\n};\n","import React from 'react';\nimport { useStateStore } from '../../../../store';\nimport { usePollContext, useTranslationContext } from '../../../../context';\nimport type { PollOption, PollState } from 'stream-chat';\nimport { IconTrophy } from '../../../Icons';\n\ntype PollStateSelectorReturnValue = {\n maxVotedOptionIds: string[];\n vote_counts_by_option: Record<string, number>;\n};\nconst pollStateSelector = (nextValue: PollState): PollStateSelectorReturnValue => ({\n maxVotedOptionIds: nextValue.maxVotedOptionIds,\n vote_counts_by_option: nextValue.vote_counts_by_option,\n});\n\nexport type PollResultOptionVoteCounterProps = {\n optionId: string;\n};\n\nexport const PollResultOptionVoteCounter = ({\n optionId,\n}: PollResultOptionVoteCounterProps) => {\n const { t } = useTranslationContext();\n const { poll } = usePollContext();\n const { maxVotedOptionIds, vote_counts_by_option } = useStateStore(\n poll.state,\n pollStateSelector,\n );\n\n return (\n <div className='str-chat__poll-result-option-vote-counter'>\n {maxVotedOptionIds.length === 1 && maxVotedOptionIds[0] === optionId && (\n <IconTrophy />\n )}\n <span className='str-chat__poll-result-option-vote-count'>\n {t('{{count}} votes', { count: vote_counts_by_option[optionId] ?? 0 })}\n </span>\n </div>\n );\n};\n\nexport type PollOptionWithVotesHeaderProps = {\n option: PollOption;\n optionOrderNumber: number;\n};\n\nexport const PollOptionWithVotesHeader = ({\n option,\n optionOrderNumber,\n}: PollOptionWithVotesHeaderProps) => {\n const { t } = useTranslationContext();\n\n return (\n <div className='str-chat__poll-option__header'>\n <div className='str-chat__poll-option__header__label'>\n {t('Question {{ optionOrderNumber}}', { optionOrderNumber })}\n </div>\n <div className='str-chat__poll-option__header__title'>\n <div className='str-chat__poll-option__option-text'>{option.text}</div>\n <PollResultOptionVoteCounter optionId={option.id} />\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { PollOptionWithVotesHeader } from './PollOptionWithVotesHeader';\nimport { PollVoteListing } from '../../PollVote';\nimport { useStateStore } from '../../../../store';\nimport {\n useChannelStateContext,\n usePollContext,\n useTranslationContext,\n} from '../../../../context';\nimport type { PollOption, PollState, PollVote } from 'stream-chat';\nimport { Button } from '../../../Button';\nimport clsx from 'clsx';\n\ntype PollStateSelectorReturnValue = {\n latest_votes_by_option: Record<string, PollVote[]>;\n};\n\nconst pollStateSelector = (nextValue: PollState): PollStateSelectorReturnValue => ({\n latest_votes_by_option: nextValue.latest_votes_by_option,\n});\n\nexport type PollOptionWithVotesProps = {\n option: PollOption;\n orderNumber: number;\n countVotesPreview?: number;\n showAllVotes?: () => void;\n};\n\nexport const PollOptionWithVotes = ({\n countVotesPreview,\n option,\n orderNumber,\n showAllVotes,\n}: PollOptionWithVotesProps) => {\n const { t } = useTranslationContext();\n const { channelCapabilities = {} } = useChannelStateContext('PollOptionWithVotes');\n const { poll } = usePollContext();\n const { latest_votes_by_option } = useStateStore(poll.state, pollStateSelector);\n\n const votes = latest_votes_by_option && latest_votes_by_option[option.id];\n const voteCount = votes?.length ?? 0;\n const isVotesPreview = typeof countVotesPreview === 'number';\n\n return (\n <div\n className={clsx('str-chat__poll-option', {\n 'str-chat__poll-option--has-more-votes':\n isVotesPreview && voteCount > countVotesPreview,\n })}\n >\n <PollOptionWithVotesHeader option={option} optionOrderNumber={orderNumber} />\n {!!votes && <PollVoteListing votes={votes.slice(0, countVotesPreview)} />}\n {channelCapabilities['query-poll-votes'] &&\n showAllVotes &&\n isVotesPreview &&\n votes?.length > countVotesPreview && (\n <div className='str-chat__poll-option__show-all-votes-button-container'>\n <Button\n appearance='ghost'\n className='str-chat__poll-option__show-all-votes-button'\n onClick={showAllVotes}\n size='md'\n variant='secondary'\n >\n {t('View all')}\n </Button>\n </div>\n )}\n </div>\n );\n};\n","export const MAX_POLL_OPTIONS = 100 as const;\n\nexport const MAX_OPTIONS_DISPLAYED = 5 as const;\nexport const COUNT_OPTION_VOTES_PREVIEW = 5 as const;\n","import { useTranslationContext } from '../../../context';\n\nexport type PollQuestionProps = {\n question: string;\n};\n\nexport const PollQuestion = ({ question }: PollQuestionProps) => {\n const { t } = useTranslationContext();\n return (\n <div className='str-chat__modal__poll-question'>\n <div className='str-chat__modal__poll-question__label'>{t('Question')}</div>\n <div className='str-chat__modal__poll-question__text'>{question}</div>\n </div>\n );\n};\n","import React, { useMemo } from 'react';\nimport { PollVoteListing } from '../../PollVote';\nimport { usePollOptionVotesPagination } from '../../hooks';\nimport { LoadingIndicator } from '../../../Loading';\nimport { InfiniteScrollPaginator } from '../../../InfiniteScrollPaginator/InfiniteScrollPaginator';\nimport type { PollOption, PollOptionVotesQueryParams } from 'stream-chat';\nimport { PollOptionWithVotesHeader } from './PollOptionWithVotesHeader';\n\nexport type PollOptionWithVotesListProps = {\n option: PollOption;\n optionOrderNumber: number;\n};\n\nexport const PollOptionWithVotesList = ({\n option,\n optionOrderNumber,\n}: PollOptionWithVotesListProps) => {\n const paginationParams = useMemo<PollOptionVotesQueryParams>(\n () => ({ filter: { option_id: option.id } }),\n [option.id],\n );\n const { hasNextPage, loading, loadMore, votes } = usePollOptionVotesPagination({\n paginationParams,\n });\n\n return (\n <InfiniteScrollPaginator loadNextOnScrollToBottom={loadMore} threshold={40}>\n <div className='str-chat_poll-option-with-votes-list'>\n <div className='str-chat__poll-option'>\n <div className='str-chat__poll-option__votes-paginated-list'>\n <PollOptionWithVotesHeader\n option={option}\n optionOrderNumber={optionOrderNumber}\n />\n <PollVoteListing votes={votes} />\n {hasNextPage && (\n <div className='str-chat__loading-indicator-placeholder'>\n {loading && <LoadingIndicator />}\n </div>\n )}\n </div>\n </div>\n </div>\n </InfiniteScrollPaginator>\n );\n};\n","import clsx from 'clsx';\nimport React, { useCallback, useState } from 'react';\nimport { PollOptionWithVotes } from './PollOptionWithVotes';\nimport { Viewer } from '../../../Dialog';\nimport { useStateStore } from '../../../../store';\nimport {\n useModalContext,\n usePollContext,\n useTranslationContext,\n} from '../../../../context';\nimport type { PollOption, PollState } from 'stream-chat';\nimport { COUNT_OPTION_VOTES_PREVIEW } from '../../constants';\nimport { PollQuestion } from '../PollQuestion';\nimport { PollOptionWithVotesList } from './PollOptionWithVotesList';\n\nconst pollStateSelector = ({\n name,\n options,\n vote_count,\n vote_counts_by_option,\n}: PollState) => ({\n name,\n options: [...options],\n vote_count,\n vote_counts_by_option,\n});\n\nexport const PollResults = () => {\n const { t } = useTranslationContext();\n const { poll } = usePollContext();\n const { close } = useModalContext();\n const { name, options, vote_count, vote_counts_by_option } = useStateStore(\n poll.state,\n pollStateSelector,\n );\n const [optionToView, setOptionToView] = useState<{\n option: PollOption;\n optionOrderNumber: number;\n } | null>(null);\n\n const goBack = useCallback(() => setOptionToView(null), []);\n\n return (\n <Viewer.Root\n className={clsx('str-chat__modal__poll-results', {\n 'str-chat__modal__poll-results--option-detail': optionToView,\n })}\n >\n {optionToView?.option ? (\n <>\n <Viewer.Header close={close} goBack={goBack} title={t('Votes')} />\n <Viewer.Body className='str-chat__modal__poll-results__body'>\n <PollOptionWithVotesList\n option={optionToView?.option}\n optionOrderNumber={optionToView?.optionOrderNumber}\n />\n </Viewer.Body>\n </>\n ) : (\n <>\n <Viewer.Header close={close} title={t('Poll results')} />\n <Viewer.Body className='str-chat__modal__poll-results__body'>\n <PollQuestion question={name} />\n <div className='str-chat__modal__poll-results__options'>\n <div className='str-chat__modal__poll-results__option-list'>\n {options\n .sort((next, current) =>\n (vote_counts_by_option[current.id] ?? 0) >=\n (vote_counts_by_option[next.id] ?? 0)\n ? 1\n : -1,\n )\n .map((option, i) => {\n const optionOrderNumber = i + 1;\n return (\n <PollOptionWithVotes\n countVotesPreview={COUNT_OPTION_VOTES_PREVIEW}\n key={`poll-option-${option.id}`}\n option={option}\n orderNumber={optionOrderNumber}\n showAllVotes={() =>\n setOptionToView({ option, optionOrderNumber })\n }\n />\n );\n })}\n </div>\n <div className='str-chat__modal__poll-results__options__footer'>\n <div className='str-chat__modal__poll-results__options-total-count'>\n {t('totalVoteCount', { count: vote_count })}\n </div>\n </div>\n </div>\n </Viewer.Body>\n </>\n )}\n </Viewer.Root>\n );\n};\n","import clsx from 'clsx';\nimport React, { useCallback, useState } from 'react';\nimport { PollAction } from './PollAction';\nimport type { AddCommentPromptProps } from './AddCommentPrompt';\nimport { AddCommentPrompt as DefaultAddCommentPrompt } from './AddCommentPrompt';\nimport type { SuggestPollOptionFormProps } from './SuggestPollOptionPrompt';\nimport { SuggestPollOptionPrompt as DefaultSuggestPollOptionForm } from './SuggestPollOptionPrompt';\nimport { EndPollAlert as DefaultEndPollAlert } from './EndPollAlert';\nimport type { PollAnswerListProps } from './PollAnswerList';\nimport { PollAnswerList as DefaultPollAnswerList } from './PollAnswerList';\nimport { PollResults as DefaultPollResults } from './PollResults';\nimport { MAX_POLL_OPTIONS } from '../constants';\nimport {\n useChannelStateContext,\n useChatContext,\n useMessageContext,\n usePollContext,\n useTranslationContext,\n} from '../../../context';\nimport { useStateStore } from '../../../store';\n\nimport type { PollState } from 'stream-chat';\n\nconst COMMON_MODAL_CLASS = 'str-chat__poll-action-modal' as const;\n\ntype ModalName =\n | 'suggest-option'\n | 'add-comment'\n | 'view-comments'\n | 'view-results'\n | 'end-vote';\n\nconst pollStateSelector = (nextValue: PollState) => ({\n allow_answers: nextValue.allow_answers,\n allow_user_suggested_options: nextValue.allow_user_suggested_options,\n answers_count: nextValue.answers_count,\n created_by_id: nextValue.created_by_id,\n is_closed: nextValue.is_closed,\n options: nextValue.options,\n ownAnswer: nextValue.ownAnswer,\n voteCount: nextValue.vote_count,\n});\n\nexport type PollActionsProps = {\n AddCommentPrompt?: React.ComponentType<AddCommentPromptProps>;\n EndPollAlert?: React.ComponentType;\n PollAnswerList?: React.ComponentType<PollAnswerListProps>;\n PollResults?: React.ComponentType;\n SuggestPollOptionForm?: React.ComponentType<SuggestPollOptionFormProps>;\n};\n\nexport const PollActions = ({\n AddCommentPrompt = DefaultAddCommentPrompt,\n EndPollAlert = DefaultEndPollAlert,\n PollAnswerList = DefaultPollAnswerList,\n PollResults = DefaultPollResults,\n SuggestPollOptionForm = DefaultSuggestPollOptionForm,\n}: PollActionsProps) => {\n const { client } = useChatContext();\n const { t } = useTranslationContext('PollActions');\n const { channelCapabilities = {} } = useChannelStateContext('PollActions');\n const { message } = useMessageContext('PollActions');\n const { poll } = usePollContext();\n const {\n allow_answers,\n allow_user_suggested_options,\n answers_count,\n created_by_id,\n is_closed,\n options,\n ownAnswer,\n voteCount,\n } = useStateStore(poll.state, pollStateSelector);\n const [modalOpen, setModalOpen] = useState<ModalName | undefined>();\n\n const canCastVote = channelCapabilities['cast-poll-vote'] && !is_closed;\n const closeModal = useCallback(() => setModalOpen(undefined), []);\n const onUpdateAnswerClick = useCallback(() => setModalOpen('add-comment'), []);\n\n const hasContents =\n (!is_closed && created_by_id === client.user?.id) ||\n !!voteCount ||\n (canCastVote && allow_user_suggested_options && options.length < MAX_POLL_OPTIONS) ||\n (!is_closed && allow_answers) ||\n (answers_count > 0 && channelCapabilities['query-poll-votes']);\n\n if (!hasContents) return null;\n\n return (\n <div className='str-chat__poll-actions'>\n {!is_closed && created_by_id === client.user?.id && (\n <PollAction\n buttonText={t('End poll')}\n closeModal={closeModal}\n modalClassName={clsx(COMMON_MODAL_CLASS, 'str-chat__end-poll-modal')}\n modalIsOpen={modalOpen === 'end-vote'}\n openModal={() => setModalOpen('end-vote')}\n >\n <EndPollAlert />\n </PollAction>\n )}\n\n {!!voteCount && (\n <PollAction\n buttonText={t('View results')}\n closeModal={closeModal}\n modalClassName={clsx(COMMON_MODAL_CLASS, 'str-chat__poll-results-modal')}\n modalIsOpen={modalOpen === 'view-results'}\n openModal={() => setModalOpen('view-results')}\n >\n <PollResults />\n </PollAction>\n )}\n\n {canCastVote &&\n allow_user_suggested_options &&\n options.length < MAX_POLL_OPTIONS && (\n <PollAction\n buttonText={t('Suggest an option')}\n closeModal={closeModal}\n isAdditionalAction\n modalClassName={clsx(\n COMMON_MODAL_CLASS,\n 'str-chat__suggest-poll-option-modal',\n )}\n modalIsOpen={modalOpen === 'suggest-option'}\n openModal={() => setModalOpen('suggest-option')}\n >\n <SuggestPollOptionForm />\n </PollAction>\n )}\n\n {!is_closed && allow_answers && (\n <PollAction\n buttonText={ownAnswer ? t('Update your comment') : t('Add a comment')}\n closeModal={closeModal}\n isAdditionalAction\n modalClassName={clsx(COMMON_MODAL_CLASS, 'str-chat__add-poll-answer-modal')}\n modalIsOpen={modalOpen === 'add-comment'}\n openModal={() => setModalOpen('add-comment')}\n >\n <AddCommentPrompt messageId={message.id} />\n </PollAction>\n )}\n\n {answers_count > 0 && channelCapabilities['query-poll-votes'] && (\n <PollAction\n buttonText={t('View {{count}} comments', { count: answers_count })}\n closeModal={closeModal}\n isAdditionalAction\n modalClassName={clsx(COMMON_MODAL_CLASS, 'str-chat__poll-answer-list-modal')}\n modalIsOpen={modalOpen === 'view-comments'}\n openModal={() => setModalOpen('view-comments')}\n >\n <PollAnswerList onUpdateOwnAnswerClick={onUpdateAnswerClick} />\n </PollAction>\n )}\n </div>\n );\n};\n","import clsx from 'clsx';\nimport debounce from 'lodash.debounce';\nimport React, { useMemo } from 'react';\nimport type { PollOption, PollState, PollVote, VotingVisibility } from 'stream-chat';\nimport { isVoteAnswer } from 'stream-chat';\nimport { AvatarStack as DefaultAvatarStack } from '../Avatar';\nimport {\n useChannelStateContext,\n useComponentContext,\n useMessageContext,\n usePollContext,\n useTranslationContext,\n} from '../../context';\nimport { useStateStore } from '../../store';\n\ntype AmountBarProps = {\n amount: number;\n className?: string;\n};\n\nexport const AmountBar = ({ amount, className }: AmountBarProps) => (\n <div\n className={clsx('str-chat__amount-bar', className)}\n data-testid='amount-bar'\n role='progressbar'\n style={\n {\n '--str-chat__amount-bar-fulfillment': amount + '%',\n } as React.CSSProperties\n }\n />\n);\n\nexport type CheckmarkProps = { checked?: boolean };\n\nexport const Checkmark = ({ checked }: CheckmarkProps) => (\n <div\n className={clsx('str-chat__checkmark', { 'str-chat__checkmark--checked': checked })}\n />\n);\n\ntype PollStateSelectorReturnValue = {\n is_closed: boolean | undefined;\n latest_votes_by_option: Record<string, PollVote[]>;\n maxVotedOptionIds: string[];\n ownVotesByOptionId: Record<string, PollVote>;\n vote_counts_by_option: Record<string, number>;\n voting_visibility: VotingVisibility | undefined;\n};\nconst pollStateSelector = (nextValue: PollState): PollStateSelectorReturnValue => ({\n is_closed: nextValue.is_closed,\n latest_votes_by_option: nextValue.latest_votes_by_option,\n maxVotedOptionIds: nextValue.maxVotedOptionIds,\n ownVotesByOptionId: nextValue.ownVotesByOptionId,\n vote_counts_by_option: nextValue.vote_counts_by_option,\n voting_visibility: nextValue.voting_visibility,\n});\n\nexport type PollOptionSelectorProps = {\n option: PollOption;\n displayAvatarCount?: number;\n voteCountVerbose?: boolean;\n};\n\nexport const PollOptionSelector = ({\n displayAvatarCount,\n option,\n voteCountVerbose,\n}: PollOptionSelectorProps) => {\n const { t } = useTranslationContext();\n const { channelCapabilities = {} } = useChannelStateContext('PollOptionsShortlist');\n const { message } = useMessageContext();\n const { AvatarStack = DefaultAvatarStack } = useComponentContext();\n const { poll } = usePollContext();\n const {\n is_closed,\n latest_votes_by_option,\n maxVotedOptionIds,\n ownVotesByOptionId,\n vote_counts_by_option,\n voting_visibility,\n } = useStateStore(poll.state, pollStateSelector);\n\n const canCastVote = channelCapabilities['cast-poll-vote'] && !is_closed;\n const winningOptionCount = maxVotedOptionIds[0]\n ? vote_counts_by_option[maxVotedOptionIds[0]]\n : 0;\n\n const toggleVote = useMemo(\n () =>\n debounce(() => {\n if (!canCastVote) return;\n const haveVotedForTheOption = !!ownVotesByOptionId[option.id];\n return haveVotedForTheOption\n ? poll.removeVote(ownVotesByOptionId[option.id].id, message.id)\n : poll.castVote(option.id, message.id);\n }, 100),\n [canCastVote, message.id, option.id, ownVotesByOptionId, poll],\n );\n\n const avatarDisplayInfo = useMemo(\n () =>\n latest_votes_by_option?.[option.id] &&\n (latest_votes_by_option[option.id] as PollVote[])\n .filter((vote) => !!vote.user && !isVoteAnswer(vote))\n .slice(0, displayAvatarCount)\n .map(({ user }) => ({\n id: user!.id, // eslint-disable-line @typescript-eslint/no-non-null-assertion\n imageUrl: user!.image, // eslint-disable-line @typescript-eslint/no-non-null-assertion\n userName: user!.name, // eslint-disable-line @typescript-eslint/no-non-null-assertion\n })),\n [displayAvatarCount, latest_votes_by_option, option.id],\n );\n\n return (\n <div\n className={clsx('str-chat__poll-option', {\n 'str-chat__poll-option--votable': canCastVote,\n })}\n key={`base-poll-option-${option.id}`}\n onClick={toggleVote}\n >\n {canCastVote && <Checkmark checked={!!ownVotesByOptionId[option.id]} />}\n <div className='str-chat__poll-option-data'>\n <p className='str-chat__poll-option-text'>{option.text}</p>\n <div className='str-chat__poll-option-votes'>\n {displayAvatarCount && voting_visibility === 'public' && (\n <div className='str-chat__poll-option-voters'>\n <AvatarStack displayInfo={avatarDisplayInfo} size='xs' />\n </div>\n )}\n <div className='str-chat__poll-option-vote-count'>\n {voteCountVerbose\n ? t('{{count}} votes', {\n count: vote_counts_by_option[option.id] ?? 0,\n })\n : (vote_counts_by_option[option.id] ?? 0)}\n </div>\n </div>\n </div>\n <AmountBar\n amount={\n (winningOptionCount &&\n (vote_counts_by_option[option.id] ?? 0) / winningOptionCount) * 100\n }\n className={clsx('str-chat__poll-option__votes-bar', {\n 'str-chat__poll-option__votes-bar--winner':\n is_closed &&\n maxVotedOptionIds.length === 1 &&\n maxVotedOptionIds[0] === option.id,\n })}\n />\n </div>\n );\n};\n","import clsx from 'clsx';\nimport React, { useCallback, useState } from 'react';\nimport { PollAction } from './PollActions/PollAction';\nimport { PollOptionSelector as DefaultPollOptionSelector } from './PollOptionSelector';\nimport { useStateStore } from '../../store';\nimport {\n useComponentContext,\n usePollContext,\n useTranslationContext,\n} from '../../context';\nimport type { PollOption, PollState } from 'stream-chat';\nimport { PollOptionsFullList as DefaultPollOptionsFullList } from './PollActions/PollOptionsFullList';\n\ntype PollStateSelectorReturnValue = { options: PollOption[] };\n\nconst pollStateSelector = (nextValue: PollState): PollStateSelectorReturnValue => ({\n options: nextValue.options,\n});\n\nexport type PollOptionListProps = {\n optionsDisplayCount?: number;\n PollOptionsFullList?: React.ComponentType;\n};\n\nexport const PollOptionList = ({\n optionsDisplayCount,\n PollOptionsFullList = DefaultPollOptionsFullList,\n}: PollOptionListProps) => {\n const { PollOptionSelector = DefaultPollOptionSelector } = useComponentContext();\n const { t } = useTranslationContext('PollOptionList');\n const { poll } = usePollContext();\n const { options } = useStateStore(poll.state, pollStateSelector);\n const [viewAllOptionsOpen, setViewAllOptionsOpen] = useState(false);\n const closeViewAllOptions = useCallback(() => setViewAllOptionsOpen(false), []);\n const openViewAllOptions = useCallback(() => setViewAllOptionsOpen(true), []);\n\n const showMoreOptionsButton =\n typeof optionsDisplayCount === 'number' && options.length > optionsDisplayCount;\n\n return (\n <>\n <div\n className={clsx('str-chat__poll-option-list', {\n 'str-chat__poll-option-list--full': typeof optionsDisplayCount === 'undefined',\n })}\n >\n {options.slice(0, optionsDisplayCount ?? options.length).map((option) => (\n <PollOptionSelector\n displayAvatarCount={3}\n key={`poll-option-${option.id}`}\n option={option}\n />\n ))}\n </div>\n {showMoreOptionsButton && (\n <PollAction\n buttonText={t('+{{count}} more options', {\n count: options.length,\n })}\n closeModal={closeViewAllOptions}\n isAdditionalAction\n modalClassName='str-chat__poll-action-modal'\n modalIsOpen={viewAllOptionsOpen}\n openModal={openViewAllOptions}\n >\n <PollOptionsFullList />\n </PollAction>\n )}\n </>\n );\n};\n","import React from 'react';\nimport { Viewer } from '../../Dialog';\nimport { PollOptionList } from '../PollOptionList';\nimport { useStateStore } from '../../../store';\nimport { useModalContext, usePollContext, useTranslationContext } from '../../../context';\n\nimport type { PollState } from 'stream-chat';\nimport { PollQuestion } from './PollQuestion';\n\ntype PollStateSelectorReturnValue = { name: string };\nconst pollStateSelector = (nextValue: PollState): PollStateSelectorReturnValue => ({\n name: nextValue.name,\n});\n\nexport const PollOptionsFullList = () => {\n const { t } = useTranslationContext();\n const { poll } = usePollContext();\n const { close } = useModalContext();\n const { name } = useStateStore(poll.state, pollStateSelector);\n\n return (\n <Viewer.Root className={'str-chat__modal__poll-option-list'}>\n <Viewer.Header close={close} title={t('Poll options')} />\n <Viewer.Body className='str-chat__modal__poll-option-list__body'>\n <PollQuestion question={name} />\n <PollOptionList />\n </Viewer.Body>\n </Viewer.Root>\n );\n};\n","import clsx from 'clsx';\nimport React from 'react';\nimport { PollHeader as DefaultPollHeader } from './PollHeader';\nimport { PollActions as DefaultPollActions } from './PollActions';\nimport { PollOptionList } from './PollOptionList';\nimport { MAX_OPTIONS_DISPLAYED } from './constants';\nimport { useComponentContext, usePollContext } from '../../context';\nimport { useStateStore } from '../../store';\nimport type { PollState } from 'stream-chat';\n\ntype PollStateSelectorPollContentReturnValue = { is_closed: boolean | undefined };\nconst pollStateSelectorPollContent = (\n nextValue: PollState,\n): PollStateSelectorPollContentReturnValue => ({ is_closed: nextValue.is_closed });\nexport const PollContent = () => {\n const { PollActions = DefaultPollActions, PollHeader = DefaultPollHeader } =\n useComponentContext();\n const { poll } = usePollContext();\n const { is_closed } = useStateStore(poll.state, pollStateSelectorPollContent);\n\n return (\n <div className={clsx('str-chat__poll', { 'str-chat__poll--closed': is_closed })}>\n <PollHeader />\n <PollOptionList optionsDisplayCount={MAX_OPTIONS_DISPLAYED} />\n <PollActions />\n </div>\n );\n};\n","import React from 'react';\nimport { PollContent as DefaultPollContent } from './PollContent';\nimport { PollProvider, useComponentContext } from '../../context';\nimport type { Poll as PollClass } from 'stream-chat';\n\nexport const Poll = ({ poll }: { poll: PollClass }) => {\n const { PollContent = DefaultPollContent } = useComponentContext();\n if (!poll) return null;\n return (\n <PollProvider poll={poll}>\n <PollContent />\n </PollProvider>\n );\n};\n","import clsx from 'clsx';\nimport React, { useMemo, useState } from 'react';\nimport { NumericInput } from '../../Form/NumericInput';\nimport { SwitchField, SwitchFieldLabel } from '../../Form/SwitchField';\nimport { useTranslationContext } from '../../../context';\nimport { useMessageComposerController } from '../../MessageComposer/hooks/useMessageComposerController';\nimport { useStateStore } from '../../../store';\nimport type { PollComposerState } from 'stream-chat';\n\nconst pollComposerStateSelector = (state: PollComposerState) => ({\n enforce_unique_vote: state.data.enforce_unique_vote,\n error: state.errors.max_votes_allowed,\n max_votes_allowed: state.data.max_votes_allowed,\n});\n\nexport const MultipleAnswersField = () => {\n const { t } = useTranslationContext();\n const { pollComposer } = useMessageComposerController();\n const { enforce_unique_vote, error, max_votes_allowed } = useStateStore(\n pollComposer.state,\n pollComposerStateSelector,\n );\n const [voteLimitEnabled, setVoteLimitEnabled] = useState(false);\n\n const knownValidationErrors = useMemo<Record<string, string>>(\n () => ({\n 'Enforce unique vote is enabled': t('Enforce unique vote is enabled'),\n 'Type a number from 2 to 10': t('Type a number from 2 to 10'),\n }),\n [t],\n );\n\n const multipleVotesEnabled = !enforce_unique_vote;\n const errorText = error && knownValidationErrors[error];\n\n return (\n <div className={clsx('str-chat__form__switch-fieldset', {})}>\n <SwitchField\n checked={multipleVotesEnabled}\n description={t('Select more than one option')}\n id='enforce_unique_vote'\n onChange={(e) => {\n setVoteLimitEnabled(false);\n pollComposer.updateFields({ enforce_unique_vote: !e.target.checked });\n }}\n title={t('Multiple votes')}\n />\n {multipleVotesEnabled && (\n <SwitchField\n checked={voteLimitEnabled}\n fieldClassName='str-chat__multiple-answers-field__votes-limit-field'\n onChange={() => {\n setVoteLimitEnabled((prev) => !prev);\n pollComposer.updateFields({ max_votes_allowed: '2' });\n }}\n >\n <div className='str-chat__multiple-answers-field__votes-limit-field__numeric-field'>\n <SwitchFieldLabel\n asError={!!errorText}\n description={t('Choose between 2 to 10 options')}\n htmlFor={'max_votes_allowed'}\n title={t('Limit votes per person')}\n />\n {voteLimitEnabled && (\n <NumericInput\n id='max_votes_allowed'\n max={10}\n min={2}\n onBlur={() => {\n pollComposer.handleFieldBlur('max_votes_allowed');\n }}\n onChange={(e) => {\n const raw = e.target.value;\n const nativeFieldValidation =\n raw !== '' && !/^\\d+$/.test(raw)\n ? { max_votes_allowed: t('Only numbers are allowed') }\n : undefined;\n pollComposer.updateFields(\n {\n max_votes_allowed: nativeFieldValidation\n ? pollComposer.max_votes_allowed\n : raw,\n },\n nativeFieldValidation,\n );\n }}\n value={max_votes_allowed ?? ''}\n />\n )}\n </div>\n </SwitchField>\n )}\n </div>\n );\n};\n","import React, { useMemo } from 'react';\nimport { TextInput } from '../../Form';\nimport { useTranslationContext } from '../../../context';\nimport { useMessageComposerController } from '../../MessageComposer/hooks/useMessageComposerController';\nimport { useStateStore } from '../../../store';\nimport type { PollComposerState } from 'stream-chat';\n\nconst pollComposerStateSelector = (state: PollComposerState) => ({\n error: state.errors.name,\n name: state.data.name,\n});\n\nexport const NameField = () => {\n const { t } = useTranslationContext();\n const { pollComposer } = useMessageComposerController();\n const { error, name } = useStateStore(pollComposer.state, pollComposerStateSelector);\n const knownValidationErrors = useMemo<Record<string, string>>(\n () => ({\n 'Question is required': t('Question is required'),\n }),\n [t],\n );\n\n return (\n <TextInput\n className='str-chat__form__input-field__value'\n error={!!error}\n errorMessage={\n error ? (\n <span data-testid='poll-name-input-field-error'>\n {knownValidationErrors[error] ?? t('Error')}\n </span>\n ) : undefined\n }\n id='name'\n label={t('Question')}\n onBlur={() => {\n pollComposer.handleFieldBlur('name');\n }}\n onChange={(e) => {\n pollComposer.updateFields({ name: e.target.value });\n }}\n placeholder={t('Ask a question')}\n type='text'\n value={name}\n />\n );\n};\n","import clsx from 'clsx';\nimport React, { useCallback, useMemo } from 'react';\nimport { TextInput } from '../../Form/TextInput';\nimport { useTranslationContext } from '../../../context';\nimport { useMessageComposerController } from '../../MessageComposer/hooks/useMessageComposerController';\nimport { useStateStore } from '../../../store';\nimport type { PollComposerState } from 'stream-chat';\nimport { IconCircleMinus, IconDotGrid2x3 } from '../../Icons';\nimport { Button, type ButtonProps } from '../../Button';\nimport { TextInputFieldSet } from '../../Form/TextInputFieldSet';\n\nconst pollComposerStateSelector = (state: PollComposerState) => ({\n errors: state.errors.options,\n options: state.data.options,\n});\n\nexport const OptionFieldSet = () => {\n const { pollComposer } = useMessageComposerController();\n const { errors, options } = useStateStore(\n pollComposer.state,\n pollComposerStateSelector,\n );\n const { t } = useTranslationContext('OptionFieldSet');\n\n const knownValidationErrors = useMemo<Record<string, string>>(\n () => ({\n 'Option already exists': t('Option already exists'),\n 'Option is empty': t('Option is empty'),\n }),\n [t],\n );\n\n const onSetNewOrder = useCallback(\n (newOrder: number[]) => {\n const prevOptions = pollComposer.options;\n pollComposer.updateFields({ options: newOrder.map((index) => prevOptions[index]) });\n },\n [pollComposer],\n );\n\n const clearOption = useCallback(\n (removedOptionId: string) => {\n pollComposer.updateFields({\n options: pollComposer.options.filter((option) => option.id !== removedOptionId),\n });\n },\n [pollComposer],\n );\n\n const draggable = options.length > 1;\n\n return (\n <TextInputFieldSet\n draggable={draggable}\n label={t('Options')}\n onSetNewOrder={onSetNewOrder}\n >\n {options.map((option, i) => {\n const error = errors?.[option.id];\n return (\n <div\n className={clsx('str-chat__form__input-field', {\n 'str-chat__form__input-field--draggable': draggable,\n 'str-chat__form__input-field--has-error': error,\n })}\n key={`new-poll-option-${i}`}\n >\n <TextInput\n className='str-chat__form__input-field__value'\n error={!!error}\n id={option.id}\n leading={\n draggable ? (\n <IconDotGrid2x3 className='str-chat__drag-handle' />\n ) : undefined\n }\n message={\n error ? (\n <span data-testid='poll-option-input-field-error'>\n {knownValidationErrors[error] ?? t('Error')}\n </span>\n ) : undefined\n }\n onBlur={() => {\n pollComposer.handleFieldBlur('options');\n }}\n onChange={(e) => {\n pollComposer.updateFields({\n options: { index: i, text: e.target.value },\n });\n }}\n onKeyUp={(event) => {\n const isFocusedLastOptionField = i === options.length - 1;\n if (event.key === 'Enter' && !isFocusedLastOptionField) {\n const nextInputId = options[i + 1].id;\n document.getElementById(nextInputId)?.focus();\n }\n }}\n placeholder={t('Add an option')}\n trailing={\n option.text ? (\n <RemoveOptionButton onClick={() => clearOption(option.id)} />\n ) : undefined\n }\n type='text'\n value={option.text}\n />\n </div>\n );\n })}\n </TextInputFieldSet>\n );\n};\n\nconst RemoveOptionButton = ({ className, ...props }: ButtonProps) => (\n <Button\n appearance='ghost'\n circular\n className={clsx('str-chat__form__remove-option-button', className)}\n size='sm'\n variant='secondary'\n {...props}\n >\n <IconCircleMinus />\n </Button>\n);\n","import React from 'react';\nimport { useCanCreatePoll } from '../../MessageComposer/hooks/useCanCreatePoll';\nimport { useMessageComposerController } from '../../MessageComposer/hooks/useMessageComposerController';\nimport { useMessageComposerContext, useTranslationContext } from '../../../context';\nimport clsx from 'clsx';\nimport { IconPaperPlane } from '../../Icons';\nimport { Prompt } from '../../Dialog';\n\nexport type PollCreationDialogControlsProps = {\n close: () => void;\n};\n\nexport const PollCreationDialogControls = ({\n close,\n}: PollCreationDialogControlsProps) => {\n const { t } = useTranslationContext('PollCreationDialogControls');\n const { handleSubmit: handleSubmitMessage } = useMessageComposerContext();\n const messageComposer = useMessageComposerController();\n const canCreatePoll = useCanCreatePoll();\n\n return (\n <Prompt.Footer>\n <Prompt.FooterControls>\n <Prompt.FooterControlsButtonSecondary\n className={clsx('str-chat__prompt__footer__controls-button--cancel')}\n onClick={() => {\n messageComposer.pollComposer.initState();\n close();\n }}\n type='button'\n >\n {t('Cancel')}\n </Prompt.FooterControlsButtonSecondary>\n <Prompt.FooterControlsButtonPrimary\n className={clsx('str-chat__prompt__footer__controls-button--submit')}\n disabled={!canCreatePoll}\n onClick={() => {\n messageComposer\n .createPoll()\n .then(() => handleSubmitMessage())\n .then(() => {\n messageComposer.pollComposer.initState();\n close();\n })\n .catch(console.error);\n }}\n type='submit'\n >\n <IconPaperPlane />\n {t('Send poll')}\n </Prompt.FooterControlsButtonPrimary>\n </Prompt.FooterControls>\n </Prompt.Footer>\n );\n};\n","import React, { useCallback } from 'react';\nimport type { PollComposerState } from 'stream-chat';\nimport { VotingVisibility } from 'stream-chat';\nimport { MultipleAnswersField } from './MultipleAnswersField';\nimport { NameField } from './NameField';\nimport { OptionFieldSet } from './OptionFieldSet';\nimport { PollCreationDialogControls } from './PollCreationDialogControls';\nimport { Prompt } from '../../Dialog';\nimport { SwitchField } from '../../Form/SwitchField';\nimport { useMessageComposerController } from '../../MessageComposer/hooks/useMessageComposerController';\nimport { useTranslationContext } from '../../../context';\nimport { useStateStore } from '../../../store';\n\nexport type PollCreationDialogProps = {\n close: () => void;\n};\n\nconst pollComposerStateSelector = (state: PollComposerState) => ({\n allow_answers: state.data.allow_answers,\n allow_user_suggested_options: state.data.allow_user_suggested_options,\n voting_visibility: state.data.voting_visibility,\n});\n\nexport const PollCreationDialog = ({ close }: PollCreationDialogProps) => {\n const { t } = useTranslationContext();\n const { pollComposer } = useMessageComposerController();\n const { allow_answers, allow_user_suggested_options, voting_visibility } =\n useStateStore(pollComposer.state, pollComposerStateSelector);\n\n const onClose = useCallback(() => {\n pollComposer.initState();\n close();\n }, [pollComposer, close]);\n\n return (\n <Prompt.Root\n className='str-chat__poll-creation-dialog'\n data-testid='poll-creation-dialog'\n >\n <Prompt.Header close={onClose} title={t('Create poll')} />\n <Prompt.Body>\n <form autoComplete='off'>\n <NameField />\n <OptionFieldSet />\n <div className='str-chat__poll-creation-dialog__features-selectors'>\n <MultipleAnswersField />\n <SwitchField\n checked={voting_visibility === 'anonymous'}\n description={t('Hide who voted')}\n id='voting_visibility'\n onChange={(e) =>\n pollComposer.updateFields({\n voting_visibility: e.target.checked\n ? VotingVisibility.anonymous\n : VotingVisibility.public,\n })\n }\n title={t('Anonymous poll')}\n />\n <SwitchField\n checked={allow_user_suggested_options}\n description={t('Let others add options')}\n id='allow_user_suggested_options'\n onChange={(e) =>\n pollComposer.updateFields({\n allow_user_suggested_options: e.target.checked,\n })\n }\n title={t('Suggest an option')}\n />\n <SwitchField\n checked={allow_answers}\n description={t('Allow others to add comments')}\n id='allow_answers'\n onChange={(e) =>\n pollComposer.updateFields({ allow_answers: e.target.checked })\n }\n title={t('Add a comment')}\n />\n </div>\n </form>\n </Prompt.Body>\n <PollCreationDialogControls close={close} />\n </Prompt.Root>\n );\n};\n","import type { PropsWithChildren } from 'react';\nimport React, { createContext, useContext } from 'react';\n\nexport type AttachmentSelectorContextValue = {\n fileInput: HTMLInputElement | null;\n};\n\nconst AttachmentSelectorContext = createContext<AttachmentSelectorContextValue>({\n fileInput: null,\n});\n\nexport const AttachmentSelectorContextProvider = ({\n children,\n value,\n}: PropsWithChildren<{ value: AttachmentSelectorContextValue }>) => (\n <AttachmentSelectorContext.Provider value={value}>\n {children}\n </AttachmentSelectorContext.Provider>\n);\n\nexport const useAttachmentSelectorContext = () => useContext(AttachmentSelectorContext);\n","import React, { type ComponentProps, type ComponentType, useMemo } from 'react';\nimport type { CommandResponse } from 'stream-chat';\nimport { useMessageComposerContext, useTranslationContext } from '../../../context';\nimport { useMessageComposerController } from '../hooks';\nimport {\n ContextMenuBackButton,\n ContextMenuButton,\n ContextMenuHeader,\n useContextMenuContext,\n} from '../../Dialog';\nimport {\n IconChevronLeft,\n IconFlag2,\n IconGiphy,\n IconMute,\n IconPeopleAdd,\n IconPeopleRemove,\n IconVolumeFull,\n} from '../../Icons';\nimport clsx from 'clsx';\n\nconst icons: Record<string, ComponentType> = {\n ban: IconPeopleRemove,\n flag: IconFlag2,\n giphy: IconGiphy,\n mute: IconMute,\n unban: IconPeopleAdd,\n unmute: IconVolumeFull,\n};\n\nexport const CommandsMenuClassName = 'str-chat__context-menu--commands';\n\nexport const CommandsSubmenuHeader = () => {\n const { t } = useTranslationContext();\n const { returnToParentMenu } = useContextMenuContext();\n return (\n <ContextMenuHeader className='str-chat__context-menu__header--commands str-chat__context-menu__header--submenu-commands'>\n <ContextMenuBackButton onClick={returnToParentMenu}>\n <IconChevronLeft />\n <span>{t('Instant commands')}</span>\n </ContextMenuBackButton>\n </ContextMenuHeader>\n );\n};\n\nexport const CommandsMenuHeader = () => {\n const { t } = useTranslationContext();\n return (\n <ContextMenuHeader className='str-chat__context-menu__header--commands'>\n <span>{t('Instant commands')}</span>\n </ContextMenuHeader>\n );\n};\n\nexport const CommandsMenu = () => {\n const { closeMenu } = useContextMenuContext();\n const messageComposer = useMessageComposerController();\n const { textareaRef } = useMessageComposerContext();\n const channelConfig = messageComposer.channel.getConfig();\n const commands = useMemo<(CommandResponse & { name: string })[]>(\n () =>\n (channelConfig?.commands ?? [])\n .filter(\n (command): command is CommandResponse & { name: string } => !!command.name,\n )\n .sort((a, b) => (a.name ?? '').localeCompare(b.name ?? '')),\n [channelConfig],\n );\n\n return (\n <>\n {commands.map((command) => (\n <CommandContextMenuItem\n command={command}\n key={command.name}\n onClick={() => {\n if (!command.name) return;\n messageComposer.textComposer.setCommand(command);\n closeMenu();\n // Defer the focus to the next frame so it wins over FocusScope's restore-to-attachment-selector-button behavior.\n requestAnimationFrame(() => textareaRef.current?.focus());\n }}\n />\n ))}\n </>\n );\n};\n\nexport const useCommandTranslation = (command: CommandResponse) => {\n const { t } = useTranslationContext();\n\n const knownArgsTranslations = useMemo<Record<string, string>>(\n () => ({\n ban: t('ban-command-args'),\n giphy: t('giphy-command-args'),\n mute: t('mute-command-args'),\n unban: t('unban-command-args'),\n unmute: t('unmute-command-args'),\n }),\n [t],\n );\n const knownDescriptionTranslations = useMemo<Record<string, string>>(\n () => ({\n ban: t('ban-command-description'),\n giphy: t('giphy-command-description'),\n mute: t('mute-command-description'),\n unban: t('unban-command-description'),\n unmute: t('unmute-command-description'),\n }),\n [t],\n );\n\n const args =\n command.args && (knownArgsTranslations[command.name ?? ''] ?? t(command.args));\n const description =\n command.description &&\n (knownDescriptionTranslations[command.name ?? ''] ?? t(command.description));\n\n return { args, description };\n};\n\nexport const CommandContextMenuItem = ({\n className,\n command,\n ...props\n}: ComponentProps<'button'> & {\n command: CommandResponse & { name: string };\n}) => {\n const { args, description } = useCommandTranslation(command);\n\n // todo: retrieve the command trigger char from textComposer - needed adjustment in LLC\n const details = useMemo(() => `/${command.name} ${args}`, [args, command.name]);\n\n return (\n <ContextMenuButton\n {...props}\n className={clsx('str-chat__context-menu__button--command', className)}\n details={details}\n Icon={icons[command.name]}\n key={command.name}\n label={command.name}\n title={`${description} ${command.args}`}\n />\n );\n};\n","import React, {\n type ComponentType,\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useAttachmentManagerState, useMessageComposerController } from '../hooks';\nimport { CHANNEL_CONTAINER_ID } from '../../Channel/constants';\nimport {\n ContextMenu,\n ContextMenuButton,\n type ContextMenuHeaderComponent,\n type ContextMenuSubmenu,\n useContextMenuContext,\n useDialogIsOpen,\n useDialogOnNearestManager,\n} from '../../Dialog';\nimport { GlobalModal } from '../../Modal';\nimport { ShareLocationDialog as DefaultLocationDialog } from '../../Location';\nimport { PollCreationDialog as DefaultPollCreationDialog } from '../../Poll';\nimport { Portal } from '../../Portal/Portal';\nimport { UploadFileInput } from '../../ReactFileUtilities';\nimport {\n useChannelStateContext,\n useComponentContext,\n useTranslationContext,\n} from '../../../context';\nimport {\n AttachmentSelectorContextProvider,\n useAttachmentSelectorContext,\n} from '../../../context/AttachmentSelectorContext';\nimport { useStableId } from '../../UtilityComponents/useStableId';\nimport clsx from 'clsx';\nimport { Button, type ButtonProps } from '../../Button';\nimport {\n IconChart5,\n IconMapPin,\n IconPaperclip,\n IconPlusLarge,\n IconRunShortcut,\n} from '../../Icons';\nimport { useIsCooldownActive } from '../hooks/useIsCooldownActive';\nimport {\n CommandsMenu,\n CommandsMenuClassName,\n CommandsSubmenuHeader,\n} from './CommandsMenu';\n\nconst AttachmentSelectorMenuInitButtonIcon = ({ className }: { className?: string }) => {\n const { AttachmentSelectorInitiationButtonContents } = useComponentContext();\n\n if (AttachmentSelectorInitiationButtonContents) {\n return (\n <span className={className}>\n <AttachmentSelectorInitiationButtonContents />\n </span>\n );\n }\n\n return (\n <IconPlusLarge\n className={clsx('str-chat__attachment-selector__menu-button__icon', className)}\n />\n );\n};\n\nexport const AttachmentSelectorButton = forwardRef<\n HTMLButtonElement,\n ButtonProps & { iconClassName?: string }\n>(function AttachmentSelectorButton({ className, iconClassName, ...props }, ref) {\n return (\n <Button\n appearance='outline'\n circular\n className={clsx('str-chat__attachment-selector__menu-button', className)}\n data-testid='invoke-attachment-selector-button'\n size='lg'\n variant='secondary'\n {...props}\n ref={ref}\n >\n <AttachmentSelectorMenuInitButtonIcon className={iconClassName} />\n </Button>\n );\n});\n\nexport const SimpleAttachmentSelector = () => {\n const { channelCapabilities } = useChannelStateContext();\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [buttonElement, setButtonElement] = useState<HTMLButtonElement | null>(null);\n const id = useStableId();\n const isCooldownActive = useIsCooldownActive();\n\n useEffect(() => {\n if (!buttonElement) return;\n const handleKeyUp = (event: KeyboardEvent) => {\n if (![' ', 'Enter'].includes(event.key) || !inputRef.current) return;\n event.preventDefault();\n inputRef.current.click();\n };\n buttonElement.addEventListener('keyup', handleKeyUp);\n return () => {\n buttonElement.removeEventListener('keyup', handleKeyUp);\n };\n }, [buttonElement]);\n\n if (!channelCapabilities['upload-file']) return null;\n\n return (\n <div className='str-chat__attachment-selector'>\n <AttachmentSelectorButton\n disabled={isCooldownActive}\n onClick={() => inputRef.current?.click()}\n ref={setButtonElement}\n />\n <UploadFileInput id={id} ref={inputRef} />\n </div>\n );\n};\n\nexport type AttachmentSelectorModalContentProps = {\n close: () => void;\n};\n\nexport type AttachmentSelectorAction = {\n ActionButton: ComponentType<AttachmentSelectorActionProps>;\n id?: string;\n ModalContent?: React.ComponentType<AttachmentSelectorModalContentProps>;\n Submenu?: ContextMenuSubmenu;\n Header?: ContextMenuHeaderComponent;\n type: 'uploadFile' | 'createPoll' | 'addLocation' | 'selectCommand' | (string & {});\n};\n\nexport type AttachmentSelectorActionProps = {\n openModalForAction: (actionType: AttachmentSelectorAction['type']) => void;\n submenuItems?: ContextMenuSubmenu;\n submenuHeader?: ContextMenuHeaderComponent;\n};\n\nexport const DefaultAttachmentSelectorComponents = {\n Command({ submenuHeader, submenuItems }: AttachmentSelectorActionProps) {\n const { t } = useTranslationContext();\n const { openSubmenu } = useContextMenuContext();\n const hasSubmenu = !!submenuItems;\n return (\n <ContextMenuButton\n className='str-chat__attachment-selector-actions-menu__button str-chat__attachment-selector-actions-menu__create-poll-button'\n hasSubMenu={hasSubmenu}\n Icon={IconRunShortcut}\n onClick={() => {\n if (!hasSubmenu) return;\n openSubmenu({\n Header: submenuHeader,\n menuClassName: CommandsMenuClassName,\n Submenu: submenuItems,\n });\n }}\n >\n {t('Commands')}\n </ContextMenuButton>\n );\n },\n File() {\n const { t } = useTranslationContext();\n const { fileInput } = useAttachmentSelectorContext();\n const { closeMenu } = useContextMenuContext();\n\n return (\n <ContextMenuButton\n className='str-chat__attachment-selector-actions-menu__button str-chat__attachment-selector-actions-menu__upload-file-button'\n Icon={IconPaperclip}\n onClick={() => {\n fileInput?.click();\n closeMenu();\n }}\n >\n {t('File')}\n </ContextMenuButton>\n );\n },\n Location({ openModalForAction }: AttachmentSelectorActionProps) {\n const { t } = useTranslationContext();\n const { closeMenu } = useContextMenuContext();\n return (\n <ContextMenuButton\n className='str-chat__attachment-selector-actions-menu__button str-chat__attachment-selector-actions-menu__add-location-button'\n Icon={IconMapPin}\n onClick={() => {\n openModalForAction('addLocation');\n closeMenu();\n }}\n >\n {t('Location')}\n </ContextMenuButton>\n );\n },\n Poll({ openModalForAction }: AttachmentSelectorActionProps) {\n const { t } = useTranslationContext();\n const { closeMenu } = useContextMenuContext();\n return (\n <ContextMenuButton\n className='str-chat__attachment-selector-actions-menu__button str-chat__attachment-selector-actions-menu__create-poll-button'\n Icon={IconChart5}\n onClick={() => {\n openModalForAction('createPoll');\n closeMenu();\n }}\n >\n {t('Poll')}\n </ContextMenuButton>\n );\n },\n};\n\n/**\n * Order of AttachmentSelectorAction objects defines the order in the context menu width index 0 being at the top.\n */\nexport const defaultAttachmentSelectorActionSet: AttachmentSelectorAction[] = [\n {\n ActionButton: DefaultAttachmentSelectorComponents.File,\n type: 'uploadFile',\n },\n {\n ActionButton: DefaultAttachmentSelectorComponents.Poll,\n type: 'createPoll',\n },\n {\n ActionButton: DefaultAttachmentSelectorComponents.Location,\n type: 'addLocation',\n },\n {\n ActionButton: DefaultAttachmentSelectorComponents.Command,\n Header: CommandsSubmenuHeader,\n Submenu: CommandsMenu,\n type: 'selectCommand',\n },\n];\n\nexport type AttachmentSelectorProps = {\n attachmentSelectorActionSet?: AttachmentSelectorAction[];\n getModalPortalDestination?: () => HTMLElement | null;\n};\n\nconst useAttachmentSelectorActionsFiltered = (original: AttachmentSelectorAction[]) => {\n const {\n PollCreationDialog = DefaultPollCreationDialog,\n ShareLocationDialog = DefaultLocationDialog,\n } = useComponentContext();\n const { channelCapabilities } = useChannelStateContext();\n const { isUploadEnabled } = useAttachmentManagerState();\n const messageComposer = useMessageComposerController();\n const channelConfig = messageComposer.channel.getConfig();\n\n return useMemo(\n () =>\n original\n .filter((action) => {\n if (action.type === 'uploadFile')\n return (\n channelCapabilities['upload-file'] &&\n channelConfig?.uploads &&\n isUploadEnabled\n );\n\n if (action.type === 'createPoll')\n return (\n channelCapabilities['send-poll'] &&\n !messageComposer.threadId &&\n channelConfig?.polls\n );\n\n if (action.type === 'addLocation') {\n return channelConfig?.shared_locations && !messageComposer.threadId;\n }\n\n if (action.type === 'selectCommand') {\n return !!channelConfig?.commands?.some((command) => !!command.name);\n }\n\n return true;\n })\n .map((action) => {\n if (action.type === 'createPoll' && !action.ModalContent) {\n return { ...action, ModalContent: PollCreationDialog };\n }\n if (action.type === 'addLocation' && !action.ModalContent) {\n return { ...action, ModalContent: ShareLocationDialog };\n }\n return action;\n }),\n [\n PollCreationDialog,\n ShareLocationDialog,\n channelCapabilities,\n channelConfig,\n isUploadEnabled,\n messageComposer.threadId,\n original,\n ],\n );\n};\n\nexport const AttachmentSelector = ({\n attachmentSelectorActionSet = defaultAttachmentSelectorActionSet,\n getModalPortalDestination,\n}: AttachmentSelectorProps) => {\n const { t } = useTranslationContext();\n const { Modal = GlobalModal } = useComponentContext();\n const { channelCapabilities } = useChannelStateContext();\n const messageComposer = useMessageComposerController();\n const isCooldownActive = useIsCooldownActive();\n const actions = useAttachmentSelectorActionsFiltered(attachmentSelectorActionSet);\n\n const menuDialogId = `attachment-actions-menu${messageComposer.threadId ? '-thread' : ''}`;\n const { dialog: menuDialog, dialogManager } = useDialogOnNearestManager({\n id: menuDialogId,\n });\n const menuDialogIsOpen = useDialogIsOpen(menuDialogId, dialogManager?.id);\n\n const [modalContentAction, setModalContentActionAction] =\n useState<AttachmentSelectorAction>();\n const openModalForAction = useCallback(\n (actionType: AttachmentSelectorAction['type']) => {\n const action = actions.find((a) => a.type === actionType);\n if (!action?.ModalContent) return;\n setModalContentActionAction(action);\n },\n [actions],\n );\n\n const closeModal = useCallback(() => setModalContentActionAction(undefined), []);\n\n const [fileInput, setFileInput] = useState<HTMLInputElement | null>(null);\n const menuButtonRef = useRef<HTMLButtonElement>(null);\n\n const contextMenuItems = useMemo(\n () =>\n actions.map((action) => (\n <action.ActionButton\n key={action.type}\n openModalForAction={openModalForAction}\n submenuHeader={action.Header}\n submenuItems={action.Submenu}\n />\n )),\n [actions, openModalForAction],\n );\n\n const getDefaultPortalDestination = useCallback(\n () => document.getElementById(CHANNEL_CONTAINER_ID),\n [],\n );\n\n if (actions.length === 0) return null;\n\n if (actions.length === 1 && actions[0].type === 'uploadFile')\n return <SimpleAttachmentSelector />;\n\n const ModalContent = modalContentAction?.ModalContent;\n const modalIsOpen = !!ModalContent;\n return (\n <AttachmentSelectorContextProvider value={{ fileInput }}>\n <div className='str-chat__attachment-selector'>\n {channelCapabilities['upload-file'] && <UploadFileInput ref={setFileInput} />}\n <AttachmentSelectorButton\n aria-expanded={menuDialogIsOpen}\n aria-haspopup='true'\n aria-label={t('aria/Open Attachment Selector')}\n disabled={isCooldownActive}\n iconClassName={clsx('str-chat__prepare-rotate45', {\n 'str-chat__rotate45': menuDialogIsOpen,\n })}\n onClick={() => menuDialog?.toggle()}\n ref={menuButtonRef}\n />\n <ContextMenu\n allowFlip\n backLabel={t('Back')}\n className='str-chat__attachment-selector-actions-menu'\n data-testid='attachment-selector-actions-menu'\n dialogManagerId={dialogManager?.id}\n id={menuDialogId}\n onClose={menuDialog.close}\n placement='top-start'\n referenceElement={menuButtonRef.current}\n tabIndex={-1}\n trapFocus\n >\n {contextMenuItems}\n </ContextMenu>\n <Portal\n getPortalDestination={getModalPortalDestination ?? getDefaultPortalDestination}\n isOpen={modalIsOpen}\n >\n <Modal\n className={clsx({\n 'str-chat__create-poll-modal': modalContentAction?.type === 'createPoll',\n 'str-chat__share-location-modal':\n modalContentAction?.type === 'addLocation',\n })}\n onClose={closeModal}\n open={modalIsOpen}\n >\n {ModalContent && <ModalContent close={closeModal} />}\n </Modal>\n </Portal>\n </div>\n </AttachmentSelectorContextProvider>\n );\n};\n","import React, { useMemo } from 'react';\nimport { nanoid } from 'nanoid';\n\nimport { useTranslationContext } from '../../context/TranslationContext';\n\nexport const LoadingIndicatorIcon = () => {\n const id = useMemo(() => nanoid(), []);\n\n return (\n <div className='str-chat__loading-indicator'>\n <svg\n data-testid='loading-indicator'\n viewBox='0 0 30 30'\n xmlns='http://www.w3.org/2000/svg'\n >\n <defs>\n <linearGradient\n id={`${id}-linear-gradient`}\n x1='50%'\n x2='50%'\n y1='0%'\n y2='100%'\n >\n <stop offset='0%' stopColor='#FFF' stopOpacity='0' />\n <stop data-testid='stop-color' offset='100%' stopOpacity='1' />\n </linearGradient>\n </defs>\n <path\n d='M2.518 23.321l1.664-1.11A12.988 12.988 0 0 0 15 28c7.18 0 13-5.82 13-13S22.18 2 15 2V0c8.284 0 15 6.716 15 15 0 8.284-6.716 15-15 15-5.206 0-9.792-2.652-12.482-6.679z'\n fill={`url(#${id}-linear-gradient)`}\n fillRule='evenodd'\n />\n </svg>\n </div>\n );\n};\n\nexport const UploadIcon = () => {\n const { t } = useTranslationContext('UploadIcon');\n return (\n <svg\n data-testid='attach-icon'\n fill='none'\n height='24'\n viewBox='0 0 24 24'\n width='24'\n xmlns='http://www.w3.org/2000/svg'\n >\n <title>{t('Attach files')}</title>\n <g clipPath='url(#clip0_10878_5)'>\n <path\n d='M12.9997 6.99993L10.9997 6.99993L10.9997 10.9999L6.99972 10.9999L6.99972 12.9999L10.9997 12.9999L10.9997 16.9999L12.9997 16.9999L12.9997 12.9999L16.9997 12.9999L16.9997 10.9999L12.9997 10.9999L12.9997 6.99993ZM11.9997 1.99992C6.47972 1.99992 1.99972 6.47993 1.99972 11.9999C1.99972 17.5199 6.47972 21.9999 11.9997 21.9999C17.5197 21.9999 21.9997 17.5199 21.9997 11.9999C21.9997 6.47993 17.5197 1.99992 11.9997 1.99992ZM11.9997 19.9999C7.58972 19.9999 3.99972 16.4099 3.99972 11.9999C3.99972 7.58993 7.58972 3.99993 11.9997 3.99993C16.4097 3.99993 19.9997 7.58993 19.9997 11.9999C19.9997 16.4099 16.4097 19.9999 11.9997 19.9999Z'\n fill='black'\n />\n </g>\n <defs>\n <clipPath id='clip0_10878_5'>\n <rect fill='white' height='24' width='24' />\n </clipPath>\n </defs>\n </svg>\n );\n};\n\nexport const BinIcon = () => (\n <svg fill='currentColor' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'>\n <path d='M8.00033 25.3333C8.00033 26.8 9.20033 28 10.667 28H21.3337C22.8003 28 24.0003 26.8 24.0003 25.3333V12C24.0003 10.5333 22.8003 9.33333 21.3337 9.33333H10.667C9.20033 9.33333 8.00033 10.5333 8.00033 12V25.3333ZM24.0003 5.33333H20.667L19.7203 4.38667C19.4803 4.14667 19.1337 4 18.787 4H13.2137C12.867 4 12.5203 4.14667 12.2803 4.38667L11.3337 5.33333H8.00033C7.26699 5.33333 6.66699 5.93333 6.66699 6.66667C6.66699 7.4 7.26699 8 8.00033 8H24.0003C24.7337 8 25.3337 7.4 25.3337 6.66667C25.3337 5.93333 24.7337 5.33333 24.0003 5.33333Z' />\n </svg>\n);\n\nexport const PauseIcon = () => (\n <svg\n data-testid='str-chat__pause-icon'\n fill='currentColor'\n viewBox='0 0 16 20'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path d='M0 19.3333H5.33333V0.666626H0V19.3333ZM10.6667 0.666626V19.3333H16V0.666626H10.6667Z' />\n </svg>\n);\n\nexport const PlayIcon = () => (\n <svg\n data-testid='str-chat__play-icon'\n fill='currentColor'\n viewBox='0 0 14 18'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path d='M0.236328 2.09338V15.9067C0.236328 16.9601 1.39633 17.6001 2.28966 17.0267L13.143 10.1201C13.9697 9.60005 13.9697 8.40005 13.143 7.86672L2.28966 0.973385C1.39633 0.400051 0.236328 1.04005 0.236328 2.09338Z' />\n </svg>\n);\n\nexport const CheckSignIcon = () => (\n <svg fill='currentColor' viewBox='0 0 18 14' xmlns='http://www.w3.org/2000/svg'>\n <path d='M5.79457 10.875L2.32457 7.40502C1.93457 7.01502 1.30457 7.01502 0.91457 7.40502C0.52457 7.79502 0.52457 8.42502 0.91457 8.81502L5.09457 12.995C5.48457 13.385 6.11457 13.385 6.50457 12.995L17.0846 2.41502C17.4746 2.02502 17.4746 1.39502 17.0846 1.00502C16.6946 0.615024 16.0646 0.615024 15.6746 1.00502L5.79457 10.875Z' />\n </svg>\n);\n","import React, {\n type ComponentProps,\n type KeyboardEvent,\n type MouseEvent,\n useState,\n} from 'react';\nimport { useTranslationContext } from '../../../../context';\nimport {\n isImageAttachment,\n isVideoAttachment,\n type LocalUploadAttachment,\n} from 'stream-chat';\n\ntype AttachmentPreviewRootProps = Omit<ComponentProps<'div'>, 'onClick' | 'onKeyDown'> & {\n attachment: LocalUploadAttachment;\n /**\n * Called when the attachment preview is pressed and can be previewed.\n * The parent is responsible for opening the gallery at the correct index.\n */\n openPreview?: () => void;\n /**\n * Returns boolean value to signal whether the event handling should be terminated immediately (return false)\n * or default logic can be executed next (return true)\n */\n onPressed?: (e: MouseEvent<Element> | KeyboardEvent<Element>) => boolean;\n};\n\nconst INTERACTIVE_SELECTOR =\n 'button, a, input, textarea, select, [role=\"button\"], [role=\"link\"], [data-interactive=\"true\"]';\n\nfunction hasInteractiveAncestorBeforeRoot(\n target: EventTarget | null,\n root: HTMLElement | null,\n): boolean {\n if (!(target instanceof Element) || !root) return false;\n\n let el: Element | null = target;\n while (el && el !== root) {\n if (el.matches(INTERACTIVE_SELECTOR)) return true;\n el = el.parentElement;\n }\n return false;\n}\n\n// todo: use this component for all the attachment previews\nexport const AttachmentPreviewRoot = ({\n attachment,\n onPressed,\n openPreview,\n tabIndex = 0,\n ...props\n}: AttachmentPreviewRootProps) => {\n const { t } = useTranslationContext();\n const [root, setRoot] = useState<HTMLDivElement | null>(null);\n const url =\n attachment.asset_url || attachment.image_url || attachment.localMetadata.previewUri;\n\n const canDownloadAttachment = false; //!!url;\n\n const canPreviewAttachment =\n !!openPreview &&\n ((!!url && isImageAttachment(attachment)) || isVideoAttachment(attachment));\n\n const handlePressed = (e: MouseEvent<Element> | KeyboardEvent<Element>) => {\n if (e.defaultPrevented) return;\n\n if (hasInteractiveAncestorBeforeRoot(e.target as Element, root)) return;\n\n if (onPressed) {\n const shouldContinue = onPressed(e);\n if (!shouldContinue) return;\n }\n\n if (canPreviewAttachment) {\n openPreview();\n return;\n }\n\n if (canDownloadAttachment) {\n window.open(url, '_blank', 'noopener,noreferrer');\n }\n };\n\n const isInteractive = canPreviewAttachment || canDownloadAttachment;\n\n return (\n <div\n aria-label={\n isInteractive\n ? t(canPreviewAttachment ? 'aria/Show preview' : 'aria/Download attachment')\n : undefined\n }\n {...props}\n onClick={handlePressed}\n onKeyDown={\n isInteractive\n ? (e) => {\n if (e.key !== 'Enter' && e.key !== ' ') return;\n e.preventDefault();\n handlePressed(e);\n }\n : undefined\n }\n ref={setRoot}\n tabIndex={isInteractive ? tabIndex : -1}\n >\n {props.children}\n </div>\n );\n};\n","import React from 'react';\nimport { useTranslationContext } from '../../../context';\nimport { FileIcon } from '../../FileIcon';\nimport { LoadingIndicatorIcon } from '../icons';\n\nimport type { LocalAudioAttachment, LocalFileAttachment } from 'stream-chat';\nimport type { UploadAttachmentPreviewProps } from './types';\nimport { RemoveAttachmentPreviewButton } from '../RemoveAttachmentPreviewButton';\nimport { AttachmentPreviewRoot } from './utils/AttachmentPreviewRoot';\nimport { FileSizeIndicator } from '../../Attachment';\nimport { IconExclamationCircle, IconExclamationTriangle } from '../../Icons';\n\nexport type FileAttachmentPreviewProps<CustomLocalMetadata = unknown> =\n UploadAttachmentPreviewProps<\n LocalFileAttachment<CustomLocalMetadata> | LocalAudioAttachment<CustomLocalMetadata>\n >;\n\nexport const FileAttachmentPreview = ({\n attachment,\n handleRetry,\n removeAttachments,\n}: FileAttachmentPreviewProps) => {\n const { t } = useTranslationContext('FilePreview');\n const { id, uploadPermissionCheck, uploadState } = attachment.localMetadata ?? {};\n\n const hasSizeLimitError = uploadPermissionCheck?.reason === 'size_limit';\n const hasFatalError = uploadState === 'blocked' || hasSizeLimitError;\n const hasRetriableError = uploadState === 'failed' && !!handleRetry;\n const hasError = hasRetriableError || hasFatalError;\n\n return (\n <AttachmentPreviewRoot\n attachment={attachment}\n className='str-chat__attachment-preview-file'\n data-testid='attachment-preview-file'\n >\n <div className='str-chat__attachment-preview-file__icon'>\n <FileIcon fileName={attachment.title} mimeType={attachment.mime_type} />\n </div>\n\n <div className='str-chat__attachment-preview-file__info'>\n <div className='str-chat__attachment-preview-file-name' title={attachment.title}>\n {attachment.title}\n </div>\n <div className='str-chat__attachment-preview-file__data'>\n {uploadState === 'uploading' && <LoadingIndicatorIcon />}\n {!hasError && <FileSizeIndicator fileSize={attachment.file_size} />}\n {hasFatalError && (\n <div className='str-chat__attachment-preview-file__fatal-error'>\n <IconExclamationCircle />\n <span>\n {hasSizeLimitError\n ? t('File too large')\n : uploadState === 'blocked'\n ? t('Upload blocked')\n : t('Upload failed')}\n </span>\n </div>\n )}\n {hasRetriableError && (\n <div className='str-chat__attachment-preview-file__retriable-error'>\n <IconExclamationTriangle />\n <span>{t('Upload error')}</span>\n <button\n aria-label={t('aria/Retry upload')}\n className='str-chat__attachment-preview-file__retry-upload-button'\n data-testid='file-preview-item-retry-button'\n onClick={() => {\n handleRetry(attachment);\n }}\n type='button'\n >\n {t('Retry upload')}\n </button>\n </div>\n )}\n </div>\n </div>\n\n <RemoveAttachmentPreviewButton\n data-testid='file-preview-item-delete-button'\n onClick={() => {\n if (id) removeAttachments([id]);\n }}\n uploadState={uploadState}\n />\n </AttachmentPreviewRoot>\n );\n};\n","import React from 'react';\nimport type { AnyLocalAttachment, LocalUploadAttachment } from 'stream-chat';\nimport { type LocalFileAttachment } from 'stream-chat';\nimport { FileAttachmentPreview } from './FileAttachmentPreview';\n\nexport type UnsupportedAttachmentPreviewProps<\n CustomLocalMetadata = Record<string, unknown>,\n> = {\n attachment: AnyLocalAttachment<CustomLocalMetadata>;\n handleRetry: (\n attachment: LocalUploadAttachment,\n ) => void | Promise<LocalUploadAttachment | undefined>;\n removeAttachments: (ids: string[]) => void;\n};\n\nexport const UnsupportedAttachmentPreview = ({\n attachment,\n handleRetry,\n removeAttachments,\n}: UnsupportedAttachmentPreviewProps) => (\n <FileAttachmentPreview\n attachment={attachment as LocalFileAttachment}\n handleRetry={handleRetry}\n removeAttachments={removeAttachments}\n />\n);\n","import React from 'react';\nimport clsx from 'clsx';\n\ntype DurationDisplayProps = {\n /** Whether audio is currently playing */\n isPlaying: boolean;\n /** Optional className for styling */\n className?: string;\n /** Total duration in seconds */\n duration?: number;\n /** Elapsed time in seconds */\n secondsElapsed?: number;\n /** Show remaining time instead of elapsed when possible */\n showRemaining?: boolean;\n};\n\nfunction formatTime(totalSeconds?: number, rounding: 'ceil' | 'floor' = 'ceil') {\n if (totalSeconds == null || Number.isNaN(totalSeconds) || totalSeconds < 0) {\n return null;\n }\n const roundedSeconds =\n rounding === 'floor' ? Math.floor(totalSeconds) : Math.ceil(totalSeconds);\n const hours = Math.floor(roundedSeconds / 3600);\n const minutes = Math.floor((roundedSeconds % 3600) / 60);\n const seconds = roundedSeconds % 60;\n const minSec = `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(\n 2,\n '0',\n )}`;\n return hours ? `${String(hours).padStart(2, '0')}:${minSec}` : minSec;\n}\n\nexport function DurationDisplay({\n className,\n duration,\n isPlaying,\n secondsElapsed,\n showRemaining = false,\n}: DurationDisplayProps) {\n const remainingSeconds =\n duration != null && secondsElapsed != null\n ? Math.max(0, duration - secondsElapsed)\n : undefined;\n const formattedDuration = formatTime(duration);\n const formattedSecondsElapsed = formatTime(secondsElapsed);\n const formattedRemaining = formatTime(remainingSeconds);\n\n const shouldShowElapsed =\n !!secondsElapsed && secondsElapsed > 0 && secondsElapsed < (duration || 0);\n const canShowRemaining = showRemaining && duration != null && secondsElapsed != null;\n const primaryValue = showRemaining ? formattedRemaining : formattedSecondsElapsed;\n const showPrimary = (canShowRemaining || shouldShowElapsed) && !!primaryValue;\n const showDuration = !showPrimary && !!formattedDuration;\n\n return (\n <div\n className={clsx(\n 'str-chat__duration-display',\n {\n 'str-chat__duration-display--hasProgress': !!secondsElapsed,\n 'str-chat__duration-display--isPlaying': isPlaying,\n },\n className,\n )}\n >\n {showPrimary && (\n <span className='str-chat__duration-display__time-elapsed'>{primaryValue}</span>\n )}\n {showDuration && (\n <span className='str-chat__duration-display__duration'>{formattedDuration}</span>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { Button } from '../../Button';\nimport clsx from 'clsx';\n\nexport type PlaybackRateButtonProps = React.ComponentProps<'button'>;\n\nexport const PlaybackRateButton = ({\n children,\n className,\n ...rest\n}: PlaybackRateButtonProps) => (\n <Button\n data-testid='playback-rate-button'\n {...rest}\n className={clsx('str-chat__playback-rate-button', className)}\n >\n {children}\n </Button>\n);\n","import type { PointerEventHandler } from 'react';\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport type { SeekFn as AudioPlayerSeekFn } from '../AudioPlayer';\n\ntype SeekParams = Parameters<AudioPlayerSeekFn>[0];\n\ntype UseInteractiveProgressBarParams = {\n progress?: number;\n seek: (params: SeekParams) => void;\n};\n\nconst getAvailableTrackWidth = (trackRoot: HTMLDivElement | null) => {\n if (!trackRoot) return 0;\n\n const parent = trackRoot.parentElement;\n if (!parent) return trackRoot.getBoundingClientRect().width;\n\n const parentWidth = parent.getBoundingClientRect().width;\n const computedStyle = window.getComputedStyle(parent);\n const paddingLeft = parseFloat(computedStyle.paddingLeft) || 0;\n const paddingRight = parseFloat(computedStyle.paddingRight) || 0;\n const rawColumnGap = computedStyle.columnGap || computedStyle.gap;\n const parsedColumnGap = parseFloat(rawColumnGap);\n const columnGap = Number.isNaN(parsedColumnGap) ? 0 : parsedColumnGap;\n const gapCount = Math.max(0, parent.children.length - 1);\n const totalGapsWidth = columnGap * gapCount;\n const siblingsWidth = Array.from(parent.children).reduce((total, child) => {\n if (child === trackRoot) return total;\n return total + child.getBoundingClientRect().width;\n }, 0);\n\n return Math.max(\n 0,\n parentWidth - paddingLeft - paddingRight - totalGapsWidth - siblingsWidth,\n );\n};\n\nexport const useInteractiveProgressBar = ({\n progress = 0,\n seek,\n}: UseInteractiveProgressBarParams) => {\n const isDragging = useRef(false);\n const [availableTrackWidth, setAvailableTrackWidth] = useState(0);\n const [root, setRoot] = useState<HTMLDivElement | null>(null);\n const [progressIndicator, setProgressIndicator] = useState<HTMLDivElement | null>(null);\n const lastIndicatorWidth = useRef(0);\n\n const handleDragStart: PointerEventHandler<HTMLDivElement> = (e) => {\n e.preventDefault();\n if (!progressIndicator) return;\n\n isDragging.current = true;\n progressIndicator.style.cursor = 'grabbing';\n };\n\n const handleDrag: PointerEventHandler<HTMLDivElement> = (e) => {\n if (!isDragging.current) return;\n // Snapshot the event because seek is throttled.\n seek({ ...e });\n };\n\n const handleDragStop = useCallback(() => {\n if (!progressIndicator) return;\n\n isDragging.current = false;\n progressIndicator.style.removeProperty('cursor');\n }, [progressIndicator]);\n\n useEffect(() => {\n document.addEventListener('pointerup', handleDragStop);\n\n return () => {\n document.removeEventListener('pointerup', handleDragStop);\n };\n }, [handleDragStop]);\n\n useEffect(() => {\n if (!root || typeof ResizeObserver === 'undefined') return;\n\n const observer = new ResizeObserver(([entry]) => {\n const nextAvailableWidth = getAvailableTrackWidth(entry.target as HTMLDivElement);\n setAvailableTrackWidth(nextAvailableWidth || entry.contentRect.width);\n });\n\n observer.observe(root);\n\n return () => {\n observer.disconnect();\n };\n }, [root]);\n\n useLayoutEffect(() => {\n if (root) {\n setAvailableTrackWidth(getAvailableTrackWidth(root));\n }\n\n if (progressIndicator) {\n lastIndicatorWidth.current = progressIndicator.getBoundingClientRect().width;\n }\n }, [progressIndicator, root]);\n\n const indicatorLeft =\n progress === 0 || !progressIndicator\n ? 0\n : Math.max(0, availableTrackWidth - lastIndicatorWidth.current) * (progress / 100) +\n 1;\n\n return {\n availableTrackWidth,\n handleDrag,\n handleDragStart,\n handleDragStop,\n indicatorLeft,\n root,\n setProgressIndicator,\n setRoot,\n };\n};\n","import clsx from 'clsx';\nimport React from 'react';\nimport { useInteractiveProgressBar } from './useInteractiveProgressBar';\nimport type { SeekFn as AudioPlayerSeekFn } from '../AudioPlayer';\n\ntype SeekParams = Parameters<AudioPlayerSeekFn>[0];\n\nexport type ProgressBarProps = {\n /** Progress expressed in fractional number value btw 0 and 100. */\n progress: number;\n seek: (params: SeekParams) => void;\n} & Pick<React.ComponentProps<'div'>, 'className'>;\n\nexport const ProgressBar = ({ className, progress, seek }: ProgressBarProps) => {\n const {\n handleDrag,\n handleDragStart,\n handleDragStop,\n indicatorLeft,\n setProgressIndicator,\n setRoot,\n } = useInteractiveProgressBar({ progress, seek });\n\n return (\n <div\n className={clsx(\n 'str-chat__message-attachment-audio-widget--progress-track',\n className,\n )}\n data-progress={progress}\n data-testid='audio-progress'\n onClick={seek}\n onPointerDown={handleDragStart}\n onPointerMove={handleDrag}\n onPointerUp={handleDragStop}\n ref={setRoot}\n role='progressbar'\n style={\n {\n '--str-chat__message-attachment-audio-widget-progress': progress + '%',\n } as React.CSSProperties\n }\n >\n <div\n className='str-chat__message-attachment-audio-widget--progress-indicator'\n ref={setProgressIndicator}\n style={{ left: `${indicatorLeft}px` }}\n />\n </div>\n );\n};\n","import type { ReactNode } from 'react';\nimport type { Attachment, SharedLocationResponse } from 'stream-chat';\nimport type { ATTACHMENT_GROUPS_ORDER, AttachmentProps } from './Attachment';\nimport * as linkify from 'linkifyjs';\n\nexport const SUPPORTED_VIDEO_FORMATS = [\n 'video/mp4',\n 'video/ogg',\n 'video/webm',\n 'video/quicktime',\n];\n\nexport type AttachmentComponentType =\n | 'card'\n | 'gallery'\n | 'giphy'\n | 'image'\n | 'media'\n | 'audio'\n | 'voiceRecording'\n | 'file'\n | 'geolocation'\n | 'unsupported';\n\nexport type AttachmentContainerType = (typeof ATTACHMENT_GROUPS_ORDER)[number];\n\nexport type GroupedRenderedAttachment = Record<AttachmentContainerType, ReactNode[]>;\n\nexport type GalleryAttachment = {\n items: Attachment[];\n type: 'gallery';\n};\n\nexport type RenderAttachmentProps = Omit<AttachmentProps, 'attachments'> & {\n attachment: Attachment;\n};\n\nexport type RenderGalleryProps = Omit<AttachmentProps, 'attachments'> & {\n attachment: GalleryAttachment;\n};\n\nexport type RenderMediaProps = Omit<AttachmentProps, 'attachments'> & {\n attachments: Attachment[];\n};\n\nexport type GeolocationContainerProps = Omit<AttachmentProps, 'attachments'> & {\n location: SharedLocationResponse;\n};\n\n// This identity function determines attachment type specific to React.\n// Once made sure other SDKs support the same logic, move to stream-chat-js\nexport const isGalleryAttachmentType = (\n attachment: Attachment | GalleryAttachment,\n): attachment is GalleryAttachment =>\n Array.isArray((attachment as GalleryAttachment).items);\n\nexport const isSvgAttachment = (attachment: Attachment) => {\n const filename = attachment.fallback || '';\n return filename.toLowerCase().endsWith('.svg');\n};\n\nexport const divMod = (num: number, divisor: number) => [\n Math.floor(num / divisor),\n num % divisor,\n];\n\nexport const displayDuration = (totalSeconds?: number) => {\n if (!totalSeconds || totalSeconds < 0) return '00:00';\n\n const [hours, hoursLeftover] = divMod(totalSeconds, 3600);\n const [minutes, seconds] = divMod(hoursLeftover, 60);\n const roundedSeconds = Math.ceil(seconds);\n const prependHrsZero = String(hours).padStart(2, '0');\n const prependMinZero = String(minutes).padStart(2, '0');\n const prependSecZero = String(roundedSeconds).padStart(2, '0');\n const minSec = `${prependMinZero}:${prependSecZero}`;\n\n return hours ? `${prependHrsZero}:` + minSec : minSec;\n};\nexport function getCssDimensionsVariables(url: string) {\n const cssVars = {\n '--original-height': 1000000,\n '--original-width': 1000000,\n } as Record<string, number>;\n\n if (linkify.test(url, 'url')) {\n const urlParams = new URL(url).searchParams;\n const oh = Number(urlParams.get('oh'));\n const ow = Number(urlParams.get('ow'));\n const originalHeight = oh > 1 ? oh : 1000000;\n const originalWidth = ow > 1 ? ow : 1000000;\n cssVars['--original-width'] = originalWidth;\n cssVars['--original-height'] = originalHeight;\n }\n\n return cssVars;\n}\n","import { divMod } from './utils';\n\nexport const resampleWaveformData = (waveformData: number[], amplitudesCount: number) =>\n waveformData.length === amplitudesCount\n ? waveformData\n : waveformData.length > amplitudesCount\n ? downSample(waveformData, amplitudesCount)\n : upSample(waveformData, amplitudesCount);\n\n/**\n * The downSample function uses the Largest-Triangle-Three-Buckets (LTTB) algorithm.\n * See the thesis Downsampling Time Series for Visual Representation by Sveinn Steinarsson for more (https://skemman.is/bitstream/1946/15343/3/SS_MSthesis.pdf)\n * @param data\n * @param targetOutputSize\n */\nexport function downSample(data: number[], targetOutputSize: number): number[] {\n if (data.length <= targetOutputSize || targetOutputSize === 0) {\n return data;\n }\n\n if (targetOutputSize === 1) return [mean(data)];\n\n const result: number[] = [];\n // bucket size adjusted due to the fact that the first and the last item in the original data array is kept in target output\n const bucketSize = (data.length - 2) / (targetOutputSize - 2);\n let lastSelectedPointIndex = 0;\n result.push(data[lastSelectedPointIndex]); // Always add the first point\n let maxAreaPoint, maxArea, triangleArea;\n\n for (let bucketIndex = 1; bucketIndex < targetOutputSize - 1; bucketIndex++) {\n const previousBucketRefPoint = data[lastSelectedPointIndex];\n const nextBucketMean = getNextBucketMean(data, bucketIndex, bucketSize);\n\n const currentBucketStartIndex = Math.floor((bucketIndex - 1) * bucketSize) + 1;\n const nextBucketStartIndex = Math.floor(bucketIndex * bucketSize) + 1;\n const countUnitsBetweenAtoC = 1 + nextBucketStartIndex - currentBucketStartIndex;\n\n maxArea = triangleArea = -1;\n\n for (\n let currentPointIndex = currentBucketStartIndex;\n currentPointIndex < nextBucketStartIndex;\n currentPointIndex++\n ) {\n const countUnitsBetweenAtoB =\n Math.abs(currentPointIndex - currentBucketStartIndex) + 1;\n const countUnitsBetweenBtoC = countUnitsBetweenAtoC - countUnitsBetweenAtoB;\n const currentPointValue = data[currentPointIndex];\n\n triangleArea = triangleAreaHeron(\n triangleBase(\n Math.abs(previousBucketRefPoint - currentPointValue),\n countUnitsBetweenAtoB,\n ),\n triangleBase(Math.abs(currentPointValue - nextBucketMean), countUnitsBetweenBtoC),\n triangleBase(\n Math.abs(previousBucketRefPoint - nextBucketMean),\n countUnitsBetweenAtoC,\n ),\n );\n\n if (triangleArea > maxArea) {\n maxArea = triangleArea;\n maxAreaPoint = data[currentPointIndex];\n lastSelectedPointIndex = currentPointIndex;\n }\n }\n\n if (typeof maxAreaPoint !== 'undefined') result.push(maxAreaPoint);\n }\n\n result.push(data[data.length - 1]); // Always add the last point\n\n return result;\n}\n\nconst triangleAreaHeron = (a: number, b: number, c: number) => {\n const s = (a + b + c) / 2;\n return Math.sqrt(s * (s - a) * (s - b) * (s - c));\n};\nconst triangleBase = (a: number, b: number) => Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2));\nconst mean = (values: number[]) =>\n values.reduce((acc, value) => acc + value, 0) / values.length;\nconst getNextBucketMean = (\n data: number[],\n currentBucketIndex: number,\n bucketSize: number,\n) => {\n const nextBucketStartIndex = Math.floor(currentBucketIndex * bucketSize) + 1;\n let nextNextBucketStartIndex = Math.floor((currentBucketIndex + 1) * bucketSize) + 1;\n nextNextBucketStartIndex =\n nextNextBucketStartIndex < data.length ? nextNextBucketStartIndex : data.length;\n\n return mean(data.slice(nextBucketStartIndex, nextNextBucketStartIndex));\n};\nexport const upSample = (values: number[], targetSize: number) => {\n if (!values.length) {\n console.warn('Cannot extend empty array of amplitudes.');\n return values;\n }\n\n if (values.length > targetSize) {\n console.warn(\n 'Requested to extend the waveformData that is longer than the target list size',\n );\n return values;\n }\n\n if (targetSize === values.length) return values;\n\n // eslint-disable-next-line prefer-const\n let [bucketSize, remainder] = divMod(targetSize, values.length);\n const result: number[] = [];\n\n for (let i = 0; i < values.length; i++) {\n const extra = remainder && remainder-- ? 1 : 0;\n result.push(...Array(bucketSize + extra).fill(values[i]));\n }\n return result;\n};\n","import throttle from 'lodash.throttle';\nimport React, { useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport clsx from 'clsx';\nimport { resampleWaveformData } from '../../Attachment/audioSampling';\nimport type { SeekFn as AudioPlayerSeekFn } from '../AudioPlayer';\nimport { useInteractiveProgressBar } from './useInteractiveProgressBar';\n\ntype SeekParams = Parameters<AudioPlayerSeekFn>[0];\n\ntype WaveProgressBarProps = {\n /** Function that allows to change the track progress */\n seek: (params: SeekParams) => void;\n /** The array of fractional number values between 0 and 1 representing the height of amplitudes */\n waveformData: number[];\n /** Progress expressed in fractional number value btw 0 and 100. */\n progress?: number;\n /** Absolute gap width between bars in px (overrides computed gap var). */\n amplitudeBarGapWidthPx?: number;\n relativeAmplitudeBarWidth?: number;\n relativeAmplitudeGap?: number;\n};\n\nexport const WaveProgressBar = ({\n amplitudeBarGapWidthPx,\n progress = 0,\n relativeAmplitudeBarWidth = 2,\n relativeAmplitudeGap = 1,\n seek,\n waveformData,\n}: WaveProgressBarProps) => {\n const [trackAxisX, setTrackAxisX] = useState<{\n barCount: number;\n barWidth: number;\n gap: number;\n }>();\n const lastAvailableTrackWidth = useRef<number>(0);\n const minAmplitudeBarWidthRef = useRef<number | null>(null);\n const lastMinAmplitudeBarWidthUsed = useRef<number | null>(null);\n const {\n availableTrackWidth,\n handleDrag,\n handleDragStart,\n handleDragStop,\n indicatorLeft,\n root,\n setProgressIndicator,\n setRoot,\n } = useInteractiveProgressBar({ progress, seek });\n\n const getTrackAxisX = useMemo(\n () =>\n throttle((availableWidth: number) => {\n const minAmplitudeBarWidth = minAmplitudeBarWidthRef.current;\n const hasMinWidthChanged =\n minAmplitudeBarWidth !== lastMinAmplitudeBarWidthUsed.current;\n if (availableWidth === lastAvailableTrackWidth.current && !hasMinWidthChanged) {\n return;\n }\n lastAvailableTrackWidth.current = availableWidth;\n lastMinAmplitudeBarWidthUsed.current = minAmplitudeBarWidth;\n const possibleAmpCount = Math.floor(\n availableWidth / (relativeAmplitudeGap + relativeAmplitudeBarWidth),\n );\n const amplitudeBarWidthToGapRatio =\n relativeAmplitudeBarWidth / (relativeAmplitudeBarWidth + relativeAmplitudeGap);\n const maxCountByMinWidth =\n typeof minAmplitudeBarWidth === 'number' && minAmplitudeBarWidth > 0\n ? Math.floor(\n (availableWidth * amplitudeBarWidthToGapRatio) / minAmplitudeBarWidth,\n )\n : possibleAmpCount;\n const barCount = Math.max(0, Math.min(possibleAmpCount, maxCountByMinWidth));\n const barWidth =\n barCount && (availableWidth / barCount) * amplitudeBarWidthToGapRatio;\n\n setTrackAxisX({\n barCount,\n barWidth,\n gap: barWidth * (relativeAmplitudeGap / relativeAmplitudeBarWidth),\n });\n }, 1),\n [relativeAmplitudeBarWidth, relativeAmplitudeGap],\n );\n\n const resampledWaveformData = useMemo(\n () => (trackAxisX ? resampleWaveformData(waveformData, trackAxisX.barCount) : []),\n [trackAxisX, waveformData],\n );\n\n useLayoutEffect(() => {\n if (availableTrackWidth > 0) {\n getTrackAxisX(availableTrackWidth);\n }\n }, [availableTrackWidth, getTrackAxisX]);\n\n useLayoutEffect(() => {\n if (!root || typeof window === 'undefined') return;\n const amplitudeBar = root.querySelector<HTMLElement>(\n '.str-chat__wave-progress-bar__amplitude-bar',\n );\n if (!amplitudeBar) return;\n const computedStyle = window.getComputedStyle(amplitudeBar);\n const parsedMinWidth = parseFloat(computedStyle.minWidth);\n if (!Number.isNaN(parsedMinWidth) && parsedMinWidth > 0) {\n minAmplitudeBarWidthRef.current = parsedMinWidth;\n }\n if (availableTrackWidth > 0) {\n getTrackAxisX(availableTrackWidth);\n }\n }, [availableTrackWidth, getTrackAxisX, root, trackAxisX?.barCount]);\n\n if (!waveformData.length || trackAxisX?.barCount === 0) return null;\n\n const amplitudeGapWidth = amplitudeBarGapWidthPx ?? trackAxisX?.gap;\n\n return (\n <div\n className={clsx('str-chat__wave-progress-bar__track', {\n 'str-chat__wave-progress-bar__track--playback-initiated': progress > 0,\n })}\n data-testid='wave-progress-bar-track'\n onClick={seek}\n onPointerDown={handleDragStart}\n onPointerMove={handleDrag}\n onPointerUp={handleDragStop}\n ref={setRoot}\n role='progressbar'\n style={\n {\n '--str-chat__voice-recording-amplitude-bar-gap-width':\n typeof amplitudeGapWidth === 'number' ? `${amplitudeGapWidth}px` : undefined,\n } as React.CSSProperties\n }\n >\n {resampledWaveformData.map((amplitude, i) => (\n <div\n className={clsx('str-chat__wave-progress-bar__amplitude-bar', {\n ['str-chat__wave-progress-bar__amplitude-bar--active']:\n progress > (i / resampledWaveformData.length) * 100,\n })}\n data-testid='amplitude-bar'\n key={`amplitude-${i}`}\n style={\n {\n '--str-chat__voice-recording-amplitude-bar-width':\n trackAxisX?.barWidth + 'px',\n '--str-chat__wave-progress-bar__amplitude-bar-height': amplitude\n ? amplitude * 100 + '%'\n : '0%',\n } as React.CSSProperties\n }\n />\n ))}\n <div\n className='str-chat__wave-progress-bar__progress-indicator'\n data-testid='wave-progress-bar-progress-indicator'\n ref={setProgressIndicator}\n style={{\n left: `${indicatorLeft}px`,\n }}\n />\n </div>\n );\n};\n","import type { UploadAttachmentPreviewProps } from './types';\nimport {\n isVoiceRecordingAttachment,\n type LocalAudioAttachment,\n type LocalVoiceRecordingAttachment,\n} from 'stream-chat';\nimport { useTranslationContext } from '../../../context';\nimport React, { useEffect } from 'react';\nimport clsx from 'clsx';\nimport { LoadingIndicatorIcon } from '../icons';\nimport { RemoveAttachmentPreviewButton } from '../RemoveAttachmentPreviewButton';\nimport { AttachmentPreviewRoot } from './utils/AttachmentPreviewRoot';\nimport { FileSizeIndicator } from '../../Attachment';\nimport { IconExclamationCircle, IconExclamationTriangle } from '../../Icons';\nimport { PlayButton } from '../../Button';\nimport {\n type AudioPlayerState,\n DurationDisplay,\n PlaybackRateButton,\n WaveProgressBar,\n} from '../../AudioPlayback';\nimport { useAudioPlayer } from '../../AudioPlayback/WithAudioPlayback';\nimport { useStateStore } from '../../../store';\n\nexport type AudioAttachmentPreviewProps<CustomLocalMetadata = Record<string, unknown>> =\n UploadAttachmentPreviewProps<\n | LocalAudioAttachment<CustomLocalMetadata>\n | LocalVoiceRecordingAttachment<CustomLocalMetadata>\n >;\n\nconst audioPlayerStateSelector = (state: AudioPlayerState) => ({\n canPlayRecord: state.canPlayRecord,\n isPlaying: state.isPlaying,\n playbackRate: state.currentPlaybackRate,\n progressPercent: state.progressPercent,\n secondsElapsed: state.secondsElapsed,\n});\n\nexport const AudioAttachmentPreview = ({\n attachment,\n handleRetry,\n removeAttachments,\n}: AudioAttachmentPreviewProps) => {\n const { t } = useTranslationContext();\n const { id, previewUri, uploadPermissionCheck, uploadState } =\n attachment.localMetadata ?? {};\n const url = attachment.asset_url || previewUri;\n\n const audioPlayer = useAudioPlayer({\n fileSize: attachment.localMetadata.file?.size ?? attachment.file_size,\n mimeType: attachment.localMetadata.file?.type ?? attachment.mime_type,\n requester: attachment.localMetadata.id,\n src: url,\n title: attachment.title,\n waveformData: attachment.waveform_data,\n });\n\n useEffect(() => {\n audioPlayer?.cancelScheduledRemoval();\n return () => {\n audioPlayer?.scheduleRemoval();\n };\n }, [audioPlayer]);\n\n const { canPlayRecord, isPlaying, playbackRate, progressPercent, secondsElapsed } =\n useStateStore(audioPlayer?.state, audioPlayerStateSelector) ?? {};\n\n const resolvedDuration = audioPlayer?.durationSeconds ?? attachment.duration;\n\n const hasWaveform = !!audioPlayer?.waveformData?.length;\n const hasSizeLimitError = uploadPermissionCheck?.reason === 'size_limit';\n const hasFatalError = uploadState === 'blocked' || hasSizeLimitError;\n const hasRetriableError = uploadState === 'failed' && !!handleRetry;\n const hasError = hasRetriableError || hasFatalError;\n\n const showProgressControls = !hasError || (hasError && isPlaying);\n\n return (\n <AttachmentPreviewRoot\n attachment={attachment}\n className={clsx('str-chat__attachment-preview-audio')}\n data-testid='attachment-preview-audio'\n >\n <PlayButton\n isPlaying={Boolean(isPlaying)}\n onClick={() => {\n audioPlayer?.togglePlay();\n }}\n />\n\n <div className='str-chat__attachment-preview-file__info'>\n <div className='str-chat__attachment-preview-file-name' title={attachment.title}>\n {isVoiceRecordingAttachment(attachment) ? t('Voice message') : attachment.title}\n </div>\n <div className='str-chat__attachment-preview-file__data'>\n {uploadState === 'uploading' && <LoadingIndicatorIcon />}\n {showProgressControls ? (\n <>\n {!resolvedDuration && !progressPercent && !isPlaying && (\n <FileSizeIndicator fileSize={attachment.file_size} />\n )}\n {hasWaveform ? (\n <>\n <DurationDisplay\n duration={resolvedDuration}\n isPlaying={Boolean(isPlaying)}\n secondsElapsed={secondsElapsed}\n showRemaining\n />\n <WaveProgressBar\n progress={progressPercent}\n relativeAmplitudeBarWidth={1}\n relativeAmplitudeGap={1}\n seek={audioPlayer.seek}\n waveformData={audioPlayer.waveformData}\n />\n </>\n ) : (\n <DurationDisplay\n duration={resolvedDuration}\n isPlaying={Boolean(isPlaying)}\n secondsElapsed={secondsElapsed}\n />\n )}\n </>\n ) : hasFatalError ? (\n <div className='str-chat__attachment-preview-file__fatal-error'>\n <IconExclamationCircle />\n <span>\n {hasSizeLimitError\n ? t('File too large')\n : uploadState === 'blocked'\n ? t('Upload blocked')\n : t('Upload failed')}\n </span>\n </div>\n ) : (\n <div className='str-chat__attachment-preview-file__retriable-error'>\n <IconExclamationTriangle />\n <span>{t('Upload error')}</span>\n <button\n aria-label={t('aria/Retry upload')}\n className='str-chat__attachment-preview-file__retry-upload-button'\n data-testid='file-preview-item-retry-button'\n onClick={() => {\n handleRetry(attachment);\n }}\n type='button'\n >\n {t('Retry upload')}\n </button>\n </div>\n )}\n </div>\n </div>\n {audioPlayer && canPlayRecord && (\n <PlaybackRateButton onClick={audioPlayer.increasePlaybackRate}>\n x{playbackRate?.toString()}\n </PlaybackRateButton>\n )}\n <RemoveAttachmentPreviewButton\n data-testid='audio-preview-item-delete-button'\n onClick={() => {\n if (id) removeAttachments([id]);\n }}\n uploadState={uploadState}\n />\n </AttachmentPreviewRoot>\n );\n};\n","import type { UploadAttachmentPreviewProps } from './types';\nimport {\n isVideoAttachment,\n type LocalImageAttachment,\n type LocalVideoAttachment,\n} from 'stream-chat';\nimport { useComponentContext, useTranslationContext } from '../../../context';\nimport { BaseImage as DefaultBaseImage } from '../../BaseImage';\nimport React, {\n type KeyboardEvent,\n type MouseEvent,\n useCallback,\n useMemo,\n useState,\n} from 'react';\nimport clsx from 'clsx';\nimport { LoadingIndicatorIcon } from '../icons';\nimport {\n IconArrowRotateClockwise,\n IconExclamationCircle,\n IconVideoSolid,\n} from '../../Icons';\nimport { RemoveAttachmentPreviewButton } from '../RemoveAttachmentPreviewButton';\nimport { Button } from '../../Button';\nimport { AttachmentPreviewRoot } from './utils/AttachmentPreviewRoot';\n\nexport type MediaAttachmentPreviewProps<CustomLocalMetadata = Record<string, unknown>> =\n UploadAttachmentPreviewProps<\n LocalVideoAttachment<CustomLocalMetadata> | LocalImageAttachment<CustomLocalMetadata>\n > & {\n openPreview?: () => void;\n };\n\nexport const MediaAttachmentPreview = ({\n attachment,\n handleRetry,\n openPreview,\n removeAttachments,\n}: MediaAttachmentPreviewProps) => {\n const { t } = useTranslationContext();\n const { BaseImage = DefaultBaseImage, LoadingIndicator = LoadingIndicatorIcon } =\n useComponentContext();\n const [thumbnailPreviewError, setThumbnailPreviewError] = useState(false);\n\n const { id, uploadPermissionCheck, uploadState } = attachment.localMetadata ?? {};\n\n const isUploading = uploadState === 'uploading';\n const handleThumbnailLoadError = useCallback(() => setThumbnailPreviewError(true), []);\n const hasSizeLimitError = uploadPermissionCheck?.reason === 'size_limit';\n const hasFatalError = uploadState === 'blocked' || hasSizeLimitError;\n const hasRetriableError = uploadState === 'failed' && !!handleRetry;\n const hasUploadError = hasRetriableError || hasFatalError;\n\n const retry = (e: MouseEvent<Element> | KeyboardEvent<Element>) => {\n e.stopPropagation();\n handleRetry(attachment);\n return false;\n };\n\n const thumbnail = useMemo(\n () =>\n isVideoAttachment(attachment)\n ? {\n alt: attachment.title,\n title: attachment.title,\n url: attachment.thumb_url,\n }\n : {\n alt: attachment.fallback,\n title: attachment.fallback,\n url: attachment.image_url || attachment.localMetadata.previewUri,\n },\n [attachment],\n );\n\n return (\n <AttachmentPreviewRoot\n attachment={attachment}\n className={clsx('str-chat__attachment-preview-media', {\n 'str-chat__attachment-preview-media--thumbnail-preview-error':\n thumbnailPreviewError,\n 'str-chat__attachment-preview-media--upload-error': hasUploadError,\n 'str-chat__attachment-preview-media--uploading': isUploading,\n })}\n data-testid='attachment-preview-media'\n onPressed={hasRetriableError ? retry : undefined}\n openPreview={!isUploading && !hasUploadError ? openPreview : undefined}\n >\n <div className='str-chat__attachment-preview-media__thumbnail-wrapper'>\n {thumbnail.url && (\n <BaseImage\n alt={thumbnail.alt}\n className='str-chat__attachment-preview-media__thumbnail'\n onError={handleThumbnailLoadError}\n src={thumbnail.url}\n title={thumbnail.title}\n />\n )}\n\n <div className={clsx('str-chat__attachment-preview-media__overlay')}>\n {isUploading && <LoadingIndicator />}\n\n {isVideoAttachment(attachment) &&\n !hasUploadError &&\n uploadState !== 'uploading' && (\n <div className='str-chat__attachment-preview-media__video-indicator'>\n <IconVideoSolid />\n {attachment.duration && <div>{attachment.duration}</div>}\n </div>\n )}\n\n {hasFatalError && <IconExclamationCircle />}\n\n {hasRetriableError && (\n <Button\n appearance='solid'\n aria-label={t('aria/Retry upload')}\n circular\n className='str-chat__attachment-preview-media__retry-upload-button'\n data-testid='video-preview-item-retry-button'\n onClick={retry}\n size='sm'\n variant='danger'\n >\n <IconArrowRotateClockwise />\n </Button>\n )}\n </div>\n </div>\n\n <RemoveAttachmentPreviewButton\n data-testid='video-preview-item-delete-button'\n onClick={() => {\n if (id) removeAttachments([id]);\n }}\n uploadState={uploadState}\n />\n </AttachmentPreviewRoot>\n );\n};\n","import { createContext, useContext } from 'react';\n\nimport { toBaseImageDescriptors } from '../BaseImage';\nimport type { BaseImageProps } from '../BaseImage';\nimport type { Dimensions } from '../../types/types';\n\nexport type GalleryItem = Omit<BaseImageProps, 'src'> & {\n dimensions?: Dimensions;\n imageUrl?: string;\n videoThumbnailUrl?: string;\n videoUrl?: string;\n};\n\n/**\n * Maps an attachment (or link preview) to gallery item fields.\n * Delegates to {@link toBaseImageDescriptors}.\n */\nexport const toGalleryItemDescriptors = (\n ...args: Parameters<typeof toBaseImageDescriptors>\n): Pick<\n GalleryItem,\n 'alt' | 'dimensions' | 'imageUrl' | 'title' | 'videoThumbnailUrl' | 'videoUrl'\n> | void => toBaseImageDescriptors(...args);\n\nexport type GalleryContextValue = {\n /** Whether clicking the empty gallery background should request close */\n closeOnBackgroundClick: boolean;\n /** Currently displayed item index */\n currentIndex: number;\n /** Currently displayed item */\n currentItem: GalleryItem;\n /** Navigate to a specific index */\n goToIndex: (index: number) => void;\n /** Navigate to the next item */\n goToNext: () => void;\n /** Navigate to the previous item */\n goToPrevious: () => void;\n /** Whether there is a next item */\n hasNext: boolean;\n /** Whether there is a previous item */\n hasPrevious: boolean;\n /** Total number of items */\n itemCount: number;\n /** All items in the gallery */\n items: GalleryItem[];\n /** Request closing the gallery viewer */\n onRequestClose?: () => void;\n};\n\nexport const GalleryContext = createContext<GalleryContextValue | undefined>(undefined);\n\nexport const useGalleryContext = () => {\n const contextValue = useContext(GalleryContext);\n\n if (!contextValue) {\n console.warn(\n `The useGalleryContext hook was called outside of the GalleryContext provider. Make sure this hook is called within a child of the Gallery component.`,\n );\n\n return {} as GalleryContextValue;\n }\n\n return contextValue;\n};\n","import React, { useContext, useMemo } from 'react';\nimport { sanitizeUrl } from '@braintree/sanitize-url';\n\nimport { type GalleryItem } from './GalleryContext';\nimport { Button } from '../Button';\nimport { IconArrowDownCircle, IconCrossMedium } from '../Icons';\nimport { MessageTimestamp as DefaultMessageTimestamp } from '../Message/MessageTimestamp';\nimport {\n ModalContext,\n useComponentContext,\n useMessageContext,\n useTranslationContext,\n} from '../../context';\n\ntype GalleryHeaderProps = {\n currentItem: GalleryItem;\n};\n\nexport const GalleryHeader = ({ currentItem }: GalleryHeaderProps) => {\n const { t } = useTranslationContext();\n const { MessageTimestamp = DefaultMessageTimestamp } = useComponentContext('GalleryUI');\n const { isMyMessage, message } = useMessageContext('GalleryUI');\n const modalContext = useContext(ModalContext);\n\n const headerTitle =\n (isMyMessage?.() && t('You')) ||\n message?.user?.name ||\n message?.user?.id ||\n currentItem.title ||\n t('User uploaded content');\n const downloadUrl = useMemo(() => {\n const rawDownloadUrl = currentItem.videoUrl ?? currentItem.imageUrl;\n\n if (!rawDownloadUrl) return undefined;\n\n const sanitizedUrl = sanitizeUrl(rawDownloadUrl);\n\n return sanitizedUrl === 'about:blank' ? undefined : sanitizedUrl;\n }, [currentItem.imageUrl, currentItem.videoUrl]);\n const downloadLabel = t('aria/Download attachment');\n\n return (\n <div className='str-chat__gallery__header'>\n <div aria-hidden='true' className='str-chat__gallery__header-spacer' />\n <div className='str-chat__gallery__header-meta'>\n <div className='str-chat__gallery__title'>{headerTitle}</div>\n {message?.created_at ? (\n <MessageTimestamp customClass='str-chat__gallery__timestamp' />\n ) : null}\n </div>\n <div className='str-chat__gallery__header-actions'>\n {downloadUrl ? (\n <a\n aria-label={downloadLabel}\n className='str-chat__gallery__action-button str-chat__gallery__action-button--download'\n download\n href={downloadUrl}\n rel='noreferrer'\n target='_blank'\n title={downloadLabel}\n >\n <IconArrowDownCircle />\n </a>\n ) : null}\n {modalContext?.close ? (\n <Button\n aria-label={t('Close')}\n className='str-chat__gallery__action-button str-chat__gallery__action-button--close'\n onClick={modalContext.close}\n title={t('Close')}\n >\n <IconCrossMedium />\n </Button>\n ) : null}\n </div>\n </div>\n );\n};\n","import { useComponentContext } from '../../context';\nimport ReactPlayer from 'react-player';\nimport React from 'react';\n\nexport type VideoPlayerProps = {\n isPlaying?: boolean;\n videoUrl?: string;\n thumbnailUrl?: string;\n};\n\nexport const VideoPlayer = ({ isPlaying, thumbnailUrl, videoUrl }: VideoPlayerProps) => {\n const { VideoPlayer: VideoPlayerContext } = useComponentContext();\n\n return VideoPlayerContext ? (\n <VideoPlayerContext thumbnailUrl={thumbnailUrl} videoUrl={videoUrl} />\n ) : (\n <ReactPlayer\n className='react-player'\n config={{ file: { attributes: { poster: thumbnailUrl } } }}\n controls\n height='100%'\n playing={isPlaying}\n url={videoUrl}\n width='100%'\n />\n );\n};\n","import { BaseImage, type BaseImageProps } from '../BaseImage';\nimport { Button } from '../Button';\nimport clsx from 'clsx';\nimport { IconPlaySolid } from '../Icons';\nimport React from 'react';\nimport { useTranslationContext } from '../../context';\n\nexport type VideoThumbnailProps = BaseImageProps & {\n onPlay?: () => void;\n};\n\nexport const VideoThumbnail = ({\n className,\n onPlay,\n ...imageProps\n}: VideoThumbnailProps) => {\n const { t } = useTranslationContext();\n\n return (\n <div className='str-chat__message-attachment__video-thumbnail'>\n <BaseImage\n className={clsx('str-chat__message-attachment__video-thumbnail-image', className)}\n {...imageProps}\n />\n {onPlay ? (\n <Button\n appearance='solid'\n aria-label={t('Play video')}\n circular\n className={clsx(\n 'str-chat__message-attachment__video-thumbnail__play-indicator',\n )}\n onClick={onPlay}\n size='lg'\n variant='secondary'\n >\n <IconPlaySolid />\n </Button>\n ) : (\n <div className='str-chat__message-attachment__video-thumbnail__play-indicator'>\n <IconPlaySolid />\n </div>\n )}\n </div>\n );\n};\n","import React, { useCallback, useContext, useEffect, useRef, useState } from 'react';\n\nimport { BaseImage } from '../BaseImage';\nimport { GalleryHeader } from './GalleryHeader';\nimport { useGalleryContext } from './GalleryContext';\nimport { Button, type ButtonProps } from '../Button';\nimport { IconChevronLeft, IconChevronRight } from '../Icons';\nimport { ModalContext, useTranslationContext } from '../../context';\nimport { VideoPlayer } from '../VideoPlayer';\nimport { VideoThumbnail } from '../VideoPlayer/VideoThumbnail';\n\nimport clsx from 'clsx';\n\nconst SWIPE_THRESHOLD = 50;\nconst TRANSITION_DURATION = 300;\n\nexport const GalleryUI = () => {\n const { t } = useTranslationContext();\n const {\n closeOnBackgroundClick,\n currentIndex,\n currentItem,\n goToNext,\n goToPrevious,\n hasNext,\n hasPrevious,\n itemCount,\n onRequestClose,\n } = useGalleryContext();\n const modalContext = useContext(ModalContext);\n\n const [showVideo, setShowVideo] = useState(false);\n\n // Slide transition state\n const isTransitioningRef = useRef(false);\n const [slideOffset, setSlideOffset] = useState(0);\n const [isDragging, setIsDragging] = useState(false);\n const [slideDirection, setSlideDirection] = useState<'forward' | 'backward' | null>(\n null,\n );\n\n // Touch tracking refs\n // Some touch interactions on the slide container are followed by a click; suppress\n // that one-shot click so swipe navigation doesn't immediately trigger background close.\n const ignoreNextClickRef = useRef(false);\n const touchStartRef = useRef<{ x: number; y: number } | null>(null);\n const isVerticalSwipeRef = useRef(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Reset video play state when navigating to a new item\n useEffect(() => {\n setShowVideo(false);\n }, [currentIndex]);\n\n // Slide animation on index change\n const prevIndexRef = useRef(currentIndex);\n useEffect(() => {\n if (prevIndexRef.current === currentIndex) return;\n const direction = currentIndex > prevIndexRef.current ? 'forward' : 'backward';\n setSlideDirection(direction);\n setSlideOffset(0);\n setIsDragging(false);\n isTransitioningRef.current = true;\n\n const timer = setTimeout(() => {\n setSlideDirection(null);\n isTransitioningRef.current = false;\n }, TRANSITION_DURATION);\n\n prevIndexRef.current = currentIndex;\n return () => clearTimeout(timer);\n }, [currentIndex]);\n\n // Wrapped navigation functions that respect transition lock\n const handleGoToNext = useCallback(() => {\n if (isTransitioningRef.current) return;\n goToNext();\n }, [goToNext]);\n\n const handleGoToPrevious = useCallback(() => {\n if (isTransitioningRef.current) return;\n goToPrevious();\n }, [goToPrevious]);\n\n // Keyboard navigation\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n handleGoToPrevious();\n } else if (event.key === 'ArrowRight') {\n event.preventDefault();\n handleGoToNext();\n }\n },\n [handleGoToNext, handleGoToPrevious],\n );\n\n useEffect(() => {\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown]);\n\n // Touch event handlers\n const handleTouchStart = useCallback((event: React.TouchEvent) => {\n if (isTransitioningRef.current) return;\n const touch = event.touches[0];\n ignoreNextClickRef.current = false;\n touchStartRef.current = { x: touch.clientX, y: touch.clientY };\n isVerticalSwipeRef.current = false;\n }, []);\n\n const handleTouchMove = useCallback(\n (event: React.TouchEvent) => {\n if (!touchStartRef.current || isTransitioningRef.current) return;\n\n const touch = event.touches[0];\n const deltaX = touch.clientX - touchStartRef.current.x;\n const deltaY = touch.clientY - touchStartRef.current.y;\n\n // Determine swipe direction on first significant movement\n if (!isDragging && !isVerticalSwipeRef.current) {\n if (Math.abs(deltaY) > Math.abs(deltaX) && Math.abs(deltaY) > 10) {\n ignoreNextClickRef.current = true;\n isVerticalSwipeRef.current = true;\n return;\n }\n if (Math.abs(deltaX) > 10) {\n ignoreNextClickRef.current = true;\n setIsDragging(true);\n }\n }\n\n if (isVerticalSwipeRef.current) return;\n\n // Constrain drag when at boundaries\n if ((!hasNext && deltaX < 0) || (!hasPrevious && deltaX > 0)) {\n setSlideOffset(deltaX * 0.3); // Rubber-band effect\n } else {\n setSlideOffset(deltaX);\n }\n },\n [isDragging, hasNext, hasPrevious],\n );\n\n const handleTouchEnd = useCallback(() => {\n if (!touchStartRef.current || isVerticalSwipeRef.current) {\n if (isVerticalSwipeRef.current) ignoreNextClickRef.current = true;\n touchStartRef.current = null;\n return;\n }\n\n const offset = slideOffset;\n if (isDragging || Math.abs(offset) > 10) {\n ignoreNextClickRef.current = true;\n }\n touchStartRef.current = null;\n\n if (Math.abs(offset) >= SWIPE_THRESHOLD) {\n if (offset < 0 && hasNext) {\n goToNext();\n } else if (offset > 0 && hasPrevious) {\n goToPrevious();\n } else {\n // Snap back — at boundary\n setSlideOffset(0);\n }\n } else {\n // Snap back — below threshold\n setSlideOffset(0);\n }\n\n setIsDragging(false);\n }, [slideOffset, hasNext, hasPrevious, goToNext, goToPrevious, isDragging]);\n\n const requestClose = modalContext?.close ?? onRequestClose;\n const handleBackgroundClick = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n if (event.target !== event.currentTarget) return;\n\n if (ignoreNextClickRef.current) {\n ignoreNextClickRef.current = false;\n return;\n }\n\n if (!closeOnBackgroundClick) return;\n\n requestClose?.();\n },\n [closeOnBackgroundClick, requestClose],\n );\n\n const mediaStyle: React.CSSProperties =\n isDragging || (slideOffset !== 0 && slideDirection === null)\n ? { transform: `translateX(${slideOffset}px)` }\n : {};\n\n return (\n <div className='str-chat__gallery'>\n <div className='str-chat__gallery__main'>\n <GalleryHeader currentItem={currentItem} />\n <NavButton\n aria-label={t('Previous image')}\n className={clsx(\n 'str-chat__gallery__nav-button--prev',\n !hasPrevious && 'str-chat__gallery__nav-button--hidden',\n )}\n disabled={!hasPrevious}\n onClick={handleGoToPrevious}\n >\n <IconChevronLeft />\n </NavButton>\n <div\n className='str-chat__gallery__slide-container'\n onClick={handleBackgroundClick}\n onTouchEnd={handleTouchEnd}\n onTouchMove={handleTouchMove}\n onTouchStart={handleTouchStart}\n ref={containerRef}\n >\n <div\n className={clsx({\n 'str-chat__gallery__media--dragging': isDragging,\n 'str-chat__gallery__media--slide-backward':\n !isDragging && slideDirection === 'backward',\n 'str-chat__gallery__media--slide-forward':\n !isDragging && slideDirection === 'forward',\n })}\n style={mediaStyle}\n >\n {currentItem.videoUrl && currentItem.videoThumbnailUrl ? (\n <div className='str-chat__gallery__media str-chat__gallery__media--video'>\n {showVideo ? (\n <VideoPlayer isPlaying videoUrl={currentItem.videoUrl} />\n ) : (\n <VideoThumbnail\n alt={currentItem.title ?? ''}\n onPlay={() => setShowVideo(true)}\n src={currentItem.videoThumbnailUrl}\n />\n )}\n </div>\n ) : (\n <div className='str-chat__gallery__media str-chat__gallery__media--image'>\n <BaseImage alt={currentItem.alt} src={currentItem.imageUrl} />\n </div>\n )}\n </div>\n </div>\n <NavButton\n aria-label={t('Next image')}\n className={clsx(\n 'str-chat__gallery__nav-button--next',\n !hasNext && 'str-chat__gallery__nav-button--hidden',\n )}\n disabled={!hasNext}\n onClick={handleGoToNext}\n >\n <IconChevronRight />\n </NavButton>\n </div>\n {itemCount > 1 && (\n <div className='str-chat__gallery__position-indicator'>\n {currentIndex + 1} of {itemCount}\n </div>\n )}\n </div>\n );\n};\n\nconst NavButton = ({ className, ...props }: ButtonProps) => (\n <Button {...props} className={clsx('str-chat__gallery__nav-button', className)} />\n);\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { GalleryContext } from './GalleryContext';\nimport { GalleryUI as DefaultGalleryUI } from './GalleryUI';\nimport { useComponentContext } from '../../context';\n\nimport type { GalleryContextValue, GalleryItem } from './GalleryContext';\n\nexport type GalleryProps = {\n /** Whether clicking the empty gallery background should request close (default: true) */\n closeOnBackgroundClick?: boolean;\n /** Array of media attachments to display */\n items: GalleryItem[];\n /** Custom UI component to replace the default GalleryUI */\n GalleryUI?: React.ComponentType;\n /** Initial index of the item to display (default: 0) */\n initialIndex?: number;\n /** Callback when the active item changes */\n onIndexChange?: (index: number) => void;\n /** Callback invoked when the gallery requests to close */\n onRequestClose?: () => void;\n};\n\nexport const Gallery = ({\n closeOnBackgroundClick = true,\n GalleryUI,\n initialIndex = 0,\n items,\n onIndexChange,\n onRequestClose,\n}: GalleryProps) => {\n const { GalleryUI: ContextGalleryUI } = useComponentContext();\n const ResolvedGalleryUI = GalleryUI ?? ContextGalleryUI ?? DefaultGalleryUI;\n const [currentIndex, setCurrentIndex] = useState(initialIndex);\n\n const itemCount = items.length;\n\n const goToIndex = useCallback(\n (index: number) => {\n if (index >= 0 && index < itemCount) {\n setCurrentIndex(index);\n }\n },\n [itemCount],\n );\n\n const goToNext = useCallback(() => {\n setCurrentIndex((prev) => (prev < itemCount - 1 ? prev + 1 : prev));\n }, [itemCount]);\n\n const goToPrevious = useCallback(() => {\n setCurrentIndex((prev) => (prev > 0 ? prev - 1 : prev));\n }, []);\n\n useEffect(() => {\n onIndexChange?.(currentIndex);\n }, [currentIndex, onIndexChange]);\n\n const hasNext = currentIndex < itemCount - 1;\n const hasPrevious = currentIndex > 0;\n const currentItem = items[currentIndex];\n\n const contextValue = useMemo<GalleryContextValue>(\n () => ({\n closeOnBackgroundClick,\n currentIndex,\n currentItem,\n goToIndex,\n goToNext,\n goToPrevious,\n hasNext,\n hasPrevious,\n itemCount,\n items,\n onRequestClose,\n }),\n [\n closeOnBackgroundClick,\n currentIndex,\n currentItem,\n goToIndex,\n goToNext,\n goToPrevious,\n hasNext,\n hasPrevious,\n itemCount,\n items,\n onRequestClose,\n ],\n );\n\n return (\n <GalleryContext.Provider value={contextValue}>\n <ResolvedGalleryUI />\n </GalleryContext.Provider>\n );\n};\n","import React, { type ComponentType, useCallback, useMemo, useRef, useState } from 'react';\nimport {\n isLocalAttachment,\n isLocalAudioAttachment,\n isLocalFileAttachment,\n isLocalImageAttachment,\n isLocalVideoAttachment,\n isLocalVoiceRecordingAttachment,\n isScrapedContent,\n isVoiceRecordingAttachment,\n} from 'stream-chat';\nimport {\n UnsupportedAttachmentPreview as DefaultUnknownAttachmentPreview,\n type UnsupportedAttachmentPreviewProps,\n} from './UnsupportedAttachmentPreview';\nimport {\n FileAttachmentPreview as DefaultFileAttachmentPreview,\n type FileAttachmentPreviewProps,\n} from './FileAttachmentPreview';\nimport { type AudioAttachmentPreviewProps } from './AudioAttachmentPreview';\nimport { type ImageAttachmentPreviewProps } from './ImageAttachmentPreview';\nimport { useAttachmentsForPreview, useMessageComposerController } from '../hooks';\nimport {\n MediaAttachmentPreview,\n type MediaAttachmentPreviewProps,\n} from './MediaAttachmentPreview';\nimport { toBaseImageDescriptors } from '../../BaseImage';\nimport { Gallery } from '../../Gallery';\nimport { GlobalModal } from '../../Modal';\nimport { useComponentContext } from '../../../context';\n\nexport type AttachmentPreviewListProps = {\n AudioAttachmentPreview?:\n | ComponentType<AudioAttachmentPreviewProps>\n | ComponentType<FileAttachmentPreviewProps>;\n FileAttachmentPreview?: ComponentType<FileAttachmentPreviewProps>;\n ImageAttachmentPreview?: ComponentType<ImageAttachmentPreviewProps>;\n UnsupportedAttachmentPreview?: ComponentType<UnsupportedAttachmentPreviewProps>;\n VideoAttachmentPreview?: ComponentType<MediaAttachmentPreviewProps>;\n};\n\nexport const AttachmentPreviewList = ({\n AudioAttachmentPreview = DefaultFileAttachmentPreview,\n FileAttachmentPreview = DefaultFileAttachmentPreview,\n ImageAttachmentPreview = MediaAttachmentPreview,\n UnsupportedAttachmentPreview = DefaultUnknownAttachmentPreview,\n VideoAttachmentPreview = MediaAttachmentPreview,\n}: AttachmentPreviewListProps) => {\n const messageComposer = useMessageComposerController();\n const { Modal = GlobalModal } = useComponentContext();\n const [showPreview, setShowPreview] = useState(false);\n const initialIndexRef = useRef(0);\n\n const { attachments } = useAttachmentsForPreview();\n const filteredAttachments = useMemo(\n () => attachments.filter((a) => !isVoiceRecordingAttachment(a)),\n [attachments],\n );\n\n const { galleryItems, previewIndexById } = useMemo(() => {\n const items: NonNullable<ReturnType<typeof toBaseImageDescriptors>>[] = [];\n const indexById: Record<string, number> = {};\n for (const a of attachments) {\n if (isLocalImageAttachment(a) || isLocalVideoAttachment(a)) {\n const descriptor = toBaseImageDescriptors(a);\n if (descriptor) {\n indexById[a.localMetadata.id] = items.length;\n items.push(descriptor);\n }\n }\n }\n return { galleryItems: items, previewIndexById: indexById };\n }, [attachments]);\n\n const openPreviewAtIndex = useCallback((index: number) => {\n initialIndexRef.current = index;\n setShowPreview(true);\n }, []);\n\n if (!filteredAttachments.length) return null;\n\n return (\n <div\n className='str-chat__attachment-preview-list'\n data-testid='attachment-preview-list'\n >\n {attachments.map((attachment) => {\n if (isScrapedContent(attachment)) return null;\n // Voice recordings are rendered in the dedicated slot above (VoiceRecordingPreviewSlot)\n if (isLocalVoiceRecordingAttachment(attachment)) return null;\n if (isLocalAudioAttachment(attachment)) {\n return (\n <AudioAttachmentPreview\n attachment={attachment}\n handleRetry={messageComposer.attachmentManager.uploadAttachment}\n key={attachment.localMetadata.id || attachment.asset_url}\n removeAttachments={messageComposer.attachmentManager.removeAttachments}\n />\n );\n } else if (isLocalVideoAttachment(attachment)) {\n return (\n <VideoAttachmentPreview\n attachment={attachment}\n handleRetry={messageComposer.attachmentManager.uploadAttachment}\n key={attachment.localMetadata.id || attachment.asset_url}\n openPreview={() =>\n openPreviewAtIndex(previewIndexById[attachment.localMetadata.id] ?? 0)\n }\n removeAttachments={messageComposer.attachmentManager.removeAttachments}\n />\n );\n } else if (isLocalImageAttachment(attachment)) {\n return (\n <ImageAttachmentPreview\n attachment={attachment}\n handleRetry={messageComposer.attachmentManager.uploadAttachment}\n key={attachment.localMetadata.id || attachment.image_url}\n openPreview={() =>\n openPreviewAtIndex(previewIndexById[attachment.localMetadata.id] ?? 0)\n }\n removeAttachments={messageComposer.attachmentManager.removeAttachments}\n />\n );\n } else if (isLocalFileAttachment(attachment)) {\n return (\n <FileAttachmentPreview\n attachment={attachment}\n handleRetry={messageComposer.attachmentManager.uploadAttachment}\n key={attachment.localMetadata.id || attachment.asset_url}\n removeAttachments={messageComposer.attachmentManager.removeAttachments}\n />\n );\n } else if (isLocalAttachment(attachment)) {\n return (\n <UnsupportedAttachmentPreview\n attachment={attachment}\n handleRetry={messageComposer.attachmentManager.uploadAttachment}\n key={attachment.localMetadata.id}\n removeAttachments={messageComposer.attachmentManager.removeAttachments}\n />\n );\n }\n return null;\n })}\n {galleryItems.length > 0 && (\n <Modal\n className='str-chat__gallery-modal'\n onClose={() => setShowPreview(false)}\n open={showPreview}\n >\n <Gallery initialIndex={initialIndexRef.current} items={galleryItems} />\n </Modal>\n )}\n </div>\n );\n};\n","import type { ComponentType } from 'react';\nimport React from 'react';\nimport {\n isLocalVoiceRecordingAttachment,\n type LocalVoiceRecordingAttachment,\n} from 'stream-chat';\nimport { useAttachmentsForPreview, useMessageComposerController } from '../hooks';\nimport { AudioAttachmentPreview } from './AudioAttachmentPreview';\nimport type { UploadAttachmentPreviewProps } from './types';\n\nexport type VoiceRecordingPreviewProps<CustomLocalMetadata = Record<string, unknown>> =\n UploadAttachmentPreviewProps<LocalVoiceRecordingAttachment<CustomLocalMetadata>>;\n\nexport type VoiceRecordingPreviewSlotProps = {\n /** Custom UI component for each voice recording preview in the slot; defaults to AudioAttachmentPreview */\n VoiceRecordingPreview?: ComponentType<VoiceRecordingPreviewProps>;\n};\n\n/**\n * Dedicated slot for voice recording preview(s), rendered apart from the main attachment preview list\n */\nexport const VoiceRecordingPreviewSlot = ({\n VoiceRecordingPreview = AudioAttachmentPreview,\n}: VoiceRecordingPreviewSlotProps) => {\n const messageComposer = useMessageComposerController();\n const { attachments } = useAttachmentsForPreview();\n\n const voiceAttachments = attachments.filter(isLocalVoiceRecordingAttachment);\n const firstVoice = voiceAttachments[0];\n if (!firstVoice) return null;\n\n return (\n <div\n className='str-chat__message-composer-voice-preview-slot'\n data-testid='voice-preview-slot'\n >\n <VoiceRecordingPreview\n attachment={firstVoice}\n handleRetry={messageComposer.attachmentManager.uploadAttachment}\n removeAttachments={messageComposer.attachmentManager.removeAttachments}\n />\n </div>\n );\n};\n","import { useMessageComposerController } from './hooks';\nimport type { TextComposerState } from 'stream-chat';\nimport { IconCrossMedium, IconThunder } from '../Icons';\nimport { useMessageComposerContext } from '../../context';\n\nexport type CommandChipProps = {\n command?: TextComposerState['command'];\n};\n\nexport const CommandChip = ({ command }: CommandChipProps) => {\n const { textComposer } = useMessageComposerController();\n const { textareaRef } = useMessageComposerContext();\n if (!command) return null;\n\n return (\n <div className='str-chat__command-chip'>\n <IconThunder />\n <span>{command.name}</span>\n <button\n className={'str-chat__command-chip__close-button'}\n onClick={() => {\n textComposer.setCommand(null);\n textareaRef.current?.focus();\n }}\n >\n <IconCrossMedium />\n </button>\n </div>\n );\n};\n","import React from 'react';\nimport { useCooldownRemaining } from './hooks';\n\nexport const CooldownTimer = () => {\n const secondsLeft = useCooldownRemaining();\n\n return (\n <div className='str-chat__message-composer-cooldown' data-testid='cooldown-timer'>\n {secondsLeft}\n </div>\n );\n};\n","import clsx from 'clsx';\nimport React, { useState } from 'react';\nimport type { LinkPreview, LinkPreviewsManagerState } from 'stream-chat';\nimport { LinkPreviewsManager } from 'stream-chat';\nimport { useStateStore } from '../../store';\nimport { PopperTooltip } from '../Tooltip';\nimport { useEnterLeaveHandlers } from '../Tooltip/hooks';\nimport { useMessageComposerController } from './hooks';\nimport { BaseImage } from '../BaseImage';\nimport { RemoveAttachmentPreviewButton } from './RemoveAttachmentPreviewButton';\nimport { IconChainLink } from '../Icons';\n\nexport type LinkPreviewListProps = {\n displayLinkCount?: number;\n};\n\nconst linkPreviewsManagerStateSelector = (state: LinkPreviewsManagerState) => ({\n linkPreviews: Array.from(state.previews.values()).filter(\n (preview) =>\n LinkPreviewsManager.previewIsLoaded(preview) ||\n LinkPreviewsManager.previewIsLoading(preview),\n ),\n});\n\nexport const LinkPreviewList = ({ displayLinkCount = 1 }: LinkPreviewListProps) => {\n const messageComposer = useMessageComposerController();\n const { linkPreviewsManager } = messageComposer;\n const { linkPreviews } = useStateStore(\n linkPreviewsManager.state,\n linkPreviewsManagerStateSelector,\n );\n\n if (linkPreviews.length === 0) return null;\n\n return (\n <div className='str-chat__link-preview-list'>\n {linkPreviews.slice(0, displayLinkCount).map((linkPreview) => (\n <LinkPreviewCard key={linkPreview.og_scrape_url} linkPreview={linkPreview} />\n ))}\n </div>\n );\n};\n\ntype LinkPreviewProps = {\n linkPreview: LinkPreview;\n};\n\nexport const LinkPreviewCard = ({ linkPreview }: LinkPreviewProps) => {\n const { linkPreviewsManager } = useMessageComposerController();\n const { handleEnter, handleLeave, tooltipVisible } =\n useEnterLeaveHandlers<HTMLDivElement>();\n const [referenceElement, setReferenceElement] = useState<HTMLDivElement | null>(null);\n const { image_url, thumb_url, title, title_link } = linkPreview;\n\n if (\n !LinkPreviewsManager.previewIsLoaded(linkPreview) &&\n !LinkPreviewsManager.previewIsLoading(linkPreview)\n )\n return null;\n\n const previewImageSrc = title_link || image_url || thumb_url;\n return (\n <div\n className={clsx('str-chat__link-preview-card', {\n 'str-chat__link-preview-card--loading':\n LinkPreviewsManager.previewIsLoading(linkPreview),\n })}\n data-testid='link-preview-card'\n onMouseEnter={handleEnter}\n onMouseLeave={handleLeave}\n ref={setReferenceElement}\n >\n <PopperTooltip\n offset={[0, 5]}\n referenceElement={referenceElement}\n visible={tooltipVisible}\n >\n {linkPreview.og_scrape_url}\n </PopperTooltip>\n\n {previewImageSrc && (\n <BaseImage\n alt={title}\n className='str-chat__attachment-preview__thumbnail'\n src={previewImageSrc}\n title={title}\n />\n )}\n <div className='str-chat__link-preview-card__content'>\n <div className='str-chat__link-preview-card__content-title'>\n {linkPreview.title}\n </div>\n <div className='str-chat__link-preview-card__content-description'>\n {linkPreview.text}\n </div>\n <div className='str-chat__link-preview-card__content__url'>\n <IconChainLink />\n <span>{linkPreview.og_scrape_url}</span>\n </div>\n </div>\n\n <RemoveAttachmentPreviewButton\n className='str-chat__link-preview-card__dismiss-button'\n data-testid='link-preview-card-dismiss-btn'\n onClick={() => linkPreviewsManager.dismissPreview(linkPreview.og_scrape_url)}\n />\n </div>\n );\n};\n","import React from 'react';\nimport { useTranslationContext } from '../../context';\nimport type { RecordingPermission } from './classes/BrowserPermission';\n\nexport type RecordingPermissionDeniedNotificationProps = {\n permissionName: RecordingPermission;\n};\n\nexport const RecordingPermissionDeniedNotification = ({\n permissionName,\n}: RecordingPermissionDeniedNotificationProps) => {\n const { t } = useTranslationContext();\n const permissionTranslations = {\n body: {\n camera: t('To start recording, allow the camera access in your browser'),\n microphone: t('To start recording, allow the microphone access in your browser'),\n },\n heading: {\n camera: t('Allow access to camera'),\n microphone: t('Allow access to microphone'),\n },\n };\n\n return (\n <div className='str-chat__recording-permission-denied-notification'>\n <div className='str-chat__recording-permission-denied-notification__heading'>\n {permissionTranslations.heading[permissionName]}\n </div>\n <p className='str-chat__recording-permission-denied-notification__message'>\n {permissionTranslations.body[permissionName]}\n </p>\n </div>\n );\n};\n","import React, { useEffect } from 'react';\nimport { DurationDisplay, WaveProgressBar } from '../../AudioPlayback';\nimport type { AudioPlayerState } from '../../AudioPlayback/AudioPlayer';\nimport { useAudioPlayer } from '../../AudioPlayback/WithAudioPlayback';\nimport { useStateStore } from '../../../store';\nimport { IconPause, IconPlaySolid } from '../../Icons';\nimport { Button } from '../../Button';\nimport clsx from 'clsx';\n\nconst audioPlayerStateSelector = (state: AudioPlayerState) => ({\n isPlaying: state.isPlaying,\n progress: state.progressPercent,\n secondsElapsed: state.secondsElapsed,\n});\n\nexport type AudioRecordingPlayerProps = {\n durationSeconds: number;\n mimeType?: string;\n src?: string;\n waveformData?: number[];\n};\n\nexport const AudioRecordingPlayback = ({\n durationSeconds,\n mimeType,\n src,\n waveformData,\n}: AudioRecordingPlayerProps) => {\n const audioPlayer = useAudioPlayer({\n durationSeconds,\n mimeType,\n src,\n waveformData,\n });\n\n const { isPlaying, progress, secondsElapsed } =\n useStateStore(audioPlayer?.state, audioPlayerStateSelector) ?? {};\n\n const displayedDuration = secondsElapsed || durationSeconds;\n\n useEffect(() => {\n audioPlayer?.cancelScheduledRemoval();\n return () => {\n audioPlayer?.scheduleRemoval();\n };\n }, [audioPlayer]);\n\n if (!audioPlayer) return;\n\n return (\n <div\n className={clsx('str-chat__audio-recorder__recording-playback', {\n 'str-chat__audio-recorder__recording-playback--isPlaying': isPlaying,\n })}\n >\n <Button\n appearance='ghost'\n circular\n className='str-chat__audio_recorder__toggle-playback-button'\n data-testid='audio-recording-preview-toggle-play-btn'\n onClick={audioPlayer.togglePlay}\n size='sm'\n variant='secondary'\n >\n {isPlaying ? <IconPause /> : <IconPlaySolid />}\n </Button>\n <DurationDisplay\n className={clsx('str-chat__recording-timer', {\n 'str-chat__recording-timer--hours': displayedDuration >= 3600,\n })}\n duration={durationSeconds}\n isPlaying={!!isPlaying}\n secondsElapsed={secondsElapsed}\n />\n <div className='str-chat__wave-progress-bar__track-container'>\n <WaveProgressBar\n progress={progress}\n seek={audioPlayer.seek}\n waveformData={waveformData || []}\n />\n </div>\n </div>\n );\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\ntype UseTimeElapsedParams = {\n initialSeconds?: number;\n startOnMount?: boolean;\n};\n\n// todo: provide start timestamp\nexport const useTimeElapsed = ({\n initialSeconds = 0,\n startOnMount,\n}: UseTimeElapsedParams = {}) => {\n const [secondsElapsed, setSecondsElapsed] = useState<number>(initialSeconds);\n const updateInterval = useRef<ReturnType<typeof setInterval>>(undefined);\n\n const startCounter = useCallback(() => {\n if (updateInterval.current) return;\n updateInterval.current = setInterval(() => {\n setSecondsElapsed((prev) => prev + 1);\n }, 1000);\n }, []);\n\n const stopCounter = useCallback(() => {\n clearInterval(updateInterval.current);\n updateInterval.current = undefined;\n }, []);\n\n useEffect(() => {\n if (updateInterval.current) return;\n setSecondsElapsed(initialSeconds);\n }, [initialSeconds]);\n\n useEffect(() => {\n if (!startOnMount) return;\n startCounter();\n return () => {\n stopCounter();\n };\n }, [startCounter, startOnMount, stopCounter]);\n\n return {\n secondsElapsed,\n startCounter,\n stopCounter,\n };\n};\n","import clsx from 'clsx';\nimport { displayDuration } from '../../Attachment';\nimport React from 'react';\n\nexport type RecordingTimerProps = {\n durationSeconds: number;\n};\n\nexport const RecordingTimer = ({ durationSeconds }: RecordingTimerProps) => (\n <div\n className={clsx('str-chat__recording-timer', {\n 'str-chat__recording-timer--hours': durationSeconds >= 3600,\n })}\n >\n {displayDuration(durationSeconds)}\n </div>\n);\n","import React, { useEffect, useState } from 'react';\nimport { useTimeElapsed } from './hooks/useTimeElapsed';\nimport { useMessageComposerContext } from '../../../context';\nimport { RecordingTimer } from './RecordingTimer';\nimport { IconMicrophone } from '../../Icons';\n\ntype WaveformProps = {\n maxDataPointsDrawn?: number;\n};\n\nconst AudioRecordingWaveform = ({ maxDataPointsDrawn = 200 }: WaveformProps) => {\n const {\n recordingController: { recorder },\n } = useMessageComposerContext();\n\n const [amplitudes, setAmplitudes] = useState<number[]>([]);\n\n useEffect(() => {\n if (!recorder?.amplitudeRecorder) return;\n const amplitudesSubscription =\n recorder.amplitudeRecorder.amplitudes.subscribe(setAmplitudes);\n return () => {\n amplitudesSubscription.unsubscribe();\n };\n }, [recorder]);\n\n if (!recorder) return null;\n\n return (\n <div className='str-chat__waveform-box-container'>\n <div className='str-chat__wave-progress-bar__track'>\n {amplitudes.slice(-maxDataPointsDrawn).map((amplitude, i) => (\n <div\n className='str-chat__wave-progress-bar__amplitude-bar'\n key={`amplitude-${i}-voice-recording`}\n style={\n {\n '--str-chat__wave-progress-bar__amplitude-bar-height': amplitude\n ? amplitude * 100 + '%'\n : '0%',\n } as React.CSSProperties\n }\n />\n ))}\n </div>\n </div>\n );\n};\nexport const AudioRecordingPreview = () => {\n const {\n recordingController: { recorder },\n } = useMessageComposerContext();\n\n const initialSeconds = recorder?.durationMs ? recorder.durationMs / 1000 : 0;\n const { secondsElapsed, startCounter, stopCounter } = useTimeElapsed({\n initialSeconds,\n });\n\n useEffect(() => {\n if (!recorder?.mediaRecorder) return;\n const { mediaRecorder } = recorder;\n\n if (mediaRecorder.state === 'recording') {\n startCounter();\n }\n\n mediaRecorder.addEventListener('start', startCounter);\n mediaRecorder.addEventListener('resume', startCounter);\n mediaRecorder.addEventListener('stop', stopCounter);\n mediaRecorder.addEventListener('pause', stopCounter);\n\n return () => {\n mediaRecorder.removeEventListener('start', startCounter);\n mediaRecorder.removeEventListener('resume', startCounter);\n mediaRecorder.removeEventListener('stop', stopCounter);\n mediaRecorder.removeEventListener('pause', stopCounter);\n };\n }, [recorder, startCounter, stopCounter]);\n\n return (\n <div className='str-chat__audio-recorder__recording-preview'>\n <IconMicrophone />\n <RecordingTimer durationSeconds={secondsElapsed} />\n <AudioRecordingWaveform />\n </div>\n );\n};\n","import { MediaRecordingState } from '../classes';\n\nexport const isPaused = (recordingState?: MediaRecordingState) =>\n recordingState === MediaRecordingState.PAUSED;\nexport const isStopped = (recordingState?: MediaRecordingState) =>\n recordingState === MediaRecordingState.STOPPED;\nexport const isRecording = (recordingState?: MediaRecordingState) =>\n recordingState === MediaRecordingState.RECORDING;\n","import { CheckSignIcon, LoadingIndicatorIcon } from '../../MessageComposer/icons';\nimport { IconMicrophone, IconPause, IconTrashBin } from '../../Icons';\nimport React from 'react';\nimport {\n useChatContext,\n useMessageComposerContext,\n useTranslationContext,\n} from '../../../context';\nimport { isRecording } from './recordingStateIdentity';\nimport { Button } from '../../Button';\nimport { addNotificationTargetTag, useNotificationTarget } from '../../Notifications';\n\nconst ToggleRecordingButton = () => {\n const {\n recordingController: { recorder, recordingState },\n } = useMessageComposerContext();\n\n return (\n <Button\n appearance='outline'\n circular\n className='str-chat__audio_recorder__toggle-recording-button'\n onClick={() =>\n isRecording(recordingState) ? recorder?.pause() : recorder?.resume()\n }\n size='sm'\n variant='secondary'\n >\n {isRecording(recordingState) ? <IconPause /> : <IconMicrophone />}\n </Button>\n );\n};\n\nexport const AudioRecorderRecordingControls = () => {\n const { client } = useChatContext();\n const { t } = useTranslationContext();\n const {\n recordingController: { completeRecording, recorder, recording, recordingState },\n } = useMessageComposerContext();\n const panel = useNotificationTarget();\n\n const isUploadingFile = recording?.localMetadata?.uploadState === 'uploading';\n\n if (!recorder) return null;\n\n return (\n <div className='str-chat__audio_recorder__recording-controls'>\n {!isRecording(recordingState) && (\n <Button\n appearance='ghost'\n circular\n className='str-chat__audio_recorder__cancel-button'\n data-testid={'cancel-recording-audio-button'}\n disabled={isUploadingFile}\n onClick={() => {\n recorder.cancel();\n client.notifications.addInfo({\n message: t('Voice message deleted'),\n options: {\n tags: addNotificationTargetTag(panel),\n type: 'audioRecording:cancel:success',\n },\n origin: { emitter: 'AudioRecorder' },\n });\n }}\n size='sm'\n variant='secondary'\n >\n <IconTrashBin />\n </Button>\n )}\n <ToggleRecordingButton />\n <Button\n appearance='solid'\n circular\n className='str-chat__audio_recorder__stop-button'\n data-testid='audio-recorder-stop-button'\n onClick={completeRecording}\n size='sm'\n variant='primary'\n >\n {isUploadingFile ? <LoadingIndicatorIcon /> : <CheckSignIcon />}\n </Button>\n </div>\n );\n};\n","import React, { useMemo } from 'react';\nimport { AudioRecordingPlayback } from './AudioRecordingPlayback';\nimport { AudioRecordingPreview } from './AudioRecordingPreview';\nimport { MediaRecordingState } from '../classes';\nimport { useMessageComposerContext } from '../../../context/MessageComposerContext';\nimport { AudioRecorderRecordingControls } from './AudioRecorderRecordingControls';\nimport { isStopped } from './recordingStateIdentity';\n\nexport const AudioRecorder = () => {\n const {\n recordingController: { recorder, recording, recordingState },\n } = useMessageComposerContext();\n\n const state = useMemo(\n () => ({\n paused: recordingState === MediaRecordingState.PAUSED,\n recording: recordingState === MediaRecordingState.RECORDING,\n stopped: recordingState === MediaRecordingState.STOPPED,\n }),\n [recordingState],\n );\n\n if (!recorder) return null;\n\n return (\n <div className='str-chat__audio_recorder' data-testid={'audio-recorder'}>\n {(isStopped(recordingState) || state.paused) && recording?.asset_url ? (\n <AudioRecordingPlayback\n durationSeconds={recording.duration ?? 0}\n mimeType={recording.mime_type}\n src={recording.asset_url}\n waveformData={recording.waveform_data}\n />\n ) : state.recording ? (\n <AudioRecordingPreview />\n ) : null}\n\n <AudioRecorderRecordingControls />\n </div>\n );\n};\n","import { RecordingAttachmentType, RecordingPermission } from '../classes';\nimport { RecordingPermissionDeniedNotification as DefaultRecordingPermissionDeniedNotification } from '../RecordingPermissionDeniedNotification';\nimport React, { forwardRef, useRef } from 'react';\nimport { useAttachmentManagerState } from '../../MessageComposer/hooks/useAttachmentManagerState';\nimport { useComponentContext, useMessageComposerContext } from '../../../context';\nimport { Callout, useDialogOnNearestManager } from '../../Dialog';\nimport { Button } from '../../Button';\nimport { IconMicrophone } from '../../Icons';\n\nconst dialogId = 'recording-permission-denied-notification';\n\nexport const AudioRecordingButtonWithNotification = () => {\n const {\n RecordingPermissionDeniedNotification = DefaultRecordingPermissionDeniedNotification,\n StartRecordingAudioButton = DefaultStartRecordingAudioButton,\n } = useComponentContext();\n const { asyncMessagesMultiSendEnabled, recordingController } =\n useMessageComposerContext();\n const { attachments } = useAttachmentManagerState();\n\n const { dialog, dialogManager } = useDialogOnNearestManager({ id: dialogId });\n\n const audioRecordingBtnRef = useRef<HTMLButtonElement | null>(null);\n const isRecording = !!recordingController.recordingState;\n\n return (\n <>\n <StartRecordingAudioButton\n disabled={\n isRecording ||\n (!asyncMessagesMultiSendEnabled &&\n attachments.some((a) => a.type === RecordingAttachmentType.VOICE_RECORDING))\n }\n onClick={() => {\n recordingController.recorder?.start();\n\n const recordingEnabled = !!(\n recordingController.recorder && navigator.mediaDevices\n );\n\n const shouldShowNotification =\n recordingEnabled && recordingController.permissionState === 'denied';\n if (shouldShowNotification) dialog.open();\n }}\n ref={audioRecordingBtnRef}\n />\n <Callout\n className='str-chat__recording-permission-denied-notification'\n dialogManagerId={dialogManager?.id}\n id={dialogId}\n onClose={dialog.close}\n placement={'top-start'}\n referenceElement={audioRecordingBtnRef.current}\n >\n <RecordingPermissionDeniedNotification permissionName={RecordingPermission.MIC} />\n </Callout>\n </>\n );\n};\n\nexport type StartRecordingAudioButtonProps = React.ComponentProps<'button'>;\n\nexport const DefaultStartRecordingAudioButton = forwardRef<\n HTMLButtonElement,\n StartRecordingAudioButtonProps\n>(function StartRecordingAudioButton(props, ref) {\n return (\n <Button\n appearance='ghost'\n aria-label='Start recording audio'\n circular\n className='str-chat__start-recording-audio-button'\n data-testid='start-recording-audio-button'\n size='sm'\n variant='secondary'\n {...props}\n ref={ref}\n >\n <IconMicrophone />\n </Button>\n );\n});\n","import React from 'react';\nimport { QuotedMessagePreviewUI } from './QuotedMessagePreview';\nimport type { LocalMessage } from 'stream-chat';\n\nexport type EditedMessagePreviewProps = {\n message: LocalMessage;\n onCancel: () => void;\n};\n\nexport const EditedMessagePreview = ({\n message,\n onCancel,\n}: EditedMessagePreviewProps) => (\n <QuotedMessagePreviewUI onRemove={onCancel} quotedMessage={message} />\n);\n","import clsx from 'clsx';\nimport React from 'react';\nimport { useMessageComposerController } from './hooks';\nimport { IconCheckmark2 } from '../Icons';\nimport type { MessageComposerState } from 'stream-chat';\nimport { useStateStore } from '../../store';\nimport { useTranslationContext } from '../../context';\n\nconst stateSelector = (state: MessageComposerState) => ({\n showReplyInChannel: state.showReplyInChannel,\n});\n\nexport const SendToChannelCheckbox = () => {\n const { t } = useTranslationContext();\n const messageComposer = useMessageComposerController();\n const { showReplyInChannel } = useStateStore(messageComposer.state, stateSelector);\n\n if (messageComposer.editedMessage || !messageComposer.threadId) return null;\n\n const labelText =\n Object.keys(messageComposer.channel.state.members).length === 2\n ? t('Also send as a direct message')\n : t('Also send in channel');\n\n return (\n <div\n className={clsx('str-chat__send-to-channel-checkbox__container', {\n 'str-chat__send-to-channel-checkbox__container--checked': showReplyInChannel,\n })}\n data-testid='send-to-channel-checkbox'\n >\n <label\n className='str-chat__send-to-channel-checkbox__field'\n htmlFor='send-to-channel-checkbox'\n >\n <input\n aria-checked={showReplyInChannel}\n checked={showReplyInChannel}\n className='str-chat__send-to-channel-checkbox__input'\n id='send-to-channel-checkbox'\n onChange={() => messageComposer.toggleShowReplyInChannel()}\n type='checkbox'\n />\n <span aria-hidden className='str-chat__send-to-channel-checkbox__visual'>\n <span className='str-chat__send-to-channel-checkbox__checkmark'>\n <IconCheckmark2 />\n </span>\n </span>\n <span className='str-chat__send-to-channel-checkbox__label'>{labelText}</span>\n </label>\n </div>\n );\n};\n","import type { ComponentProps, PropsWithChildren } from 'react';\nimport React from 'react';\nimport type { CommandResponse } from 'stream-chat';\nimport { CommandContextMenuItem } from '../../MessageComposer/AttachmentSelector/CommandsMenu';\n\nexport type CommandItemProps = {\n entity: CommandResponse;\n focused?: boolean;\n} & ComponentProps<'button'>;\n\nexport const CommandItem = (props: PropsWithChildren<CommandItemProps>) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { entity, focused: _, ...buttonProps } = props;\n\n if (!entity.name) return null;\n\n return (\n <CommandContextMenuItem\n {...buttonProps}\n command={entity as CommandResponse & { name: string }}\n />\n );\n};\n","import clsx from 'clsx';\nimport type { ComponentProps } from 'react';\nimport React from 'react';\nimport { EmojiContextMenuButton } from '../../Dialog';\n\nexport type EmoticonItemProps = {\n entity: {\n /** Name for emoticon */\n name: string;\n /** Native value or actual emoticon */\n native: string;\n /** The parts of the Name property of the entity (or id if no name) that can be matched to the user input value.\n * Default is bold for matches, but can be overwritten in css.\n * */\n tokenizedDisplayName: { token: string; parts: string[] };\n };\n focused?: boolean;\n} & ComponentProps<'button'>;\n\nexport const EmoticonItem = (props: EmoticonItemProps) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { className, entity, focused: _, ...buttonProps } = props;\n const hasEntity = Object.keys(entity).length;\n if (!hasEntity) return null;\n\n const { parts, token } = entity.tokenizedDisplayName ?? ({} as EmoticonItemProps);\n\n return (\n <EmojiContextMenuButton\n {...buttonProps}\n className={clsx('str-chat__emoji-item', className)}\n emoji={entity.native}\n >\n {parts?.map((part, i) =>\n part.toLowerCase() === token ? (\n <span className='str-chat__emoji-item--highlight' key={`part-${i}`}>\n {part}\n </span>\n ) : (\n <span className='str-chat__emoji-item--part' key={`part-${i}`}>\n {part}\n </span>\n ),\n ) ?? null}\n </EmojiContextMenuButton>\n );\n};\n","import clsx from 'clsx';\nimport { type ComponentProps, useRef } from 'react';\nimport React, { useCallback, useLayoutEffect } from 'react';\nimport { useMessageComposerController } from '../../MessageComposer/hooks/useMessageComposerController';\nimport type { TextComposerSuggestion } from 'stream-chat';\nimport type { UserItemProps } from './UserItem';\nimport type { CommandItemProps } from './CommandItem';\nimport type { EmoticonItemProps } from './EmoticonItem';\nimport { useMessageComposerContext } from '../../../context';\n\nexport type DefaultSuggestionListItemEntity =\n | UserItemProps['entity']\n | CommandItemProps['entity']\n | EmoticonItemProps['entity'];\n\nexport type SuggestionListItemComponentProps = {\n entity: DefaultSuggestionListItemEntity | unknown;\n focused: boolean;\n} & ComponentProps<'button'>;\n\nexport type SuggestionItemProps = ComponentProps<'button'> & {\n component: React.ComponentType<SuggestionListItemComponentProps>;\n item: TextComposerSuggestion;\n focused: boolean;\n};\n\nexport const SuggestionListItem = ({\n className,\n component: Component,\n focused,\n item,\n onClick,\n onKeyDown,\n onMouseEnter,\n ...restProps\n}: SuggestionItemProps) => {\n const { textComposer } = useMessageComposerController();\n const { textareaRef } = useMessageComposerContext();\n const componentRef = useRef<HTMLButtonElement | null>(null);\n\n const handleSelect = useCallback(() => {\n textComposer.handleSelect(item);\n textareaRef.current?.focus();\n }, [item, textareaRef, textComposer]);\n\n useLayoutEffect(() => {\n if (!focused) return;\n componentRef.current?.scrollIntoView({ behavior: 'instant', block: 'nearest' });\n }, [focused]);\n\n return (\n <Component\n {...restProps}\n className={clsx('str-chat__suggestion-list-item', className, {\n 'str-chat__suggestion-list-item--selected': focused,\n })}\n entity={item}\n focused={focused}\n onClick={(e) => {\n handleSelect();\n onClick?.(e);\n }}\n onKeyDown={(event) => {\n if (event.key === 'Enter') handleSelect();\n onKeyDown?.(event);\n }}\n onMouseEnter={onMouseEnter}\n ref={componentRef}\n />\n );\n};\n","import type { ComponentProps } from 'react';\nimport React from 'react';\nimport clsx from 'clsx';\nimport { UserContextMenuButton } from '../../Dialog';\n\nexport type UserItemProps = {\n /** The user */\n entity: {\n /** The parts of the Name property of the entity (or id if no name) that can be matched to the user input value.\n * Default is bold for matches, but can be overwritten in css.\n * */\n tokenizedDisplayName: { token: string; parts: string[] };\n /** Id of the user */\n id?: string;\n /** Image of the user */\n image?: string;\n /** Name of the user */\n name?: string;\n };\n focused?: boolean;\n} & ComponentProps<'button'>;\n\n/**\n * UI component for mentions rendered in suggestion list\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const UserItem = ({ entity, focused: _, ...buttonProps }: UserItemProps) => {\n const hasEntity = !!Object.keys(entity).length;\n if (!hasEntity) return null;\n\n const { parts, token } = entity.tokenizedDisplayName;\n const renderName = () =>\n parts.map((part, i) => {\n const matches = part.toLowerCase() === token;\n const partWithHTMLSpacesAround = part.replace(/^\\s+|\\s+$/g, '\\u00A0');\n return (\n <span\n className={clsx({\n 'str-chat__emoji-item-part': !matches,\n 'str-chat__suggestion-item-part--match': matches,\n })}\n key={`part-${i}`}\n >\n {partWithHTMLSpacesAround}\n </span>\n );\n });\n\n return (\n <UserContextMenuButton\n {...buttonProps}\n imageUrl={entity.image}\n title={entity.name || entity.id}\n userName={entity.name || entity.id}\n >\n {renderName()}\n </UserContextMenuButton>\n );\n};\n","const CARET_MIRROR_CLASS = 'str-chat__textarea-caret-mirror';\nconst CARET_MARKER_CLASS = 'str-chat__textarea-caret-marker';\n\nexport type TextareaCaretRect = DOMRect | null;\n\n/**\n * Returns the caret rectangle for a textarea using a mirror-measure hack.\n * It clones computed styles and content into a hidden element to infer the\n * caret position because textarea doesn't expose caret geometry.\n */\n\nexport const getTextareaCaretRect = (\n textarea: HTMLTextAreaElement | null,\n selectionEnd?: number,\n): TextareaCaretRect => {\n if (!textarea || typeof window === 'undefined') return null;\n\n const caretIndex = Math.max(0, selectionEnd ?? textarea.selectionEnd ?? 0);\n const value = textarea.value ?? '';\n const valueBeforeCaret = value.slice(0, caretIndex);\n const valueAfterCaret = value.slice(caretIndex);\n\n const computedStyle = window.getComputedStyle(textarea);\n const mirror = document.createElement('div');\n mirror.className = CARET_MIRROR_CLASS;\n mirror.style.position = 'absolute';\n mirror.style.visibility = 'hidden';\n mirror.style.top = '0';\n mirror.style.left = '-9999px';\n mirror.style.whiteSpace = 'pre-wrap';\n mirror.style.wordWrap = 'break-word';\n\n for (const property of computedStyle) {\n mirror.style.setProperty(property, computedStyle.getPropertyValue(property));\n }\n\n mirror.textContent = valueBeforeCaret;\n\n const caretMarker = document.createElement('span');\n caretMarker.className = CARET_MARKER_CLASS;\n caretMarker.textContent = valueAfterCaret.length ? valueAfterCaret : '.';\n mirror.appendChild(caretMarker);\n\n document.body.appendChild(mirror);\n mirror.scrollTop = textarea.scrollTop;\n mirror.scrollLeft = textarea.scrollLeft;\n\n const textareaRect = textarea.getBoundingClientRect();\n const mirrorRect = mirror.getBoundingClientRect();\n const caretRect = caretMarker.getBoundingClientRect();\n\n document.body.removeChild(mirror);\n\n const left = textareaRect.left + (caretRect.left - mirrorRect.left);\n const top = textareaRect.top + (caretRect.top - mirrorRect.top);\n const height = caretRect.height || parseFloat(computedStyle.lineHeight) || 0;\n\n return new DOMRect(left, top, 0, height);\n};\n","import clsx from 'clsx';\nimport React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { VirtualElement } from '@floating-ui/react';\nimport type { CommandItemProps } from './CommandItem';\nimport { CommandItem } from './CommandItem';\nimport type { EmoticonItemProps } from './EmoticonItem';\nimport { EmoticonItem } from './EmoticonItem';\nimport type { SuggestionListItemComponentProps } from './SuggestionListItem';\nimport { SuggestionListItem as DefaultSuggestionListItem } from './SuggestionListItem';\nimport type { UserItemProps } from './UserItem';\nimport { UserItem } from './UserItem';\nimport { useComponentContext } from '../../../context/ComponentContext';\nimport { useMessageComposerContext } from '../../../context/MessageComposerContext';\nimport { useStateStore } from '../../../store';\nimport { getTextareaCaretRect } from '../../../utils/getTextareaCaretRect';\nimport type { ContextMenuItemComponent, ContextMenuItemProps } from '../../Dialog';\nimport { ContextMenu } from '../../Dialog';\nimport { usePopoverPosition } from '../../Dialog/hooks/usePopoverPosition';\nimport { InfiniteScrollPaginator } from '../../InfiniteScrollPaginator/InfiniteScrollPaginator';\nimport { useMessageComposerController } from '../../MessageComposer/hooks/useMessageComposerController';\nimport type {\n SearchSourceState,\n TextComposerState,\n TextComposerSuggestion,\n} from 'stream-chat';\nimport {\n CommandsMenuClassName,\n CommandsMenuHeader,\n} from '../../MessageComposer/AttachmentSelector/CommandsMenu';\n\ntype SuggestionTrigger = '/' | ':' | '@' | string;\n\nexport type SuggestionListProps = Partial<{\n suggestionItemComponents: Record<\n SuggestionTrigger,\n React.ComponentType<SuggestionListItemComponentProps>\n >;\n className?: string;\n closeOnClickOutside?: boolean;\n containerClassName?: string;\n focusedItemIndex: number;\n setFocusedItemIndex: (index: number) => void;\n}>;\n\nconst textComposerStateSelector = ({ selection, suggestions }: TextComposerState) => ({\n selection,\n suggestions,\n});\n\nconst searchSourceStateSelector = (\n nextValue: SearchSourceState<TextComposerSuggestion>,\n): { items: TextComposerSuggestion[] } => ({\n items: nextValue.items ?? [],\n});\n\nexport const defaultComponents: Record<\n SuggestionTrigger,\n React.ComponentType<SuggestionListItemComponentProps>\n> = {\n '/': (props: SuggestionListItemComponentProps) => (\n <CommandItem {...props} entity={props.entity as CommandItemProps['entity']} />\n ),\n ':': (props: SuggestionListItemComponentProps) => (\n <EmoticonItem {...props} entity={props.entity as EmoticonItemProps['entity']} />\n ),\n '@': (props: SuggestionListItemComponentProps) => (\n <UserItem {...props} entity={props.entity as UserItemProps['entity']} />\n ),\n} as const;\n\nexport const SuggestionList = ({\n className,\n closeOnClickOutside = true,\n containerClassName,\n focusedItemIndex,\n setFocusedItemIndex,\n suggestionItemComponents = defaultComponents,\n}: SuggestionListProps) => {\n const { AutocompleteSuggestionItem = DefaultSuggestionListItem } =\n useComponentContext();\n const { textareaRef } = useMessageComposerContext();\n const messageComposer = useMessageComposerController();\n const { textComposer } = messageComposer;\n const { selection, suggestions } = useStateStore(\n textComposer.state,\n textComposerStateSelector,\n );\n const { items } =\n useStateStore(suggestions?.searchSource.state, searchSourceStateSelector) ?? {};\n\n const [container, setContainer] = useState<HTMLDivElement | null>(null);\n const caretRectRef = useRef<DOMRect | null>(null);\n const virtualCaretReference = useMemo<VirtualElement>(\n () => ({\n getBoundingClientRect: () => caretRectRef.current ?? new DOMRect(),\n }),\n [],\n );\n\n const { refs, strategy, update, x, y } = usePopoverPosition({\n allowFlip: false,\n offset: 8,\n placement: 'top-start',\n // For top placements, the cross-axis is X; we need this to allow flipping the list to the right when it overflows the right edge.\n shiftOptions: { crossAxis: true },\n });\n\n const component = suggestions?.trigger\n ? suggestionItemComponents[suggestions?.trigger]\n : undefined;\n\n const contextMenuItems = useMemo<ContextMenuItemComponent[]>(() => {\n if (!component) return [];\n const sortedItems =\n suggestions?.searchSource.type === 'commands'\n ? [...(items ?? [])].sort((a, b) =>\n String((a as { name?: string }).name ?? '').localeCompare(\n String((b as { name?: string }).name ?? ''),\n ),\n )\n : (items ?? []);\n return sortedItems.map((item, i) => {\n const Item: ContextMenuItemComponent = ({ ...props }: ContextMenuItemProps) => (\n <AutocompleteSuggestionItem\n {...props}\n component={component}\n focused={focusedItemIndex === i}\n item={item}\n key={item.id.toString()}\n onMouseEnter={() => setFocusedItemIndex?.(i)}\n />\n );\n return Item;\n });\n }, [\n items,\n component,\n focusedItemIndex,\n setFocusedItemIndex,\n AutocompleteSuggestionItem,\n suggestions?.searchSource.type,\n ]);\n\n const ItemsWrapper = useCallback(\n ({ children }: React.ComponentProps<'div'>) => (\n <InfiniteScrollPaginator\n loadNextOnScrollToBottom={suggestions?.searchSource.search}\n threshold={100}\n >\n {children}\n </InfiniteScrollPaginator>\n ),\n [suggestions?.searchSource.search],\n );\n\n useEffect(() => {\n if (!closeOnClickOutside || !suggestions || !container) return;\n const handleClick = (event: MouseEvent) => {\n if (container.contains(event.target as Node)) return;\n textComposer.closeSuggestions();\n };\n document.addEventListener('click', handleClick);\n return () => {\n document.removeEventListener('click', handleClick);\n };\n }, [closeOnClickOutside, suggestions, container, textComposer]);\n\n useEffect(() => {\n refs.setFloating(container);\n }, [container, refs]);\n\n useLayoutEffect(() => {\n if (!suggestions || !update) return;\n const updatePosition = () => {\n const rect = getTextareaCaretRect(textareaRef.current ?? null, selection?.end);\n if (!rect) {\n caretRectRef.current = null;\n refs.setReference(null);\n return;\n }\n caretRectRef.current = rect;\n virtualCaretReference.contextElement = textareaRef.current ?? undefined;\n refs.setReference(virtualCaretReference);\n update();\n };\n\n updatePosition();\n }, [\n container,\n items?.length,\n refs,\n selection?.end,\n suggestions,\n textareaRef,\n update,\n virtualCaretReference,\n ]);\n\n if (!suggestions || !items?.length || !component) return null;\n\n return (\n <div\n className={clsx('str-chat__suggestion-list-container', containerClassName)}\n ref={setContainer}\n style={{\n left: x ?? 0,\n position: strategy,\n top: y ?? 0,\n visibility: x == null || y == null ? 'hidden' : undefined,\n zIndex: 1000,\n }}\n >\n <ContextMenu\n className={clsx('str-chat__suggestion-list', className)}\n Header={\n suggestions.searchSource.type === 'commands' ? CommandsMenuHeader : undefined\n }\n items={contextMenuItems}\n ItemsWrapper={ItemsWrapper}\n menuClassName={\n suggestions.searchSource.type === 'commands' ? CommandsMenuClassName : undefined\n }\n />\n </div>\n );\n};\n","import { useMemo } from 'react';\nimport type { TextComposerState } from 'stream-chat';\nimport { useMessageComposerContext, useTranslationContext } from '../../../context';\nimport { useStateStore } from '../../../store';\nimport { useCooldownRemaining } from '../../MessageComposer/hooks/useCooldownRemaining';\nimport { useMessageComposerController } from '../../MessageComposer/hooks/useMessageComposerController';\n\ntype UseTextareaPlaceholderProps = {\n placeholder?: string;\n};\n\nconst textComposerStateSelector = ({ command }: TextComposerState) => ({ command });\n\nexport const useTextareaPlaceholder = ({\n placeholder,\n}: UseTextareaPlaceholderProps = {}) => {\n const { t } = useTranslationContext();\n const { additionalTextareaProps } = useMessageComposerContext();\n const cooldownRemaining = useCooldownRemaining();\n const messageComposer = useMessageComposerController();\n const { command } = useStateStore(\n messageComposer.textComposer.state,\n textComposerStateSelector,\n );\n\n const knownArgsTranslations = useMemo<Record<string, string>>(\n () => ({\n ban: t('ban-command-args'),\n giphy: t('giphy-command-args'),\n mute: t('mute-command-args'),\n unban: t('unban-command-args'),\n unmute: t('unmute-command-args'),\n }),\n [t],\n );\n\n const commandArgs =\n command?.args && (knownArgsTranslations[command.name ?? ''] ?? t(command.args));\n const commandPlaceholder =\n command?.name === 'giphy' ? t('Search GIFs') : (commandArgs ?? undefined);\n\n const defaultPlaceholder =\n placeholder ?? additionalTextareaProps?.placeholder ?? t('Type your message');\n\n if (cooldownRemaining) {\n return t('Slow mode, wait {{ seconds }}s...', { seconds: cooldownRemaining });\n }\n\n return commandPlaceholder ?? defaultPlaceholder;\n};\n","import clsx from 'clsx';\nimport React, {\n type ChangeEventHandler,\n type SyntheticEvent,\n type TextareaHTMLAttributes,\n type UIEventHandler,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport Textarea from 'react-textarea-autosize';\nimport { useCooldownRemaining } from '../MessageComposer/hooks/useCooldownRemaining';\nimport { useMessageComposerController } from '../MessageComposer/hooks/useMessageComposerController';\nimport type {\n AttachmentManagerState,\n MessageComposerConfig,\n MessageComposerState,\n SearchSourceState,\n TextComposerState,\n} from 'stream-chat';\nimport { useComponentContext, useMessageComposerContext } from '../../context';\nimport { useStateStore } from '../../store';\nimport { SuggestionList as DefaultSuggestionList } from './SuggestionList';\nimport { useTextareaPlaceholder } from './hooks/useTextareaPlaceholder';\n\nconst textComposerStateSelector = (state: TextComposerState) => ({\n selection: state.selection,\n suggestions: state.suggestions,\n text: state.text,\n});\n\nconst searchSourceStateSelector = (state: SearchSourceState) => ({\n isLoadingItems: state.isLoading,\n items: state.items,\n});\n\nconst configStateSelector = (state: MessageComposerConfig) => ({\n enabled: state.text.enabled,\n});\n\nconst messageComposerStateSelector = (state: MessageComposerState) => ({\n quotedMessage: state.quotedMessage,\n});\n\nconst attachmentManagerStateSelector = (state: AttachmentManagerState) => ({\n attachments: state.attachments,\n});\n\n/**\n * isComposing prevents double submissions in Korean and other languages.\n * starting point for a read:\n * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/isComposing\n * In the long term, the fix should happen by handling keypress, but changing this has unknown implications.\n */\nconst defaultShouldSubmit = (event: React.KeyboardEvent<HTMLTextAreaElement>) =>\n event.key === 'Enter' && !event.shiftKey && !event.nativeEvent.isComposing;\n\nexport type TextareaComposerProps = Omit<\n TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'style' | 'defaultValue' | 'disabled' | 'value'\n> & {\n closeSuggestionsOnClickOutside?: boolean;\n containerClassName?: string;\n listClassName?: string;\n maxRows?: number;\n minRows?: number;\n shouldSubmit?: (event: React.KeyboardEvent<HTMLTextAreaElement>) => boolean;\n};\n\nexport const TextareaComposer = ({\n className,\n closeSuggestionsOnClickOutside,\n containerClassName,\n listClassName,\n maxRows: maxRowsProp,\n minRows: minRowsProp,\n onBlur,\n onChange,\n onKeyDown,\n onScroll,\n onSelect,\n placeholder: placeholderProp,\n shouldSubmit: shouldSubmitProp,\n ...restTextareaProps\n}: TextareaComposerProps) => {\n const { AutocompleteSuggestionList = DefaultSuggestionList } = useComponentContext();\n const {\n additionalTextareaProps,\n focus,\n handleSubmit,\n maxRows: maxRowsContext,\n minRows: minRowsContext,\n onPaste,\n shouldSubmit: shouldSubmitContext,\n textareaRef,\n } = useMessageComposerContext();\n const cooldownRemaining = useCooldownRemaining();\n\n const placeholder = useTextareaPlaceholder({ placeholder: placeholderProp });\n\n const maxRows = maxRowsProp ?? maxRowsContext ?? 10;\n const minRows = minRowsProp ?? minRowsContext;\n\n const shouldSubmit = shouldSubmitProp ?? shouldSubmitContext ?? defaultShouldSubmit;\n\n const messageComposer = useMessageComposerController();\n const { textComposer } = messageComposer;\n const { selection, suggestions, text } = useStateStore(\n textComposer.state,\n textComposerStateSelector,\n );\n // react-textarea-autosize can measure placeholder content as multi-line in narrow layouts,\n // producing an inflated initial height (e.g. 2 rows) before the user types.\n // Clamp to a single row only while empty unless the integrator explicitly set minRows.\n const autosizeRows = !text && minRows == null ? 1 : undefined;\n const textareaStyle = text\n ? undefined\n : ({\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } satisfies React.CSSProperties);\n\n const { enabled } = useStateStore(messageComposer.configState, configStateSelector);\n const { quotedMessage } = useStateStore(\n messageComposer.state,\n messageComposerStateSelector,\n );\n const { attachments } = useStateStore(\n messageComposer.attachmentManager.state,\n attachmentManagerStateSelector,\n );\n\n const { isLoadingItems } =\n useStateStore(suggestions?.searchSource.state, searchSourceStateSelector) ?? {};\n\n const containerRef = useRef<HTMLDivElement>(null);\n const [focusedItemIndex, setFocusedItemIndex] = useState(0);\n\n const [isComposing, setIsComposing] = useState(false);\n\n const changeHandler: ChangeEventHandler<HTMLTextAreaElement> = useCallback(\n (e) => {\n if (onChange) {\n onChange(e);\n return;\n }\n if (!textareaRef.current) return;\n textComposer.handleChange({\n selection: {\n end: textareaRef.current.selectionEnd,\n start: textareaRef.current.selectionStart,\n },\n text: e.target.value,\n });\n },\n [onChange, textComposer, textareaRef],\n );\n\n const onCompositionEnd = useCallback(() => {\n setIsComposing(false);\n }, []);\n\n const onCompositionStart = useCallback(() => {\n setIsComposing(true);\n }, []);\n\n const keyDownHandler = useCallback(\n (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (onKeyDown) {\n onKeyDown(event);\n return;\n }\n\n if (\n textComposer.suggestions &&\n textComposer.suggestions.searchSource.items?.length\n ) {\n if (event.key === 'Escape') return textComposer.closeSuggestions();\n const loadedItems = textComposer.suggestions.searchSource.items;\n if (event.key === 'Enter') {\n event.preventDefault();\n textComposer.handleSelect(loadedItems[focusedItemIndex]);\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setFocusedItemIndex((prev) => {\n let nextIndex = prev - 1;\n if (suggestions?.searchSource.hasNext) {\n nextIndex = prev;\n } else if (nextIndex < 0) {\n nextIndex = loadedItems.length - 1;\n }\n return nextIndex;\n });\n }\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setFocusedItemIndex((prev) => {\n let nextIndex = prev + 1;\n if (suggestions?.searchSource.hasNext) {\n nextIndex = prev;\n } else if (nextIndex >= loadedItems.length) {\n nextIndex = 0;\n }\n\n return nextIndex;\n });\n }\n } else if (\n shouldSubmit(event) &&\n textareaRef.current &&\n messageComposer.hasSendableData\n ) {\n if (event.key === 'Enter') {\n // prevent adding newline when submitting a message with\n event.preventDefault();\n }\n handleSubmit();\n }\n },\n [\n focusedItemIndex,\n handleSubmit,\n messageComposer,\n onKeyDown,\n shouldSubmit,\n suggestions,\n textComposer,\n textareaRef,\n ],\n );\n\n const scrollHandler: UIEventHandler<HTMLTextAreaElement> = useCallback(\n (event) => {\n if (onScroll) {\n onScroll(event);\n } else {\n textComposer.closeSuggestions();\n }\n },\n [onScroll, textComposer],\n );\n\n const setSelection = useCallback(\n (e: SyntheticEvent<HTMLTextAreaElement>) => {\n onSelect?.(e);\n textComposer.setSelection({\n end: (e.target as HTMLTextAreaElement).selectionEnd,\n start: (e.target as HTMLTextAreaElement).selectionStart,\n });\n },\n [onSelect, textComposer],\n );\n\n useEffect(() => {\n if (textComposer.suggestions) {\n setFocusedItemIndex(0);\n }\n }, [textComposer.suggestions]);\n\n useEffect(() => {\n const textareaIsFocused = textareaRef.current?.matches(':focus');\n if (!textareaRef.current || textareaIsFocused || !focus) return;\n textareaRef.current.focus();\n }, [attachments, focus, quotedMessage, textareaRef]);\n\n useEffect(\n () => () => {\n messageComposer.clear();\n },\n [messageComposer],\n );\n\n useLayoutEffect(() => {\n /**\n * It is important to perform set text and after that the range\n * to prevent cursor reset to the end of the textarea if doing it in separate effects.\n */\n const textarea = textareaRef.current;\n if (!textarea || isComposing) return;\n\n /**\n * The textarea value has to be overridden outside the render cycle so that the events like compositionend can be triggered.\n * If we have overridden the value during the component rendering, the compositionend event would not be triggered, and\n * it would not be possible to type composed characters (ô).\n * On the other hand, just removing the value override via prop (value={text}) would not allow us to change the text based on\n * middleware results (e.g. replace characters with emojis)\n */\n if (textarea.value !== text) {\n textarea.value = text;\n }\n\n const length = textarea.value.length;\n const start = Math.max(0, Math.min(selection.start, length));\n const end = Math.max(start, Math.min(selection.end, length));\n\n if (textarea.selectionStart === start && textarea.selectionEnd === end) return;\n\n textarea.setSelectionRange(start, end, 'forward');\n }, [text, selection.start, selection.end, isComposing, textareaRef]);\n\n return (\n <div\n className={clsx('rta', 'str-chat__textarea', containerClassName, {\n ['rta--loading']: isLoadingItems,\n })}\n ref={containerRef}\n >\n <Textarea\n {...{ ...additionalTextareaProps, ...restTextareaProps }}\n aria-label={placeholder}\n className={clsx(\n 'rta__textarea',\n 'str-chat__textarea__textarea str-chat__message-textarea',\n className,\n )}\n data-testid='message-input'\n disabled={!enabled || !!cooldownRemaining}\n maxRows={autosizeRows ?? maxRows}\n minRows={autosizeRows ?? minRows}\n onBlur={onBlur}\n onChange={changeHandler}\n onCompositionEnd={onCompositionEnd}\n onCompositionStart={onCompositionStart}\n onKeyDown={keyDownHandler}\n onPaste={onPaste}\n onScroll={scrollHandler}\n onSelect={setSelection}\n placeholder={placeholder}\n ref={(ref) => {\n textareaRef.current = ref;\n }}\n style={textareaStyle}\n />\n {/* todo: X document the layout change for the accessibility purpose (tabIndex) */}\n {!isComposing && (\n <AutocompleteSuggestionList\n className={listClassName}\n closeOnClickOutside={closeSuggestionsOnClickOutside}\n focusedItemIndex={focusedItemIndex}\n setFocusedItemIndex={setFocusedItemIndex}\n />\n )}\n </div>\n );\n};\n","import type { CSSProperties, ElementType, PropsWithChildren } from 'react';\nimport React, { useCallback, useContext, useEffect, useMemo, useRef } from 'react';\nimport { useDropzone } from 'react-dropzone';\nimport clsx from 'clsx';\nimport type { MessageComposerConfig } from 'stream-chat';\n\nimport { useMessageComposerContext, useTranslationContext } from '../../context';\nimport { useAttachmentManagerState, useMessageComposerController } from './hooks';\nimport { useStateStore } from '../../store';\nimport { useIsCooldownActive } from './hooks/useIsCooldownActive';\nimport { IconFileArrowLeftIn } from '../Icons';\n\nconst DragAndDropUploadContext = React.createContext<{\n subscribeToDrop: ((fn: (files: File[]) => void) => () => void) | null;\n}>({\n subscribeToDrop: null,\n});\n\nexport const useDragAndDropUploadContext = () => useContext(DragAndDropUploadContext);\n\n/**\n * @private This hook should be used only once directly in the `MessageComposerProvider` to\n * register `uploadNewFiles` functions of the rendered message composers. Each `MessageComposer`\n * will then be notified when the drop event occurs from within the `WithDragAndDropUpload`\n * component.\n */\nexport const useRegisterDropHandlers = () => {\n const { subscribeToDrop } = useDragAndDropUploadContext();\n\n const messageComposer = useMessageComposerController();\n\n useEffect(() => {\n const unsubscribe = subscribeToDrop?.(messageComposer.attachmentManager.uploadFiles);\n\n return unsubscribe;\n }, [subscribeToDrop, messageComposer]);\n};\n\nconst attachmentManagerConfigStateSelector = (state: MessageComposerConfig) => ({\n acceptedFiles: state.attachments.acceptedFiles,\n multipleUploads: state.attachments.maxNumberOfFilesPerMessage > 1,\n});\n\n/**\n * Wrapper to replace now deprecated `Channel.dragAndDropWindow` option.\n *\n * @example\n * ```tsx\n * <Channel>\n * <WithDragAndDropUpload component=\"section\" className=\"message-list-dnd-wrapper\">\n * <Window>\n * <MessageList />\n * <MessageComposer />\n * </Window>\n * </WithDragAndDropUpload>\n * <Thread />\n * <Channel>\n * ```\n */\nexport const WithDragAndDropUpload = ({\n children,\n className,\n component: Component = 'div',\n style,\n}: PropsWithChildren<{\n acceptedFiles?: string[];\n /**\n * @description An element to render as a wrapper onto which drag & drop functionality will be applied.\n * @default 'div'\n */\n component?: ElementType;\n className?: string;\n style?: CSSProperties;\n}>) => {\n const dropHandlersRef = useRef<Set<(f: File[]) => void>>(new Set());\n const messageComposerContext = useMessageComposerContext();\n const dragAndDropUploadContext = useDragAndDropUploadContext();\n const messageComposer = useMessageComposerController();\n const { isUploadEnabled } = useAttachmentManagerState();\n const { acceptedFiles, multipleUploads } = useStateStore(\n messageComposer.configState,\n attachmentManagerConfigStateSelector,\n );\n\n const isCooldownActive = useIsCooldownActive();\n // if message composer context is available, there's no need to use the queue\n const isWithinMessageComposerContext = Object.keys(messageComposerContext).length > 0;\n\n const accept = useMemo(\n () =>\n acceptedFiles.reduce<Record<string, Array<string>>>((mediaTypeMap, mediaType) => {\n mediaTypeMap[mediaType] ??= [];\n return mediaTypeMap;\n }, {}),\n [acceptedFiles],\n );\n\n const subscribeToDrop = useCallback((fn: (files: File[]) => void) => {\n dropHandlersRef.current.add(fn);\n\n return () => {\n dropHandlersRef.current.delete(fn);\n };\n }, []);\n\n const handleDrop = useCallback((files: File[]) => {\n dropHandlersRef.current.forEach((fn) => fn(files));\n }, []);\n\n const {\n getRootProps,\n isDragActive,\n isDragReject: isDragRejected,\n } = useDropzone({\n accept,\n // apply `disabled` rules if available, otherwise allow anything and\n // let the `uploadNewFiles` handle the limitations internally\n disabled: isWithinMessageComposerContext\n ? !isUploadEnabled || isCooldownActive\n : false,\n multiple: multipleUploads,\n noClick: true,\n onDrop: isWithinMessageComposerContext\n ? messageComposer.attachmentManager.uploadFiles\n : handleDrop,\n });\n\n // nested WithDragAndDropUpload components render wrappers without functionality\n // (MessageComposerUI has a default WithDragAndDropUpload)\n if (dragAndDropUploadContext.subscribeToDrop !== null) {\n return <Component className={className}>{children}</Component>;\n }\n\n const rootClassName = clsx('str-chat__dropzone-root', className);\n\n return (\n <DragAndDropUploadContext.Provider value={{ subscribeToDrop }}>\n <Component {...getRootProps({ className: rootClassName, style })}>\n {isDragActive && (\n <div\n className={clsx('str-chat__dropzone-container', {\n 'str-chat__dropzone-container--not-accepted': isDragRejected,\n })}\n role='presentation'\n >\n <FileDragAndDropContent isDragRejected={isDragRejected} />\n </div>\n )}\n {children}\n </Component>\n </DragAndDropUploadContext.Provider>\n );\n};\n\nexport type FileDragAndDropContentProps = {\n isDragRejected: boolean;\n};\n\nexport const FileDragAndDropContent = ({\n isDragRejected,\n}: FileDragAndDropContentProps) => {\n const { t } = useTranslationContext();\n return (\n <div className='str-chat__dropzone-container__content'>\n {isDragRejected ? (\n <p>{t('Some of the files will not be accepted')}</p>\n ) : (\n <>\n <IconFileArrowLeftIn />\n <p>{t('Drag your files here')}</p>\n </>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { useTranslationContext } from '../../context';\n\nexport type StopAIGenerationButtonProps = React.ComponentProps<'button'>;\n\nexport const StopAIGenerationButton = ({\n onClick,\n ...restProps\n}: StopAIGenerationButtonProps) => {\n const { t } = useTranslationContext();\n return (\n <button\n aria-label={t('aria/Stop AI Generation')}\n className='str-chat__stop-ai-generation-button'\n data-testid='stop-ai-generation-button'\n onClick={onClick}\n {...restProps}\n />\n );\n};\n","import React from 'react';\nimport { useMessageComposerHasSendableData } from './hooks';\nimport { useTranslationContext } from '../../context';\nimport { IconPaperPlane } from '../Icons';\nimport { Button } from '../Button';\n\nexport type SendButtonProps = {\n sendMessage: (event: React.BaseSyntheticEvent) => void;\n} & React.ComponentProps<'button'>;\n\nexport const SendButton = ({ children, sendMessage, ...rest }: SendButtonProps) => {\n const { t } = useTranslationContext();\n const hasSendableData = useMessageComposerHasSendableData();\n return (\n <Button\n appearance='solid'\n aria-label={t('aria/Send')}\n circular\n className='str-chat__send-button'\n data-testid='send-button'\n disabled={!hasSendableData}\n onClick={sendMessage}\n size='sm'\n variant='primary'\n {...rest}\n >\n {children ?? <IconPaperPlane />}\n </Button>\n );\n};\n","import React, { useCallback } from 'react';\nimport { StopAIGenerationButton as DefaultStopAIGenerationButton } from './StopAIGenerationButton';\nimport { CooldownTimer as DefaultCooldownTimer } from './CooldownTimer';\nimport { SendButton as DefaultSendButton } from './SendButton';\nimport {\n useChannelStateContext,\n useComponentContext,\n useMessageComposerContext,\n} from '../../context';\nimport { AIStates, useAIState } from '../AIStateIndicator';\nimport { useMessageComposerController, useMessageContentIsEmpty } from './hooks';\nimport { AudioRecordingButtonWithNotification } from '../MediaRecorder/AudioRecorder/AudioRecordingButtonWithNotification';\nimport { useIsCooldownActive } from './hooks/useIsCooldownActive';\nimport type { MessageComposerState, TextComposerState } from 'stream-chat';\nimport { useStateStore } from '../../store';\nimport { IconCheckmark2, IconPaperPlane } from '../Icons';\n\nconst messageComposerStateSelector = ({ editedMessage }: MessageComposerState) => ({\n editedMessage,\n});\n\nconst textComposerStateSelector = ({ command, text }: TextComposerState) => ({\n command,\n text,\n});\n\nexport const MessageComposerActions = () => {\n const { channel } = useChannelStateContext();\n const { hideSendButton } = useMessageComposerContext();\n const messageComposer = useMessageComposerController();\n const {\n CooldownTimer = DefaultCooldownTimer,\n SendButton,\n StopAIGenerationButton: StopAIGenerationButtonOverride,\n } = useComponentContext();\n\n const { editedMessage } = useStateStore(\n messageComposer.state,\n messageComposerStateSelector,\n );\n\n const { command } = useStateStore(\n messageComposer.textComposer.state,\n textComposerStateSelector,\n );\n\n const contentIsEmpty = useMessageContentIsEmpty();\n /**\n * This bit here is needed to make sure that we can get rid of the default behaviour\n * if need be. Essentially, this allows us to pass StopAIGenerationButton={null} and\n * completely circumvent the default logic if it's not what we want. We need it as a\n * prop because there is no other trivial way to override the SendMessage button otherwise.\n */\n const StopAIGenerationButton =\n StopAIGenerationButtonOverride === undefined\n ? DefaultStopAIGenerationButton\n : StopAIGenerationButtonOverride;\n\n const { handleSubmit, recordingController } = useMessageComposerContext();\n const isCooldownActive = useIsCooldownActive();\n\n const { aiState } = useAIState(channel);\n const stopGenerating = useCallback(() => channel?.stopAIResponse(), [channel]);\n const shouldDisplayStopAIGeneration =\n [AIStates.Thinking, AIStates.Generating].includes(aiState) &&\n !!StopAIGenerationButton;\n\n const recordingEnabled = !!(recordingController.recorder && navigator.mediaDevices); // account for requirement on iOS as per this bug report: https://bugs.webkit.org/show_bug.cgi?id=252303\n\n let content = SendButton ? (\n <SendButton sendMessage={handleSubmit} />\n ) : (\n <DefaultSendButton sendMessage={handleSubmit}>\n {editedMessage || command ? <IconCheckmark2 /> : <IconPaperPlane />}\n </DefaultSendButton>\n );\n\n if (shouldDisplayStopAIGeneration) {\n content = <StopAIGenerationButton onClick={stopGenerating} />;\n } else if (hideSendButton) return null;\n\n if (isCooldownActive) {\n content = <CooldownTimer />;\n } else if (contentIsEmpty && !editedMessage && !command && recordingEnabled) {\n content = <AudioRecordingButtonWithNotification />;\n }\n\n return <div className='str-chat__message-composer__actions'>{content}</div>;\n};\n\nexport const AdditionalMessageComposerActions = () => {\n const { EmojiPicker } = useComponentContext();\n const isCooldownActive = useIsCooldownActive();\n\n return (\n <div className='str-chat__message-composer__additional-actions'>\n {!isCooldownActive && EmojiPicker ? <EmojiPicker /> : null}\n </div>\n );\n};\n","import type { LiveLocationPreview, StaticLocationPreview } from 'stream-chat';\nimport type { ComponentType } from 'react';\nimport React from 'react';\nimport { useTranslationContext } from '../../../context';\nimport { IconMapPin } from '../../Icons';\nimport { RemoveAttachmentPreviewButton } from '../RemoveAttachmentPreviewButton';\n\ntype GeolocationPreviewImageProps = {\n location: StaticLocationPreview | LiveLocationPreview;\n};\n\nconst GeolocationPreviewImage = () => (\n <div className='str-chat__location-preview-image'>\n <IconMapPin />\n </div>\n);\n\nexport type GeolocationPreviewProps = {\n location: StaticLocationPreview | LiveLocationPreview;\n PreviewImage?: ComponentType<GeolocationPreviewImageProps>;\n remove?: () => void;\n};\n\nexport const GeolocationPreview = ({\n location,\n PreviewImage = GeolocationPreviewImage,\n remove,\n}: GeolocationPreviewProps) => {\n const { t } = useTranslationContext();\n const shareDuration = (location as LiveLocationPreview).durationMs;\n const title = shareDuration ? t('Live location') : t('Current location');\n\n return (\n <div className='str-chat__location-preview' data-testid='location-preview'>\n <PreviewImage location={location} />\n <div className='str-chat__location-preview__data'>\n <div\n className='str-chat__location-preview__data__title'\n title={t('Shared location')}\n >\n {title}\n </div>\n <div className='str-chat__location-preview__data__subtitle'>\n {t('Location: {{ coordinates }}', {\n coordinates: `${location.latitude}, ${location.longitude}`,\n })}\n </div>\n {shareDuration && (\n <div className='str-chat__location-preview__data__sharing-duration'>\n {t('Live for {{duration}}', {\n duration: t('duration/Share Location', {\n milliseconds: shareDuration,\n }),\n })}\n </div>\n )}\n </div>\n {remove && (\n <RemoveAttachmentPreviewButton\n aria-label={t('aria/Remove location attachment')}\n className='str-chat__attachment-preview__remove-button'\n data-testid='location-preview-item-delete-button'\n onClick={remove}\n />\n )}\n </div>\n );\n};\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport {\n AttachmentSelector as DefaultAttachmentSelector,\n SimpleAttachmentSelector,\n} from './AttachmentSelector/AttachmentSelector';\nimport {\n AttachmentPreviewList as DefaultAttachmentPreviewList,\n VoiceRecordingPreviewSlot as DefaultVoiceRecordingPreviewSlot,\n} from './AttachmentPreviewList';\nimport { AudioRecorder as DefaultAudioRecorder } from '../MediaRecorder';\nimport { EditedMessagePreview as DefaultEditedMessagePreview } from './EditedMessagePreview';\nimport { QuotedMessagePreview as DefaultQuotedMessagePreview } from './QuotedMessagePreview';\nimport { LinkPreviewList as DefaultLinkPreviewList } from './LinkPreviewList';\nimport { SendToChannelCheckbox as DefaultSendToChannelCheckbox } from './SendToChannelCheckbox';\nimport { TextareaComposer as DefaultTextareaComposer } from '../TextareaComposer';\nimport { useMessageComposerContext as useMessageComposerContext } from '../../context/MessageComposerContext';\nimport { useComponentContext } from '../../context/ComponentContext';\nimport { useMessageContext } from '../../context';\nimport { WithDragAndDropUpload } from './WithDragAndDropUpload';\nimport {\n AdditionalMessageComposerActions as DefaultAdditionalMessageComposerActions,\n MessageComposerActions,\n} from './MessageComposerActions';\nimport { useMessageComposerController } from './hooks';\nimport { useStateStore } from '../../store';\nimport {\n type AttachmentManagerState,\n LinkPreviewsManager,\n type LinkPreviewsManagerState,\n type LocationComposerState,\n type MessageComposerState,\n type TextComposerState,\n} from 'stream-chat';\nimport { CommandChip as DefaultCommandChip } from './CommandChip';\nimport { GeolocationPreview } from './AttachmentPreviewList/GeolocationPreview';\n\nconst messageComposerStateSelector = ({\n editedMessage,\n quotedMessage,\n}: MessageComposerState) => ({\n editedMessage,\n quotedMessage,\n});\n\nconst attachmentManagerStateSelector = (state: AttachmentManagerState) => ({\n attachments: state.attachments,\n});\n\nconst linkPreviewsManagerStateSelector = (state: LinkPreviewsManagerState) => ({\n linkPreviews: Array.from(state.previews.values()).filter(\n (preview) =>\n LinkPreviewsManager.previewIsLoaded(preview) ||\n LinkPreviewsManager.previewIsLoading(preview),\n ),\n});\n\nconst locationComposerStateSelector = (state: LocationComposerState) => ({\n location: state.location,\n});\n\nconst textComposerCommandSelector = ({ command }: TextComposerState) => ({ command });\n\nconst MessageComposerPreviews = () => {\n const {\n AttachmentPreviewList = DefaultAttachmentPreviewList,\n EditedMessagePreview = DefaultEditedMessagePreview,\n LinkPreviewList = DefaultLinkPreviewList,\n QuotedMessagePreview = DefaultQuotedMessagePreview,\n VoiceRecordingPreviewSlot = DefaultVoiceRecordingPreviewSlot,\n } = useComponentContext();\n\n const messageComposer = useMessageComposerController();\n const { editedMessage, quotedMessage } = useStateStore(\n messageComposer.state,\n messageComposerStateSelector,\n );\n\n const { attachments } = useStateStore(\n messageComposer.attachmentManager.state,\n attachmentManagerStateSelector,\n );\n\n const { location } = useStateStore(\n messageComposer.locationComposer.state,\n locationComposerStateSelector,\n );\n\n const { linkPreviewsManager } = messageComposer;\n const { linkPreviews } = useStateStore(\n linkPreviewsManager.state,\n linkPreviewsManagerStateSelector,\n );\n\n if (\n !quotedMessage &&\n attachments.length === 0 &&\n linkPreviews.length === 0 &&\n !location &&\n !editedMessage\n )\n return null;\n\n // todo: pass the entity arrays from here so that the preview lists do not have to subscribe to the composer state changes too?\n return (\n <div className='str-chat__message-composer-previews'>\n {editedMessage ? (\n <div className='str-chat__message-composer-previews'>\n <EditedMessagePreview\n message={editedMessage}\n onCancel={() => {\n messageComposer.clear();\n }}\n />\n </div>\n ) : (\n <QuotedMessagePreview />\n )}\n <VoiceRecordingPreviewSlot />\n <AttachmentPreviewList />\n <LinkPreviewList />\n {location && (\n <GeolocationPreview\n location={location}\n // It is not possible to nullify shared_location field so we do not show a preview when editing\n // to prevent a user from wanting to remove the location\n remove={\n messageComposer.editedMessage\n ? undefined\n : messageComposer.locationComposer.initState\n }\n />\n )}\n </div>\n );\n};\n\nexport const MessageComposerUI = () => {\n const { message } = useMessageContext();\n const { recordingController } = useMessageComposerContext();\n const messageComposerController = useMessageComposerController();\n const { command } = useStateStore(\n messageComposerController.textComposer.state,\n textComposerCommandSelector,\n );\n\n const {\n AdditionalMessageComposerActions = DefaultAdditionalMessageComposerActions,\n AttachmentSelector = message ? SimpleAttachmentSelector : DefaultAttachmentSelector,\n AudioRecorder = DefaultAudioRecorder,\n CommandChip = DefaultCommandChip,\n SendToChannelCheckbox = DefaultSendToChannelCheckbox,\n TextareaComposer = DefaultTextareaComposer,\n } = useComponentContext();\n\n return (\n <WithDragAndDropUpload\n className='str-chat__message-composer-container'\n component='div'\n >\n <div\n className={clsx('str-chat__message-composer', {\n 'str-chat__message-composer--command-active': !!command,\n })}\n >\n {recordingController.recordingState ? (\n <AudioRecorder />\n ) : (\n <>\n <AttachmentSelector />\n <div className='str-chat__message-composer-compose-area'>\n <MessageComposerPreviews />\n <div className='str-chat__message-composer-controls'>\n <div className='str-chat__message-composer-controls__text-composition-controls'>\n <div className='str-chat__message-composer-controls__text-composition-controls__text'>\n {command && (\n <div className='str-chat__message-composer-controls__text-composition-controls__command-chip-container'>\n <CommandChip command={command} />\n </div>\n )}\n <TextareaComposer />\n </div>\n <SendToChannelCheckbox />\n </div>\n <AdditionalMessageComposerActions />\n <MessageComposerActions />\n </div>\n </div>\n </>\n )}\n </div>\n </WithDragAndDropUpload>\n );\n};\n","import { useMemo } from 'react';\n\nimport type { MessageComposerContextValue } from '../../../context/MessageComposerContext';\n\nexport const useCreateMessageComposerContext = (value: MessageComposerContextValue) => {\n const {\n additionalTextareaProps,\n asyncMessagesMultiSendEnabled,\n audioRecordingEnabled,\n emojiSearchIndex,\n focus,\n handleSubmit,\n hideSendButton,\n maxRows,\n minRows,\n onPaste,\n parent,\n recordingController,\n shouldSubmit,\n textareaRef,\n } = value;\n\n const parentId = parent?.id;\n\n const messageComposerContext: MessageComposerContextValue = useMemo(\n () => ({\n additionalTextareaProps,\n asyncMessagesMultiSendEnabled,\n audioRecordingEnabled,\n emojiSearchIndex,\n focus,\n handleSubmit,\n hideSendButton,\n maxRows,\n minRows,\n onPaste,\n parent,\n recordingController,\n shouldSubmit,\n textareaRef,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n asyncMessagesMultiSendEnabled,\n audioRecordingEnabled,\n emojiSearchIndex,\n handleSubmit,\n hideSendButton,\n minRows,\n parentId,\n recordingController,\n ],\n );\n\n return messageComposerContext;\n};\n","import type { PropsWithChildren } from 'react';\nimport React, { useEffect } from 'react';\n\nimport { MessageComposerUI as DefaultMessageComposerUI } from './MessageComposerUI';\nimport { useMessageComposerController } from './hooks';\nimport { useCreateMessageComposerContext } from './hooks/useCreateMessageComposerContext';\nimport { useMessageComposerBindings } from './hooks/useMessageComposerBindings';\nimport type { ComponentContextValue } from '../../context/ComponentContext';\nimport { useComponentContext } from '../../context/ComponentContext';\nimport { MessageComposerContextProvider } from '../../context/MessageComposerContext';\nimport { DialogManagerProvider } from '../../context';\nimport { useStableId } from '../UtilityComponents/useStableId';\n\nimport type { LocalMessage, Message, SendMessageOptions } from 'stream-chat';\n\nimport type { CustomAudioRecordingConfig } from '../MediaRecorder';\nimport { useRegisterDropHandlers } from './WithDragAndDropUpload';\n\nexport type EmojiSearchIndexResult = {\n id: string;\n name: string;\n skins: Array<{ native: string }>;\n emoticons?: Array<string>;\n native?: string;\n};\n\nexport interface EmojiSearchIndex {\n search: (\n query: string,\n ) => PromiseLike<Array<EmojiSearchIndexResult>> | Array<EmojiSearchIndexResult> | null;\n}\n\nexport type MessageComposerProps = {\n /**\n * Additional props to be passed to the underlying `AutoCompleteTextarea` component.\n * Default value is handled via MessageComposer.\n * [Available props](https://www.npmjs.com/package/react-textarea-autosize)\n */\n additionalTextareaProps?: Omit<\n React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'defaultValue' | 'style' | 'disabled' | 'value'\n >;\n /**\n * When enabled, recorded messages won’t be sent immediately.\n * Instead, they will “stack up” with other attachments in the message composer allowing the user to send multiple attachments as part of the same message.\n */\n asyncMessagesMultiSendEnabled?: boolean;\n /** Allows to configure the audio recording parameters for voice messages. */\n audioRecordingConfig?: CustomAudioRecordingConfig;\n /** Controls whether the users will be provided with the UI to record voice messages. */\n audioRecordingEnabled?: boolean;\n /** Mechanism to be used with autocomplete and text replace features of the `MessageComposer` component, see [emoji-mart `SearchIndex`](https://github.com/missive/emoji-mart#%EF%B8%8F%EF%B8%8F-headless-search) */\n emojiSearchIndex?: ComponentContextValue['emojiSearchIndex'];\n /** If true, focuses the text input on component mount */\n focus?: boolean;\n // todo: what sense does hideSendButton prop make, when we have message composer actions (recording, send msg). Can we remove it?\n // /** Allows to hide MessageComposer's send button. */\n hideSendButton?: boolean;\n /** Max number of rows the underlying `textarea` component is allowed to grow */\n maxRows?: number;\n /** Min number of rows the underlying `textarea` will start with. The `grow` on MessageComposer prop has to be enabled for `minRows` to take effect. */\n minRows?: number;\n /** Function to override the default message sending process. Not message updating process. */\n overrideSubmitHandler?: (params: {\n cid: string;\n localMessage: LocalMessage;\n message: Message;\n sendOptions: SendMessageOptions;\n }) => Promise<void> | void;\n /** When replying in a thread, the parent message object */\n parent?: LocalMessage;\n /**\n * Currently, `Enter` is the default submission key and `Shift`+`Enter` is the default combination for the new line.\n * If specified, this function overrides the default behavior specified previously.\n *\n * Example of default behavior:\n * ```tsx\n * const defaultShouldSubmit = (event) => event.key === \"Enter\" && !event.shiftKey;\n * ```\n */\n shouldSubmit?: (event: React.KeyboardEvent<HTMLTextAreaElement>) => boolean;\n};\n\nconst MessageComposerProvider = (props: PropsWithChildren<MessageComposerProps>) => {\n const messageComposerBindings = useMessageComposerBindings(props);\n const { emojiSearchIndex } = useComponentContext('MessageComposer');\n\n const messageComposerContextValue = useCreateMessageComposerContext({\n ...messageComposerBindings,\n ...props,\n emojiSearchIndex: props.emojiSearchIndex ?? emojiSearchIndex,\n });\n\n const messageComposer = useMessageComposerController();\n\n useEffect(\n () => () => {\n messageComposer.createDraft();\n },\n [messageComposer],\n );\n\n useEffect(() => {\n const threadId = messageComposer.threadId;\n if (\n !threadId ||\n !messageComposer.channel ||\n !messageComposer.contentIsEmpty ||\n !messageComposer.config.drafts.enabled\n )\n return;\n // get draft data for legacy thead composer\n messageComposer.channel\n .getDraft({ parent_id: threadId })\n .then(({ draft }) => {\n if (draft) {\n messageComposer.initState({ composition: draft });\n }\n })\n .catch(console.error);\n }, [messageComposer]);\n\n useRegisterDropHandlers();\n\n return (\n <MessageComposerContextProvider value={messageComposerContextValue}>\n {props.children}\n </MessageComposerContextProvider>\n );\n};\n\nconst UnMemoizedMessageComposer = (props: MessageComposerProps) => {\n const { MessageComposerUI = DefaultMessageComposerUI } =\n useComponentContext('MessageComposer');\n const messageComposer = useMessageComposerController();\n const id = useStableId();\n\n const dialogManagerId = messageComposer.threadId\n ? `message-input-dialog-manager-thread-${id}`\n : `message-input-dialog-manager-${id}`;\n\n return (\n <DialogManagerProvider id={dialogManagerId}>\n <MessageComposerProvider {...props}>\n <MessageComposerUI />\n </MessageComposerProvider>\n </DialogManagerProvider>\n );\n};\n\n/**\n * A high level component that has provides all functionality to the Input it renders.\n */\nexport const MessageComposer = React.memo(\n UnMemoizedMessageComposer,\n) as typeof UnMemoizedMessageComposer;\n","import type { ReactNode } from 'react';\nimport React from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport type { Channel, PollVote } from 'stream-chat';\n\nimport type { ChatContextValue } from '../../context';\nimport { getTranslatedMessageText } from '../../context/MessageTranslationViewContext';\nimport type { TranslationContextValue } from '../../context/TranslationContext';\nimport type { PluggableList } from 'unified';\nimport { htmlToTextPlugin, imageToLink, plusPlusToEmphasis } from '../Message';\nimport remarkGfm from 'remark-gfm';\n\nconst remarkPlugins: PluggableList = [\n htmlToTextPlugin,\n [remarkGfm, { singleTilde: false }],\n plusPlusToEmphasis,\n imageToLink,\n];\n\nexport const renderPreviewText = (text: string) => (\n <ReactMarkdown remarkPlugins={remarkPlugins} skipHtml>\n {text}\n </ReactMarkdown>\n);\n\nconst getLatestPollVote = (latestVotesByOption: Record<string, PollVote[]>) => {\n let latestVote: PollVote | undefined;\n for (const optionVotes of Object.values(latestVotesByOption)) {\n optionVotes.forEach((vote) => {\n if (latestVote && new Date(latestVote.updated_at) >= new Date(vote.created_at))\n return;\n latestVote = vote;\n });\n }\n\n return latestVote;\n};\n\nexport const getLatestMessagePreview = (\n channel: Channel,\n t: TranslationContextValue['t'],\n userLanguage: TranslationContextValue['userLanguage'] = 'en',\n isMessageAIGenerated?: ChatContextValue['isMessageAIGenerated'],\n): ReactNode => {\n const latestMessage =\n channel.state.latestMessages[channel.state.latestMessages.length - 1];\n\n const previewTextToRender =\n getTranslatedMessageText({ language: userLanguage, message: latestMessage }) ||\n latestMessage?.text;\n const poll = latestMessage?.poll;\n\n if (!latestMessage) {\n return t('Nothing yet...');\n }\n\n if (latestMessage.deleted_at) {\n return t('Message deleted');\n }\n\n if (poll) {\n if (!poll.vote_count) {\n const createdBy =\n poll.created_by?.id === channel.getClient().userID\n ? t('You')\n : (poll.created_by?.name ?? t('Poll'));\n return t('📊 {{createdBy}} created: {{ pollName}}', {\n createdBy,\n pollName: poll.name,\n });\n } else {\n const latestVote = getLatestPollVote(\n poll.latest_votes_by_option as Record<string, PollVote[]>,\n );\n const option =\n latestVote && poll.options.find((opt) => opt.id === latestVote.option_id);\n\n if (option && latestVote) {\n return t('📊 {{votedBy}} voted: {{pollOptionText}}', {\n pollOptionText: option.text,\n votedBy:\n latestVote?.user?.id === channel.getClient().userID\n ? t('You')\n : (latestVote.user?.name ?? t('Poll')),\n });\n }\n }\n }\n\n if (previewTextToRender) {\n return isMessageAIGenerated?.(latestMessage)\n ? previewTextToRender\n : renderPreviewText(previewTextToRender);\n }\n\n if (latestMessage.command) {\n return `/${latestMessage.command}`;\n }\n\n if (latestMessage.attachments?.length) {\n return t('🏙 Attachment...');\n }\n\n if (latestMessage.shared_location) {\n return t('📍Shared location');\n }\n\n return t('Empty message...');\n};\n\nexport type GroupChannelDisplayInfoMember = {\n imageUrl?: string;\n userName?: string;\n};\n\nexport type GroupChannelDisplayInfo = {\n members: GroupChannelDisplayInfoMember[];\n /** When members.length > 4, count for the \"+N\" badge (members.length - 2). */\n overflowCount?: number;\n};\n\n/**\n * Channel display image: channel.data.image, or for DM (2 members) the other member's user.image.\n */\nexport const getChannelDisplayImage = (channel: Channel): string | undefined => {\n const data = channel.data as { image?: string } | undefined;\n if (data?.image && typeof data.image === 'string') return data.image;\n\n const memberList = Object.values(channel.state.members);\n const currentUserId = channel.getClient().userID ?? undefined;\n if (memberList.length === 2) {\n const other = memberList.find((m) => m.user?.id !== currentUserId);\n const image = other?.user?.image;\n if (image && typeof image === 'string') return image;\n }\n return undefined;\n};\n\nexport const getGroupChannelDisplayInfo = (\n channel: Channel,\n): GroupChannelDisplayInfo | undefined => {\n const members = Object.values(channel.state.members);\n if (members.length <= 2) return;\n\n const memberList: GroupChannelDisplayInfoMember[] = [];\n for (const member of members) {\n const { user } = member;\n if (!user?.name && !user?.image) continue;\n memberList.push({ imageUrl: user.image, userName: user.name });\n }\n return {\n members: memberList,\n overflowCount: memberList.length > 4 ? memberList.length - 2 : undefined,\n };\n};\n","import { useEffect, useState } from 'react';\nimport type { Channel } from 'stream-chat';\n\nimport { useChatContext } from '../../../context';\nimport { useTranslationContext } from '../../../context/TranslationContext';\n\n/**\n * 1. channel.data.name\n * 2. DM (exactly 2 members): other member's name, then directMessageLabel\n * 3. Group (3+ members): comma-separated list of 2 other members' names (no ellipsis)\n * 4. undefined otherwise\n */\nfunction computeChannelDisplayName(\n channel: Channel,\n directMessageLabel: string,\n): string | undefined {\n const data = channel.data as { name?: string } | undefined;\n if (data?.name && typeof data.name === 'string') return data.name;\n\n const memberList = Object.values(channel.state.members);\n const currentUserId = channel.getClient().userID ?? undefined;\n const otherMembers = memberList.filter((m) => m.user?.id !== currentUserId);\n\n if (memberList.length === 2 && otherMembers.length === 1) {\n const name = otherMembers[0].user?.name;\n return name || directMessageLabel;\n }\n if (otherMembers.length >= 2) {\n const names = otherMembers\n .map((m) => m.user?.name)\n .filter(Boolean)\n .slice(0, 2) as string[];\n if (names.length > 0) return names.join(', ');\n }\n return undefined;\n}\n\n/**\n * Channel display name with translation context.\n * 1. channel.data.name\n * 2. DM (exactly 2 members): other member's name, then translated \"Direct message\"\n * 3. Group (3+ members): comma-separated list of 2 other members' names (no ellipsis)\n * 4. undefined otherwise\n */\nexport const useChannelDisplayName = (\n channel: Channel | undefined,\n): string | undefined => {\n const { client } = useChatContext('useChannelDisplayName');\n const { t } = useTranslationContext('useChannelDisplayName');\n const directMessageLabel = t('Direct message');\n\n const [displayName, setDisplayName] = useState<string | undefined>(() =>\n channel ? computeChannelDisplayName(channel, directMessageLabel) : undefined,\n );\n\n useEffect(() => {\n if (!channel) {\n setDisplayName(undefined);\n return;\n }\n const updateDisplayName = () =>\n setDisplayName(computeChannelDisplayName(channel, directMessageLabel));\n updateDisplayName();\n client.on('user.updated', updateDisplayName);\n return () => {\n client.off('user.updated', updateDisplayName);\n };\n }, [channel, channel?.data, client, directMessageLabel]);\n\n return displayName;\n};\n","import { useEffect, useMemo, useState } from 'react';\nimport type { Channel } from 'stream-chat';\n\nimport { useChatContext } from '../../../context';\nimport {\n getChannelDisplayImage,\n getGroupChannelDisplayInfo,\n type GroupChannelDisplayInfo,\n} from '../utils';\nimport { useChannelDisplayName } from './useChannelDisplayName';\n\nconst emptyGroupInfo: GroupChannelDisplayInfo = {\n members: [],\n overflowCount: undefined,\n};\n\nexport type ChannelPreviewInfoParams = {\n /** Channel to read display info from; when undefined, returns undefined display title/image */\n channel?: Channel;\n /** Manually set the image to render, defaults to the Channel image */\n overrideImage?: string;\n /** Set title manually */\n overrideTitle?: string;\n};\n\nexport const useChannelPreviewInfo = (props: ChannelPreviewInfoParams) => {\n const { channel, overrideImage, overrideTitle } = props;\n const { client } = useChatContext();\n\n const channelDisplayName = useChannelDisplayName(channel);\n const displayTitle = overrideTitle ?? channelDisplayName;\n\n const [displayImage, setDisplayImage] = useState<string | undefined>(() =>\n channel ? (overrideImage ?? getChannelDisplayImage(channel)) : undefined,\n );\n const [groupChannelDisplayInfo, setGroupChannelDisplayInfo] =\n useState<GroupChannelDisplayInfo>(() =>\n channel ? (getGroupChannelDisplayInfo(channel) ?? emptyGroupInfo) : emptyGroupInfo,\n );\n\n useEffect(() => {\n if (!channel) return;\n if (overrideImage) return;\n\n const updateInfo = () => {\n setDisplayImage(getChannelDisplayImage(channel));\n setGroupChannelDisplayInfo(getGroupChannelDisplayInfo(channel) ?? emptyGroupInfo);\n };\n\n updateInfo();\n client.on('user.updated', updateInfo);\n return () => {\n client.off('user.updated', updateInfo);\n };\n }, [channel, channel?.data, client, overrideImage]);\n\n return useMemo(\n () => ({\n displayImage: overrideImage ?? displayImage,\n displayTitle,\n groupChannelDisplayInfo,\n }),\n [displayImage, displayTitle, groupChannelDisplayInfo, overrideImage],\n );\n};\n","import React from 'react';\n\n/** Three dots for typing indicator; fill and opacity animation come from TypingIndicator.scss (--chat-text-typing-indicator). */\nexport const TypingIndicatorDots = () => (\n <svg\n aria-hidden\n fill='none'\n height='5'\n viewBox='0 0 23 5'\n width='23'\n xmlns='http://www.w3.org/2000/svg'\n >\n <circle cx='2.5' cy='2.5' r='2.5' />\n <circle cx='11.5' cy='2.5' r='2.5' />\n <circle cx='20.5' cy='2.5' r='2.5' />\n </svg>\n);\n","import { useEffect, useMemo, useRef, useState } from 'react';\n\nconst DEFAULT_HIDE_DELAY_MS = 2000;\n\nexport type TypingEntry = {\n user?: { id?: string; name?: string; image?: string };\n parent_id?: string;\n};\n\n/**\n * Derive a stable key from typing users so that the effect only runs when the\n * actual set of users (by id) changes, not on every render due to new array\n * references.\n *\n * Important: callers must pass entries where `user` is an object with an `id`\n * field (not a plain string). If `user?.id` is undefined for every entry the\n * key degenerates to an empty string, the memo returns a new array each time\n * it is \"invalidated\" by React, and `setDisplayUsers` in the effect below will\n * loop infinitely because it always receives a fresh reference.\n */\nconst useStableTypingUsers = (typingUsers: readonly TypingEntry[]) => {\n const key = typingUsers\n .map((entry) => entry.user?.id ?? '')\n .sort()\n .join(',');\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => [...typingUsers], [key]);\n};\n\n/**\n * Debounces hiding the typing indicator: when typing users go to zero, keep showing for delayMs\n * to avoid flicker when typing stops and starts again quickly. Returns the list to display\n * (current typers or last non-empty list during the debounce period). Show the indicator\n * when displayUsers.length > 0.\n */\nexport function useDebouncedTypingActive(\n typingUsers: readonly TypingEntry[],\n delayMs: number = DEFAULT_HIDE_DELAY_MS,\n): { displayUsers: TypingEntry[] } {\n const stableTypingUsers = useStableTypingUsers(typingUsers);\n const [displayUsers, setDisplayUsers] = useState<TypingEntry[]>([]);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const hadTypersRef = useRef(false);\n\n useEffect(() => {\n if (stableTypingUsers.length > 0) {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n hadTypersRef.current = true;\n setDisplayUsers(stableTypingUsers);\n return;\n }\n\n if (stableTypingUsers.length === 0 && hadTypersRef.current && !timerRef.current) {\n timerRef.current = setTimeout(() => {\n timerRef.current = null;\n hadTypersRef.current = false;\n setDisplayUsers([]);\n }, delayMs);\n }\n }, [stableTypingUsers, delayMs]);\n\n useEffect(\n () => () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n },\n [],\n );\n\n return { displayUsers };\n}\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport { TypingIndicatorDots } from './TypingIndicatorDots';\nimport { useChannelStateContext } from '../../context/ChannelStateContext';\nimport { useChatContext } from '../../context/ChatContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { useTypingContext } from '../../context/TypingContext';\nimport { useThreadContext } from '../Threads';\n\nimport { useDebouncedTypingActive } from './hooks/useDebouncedTypingActive';\n\nexport type TypingIndicatorHeaderProps = {\n /** When true, show typing in the current thread only; when false, show typing in the channel. */\n threadList?: boolean;\n};\n\n/**\n * Inline typing indicator for ChannelHeader or ThreadHeader: text (1/2/3+ people) followed by animated dots.\n * Only shows other participants; respects channelConfig.typing_events.\n */\nexport const TypingIndicatorHeader = (props: TypingIndicatorHeaderProps) => {\n const { threadList = false } = props;\n\n const { t } = useTranslationContext();\n const { channelConfig, thread } = useChannelStateContext('TypingIndicatorHeader');\n const threadInstance = useThreadContext();\n const parentId = threadInstance?.id ?? thread?.id;\n const { client } = useChatContext('TypingIndicatorHeader');\n const { typing = {} } = useTypingContext('TypingIndicatorHeader');\n\n const typingInChannel = !threadList\n ? Object.values(typing).filter(\n ({ parent_id, user }) => user?.id !== client.user?.id && !parent_id,\n )\n : [];\n\n const typingInThread = threadList\n ? Object.values(typing).filter(\n ({ parent_id, user }) => user?.id !== client.user?.id && parent_id === parentId,\n )\n : [];\n\n const typingUsers = threadList ? typingInThread : typingInChannel;\n const { displayUsers } = useDebouncedTypingActive(typingUsers);\n\n if (channelConfig?.typing_events === false || displayUsers.length === 0) {\n return null;\n }\n\n const names = displayUsers.map(({ user }) => user?.name ?? '');\n let label: string;\n if (names.length === 1) {\n label = t('{{ typing }} is typing', { typing: names[0] });\n } else if (names.length === 2) {\n label = t('{{ typing }} are typing', {\n typing: `${names[0]} and ${names[1]}`,\n });\n } else {\n label = t('{{ count }} people are typing', { count: names.length });\n }\n\n return (\n <span\n className={clsx('str-chat__typing-indicator-header', {\n 'str-chat__typing-indicator-header--thread': threadList,\n })}\n data-testid='typing-indicator-header'\n >\n <span className='str-chat__typing-indicator-header__text'>{label}</span>\n <span className='str-chat__typing-indicator__dots str-chat__typing-indicator-header__dots'>\n <TypingIndicatorDots />\n </span>\n </span>\n );\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type { TranslationContextValue } from '../../../context/TranslationContext';\nimport type { SupportedTranslations } from '../../../i18n';\nimport {\n defaultDateTimeParser,\n defaultTranslatorFunction,\n isLanguageSupported,\n Streami18n,\n} from '../../../i18n';\n\nimport type {\n AppSettingsAPIResponse,\n Channel,\n Event,\n Mute,\n OwnUserResponse,\n StreamChat,\n} from 'stream-chat';\n\n/** Viewport width (px) above which the sidebar is open by default when using responsive initial nav state. */\nexport const NAV_SIDEBAR_DESKTOP_BREAKPOINT = 768;\n\n/** With responsive nav: sidebar is open on load (so ChannelList/ThreadList + selector visible); close on channel/thread selection. */\nconst getDefaultNavOpenFromViewport = (): boolean => true;\n\nexport type UseChatParams = {\n client: StreamChat;\n defaultLanguage?: SupportedTranslations;\n i18nInstance?: Streami18n;\n /**\n * Initial open state of the sidebar. Omit for responsive (viewport-derived); set to true/false for an explicit initial state.\n */\n initialNavOpen?: boolean;\n};\n\nexport const useChat = ({\n client,\n defaultLanguage = 'en',\n i18nInstance,\n initialNavOpen,\n}: UseChatParams) => {\n const [translators, setTranslators] = useState<TranslationContextValue>({\n t: defaultTranslatorFunction,\n tDateTimeParser: defaultDateTimeParser,\n userLanguage: 'en',\n });\n\n const [channel, setChannel] = useState<Channel>();\n const [mutes, setMutes] = useState<Array<Mute>>([]);\n const [navOpen, setNavOpen] = useState(() => {\n if (initialNavOpen === undefined) return getDefaultNavOpenFromViewport() ?? true;\n return initialNavOpen;\n });\n const [latestMessageDatesByChannels, setLatestMessageDatesByChannels] = useState({});\n\n const clientMutes = (client.user as OwnUserResponse)?.mutes ?? [];\n\n const closeMobileNav = () => setNavOpen(false);\n const openMobileNav = () => setTimeout(() => setNavOpen(true), 100);\n\n const appSettings = useRef<Promise<AppSettingsAPIResponse> | null>(null);\n\n const getAppSettings = () => {\n if (appSettings.current) {\n return appSettings.current;\n }\n appSettings.current = client.getAppSettings();\n return appSettings.current;\n };\n\n useEffect(() => {\n if (!client) return;\n\n const version = process.env.STREAM_CHAT_REACT_VERSION;\n\n const userAgent = client.getUserAgent();\n if (!userAgent.includes('stream-chat-react')) {\n // result looks like: 'stream-chat-react-2.3.2-stream-chat-javascript-client-browser-2.2.2'\n // the upper-case text between double underscores is replaced with the actual semantic version of the library\n client.setUserAgent(`stream-chat-react-${version}-${userAgent}`);\n }\n\n client.threads.registerSubscriptions();\n client.polls.registerSubscriptions();\n client.reminders.registerSubscriptions();\n client.reminders.initTimers();\n\n return () => {\n client.threads.unregisterSubscriptions();\n client.polls.unregisterSubscriptions();\n client.reminders.unregisterSubscriptions();\n client.reminders.clearTimers();\n };\n }, [client]);\n\n useEffect(() => {\n setMutes(clientMutes);\n\n const handleEvent = (event: Event) => {\n setMutes(event.me?.mutes || []);\n };\n\n client.on('notification.mutes_updated', handleEvent);\n return () => client.off('notification.mutes_updated', handleEvent);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [clientMutes?.length]);\n\n useEffect(() => {\n let userLanguage = client.user?.language;\n\n if (!userLanguage) {\n const browserLanguage = window.navigator.language.slice(0, 2); // just get language code, not country-specific version\n userLanguage = isLanguageSupported(browserLanguage)\n ? browserLanguage\n : defaultLanguage;\n }\n\n const streami18n = i18nInstance || new Streami18n({ language: userLanguage });\n\n streami18n.registerSetLanguageCallback((t) =>\n setTranslators((prevTranslator) => ({ ...prevTranslator, t })),\n );\n\n streami18n.getTranslators().then((translator) => {\n setTranslators({\n ...translator,\n userLanguage: userLanguage || defaultLanguage,\n });\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [i18nInstance]);\n\n const setActiveChannel = useCallback(\n async (\n activeChannel?: Channel,\n watchers: { limit?: number; offset?: number } = {},\n event?: React.BaseSyntheticEvent,\n ) => {\n if (event && event.preventDefault) event.preventDefault();\n\n if (activeChannel && Object.keys(watchers).length) {\n await activeChannel.query({ watch: true, watchers });\n }\n\n setChannel(activeChannel);\n const isMobileViewport =\n typeof window !== 'undefined' &&\n window.innerWidth < NAV_SIDEBAR_DESKTOP_BREAKPOINT;\n if (isMobileViewport) closeMobileNav();\n },\n [],\n );\n\n useEffect(() => {\n setLatestMessageDatesByChannels({});\n }, [client.user?.id]);\n\n return {\n channel,\n closeMobileNav,\n getAppSettings,\n latestMessageDatesByChannels,\n mutes,\n navOpen,\n openMobileNav,\n setActiveChannel,\n translators,\n };\n};\n","import { useEffect, useState } from 'react';\n\nimport { NAV_SIDEBAR_DESKTOP_BREAKPOINT } from '../../Chat/hooks/useChat';\n\nconst mobileQuery = () =>\n typeof window !== 'undefined'\n ? window.matchMedia(`(max-width: ${NAV_SIDEBAR_DESKTOP_BREAKPOINT - 1}px)`)\n : null;\n\n/** True when viewport width is below NAV_SIDEBAR_DESKTOP_BREAKPOINT (768px). */\nexport const useIsMobileViewport = (): boolean => {\n const [isMobile, setIsMobile] = useState(() => mobileQuery()?.matches ?? false);\n\n useEffect(() => {\n const mql = mobileQuery();\n if (!mql) return;\n const handler = () => setIsMobile(mql.matches);\n handler();\n mql.addEventListener('change', handler);\n return () => mql.removeEventListener('change', handler);\n }, []);\n\n return isMobile;\n};\n","import React from 'react';\nimport { useIsMobileViewport } from '../ChannelHeader/hooks/useIsMobileViewport';\nimport { useChatContext, useTranslationContext } from '../../context';\nimport { Button, type ButtonProps } from './Button';\n\ntype ToggleSidebarButtonProps = ButtonProps & {\n /** expand mode is usually assigned to button, whose task is to show the sidebar, and collapse vice versa */\n mode: 'expand' | 'collapse';\n /** usually can collapse if an item from sidebar was selected */\n canCollapse?: boolean;\n};\n\nexport const ToggleSidebarButton = ({\n canCollapse,\n mode,\n ...props\n}: ToggleSidebarButtonProps) => {\n const { closeMobileNav, navOpen, openMobileNav } = useChatContext('ChannelHeader');\n const { t } = useTranslationContext('ChannelHeader');\n const toggleNav = navOpen ? closeMobileNav : openMobileNav;\n const isMobileViewport = useIsMobileViewport();\n const showButton = mode === 'expand' ? isMobileViewport || !navOpen : canCollapse;\n\n return showButton ? (\n <Button\n appearance='ghost'\n aria-label={navOpen ? t('aria/Collapse sidebar') : t('aria/Expand sidebar')}\n circular\n className='str-chat__header-sidebar-toggle'\n onClick={toggleNav}\n size='md'\n variant='secondary'\n {...props}\n />\n ) : null;\n};\n","import React from 'react';\n\nimport { useChannelStateContext } from '../../context/ChannelStateContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { useStateStore } from '../../store';\nimport { useChannelPreviewInfo } from '../ChannelListItem/hooks/useChannelPreviewInfo';\nimport { TypingIndicatorHeader } from '../TypingIndicator/TypingIndicatorHeader';\nimport { useThreadContext } from '../Threads';\nimport { useChatContext } from '../../context/ChatContext';\nimport { useTypingContext } from '../../context/TypingContext';\n\nimport type { LocalMessage } from 'stream-chat';\nimport type { ThreadState } from 'stream-chat';\nimport { Button } from '../Button';\nimport { IconCrossMedium, IconLayoutAlignLeft } from '../Icons';\nimport { ToggleSidebarButton } from '../Button/ToggleSidebarButton';\nimport { useChatViewContext } from '../ChatView';\n\nconst threadStateSelector = ({ replyCount }: ThreadState) => ({ replyCount });\n\n/** Fallback when channel has no display title: parent message author (name only). */\nconst displayNameFromParentMessage = (message: LocalMessage): string | undefined =>\n message.user?.name ?? undefined;\n\n/** Subtitle: replyCount, threadDisplayName, defaultSubtitle (name · reply count), and when typing also TypingIndicatorHeader. */\nconst ThreadHeaderSubtitle = ({\n replyCount,\n threadDisplayName,\n threadList,\n}: {\n replyCount: number | undefined;\n threadDisplayName: string | undefined;\n threadList: boolean;\n}) => {\n const { t } = useTranslationContext();\n const { channelConfig, thread } = useChannelStateContext('ThreadHeaderSubtitle');\n const threadInstance = useThreadContext();\n const parentId = threadInstance?.id ?? thread?.id;\n const { client } = useChatContext('ThreadHeaderSubtitle');\n const { typing = {} } = useTypingContext('ThreadHeaderSubtitle');\n const typingInThread = Object.values(typing).filter(\n ({ parent_id, user }) => user?.id !== client.user?.id && parent_id === parentId,\n );\n const hasTyping = channelConfig?.typing_events !== false && typingInThread.length > 0;\n const replyCountText = t('replyCount', { count: replyCount ?? 0 });\n const defaultSubtitle = threadDisplayName\n ? `${threadDisplayName} · ${replyCountText}`\n : replyCountText;\n return (\n <div className='str-chat__thread-header-subtitle'>\n <span\n className='str-chat__subtitle-content-transition'\n key={hasTyping ? 'typing' : 'default'}\n >\n {hasTyping ? (\n <TypingIndicatorHeader threadList={threadList} />\n ) : (\n <>{defaultSubtitle}</>\n )}\n </span>\n </div>\n );\n};\n\nexport type ThreadHeaderProps = {\n /** Callback for closing the thread */\n closeThread: (event?: React.BaseSyntheticEvent) => void;\n /** The thread parent message */\n thread: LocalMessage;\n /** UI component to display menu icon, defaults to IconLayoutAlignLeft*/\n MenuIcon?: React.ComponentType;\n /** Override the thread display title */\n overrideTitle?: string;\n};\n\nexport const ThreadHeader = (props: ThreadHeaderProps) => {\n const { closeThread, MenuIcon = IconLayoutAlignLeft, overrideTitle, thread } = props;\n\n const { t } = useTranslationContext();\n const { channel } = useChannelStateContext();\n const { activeChatView } = useChatViewContext();\n const { displayTitle: channelDisplayTitle } = useChannelPreviewInfo({ channel });\n\n const threadInstance = useThreadContext();\n const { replyCount: replyCountThreadInstance } =\n useStateStore(threadInstance?.state, threadStateSelector) ?? {};\n\n const replyCount = threadInstance\n ? replyCountThreadInstance\n : thread\n ? (thread.reply_count ?? 0)\n : 0;\n\n // Subtitle: channel display title (from parent or hook), with override and fallback to parent message author\n const threadDisplayName =\n overrideTitle ??\n channelDisplayTitle ??\n displayNameFromParentMessage(thread) ??\n undefined;\n\n return (\n <div className='str-chat__thread-header'>\n {activeChatView === 'threads' && (\n <ToggleSidebarButton canCollapse={!!threadInstance} mode='expand'>\n <MenuIcon />\n </ToggleSidebarButton>\n )}\n <div className='str-chat__thread-header-details'>\n <div className='str-chat__thread-header-title'>{t('Thread')}</div>\n <ThreadHeaderSubtitle\n replyCount={replyCount}\n threadDisplayName={threadDisplayName}\n threadList\n />\n </div>\n {!threadInstance && (\n <Button\n appearance='ghost'\n aria-label={t('aria/Close thread')}\n circular\n className='str-chat__close-thread-button'\n data-testid='close-thread-button'\n onClick={closeThread}\n size='md'\n variant='secondary'\n >\n <IconCrossMedium />\n </Button>\n )}\n </div>\n );\n};\n","import React from 'react';\n\nimport { useChannelStateContext } from '../../context/ChannelStateContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { useThreadContext } from '../Threads';\nimport { useStateStore } from '../../store';\nimport type { ThreadState } from 'stream-chat';\n\nconst threadStateSelector = ({ replyCount }: ThreadState) => ({\n replyCount,\n});\n\nexport const ThreadStart = () => {\n const { thread } = useChannelStateContext('ThreadStart');\n const { t } = useTranslationContext('ThreadStart');\n const threadInstance = useThreadContext();\n const { replyCount: replyCountThreadInstance } =\n useStateStore(threadInstance?.state, threadStateSelector) ?? {};\n\n const replyCount = threadInstance\n ? replyCountThreadInstance\n : thread\n ? (thread.reply_count ?? 0)\n : 0;\n\n if (!replyCount) return null;\n\n return (\n <div className='str-chat__thread-start'>{t('replyCount', { count: replyCount })}</div>\n );\n};\n","import clsx from 'clsx';\nimport React from 'react';\n\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { getDateString } from '../../i18n/utils';\n\nimport type { TimestampFormatterOptions } from '../../i18n/types';\n\nexport type DateSeparatorProps = TimestampFormatterOptions & {\n /** Optional className for the root element */\n className?: string;\n /** The date to format */\n date: Date;\n /** When true, applies floating positioning (fixed at top when scrolling) */\n floating?: boolean;\n /** Override the default formatting of the date. This is a function that has access to the original date object. */\n formatDate?: (date: Date) => string;\n // todo: position and unread are not necessary anymore\n /** Set the position of the date in the separator, options are 'left', 'center', 'right', @default right */\n position?: 'left' | 'center' | 'right';\n /** If following messages are not new */\n unread?: boolean;\n};\n\nconst UnMemoizedDateSeparator = (props: DateSeparatorProps) => {\n const {\n calendar,\n className,\n date: messageCreatedAt,\n floating,\n formatDate,\n ...restTimestampFormatterOptions\n } = props;\n\n const { t, tDateTimeParser } = useTranslationContext('DateSeparator');\n\n const formattedDate = getDateString({\n calendar,\n ...restTimestampFormatterOptions,\n formatDate,\n messageCreatedAt,\n t,\n tDateTimeParser,\n timestampTranslationKey: 'timestamp/DateSeparator',\n });\n\n return (\n <div\n className={clsx(\n 'str-chat__date-separator',\n { 'str-chat__date-separator--floating': floating },\n className,\n )}\n data-date={messageCreatedAt.toISOString()}\n data-testid={floating ? 'floating-date-separator' : 'date-separator'}\n >\n <div className='str-chat__date-separator-date'>{formattedDate}</div>\n </div>\n );\n};\n\n/**\n * A simple date separator between messages.\n */\nexport const DateSeparator = React.memo(\n UnMemoizedDateSeparator,\n) as typeof UnMemoizedDateSeparator;\n","import React from 'react';\n\nimport type { MessageProps } from '../Message';\nimport { Message } from '../Message';\nimport { ThreadStart as DefaultThreadStart } from './ThreadStart';\n\nimport { useComponentContext } from '../../context';\nimport { DateSeparator } from '../DateSeparator';\n\nexport const ThreadHead = (props: MessageProps) => {\n const { ThreadStart = DefaultThreadStart } = useComponentContext('ThreadHead');\n return (\n <div className='str-chat__parent-message-li'>\n <DateSeparator date={props.message.created_at} />\n <Message initialMessage threadList {...props} />\n <ThreadStart />\n </div>\n );\n};\n","import React, { useEffect } from 'react';\nimport clsx from 'clsx';\n\nimport { LegacyThreadContext } from './LegacyThreadContext';\nimport { MESSAGE_ACTIONS } from '../Message';\nimport type { MessageComposerProps } from '../MessageComposer';\nimport { MessageComposer } from '../MessageComposer';\nimport type { MessageListProps, VirtualizedMessageListProps } from '../MessageList';\nimport { MessageList, VirtualizedMessageList } from '../MessageList';\nimport { ThreadHeader as DefaultThreadHeader } from './ThreadHeader';\nimport { ThreadHead as DefaultThreadHead } from '../Thread/ThreadHead';\n\nimport {\n useChannelActionContext,\n useChannelStateContext,\n useChatContext,\n useComponentContext,\n} from '../../context';\nimport { useThreadContext } from '../Threads';\nimport { useStateStore } from '../../store';\n\nimport type { MessageProps, MessageUIComponentProps } from '../Message/types';\nimport type { MessageActionsArray } from '../Message/utils';\nimport type { ThreadState } from 'stream-chat';\n\nexport type ThreadProps = {\n /** Additional props for `MessageComposer` component: [available props](https://getstream.io/chat/docs/sdk/react/message-composer-components/message_composer/#props) */\n additionalMessageComposerProps?: MessageComposerProps;\n /** Additional props for `MessageList` component: [available props](https://getstream.io/chat/docs/sdk/react/core-components/message_list/#props) */\n additionalMessageListProps?: MessageListProps;\n /** Additional props for `Message` component of the parent message: [available props](https://getstream.io/chat/docs/sdk/react/message-components/message/#props) */\n additionalParentMessageProps?: Partial<MessageProps>;\n /** Additional props for `VirtualizedMessageList` component: [available props](https://getstream.io/chat/docs/sdk/react/core-components/virtualized_list/#props) */\n additionalVirtualizedMessageListProps?: VirtualizedMessageListProps;\n /** If true, focuses the `MessageComposer` component on opening a thread */\n autoFocus?: boolean;\n /** Injects date separator components into `Thread`, defaults to `false`. To be passed to the underlying `MessageList` or `VirtualizedMessageList` components */\n enableDateSeparator?: boolean;\n /** Custom thread message UI component used to override the default `Message` value stored in `ComponentContext` */\n Message?: React.ComponentType<MessageUIComponentProps>;\n /** Array of allowed message actions (ex: ['edit', 'delete', 'flag', 'mute', 'pin', 'quote', 'react', 'reply']). To disable all actions, provide an empty array. */\n messageActions?: MessageActionsArray;\n /** If true, render the `VirtualizedMessageList` instead of the standard `MessageList` component */\n virtualized?: boolean;\n};\n\n/**\n * The Thread component renders a parent Message with a list of replies\n */\nexport const Thread = (props: ThreadProps) => {\n const { channel, channelConfig, thread } = useChannelStateContext('Thread');\n const threadInstance = useThreadContext();\n\n if (!thread && !threadInstance) return null;\n if (channelConfig?.replies === false) return null;\n\n // the wrapper ensures a key variable is set and the component recreates on thread switch\n return (\n // FIXME: TS is having trouble here as at least one of the two would always be defined\n <ThreadInner\n {...props}\n key={`thread-${(thread ?? threadInstance)?.id}-${channel?.cid}`}\n />\n );\n};\n\nconst selector = (nextValue: ThreadState) => ({\n isLoadingNext: nextValue.pagination.isLoadingNext,\n isLoadingPrev: nextValue.pagination.isLoadingPrev,\n parentMessage: nextValue.parentMessage,\n replies: nextValue.replies,\n});\n\nconst ThreadInner = (props: ThreadProps & { key: string }) => {\n const {\n additionalMessageComposerProps,\n additionalMessageListProps,\n additionalParentMessageProps,\n additionalVirtualizedMessageListProps,\n autoFocus = true,\n enableDateSeparator = false,\n Message: PropMessage,\n messageActions = Object.keys(MESSAGE_ACTIONS),\n virtualized,\n } = props;\n const threadInstance = useThreadContext();\n\n const {\n thread,\n threadHasMore,\n threadLoadingMore,\n threadMessages = [],\n threadSuppressAutoscroll,\n } = useChannelStateContext('Thread');\n const { closeThread, loadMoreThread } = useChannelActionContext('Thread');\n const { customClasses } = useChatContext('Thread');\n const {\n Message: ContextMessage,\n ThreadHead = DefaultThreadHead,\n ThreadHeader = DefaultThreadHeader,\n VirtualMessage,\n } = useComponentContext('Thread');\n\n const { isLoadingNext, isLoadingPrev, parentMessage, replies } =\n useStateStore(threadInstance?.state, selector) ?? {};\n\n const ThreadMessage = PropMessage || additionalMessageListProps?.Message;\n const FallbackMessage = virtualized && VirtualMessage ? VirtualMessage : ContextMessage;\n const MessageUIComponent = ThreadMessage || FallbackMessage;\n\n const ThreadMessageList = virtualized ? VirtualizedMessageList : MessageList;\n\n useEffect(() => {\n if (threadInstance) return;\n\n if ((thread?.reply_count ?? 0) > 0) {\n // FIXME: integrators can customize channel query options but cannot customize channel.getReplies() options\n loadMoreThread();\n }\n }, [thread, loadMoreThread, threadInstance]);\n\n const threadProps: Pick<\n VirtualizedMessageListProps,\n | 'hasMoreNewer'\n | 'loadMoreNewer'\n | 'loadingMoreNewer'\n | 'hasMore'\n | 'loadMore'\n | 'loadingMore'\n | 'messages'\n > = threadInstance\n ? {\n loadingMore: isLoadingPrev,\n loadingMoreNewer: isLoadingNext,\n loadMore: threadInstance.loadPrevPage,\n loadMoreNewer: threadInstance.loadNextPage,\n messages: replies,\n }\n : {\n hasMore: threadHasMore,\n loadingMore: threadLoadingMore,\n loadMore: loadMoreThread,\n messages: threadMessages,\n };\n\n const messageAsThread = thread ?? parentMessage;\n\n if (!messageAsThread) return null;\n\n const threadClass =\n customClasses?.thread ||\n clsx('str-chat__thread-container str-chat__thread', {\n 'str-chat__thread--virtualized': virtualized,\n });\n\n const head = (\n <ThreadHead\n key={messageAsThread.id}\n message={messageAsThread}\n Message={MessageUIComponent}\n {...additionalParentMessageProps}\n />\n );\n\n return (\n // Thread component needs a context which we can use for message composer\n <LegacyThreadContext.Provider\n value={{\n legacyThread: thread ?? undefined,\n }}\n >\n <div className={threadClass}>\n <ThreadHeader closeThread={closeThread} thread={messageAsThread} />\n <ThreadMessageList\n disableDateSeparator={!enableDateSeparator}\n head={head}\n Message={MessageUIComponent}\n messageActions={messageActions}\n suppressAutoscroll={threadSuppressAutoscroll}\n threadList\n {...threadProps}\n {...(virtualized\n ? additionalVirtualizedMessageListProps\n : additionalMessageListProps)}\n />\n <MessageComposer\n focus={autoFocus}\n parent={thread ?? parentMessage}\n {...additionalMessageComposerProps}\n />\n </div>\n </LegacyThreadContext.Provider>\n );\n};\n","/* eslint-disable sort-keys */\n\nimport React from 'react';\n\ntype LegacyReactionOptions = Array<{\n Component: React.ComponentType;\n type: string;\n name?: string;\n}>;\n\ntype ReactionOptionData = {\n Component: React.ComponentType;\n name?: string;\n unicode?: string;\n};\n\nexport type ReactionOptions =\n | LegacyReactionOptions\n | {\n quick: {\n [key: string]: ReactionOptionData;\n };\n extended?: {\n [key: string]: ReactionOptionData;\n };\n };\n\nexport const mapEmojiMartData = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n emojiMartData: any,\n): NonNullable<Exclude<ReactionOptions, LegacyReactionOptions>['extended']> => {\n if (!emojiMartData || !emojiMartData.emojis) {\n return {};\n }\n\n const newMap: ReturnType<typeof mapEmojiMartData> = {};\n\n for (const emojiId in emojiMartData.emojis) {\n const emojiData = emojiMartData.emojis[emojiId];\n const [firstEmoji] = emojiData.skins;\n\n if (!firstEmoji || !firstEmoji.native) continue;\n\n const nativeEmoji = firstEmoji.native as string;\n\n const unicode = emojiToUnicode(nativeEmoji);\n\n newMap[unicode] = {\n Component: () => <>{nativeEmoji}</>,\n name: emojiData.name,\n };\n }\n\n return newMap;\n};\n\nexport type AdvancedReactionOptions = {\n quick: ReactionOptions;\n extended: ReactionOptions;\n};\n\nexport const emojiToUnicode = (emoji: string) => {\n const unicodeStrings = [];\n for (const c of emoji) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const codePoint = c.codePointAt(0)!;\n unicodeStrings.push(`U+${codePoint.toString(16).toUpperCase().padStart(4, '0')}`);\n }\n\n return unicodeStrings.join('-');\n};\n\nexport const unicodeToEmoji = (unicode: string) =>\n unicode\n .split('-')\n .map((code) => String.fromCodePoint(parseInt(code.replace('U+', ''), 16)))\n .join('');\n\nexport const defaultReactionOptions: ReactionOptions = {\n quick: {\n haha: {\n Component: () => <>😂</>,\n name: 'Joy',\n unicode: emojiToUnicode('😂'),\n },\n like: {\n Component: () => <>👍</>,\n name: 'Thumbs up',\n unicode: emojiToUnicode('👍'),\n },\n love: {\n Component: () => <>❤️</>,\n name: 'Heart',\n unicode: emojiToUnicode('❤️'),\n },\n sad: { Component: () => <>😔</>, name: 'Sad', unicode: emojiToUnicode('😔') },\n wow: {\n Component: () => <>😮</>,\n name: 'Astonished',\n unicode: emojiToUnicode('😮'),\n },\n fire: {\n Component: () => <>🔥</>,\n name: 'Fire',\n unicode: emojiToUnicode('🔥'),\n },\n },\n};\n","import React, { type ReactNode, useMemo, useState } from 'react';\nimport clsx from 'clsx';\n\nimport { useDialog } from '../Dialog';\nimport { defaultReactionOptions } from './reactionOptions';\nimport { useComponentContext } from '../../context/ComponentContext';\nimport { useMessageContext } from '../../context/MessageContext';\nimport { Button } from '../Button';\nimport { IconPlusLarge } from '../Icons';\n\nimport type { ReactionResponse } from 'stream-chat';\n\nexport type ReactionSelectorProps = {\n /** Function that adds/removes a reaction on a message (overrides the function stored in `MessageContext`) */\n handleReaction?: (\n reactionType: string,\n event: React.BaseSyntheticEvent,\n ) => Promise<void>;\n /** An array of the own reaction objects to distinguish own reactions visually */\n own_reactions?: ReactionResponse[];\n};\n\ninterface ReactionSelectorInterface {\n (props: ReactionSelectorProps): ReactNode;\n getDialogId: (_: {\n messageId: string;\n threadList?: boolean;\n }) => `reaction-selector${'-thread' | ''}--${string}`;\n displayName: string;\n}\n\nconst stableOwnReactions: ReactionResponse[] = [];\n\nexport const ReactionSelector: ReactionSelectorInterface = (props) => {\n const { handleReaction: propHandleReaction, own_reactions: propOwnReactions } = props;\n const [extendedListOpen, setExtendedListOpen] = useState(false);\n\n const { reactionOptions = defaultReactionOptions } =\n useComponentContext('ReactionSelector');\n\n const {\n closeReactionSelectorOnClick,\n handleReaction: contextHandleReaction,\n message,\n threadList,\n } = useMessageContext('ReactionSelector');\n const dialogId = ReactionSelector.getDialogId({\n messageId: message.id,\n threadList,\n });\n const dialog = useDialog({ id: dialogId });\n\n const handleReaction = propHandleReaction ?? contextHandleReaction;\n const ownReactions = propOwnReactions ?? message?.own_reactions ?? stableOwnReactions;\n\n const ownReactionByType = useMemo(() => {\n const map: { [key: string]: ReactionResponse } = {};\n\n for (const reaction of ownReactions) {\n map[reaction.type] ??= reaction;\n }\n\n return map;\n }, [ownReactions]);\n\n const adjustedQuickReactionOptions = useMemo(() => {\n if (Array.isArray(reactionOptions)) return reactionOptions;\n\n return Object.entries(reactionOptions.quick).map(\n ([type, { Component, name, unicode }]) => ({\n Component,\n name,\n type,\n unicode,\n }),\n );\n }, [reactionOptions]);\n\n return (\n <div className='str-chat__reaction-selector' data-testid='reaction-selector'>\n {!extendedListOpen && (\n <>\n <ul className='str-chat__reaction-selector-list'>\n {adjustedQuickReactionOptions.map(\n ({ Component, name: reactionName, type: reactionType }) => (\n <li className='str-chat__reaction-list-selector__item' key={reactionType}>\n <button\n aria-label={`Select Reaction: ${reactionName || reactionType}`}\n aria-pressed={typeof ownReactionByType[reactionType] !== 'undefined'}\n className={clsx('str-chat__reaction-selector-list__item-button')}\n data-testid='select-reaction-button'\n data-text={reactionType}\n onClick={(event) => {\n handleReaction(reactionType, event);\n if (closeReactionSelectorOnClick) {\n dialog.close();\n }\n }}\n >\n <span className='str-chat__reaction-icon'>\n <Component />\n </span>\n </button>\n </li>\n ),\n )}\n </ul>\n <Button\n appearance='outline'\n circular\n className='str-chat__reaction-selector__add-button'\n onClick={() => setExtendedListOpen(true)}\n size='sm'\n variant='secondary'\n >\n <IconPlusLarge />\n </Button>\n </>\n )}\n {extendedListOpen &&\n !Array.isArray(reactionOptions) &&\n reactionOptions.extended && (\n <div className='str-chat__reaction-selector-extended-list'>\n {Object.entries(reactionOptions.extended).map(\n ([reactionType, { Component, name: reactionName }]) => (\n <button\n aria-label={`Select Reaction: ${reactionName || reactionType}`}\n aria-pressed={typeof ownReactionByType[reactionType] !== 'undefined'}\n className='str-chat__reaction-selector-extended-list__button str-chat__button str-chat__button--ghost str-chat__button--size-sm str-chat__button--circular'\n data-testid='select-reaction-button'\n data-text={reactionType}\n key={reactionType}\n onClick={(event) => {\n handleReaction(reactionType, event);\n if (closeReactionSelectorOnClick) {\n dialog.close();\n }\n }}\n >\n <span className='str-chat__reaction-icon'>\n <Component />\n </span>\n </button>\n ),\n )}\n </div>\n )}\n </div>\n );\n};\n\nReactionSelector.getDialogId = (({ messageId, threadList }) => {\n const dialogIdNamespace = threadList ? '-thread' : '';\n return `reaction-selector${dialogIdNamespace}--${messageId}`;\n}) satisfies ReactionSelectorInterface['getDialogId'];\n\nReactionSelector.displayName = 'ReactionSelector';\n","import type { ElementRef } from 'react';\nimport React, { useRef } from 'react';\nimport { ReactionSelector as DefaultReactionSelector } from './ReactionSelector';\nimport { DialogAnchor, useDialogIsOpen, useDialogOnNearestManager } from '../Dialog';\nimport {\n useComponentContext,\n useMessageContext,\n useTranslationContext,\n} from '../../context';\n\nimport type { IconProps } from '../../types/types';\nimport { QuickMessageActionsButton } from '../MessageActions';\n\ntype ReactionSelectorWithButtonProps = {\n /* Custom component rendering the icon used in a button invoking reactions selector for a given message. */\n ReactionIcon: React.ComponentType<IconProps>;\n};\n\n/**\n * Internal convenience component - not to be exported. It just groups the button and the dialog anchor and thus prevents\n * cluttering the parent component.\n */\nexport const ReactionSelectorWithButton = ({\n ReactionIcon,\n}: ReactionSelectorWithButtonProps) => {\n const { t } = useTranslationContext('ReactionSelectorWithButton');\n const { isMyMessage, message, threadList } = useMessageContext('MessageOptions');\n const { ReactionSelector = DefaultReactionSelector } =\n useComponentContext('MessageOptions');\n const buttonRef = useRef<ElementRef<'button'>>(null);\n const dialogId = DefaultReactionSelector.getDialogId({\n messageId: message.id,\n threadList,\n });\n const { dialog, dialogManager } = useDialogOnNearestManager({ id: dialogId });\n const dialogIsOpen = useDialogIsOpen(dialogId, dialogManager?.id);\n\n return (\n <>\n <DialogAnchor\n dialogManagerId={dialogManager?.id}\n id={dialogId}\n placement={isMyMessage() ? 'top-end' : 'top-start'}\n referenceElement={buttonRef.current}\n trapFocus\n updatePositionOnContentResize\n >\n <ReactionSelector />\n </DialogAnchor>\n <QuickMessageActionsButton\n aria-expanded={dialogIsOpen}\n aria-label={t('aria/Open Reaction Selector')}\n className='str-chat__message-reactions-button'\n data-testid='message-reaction-action'\n onClick={() => dialog?.toggle()}\n ref={buttonRef}\n >\n <ReactionIcon className='str-chat__message-action-icon' />\n </QuickMessageActionsButton>\n </>\n );\n};\n","import React from 'react';\nimport { useChatContext, useMessageContext, useTranslationContext } from '../../context';\nimport {\n ContextMenuBackButton,\n ContextMenuButton,\n ContextMenuHeader,\n useContextMenuContext,\n} from '../Dialog';\nimport { IconChevronLeft } from '../Icons';\n\nexport const RemindMeSubmenuHeader = () => {\n const { t } = useTranslationContext();\n const { returnToParentMenu } = useContextMenuContext();\n return (\n <ContextMenuHeader>\n <ContextMenuBackButton onClick={returnToParentMenu}>\n <IconChevronLeft />\n <span>{t('Remind Me')}</span>\n </ContextMenuBackButton>\n </ContextMenuHeader>\n );\n};\n\nexport const RemindMeSubmenu = () => {\n const { t } = useTranslationContext();\n const { client } = useChatContext();\n const { message } = useMessageContext();\n const { closeMenu } = useContextMenuContext();\n return (\n <div\n aria-label={t('aria/Remind Me Options')}\n className='str-chat__message-actions-box__submenu'\n role='listbox'\n >\n {client.reminders.scheduledOffsetsMs.map((offsetMs) => (\n <ContextMenuButton\n className='str-chat__message-actions-list-item-button'\n key={`reminder-offset-option--${offsetMs}`}\n onClick={() => {\n client.reminders.upsertReminder({\n messageId: message.id,\n remind_at: new Date(new Date().getTime() + offsetMs).toISOString(),\n });\n closeMenu();\n }}\n >\n {t('duration/Remind Me', { milliseconds: offsetMs })}\n </ContextMenuButton>\n ))}\n {/* todo: potential improvement to add a custom option that would trigger rendering modal with custom date picker - we need date picker */}\n </div>\n );\n};\n","import { Button, type ButtonProps } from '../Button';\nimport clsx from 'clsx';\nimport React from 'react';\n\nexport const QuickMessageActionsButton = ({ className, ...props }: ButtonProps) => (\n <Button\n appearance='ghost'\n circular\n className={clsx('str-chat__message-actions-box-button', className)}\n variant='secondary'\n {...props}\n />\n);\n","import { Alert } from '../Dialog';\nimport { Button } from '../Button';\nimport React from 'react';\nimport { useModalContext, useTranslationContext } from '../../context';\n\nexport type DeleteMessageAlertProps = {\n onCancel: () => void;\n onDelete: () => void;\n};\n\nexport const DeleteMessageAlert = ({ onCancel, onDelete }: DeleteMessageAlertProps) => {\n const { t } = useTranslationContext();\n const { close } = useModalContext();\n return (\n <Alert.Root\n className='str-chat__delete-message-alert'\n data-testid='message-delete-alert'\n >\n <Alert.Header\n description={t('Are you sure you want to delete this message?')}\n title={t('Delete message')}\n />\n <Alert.Actions>\n <Button\n appearance='outline'\n className='str-chat__delete-message-alert__delete-button'\n data-testid='delete-message-alert-delete-button'\n onClick={onDelete}\n size='md'\n variant='danger'\n >\n {t('Delete message')}\n </Button>\n <Button\n appearance='outline'\n className='str-chat__delete-message-alert__cancel-button'\n data-testid='delete-message-alert-cancel-button'\n onClick={() => {\n onCancel();\n close();\n }}\n size='md'\n variant='secondary'\n >\n {t('Cancel')}\n </Button>\n </Alert.Actions>\n </Alert.Root>\n );\n};\n","/* eslint-disable sort-keys */\nimport React, { useState } from 'react';\n\nimport { GlobalModal } from '../Modal';\nimport {\n IconArrowRotateClockwise,\n IconArrowShareLeft,\n IconBellNotification,\n IconBellOff,\n IconBookmark,\n IconBookmarkRemove,\n IconBubbleText6ChatMessage,\n IconBubbleWideNotificationChatMessage,\n IconCircleBanSign,\n IconCloseQuote2,\n IconEditBig,\n IconEmojiSmile,\n IconFlag2,\n IconMute,\n IconPeopleAdded,\n IconPin,\n IconSquareBehindSquare2_Copy,\n IconTrashBin,\n IconUnpin,\n IconVolumeFull,\n} from '../Icons';\nimport { isUserMuted } from '../Message/utils';\nimport { useMessageComposerController } from '../MessageComposer/hooks/useMessageComposerController';\nimport { addNotificationTargetTag, useNotificationTarget } from '../Notifications';\nimport { useMessageReminder } from '../Message/hooks/useMessageReminder';\nimport { ReactionSelectorWithButton } from '../Reactions/ReactionSelectorWithButton';\nimport {\n useChatContext,\n useComponentContext,\n useMessageContext,\n useTranslationContext,\n} from '../../context';\nimport { RemindMeSubmenu, RemindMeSubmenuHeader } from './RemindMeSubmenu';\nimport { ContextMenuButton, useContextMenuContext } from '../Dialog';\nimport type { MessageActionSetItem } from './MessageActions';\nimport { QuickMessageActionsButton } from './QuickMessageActionButton';\nimport clsx from 'clsx';\nimport { DeleteMessageAlert } from './DeleteMessageAlert';\n\nconst msgActionsBoxButtonClassName =\n 'str-chat__message-actions-list-item-button' as const;\n\nconst DefaultMessageActionComponents = {\n dropdown: {\n ThreadReply() {\n const { closeMenu } = useContextMenuContext();\n const { handleOpenThread } = useMessageContext();\n const { t } = useTranslationContext();\n\n return (\n <ContextMenuButton\n aria-label={t('aria/Open Thread')}\n className={msgActionsBoxButtonClassName}\n data-testid='thread-action'\n Icon={IconBubbleText6ChatMessage}\n onClick={(e) => {\n handleOpenThread(e);\n closeMenu();\n }}\n >\n {t('Thread Reply')}\n </ContextMenuButton>\n );\n },\n Quote() {\n const { closeMenu } = useContextMenuContext();\n const { message } = useMessageContext();\n const { t } = useTranslationContext();\n const messageComposer = useMessageComposerController();\n\n const handleQuote = () => {\n messageComposer.setQuotedMessage(message);\n\n const elements = message.parent_id\n ? document.querySelectorAll('.str-chat__thread .str-chat__textarea__textarea')\n : document.getElementsByClassName('str-chat__textarea__textarea');\n const textarea = elements.item(0);\n\n if (textarea instanceof HTMLTextAreaElement) {\n textarea.focus();\n }\n };\n\n return (\n <ContextMenuButton\n aria-label={t('aria/Quote Message')}\n className={msgActionsBoxButtonClassName}\n Icon={IconCloseQuote2}\n onClick={() => {\n handleQuote();\n closeMenu();\n }}\n >\n {t('Quote Reply')}\n </ContextMenuButton>\n );\n },\n Pin() {\n const { closeMenu } = useContextMenuContext();\n const { handlePin, message } = useMessageContext();\n const { t } = useTranslationContext();\n const isPinned = !!message.pinned;\n return (\n <ContextMenuButton\n aria-label={isPinned ? t('aria/Unpin Message') : t('aria/Pin Message')}\n className={msgActionsBoxButtonClassName}\n Icon={isPinned ? IconUnpin : IconPin}\n onClick={(event) => {\n handlePin(event);\n closeMenu();\n }}\n >\n {isPinned ? t('Unpin') : t('Pin')}\n </ContextMenuButton>\n );\n },\n CopyMessageText() {\n const { closeMenu } = useContextMenuContext();\n const { message } = useMessageContext();\n const { t } = useTranslationContext();\n\n return (\n <ContextMenuButton\n aria-label={t('aria/Copy Message Text')}\n className={msgActionsBoxButtonClassName}\n Icon={IconSquareBehindSquare2_Copy}\n onClick={() => {\n if (message.text) navigator.clipboard.writeText(message.text);\n closeMenu();\n }}\n >\n {t('Copy Message')}\n </ContextMenuButton>\n );\n },\n Resend() {\n const { closeMenu } = useContextMenuContext();\n const { handleRetry, message } = useMessageContext();\n const { t } = useTranslationContext();\n\n return (\n <ContextMenuButton\n aria-label={t('aria/Resend Message')}\n className={msgActionsBoxButtonClassName}\n Icon={IconArrowRotateClockwise}\n onClick={() => {\n handleRetry(message);\n closeMenu();\n }}\n >\n {t('Resend')}\n </ContextMenuButton>\n );\n },\n Edit() {\n const messageComposer = useMessageComposerController();\n const { message } = useMessageContext();\n const { t } = useTranslationContext();\n const { closeMenu } = useContextMenuContext();\n\n return (\n <ContextMenuButton\n aria-label={t('aria/Edit Message')}\n className={msgActionsBoxButtonClassName}\n Icon={IconEditBig}\n onClick={() => {\n messageComposer.initState({ composition: message });\n closeMenu();\n }}\n >\n {t('Edit Message')}\n </ContextMenuButton>\n );\n },\n MarkUnread() {\n const { closeMenu } = useContextMenuContext();\n const { handleMarkUnread } = useMessageContext();\n const { t } = useTranslationContext();\n\n return (\n <ContextMenuButton\n aria-label={t('aria/Mark Message Unread')}\n className={msgActionsBoxButtonClassName}\n Icon={IconBubbleWideNotificationChatMessage}\n onClick={(event) => {\n handleMarkUnread(event);\n closeMenu();\n }}\n >\n {t('Mark as unread')}\n </ContextMenuButton>\n );\n },\n RemindMe() {\n const { closeMenu, openSubmenu } = useContextMenuContext();\n const { client } = useChatContext();\n const { t } = useTranslationContext();\n const { message } = useMessageContext();\n const reminder = useMessageReminder(message.id);\n const messageAlreadyBookmarked = reminder && !reminder?.remindAt;\n\n if (messageAlreadyBookmarked) return null;\n\n return (\n <ContextMenuButton\n aria-label={reminder ? t('aria/Remind Me Message') : t('aria/Remove Reminder')}\n className={msgActionsBoxButtonClassName}\n hasSubMenu={!reminder}\n Icon={reminder ? IconBellOff : IconBellNotification}\n onClick={() => {\n if (reminder) {\n client.reminders.deleteReminder(reminder.id);\n closeMenu();\n } else {\n openSubmenu({\n Header: RemindMeSubmenuHeader,\n Submenu: RemindMeSubmenu,\n });\n }\n }}\n >\n {reminder ? t('Remove reminder') : t('Remind me')}\n </ContextMenuButton>\n );\n },\n SaveForLater() {\n const { closeMenu } = useContextMenuContext();\n const { client } = useChatContext();\n const { message } = useMessageContext();\n const { t } = useTranslationContext();\n const reminder = useMessageReminder(message.id);\n const messageAlreadyHasReminderScheduled = Boolean(reminder && reminder?.remindAt);\n\n if (messageAlreadyHasReminderScheduled) return null;\n\n return (\n <ContextMenuButton\n aria-label={\n reminder ? t('aria/Remove Save For Later') : t('aria/Bookmark Message')\n }\n className={msgActionsBoxButtonClassName}\n Icon={reminder ? IconBookmarkRemove : IconBookmark}\n onClick={() => {\n if (reminder) client.reminders.deleteReminder(reminder.id);\n else client.reminders.createReminder({ messageId: message.id });\n closeMenu();\n }}\n >\n {reminder ? t('Remove save for later') : t('Save for later')}\n </ContextMenuButton>\n );\n },\n Flag() {\n const { closeMenu } = useContextMenuContext();\n const { handleFlag } = useMessageContext();\n const { t } = useTranslationContext();\n\n return (\n <ContextMenuButton\n aria-label={t('aria/Flag Message')}\n className={msgActionsBoxButtonClassName}\n Icon={IconFlag2}\n onClick={(event) => {\n handleFlag(event);\n closeMenu();\n }}\n >\n {t('Flag')}\n </ContextMenuButton>\n );\n },\n Mute() {\n const { closeMenu } = useContextMenuContext();\n const { handleMute, message } = useMessageContext();\n const { mutes } = useChatContext();\n const { t } = useTranslationContext();\n\n const isMuted = isUserMuted(message, mutes);\n return (\n <ContextMenuButton\n aria-label={isMuted ? t('aria/Unmute User') : t('aria/Mute User')}\n className={msgActionsBoxButtonClassName}\n Icon={isMuted ? IconVolumeFull : IconMute}\n onClick={(event) => {\n handleMute(event);\n closeMenu();\n }}\n >\n {isMuted ? t('Unmute') : t('Mute')}\n </ContextMenuButton>\n );\n },\n Delete() {\n const { closeMenu } = useContextMenuContext();\n const { client } = useChatContext();\n const { Modal = GlobalModal } = useComponentContext();\n const { handleDelete } = useMessageContext();\n const panel = useNotificationTarget();\n const { t } = useTranslationContext();\n const [openModal, setOpenModal] = useState(false);\n\n return (\n <>\n <ContextMenuButton\n aria-label={t('aria/Delete Message')}\n className={msgActionsBoxButtonClassName}\n Icon={IconTrashBin}\n onClick={() => {\n setOpenModal(true);\n }}\n variant='destructive'\n >\n {t('Delete message')}\n </ContextMenuButton>\n <Modal open={openModal}>\n <DeleteMessageAlert\n onCancel={() => {\n setOpenModal(false);\n closeMenu();\n }}\n onDelete={async () => {\n try {\n await handleDelete();\n client.notifications.addSuccess({\n message: t('Message deleted'),\n options: {\n tags: addNotificationTargetTag(panel),\n },\n origin: { emitter: 'MessageActions' },\n });\n } catch {\n // Error notification is handled by useDeleteHandler.\n } finally {\n setOpenModal(false);\n closeMenu();\n }\n }}\n />\n </Modal>\n </>\n );\n },\n BlockUser() {\n const { closeMenu } = useContextMenuContext();\n const { client } = useChatContext();\n const { message } = useMessageContext();\n const { t } = useTranslationContext();\n const isBlocked =\n !message.user?.id ||\n new Set(client.blockedUsers.getLatestValue().userIds).has(message.user?.id);\n\n return (\n <ContextMenuButton\n aria-label={isBlocked ? t('aria/Unblock User') : t('aria/Block User')}\n className={clsx(msgActionsBoxButtonClassName)}\n Icon={isBlocked ? IconPeopleAdded : IconCircleBanSign}\n onClick={() => {\n const targetId = message.user?.id;\n if (targetId) {\n if (isBlocked) client.unBlockUser(targetId);\n else client.blockUser(targetId);\n }\n closeMenu();\n }}\n >\n {isBlocked ? t('Unblock User') : t('Block User')}\n </ContextMenuButton>\n );\n },\n },\n quick: {\n React() {\n return <ReactionSelectorWithButton ReactionIcon={IconEmojiSmile} />;\n },\n Reply() {\n const { handleOpenThread } = useMessageContext();\n const { t } = useTranslationContext();\n\n return (\n <QuickMessageActionsButton\n aria-label={t('aria/Open Thread')}\n className='str-chat__message-reply-in-thread-button'\n data-testid='thread-action'\n onClick={handleOpenThread}\n >\n <IconArrowShareLeft className='str-chat__message-action-icon' />\n </QuickMessageActionsButton>\n );\n },\n },\n};\n\nexport const defaultMessageActionSet: MessageActionSetItem[] = [\n // { placement: 'dropdown', type: 'block' },\n {\n Component: DefaultMessageActionComponents.quick.Reply,\n placement: 'quick',\n type: 'reply',\n },\n {\n Component: DefaultMessageActionComponents.quick.React,\n placement: 'quick',\n type: 'react',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.ThreadReply,\n placement: 'dropdown',\n type: 'reply',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.Quote,\n placement: 'dropdown',\n type: 'quote',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.Pin,\n placement: 'dropdown',\n type: 'pin',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.CopyMessageText,\n placement: 'dropdown',\n type: 'copyMessageText',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.Resend,\n placement: 'dropdown',\n type: 'resendMessage',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.Edit,\n placement: 'dropdown',\n type: 'edit',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.MarkUnread,\n placement: 'dropdown',\n type: 'markUnread',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.RemindMe,\n placement: 'dropdown',\n type: 'remindMe',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.SaveForLater,\n placement: 'dropdown',\n type: 'saveForLater',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.Flag,\n placement: 'dropdown',\n type: 'flag',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.Mute,\n placement: 'dropdown',\n type: 'mute',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.Delete,\n placement: 'dropdown',\n type: 'delete',\n },\n {\n Component: DefaultMessageActionComponents.dropdown.BlockUser,\n placement: 'dropdown',\n type: 'blockUser',\n },\n] as const;\n","import { useCallback, useEffect, useState } from 'react';\nimport type { ReactionResponse, ReactionSort } from 'stream-chat';\nimport type { MessageContextValue } from '../../../context';\nimport { useMessageContext } from '../../../context';\n\nimport type { ReactionType } from '../types';\n\nexport interface FetchReactionsOptions {\n reactionType: ReactionType | null;\n shouldFetch: boolean;\n handleFetchReactions?: MessageContextValue['handleFetchReactions'];\n sort?: ReactionSort;\n}\n\nexport function useFetchReactions(options: FetchReactionsOptions) {\n const { handleFetchReactions: contextHandleFetchReactions } =\n useMessageContext('useFetchReactions');\n const [reactions, setReactions] = useState<ReactionResponse[]>([]);\n const {\n handleFetchReactions: propHandleFetchReactions,\n reactionType,\n shouldFetch,\n sort,\n } = options;\n const [isLoading, setIsLoading] = useState(shouldFetch);\n const handleFetchReactions = propHandleFetchReactions ?? contextHandleFetchReactions;\n const [refetchNonce, setRefetchNonce] = useState<number | null>(null);\n\n useEffect(() => {\n if (!shouldFetch || !reactionType) {\n return;\n }\n\n let cancel = false;\n\n (async () => {\n try {\n setIsLoading(true);\n const reactions = await handleFetchReactions(reactionType, sort);\n\n if (!cancel) {\n setReactions(reactions);\n }\n } catch (e) {\n if (!cancel) {\n setReactions([]);\n }\n } finally {\n if (!cancel) {\n setIsLoading(false);\n }\n }\n })();\n\n return () => {\n cancel = true;\n };\n }, [handleFetchReactions, reactionType, shouldFetch, sort, refetchNonce]);\n\n const refetch = useCallback(() => {\n setRefetchNonce(Math.random());\n }, []);\n\n return { isLoading, reactions, refetch };\n}\n","import React, { useMemo } from 'react';\n\nimport type { ReactionDetailsComparator, ReactionSummary, ReactionType } from './types';\n\nimport { useFetchReactions } from './hooks/useFetchReactions';\nimport { Avatar as DefaultAvatar } from '../Avatar';\nimport type { MessageContextValue } from '../../context';\nimport {\n useChatContext,\n useComponentContext,\n useMessageContext,\n useTranslationContext,\n} from '../../context';\nimport type { ReactionSort } from 'stream-chat';\n\nexport type MessageReactionsDetailProps = Partial<\n Pick<MessageContextValue, 'handleFetchReactions' | 'reactionDetailsSort'>\n> & {\n reactions: ReactionSummary[];\n selectedReactionType: ReactionType | null;\n onSelectedReactionTypeChange?: (reactionType: ReactionType | null) => void;\n sort?: ReactionSort;\n /** @deprecated use `sort` instead */\n sortReactionDetails?: ReactionDetailsComparator;\n totalReactionCount?: number;\n};\n\nconst defaultReactionDetailsSort = { created_at: -1 } as const;\n\nexport function MessageReactionsDetail({\n handleFetchReactions,\n onSelectedReactionTypeChange,\n reactionDetailsSort: propReactionDetailsSort,\n reactions,\n selectedReactionType,\n sortReactionDetails: propSortReactionDetails,\n totalReactionCount,\n}: MessageReactionsDetailProps) {\n const { client } = useChatContext();\n const { Avatar = DefaultAvatar } = useComponentContext(MessageReactionsDetail.name);\n const { t } = useTranslationContext();\n\n const {\n handleReaction: contextHandleReaction,\n reactionDetailsSort: contextReactionDetailsSort,\n sortReactionDetails: contextSortReactionDetails,\n } = useMessageContext(MessageReactionsDetail.name);\n\n const legacySortReactionDetails = propSortReactionDetails ?? contextSortReactionDetails;\n\n const reactionDetailsSort =\n propReactionDetailsSort ?? contextReactionDetailsSort ?? defaultReactionDetailsSort;\n\n const {\n isLoading: areReactionsLoading,\n reactions: reactionDetails,\n refetch,\n } = useFetchReactions({\n handleFetchReactions,\n reactionType: selectedReactionType,\n shouldFetch: true,\n sort: reactionDetailsSort,\n });\n\n const reactionDetailsWithLegacyFallback = useMemo(\n () =>\n legacySortReactionDetails\n ? [...reactionDetails].sort(legacySortReactionDetails)\n : reactionDetails,\n [legacySortReactionDetails, reactionDetails],\n );\n\n return (\n <div\n className='str-chat__message-reactions-detail'\n data-testid='reactions-list-modal'\n >\n {typeof totalReactionCount === 'number' && (\n <div className='str-chat__message-reactions-detail__total-count'>\n {t('{{ count }} reactions', { count: totalReactionCount })}\n </div>\n )}\n <div className='str-chat__message-reactions-detail__reaction-type-list-container'>\n <ul className='str-chat__message-reactions-detail__reaction-type-list'>\n {reactions.map(\n ({ EmojiComponent, reactionCount, reactionType }) =>\n EmojiComponent && (\n <li\n className='str-chat__message-reactions-detail__reaction-type-list-item'\n key={reactionType}\n >\n <button\n aria-pressed={reactionType === selectedReactionType}\n className='str-chat__message-reactions-detail__reaction-type-list-item-button'\n onClick={() => onSelectedReactionTypeChange?.(reactionType)}\n >\n <span className='str-chat__message-reactions-detail__reaction-type-list-item-icon'>\n <EmojiComponent />\n </span>\n {reactionCount > 1 && (\n <span\n className='str-chat__message-reactions-detail__reaction-type-list-item-count'\n data-testclass='message-reactions-item-count'\n >\n {reactionCount}\n </span>\n )}\n </button>\n </li>\n ),\n )}\n </ul>\n </div>\n <div\n className='str-chat__message-reactions-detail__user-list'\n data-testid='all-reacting-users'\n >\n {areReactionsLoading && (\n <>\n <div className='str-chat__message-reactions-detail__skeleton-item'>\n <div className='str-chat__message-reactions-detail__skeleton-avatar' />\n <div className='str-chat__message-reactions-detail__skeleton-line' />\n </div>\n <div className='str-chat__message-reactions-detail__skeleton-item'>\n <div className='str-chat__message-reactions-detail__skeleton-avatar' />\n <div className='str-chat__message-reactions-detail__skeleton-line' />\n </div>\n <div className='str-chat__message-reactions-detail__skeleton-item'>\n <div className='str-chat__message-reactions-detail__skeleton-avatar' />\n <div className='str-chat__message-reactions-detail__skeleton-line' />\n </div>\n </>\n )}\n {!areReactionsLoading && (\n <>\n {reactionDetailsWithLegacyFallback.map(({ user }) => {\n const belongsToCurrentUser = client.user?.id === user?.id;\n return (\n <div\n className='str-chat__message-reactions-detail__user-list-item'\n key={user?.id}\n >\n <Avatar\n className='str-chat__avatar--with-border'\n data-testid='avatar'\n imageUrl={user?.image as string | undefined}\n size='md'\n userName={user?.name || user?.id}\n />\n <div className='str-chat__message-reactions-detail__user-list-item-info'>\n <span\n className='str-chat__message-reactions-detail__user-list-item-username'\n data-testid='reaction-user-username'\n >\n {belongsToCurrentUser ? t('You') : user?.name || user?.id}\n </span>\n {belongsToCurrentUser && selectedReactionType && (\n <button\n className='str-chat__message-reactions-detail__user-list-item-button'\n data-testid='remove-reaction-button'\n onClick={(e) => {\n contextHandleReaction(selectedReactionType, e).then(() => {\n refetch();\n });\n }}\n >\n {t('Tap to remove')}\n </button>\n )}\n </div>\n </div>\n );\n })}\n </>\n )}\n </div>\n </div>\n );\n}\n","import { useCallback, useMemo } from 'react';\n\nimport { useComponentContext, useMessageContext } from '../../../context';\nimport { defaultReactionOptions } from '../reactionOptions';\n\nimport type { MessageReactionsProps } from '../MessageReactions';\nimport type { ReactionsComparator, ReactionSummary } from '../types';\n\ntype UseProcessReactionsParams = Pick<\n MessageReactionsProps,\n | 'own_reactions'\n | 'reaction_counts'\n | 'reaction_groups'\n | 'reactionOptions'\n | 'reactions'\n> & {\n sortReactions?: ReactionsComparator;\n};\n\nexport const defaultReactionsSort: ReactionsComparator = (a, b) => {\n if (a.firstReactionAt && b.firstReactionAt) {\n return +a.firstReactionAt - +b.firstReactionAt;\n }\n\n return a.reactionType.localeCompare(b.reactionType, 'en');\n};\n\nexport const useProcessReactions = (params: UseProcessReactionsParams) => {\n const {\n own_reactions: propOwnReactions,\n reaction_groups: propReactionGroups,\n reactionOptions: propReactionOptions,\n reactions: propReactions,\n sortReactions: propSortReactions,\n } = params;\n const { message, sortReactions: contextSortReactions } =\n useMessageContext('useProcessReactions');\n const { reactionOptions: contextReactionOptions = defaultReactionOptions } =\n useComponentContext('useProcessReactions');\n\n const reactionOptions = propReactionOptions ?? contextReactionOptions;\n const sortReactions = propSortReactions ?? contextSortReactions ?? defaultReactionsSort;\n const latestReactions = propReactions || message.latest_reactions;\n const ownReactions = propOwnReactions || message?.own_reactions;\n const reactionGroups = propReactionGroups || message?.reaction_groups;\n\n const isOwnReaction = useCallback(\n (reactionType: string) =>\n ownReactions?.some((reaction) => reaction.type === reactionType) ?? false,\n [ownReactions],\n );\n\n const getEmojiByReactionType = useCallback(\n (reactionType: string) => {\n if (Array.isArray(reactionOptions)) {\n return (\n reactionOptions.find(({ type }) => type === reactionType)?.Component ?? null\n );\n }\n\n return (\n reactionOptions.quick[reactionType]?.Component ??\n reactionOptions.extended?.[reactionType]?.Component ??\n null\n );\n },\n [reactionOptions],\n );\n\n const isSupportedReaction = useCallback(\n (reactionType: string) => {\n if (Array.isArray(reactionOptions)) {\n return reactionOptions.some(\n (reactionOption) => reactionOption.type === reactionType,\n );\n }\n\n return (\n typeof reactionOptions.quick[reactionType] !== 'undefined' ||\n typeof reactionOptions.extended?.[reactionType] !== 'undefined'\n );\n },\n [reactionOptions],\n );\n\n /**\n * Amount of unique reaction types (\"haha\", \"like\", etc.) on a message.\n */\n const uniqueReactionTypeCount = useMemo(() => {\n if (!reactionGroups) {\n return 0;\n }\n\n return Object.keys(reactionGroups).filter((reactionType) =>\n isSupportedReaction(reactionType),\n ).length;\n }, [isSupportedReaction, reactionGroups]);\n\n const getLatestReactedUserNames = useCallback(\n (reactionType?: string) =>\n latestReactions?.flatMap((reaction) => {\n if (reactionType && reactionType === reaction.type) {\n const username = reaction.user?.name || reaction.user?.id;\n return username ? [username] : [];\n }\n return [];\n }) ?? [],\n [latestReactions],\n );\n\n const existingReactions: ReactionSummary[] = useMemo(() => {\n if (!reactionGroups) {\n return [];\n }\n\n const unsortedReactions = Object.entries(reactionGroups).flatMap(\n ([reactionType, { count, first_reaction_at, last_reaction_at }]) => {\n if (count === 0 || !isSupportedReaction(reactionType)) {\n return [];\n }\n\n const latestReactedUserNames = getLatestReactedUserNames(reactionType);\n\n return [\n {\n EmojiComponent: getEmojiByReactionType(reactionType),\n firstReactionAt: first_reaction_at ? new Date(first_reaction_at) : null,\n isOwnReaction: isOwnReaction(reactionType),\n lastReactionAt: last_reaction_at ? new Date(last_reaction_at) : null,\n latestReactedUserNames,\n reactionCount: count,\n reactionType,\n unlistedReactedUserCount: count - latestReactedUserNames.length,\n },\n ];\n },\n );\n\n return unsortedReactions.sort(sortReactions);\n }, [\n getEmojiByReactionType,\n getLatestReactedUserNames,\n isOwnReaction,\n isSupportedReaction,\n reactionGroups,\n sortReactions,\n ]);\n\n const hasReactions = existingReactions.length > 0;\n\n const totalReactionCount = useMemo(\n () =>\n Object.values(reactionGroups ?? {}).reduce((total, { count }) => total + count, 0),\n\n [reactionGroups],\n );\n\n return {\n existingReactions,\n hasReactions,\n totalReactionCount,\n uniqueReactionTypeCount,\n } as const;\n};\n","import React, {\n type ComponentPropsWithoutRef,\n type ComponentRef,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport clsx from 'clsx';\n\nimport { MessageReactionsDetail as DefaultMessageReactionsDetail } from './MessageReactionsDetail';\nimport { useProcessReactions } from './hooks/useProcessReactions';\nimport type { MessageContextValue } from '../../context';\nimport {\n useComponentContext,\n useMessageContext,\n useTranslationContext,\n} from '../../context';\n\nimport { MAX_MESSAGE_REACTIONS_TO_FETCH } from '../Message/hooks';\n\nimport type { ReactionGroupResponse, ReactionResponse } from 'stream-chat';\nimport type { ReactionOptions } from './reactionOptions';\nimport type {\n ReactionDetailsComparator,\n ReactionsComparator,\n ReactionType,\n} from './types';\nimport { DialogAnchor, useDialogOnNearestManager } from '../Dialog';\n\nexport type MessageReactionsProps = Partial<\n Pick<MessageContextValue, 'handleFetchReactions' | 'reactionDetailsSort'>\n> & {\n /** An array of the own reaction objects to distinguish own reactions visually */\n own_reactions?: ReactionResponse[];\n /**\n * An object that keeps track of the count of each type of reaction on a message\n * @deprecated This override value is no longer taken into account. Use `reaction_groups` to override reaction counts instead.\n * */\n reaction_counts?: Record<string, number>;\n /** An object containing summary for each reaction type on a message */\n reaction_groups?: Record<string, ReactionGroupResponse>;\n /**\n * @deprecated\n * A list of the currently supported reactions on a message\n * */\n reactionOptions?: ReactionOptions;\n /** An array of the reaction objects to display in the list */\n reactions?: ReactionResponse[];\n /** Display the reactions in the list in reverse order, defaults to false */\n reverse?: boolean;\n /** Comparator function to sort the list of reacted users\n * @deprecated use `reactionDetailsSort` instead\n */\n sortReactionDetails?: ReactionDetailsComparator;\n /** Comparator function to sort reactions, defaults to chronological order */\n sortReactions?: ReactionsComparator;\n\n /**\n * Positioning of the reactions list relative to the message. Position is flipped by default for the messages of other users.\n */\n flipHorizontalPosition?: boolean;\n verticalPosition?: 'top' | 'bottom' | null;\n visualStyle?: 'clustered' | 'segmented' | null;\n};\n\n/**\n * Renders a button if `buttonIf` is true, otherwise renders a fragment. No props but children are passed to fragment, but all props are passed to button if it's rendered.\n */\nconst FragmentOrButton = ({\n buttonIf: renderButton = false,\n children,\n ...props\n}: ComponentPropsWithoutRef<'button'> & { buttonIf?: boolean }) => {\n if (renderButton) {\n return <button {...props}>{children}</button>;\n }\n\n return <>{children}</>;\n};\n\nconst UnMemoizedMessageReactions = (props: MessageReactionsProps) => {\n const {\n flipHorizontalPosition = false,\n handleFetchReactions,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n reactionDetailsSort,\n sortReactionDetails,\n verticalPosition = 'top',\n visualStyle = 'clustered',\n ...rest\n } = props;\n\n const { existingReactions, hasReactions, totalReactionCount, uniqueReactionTypeCount } =\n useProcessReactions(rest);\n const [selectedReactionType, setSelectedReactionType] = useState<ReactionType | null>(\n null,\n );\n const { t } = useTranslationContext('MessageReactions');\n const { MessageReactionsDetail = DefaultMessageReactionsDetail } =\n useComponentContext();\n const { isMyMessage, message } = useMessageContext('MessageReactions');\n\n const divRef = useRef<ComponentRef<'div'>>(null);\n const dialogId = `message-reactions-detail-${message.id}`;\n const { dialog, dialogManager } = useDialogOnNearestManager({ id: dialogId });\n\n const handleReactionButtonClick = (reactionType: ReactionType | null) => {\n if (totalReactionCount > MAX_MESSAGE_REACTIONS_TO_FETCH) {\n return;\n }\n\n setSelectedReactionType(reactionType);\n\n dialog.open();\n };\n\n /**\n * In segmented style with top position we show max 4 reactions and a\n * count of the rest, so we need to cap the existing reactions to display\n * at 4 and calculate the count of the rest.\n */\n const cappedExistingReactions = useMemo(() => {\n if (visualStyle !== 'segmented' || verticalPosition !== 'top') return null;\n\n const sliced = existingReactions.slice(0, 4);\n return {\n reactionCountToDisplay: sliced.reduce(\n (accumulatedCount, { reactionCount }) => accumulatedCount + reactionCount,\n 0,\n ),\n reactionsToDisplay: sliced,\n };\n }, [existingReactions, verticalPosition, visualStyle]);\n\n if (!hasReactions) return null;\n\n return (\n <>\n <div\n aria-label={t('aria/Reaction list')}\n className={clsx('str-chat__message-reactions', {\n [`str-chat__message-reactions--flipped-horizontally`]: flipHorizontalPosition,\n [`str-chat__message-reactions--${verticalPosition}`]:\n typeof verticalPosition === 'string',\n [`str-chat__message-reactions--${visualStyle}`]:\n typeof visualStyle === 'string',\n })}\n ref={divRef}\n role='figure'\n >\n <FragmentOrButton\n buttonIf={visualStyle === 'clustered'}\n className='str-chat__message-reactions__list-button'\n onClick={() =>\n handleReactionButtonClick(existingReactions[0]?.reactionType ?? null)\n }\n >\n <ul className='str-chat__message-reactions__list'>\n {(cappedExistingReactions?.reactionsToDisplay ?? existingReactions).map(\n ({ EmojiComponent, reactionCount, reactionType }) =>\n EmojiComponent && (\n <li\n className='str-chat__message-reactions__list-item'\n key={reactionType}\n >\n <FragmentOrButton\n buttonIf={visualStyle === 'segmented'}\n className='str-chat__message-reactions__list-item-button'\n onClick={() => handleReactionButtonClick(reactionType)}\n >\n <span className='str-chat__message-reactions__list-item-icon'>\n <EmojiComponent />\n </span>\n {visualStyle === 'segmented' && reactionCount > 1 && (\n <span\n className='str-chat__message-reactions__list-item-count'\n data-testclass='message-reactions-item-count'\n >\n {reactionCount}\n </span>\n )}\n </FragmentOrButton>\n </li>\n ),\n )}\n {uniqueReactionTypeCount > 4 && cappedExistingReactions && (\n <li className='str-chat__message-reactions__list-item str-chat__message-reactions__list-item--more'>\n <button\n className='str-chat__message-reactions__list-item-button'\n onClick={() =>\n handleReactionButtonClick(\n existingReactions.at(-1)?.reactionType ?? null,\n )\n }\n >\n <span className='str-chat__message-reactions__overflow-count'>\n +{totalReactionCount - cappedExistingReactions.reactionCountToDisplay}\n </span>\n </button>\n </li>\n )}\n </ul>\n {visualStyle === 'clustered' && (\n <span className='str-chat__message-reactions__total-count'>\n {totalReactionCount}\n </span>\n )}\n </FragmentOrButton>\n </div>\n\n <DialogAnchor\n dialogManagerId={dialogManager?.id}\n id={dialogId}\n offset={8}\n placement={isMyMessage() ? 'bottom-end' : 'bottom-start'}\n referenceElement={divRef.current}\n trapFocus\n updatePositionOnContentResize\n >\n <MessageReactionsDetail\n handleFetchReactions={handleFetchReactions}\n onSelectedReactionTypeChange={setSelectedReactionType}\n reactions={existingReactions}\n selectedReactionType={selectedReactionType}\n sortReactionDetails={sortReactionDetails}\n totalReactionCount={totalReactionCount}\n />\n </DialogAnchor>\n </>\n );\n};\n\n/**\n * Component that displays a list of reactions on a message.\n */\nexport const MessageReactions = React.memo(\n UnMemoizedMessageReactions,\n) as typeof UnMemoizedMessageReactions;\n","import type { ForwardedRef, MutableRefObject } from 'react';\n\nexport const isMutableRef = <T>(\n ref: ForwardedRef<T> | null,\n): ref is MutableRefObject<T> => {\n if (ref) {\n return (ref as MutableRefObject<T>).current !== undefined;\n }\n return false;\n};\n\nexport const getImageDimensions = (source: string) =>\n new Promise<[number, number]>((resolve, reject) => {\n const image = new Image();\n\n image.addEventListener(\n 'load',\n () => {\n resolve([image.width, image.height]);\n },\n { once: true },\n );\n\n image.addEventListener('error', () => reject(`Couldn't load image from ${source}`), {\n once: true,\n });\n\n image.src = source;\n });\n","import React, { useEffect, useState } from 'react';\n\nimport { getImageDimensions } from './utils/utils';\n\nexport type SpriteImageProps = {\n columns: number;\n position: [number, number];\n rows: number;\n spriteUrl: string;\n fallback?: React.ReactNode;\n height?: number;\n style?: React.CSSProperties;\n width?: number;\n};\n\nexport const SpriteImage = ({\n columns,\n fallback,\n height,\n position,\n rows,\n spriteUrl,\n style,\n width,\n}: SpriteImageProps) => {\n const [[spriteWidth, spriteHeight], setSpriteDimensions] = useState([0, 0]);\n\n useEffect(() => {\n getImageDimensions(spriteUrl).then(setSpriteDimensions).catch(console.error);\n }, [spriteUrl]);\n\n const [x, y] = position;\n\n if (!spriteHeight || !spriteWidth) return <>{fallback}</>;\n\n return (\n <div\n data-testid='sprite-image'\n style={\n {\n ...style,\n '--str-chat__sprite-image-resize-ratio':\n 'var(--str-chat__sprite-image-resize-ratio-x, var(--str-chat__sprite-image-resize-ratio-y, 1))',\n '--str-chat__sprite-image-resize-ratio-x':\n 'calc(var(--str-chat__sprite-image-width) / var(--str-chat__sprite-item-width))',\n '--str-chat__sprite-image-resize-ratio-y':\n 'calc(var(--str-chat__sprite-image-height) / var(--str-chat__sprite-item-height))',\n '--str-chat__sprite-item-height': `${spriteHeight / rows}`,\n '--str-chat__sprite-item-width': `${spriteWidth / columns}`,\n ...(Number.isFinite(height)\n ? { '--str-chat__sprite-image-height': `${height}px` }\n : {}),\n ...(Number.isFinite(width)\n ? { '--str-chat__sprite-image-width': `${width}px` }\n : {}),\n backgroundImage: `url('${spriteUrl}')`,\n backgroundPosition: `${x * (100 / (columns - 1))}% ${y * (100 / (rows - 1))}%`,\n backgroundSize: `${columns * 100}% ${rows * 100}%`,\n height:\n 'var(--str-chat__sprite-image-height, calc(var(--str-chat__sprite-item-height) * var(--str-chat__sprite-image-resize-ratio)))',\n width:\n 'var(--str-chat__sprite-image-width, calc(var(--str-chat__sprite-item-width) * var(--str-chat__sprite-image-resize-ratio)))',\n } as React.CSSProperties\n }\n />\n );\n};\n","import React from 'react';\n\nimport type { SpriteImageProps } from './SpriteImage';\nimport { SpriteImage } from './SpriteImage';\n\nimport type { Readable } from '../../types/types';\n\nconst StreamSpriteEmojiPositions = {\n angry: [1, 1],\n haha: [1, 0],\n like: [0, 0],\n love: [1, 2],\n sad: [0, 1],\n wow: [0, 2],\n};\n\ntype StreamEmojiType = keyof typeof StreamSpriteEmojiPositions;\n\nconst STREAM_SPRITE_URL = 'https://getstream.imgix.net/images/emoji-sprite.png';\n\n/**\n * @deprecated\n */\nexport const StreamEmoji = ({\n fallback,\n type,\n}: Readable<{ type: StreamEmojiType } & Pick<SpriteImageProps, 'fallback'>>) => {\n const position = StreamSpriteEmojiPositions[type] as [number, number];\n return (\n <SpriteImage\n columns={2}\n fallback={fallback}\n position={position}\n rows={3}\n spriteUrl={STREAM_SPRITE_URL}\n style={\n {\n '--str-chat__sprite-image-height': 'var(--str-chat__stream-emoji-size, 18px)',\n } as React.CSSProperties\n }\n />\n );\n};\n","import { useMemo } from 'react';\n\nexport const useSplitActionSet = <\n T extends { placement: 'quick' } | { placement: 'dropdown' },\n>(\n actionSet: T[],\n) =>\n useMemo(() => {\n const quickActionSet: Extract<T, { placement: 'quick' }>[] = [];\n const dropdownActionSet: Extract<T, { placement: 'dropdown' }>[] = [];\n\n for (const action of actionSet) {\n if (action.placement === 'quick')\n quickActionSet.push(action as (typeof quickActionSet)[number]);\n if (action.placement === 'dropdown')\n dropdownActionSet.push(action as (typeof dropdownActionSet)[number]);\n }\n\n return { dropdownActionSet, quickActionSet } as const;\n }, [actionSet]);\n","import clsx from 'clsx';\nimport React, { useMemo, useState } from 'react';\n\nimport { useChatContext, useMessageContext, useTranslationContext } from '../../context';\nimport {\n ContextMenu,\n type ContextMenuItemComponent,\n type ContextMenuItemProps,\n useDialogIsOpen,\n useDialogOnNearestManager,\n} from '../Dialog';\nimport { useBaseMessageActionSetFilter } from './hooks';\nimport { defaultMessageActionSet } from './MessageActions.defaults';\nimport { type MESSAGE_ACTIONS } from '../Message';\nimport { Button } from '../Button';\nimport { ReactionSelector } from '../Reactions';\nimport { useSplitActionSet } from '../Chat/hooks/useSplitActionSet';\nimport { IconDotGrid1x3Horizontal } from '../Icons';\n\ntype BaseMessageActionSetItem = {\n type: keyof typeof MESSAGE_ACTIONS | (string & {});\n};\n\nexport type QuickMessageActionSetItem = BaseMessageActionSetItem & {\n Component: React.ComponentType;\n placement: 'quick';\n};\n\nexport type DropdownMessageActionSetItem = BaseMessageActionSetItem & {\n Component: React.ComponentType<ContextMenuItemProps>;\n placement: 'dropdown';\n};\n\nexport type MessageActionSetItem =\n | QuickMessageActionSetItem\n | DropdownMessageActionSetItem;\n\nexport type MessageActionsProps = {\n disableBaseMessageActionSetFilter?: boolean;\n messageActionSet?: MessageActionSetItem[];\n};\n\n// TODO: allow passing down customWrapperClass\n/**\n * A new actions component to replace current `MessageOptions` component.\n * Exports from `stream-chat-react/experimental` __MIGHT__ change - use with caution\n * and follow release notes in case you notice unexpected behavior.\n */\nexport const MessageActions = ({\n disableBaseMessageActionSetFilter = false,\n messageActionSet = defaultMessageActionSet,\n}: MessageActionsProps) => {\n const { theme } = useChatContext();\n const { isMyMessage, message, threadList } = useMessageContext();\n const { t } = useTranslationContext();\n const [actionsBoxButtonElement, setActionsBoxButtonElement] =\n useState<HTMLSpanElement | null>(null);\n\n const filteredMessageActionSet = useBaseMessageActionSetFilter(\n messageActionSet,\n disableBaseMessageActionSetFilter,\n );\n\n const { dropdownActionSet, quickActionSet } = useSplitActionSet(\n filteredMessageActionSet,\n );\n\n const dropdownDialogId = `message-actions--${message.id}`;\n const reactionSelectorDialogId = ReactionSelector.getDialogId({\n messageId: message.id,\n threadList,\n });\n const { dialog, dialogManager } = useDialogOnNearestManager({ id: dropdownDialogId });\n const dropdownDialogIsOpen = useDialogIsOpen(dropdownDialogId, dialogManager?.id);\n const reactionSelectorDialogIsOpen = useDialogIsOpen(\n reactionSelectorDialogId,\n dialogManager?.id,\n );\n\n const contextMenuItems = useMemo<ContextMenuItemComponent[]>(\n () =>\n dropdownActionSet.map(({ Component }) => {\n const ActionItem: ContextMenuItemComponent = (menuProps) => (\n <Component {...menuProps} />\n );\n return ActionItem;\n }),\n [dropdownActionSet],\n );\n\n // do not render anything if total action count is zero\n if (dropdownActionSet.length + quickActionSet.length === 0) {\n return null;\n }\n\n return (\n <div\n className={clsx(`str-chat__message-${theme}__actions str-chat__message-options`, {\n 'str-chat__message-options--active':\n dropdownDialogIsOpen || reactionSelectorDialogIsOpen,\n })}\n >\n {dropdownActionSet.length > 0 && (\n <>\n <Button\n appearance='ghost'\n aria-expanded={dropdownDialogIsOpen}\n aria-haspopup='true'\n aria-label={t('aria/Open Message Actions Menu')}\n circular\n className='str-chat__message-actions-box-button'\n data-testid='message-actions-toggle-button'\n onClick={() => {\n dialog?.toggle();\n }}\n ref={setActionsBoxButtonElement}\n variant='secondary'\n >\n <IconDotGrid1x3Horizontal className='str-chat__message-action-icon' />\n </Button>\n\n <ContextMenu\n backLabel={t('Back')}\n className={clsx('str-chat__message-actions-box', {\n 'str-chat__message-actions-box--open': dropdownDialogIsOpen,\n })}\n dialogManagerId={dialogManager?.id}\n id={dropdownDialogId}\n items={contextMenuItems}\n onClose={dialog?.close}\n placement={isMyMessage() ? 'top-end' : 'top-start'}\n referenceElement={actionsBoxButtonElement}\n tabIndex={-1}\n trapFocus\n />\n </>\n )}\n {quickActionSet.map(({ Component: QuickActionComponent, type }) => (\n <QuickActionComponent key={type} />\n ))}\n </div>\n );\n};\n","import React, { useMemo, useState } from 'react';\nimport clsx from 'clsx';\nimport { MessageBouncePrompt as DefaultMessageBouncePrompt } from '../MessageBounce';\nimport { MessageDeletedBubble as DefaultMessageDeletedBubble } from './MessageDeletedBubble';\nimport { MessageBlocked as DefaultMessageBlocked } from './MessageBlocked';\nimport { MessageActions as DefaultMessageActions } from '../MessageActions';\nimport { MessageRepliesCountButton as DefaultMessageRepliesCountButton } from './MessageRepliesCountButton';\nimport { MessageStatus as DefaultMessageStatus } from './MessageStatus';\nimport { MessageText } from './MessageText';\nimport { MessageEditedIndicator as DefaultMessageEditedIndicator } from './MessageEditedIndicator';\nimport { MessageTimestamp as DefaultMessageTimestamp } from './MessageTimestamp';\nimport { StreamedMessageText as DefaultStreamedMessageText } from './StreamedMessageText';\nimport { isDateSeparatorMessage } from '../MessageList';\nimport { MessageAlsoSentInChannelIndicator as DefaultMessageAlsoSentInChannelIndicator } from './MessageAlsoSentInChannelIndicator';\nimport { ReminderNotification as DefaultReminderNotification } from './ReminderNotification';\nimport { MessageTranslationIndicator as DefaultMessageTranslationIndicator } from './MessageTranslationIndicator';\nimport { useMessageReminder } from './hooks';\nimport {\n areMessageUIPropsEqual,\n countEmojis,\n isMessageBlocked,\n isMessageBounced,\n isMessageEdited,\n isMessageErrorRetryable,\n messageHasAttachments,\n messageHasGiphyAttachment,\n messageHasReactions,\n messageHasSingleAttachment,\n messageTextHasEmojisOnly,\n} from './utils';\n\nimport { Avatar as DefaultAvatar } from '../Avatar';\nimport { Attachment as DefaultAttachment } from '../Attachment';\nimport { Poll } from '../Poll';\nimport { MessageReactions as DefaultMessageReactions } from '../Reactions';\nimport { MessageBounceModal } from '../MessageBounce/MessageBounceModal';\nimport { useComponentContext } from '../../context/ComponentContext';\nimport type { MessageContextValue } from '../../context/MessageContext';\nimport { useMessageContext } from '../../context/MessageContext';\n\nimport { useChannelStateContext, useChatContext } from '../../context';\n\nimport type { MessageUIComponentProps } from './types';\nimport { PinIndicator as DefaultPinIndicator } from './PinIndicator';\nimport { QuotedMessage as DefaultQuotedMessage } from './QuotedMessage';\nimport { MessageBubble } from './MessageBubble';\nimport { ErrorBadge } from '../Badge';\n\ntype MessageUIWithContextProps = MessageContextValue;\n\nconst MessageUIWithContext = ({\n endOfGroup,\n firstOfGroup,\n groupedByUser,\n handleAction,\n handleOpenThread,\n highlighted,\n isMessageAIGenerated,\n isMyMessage,\n message,\n onUserClick,\n onUserHover,\n renderText,\n showAvatar = 'incoming',\n threadList,\n}: MessageUIWithContextProps) => {\n const { channel } = useChannelStateContext();\n const { client } = useChatContext();\n const [isBounceDialogOpen, setIsBounceDialogOpen] = useState(false);\n const reminder = useMessageReminder(message.id);\n\n const {\n Attachment = DefaultAttachment,\n Avatar = DefaultAvatar,\n MessageActions = DefaultMessageActions,\n MessageAlsoSentInChannelIndicator = DefaultMessageAlsoSentInChannelIndicator,\n MessageBlocked = DefaultMessageBlocked,\n MessageBouncePrompt = DefaultMessageBouncePrompt,\n MessageDeleted,\n MessageDeletedBubble = DefaultMessageDeletedBubble,\n MessageEditedIndicator = DefaultMessageEditedIndicator,\n MessageReactions = DefaultMessageReactions,\n MessageRepliesCountButton = DefaultMessageRepliesCountButton,\n MessageStatus = DefaultMessageStatus,\n MessageTimestamp = DefaultMessageTimestamp,\n MessageTranslationIndicator = DefaultMessageTranslationIndicator,\n PinIndicator = DefaultPinIndicator,\n QuotedMessage = DefaultQuotedMessage,\n ReminderNotification = DefaultReminderNotification,\n StreamedMessageText = DefaultStreamedMessageText,\n } = useComponentContext('MessageUI');\n\n const isAIGenerated = useMemo(\n () => isMessageAIGenerated?.(message),\n [isMessageAIGenerated, message],\n );\n\n const finalAttachments = useMemo(\n () =>\n !message.shared_location && !message.attachments\n ? []\n : !message.shared_location\n ? message.attachments\n : [message.shared_location, ...(message.attachments ?? [])],\n [message],\n );\n\n if (isDateSeparatorMessage(message)) {\n return null;\n }\n\n if (MessageDeleted && (message.deleted_at || message.type === 'deleted')) {\n return <MessageDeleted message={message} />;\n }\n\n if (isMessageBlocked(message)) {\n return <MessageBlocked />;\n }\n\n const poll = message.poll_id && client.polls.fromState(message.poll_id);\n\n const memberCount = Object.keys(channel?.state?.members ?? {}).length;\n const isDeleted = !!message.deleted_at;\n const hasAttachment = !isDeleted && messageHasAttachments(message);\n const hasSingleAttachment = !isDeleted && messageHasSingleAttachment(message);\n const hasGiphyAttachment = !isDeleted && messageHasGiphyAttachment(message);\n const hasReactions = !isDeleted && messageHasReactions(message);\n const textHasEmojisOnly = !isDeleted && messageTextHasEmojisOnly(message);\n\n const allowRetry = isMessageErrorRetryable(message);\n const isBounced = isMessageBounced(message);\n const isEdited = isMessageEdited(message) && !isAIGenerated;\n\n const showMetadata = !groupedByUser || endOfGroup;\n const showReplyCountButton = !threadList && !!message.reply_count;\n\n const rootClassName = clsx(\n 'str-chat__message',\n `str-chat__message--${message.type}`,\n `str-chat__message--${message.status}`,\n {\n 'str-chat__message--has-attachment': hasAttachment,\n 'str-chat__message--has-giphy-attachment': hasGiphyAttachment,\n 'str-chat__message--has-no-text': !message.text,\n 'str-chat__message--has-text': !!message.text,\n // eslint-disable-next-line sort-keys\n 'str-chat__message--has-single-attachment': hasSingleAttachment,\n 'str-chat__message--highlighted': highlighted,\n 'str-chat__message--is-emoji-only': textHasEmojisOnly,\n [`str-chat__message--is-emoji-only-count-${countEmojis(message.text)}`]:\n textHasEmojisOnly,\n 'str-chat__message--me': isMyMessage(),\n 'str-chat__message--other': !isMyMessage(),\n 'str-chat__message--pinned': message.pinned,\n 'str-chat__message--with-avatar': (() => {\n if (!message.user) return false;\n if (showAvatar === 'incoming') return !isMyMessage();\n if (showAvatar === 'outgoing') return isMyMessage();\n return showAvatar;\n })(),\n 'str-chat__message--with-reactions': hasReactions,\n 'str-chat__message-send-can-be-retried':\n message?.status === 'failed' && message?.error?.status !== 403,\n 'str-chat__message-with-thread-link': showReplyCountButton,\n 'str-chat__virtual-message__wrapper--end': endOfGroup,\n 'str-chat__virtual-message__wrapper--first': firstOfGroup,\n 'str-chat__virtual-message__wrapper--group': groupedByUser,\n },\n );\n\n let handleClick: (() => void) | undefined = undefined;\n\n if (isBounced) {\n handleClick = () => setIsBounceDialogOpen(true);\n }\n\n return (\n <>\n {isBounceDialogOpen && (\n <MessageBounceModal\n MessageBouncePrompt={MessageBouncePrompt}\n onClose={() => setIsBounceDialogOpen(false)}\n open={isBounceDialogOpen}\n />\n )}\n <div className={rootClassName} key={message.id}>\n {message.pinned && <PinIndicator message={message} />}\n {message.show_in_channel && <MessageAlsoSentInChannelIndicator />}\n {!!reminder && <ReminderNotification reminder={reminder} />}\n <MessageTranslationIndicator message={message} />\n {message.user && (\n <Avatar\n className='str-chat__avatar--with-border'\n imageUrl={message.user.image}\n onClick={onUserClick}\n onMouseOver={onUserHover}\n size='md'\n userName={message.user.name || message.user.id}\n />\n )}\n <div\n className={clsx('str-chat__message-inner', {\n 'str-chat__message-inner--error': allowRetry || isBounced,\n })}\n data-testid='message-inner'\n onClick={handleClick}\n onKeyUp={handleClick}\n >\n {!isDeleted && <MessageActions />}\n {showReplyCountButton && (\n <MessageRepliesCountButton\n onClick={handleOpenThread}\n reply_count={message.reply_count}\n thread_participants={message.thread_participants}\n />\n )}\n {message.deleted_at ? (\n <MessageDeletedBubble />\n ) : (\n <>\n <MessageBubble>\n {poll && <Poll poll={poll} />}\n {message.quoted_message && <QuotedMessage />}\n {finalAttachments?.length ? (\n <Attachment\n actionHandler={handleAction}\n attachments={finalAttachments}\n />\n ) : null}\n {isAIGenerated ? (\n <StreamedMessageText message={message} renderText={renderText} />\n ) : (\n <MessageText message={message} renderText={renderText} />\n )}\n </MessageBubble>\n <div className='str-chat__message-reactions-host'>\n {hasReactions && <MessageReactions reverse />}\n </div>\n <div className='str-chat__message-error-indicator'>\n <ErrorBadge />\n </div>\n </>\n )}\n </div>\n {showMetadata && (\n <div className='str-chat__message-metadata'>\n <MessageStatus />\n {!isMyMessage() && !!message.user && memberCount > 2 && (\n <span className='str-chat__message-metadata__name'>\n {message.user.name || message.user.id}\n </span>\n )}\n <MessageTimestamp customClass='str-chat__message-metadata__timestamp' />\n {!isDeleted && isEdited && <MessageEditedIndicator />}\n </div>\n )}\n </div>\n </>\n );\n};\n\nconst MemoizedMessageUI = React.memo(\n MessageUIWithContext,\n areMessageUIPropsEqual,\n) as typeof MessageUIWithContext;\n\n/**\n * The default UI component that renders a message and receives functionality and logic from the MessageContext.\n */\nexport const MessageUI = (props: MessageUIComponentProps) => {\n const messageContext = useMessageContext('MessageUI');\n\n return <MemoizedMessageUI {...messageContext} {...props} />;\n};\n","import React, { useCallback, useMemo } from 'react';\n\nimport {\n useActionHandler,\n useDeleteHandler,\n useFlagHandler,\n useMarkUnreadHandler,\n useMentionsHandler,\n useMuteHandler,\n useOpenThreadHandler,\n usePinHandler,\n useReactionHandler,\n useReactionsFetcher,\n useRetryHandler,\n useUserHandler,\n useUserRole,\n} from './hooks';\nimport { areMessagePropsEqual, getMessageActions, MESSAGE_ACTIONS } from './utils';\n\nimport type { MessageContextValue } from '../../context';\nimport {\n MessageProvider,\n useChannelStateContext,\n useChatContext,\n useComponentContext,\n useMessageTranslationViewContext,\n} from '../../context';\nimport { addNotificationTargetTag, useNotificationTarget } from '../Notifications';\n\nimport { MessageUI as DefaultMessageUI } from './MessageUI';\n\nimport type { MessageProps } from './types';\n\ntype MessagePropsToOmit =\n | 'onMentionsClick'\n | 'onMentionsHover'\n | 'openThread'\n | 'retrySendMessage';\n\ntype MessageContextPropsToPick =\n | 'handleAction'\n | 'handleDelete'\n | 'handleFetchReactions'\n | 'handleFlag'\n | 'handleMarkUnread'\n | 'handleMute'\n | 'handleOpenThread'\n | 'handlePin'\n | 'handleReaction'\n | 'handleRetry'\n | 'mutes'\n | 'onMentionsClickMessage'\n | 'onMentionsHoverMessage'\n | 'reactionDetailsSort'\n | 'sortReactions'\n | 'sortReactionDetails';\n\ntype MessageWithContextProps = Omit<MessageProps, MessagePropsToOmit> &\n Pick<MessageContextValue, MessageContextPropsToPick> & {\n canPin: boolean;\n userRoles: ReturnType<typeof useUserRole>;\n };\n\nconst MessageWithContext = (props: MessageWithContextProps) => {\n const {\n canPin,\n Message: propMessage,\n message,\n messageActions = Object.keys(MESSAGE_ACTIONS),\n onUserClick: propOnUserClick,\n onUserHover: propOnUserHover,\n userRoles,\n } = props;\n\n const { client, isMessageAIGenerated } = useChatContext('Message');\n const { channelConfig, read } = useChannelStateContext('Message');\n const { Message: contextMessage } = useComponentContext('Message');\n const { getTranslationView, setTranslationView: setTranslationViewInContext } =\n useMessageTranslationViewContext();\n\n const translationView = getTranslationView(message.id, !!message.i18n);\n const setTranslationView = useCallback(\n (view: 'original' | 'translated') => setTranslationViewInContext(message.id, view),\n [message.id, setTranslationViewInContext],\n );\n\n const actionsEnabled = message.type === 'regular' && message.status === 'received';\n const MessageUIComponent = propMessage ?? contextMessage ?? DefaultMessageUI;\n\n const { onUserClick, onUserHover } = useUserHandler(message, {\n onUserClickHandler: propOnUserClick,\n onUserHoverHandler: propOnUserHover,\n });\n\n const {\n canDelete,\n canEdit,\n canFlag,\n canMarkUnread,\n canMute,\n canQuote,\n canReact,\n canReply,\n isMyMessage,\n } = userRoles;\n\n const messageIsUnread = useMemo(\n () =>\n !!(\n !isMyMessage &&\n client.user?.id &&\n read &&\n (!read[client.user.id] ||\n (message?.created_at &&\n new Date(message.created_at).getTime() >\n read[client.user.id].last_read.getTime()))\n ),\n [client, isMyMessage, message.created_at, read],\n );\n\n const messageActionsHandler = useCallback(\n () =>\n getMessageActions(\n messageActions,\n {\n canDelete,\n canEdit,\n canFlag,\n canMarkUnread,\n canMute,\n canPin,\n canQuote,\n canReact,\n canReply,\n },\n channelConfig,\n ),\n\n [\n messageActions,\n canDelete,\n canEdit,\n canFlag,\n canMarkUnread,\n canMute,\n canPin,\n canQuote,\n canReact,\n canReply,\n channelConfig,\n ],\n );\n\n const {\n canPin: canPinPropToNotPass, // eslint-disable-line @typescript-eslint/no-unused-vars\n messageActions: messageActionsPropToNotPass, // eslint-disable-line @typescript-eslint/no-unused-vars\n onlySenderCanEdit: onlySenderCanEditPropToNotPass, // eslint-disable-line @typescript-eslint/no-unused-vars\n onUserClick: onUserClickPropToNotPass, // eslint-disable-line @typescript-eslint/no-unused-vars\n onUserHover: onUserHoverPropToNotPass, // eslint-disable-line @typescript-eslint/no-unused-vars\n userRoles: userRolesPropToNotPass, // eslint-disable-line @typescript-eslint/no-unused-vars\n ...rest\n } = props;\n\n const messageContextValue: MessageContextValue = {\n ...rest,\n actionsEnabled,\n getMessageActions: messageActionsHandler,\n isMessageAIGenerated,\n isMyMessage: () => isMyMessage,\n messageIsUnread,\n onUserClick,\n onUserHover,\n setTranslationView,\n translationView,\n };\n\n return (\n <MessageProvider value={messageContextValue}>\n <MessageUIComponent />\n </MessageProvider>\n );\n};\n\nconst MemoizedMessage = React.memo(\n MessageWithContext,\n areMessagePropsEqual,\n) as typeof MessageWithContext;\n\n/**\n * The Message component is a context provider which implements all the logic required for rendering\n * an individual message. The actual UI of the message is delegated via the Message prop on Channel.\n */\nexport const Message = (props: MessageProps) => {\n const {\n closeReactionSelectorOnClick,\n disableQuotedMessages,\n getDeleteMessageErrorNotification,\n getFetchReactionsErrorNotification,\n getFlagMessageErrorNotification,\n getFlagMessageSuccessNotification,\n getMarkMessageUnreadErrorNotification,\n getMarkMessageUnreadSuccessNotification,\n getMuteUserErrorNotification,\n getMuteUserSuccessNotification,\n getPinMessageErrorNotification,\n message,\n onlySenderCanEdit = false,\n onMentionsClick: propOnMentionsClick,\n onMentionsHover: propOnMentionsHover,\n openThread: propOpenThread,\n pinPermissions,\n reactionDetailsSort,\n retrySendMessage: propRetrySendMessage,\n sortReactionDetails,\n sortReactions,\n } = props;\n\n const { client } = useChatContext('Message');\n const { highlightedMessageId, mutes } = useChannelStateContext('Message');\n const panel = useNotificationTarget();\n\n const notify = useCallback(\n (text: string, type: 'success' | 'error') => {\n const origin = { emitter: 'Message' };\n const options = { tags: addNotificationTargetTag(panel) };\n if (type === 'error') {\n client.notifications.addError({ message: text, options, origin });\n } else {\n client.notifications.addSuccess({ message: text, options, origin });\n }\n },\n [client, panel],\n );\n\n const handleAction = useActionHandler(message);\n const handleOpenThread = useOpenThreadHandler(message, propOpenThread);\n const handleReaction = useReactionHandler(message);\n const handleRetry = useRetryHandler(propRetrySendMessage);\n const userRoles = useUserRole(message, onlySenderCanEdit, disableQuotedMessages);\n\n const handleFetchReactions = useReactionsFetcher(message, {\n getErrorNotification: getFetchReactionsErrorNotification,\n notify,\n });\n\n const handleDelete = useDeleteHandler(message, {\n getErrorNotification: getDeleteMessageErrorNotification,\n notify,\n });\n\n const handleFlag = useFlagHandler(message, {\n getErrorNotification: getFlagMessageErrorNotification,\n getSuccessNotification: getFlagMessageSuccessNotification,\n notify,\n });\n\n const handleMarkUnread = useMarkUnreadHandler(message, {\n getErrorNotification: getMarkMessageUnreadErrorNotification,\n getSuccessNotification: getMarkMessageUnreadSuccessNotification,\n notify,\n });\n\n const handleMute = useMuteHandler(message, {\n getErrorNotification: getMuteUserErrorNotification,\n getSuccessNotification: getMuteUserSuccessNotification,\n notify,\n });\n\n const { onMentionsClick, onMentionsHover } = useMentionsHandler(message, {\n onMentionsClick: propOnMentionsClick,\n onMentionsHover: propOnMentionsHover,\n });\n\n const { canPin, handlePin } = usePinHandler(message, pinPermissions, {\n getErrorNotification: getPinMessageErrorNotification,\n notify,\n });\n\n const highlighted = highlightedMessageId === message.id;\n\n return (\n <MemoizedMessage\n additionalMessageComposerProps={props.additionalMessageComposerProps}\n autoscrollToBottom={props.autoscrollToBottom}\n canPin={canPin}\n closeReactionSelectorOnClick={closeReactionSelectorOnClick}\n deliveredTo={props.deliveredTo}\n disableQuotedMessages={props.disableQuotedMessages}\n formatDate={props.formatDate}\n groupStyles={props.groupStyles}\n handleAction={handleAction}\n handleDelete={handleDelete}\n handleFetchReactions={handleFetchReactions}\n handleFlag={handleFlag}\n handleMarkUnread={handleMarkUnread}\n handleMute={handleMute}\n handleOpenThread={handleOpenThread}\n handlePin={handlePin}\n handleReaction={handleReaction}\n handleRetry={handleRetry}\n highlighted={highlighted}\n initialMessage={props.initialMessage}\n lastOwnMessage={props.lastOwnMessage}\n lastReceivedId={props.lastReceivedId}\n message={message}\n Message={props.Message}\n messageActions={props.messageActions}\n messageListRect={props.messageListRect}\n mutes={mutes}\n onMentionsClickMessage={onMentionsClick}\n onMentionsHoverMessage={onMentionsHover}\n onUserClick={props.onUserClick}\n onUserHover={props.onUserHover}\n pinPermissions={props.pinPermissions}\n reactionDetailsSort={reactionDetailsSort}\n readBy={props.readBy}\n renderText={props.renderText}\n returnAllReadData={props.returnAllReadData}\n sortReactionDetails={sortReactionDetails}\n sortReactions={sortReactions}\n threadList={props.threadList}\n unsafeHTML={props.unsafeHTML}\n userRoles={userRoles}\n />\n );\n};\n","import React from 'react';\n\nimport { Message } from '../Message/Message';\nimport type { LocalMessage } from 'stream-chat';\n\nexport type GiphyPreviewMessageProps = {\n message: LocalMessage;\n};\n\nexport const GiphyPreviewMessage = (props: GiphyPreviewMessageProps) => {\n const { message } = props;\n\n return (\n <div className='giphy-preview-message'>\n <Message message={message} />\n </div>\n );\n};\n","import { useMemo } from 'react';\n\nimport type { GroupStyle, ProcessMessagesParams, RenderedMessage } from '../../utils';\nimport { getGroupStyles, insertIntro, processMessages } from '../../utils';\n\nimport { useChatContext } from '../../../../context/ChatContext';\nimport { useComponentContext } from '../../../../context/ComponentContext';\n\nimport type { Channel, LocalMessage } from 'stream-chat';\n\nexport const useEnrichedMessages = (args: {\n channel: Channel;\n disableDateSeparator: boolean;\n hideDeletedMessages: boolean;\n hideNewMessageSeparator: boolean;\n messages: LocalMessage[];\n noGroupByUser: boolean;\n groupStyles?: (\n message: RenderedMessage,\n previousMessage: RenderedMessage,\n nextMessage: RenderedMessage,\n noGroupByUser: boolean,\n maxTimeBetweenGroupedMessages?: number,\n ) => GroupStyle;\n headerPosition?: number;\n maxTimeBetweenGroupedMessages?: number;\n reviewProcessedMessage?: ProcessMessagesParams['reviewProcessedMessage'];\n}) => {\n const {\n channel,\n disableDateSeparator,\n groupStyles,\n headerPosition,\n hideDeletedMessages,\n hideNewMessageSeparator,\n maxTimeBetweenGroupedMessages,\n messages,\n noGroupByUser,\n reviewProcessedMessage,\n } = args;\n\n const { client } = useChatContext('useEnrichedMessages');\n const { HeaderComponent } = useComponentContext('useEnrichedMessages');\n\n const lastRead = useMemo(() => channel.lastRead?.(), [channel]);\n\n const enableDateSeparator = !disableDateSeparator;\n\n let messagesWithDates =\n !enableDateSeparator && !hideDeletedMessages && hideNewMessageSeparator\n ? messages\n : processMessages({\n enableDateSeparator,\n hideDeletedMessages,\n hideNewMessageSeparator,\n lastRead,\n messages,\n reviewProcessedMessage,\n userId: client.userID || '',\n });\n\n if (HeaderComponent) {\n messagesWithDates = insertIntro(messagesWithDates, headerPosition);\n }\n\n const groupStylesFn = groupStyles || getGroupStyles;\n const messageGroupStyles = useMemo(\n () =>\n messagesWithDates.reduce<Record<string, GroupStyle>>((acc, message, i) => {\n const style = groupStylesFn(\n message,\n messagesWithDates[i - 1],\n messagesWithDates[i + 1],\n noGroupByUser,\n maxTimeBetweenGroupedMessages,\n );\n if (style) acc[message.id] = style;\n return acc;\n }, {}),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [maxTimeBetweenGroupedMessages, messagesWithDates, noGroupByUser],\n );\n\n return { messageGroupStyles, messages: messagesWithDates };\n};\n","import { useCallback, useEffect, useState } from 'react';\nimport throttle from 'lodash.throttle';\n\nimport type { RenderedMessage } from '../../utils';\n\nconst DATE_SEPARATOR_SELECTOR =\n '.str-chat__date-separator:not(.str-chat__date-separator--floating)';\nconst THROTTLE_MS = 100;\n\nexport type UseFloatingDateSeparatorMessageListParams = {\n disableDateSeparator: boolean;\n listElement: HTMLDivElement | null;\n processedMessages: RenderedMessage[];\n};\n\nexport type UseFloatingDateSeparatorMessageListResult = {\n floatingDate: Date | null;\n showFloatingDate: boolean;\n};\n\n/**\n * For non-virtualized MessageList: uses scroll + DOM query to find which date\n * separator we've scrolled past. Shows floating date when none are visible.\n */\nexport const useFloatingDateSeparatorMessageList = ({\n disableDateSeparator,\n listElement,\n processedMessages,\n}: UseFloatingDateSeparatorMessageListParams): UseFloatingDateSeparatorMessageListResult => {\n const [state, setState] = useState<{ date: Date | null; visible: boolean }>({\n date: null,\n visible: false,\n });\n\n const update = useCallback(() => {\n if (disableDateSeparator || !listElement || processedMessages.length === 0) {\n setState({ date: null, visible: false });\n return;\n }\n\n const separators = listElement.querySelectorAll<HTMLElement>(DATE_SEPARATOR_SELECTOR);\n if (separators.length === 0) {\n setState({ date: null, visible: false });\n return;\n }\n\n const containerRect = listElement.getBoundingClientRect();\n let bestDate: Date | null = null;\n let bestBottom = -Infinity;\n let anyVisible = false;\n\n for (const el of separators) {\n const rect = el.getBoundingClientRect();\n const dataDate = el.getAttribute('data-date');\n if (!dataDate) continue;\n\n const isAboveViewport = rect.bottom < containerRect.top;\n const isVisible =\n rect.top < containerRect.bottom && rect.bottom > containerRect.top;\n\n if (isVisible) {\n anyVisible = true;\n }\n\n if (isAboveViewport && rect.bottom > bestBottom) {\n bestBottom = rect.bottom;\n const d = new Date(dataDate);\n if (!isNaN(d.getTime())) bestDate = d;\n }\n }\n\n setState({\n date: anyVisible ? null : bestDate,\n visible: !anyVisible && bestDate !== null,\n });\n }, [disableDateSeparator, listElement, processedMessages]);\n\n useEffect(() => {\n if (!listElement) return;\n\n const throttled = throttle(update, THROTTLE_MS);\n\n throttled();\n listElement.addEventListener('scroll', throttled);\n\n if (typeof ResizeObserver === 'undefined') {\n return () => {\n listElement.removeEventListener('scroll', throttled);\n throttled.cancel();\n };\n }\n\n const resizeObserver = new ResizeObserver(throttled);\n resizeObserver.observe(listElement);\n\n return () => {\n listElement.removeEventListener('scroll', throttled);\n resizeObserver.disconnect();\n throttled.cancel();\n };\n }, [listElement, update]);\n\n return {\n floatingDate: state.date,\n showFloatingDate: state.visible,\n };\n};\n","import { useMemo } from 'react';\nimport type { Channel, LocalMessage, UserResponse } from 'stream-chat';\n\ntype UseLastReadDataParams = {\n channel: Channel;\n messages: LocalMessage[];\n returnAllReadData: boolean;\n lastOwnMessage?: LocalMessage;\n};\n\nexport const useLastReadData = (props: UseLastReadDataParams) => {\n const { channel, lastOwnMessage, messages, returnAllReadData } = props;\n\n return useMemo(() => {\n if (returnAllReadData) {\n return messages.reduce(\n (acc, msg) => {\n acc[msg.id] = channel.messageReceiptsTracker.readersForMessage({\n msgId: msg.id,\n timestampMs: msg.created_at.getTime(),\n });\n return acc;\n },\n {} as Record<string, UserResponse[]>,\n );\n }\n\n if (!lastOwnMessage) return {};\n return {\n [lastOwnMessage.id]: channel.messageReceiptsTracker.readersForMessage({\n msgId: lastOwnMessage.id,\n timestampMs: lastOwnMessage.created_at.getTime(),\n }),\n };\n }, [channel, lastOwnMessage, messages, returnAllReadData]);\n};\n","import { useCallback, useEffect, useState } from 'react';\nimport type { Channel, LocalMessage, UserResponse } from 'stream-chat';\n\ntype UseLastDeliveredDataParams = {\n channel: Channel;\n messages: LocalMessage[];\n returnAllReadData: boolean;\n lastOwnMessage?: LocalMessage;\n};\n\nexport const useLastDeliveredData = (\n props: UseLastDeliveredDataParams,\n): Record<string, UserResponse[]> => {\n const { channel, lastOwnMessage, messages, returnAllReadData } = props;\n\n const calculateForAll = useCallback(\n () =>\n messages.reduce(\n (acc, msg) => {\n acc[msg.id] = channel.messageReceiptsTracker.deliveredForMessage({\n msgId: msg.id,\n timestampMs: msg.created_at.getTime(),\n });\n return acc;\n },\n {} as Record<string, UserResponse[]>,\n ),\n [channel, messages],\n );\n\n const calculateForLastOwn = useCallback(() => {\n if (!lastOwnMessage) return {};\n return {\n [lastOwnMessage.id]: channel.messageReceiptsTracker.deliveredForMessage({\n msgId: lastOwnMessage.id,\n timestampMs: lastOwnMessage.created_at.getTime(),\n }),\n };\n }, [channel, lastOwnMessage]);\n\n const [deliveredTo, setDeliveredTo] = useState<Record<string, UserResponse[]>>(\n returnAllReadData ? calculateForAll : calculateForLastOwn,\n );\n\n useEffect(() => {\n if (!returnAllReadData) return;\n setDeliveredTo(calculateForAll);\n return channel.on('message.delivered', () => setDeliveredTo(calculateForAll))\n .unsubscribe;\n }, [channel, calculateForAll, returnAllReadData]);\n\n useEffect(() => {\n if (returnAllReadData) return;\n else setDeliveredTo(calculateForLastOwn);\n return channel.on('message.delivered', () => setDeliveredTo(calculateForLastOwn))\n .unsubscribe;\n }, [channel, calculateForLastOwn, returnAllReadData]);\n\n return deliveredTo;\n};\n","import type React from 'react';\nimport { useMemo } from 'react';\n\nimport { useLastReadData } from '../useLastReadData';\nimport type { GroupStyle, RenderedMessage } from '../../utils';\nimport { getLastReceived } from '../../utils';\n\nimport { useChatContext } from '../../../../context/ChatContext';\nimport { useComponentContext } from '../../../../context/ComponentContext';\n\nimport type { LocalMessage } from 'stream-chat';\nimport type { ChannelUnreadUiState } from '../../../../types/types';\nimport type { MessageRenderer, SharedMessageProps } from '../../renderMessages';\nimport { useChannelStateContext } from '../../../../context';\nimport { useLastDeliveredData } from '../useLastDeliveredData';\n\ntype UseMessageListElementsProps = {\n messages: LocalMessage[];\n enrichedMessages: RenderedMessage[];\n internalMessageProps: SharedMessageProps;\n messageGroupStyles: Record<string, GroupStyle>;\n renderMessages: MessageRenderer;\n returnAllReadData: boolean;\n threadList: boolean;\n channelUnreadUiState?: ChannelUnreadUiState;\n lastOwnMessage?: LocalMessage;\n};\n\nexport const useMessageListElements = (props: UseMessageListElementsProps) => {\n const {\n channelUnreadUiState,\n enrichedMessages,\n internalMessageProps,\n lastOwnMessage,\n messageGroupStyles,\n messages,\n renderMessages,\n returnAllReadData,\n threadList,\n } = props;\n\n const { customClasses } = useChatContext('useMessageListElements');\n const { channel } = useChannelStateContext();\n const components = useComponentContext('useMessageListElements');\n\n // get the readData, but only for messages submitted by the user themselves\n const readData = useLastReadData({\n channel,\n lastOwnMessage,\n messages,\n returnAllReadData,\n });\n\n const ownMessagesDeliveredToOthers = useLastDeliveredData({\n channel,\n lastOwnMessage,\n messages,\n returnAllReadData,\n });\n\n const lastReceivedMessageId = useMemo(\n () => getLastReceived(enrichedMessages),\n [enrichedMessages],\n );\n\n const elements: React.ReactNode[] = useMemo(\n () =>\n renderMessages({\n channelUnreadUiState,\n components,\n customClasses,\n lastOwnMessage,\n lastReceivedMessageId,\n messageGroupStyles,\n messages: enrichedMessages,\n ownMessagesDeliveredToOthers,\n readData,\n sharedMessageProps: { ...internalMessageProps, returnAllReadData, threadList },\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n enrichedMessages,\n internalMessageProps,\n lastOwnMessage,\n lastReceivedMessageId,\n messageGroupStyles,\n channelUnreadUiState,\n readData,\n renderMessages,\n returnAllReadData,\n threadList,\n ],\n );\n\n return elements;\n};\n","import { useLayoutEffect, useRef } from 'react';\n\nimport { useChatContext } from '../../../../context/ChatContext';\nimport type { LocalMessage } from 'stream-chat';\n\nexport type ContainerMeasures = {\n offsetHeight: number;\n scrollHeight: number;\n};\n\nexport type UseMessageListScrollManagerParams = {\n captureAnchor: () => { id: string; offsetTop: number } | null;\n disableScrollManagement?: boolean;\n justReachedLatestMessageSet?: boolean;\n loadMoreScrollThreshold: number;\n loadingMore?: boolean;\n messages: LocalMessage[];\n onScrollBy: (scrollBy: number) => void;\n onScrollToTop: () => void;\n restoreAnchor: (anchor: { id: string; offsetTop: number }) => void;\n scrollContainerMeasures: () => ContainerMeasures;\n scrolledUpThreshold: number;\n scrollToBottom: () => void;\n showNewMessages: () => void;\n};\n\n// Tracks how the current older-page pagination cycle should restore the viewport\n// once messages are prepended. The mode is chosen when loading starts and cleared\n// after the prepend has been handled.\n//\n// Modes:\n// - `idle`: there is no active older-page restoration strategy\n// - `stick-to-top`: pagination started from the absolute top, so keep the newly\n// loaded page pinned to the top of the container\n// - `preserve-anchor`: pagination started near the top but not at the absolute\n// top, so restore the captured anchor message to its previous viewport offset\ntype OlderPaginationState =\n | { anchor: null; mode: 'idle' }\n | { anchor: null; mode: 'stick-to-top' }\n | { anchor: { id: string; offsetTop: number }; mode: 'preserve-anchor' };\n\n// An \"anchor\" is the currently visible message row we want to keep visually pinned\n// to the same spot in the viewport while older messages are inserted above it.\n// It stores:\n// - `id`: which rendered message row should stay stable\n// - `offsetTop`: how far that row sits from the top edge of the scroll container\n//\n// After a prepend, the DOM shifts downward. Restoring the anchor means finding the\n// same message row again and correcting scrollTop until it returns to that offset.\n\n// When all previous messages appear at the start of the new array, the growth\n// happened at the bottom of the list.\nconst messageIdsMatchAsPrefix = (\n prevMessages: LocalMessage[],\n newMessages: LocalMessage[],\n) => prevMessages.every((message, index) => message.id === newMessages[index]?.id);\n\n// When all previous messages appear at the end of the new array, the growth\n// happened at the top of the list.\nconst messageIdsMatchAsSuffix = (\n prevMessages: LocalMessage[],\n newMessages: LocalMessage[],\n) =>\n prevMessages.every(\n (message, index) =>\n message.id === newMessages[newMessages.length - prevMessages.length + index]?.id,\n );\n\n/**\n * Coordinates scroll-position preservation when the rendered message array changes.\n *\n * The hook distinguishes three broad cases:\n * 1. Older-page pagination prepends messages at the top of the list.\n * This path either sticks to the top of the new page or restores a captured\n * message anchor, depending on where the user was when pagination started.\n * 2. Newer messages append to the bottom of the list.\n * This path preserves normal chat behavior by auto-scrolling only when the\n * user was already near the bottom or the appended message is the user's own.\n * 3. Disjunct/overlapping page switches.\n * These intentionally bypass prepend heuristics because the old and new arrays\n * are not comparable as a single contiguous list.\n */\nexport function useMessageListScrollManager(params: UseMessageListScrollManagerParams) {\n const {\n captureAnchor,\n disableScrollManagement = false,\n justReachedLatestMessageSet = false,\n loadingMore = false,\n loadMoreScrollThreshold,\n onScrollBy,\n onScrollToTop,\n restoreAnchor,\n scrollContainerMeasures,\n scrolledUpThreshold,\n scrollToBottom,\n showNewMessages,\n } = params;\n\n const { client } = useChatContext('useMessageListScrollManager');\n\n const measures = useRef<ContainerMeasures>({\n offsetHeight: 0,\n scrollHeight: 0,\n });\n const messages = useRef<LocalMessage[]>(undefined);\n const olderPaginationState = useRef<OlderPaginationState>({\n anchor: null,\n mode: 'idle',\n });\n const previousLoadingMoreRef = useRef(loadingMore);\n const scrollTop = useRef(0);\n\n useLayoutEffect(() => {\n if (disableScrollManagement) {\n // Even while management is disabled we still refresh the cached list shape,\n // so the next enabled render compares against the most recent DOM state.\n messages.current = params.messages;\n measures.current = scrollContainerMeasures();\n previousLoadingMoreRef.current = loadingMore;\n return;\n }\n\n const prevMeasures = measures.current;\n const prevMessages = messages.current;\n const newMessages = params.messages;\n const lastNewMessage = newMessages[newMessages.length - 1] || {};\n const lastPrevMessage = prevMessages?.[prevMessages.length - 1];\n const newMeasures = scrollContainerMeasures();\n const startedLoadingOlder = loadingMore && !previousLoadingMoreRef.current;\n const finishedLoadingOlder = !loadingMore && previousLoadingMoreRef.current;\n\n if (startedLoadingOlder) {\n // Older-page pagination uses one of three modes:\n // - `stick-to-top`: user hit the absolute top and wants to keep reading upward\n // - `preserve-anchor`: user was only near the top, so keep the same message in view\n // - `idle`: no restoration needed for this load cycle\n if (scrollTop.current <= 1) {\n olderPaginationState.current = {\n anchor: null,\n mode: 'stick-to-top',\n };\n } else if (scrollTop.current < loadMoreScrollThreshold) {\n const capturedAnchor = captureAnchor();\n if (capturedAnchor) {\n olderPaginationState.current = {\n anchor: capturedAnchor,\n mode: 'preserve-anchor',\n };\n } else {\n olderPaginationState.current = {\n anchor: null,\n mode: 'idle',\n };\n }\n } else {\n olderPaginationState.current = {\n anchor: null,\n mode: 'idle',\n };\n }\n }\n\n // Evaluate bottom proximity from the previous render, before any new content\n // changes the list height and invalidates the prior bottom distance.\n const wasAtBottom =\n prevMeasures.scrollHeight - prevMeasures.offsetHeight - scrollTop.current <\n scrolledUpThreshold;\n\n if (typeof prevMessages !== 'undefined') {\n if (prevMessages.length < newMessages.length) {\n const messagesAddedToTop = messageIdsMatchAsSuffix(prevMessages, newMessages);\n const messagesAddedToBottom = messageIdsMatchAsPrefix(prevMessages, newMessages);\n\n // A clean prepend means older messages were inserted ahead of the current\n // viewport. Restore the viewport according to the mode chosen when loading\n // started, then clear the mode for the next pagination cycle.\n if (messagesAddedToTop) {\n const preservedAnchor =\n olderPaginationState.current.mode === 'preserve-anchor' &&\n olderPaginationState.current.anchor &&\n (finishedLoadingOlder || loadingMore)\n ? olderPaginationState.current.anchor\n : null;\n\n // When pagination was triggered from absolute top, keep the newly\n // loaded page pinned to top instead of restoring the old viewport.\n if (olderPaginationState.current.mode === 'stick-to-top') {\n onScrollToTop();\n } else if (preservedAnchor) {\n restoreAnchor(preservedAnchor);\n } else if (scrollTop.current < loadMoreScrollThreshold) {\n // Fallback for prepends when there is no stable DOM anchor to restore.\n // This is less accurate than anchor restoration, but still avoids a full\n // jump by compensating for the inserted page height.\n const listHeightDelta = newMeasures.scrollHeight - prevMeasures.scrollHeight;\n onScrollBy(listHeightDelta);\n }\n\n olderPaginationState.current = {\n anchor: null,\n mode: 'idle',\n };\n }\n // A clean append means the list grew downward. Preserve the usual chat\n // semantics: auto-scroll only for self-sent messages or when the user was\n // already close enough to bottom.\n else if (messagesAddedToBottom) {\n if (justReachedLatestMessageSet) {\n // Merging into the latest page is handled by dedicated logic higher up.\n // Returning here avoids undoing that behavior with a normal append scroll.\n messages.current = newMessages;\n measures.current = newMeasures;\n previousLoadingMoreRef.current = loadingMore;\n return;\n }\n\n const lastMessageIsFromCurrentUser = lastNewMessage.user?.id === client.userID;\n\n if (lastMessageIsFromCurrentUser || wasAtBottom) {\n scrollToBottom();\n } else {\n showNewMessages();\n }\n } else {\n // If the new page is neither a pure prepend nor a pure append, treat it as\n // a disjunct/overlapping page switch and avoid applying prepend heuristics.\n olderPaginationState.current = {\n anchor: null,\n mode: 'idle',\n };\n }\n }\n // message list length didn't change, but check if last message had reaction/reply update\n else {\n const hasNewReactions =\n lastPrevMessage?.latest_reactions?.length !==\n lastNewMessage.latest_reactions?.length;\n const hasNewReplies = lastPrevMessage?.reply_count !== lastNewMessage.reply_count;\n\n if ((hasNewReactions || hasNewReplies) && wasAtBottom) {\n scrollToBottom();\n }\n\n if (finishedLoadingOlder) {\n // Clear any older-page mode when the request ends without increasing the\n // rendered list size, so the next pagination cycle starts from a clean slate.\n olderPaginationState.current = {\n anchor: null,\n mode: 'idle',\n };\n }\n }\n }\n\n messages.current = newMessages;\n measures.current = newMeasures;\n previousLoadingMoreRef.current = loadingMore;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n captureAnchor,\n disableScrollManagement,\n justReachedLatestMessageSet,\n loadingMore,\n measures,\n messages,\n params.messages,\n restoreAnchor,\n scrollContainerMeasures,\n ]);\n\n return (\n scrollTopValue: number,\n getLatestAnchor: (() => { id: string; offsetTop: number } | null) | null = null,\n ) => {\n scrollTop.current = scrollTopValue;\n\n if (\n loadingMore &&\n getLatestAnchor &&\n olderPaginationState.current.mode === 'preserve-anchor'\n ) {\n // Keep the anchor fresh while the request is in flight so restoration matches\n // the latest viewport position if the user keeps scrolling before data arrives.\n // The getter keeps normal scroll events cheap by avoiding DOM anchor capture\n // unless anchor preservation is actually active.\n const latestAnchor = getLatestAnchor();\n if (!latestAnchor) return;\n\n olderPaginationState.current = {\n anchor: latestAnchor,\n mode: 'preserve-anchor',\n };\n }\n };\n}\n","import type React from 'react';\nimport { useCallback, useLayoutEffect, useRef, useState } from 'react';\n\nimport { useMessageListScrollManager } from './useMessageListScrollManager';\nimport type { LocalMessage } from 'stream-chat';\n\nexport type UseScrollLocationLogicParams = {\n disableAutoScrollToBottom?: boolean;\n disableScrollManagement?: boolean;\n hasMoreNewer: boolean;\n listElement: HTMLDivElement | null;\n loadMoreScrollThreshold: number;\n loadingMore?: boolean;\n suppressAutoscroll: boolean;\n messages?: LocalMessage[];\n scrolledUpThreshold?: number;\n};\n\nexport const useScrollLocationLogic = (params: UseScrollLocationLogicParams) => {\n const {\n disableAutoScrollToBottom = false,\n disableScrollManagement = false,\n hasMoreNewer,\n listElement,\n loadingMore = false,\n loadMoreScrollThreshold,\n messages = [],\n scrolledUpThreshold = 200,\n suppressAutoscroll,\n } = params;\n\n const [hasNewMessages, setHasNewMessages] = useState(false);\n const [wrapperRect, setWrapperRect] = useState<DOMRect>();\n const previousHasMoreNewerRef = useRef(hasMoreNewer);\n const justReachedLatestMessageSet = previousHasMoreNewerRef.current && !hasMoreNewer;\n const skipNextAutoScrollRef = useRef(false);\n const isRestoringOlderAnchorRef = useRef(false);\n\n const [isMessageListScrolledToBottom, setIsMessageListScrolledToBottom] =\n useState(true);\n const closeToBottom = useRef(false);\n const closeToTop = useRef(false);\n const previousScrollTopRef = useRef(0);\n const anchorRestoreCleanupRef = useRef<(() => void) | null>(null);\n\n const captureAnchor = useCallback(() => {\n if (!listElement) return null;\n\n const listRect = listElement.getBoundingClientRect();\n const listTop = listRect.top;\n const listBottom = listRect.bottom;\n const listCenter = listTop + listRect.height / 2;\n // Older-page pagination should track the top edge, while the generic\n // “keep this viewport stable” case works better from the center.\n const preferTopEdgeAnchor =\n loadingMore || listElement.scrollTop < loadMoreScrollThreshold;\n const messageElements = Array.from(\n listElement.querySelectorAll<HTMLElement>('[data-message-id]'),\n );\n const messageAnchors = messageElements.map((element) => {\n const rect = element.getBoundingClientRect();\n return {\n center: rect.top + rect.height / 2,\n element,\n offsetTop: rect.top - listTop,\n rect,\n };\n });\n\n const visibleMessageAnchors = messageAnchors.filter(\n ({ rect }) => rect.bottom > listTop && rect.top < listBottom,\n );\n\n const topEdgeAnchor = visibleMessageAnchors.reduce<\n (typeof visibleMessageAnchors)[number] | null\n >((closest, candidate) => {\n if (!closest || candidate.rect.top < closest.rect.top) {\n return candidate;\n }\n\n return closest;\n }, null);\n\n const centerAnchor =\n visibleMessageAnchors.find(\n ({ rect }) => rect.top <= listCenter && rect.bottom >= listCenter,\n ) ??\n visibleMessageAnchors.reduce<(typeof visibleMessageAnchors)[number] | null>(\n (closest, candidate) => {\n if (!closest) return candidate;\n\n const distance = Math.abs(candidate.center - listCenter);\n const closestDistance = Math.abs(closest.center - listCenter);\n\n return distance < closestDistance ? candidate : closest;\n },\n null,\n );\n\n const anchor =\n (preferTopEdgeAnchor ? topEdgeAnchor : centerAnchor) ?? messageAnchors[0];\n\n if (!anchor?.element.dataset.messageId) return null;\n\n return {\n id: anchor.element.dataset.messageId,\n offsetTop: anchor.offsetTop,\n };\n }, [listElement, loadMoreScrollThreshold, loadingMore]);\n\n const restoreAnchor = useCallback(\n (anchor: { id: string; offsetTop: number }) => {\n if (!listElement) return;\n\n anchorRestoreCleanupRef.current?.();\n\n let cancelled = false;\n let stableFrameCount = 0;\n let frameQueued = false;\n let resizeObserver: ResizeObserver | undefined;\n // eslint-disable-next-line prefer-const\n let settleTimeoutId: ReturnType<typeof setTimeout> | undefined;\n let animationFrameId: number | undefined;\n\n isRestoringOlderAnchorRef.current = true;\n\n const applyAnchor = () => {\n if (cancelled) return true;\n\n const anchorElement = listElement.querySelector<HTMLElement>(\n `[data-message-id='${anchor.id}']`,\n );\n if (!anchorElement) return true;\n\n const listTop = listElement.getBoundingClientRect().top;\n const nextOffsetTop = anchorElement.getBoundingClientRect().top - listTop;\n const offsetDelta = nextOffsetTop - anchor.offsetTop;\n\n if (Math.abs(offsetDelta) > 1) {\n listElement.scrollBy({ top: offsetDelta });\n return false;\n }\n\n return true;\n };\n\n const cleanup = () => {\n cancelled = true;\n frameQueued = false;\n isRestoringOlderAnchorRef.current = false;\n if (typeof animationFrameId !== 'undefined') {\n window.cancelAnimationFrame(animationFrameId);\n }\n if (settleTimeoutId) {\n clearTimeout(settleTimeoutId);\n }\n resizeObserver?.disconnect();\n };\n\n // Keep correcting against the same anchor until the DOM stops shifting.\n const queueNextFrame = () => {\n if (cancelled || frameQueued) return;\n frameQueued = true;\n animationFrameId = window.requestAnimationFrame(() => {\n frameQueued = false;\n const isStable = applyAnchor();\n stableFrameCount = isStable ? stableFrameCount + 1 : 0;\n\n if (stableFrameCount >= 2) {\n cleanup();\n return;\n }\n\n queueNextFrame();\n });\n };\n\n stableFrameCount = applyAnchor() ? 1 : 0;\n queueNextFrame();\n\n // Late media/layout updates can still move the anchor after the first\n // correction, so restart the settle check when the list resizes.\n if (typeof ResizeObserver !== 'undefined') {\n resizeObserver = new ResizeObserver(() => {\n stableFrameCount = 0;\n queueNextFrame();\n });\n resizeObserver.observe(listElement);\n }\n\n settleTimeoutId = setTimeout(() => {\n cleanup();\n }, 1200);\n\n anchorRestoreCleanupRef.current = cleanup;\n },\n [listElement],\n );\n\n useLayoutEffect(\n () => () => {\n anchorRestoreCleanupRef.current?.();\n },\n [],\n );\n\n const scrollToBottom = useCallback(\n (options?: ScrollToOptions) => {\n if (\n !listElement?.scrollTo ||\n hasMoreNewer ||\n isRestoringOlderAnchorRef.current ||\n justReachedLatestMessageSet ||\n suppressAutoscroll\n ) {\n return;\n }\n\n listElement.scrollTo({\n behavior: options?.behavior,\n top: listElement.scrollHeight,\n });\n setHasNewMessages(false);\n },\n [hasMoreNewer, justReachedLatestMessageSet, listElement, suppressAutoscroll],\n );\n\n useLayoutEffect(() => {\n if (listElement) {\n setWrapperRect(listElement.getBoundingClientRect());\n }\n\n if (listElement && justReachedLatestMessageSet) {\n listElement.scrollTop = previousScrollTopRef.current;\n skipNextAutoScrollRef.current = true;\n return;\n }\n\n if (skipNextAutoScrollRef.current) {\n skipNextAutoScrollRef.current = false;\n return;\n }\n\n if (listElement && !disableAutoScrollToBottom && !isRestoringOlderAnchorRef.current) {\n scrollToBottom();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [disableAutoScrollToBottom, justReachedLatestMessageSet, listElement, hasMoreNewer]);\n\n const updateScrollTop = useMessageListScrollManager({\n captureAnchor,\n disableScrollManagement: disableScrollManagement || isRestoringOlderAnchorRef.current,\n justReachedLatestMessageSet,\n loadingMore,\n loadMoreScrollThreshold,\n messages,\n onScrollBy: (scrollBy) => {\n listElement?.scrollBy({ top: scrollBy });\n },\n onScrollToTop: () => {\n if (!listElement) return;\n listElement.scrollTop = 0;\n },\n restoreAnchor,\n\n scrollContainerMeasures: () => ({\n offsetHeight: listElement?.offsetHeight || 0,\n scrollHeight: listElement?.scrollHeight || 0,\n }),\n scrolledUpThreshold,\n scrollToBottom,\n showNewMessages: () => setHasNewMessages(true),\n });\n\n useLayoutEffect(() => {\n previousHasMoreNewerRef.current = hasMoreNewer;\n }, [hasMoreNewer]);\n\n const onScroll = useCallback(\n (event: React.UIEvent<HTMLDivElement>) => {\n const element = event.target as HTMLDivElement;\n const scrollTop = element.scrollTop;\n previousScrollTopRef.current = scrollTop;\n\n updateScrollTop(scrollTop, captureAnchor);\n\n const offsetHeight = element.offsetHeight;\n const scrollHeight = element.scrollHeight;\n\n const prevCloseToBottom = closeToBottom.current;\n closeToBottom.current =\n scrollHeight - (scrollTop + offsetHeight) < scrolledUpThreshold;\n closeToTop.current = scrollTop < scrolledUpThreshold;\n\n if (closeToBottom.current) {\n setHasNewMessages(false);\n }\n if (prevCloseToBottom && !closeToBottom.current) {\n setIsMessageListScrolledToBottom(false);\n } else if (!prevCloseToBottom && closeToBottom.current) {\n setIsMessageListScrolledToBottom(true);\n }\n },\n [captureAnchor, updateScrollTop, closeToTop, closeToBottom, scrolledUpThreshold],\n );\n\n return {\n hasNewMessages,\n isMessageListScrolledToBottom,\n onScroll,\n scrollToBottom,\n wrapperRect,\n };\n};\n","import React from 'react';\nimport type { PropsWithChildrenOnly } from '../../types/types';\n\nexport const MESSAGE_LIST_MAIN_PANEL_CLASS =\n 'str-chat__main-panel-inner str-chat__message-list-main-panel' as const;\n\nexport const MessageListMainPanel = ({ children }: PropsWithChildrenOnly) => (\n <div className={MESSAGE_LIST_MAIN_PANEL_CLASS}>{children}</div>\n);\n","import React from 'react';\nimport { useChannelActionContext, useTranslationContext } from '../../context';\nimport { Button } from '../Button';\nimport { IconCrossMedium } from '../Icons';\n\nexport const UNREAD_MESSAGE_SEPARATOR_CLASS = 'str-chat__unread-messages-separator';\n\nexport type UnreadMessagesSeparatorProps = {\n /**\n * Configuration parameter to determine, whether the unread count is to be shown on the component. Enabled by default.\n */\n showCount?: boolean;\n /**\n * The count of unread messages to be displayed if enabled.\n */\n unreadCount?: number;\n};\n\nexport const UnreadMessagesSeparator = ({\n showCount = true,\n unreadCount,\n}: UnreadMessagesSeparatorProps) => {\n const { t } = useTranslationContext('UnreadMessagesSeparator');\n const { markRead } = useChannelActionContext();\n return (\n <div\n className={UNREAD_MESSAGE_SEPARATOR_CLASS}\n data-testid='unread-messages-separator'\n >\n <div className={'str-chat__unread-messages-separator__text'}>\n {unreadCount && showCount\n ? t('{{count}} unread', { count: unreadCount })\n : t('Unread messages')}\n </div>\n <Button\n appearance='ghost'\n circular\n onClick={() => markRead()}\n size='sm'\n variant='secondary'\n >\n <IconCrossMedium />\n </Button>\n </div>\n );\n};\n","import { useChannelStateContext } from '../../../../context';\nimport { useEffect, useRef, useState } from 'react';\nimport { MESSAGE_LIST_MAIN_PANEL_CLASS } from '../../MessageListMainPanel';\nimport { UNREAD_MESSAGE_SEPARATOR_CLASS } from '../../UnreadMessagesSeparator';\n\nconst targetScrolledAboveVisibleContainerArea = (\n element: Element,\n container?: Element,\n) => {\n const { bottom: targetBottom } = element.getBoundingClientRect();\n const containerTop = container?.getBoundingClientRect().top ?? 0;\n return targetBottom < containerTop;\n};\n\nconst targetScrolledBelowVisibleContainerArea = (\n element: Element,\n container: Element,\n) => {\n const { top: targetTop } = element.getBoundingClientRect();\n const { bottom: containerBottom } = container.getBoundingClientRect();\n return targetTop > containerBottom;\n};\n\nexport type UseUnreadMessagesNotificationParams = {\n /** Scroll container (the element with overflow that actually scrolls). When provided, used as IntersectionObserver root and for initial visibility. */\n listElement: HTMLDivElement | null;\n isMessageListScrolledToBottom: boolean;\n showAlways: boolean;\n unreadCount?: number;\n};\n\nexport const useUnreadMessagesNotification = ({\n isMessageListScrolledToBottom,\n listElement,\n showAlways,\n unreadCount,\n}: UseUnreadMessagesNotificationParams) => {\n const { messages } = useChannelStateContext('UnreadMessagesNotification');\n const [show, setShow] = useState(false);\n const isScrolledAboveTargetTop = useRef(false);\n const intersectionObserverIsSupported = typeof IntersectionObserver !== 'undefined';\n\n useEffect(() => {\n if (!(unreadCount && intersectionObserverIsSupported)) {\n setShow(false);\n return;\n }\n\n const scrollRoot = listElement ?? null;\n if (!scrollRoot) {\n const [msgListPanel] = document.getElementsByClassName(\n MESSAGE_LIST_MAIN_PANEL_CLASS,\n );\n if (!msgListPanel) return;\n const [observedTarget] = document.getElementsByClassName(\n UNREAD_MESSAGE_SEPARATOR_CLASS,\n );\n if (!observedTarget) {\n setShow(true);\n }\n return;\n }\n\n const [observedTarget] = document.getElementsByClassName(\n UNREAD_MESSAGE_SEPARATOR_CLASS,\n );\n if (!observedTarget) {\n setShow(true);\n return;\n }\n\n const scrolledBelowSeparator = targetScrolledAboveVisibleContainerArea(\n observedTarget,\n scrollRoot,\n );\n const scrolledAboveSeparator = targetScrolledBelowVisibleContainerArea(\n observedTarget,\n scrollRoot,\n );\n\n setShow(\n showAlways\n ? scrolledBelowSeparator || scrolledAboveSeparator\n : scrolledBelowSeparator,\n );\n\n const observer = new IntersectionObserver(\n (elements) => {\n if (!elements.length) return;\n const entry = elements[0];\n const { boundingClientRect, isIntersecting, rootBounds } = entry;\n if (isIntersecting) {\n setShow(false);\n return;\n }\n const rootTop = rootBounds?.top ?? 0;\n const separatorIsAboveContainerTop = boundingClientRect.bottom < rootTop;\n setShow(showAlways || separatorIsAboveContainerTop);\n isScrolledAboveTargetTop.current = separatorIsAboveContainerTop;\n },\n { root: scrollRoot },\n );\n observer.observe(observedTarget);\n\n return () => {\n observer.disconnect();\n };\n }, [\n intersectionObserverIsSupported,\n listElement,\n isMessageListScrolledToBottom,\n messages,\n showAlways,\n unreadCount,\n ]);\n\n useEffect(() => {\n /**\n * Handle situation when scrollToBottom is called from another component when the msg list is scrolled above the observed target (unread separator).\n * The intersection observer is not triggered when Element.scrollTo() is called. So we end up in a situation when we are scrolled to the bottom\n * and at the same time scrolled above the observed target.\n */\n\n if (\n unreadCount &&\n isMessageListScrolledToBottom &&\n isScrolledAboveTargetTop.current\n ) {\n setShow(true);\n isScrolledAboveTargetTop.current = false;\n }\n }, [isMessageListScrolledToBottom, unreadCount]);\n\n return { show: show && intersectionObserverIsSupported };\n};\n","import { useEffect } from 'react';\nimport {\n useChannelActionContext,\n useChannelStateContext,\n useChatContext,\n} from '../../../context';\nimport type { Channel, Event, LocalMessage, MessageResponse } from 'stream-chat';\n\nconst hasReadLastMessage = (channel: Channel, userId: string) => {\n const latestMessageIdInChannel = channel.state.latestMessages.slice(-1)[0]?.id;\n const lastReadMessageIdServer = channel.state.read[userId]?.last_read_message_id;\n return latestMessageIdInChannel === lastReadMessageIdServer;\n};\n\ntype UseMarkReadParams = {\n isMessageListScrolledToBottom: boolean;\n messageListIsThread: boolean;\n wasMarkedUnread?: boolean;\n};\n\n/**\n * Takes care of marking a channel read. The channel is read only if all the following applies:\n * 1. the message list is not rendered in a thread\n * 2. the message list is scrolled to the bottom\n * 3. the channel was not marked unread by the user\n * @param isMessageListScrolledToBottom\n * @param messageListIsThread\n * @param wasChannelMarkedUnread\n */\nexport const useMarkRead = ({\n isMessageListScrolledToBottom,\n messageListIsThread,\n wasMarkedUnread,\n}: UseMarkReadParams) => {\n const { client } = useChatContext('useMarkRead');\n const { markRead, setChannelUnreadUiState } = useChannelActionContext('useMarkRead');\n const { channel } = useChannelStateContext('useMarkRead');\n\n useEffect(() => {\n if (!channel.getConfig()?.read_events) return;\n const shouldMarkRead = () =>\n !document.hidden &&\n !wasMarkedUnread &&\n !messageListIsThread &&\n isMessageListScrolledToBottom &&\n client.user?.id &&\n !hasReadLastMessage(channel, client.user.id);\n\n const onVisibilityChange = () => {\n if (shouldMarkRead()) markRead();\n };\n\n const handleMessageNew = (event: Event) => {\n const mainChannelUpdated =\n !event.message?.parent_id || event.message?.show_in_channel;\n\n if (!isMessageListScrolledToBottom || wasMarkedUnread || document.hidden) {\n setChannelUnreadUiState((prev) => {\n const previousUnreadCount = prev?.unread_messages ?? 0;\n const previousLastMessage = getPreviousLastMessage(\n channel.state.messages,\n event.message,\n );\n return {\n ...(prev || {}),\n last_read:\n prev?.last_read ??\n (previousUnreadCount === 0 && previousLastMessage?.created_at\n ? new Date(previousLastMessage.created_at)\n : new Date(0)), // not having information about the last read message means the whole channel is unread,\n unread_messages: previousUnreadCount + 1,\n };\n });\n } else if (mainChannelUpdated && shouldMarkRead()) {\n markRead();\n }\n };\n\n channel.on('message.new', handleMessageNew);\n document.addEventListener('visibilitychange', onVisibilityChange);\n\n if (shouldMarkRead()) {\n markRead();\n }\n\n return () => {\n channel.off('message.new', handleMessageNew);\n document.removeEventListener('visibilitychange', onVisibilityChange);\n };\n }, [\n channel,\n client,\n isMessageListScrolledToBottom,\n markRead,\n messageListIsThread,\n setChannelUnreadUiState,\n wasMarkedUnread,\n ]);\n};\n\nfunction getPreviousLastMessage(messages: LocalMessage[], newMessage?: MessageResponse) {\n if (!newMessage) return;\n let previousLastMessage;\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (!msg?.id) break;\n if (msg.id !== newMessage.id) {\n previousLastMessage = msg;\n break;\n }\n }\n return previousLastMessage;\n}\n","import React from 'react';\n\nimport { useComponentContext } from '../../context/ComponentContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\n\nexport type NewMessageNotificationProps = {\n /** Pre-computed label text (passed to custom override) */\n label?: string;\n /** Controls the notification display */\n showNotification?: boolean;\n /** Number of new messages since user scrolled up (optional; when provided shows \"{{count}} new messages\") */\n newMessageCount?: number;\n};\n\nconst UnMemoizedNewMessageNotification = (props: NewMessageNotificationProps) => {\n const { newMessageCount = 0, showNotification } = props;\n\n const { t } = useTranslationContext();\n\n const { NewMessageNotification: CustomNewMessageNotification } = useComponentContext();\n\n if (!showNotification) return null;\n\n const label =\n newMessageCount > 0\n ? t('{{count}} new messages', { count: newMessageCount })\n : t('New Messages!');\n\n if (CustomNewMessageNotification) {\n return <CustomNewMessageNotification {...props} label={label} />;\n }\n\n return (\n <div className='str-chat__new-message-notification'>\n <div\n aria-live='polite'\n className='str-chat__message-notification__label'\n data-testid='message-notification'\n >\n {label}\n </div>\n </div>\n );\n};\n\nexport const NewMessageNotification = React.memo(\n UnMemoizedNewMessageNotification,\n) as typeof UnMemoizedNewMessageNotification;\n","import React from 'react';\nimport { useChannelActionContext, useTranslationContext } from '../../context';\nimport { Button } from '../Button';\nimport { IconArrowUp, IconCrossMedium } from '../Icons';\nimport clsx from 'clsx';\n\nexport type UnreadMessagesNotificationProps = {\n /**\n * Configuration parameter to determine the message page size, when jumping to the first unread message.\n */\n queryMessageLimit?: number;\n /**\n * Configuration parameter to determine, whether the unread count is to be shown on the component. Enabled by default.\n */\n showCount?: boolean;\n /**\n * The count of unread messages to be displayed if enabled.\n */\n unreadCount?: number;\n};\n\nexport const UnreadMessagesNotification = ({\n queryMessageLimit,\n showCount = true,\n unreadCount,\n}: UnreadMessagesNotificationProps) => {\n const { jumpToFirstUnreadMessage, markRead } = useChannelActionContext();\n const { t } = useTranslationContext('UnreadMessagesNotification');\n\n return (\n <div\n className={clsx('str-chat__unread-messages-notification', {\n 'str-chat__unread-messages-notification--with-count': unreadCount && showCount,\n })}\n data-testid='unread-messages-notification'\n >\n <Button\n appearance='outline'\n onClick={() => jumpToFirstUnreadMessage(queryMessageLimit)}\n variant='secondary'\n >\n <IconArrowUp />\n {unreadCount && showCount\n ? t('{{count}} unread', { count: unreadCount })\n : t('Unread messages')}\n </Button>\n <Button appearance='outline' onClick={() => markRead()} variant='secondary'>\n <IconCrossMedium />\n </Button>\n </div>\n );\n};\n","export const deprecationAndReplacementWarning = <P extends Record<string, unknown>[][]>(\n pairs: P,\n component: string,\n) => {\n pairs.forEach((data) => {\n const [[oldName, oldValue], [newName, newValue]] = [\n Object.entries(data[0])[0],\n Object.entries(data[1])[0],\n ];\n\n if (\n (typeof oldValue !== 'undefined' && typeof newValue === 'undefined') ||\n (typeof oldValue !== 'undefined' && typeof newValue !== 'undefined')\n ) {\n console.warn(\n `[Deprecation notice (${component})]: prefer using prop ${newName} instead of ${oldName}`,\n );\n }\n });\n};\n","import type { PropsWithChildren } from 'react';\nimport React, { useEffect, useRef, useState } from 'react';\nimport type { PaginatorProps } from '../../types/types';\nimport { deprecationAndReplacementWarning } from '../../utils/deprecationWarning';\nimport { DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD } from '../../constants/limits';\n\n/**\n * Prevents Chrome hangups\n * See: https://stackoverflow.com/questions/47524205/random-high-content-download-time-in-chrome/47684257#47684257\n */\nconst mousewheelListener = (event: Event) => {\n if (event instanceof WheelEvent && event.deltaY === 1) {\n event.preventDefault();\n }\n};\n\nexport type InfiniteScrollProps = PaginatorProps & {\n className?: string;\n element?: React.ElementType;\n /**\n * @desc Flag signalling whether more pages with older items can be loaded\n * @deprecated Use hasPreviousPage prop instead. Planned for removal: https://github.com/GetStream/stream-chat-react/issues/1804\n */\n hasMore?: boolean;\n /**\n * @desc Flag signalling whether more pages with newer items can be loaded\n * @deprecated Use hasNextPage prop instead. Planned for removal: https://github.com/GetStream/stream-chat-react/issues/1804\n */\n hasMoreNewer?: boolean;\n /** Element to be rendered at the top of the thread message list. By default, Message and ThreadStart components */\n head?: React.ReactNode;\n initialLoad?: boolean;\n isLoading?: boolean;\n listenToScroll?: (offset: number, reverseOffset: number, threshold: number) => void;\n loader?: React.ReactNode;\n /**\n * @desc Function that loads previous page with older items\n * @deprecated Use loadPreviousPage prop instead. Planned for removal: https://github.com/GetStream/stream-chat-react/issues/1804\n */\n loadMore?: () => void;\n /**\n * @desc Function that loads next page with newer items\n * @deprecated Use loadNextPage prop instead. Planned for removal: https://github.com/GetStream/stream-chat-react/issues/1804\n */\n loadMoreNewer?: () => void;\n useCapture?: boolean;\n};\n\n/**\n * This component serves a single purpose - load more items on scroll inside the MessageList component\n * It is not a general purpose infinite scroll controller, because:\n * 1. It is re-rendered whenever queryInProgress, hasNext, hasPrev changes. This can lead to scrollListener to have stale data.\n * 2. It pretends to invoke scrollListener on resize event even though this event is emitted only on window resize. It should\n * rather use ResizeObserver. But then again, it ResizeObserver would invoke a stale version of scrollListener.\n *\n * In general, the infinite scroll controller should not aim for checking the loading state and whether there is more data to load.\n * That should be controlled by the loading function.\n */\nexport const InfiniteScroll = (props: PropsWithChildren<InfiniteScrollProps>) => {\n const {\n children,\n element: Component = 'div',\n hasMore,\n hasMoreNewer,\n hasNextPage,\n hasPreviousPage,\n head,\n initialLoad = true,\n isLoading,\n listenToScroll,\n loader,\n loadMore,\n loadMoreNewer,\n loadNextPage,\n loadPreviousPage,\n threshold = DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD,\n useCapture = false,\n ...elementProps\n } = props;\n\n const loadNextPageFn = loadNextPage || loadMoreNewer;\n const loadPreviousPageFn = loadPreviousPage || loadMore;\n const hasNextPageFlag = hasNextPage || hasMoreNewer;\n const hasPreviousPageFlag = hasPreviousPage || hasMore;\n\n const [scrollComponent, setScrollComponent] = useState<HTMLElement | null>(null);\n const previousOffset = useRef<number | undefined>(undefined);\n const previousReverseOffset = useRef<number | undefined>(undefined);\n\n const scrollListenerRef = useRef<() => void>(undefined);\n scrollListenerRef.current = () => {\n const element = scrollComponent;\n\n if (!element || element.offsetParent === null) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const parentElement = element.parentElement!;\n\n const offset =\n element.scrollHeight - parentElement.scrollTop - parentElement.clientHeight;\n const reverseOffset = parentElement.scrollTop;\n\n if (listenToScroll) {\n listenToScroll(offset, reverseOffset, threshold);\n }\n\n if (isLoading) return;\n\n if (\n previousOffset.current === offset &&\n previousReverseOffset.current === reverseOffset\n )\n return;\n previousOffset.current = offset;\n previousReverseOffset.current = reverseOffset;\n\n // FIXME: this triggers loadMore call when a user types messages in thread and the scroll container expands\n if (\n reverseOffset < Number(threshold) &&\n typeof loadPreviousPageFn === 'function' &&\n hasPreviousPageFlag\n ) {\n loadPreviousPageFn();\n }\n\n if (\n offset < Number(threshold) &&\n typeof loadNextPageFn === 'function' &&\n hasNextPageFlag\n ) {\n loadNextPageFn();\n }\n };\n\n useEffect(() => {\n deprecationAndReplacementWarning(\n [\n [{ hasMoreNewer }, { hasNextPage }],\n [{ loadMoreNewer }, { loadNextPage }],\n [{ hasMore }, { hasPreviousPage }],\n [{ loadMore }, { loadPreviousPage }],\n ],\n 'InfiniteScroll',\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n const scrollElement = scrollComponent?.parentNode;\n\n if (!scrollElement) return;\n\n const scrollListener = () => scrollListenerRef.current?.();\n\n scrollElement.addEventListener('scroll', scrollListener, useCapture);\n scrollElement.addEventListener('resize', scrollListener, useCapture);\n scrollListener();\n\n return () => {\n scrollElement.removeEventListener('scroll', scrollListener, useCapture);\n scrollElement.removeEventListener('resize', scrollListener, useCapture);\n };\n }, [initialLoad, scrollComponent, useCapture]);\n\n useEffect(() => {\n const scrollElement = scrollComponent?.parentNode;\n\n if (!scrollElement) return;\n\n scrollElement.addEventListener('wheel', mousewheelListener, { passive: false });\n\n return () => {\n scrollElement.removeEventListener('wheel', mousewheelListener, useCapture);\n };\n }, [scrollComponent, useCapture]);\n\n return (\n <Component {...elementProps} ref={setScrollComponent}>\n {head}\n {loader}\n {children}\n </Component>\n );\n};\n","import React, { useEffect } from 'react';\nimport clsx from 'clsx';\n\nimport { AvatarStack } from '../Avatar';\nimport { TypingIndicatorDots } from './TypingIndicatorDots';\nimport { useChannelStateContext } from '../../context/ChannelStateContext';\nimport { useChatContext } from '../../context/ChatContext';\nimport { useTypingContext } from '../../context/TypingContext';\nimport { useThreadContext } from '../Threads';\n\nimport { useDebouncedTypingActive } from './hooks/useDebouncedTypingActive';\n\nconst MAX_AVATARS = 3;\n\nexport type TypingIndicatorProps = {\n /** When false, the indicator is not rendered (e.g. when list is not scrolled to bottom). Omit or true to show when typing. */\n isMessageListScrolledToBottom?: boolean;\n scrollToBottom: () => void;\n /** Whether the typing indicator is in a thread */\n threadList?: boolean;\n};\n\n/**\n * TypingIndicator shows avatars of users currently typing and a bubble with animated dots.\n * Renders only for other participants (never the current user), only when scrolled to latest message if isMessageListScrolledToBottom is provided.\n * It must be a child of Channel component.\n */\nconst UnMemoizedTypingIndicator = (props: TypingIndicatorProps) => {\n const { isMessageListScrolledToBottom = true, scrollToBottom, threadList } = props;\n\n const { channelConfig, thread } = useChannelStateContext('TypingIndicator');\n const threadInstance = useThreadContext();\n const parentId = threadInstance?.id ?? thread?.id;\n const { client } = useChatContext('TypingIndicator');\n const { typing = {} } = useTypingContext('TypingIndicator');\n\n const typingInChannel = !threadList\n ? Object.values(typing).filter(\n ({ parent_id, user }) => user?.id !== client.user?.id && !parent_id,\n )\n : [];\n\n const typingInThread = threadList\n ? Object.values(typing).filter(\n ({ parent_id, user }) => user?.id !== client.user?.id && parent_id === parentId,\n )\n : [];\n\n const typingUsers = threadList ? typingInThread : typingInChannel;\n const { displayUsers } = useDebouncedTypingActive(typingUsers);\n const showIndicator = displayUsers.length > 0;\n const displayInfo = displayUsers.slice(0, MAX_AVATARS).map(({ user }) => ({\n id: user?.id,\n imageUrl: user?.image,\n userName: user?.name ?? '',\n }));\n\n useEffect(() => {\n if (showIndicator && isMessageListScrolledToBottom) scrollToBottom();\n }, [scrollToBottom, isMessageListScrolledToBottom, showIndicator]);\n\n if (channelConfig?.typing_events === false) {\n return null;\n }\n\n if (!showIndicator || !isMessageListScrolledToBottom) {\n return null;\n }\n\n const overflowCount =\n displayUsers.length > MAX_AVATARS ? displayUsers.length - MAX_AVATARS : 0;\n\n return (\n <div\n className={clsx(\n 'str-chat__typing-indicator',\n 'str-chat__typing-indicator--with-transition',\n {\n 'str-chat__typing-indicator--typing': showIndicator,\n },\n )}\n data-testid='typing-indicator'\n >\n {displayInfo.length > 0 && (\n <AvatarStack\n badgeSize='md'\n displayInfo={displayInfo}\n overflowCount={overflowCount > 0 ? overflowCount : undefined}\n size='md'\n />\n )}\n <div className='str-chat__typing-indicator__bubble'>\n <div className='str-chat__typing-indicator__dots'>\n <TypingIndicatorDots />\n </div>\n </div>\n </div>\n );\n};\n\nexport const TypingIndicator = React.memo(\n UnMemoizedTypingIndicator,\n) as typeof UnMemoizedTypingIndicator;\n","import { useCallback, useState } from 'react';\n\nimport type { RenderedMessage } from '../../utils';\nimport { isDateSeparatorMessage, isIntroMessage } from '../../utils';\nimport type { LocalMessage } from 'stream-chat';\n\nexport type UseFloatingDateSeparatorParams = {\n disableDateSeparator: boolean;\n processedMessages: RenderedMessage[];\n};\n\nexport type UseFloatingDateSeparatorResult = {\n floatingDate: Date | null;\n onItemsRendered: (rendered: RenderedMessage[]) => void;\n showFloatingDate: boolean;\n};\n\n/**\n * Returns the date to show in the floating date separator based on currently visible messages.\n * When the first visible item is a message (not a date separator), we've scrolled past its\n * date separator — find that separator's date.\n */\nfunction getFloatingDateForFirstMessage(\n firstMessage: RenderedMessage,\n processedMessages: RenderedMessage[],\n firstMessageIndex: number,\n): Date | null {\n if (isIntroMessage(firstMessage)) return null;\n\n // Walk backwards to find the last date separator before this message\n for (let i = firstMessageIndex - 1; i >= 0; i -= 1) {\n const item = processedMessages[i];\n if (isDateSeparatorMessage(item)) {\n return item.date;\n }\n }\n\n // No preceding date separator; use message's created_at\n const msg = firstMessage as LocalMessage;\n const created = msg.created_at;\n if (created) {\n const d = new Date(created);\n return isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\n/**\n * Controls when to show the floating date separator (Slack-like: fixed at top when scrolling).\n * Show when no in-flow date separator is visible and we've scrolled past one.\n */\nconst HIDDEN_STATE = { date: null, visible: false } as const;\n\nexport const useFloatingDateSeparator = ({\n disableDateSeparator,\n processedMessages,\n}: UseFloatingDateSeparatorParams): UseFloatingDateSeparatorResult => {\n const [state, setState] = useState<{\n date: Date | null;\n visible: boolean;\n }>(HIDDEN_STATE);\n\n const onItemsRendered = useCallback(\n (rendered: RenderedMessage[]) => {\n if (disableDateSeparator || processedMessages.length === 0) {\n setState(HIDDEN_STATE);\n return;\n }\n\n const valid = rendered.filter((m): m is RenderedMessage => m != null);\n if (valid.length === 0) {\n setState(HIDDEN_STATE);\n return;\n }\n\n const first = valid[0];\n\n // If first visible item is a date separator, it's in view — hide floating\n if (isDateSeparatorMessage(first)) {\n setState(HIDDEN_STATE);\n return;\n }\n\n // Check if any date separator is visible — if so, hide floating\n const hasVisibleDateSeparator = valid.some(isDateSeparatorMessage);\n if (hasVisibleDateSeparator) {\n setState(HIDDEN_STATE);\n return;\n }\n\n // First visible is a message; find its date\n const firstIndex = processedMessages.findIndex((m) => m.id === first.id);\n const date =\n firstIndex >= 0\n ? getFloatingDateForFirstMessage(first, processedMessages, firstIndex)\n : null;\n\n const visible = date !== null;\n setState((prev) => {\n const prevTime = prev.date?.getTime() ?? null;\n const nextTime = date?.getTime() ?? null;\n if (prev.visible === visible && prevTime === nextTime) return prev;\n return { date, visible };\n });\n },\n [disableDateSeparator, processedMessages],\n );\n\n return {\n floatingDate: state.date,\n onItemsRendered,\n showFloatingDate: !!state.date && state.visible,\n };\n};\n","import { useEffect, useState } from 'react';\n\nimport { useChatContext } from '../../../../context/ChatContext';\n\nimport type { EventHandler, LocalMessage } from 'stream-chat';\n\nexport const useGiphyPreview = (separateGiphyPreview: boolean) => {\n const [giphyPreviewMessage, setGiphyPreviewMessage] = useState<LocalMessage>();\n\n const { client } = useChatContext('useGiphyPreview');\n\n useEffect(() => {\n if (!separateGiphyPreview) return;\n const handleEvent: EventHandler = (event) => {\n const { message, user } = event;\n\n if (message?.command === 'giphy' && user?.id === client.userID) {\n setGiphyPreviewMessage(undefined);\n }\n };\n\n client.on('message.new', handleEvent);\n return () => client.off('message.new', handleEvent);\n }, [client, separateGiphyPreview]);\n\n return {\n giphyPreviewMessage,\n setGiphyPreviewMessage: separateGiphyPreview ? setGiphyPreviewMessage : undefined,\n };\n};\n","import { useEffect, useRef, useState } from 'react';\nimport type { LocalMessage } from 'stream-chat';\n\ntype UseMessageSetKeyParams = {\n messages?: LocalMessage[];\n};\n\nexport const useMessageSetKey = ({ messages }: UseMessageSetKeyParams) => {\n /**\n * Logic to update the key of the virtuoso component when the list jumps to a new location.\n */\n const [messageSetKey, setMessageSetKey] = useState(+new Date());\n const firstMessageId = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n const continuousSet = messages?.find(\n (message) => message.id === firstMessageId.current,\n );\n if (!continuousSet) {\n setMessageSetKey(+new Date());\n }\n firstMessageId.current = messages?.[0]?.id;\n }, [messages]);\n\n return {\n messageSetKey,\n };\n};\n","import { useEffect, useRef, useState } from 'react';\nimport type { LocalMessage } from 'stream-chat';\nimport type { RenderedMessage } from '../../utils';\n\nexport function useNewMessageNotification(\n messages: RenderedMessage[],\n currentUserId: string | undefined,\n hasMoreNewer?: boolean,\n) {\n const [newMessagesNotification, setNewMessagesNotification] = useState(false);\n const [isMessageListScrolledToBottom, setIsMessageListScrolledToBottom] =\n useState(true);\n /**\n * use the flag to avoid the initial \"new messages\" quick blink\n */\n const didMount = useRef(false);\n\n const lastMessageId = useRef('');\n const atBottom = useRef(false);\n\n useEffect(() => {\n if (hasMoreNewer) {\n setNewMessagesNotification(true);\n return;\n }\n /* handle scrolling behavior for new messages */\n if (!messages?.length) return;\n\n const lastMessage = messages[messages.length - 1];\n const prevMessageId = lastMessageId.current;\n lastMessageId.current = lastMessage.id || ''; // update last message id\n\n /* do nothing if new messages are loaded from top(loadMore) */\n if (lastMessage.id === prevMessageId) return;\n\n /* if list is already at the bottom return, followOutput will do the job */\n if (atBottom.current) return;\n\n /* if the new message belongs to current user scroll to bottom */\n if ((lastMessage as LocalMessage).user?.id !== currentUserId && didMount.current) {\n /* otherwise just show newMessage notification */\n setNewMessagesNotification(true);\n }\n didMount.current = true;\n }, [currentUserId, messages, hasMoreNewer]);\n\n return {\n atBottom,\n isMessageListScrolledToBottom,\n newMessagesNotification,\n setIsMessageListScrolledToBottom,\n setNewMessagesNotification,\n };\n}\n","import { useMemo, useRef } from 'react';\nimport type { RenderedMessage } from '../../utils';\nimport { isLocalMessage } from '../../utils';\n\nconst STATUSES_EXCLUDED_FROM_PREPEND = {\n failed: true,\n sending: true,\n} as const as Record<string, boolean>;\n\nexport function usePrependedMessagesCount(\n messages: RenderedMessage[],\n hasDateSeparator: boolean,\n) {\n const firstRealMessageIndex = hasDateSeparator ? 1 : 0;\n const firstMessageOnFirstLoadedPage = useRef<RenderedMessage>(undefined);\n const previousFirstMessageOnFirstLoadedPage = useRef<RenderedMessage>(undefined);\n const previousNumItemsPrepended = useRef(0);\n\n const numItemsPrepended = useMemo(() => {\n if (!messages || !messages.length) {\n previousNumItemsPrepended.current = 0;\n return 0;\n }\n\n const currentFirstMessage = messages?.[firstRealMessageIndex];\n\n const noNewMessages =\n currentFirstMessage?.id === previousFirstMessageOnFirstLoadedPage.current?.id;\n\n // This is possible only, when sending messages very quickly (basically single char messages submitted like a crazy) in empty channel (first page)\n // Optimistic UI update, when sending messages, can lead to a situation, when\n // the order of the messages changes for a moment. This can happen, when a user\n // sends multiple messages withing few milliseconds. E.g. we send a message A\n // then message B. At first we have message array with both messages of status \"sending\"\n // then response for message A is received with a new - later - created_at timestamp\n // this leads to rearrangement of 1.B (\"sending\"), 2.A (\"received\"). Still firstMessageOnFirstLoadedPage.current\n // points to message A, but now this message has index 1 => previousNumItemsPrepended.current === 1\n // That in turn leads to incorrect index calculation in VirtualizedMessageList trying to access a message\n // at non-existent index. Therefore, we ignore messages of status \"sending\" / \"failed\" in order they are\n // not considered as prepended messages.\n const currentFirstMessageStatus = isLocalMessage(currentFirstMessage)\n ? currentFirstMessage.status\n : undefined;\n const firstMsgMovedAfterMessagesInExcludedStatus = !!(\n currentFirstMessageStatus &&\n STATUSES_EXCLUDED_FROM_PREPEND[currentFirstMessageStatus]\n );\n\n if (noNewMessages || firstMsgMovedAfterMessagesInExcludedStatus) {\n return previousNumItemsPrepended.current;\n }\n\n if (!firstMessageOnFirstLoadedPage.current) {\n firstMessageOnFirstLoadedPage.current = currentFirstMessage;\n }\n previousFirstMessageOnFirstLoadedPage.current = currentFirstMessage;\n // if new messages were prepended, find out how many\n // start with this number because there cannot be fewer prepended items than before\n for (\n let prependedMessageCount = previousNumItemsPrepended.current;\n prependedMessageCount < messages.length;\n prependedMessageCount += 1\n ) {\n const messageIsFirstOnFirstLoadedPage =\n messages[prependedMessageCount].id === firstMessageOnFirstLoadedPage.current?.id;\n\n if (messageIsFirstOnFirstLoadedPage) {\n previousNumItemsPrepended.current = prependedMessageCount - firstRealMessageIndex;\n return previousNumItemsPrepended.current;\n }\n }\n\n // if no match has found, we have jumped - reset the prepended item count.\n firstMessageOnFirstLoadedPage.current = currentFirstMessage;\n previousNumItemsPrepended.current = 0;\n return 0;\n // TODO: there's a bug here, the messages prop is the same array instance (something mutates it)\n // that's why the second dependency is necessary\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [firstRealMessageIndex, messages, messages?.length]);\n\n return numItemsPrepended;\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { RenderedMessage } from '../../utils';\n\ntype UseScrollToBottomOnNewMessageParams = {\n scrollToBottom: () => void;\n messages?: RenderedMessage[];\n /** When `true`, the list will scroll to the latest message when the window regains focus */\n scrollToLatestMessageOnFocus?: boolean;\n};\n\nexport const useScrollToBottomOnNewMessage = ({\n messages,\n scrollToBottom,\n scrollToLatestMessageOnFocus,\n}: UseScrollToBottomOnNewMessageParams) => {\n const [newMessagesReceivedInBackground, setNewMessagesReceivedInBackground] =\n useState(false);\n\n const scrollToBottomIfConfigured = useRef<(e: Event) => void>(undefined);\n\n scrollToBottomIfConfigured.current = (event: Event) => {\n if (\n !scrollToLatestMessageOnFocus ||\n !newMessagesReceivedInBackground ||\n event.target !== window\n ) {\n return;\n }\n\n setTimeout(scrollToBottom, 100);\n };\n\n useEffect(() => {\n setNewMessagesReceivedInBackground(true);\n }, [messages]);\n\n useEffect(() => {\n const handleFocus = (event: Event) => {\n scrollToBottomIfConfigured.current?.(event);\n };\n\n const handleBlur = () => {\n setNewMessagesReceivedInBackground(false);\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('focus', handleFocus);\n window.addEventListener('blur', handleBlur);\n }\n\n return () => {\n window.removeEventListener('focus', handleFocus);\n window.removeEventListener('blur', handleBlur);\n };\n }, []);\n};\n","import { useEffect, useRef } from 'react';\nimport type { RenderedMessage } from '../../utils';\nimport type { LocalMessage } from 'stream-chat';\n\nexport function useShouldForceScrollToBottom(\n messages: RenderedMessage[],\n currentUserId?: string,\n) {\n const lastFocusedOwnMessage = useRef('');\n const initialFocusRegistered = useRef(false);\n\n function recheckForNewOwnMessage() {\n if (messages && messages.length > 0) {\n const lastMessage = messages[messages.length - 1];\n\n if (\n (lastMessage as LocalMessage).user?.id === currentUserId &&\n lastFocusedOwnMessage.current !== lastMessage.id\n ) {\n lastFocusedOwnMessage.current = lastMessage.id;\n return true;\n }\n }\n return false;\n }\n\n useEffect(() => {\n if (messages && messages.length && !initialFocusRegistered.current) {\n initialFocusRegistered.current = true;\n recheckForNewOwnMessage();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [messages, messages?.length]);\n\n return recheckForNewOwnMessage;\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport type { RenderedMessage } from '../../utils';\nimport type { LocalMessage } from 'stream-chat';\n\nexport type UseUnreadMessagesNotificationParams = {\n showAlways: boolean;\n unreadCount: number;\n lastRead?: Date | null;\n};\n\n/**\n * Controls the logic when an `UnreadMessagesNotification` component should be shown.\n * In virtualized message list there is no notion of being scrolled below or above `UnreadMessagesSeparator`.\n * Therefore, the `UnreadMessagesNotification` component is rendered based on timestamps.\n * If the there are unread messages in the channel and the `VirtualizedMessageList` renders\n * messages created later than the last read message in the channel, then the\n * `UnreadMessagesNotification` component is rendered. This is an approximate equivalent to being\n * scrolled below the `UnreadMessagesNotification` component.\n * @param lastRead\n * @param showAlways\n * @param unreadCount\n */\nexport const useUnreadMessagesNotificationVirtualized = ({\n lastRead,\n showAlways,\n unreadCount,\n}: UseUnreadMessagesNotificationParams) => {\n const [show, setShow] = useState(false);\n\n const toggleShowUnreadMessagesNotification = useCallback(\n (renderedMessages: RenderedMessage[]) => {\n if (!unreadCount) return;\n const firstRenderedMessage = renderedMessages[0];\n const lastRenderedMessage = renderedMessages.slice(-1)[0];\n if (!(firstRenderedMessage && lastRenderedMessage)) return;\n\n const firstRenderedMessageTime = new Date(\n (firstRenderedMessage as LocalMessage).created_at ?? 0,\n ).getTime();\n const lastRenderedMessageTime = new Date(\n (lastRenderedMessage as LocalMessage).created_at ?? 0,\n ).getTime();\n const lastReadTime = new Date(lastRead ?? 0).getTime();\n\n const scrolledBelowSeparator =\n !!lastReadTime && firstRenderedMessageTime > lastReadTime;\n const scrolledAboveSeparator =\n !!lastReadTime && lastRenderedMessageTime < lastReadTime;\n\n setShow(\n showAlways\n ? scrolledBelowSeparator || scrolledAboveSeparator\n : scrolledBelowSeparator,\n );\n },\n [lastRead, showAlways, unreadCount],\n );\n\n useEffect(() => {\n if (!unreadCount) setShow(false);\n }, [unreadCount]);\n\n return { show, toggleShowUnreadMessagesNotification };\n};\n","import React, { useLayoutEffect } from 'react';\nimport type { RefObject } from 'react';\n\nimport { DateSeparator as DefaultDateSeparator } from '../DateSeparator';\nimport { useComponentContext } from '../../context/ComponentContext';\nimport { useFloatingDateSeparatorMessageList } from './hooks/MessageList';\nimport { useFloatingDateSeparator } from './hooks/VirtualizedMessageList';\nimport type { RenderedMessage } from './utils';\n\ntype BaseProps = {\n disableDateSeparator: boolean;\n processedMessages: RenderedMessage[];\n};\n\nexport type FloatingDateSeparatorProps = BaseProps &\n (\n | {\n /** For VirtualizedMessageList: ref the parent calls with visible items */\n itemsRenderedRef: RefObject<((rendered: RenderedMessage[]) => void) | null>;\n }\n | {\n /** For MessageList: scroll container to query DOM for date separators */\n listElement: HTMLDivElement | null;\n }\n );\n\n/**\n * Renders a floating date separator when the user has scrolled past the in-flow date.\n * State is internal so MessageList/VirtualizedMessageList do not re-render when it changes.\n * Use itemsRenderedRef for Virtuoso, listElement for non-virtualized MessageList.\n */\nexport const FloatingDateSeparator = (props: FloatingDateSeparatorProps) => {\n const { DateSeparator = DefaultDateSeparator } = useComponentContext(\n 'FloatingDateSeparator',\n );\n const { disableDateSeparator, processedMessages } = props;\n\n const listElement = 'listElement' in props ? props.listElement : null;\n const useDomMode = listElement != null;\n\n const virtuosoResult = useFloatingDateSeparator({\n disableDateSeparator,\n processedMessages,\n });\n const domResult = useFloatingDateSeparatorMessageList({\n disableDateSeparator,\n listElement,\n processedMessages,\n });\n\n const floatingDate = useDomMode ? domResult.floatingDate : virtuosoResult.floatingDate;\n const showFloatingDate = useDomMode\n ? domResult.showFloatingDate\n : virtuosoResult.showFloatingDate;\n\n const itemsRenderedRef = 'itemsRenderedRef' in props ? props.itemsRenderedRef : null;\n useLayoutEffect(() => {\n if (!itemsRenderedRef) return;\n itemsRenderedRef.current = virtuosoResult.onItemsRendered;\n return () => {\n itemsRenderedRef.current = null;\n };\n }, [itemsRenderedRef, virtuosoResult.onItemsRendered]);\n\n if (!showFloatingDate || !floatingDate || !DateSeparator) return null;\n\n return <DateSeparator date={floatingDate} floating />;\n};\n","import React from 'react';\n\nimport type { Event, LocalMessage } from 'stream-chat';\nimport type { TimestampFormatterOptions } from '../../i18n/types';\n\nexport type EventComponentProps = TimestampFormatterOptions & {\n message: LocalMessage & {\n event?: Event;\n };\n unsafeHTML?: boolean;\n};\n\n/**\n * Component to display system and channel event messages\n */\nconst UnMemoizedEventComponent = (props: EventComponentProps) => {\n const { message, unsafeHTML = false } = props;\n const { type } = message;\n\n if (type !== 'system') return null;\n\n return (\n <div className='str-chat__message--system' data-testid='message-system'>\n <div className='str-chat__message--system__text'>\n {unsafeHTML ? (\n <div\n dangerouslySetInnerHTML={{ __html: message.html || '' }}\n data-unsafe-inner-html\n />\n ) : (\n <span>{message.text}</span>\n )}\n </div>\n </div>\n );\n};\n\nexport const EventComponent = React.memo(\n UnMemoizedEventComponent,\n) as typeof UnMemoizedEventComponent;\n","import type { ReactNode } from 'react';\nimport React, { Fragment } from 'react';\nimport type { GroupStyle, RenderedMessage } from './utils';\nimport { getIsFirstUnreadMessage, isDateSeparatorMessage, isIntroMessage } from './utils';\nimport type { MessageProps } from '../Message';\nimport { Message } from '../Message';\nimport { DateSeparator as DefaultDateSeparator } from '../DateSeparator';\nimport { EventComponent as DefaultMessageSystem } from '../EventComponent';\nimport { UnreadMessagesSeparator as DefaultUnreadMessagesSeparator } from './UnreadMessagesSeparator';\nimport type { LocalMessage, UserResponse } from 'stream-chat';\nimport type { ComponentContextValue, CustomClasses } from '../../context';\nimport type { ChannelUnreadUiState } from '../../types';\n\nexport interface RenderMessagesOptions {\n components: ComponentContextValue;\n lastReceivedMessageId: string | null;\n messageGroupStyles: Record<string, GroupStyle>;\n messages: Array<RenderedMessage>;\n ownMessagesDeliveredToOthers: Record<string, UserResponse[]>;\n /**\n * Object mapping message IDs of own messages to the users who read those messages.\n */\n readData: Record<string, Array<UserResponse>>;\n /**\n * Props forwarded to the Message component.\n */\n sharedMessageProps: SharedMessageProps;\n /** Latest own message in currently displayed message set. */\n lastOwnMessage?: LocalMessage;\n /**\n * Current user's channel read state used to render components reflecting unread state.\n * It does not reflect the back-end state if a channel is marked read on mount.\n * This is in order to keep the unread UI when an unread channel is open.\n */\n channelUnreadUiState?: ChannelUnreadUiState;\n customClasses?: CustomClasses;\n}\n\nexport type SharedMessageProps = Omit<MessageProps, MessagePropsToOmit>;\n\nexport type MessageRenderer = (options: RenderMessagesOptions) => Array<ReactNode>;\n\ntype MessagePropsToOmit =\n | 'channel'\n | 'deliveredTo'\n | 'groupStyles'\n | 'initialMessage'\n | 'lastReceivedId'\n | 'message'\n | 'readBy';\n\nexport function defaultRenderMessages({\n channelUnreadUiState,\n components,\n customClasses,\n lastOwnMessage,\n lastReceivedMessageId: lastReceivedId,\n messageGroupStyles,\n messages,\n ownMessagesDeliveredToOthers,\n readData,\n sharedMessageProps: messageProps,\n}: RenderMessagesOptions) {\n const {\n DateSeparator = DefaultDateSeparator,\n HeaderComponent,\n MessageListItem = 'li',\n MessageSystem = DefaultMessageSystem,\n UnreadMessagesSeparator = DefaultUnreadMessagesSeparator,\n } = components;\n\n const renderedMessages = [];\n let firstMessage;\n let previousMessage = undefined;\n for (let index = 0; index < messages.length; index++) {\n const message = messages[index];\n if (isDateSeparatorMessage(message)) {\n renderedMessages.push(\n <MessageListItem data-index={index} key={`${message.date.toISOString()}-i`}>\n <DateSeparator\n date={message.date}\n formatDate={messageProps.formatDate}\n unread={message.unread}\n />\n </MessageListItem>,\n );\n } else if (isIntroMessage(message)) {\n if (HeaderComponent) {\n renderedMessages.push(\n <MessageListItem data-index={index} key='intro'>\n <HeaderComponent />\n </MessageListItem>,\n );\n }\n } else if (message.type === 'system') {\n renderedMessages.push(\n <MessageListItem\n data-index={index}\n data-message-id={message.id}\n key={message.id || message.created_at.toISOString()}\n >\n <MessageSystem message={message} unsafeHTML={messageProps.unsafeHTML} />\n </MessageListItem>,\n );\n } else {\n if (!firstMessage) {\n firstMessage = message;\n }\n const groupStyles: GroupStyle = messageGroupStyles[message.id] || '';\n const messageClass =\n customClasses?.message || `str-chat__li str-chat__li--${groupStyles}`;\n\n const isFirstUnreadMessage = getIsFirstUnreadMessage({\n firstUnreadMessageId: channelUnreadUiState?.first_unread_message_id,\n isFirstMessage: !!firstMessage?.id && firstMessage.id === message.id,\n lastReadDate: channelUnreadUiState?.last_read,\n lastReadMessageId: channelUnreadUiState?.last_read_message_id,\n message,\n previousMessage,\n unreadMessageCount: channelUnreadUiState?.unread_messages,\n });\n\n renderedMessages.push(\n <Fragment key={message.id || message.created_at.toISOString()}>\n {isFirstUnreadMessage && UnreadMessagesSeparator && (\n <MessageListItem className='str-chat__li str-chat__unread-messages-separator-wrapper'>\n <UnreadMessagesSeparator\n unreadCount={channelUnreadUiState?.unread_messages}\n />\n </MessageListItem>\n )}\n <MessageListItem\n className={messageClass}\n data-index={index}\n data-message-id={message.id}\n data-testid={messageClass}\n >\n <Message\n deliveredTo={ownMessagesDeliveredToOthers[message.id] || []}\n groupStyles={[groupStyles]} /* TODO: convert to simple string */\n lastOwnMessage={lastOwnMessage}\n lastReceivedId={lastReceivedId}\n message={message}\n readBy={readData[message.id] || []}\n {...messageProps}\n />\n </MessageListItem>\n </Fragment>,\n );\n previousMessage = message;\n }\n }\n return renderedMessages;\n}\n","// last own message should be tracked in the low-level client\nexport const findReverse = <T>(\n items: T[],\n matches: (items: T) => boolean,\n): T | undefined => {\n for (let i = items.length - 1; i >= 0; i -= 1) {\n if (matches(items[i])) {\n return items[i];\n }\n }\n\n return undefined;\n};\n","import { useMemo } from 'react';\nimport { findReverse } from '../../../utils/findReverse';\nimport type { LocalMessage } from 'stream-chat';\n\n// fixme: we should be able to retrieve last own message quickly from the LLC. Should be done when refactoring the LLC Channel state to reactive.\nexport const useLastOwnMessage = ({\n messages,\n ownUserId,\n}: {\n messages?: LocalMessage[];\n ownUserId?: string;\n}) =>\n useMemo(\n () =>\n messages && findReverse(messages, (msg) => (msg.user && msg.user.id) === ownUserId),\n [messages, ownUserId],\n );\n","import React, { useEffect, useState } from 'react';\n\nimport { useChannelStateContext, useChatContext } from '../../context';\n\nimport type { Event } from 'stream-chat';\nimport { Badge } from '../Badge';\nimport { Button } from '../Button';\nimport { IconArrowDown } from '../Icons';\n\ntype ScrollToLatestMessageButtonProps = {\n /** When true, user has jumped to an older message set and newer messages can be loaded */\n isNotAtLatestMessageSet?: boolean;\n isMessageListScrolledToBottom?: boolean;\n onClick: React.MouseEventHandler;\n threadList?: boolean;\n};\n\nconst UnMemoizedScrollToLatestMessageButton = (\n props: ScrollToLatestMessageButtonProps,\n) => {\n const {\n isMessageListScrolledToBottom,\n isNotAtLatestMessageSet = false,\n onClick,\n threadList,\n } = props;\n\n const { channel: activeChannel, client } = useChatContext();\n const { thread } = useChannelStateContext();\n const [countUnread, setCountUnread] = useState(activeChannel?.countUnread() || 0);\n const [replyCount, setReplyCount] = useState(thread?.reply_count || 0);\n const observedEvent = threadList ? 'message.updated' : 'message.new';\n\n useEffect(() => {\n const handleEvent = (event: Event) => {\n const newMessageInAnotherChannel = event.cid !== activeChannel?.cid;\n const newMessageIsMine = event.user?.id === client.user?.id;\n\n const isThreadOpen = !!thread;\n const newMessageIsReply = !!event.message?.parent_id;\n const dontIncreaseMainListCounterOnNewReply =\n isThreadOpen && !threadList && newMessageIsReply;\n\n if (\n isMessageListScrolledToBottom ||\n newMessageInAnotherChannel ||\n newMessageIsMine ||\n dontIncreaseMainListCounterOnNewReply\n ) {\n return;\n }\n\n if (event.type === 'message.new') {\n // cannot rely on channel.countUnread because active channel is automatically marked read\n setCountUnread((prev) => prev + 1);\n } else if (event.message?.id === thread?.id) {\n const newReplyCount = event.message?.reply_count || 0;\n setCountUnread(() => newReplyCount - replyCount);\n }\n };\n client.on(observedEvent, handleEvent);\n\n return () => {\n client.off(observedEvent, handleEvent);\n };\n }, [\n activeChannel,\n client,\n isMessageListScrolledToBottom,\n observedEvent,\n replyCount,\n thread,\n threadList,\n ]);\n\n useEffect(() => {\n if (isMessageListScrolledToBottom) {\n setCountUnread(0);\n setReplyCount(thread?.reply_count || 0);\n }\n }, [isMessageListScrolledToBottom, thread]);\n\n if (isMessageListScrolledToBottom && !isNotAtLatestMessageSet) return null;\n\n return (\n <div className='str-chat__jump-to-latest-message'>\n <Button\n appearance='outline'\n aria-live='polite'\n circular\n className='str-chat__jump-to-latest-message__button'\n data-testid='scroll-to-latest-message-button'\n onClick={onClick}\n size='md'\n variant='secondary'\n >\n <IconArrowDown />\n </Button>\n {countUnread > 0 && (\n <Badge\n className='str-chat__jump-to-latest__unread-count'\n data-testid='unread-message-notification-counter'\n size='md'\n variant='primary'\n >\n {countUnread}\n </Badge>\n )}\n </div>\n );\n};\n\nexport const ScrollToLatestMessageButton = React.memo(\n UnMemoizedScrollToLatestMessageButton,\n) as typeof UnMemoizedScrollToLatestMessageButton;\n","import clsx from 'clsx';\nimport React from 'react';\n\nimport {\n useEnrichedMessages,\n useMessageListElements,\n useScrollLocationLogic,\n useUnreadMessagesNotification,\n} from './hooks/MessageList';\nimport { useMarkRead } from './hooks/useMarkRead';\nimport { NewMessageNotification as DefaultNewMessageNotification } from './NewMessageNotification';\nimport { UnreadMessagesNotification as DefaultUnreadMessagesNotification } from './UnreadMessagesNotification';\n\nimport type { ChannelActionContextValue } from '../../context/ChannelActionContext';\nimport { useChannelActionContext } from '../../context/ChannelActionContext';\nimport type { ChannelStateContextValue } from '../../context/ChannelStateContext';\nimport { useChannelStateContext } from '../../context/ChannelStateContext';\nimport { DialogManagerProvider } from '../../context';\nimport { useChatContext } from '../../context/ChatContext';\nimport { useComponentContext } from '../../context/ComponentContext';\nimport { MessageListContextProvider } from '../../context/MessageListContext';\nimport { MessageTranslationViewProvider } from '../../context/MessageTranslationViewContext';\nimport { EmptyStateIndicator as DefaultEmptyStateIndicator } from '../EmptyStateIndicator';\nimport type { InfiniteScrollProps } from '../InfiniteScrollPaginator/InfiniteScroll';\nimport { InfiniteScroll } from '../InfiniteScrollPaginator/InfiniteScroll';\nimport { LoadingIndicator as DefaultLoadingIndicator } from '../Loading';\nimport { defaultPinPermissions, MESSAGE_ACTIONS } from '../Message/utils';\nimport { TypingIndicator as DefaultTypingIndicator } from '../TypingIndicator';\nimport { MessageListMainPanel as DefaultMessageListMainPanel } from './MessageListMainPanel';\n\nimport { FloatingDateSeparator } from './FloatingDateSeparator';\nimport type { MessageRenderer } from './renderMessages';\nimport { defaultRenderMessages } from './renderMessages';\nimport { useStableId } from '../UtilityComponents/useStableId';\n\nimport type { LocalMessage } from 'stream-chat';\nimport type { GroupStyle, ProcessMessagesParams, RenderedMessage } from './utils';\nimport type { MessageProps } from '../Message/types';\n\nimport {\n DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD,\n DEFAULT_NEXT_CHANNEL_PAGE_SIZE,\n} from '../../constants/limits';\nimport { useLastOwnMessage } from './hooks/useLastOwnMessage';\nimport { ScrollToLatestMessageButton } from './ScrollToLatestMessageButton';\nimport {\n NotificationList as DefaultNotificationList,\n useNotificationTarget,\n} from '../Notifications';\n\ntype MessageListWithContextProps = Omit<\n ChannelStateContextValue,\n 'members' | 'mutes' | 'watchers'\n> &\n MessageListProps;\n\ntype JumpToLatestPhase = 'idle' | 'waiting-for-render' | 'animating';\ntype HighlightedJumpPhase = 'idle' | 'waiting-for-render' | 'animating';\n\nconst getMessageSetSignature = (messages: LocalMessage[]) =>\n `${messages.length}:${messages[0]?.id || ''}:${messages[messages.length - 1]?.id || ''}`;\n\nconst getMessageTimestamp = (message?: LocalMessage) =>\n message?.created_at?.getTime?.() ?? null;\n\nconst MessageListWithContext = (props: MessageListWithContextProps) => {\n const {\n channel,\n channelUnreadUiState,\n disableDateSeparator = false,\n groupStyles,\n hasMoreNewer = false,\n headerPosition,\n hideDeletedMessages = false,\n hideNewMessageSeparator = false,\n highlightedMessageId,\n internalInfiniteScrollProps: {\n threshold: loadMoreScrollThreshold = DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD,\n ...restInternalInfiniteScrollProps\n } = {},\n jumpToLatestMessage = () => Promise.resolve(),\n loadMore: loadMoreCallback,\n loadMoreNewer: loadMoreNewerCallback, // @deprecated in favor of `channelCapabilities` - TODO: remove in next major release\n maxTimeBetweenGroupedMessages,\n messageActions = Object.keys(MESSAGE_ACTIONS),\n messageLimit = DEFAULT_NEXT_CHANNEL_PAGE_SIZE,\n messages = [],\n noGroupByUser = false,\n pinPermissions = defaultPinPermissions,\n reactionDetailsSort,\n renderMessages = defaultRenderMessages,\n returnAllReadData = false,\n reviewProcessedMessage,\n showUnreadNotificationAlways,\n sortReactionDetails,\n sortReactions,\n suppressAutoscroll,\n threadList = false,\n unsafeHTML = false,\n } = props;\n\n const [listElement, setListElement] = React.useState<HTMLDivElement | null>(null);\n const [jumpToLatestPhase, setJumpToLatestPhase] =\n React.useState<JumpToLatestPhase>('idle');\n const [highlightedJumpPhase, setHighlightedJumpPhase] =\n React.useState<HighlightedJumpPhase>('idle');\n const [jumpSourceMessageSetSignature, setJumpSourceMessageSetSignature] =\n React.useState<string | null>(null);\n const previousHasMoreNewerRef = React.useRef(hasMoreNewer);\n const previousMessageSetSignatureRef = React.useRef('');\n const previousMessageSetBoundsRef = React.useRef<{\n firstTimestamp: number | null;\n lastTimestamp: number | null;\n }>({\n firstTimestamp: null,\n lastTimestamp: null,\n });\n\n const { customClasses } = useChatContext('MessageList');\n\n const {\n EmptyStateIndicator = DefaultEmptyStateIndicator,\n LoadingIndicator = DefaultLoadingIndicator,\n MessageListMainPanel = DefaultMessageListMainPanel,\n MessageListWrapper = 'ul',\n NewMessageNotification = DefaultNewMessageNotification,\n NotificationList = DefaultNotificationList,\n TypingIndicator = DefaultTypingIndicator,\n UnreadMessagesNotification = DefaultUnreadMessagesNotification,\n } = useComponentContext();\n\n const notificationTarget = useNotificationTarget();\n const messageSetSignature = React.useMemo(\n () => getMessageSetSignature(messages),\n [messages],\n );\n const messageSetBounds = React.useMemo(\n () => ({\n firstTimestamp: getMessageTimestamp(messages[0]),\n lastTimestamp: getMessageTimestamp(messages[messages.length - 1]),\n }),\n [messages],\n );\n const isJumpingToLatest = jumpToLatestPhase !== 'idle';\n // Highlighted jumps temporarily disable prepend pagination so a target\n // message rendered near the top does not immediately load the previous page.\n const isJumpingToHighlightedMessage = highlightedJumpPhase !== 'idle';\n const justReachedLatestMergedSet = previousHasMoreNewerRef.current && !hasMoreNewer;\n\n const {\n hasNewMessages,\n isMessageListScrolledToBottom,\n onScroll,\n scrollToBottom,\n wrapperRect,\n } = useScrollLocationLogic({\n disableAutoScrollToBottom: isJumpingToLatest || justReachedLatestMergedSet,\n disableScrollManagement: isJumpingToLatest || isJumpingToHighlightedMessage,\n hasMoreNewer,\n listElement,\n loadingMore: props.loadingMore,\n loadMoreScrollThreshold,\n messages, // todo: is it correct to base the scroll logic on an array that does not contain date separators or intro?\n scrolledUpThreshold: props.scrolledUpThreshold,\n suppressAutoscroll,\n });\n const isTypingIndicatorScrolledToBottom =\n isMessageListScrolledToBottom &&\n !isJumpingToLatest &&\n !isJumpingToHighlightedMessage &&\n !justReachedLatestMergedSet;\n\n const { show: showUnreadMessagesNotification } = useUnreadMessagesNotification({\n isMessageListScrolledToBottom,\n listElement,\n showAlways: !!showUnreadNotificationAlways,\n unreadCount: channelUnreadUiState?.unread_messages,\n });\n\n useMarkRead({\n isMessageListScrolledToBottom: isTypingIndicatorScrolledToBottom,\n messageListIsThread: threadList,\n wasMarkedUnread: !!channelUnreadUiState?.first_unread_message_id,\n });\n\n const { messageGroupStyles, messages: enrichedMessages } = useEnrichedMessages({\n channel,\n disableDateSeparator,\n groupStyles,\n headerPosition,\n hideDeletedMessages,\n hideNewMessageSeparator,\n maxTimeBetweenGroupedMessages,\n messages,\n noGroupByUser,\n reviewProcessedMessage,\n });\n\n const lastOwnMessage = useLastOwnMessage({\n messages,\n ownUserId: channel.getClient().user?.id,\n });\n\n const elements = useMessageListElements({\n channelUnreadUiState,\n enrichedMessages,\n internalMessageProps: {\n additionalMessageComposerProps: props.additionalMessageComposerProps,\n closeReactionSelectorOnClick: props.closeReactionSelectorOnClick,\n disableQuotedMessages: props.disableQuotedMessages,\n formatDate: props.formatDate,\n getDeleteMessageErrorNotification: props.getDeleteMessageErrorNotification,\n getFlagMessageErrorNotification: props.getFlagMessageErrorNotification,\n getFlagMessageSuccessNotification: props.getFlagMessageSuccessNotification,\n getMarkMessageUnreadErrorNotification: props.getMarkMessageUnreadErrorNotification,\n getMarkMessageUnreadSuccessNotification:\n props.getMarkMessageUnreadSuccessNotification,\n getMuteUserErrorNotification: props.getMuteUserErrorNotification,\n getMuteUserSuccessNotification: props.getMuteUserSuccessNotification,\n getPinMessageErrorNotification: props.getPinMessageErrorNotification,\n Message: props.Message,\n messageActions,\n messageListRect: wrapperRect,\n onlySenderCanEdit: props.onlySenderCanEdit,\n onMentionsClick: props.onMentionsClick,\n onMentionsHover: props.onMentionsHover,\n onUserClick: props.onUserClick,\n onUserHover: props.onUserHover,\n openThread: props.openThread,\n pinPermissions,\n reactionDetailsSort,\n renderText: props.renderText,\n retrySendMessage: props.retrySendMessage,\n showAvatar: props.showAvatar,\n sortReactionDetails,\n sortReactions,\n unsafeHTML,\n },\n lastOwnMessage,\n messageGroupStyles,\n messages,\n renderMessages,\n returnAllReadData,\n threadList,\n });\n\n const messageListClass = customClasses?.messageList || 'str-chat__message-list';\n\n const loadMore = React.useCallback(() => {\n if (loadMoreCallback) {\n loadMoreCallback(messageLimit);\n }\n }, [loadMoreCallback, messageLimit]);\n\n const loadMoreNewer = React.useCallback(() => {\n if (loadMoreNewerCallback) {\n loadMoreNewerCallback(messageLimit);\n }\n }, [loadMoreNewerCallback, messageLimit]);\n\n const scrollToBottomFromNotification = React.useCallback(async () => {\n if (hasMoreNewer) {\n setJumpSourceMessageSetSignature(messageSetSignature);\n setJumpToLatestPhase('waiting-for-render');\n try {\n await jumpToLatestMessage();\n } catch (error) {\n setJumpSourceMessageSetSignature(null);\n setJumpToLatestPhase('idle');\n throw error;\n }\n return;\n }\n\n scrollToBottom({ behavior: 'smooth' });\n }, [hasMoreNewer, jumpToLatestMessage, messageSetSignature, scrollToBottom]);\n\n React.useLayoutEffect(() => {\n if (\n jumpToLatestPhase !== 'waiting-for-render' ||\n hasMoreNewer ||\n !listElement?.scrollTo ||\n messageSetSignature === jumpSourceMessageSetSignature\n ) {\n return;\n }\n\n listElement.scrollTo({ top: 0 });\n\n const animationFrameId = requestAnimationFrame(() => {\n setJumpToLatestPhase('animating');\n listElement.scrollTo({\n behavior: 'smooth',\n top: listElement.scrollHeight,\n });\n });\n\n return () => cancelAnimationFrame(animationFrameId);\n }, [\n hasMoreNewer,\n jumpSourceMessageSetSignature,\n jumpToLatestPhase,\n listElement,\n messageSetSignature,\n ]);\n\n React.useLayoutEffect(() => {\n if (jumpToLatestPhase !== 'animating' || !listElement?.scrollTo) {\n return;\n }\n\n const finalize = () => {\n listElement.scrollTo({ top: listElement.scrollHeight });\n setJumpSourceMessageSetSignature(null);\n setJumpToLatestPhase('idle');\n };\n\n const settleTimeoutId = setTimeout(finalize, 500);\n\n return () => {\n clearTimeout(settleTimeoutId);\n };\n }, [jumpToLatestPhase, listElement]);\n\n React.useLayoutEffect(() => {\n if (!highlightedMessageId) {\n setHighlightedJumpPhase('idle');\n return;\n }\n\n const element = listElement?.querySelector(\n `[data-message-id='${highlightedMessageId}']`,\n );\n if (!element) {\n setHighlightedJumpPhase('waiting-for-render');\n return;\n }\n\n const messageSetChanged =\n previousMessageSetSignatureRef.current !== messageSetSignature;\n setHighlightedJumpPhase(messageSetChanged ? 'animating' : 'idle');\n let settleTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const animationFrameId = requestAnimationFrame(() => {\n element.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n });\n\n if (!messageSetChanged || !listElement?.scrollTo) {\n setHighlightedJumpPhase('idle');\n return;\n }\n\n settleTimeoutId = setTimeout(() => {\n const elementRect = element.getBoundingClientRect();\n const listRect = listElement.getBoundingClientRect();\n const targetTop =\n listElement.scrollTop +\n (elementRect.top - listRect.top) -\n (listElement.clientHeight - elementRect.height) / 2;\n\n listElement.scrollTo({ top: Math.max(targetTop, 0) });\n setHighlightedJumpPhase('idle');\n }, 500);\n });\n\n return () => {\n cancelAnimationFrame(animationFrameId);\n if (settleTimeoutId) {\n clearTimeout(settleTimeoutId);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [highlightedMessageId, messageSetSignature]);\n\n React.useEffect(() => {\n previousHasMoreNewerRef.current = hasMoreNewer;\n }, [hasMoreNewer]);\n\n React.useEffect(() => {\n previousMessageSetSignatureRef.current = messageSetSignature;\n previousMessageSetBoundsRef.current = messageSetBounds;\n }, [messageSetBounds, messageSetSignature]);\n\n const id = useStableId();\n\n const showEmptyStateIndicator = elements.length === 0 && !threadList;\n const dialogManagerId = threadList\n ? `message-list-dialog-manager-thread-${id}`\n : `message-list-dialog-manager-${id}`;\n\n return (\n <MessageListContextProvider\n value={{\n listElement,\n processedMessages: enrichedMessages,\n scrollToBottom,\n }}\n >\n <MessageTranslationViewProvider>\n <MessageListMainPanel>\n <DialogManagerProvider id={dialogManagerId}>\n {!threadList && showUnreadMessagesNotification && (\n <UnreadMessagesNotification\n unreadCount={channelUnreadUiState?.unread_messages}\n />\n )}\n <FloatingDateSeparator\n disableDateSeparator={disableDateSeparator}\n listElement={listElement}\n processedMessages={enrichedMessages}\n />\n <div\n className={clsx(messageListClass, customClasses?.threadList)}\n onScroll={onScroll}\n ref={setListElement}\n tabIndex={0}\n >\n {showEmptyStateIndicator ? (\n <EmptyStateIndicator listType={threadList ? 'thread' : 'message'} />\n ) : (\n <InfiniteScroll\n className='str-chat__message-list-scroll'\n data-testid='reverse-infinite-scroll'\n hasNextPage={props.hasMoreNewer}\n hasPreviousPage={isJumpingToHighlightedMessage ? false : props.hasMore}\n head={props.head}\n isLoading={Boolean(\n props.loadingMore || props.loadingMoreForJumpToChannelMessage,\n )}\n loader={\n <div className='str-chat__list__loading' key='loading-indicator'>\n {(props.loadingMore ||\n props.loadingMoreForJumpToChannelMessage) && <LoadingIndicator />}\n </div>\n }\n loadNextPage={loadMoreNewer}\n loadPreviousPage={\n isJumpingToHighlightedMessage ? () => undefined : loadMore\n }\n threshold={loadMoreScrollThreshold}\n {...restInternalInfiniteScrollProps}\n >\n <MessageListWrapper className='str-chat__ul'>\n {elements}\n </MessageListWrapper>\n <TypingIndicator\n isMessageListScrolledToBottom={isTypingIndicatorScrolledToBottom}\n scrollToBottom={scrollToBottom}\n threadList={threadList}\n />\n\n <div key='bottom' />\n </InfiniteScroll>\n )}\n </div>\n <NewMessageNotification\n newMessageCount={channelUnreadUiState?.unread_messages}\n showNotification={hasNewMessages || hasMoreNewer}\n />\n <ScrollToLatestMessageButton\n isMessageListScrolledToBottom={isMessageListScrolledToBottom}\n isNotAtLatestMessageSet={hasMoreNewer}\n onClick={scrollToBottomFromNotification}\n threadList={threadList}\n />\n </DialogManagerProvider>\n <NotificationList panel={notificationTarget} />\n </MessageListMainPanel>\n </MessageTranslationViewProvider>\n </MessageListContextProvider>\n );\n};\n\ntype PropsDrilledToMessage =\n | 'additionalMessageComposerProps'\n | 'closeReactionSelectorOnClick'\n | 'disableQuotedMessages'\n | 'formatDate'\n | 'getDeleteMessageErrorNotification'\n | 'getFlagMessageErrorNotification'\n | 'getFlagMessageSuccessNotification'\n | 'getMarkMessageUnreadErrorNotification'\n | 'getMarkMessageUnreadSuccessNotification'\n | 'getMuteUserErrorNotification'\n | 'getMuteUserSuccessNotification'\n | 'getPinMessageErrorNotification'\n | 'Message'\n | 'messageActions'\n | 'onlySenderCanEdit'\n | 'onMentionsClick'\n | 'onMentionsHover'\n | 'onUserClick'\n | 'onUserHover'\n | 'openThread'\n | 'pinPermissions' // @deprecated in favor of `channelCapabilities` - TODO: remove in next major release\n | 'reactionDetailsSort'\n | 'renderText'\n | 'retrySendMessage'\n | 'showAvatar'\n | 'sortReactions'\n | 'sortReactionDetails'\n | 'unsafeHTML';\n\nexport type MessageListProps = Partial<Pick<MessageProps, PropsDrilledToMessage>> & {\n /** Disables the injection of date separator components in MessageList, defaults to `false` */\n disableDateSeparator?: boolean;\n /** Callback function to set group styles for each message */\n groupStyles?: (\n message: RenderedMessage,\n previousMessage: RenderedMessage,\n nextMessage: RenderedMessage,\n noGroupByUser: boolean,\n maxTimeBetweenGroupedMessages?: number,\n ) => GroupStyle;\n /** Whether the list has more items to load */\n hasMore?: boolean;\n /** Element to be rendered at the top of the thread message list. By default, these are the Message and ThreadStart components */\n head?: React.ReactElement;\n /** Position to render HeaderComponent */\n headerPosition?: number;\n /** Hides the MessageDeleted components from the list, defaults to `false` */\n hideDeletedMessages?: boolean;\n /** Hides the DateSeparator component when new messages are received in a channel that's watched but not active, defaults to false */\n hideNewMessageSeparator?: boolean;\n /** Overrides the default props passed to [InfiniteScroll](https://github.com/GetStream/stream-chat-react/blob/master/src/components/InfiniteScrollPaginator/InfiniteScroll.tsx) */\n internalInfiniteScrollProps?: Partial<InfiniteScrollProps>;\n /** Function called when latest messages should be loaded, after the list has jumped at an earlier message set */\n jumpToLatestMessage?: () => Promise<void>;\n /** Whether or not the list is currently loading more items */\n loadingMore?: boolean;\n /** Whether or not the list is currently jumping to a highlighted message */\n loadingMoreForJumpToChannelMessage?: boolean;\n /** Whether or not the list is currently loading newer items */\n loadingMoreNewer?: boolean;\n /** Function called when more messages are to be loaded, defaults to function stored in [ChannelActionContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_action_context/) */\n loadMore?: ChannelActionContextValue['loadMore'] | (() => Promise<void>);\n /** Function called when newer messages are to be loaded, defaults to function stored in [ChannelActionContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_action_context/) */\n loadMoreNewer?: ChannelActionContextValue['loadMoreNewer'] | (() => Promise<void>);\n /** Maximum time in milliseconds that should occur between messages to still consider them grouped together */\n maxTimeBetweenGroupedMessages?: number;\n /** The limit to use when paginating messages */\n messageLimit?: number;\n /** The messages to render in the list, defaults to messages stored in [ChannelStateContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_state_context/) */\n messages?: LocalMessage[];\n /** If true, turns off message UI grouping by user */\n noGroupByUser?: boolean;\n /** Overrides the way MessageList renders messages */\n renderMessages?: MessageRenderer;\n /** If true, `readBy` data supplied to the `Message` components will include all user read states per sent message */\n returnAllReadData?: boolean;\n /**\n * Allows to review changes introduced to messages array on per message basis (e.g. date separator injection before a message).\n * The array returned from the function is appended to the array of messages that are later rendered into React elements in the `MessageList`.\n */\n reviewProcessedMessage?: ProcessMessagesParams['reviewProcessedMessage'];\n /**\n * The pixel threshold under which the message list is considered to be so near to the bottom,\n * so that if a new message is delivered, the list will be scrolled to the absolute bottom.\n * Defaults to 200px\n */\n scrolledUpThreshold?: number;\n /**\n * The floating notification informing about unread messages will be shown when the\n * UnreadMessagesSeparator is not visible. The default is false, that means the notification\n * is shown only when viewing unread messages.\n */\n showUnreadNotificationAlways?: boolean;\n /** If true, indicates the message list is a thread */\n threadList?: boolean; // todo: refactor needed - message list should have a state in which among others it would be optionally flagged as thread\n};\n\n/**\n * The MessageList component renders a list of Messages.\n * It is a consumer of the following contexts:\n * - [ChannelStateContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_state_context/)\n * - [ChannelActionContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_action_context/)\n * - [ComponentContext](https://getstream.io/chat/docs/sdk/react/contexts/component_context/)\n * - [TypingContext](https://getstream.io/chat/docs/sdk/react/contexts/typing_context/)\n */\nexport const MessageList = (props: MessageListProps) => {\n const { jumpToLatestMessage, loadMore, loadMoreNewer } =\n useChannelActionContext('MessageList');\n\n const {\n members: membersPropToNotPass, // eslint-disable-line @typescript-eslint/no-unused-vars\n mutes: mutesPropToNotPass, // eslint-disable-line @typescript-eslint/no-unused-vars\n watchers: watchersPropToNotPass, // eslint-disable-line @typescript-eslint/no-unused-vars\n ...restChannelStateContext\n } = useChannelStateContext('MessageList');\n\n return (\n <MessageListWithContext\n jumpToLatestMessage={jumpToLatestMessage}\n loadMore={loadMore}\n loadMoreNewer={loadMoreNewer}\n {...restChannelStateContext}\n {...props}\n />\n );\n};\n","import clsx from 'clsx';\nimport throttle from 'lodash.throttle';\nimport React from 'react';\nimport type { ItemProps, ListItem } from 'react-virtuoso';\n\nimport { EmptyStateIndicator as DefaultEmptyStateIndicator } from '../EmptyStateIndicator';\nimport { LoadingIndicator as DefaultLoadingIndicator } from '../Loading';\nimport { Message } from '../Message';\n\nimport { useComponentContext } from '../../context';\nimport type { GroupStyle, RenderedMessage } from './utils';\nimport { getIsFirstUnreadMessage, isDateSeparatorMessage, isIntroMessage } from './utils';\nimport type { VirtuosoContext } from './VirtualizedMessageList';\nimport type { UnknownType } from '../../types/types';\n\nconst PREPEND_OFFSET = 10 ** 7;\n\nexport function calculateItemIndex(virtuosoIndex: number, numItemsPrepended: number) {\n return virtuosoIndex + numItemsPrepended - PREPEND_OFFSET;\n}\n\nexport function calculateFirstItemIndex(numItemsPrepended: number) {\n return PREPEND_OFFSET - numItemsPrepended;\n}\n\nexport const makeItemsRenderedHandler = (\n renderedItemsActions: Array<(msg: RenderedMessage[]) => void>,\n processedMessages: RenderedMessage[],\n) =>\n throttle((items: ListItem<UnknownType>[]) => {\n const renderedMessages = items\n .map((item) => {\n if (!item.originalIndex) return undefined;\n return processedMessages[calculateItemIndex(item.originalIndex, PREPEND_OFFSET)];\n })\n .filter((msg) => !!msg);\n renderedItemsActions.forEach((action) =>\n action(renderedMessages as RenderedMessage[]),\n );\n }, 200);\n\ntype CommonVirtuosoComponentProps = {\n context?: VirtuosoContext;\n};\n// using 'display: inline-block'\n// traps CSS margins of the item elements, preventing incorrect item measurements\nexport const Item = ({ context, ...props }: ItemProps & CommonVirtuosoComponentProps) => {\n if (!context) return <></>;\n\n const message =\n context.processedMessages[\n calculateItemIndex(props['data-item-index'], context.numItemsPrepended)\n ];\n const groupStyles: GroupStyle = context.messageGroupStyles[message.id];\n\n return (\n <div\n {...props}\n className={\n context?.customClasses?.virtualMessage ||\n clsx('str-chat__virtual-list-message-wrapper str-chat__li', {\n [`str-chat__li--${groupStyles}`]: groupStyles,\n })\n }\n />\n );\n};\nexport const Header = ({ context }: CommonVirtuosoComponentProps) => {\n const { LoadingIndicator = DefaultLoadingIndicator } = useComponentContext(\n 'VirtualizedMessageListHeader',\n );\n\n return (\n <>\n {context?.head}\n {context?.loadingMore && LoadingIndicator && (\n <div className='str-chat__virtual-list__loading'>\n <LoadingIndicator />\n </div>\n )}\n </>\n );\n};\nexport const EmptyPlaceholder = ({ context }: CommonVirtuosoComponentProps) => {\n const { EmptyStateIndicator = DefaultEmptyStateIndicator } = useComponentContext(\n 'VirtualizedMessageList',\n );\n // prevent showing that there are no messages if there actually are messages (for some reason virtuoso decides to render empty placeholder first, even though it has the totalCount prop > 0)\n if (\n typeof context?.processedMessages !== 'undefined' &&\n context.processedMessages.length > 0\n )\n return null;\n\n return (\n <>\n {EmptyStateIndicator && (\n <EmptyStateIndicator listType={context?.threadList ? 'thread' : 'message'} />\n )}\n </>\n );\n};\n\nexport const messageRenderer = (\n virtuosoIndex: number,\n _data: UnknownType,\n virtuosoContext: VirtuosoContext,\n) => {\n const {\n additionalMessageComposerProps,\n closeReactionSelectorOnClick,\n customMessageRenderer,\n DateSeparator,\n firstUnreadMessageId,\n formatDate,\n lastOwnMessage,\n lastReadDate,\n lastReadMessageId,\n lastReceivedMessageId,\n Message: MessageUIComponent,\n messageActions,\n messageGroupStyles,\n MessageSystem,\n numItemsPrepended,\n openThread,\n ownMessagesDeliveredToOthers,\n ownMessagesReadByOthers,\n processedMessages: messageList,\n reactionDetailsSort,\n renderText,\n returnAllReadData,\n showAvatar,\n sortReactionDetails,\n sortReactions,\n threadList,\n unreadMessageCount = 0,\n UnreadMessagesSeparator,\n virtuosoRef,\n } = virtuosoContext;\n\n const streamMessageIndex = calculateItemIndex(virtuosoIndex, numItemsPrepended);\n\n if (customMessageRenderer) {\n return customMessageRenderer(messageList, streamMessageIndex);\n }\n\n const message = messageList[streamMessageIndex];\n\n if (!message || isIntroMessage(message)) return <div style={{ height: '1px' }}></div>; // returning null or zero height breaks the virtuoso\n\n if (isDateSeparatorMessage(message)) {\n return DateSeparator ? (\n <DateSeparator date={message.date} unread={message.unread} />\n ) : null;\n }\n\n if (message.type === 'system') {\n return MessageSystem ? <MessageSystem message={message} /> : null;\n }\n\n const isFirstUnreadMessage = getIsFirstUnreadMessage({\n firstUnreadMessageId,\n isFirstMessage: streamMessageIndex === 0,\n lastReadDate,\n lastReadMessageId,\n message,\n previousMessage: streamMessageIndex ? messageList[streamMessageIndex - 1] : undefined,\n unreadMessageCount,\n });\n\n return (\n <>\n {isFirstUnreadMessage && (\n <div className='str-chat__unread-messages-separator-wrapper'>\n <UnreadMessagesSeparator unreadCount={unreadMessageCount} />\n </div>\n )}\n <Message\n additionalMessageComposerProps={additionalMessageComposerProps}\n autoscrollToBottom={virtuosoRef.current?.autoscrollToBottom}\n closeReactionSelectorOnClick={closeReactionSelectorOnClick}\n deliveredTo={ownMessagesDeliveredToOthers[message.id] || []}\n formatDate={formatDate}\n groupStyles={[messageGroupStyles[message.id] ?? '']}\n lastOwnMessage={lastOwnMessage}\n lastReceivedId={lastReceivedMessageId}\n message={message}\n Message={MessageUIComponent}\n messageActions={messageActions}\n openThread={openThread}\n reactionDetailsSort={reactionDetailsSort}\n readBy={ownMessagesReadByOthers[message.id] || []}\n renderText={renderText}\n returnAllReadData={returnAllReadData}\n showAvatar={showAvatar}\n sortReactionDetails={sortReactionDetails}\n sortReactions={sortReactions}\n threadList={threadList}\n />\n </>\n );\n};\n","import React, { createContext, useContext } from 'react';\nimport type { PropsWithChildren } from 'react';\n\nexport type VirtualizedMessageListContextValue = {\n /** Function that scrolls the list to the bottom. */\n scrollToBottom: () => void;\n};\n\nexport const VirtualizedMessageListContext = createContext<\n VirtualizedMessageListContextValue | undefined\n>(undefined);\n\n/**\n * Context provider for components rendered within the `VirtualizedMessageList`\n */\nexport const VirtualizedMessageListContextProvider = ({\n children,\n value,\n}: PropsWithChildren<{\n value: VirtualizedMessageListContextValue;\n}>) => (\n <VirtualizedMessageListContext.Provider\n value={value as VirtualizedMessageListContextValue}\n >\n {children}\n </VirtualizedMessageListContext.Provider>\n);\n\nexport const useVirtualizedMessageListContext = () =>\n useContext(VirtualizedMessageListContext) as VirtualizedMessageListContextValue;\n","import type { RefObject } from 'react';\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport { FloatingDateSeparator } from './FloatingDateSeparator';\nimport type {\n ComputeItemKey,\n ScrollSeekConfiguration,\n ScrollSeekPlaceholderProps,\n VirtuosoHandle,\n VirtuosoProps,\n} from 'react-virtuoso';\nimport { Virtuoso } from 'react-virtuoso';\n\nimport { GiphyPreviewMessage as DefaultGiphyPreviewMessage } from './GiphyPreviewMessage';\nimport { useLastReadData } from './hooks';\nimport {\n useGiphyPreview,\n useMessageSetKey,\n useNewMessageNotification,\n usePrependedMessagesCount,\n useScrollToBottomOnNewMessage,\n useShouldForceScrollToBottom,\n useUnreadMessagesNotificationVirtualized,\n} from './hooks/VirtualizedMessageList';\nimport { useMarkRead } from './hooks/useMarkRead';\nimport { NewMessageNotification as DefaultNewMessageNotification } from './NewMessageNotification';\nimport { MessageListMainPanel as DefaultMessageListMainPanel } from './MessageListMainPanel';\nimport type { GroupStyle, ProcessMessagesParams, RenderedMessage } from './utils';\nimport { getGroupStyles, getLastReceived, processMessages } from './utils';\nimport type { MessageProps, MessageUIComponentProps } from '../Message';\nimport { MessageUI } from '../Message';\nimport { UnreadMessagesNotification as DefaultUnreadMessagesNotification } from './UnreadMessagesNotification';\nimport {\n calculateFirstItemIndex,\n calculateItemIndex,\n EmptyPlaceholder,\n Header,\n Item,\n makeItemsRenderedHandler,\n messageRenderer,\n} from './VirtualizedMessageListComponents';\n\nimport {\n UnreadMessagesSeparator as DefaultUnreadMessagesSeparator,\n ScrollToLatestMessageButton,\n} from '../MessageList';\nimport { DateSeparator as DefaultDateSeparator } from '../DateSeparator';\nimport { EventComponent as DefaultMessageSystem } from '../EventComponent';\nimport {\n NotificationList as DefaultNotificationList,\n useNotificationTarget,\n} from '../Notifications';\n\nimport { DialogManagerProvider } from '../../context';\nimport type { ChannelActionContextValue } from '../../context/ChannelActionContext';\nimport { useChannelActionContext } from '../../context/ChannelActionContext';\nimport type {\n ChannelNotifications,\n ChannelStateContextValue,\n} from '../../context/ChannelStateContext';\nimport { useChannelStateContext } from '../../context/ChannelStateContext';\nimport type { ChatContextValue } from '../../context/ChatContext';\nimport { useChatContext } from '../../context/ChatContext';\nimport type { ComponentContextValue } from '../../context/ComponentContext';\nimport { useComponentContext } from '../../context/ComponentContext';\nimport { MessageTranslationViewProvider } from '../../context/MessageTranslationViewContext';\nimport { VirtualizedMessageListContextProvider } from '../../context/VirtualizedMessageListContext';\n\nimport type {\n Channel,\n LocalMessage,\n ChannelState as StreamChannelState,\n UserResponse,\n} from 'stream-chat';\nimport type { UnknownType } from '../../types/types';\nimport { DEFAULT_NEXT_CHANNEL_PAGE_SIZE } from '../../constants/limits';\nimport { useStableId } from '../UtilityComponents/useStableId';\nimport { useLastDeliveredData } from './hooks/useLastDeliveredData';\nimport { useLastOwnMessage } from './hooks/useLastOwnMessage';\n\ntype PropsDrilledToMessage =\n | 'additionalMessageComposerProps'\n | 'formatDate'\n | 'messageActions'\n | 'openThread'\n | 'reactionDetailsSort'\n | 'renderText'\n | 'showAvatar'\n | 'sortReactions'\n | 'sortReactionDetails';\n\ntype VirtualizedMessageListPropsForContext =\n | PropsDrilledToMessage\n | 'closeReactionSelectorOnClick'\n | 'customMessageRenderer'\n | 'head'\n | 'loadingMore'\n | 'Message'\n | 'returnAllReadData'\n | 'shouldGroupByUser'\n | 'threadList';\n\n/**\n * Context object provided to some Virtuoso props that are functions (components rendered by Virtuoso and other functions)\n */\nexport type VirtuosoContext = Required<\n Pick<\n ComponentContextValue,\n 'DateSeparator' | 'MessageSystem' | 'UnreadMessagesSeparator'\n >\n> &\n Pick<VirtualizedMessageListProps, VirtualizedMessageListPropsForContext> &\n Pick<ChatContextValue, 'customClasses'> & {\n /** Latest received message id in the current channel */\n lastReceivedMessageId: string | null | undefined;\n /** Object mapping between the message ID and a string representing the position in the group of a sequence of messages posted by the same user. */\n messageGroupStyles: Record<string, GroupStyle>;\n /** Number of messages prepended before the first page of messages. This is needed to calculate the virtual position in the virtual list. */\n numItemsPrepended: number;\n /** Mapping of message ID of own messages to the array of users, who were delivered the given message */\n ownMessagesDeliveredToOthers: Record<string, UserResponse[]>;\n /** Mapping of message ID of own messages to the array of users, who read the given message */\n ownMessagesReadByOthers: Record<string, UserResponse[]>;\n /** The original message list enriched with date separators, omitted deleted messages or giphy previews. */\n processedMessages: RenderedMessage[];\n /** Instance of VirtuosoHandle object providing the API to navigate in the virtualized list by various scroll actions. */\n virtuosoRef: RefObject<VirtuosoHandle | null>;\n /** Latest own message in currently displayed message set. */\n lastOwnMessage?: LocalMessage;\n /** Message id which was marked as unread. ALl the messages following this message are considered unrea. */\n firstUnreadMessageId?: string;\n lastReadDate?: Date;\n /**\n * The ID of the last message considered read by the current user in the current channel.\n * All the messages following this message are considered unread.\n */\n lastReadMessageId?: string;\n /** The number of unread messages in the current channel. */\n unreadMessageCount?: number;\n };\n\ntype VirtualizedMessageListWithContextProps = VirtualizedMessageListProps & {\n channel: Channel;\n hasMore: boolean;\n hasMoreNewer: boolean;\n jumpToLatestMessage: () => Promise<void>;\n loadingMore: boolean;\n loadingMoreNewer: boolean;\n notifications: ChannelNotifications;\n read?: StreamChannelState['read'];\n};\n\nfunction captureResizeObserverExceededError(e: ErrorEvent) {\n if (\n e.message === 'ResizeObserver loop completed with undelivered notifications.' ||\n e.message === 'ResizeObserver loop limit exceeded'\n ) {\n e.stopImmediatePropagation();\n }\n}\n\nfunction useCaptureResizeObserverExceededError() {\n useEffect(() => {\n window.addEventListener('error', captureResizeObserverExceededError);\n return () => {\n window.removeEventListener('error', captureResizeObserverExceededError);\n };\n }, []);\n}\n\nfunction fractionalItemSize(element: HTMLElement) {\n return element.getBoundingClientRect().height;\n}\n\nfunction findMessageIndex(messages: RenderedMessage[], id: string) {\n return messages.findIndex((message) => message.id === id);\n}\n\nfunction calculateInitialTopMostItemIndex(\n messages: RenderedMessage[],\n highlightedMessageId: string | undefined,\n) {\n if (highlightedMessageId) {\n const index = findMessageIndex(messages, highlightedMessageId);\n if (index !== -1) {\n return { align: 'center', index } as const;\n }\n }\n return messages.length - 1;\n}\n\nconst VirtualizedMessageListWithContext = (\n props: VirtualizedMessageListWithContextProps,\n) => {\n const {\n additionalMessageComposerProps,\n additionalVirtuosoProps = {},\n channel,\n channelUnreadUiState,\n closeReactionSelectorOnClick,\n customMessageRenderer,\n defaultItemHeight,\n disableDateSeparator = true,\n formatDate,\n groupStyles,\n hasMoreNewer,\n head,\n hideDeletedMessages = false,\n hideNewMessageSeparator = false,\n highlightedMessageId,\n jumpToLatestMessage,\n loadingMore,\n loadMore,\n loadMoreNewer,\n maxTimeBetweenGroupedMessages,\n Message: MessageUIComponentFromProps,\n messageActions,\n messageLimit = DEFAULT_NEXT_CHANNEL_PAGE_SIZE,\n messages,\n openThread,\n // TODO: refactor to scrollSeekPlaceHolderConfiguration and components.ScrollSeekPlaceholder, like the Virtuoso Component\n overscan = 0,\n reactionDetailsSort,\n renderText,\n returnAllReadData = false,\n reviewProcessedMessage,\n scrollSeekPlaceHolder,\n scrollToLatestMessageOnFocus = false,\n separateGiphyPreview = false,\n shouldGroupByUser = false,\n showAvatar,\n showUnreadNotificationAlways,\n sortReactionDetails,\n sortReactions,\n stickToBottomScrollBehavior = 'smooth',\n suppressAutoscroll,\n threadList,\n } = props;\n\n const { components: virtuosoComponentsFromProps, ...overridingVirtuosoProps } =\n additionalVirtuosoProps;\n\n // Stops errors generated from react-virtuoso to bubble up\n // to Sentry or other tracking tools.\n useCaptureResizeObserverExceededError();\n\n const {\n DateSeparator = DefaultDateSeparator,\n GiphyPreviewMessage = DefaultGiphyPreviewMessage,\n MessageListMainPanel = DefaultMessageListMainPanel,\n MessageSystem = DefaultMessageSystem,\n NewMessageNotification = DefaultNewMessageNotification,\n NotificationList = DefaultNotificationList,\n TypingIndicator,\n UnreadMessagesNotification = DefaultUnreadMessagesNotification,\n UnreadMessagesSeparator = DefaultUnreadMessagesSeparator,\n VirtualMessage: MessageUIComponentFromContext = MessageUI,\n } = useComponentContext('VirtualizedMessageList');\n const MessageUIComponent = MessageUIComponentFromProps || MessageUIComponentFromContext;\n\n const { client, customClasses } = useChatContext('VirtualizedMessageList');\n const notificationTarget = useNotificationTarget();\n\n const virtuoso = useRef<VirtuosoHandle>(null);\n\n const lastRead = useMemo(() => channel.lastRead?.(), [channel]);\n\n const { show: showUnreadMessagesNotification, toggleShowUnreadMessagesNotification } =\n useUnreadMessagesNotificationVirtualized({\n lastRead: channelUnreadUiState?.last_read,\n showAlways: !!showUnreadNotificationAlways,\n unreadCount: channelUnreadUiState?.unread_messages ?? 0,\n });\n\n const { giphyPreviewMessage, setGiphyPreviewMessage } =\n useGiphyPreview(separateGiphyPreview);\n\n const processedMessages = useMemo(() => {\n if (typeof messages === 'undefined') {\n return [];\n }\n\n if (\n disableDateSeparator &&\n !hideDeletedMessages &&\n hideNewMessageSeparator &&\n !separateGiphyPreview\n ) {\n return messages;\n }\n\n return processMessages({\n enableDateSeparator: !disableDateSeparator,\n hideDeletedMessages,\n hideNewMessageSeparator,\n lastRead,\n messages,\n reviewProcessedMessage,\n setGiphyPreviewMessage,\n userId: client.userID || '',\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n disableDateSeparator,\n hideDeletedMessages,\n hideNewMessageSeparator,\n lastRead,\n messages,\n messages?.length,\n client.userID,\n ]);\n\n /**\n * This indirection via a ref is needed because Virtuoso’s itemsRendered is set at render time,\n * while FloatingDateSeparator lives in a child component that may run its hooks in a different order.\n * Using a ref lets the parent provide the callback to Virtuoso while the child keeps ownership\n * of the actual handler implementation.\n */\n const floatingDateItemsRenderedRef = useRef<\n ((rendered: RenderedMessage[]) => void) | null\n >(null);\n\n const lastOwnMessage = useLastOwnMessage({ messages, ownUserId: client.user?.id });\n\n // get the mapping of own messages to array of users who read them\n const ownMessagesReadByOthers = useLastReadData({\n channel,\n lastOwnMessage,\n messages: messages || [],\n returnAllReadData,\n });\n\n const ownMessagesDeliveredToOthers = useLastDeliveredData({\n channel,\n lastOwnMessage,\n messages: messages || [],\n returnAllReadData,\n });\n\n const lastReceivedMessageId = useMemo(\n () => getLastReceived(processedMessages),\n [processedMessages],\n );\n\n const groupStylesFn = groupStyles || getGroupStyles;\n const messageGroupStyles = useMemo(\n () =>\n processedMessages.reduce<Record<string, GroupStyle>>((acc, message, i) => {\n const style = groupStylesFn(\n message,\n processedMessages[i - 1],\n processedMessages[i + 1],\n !shouldGroupByUser,\n maxTimeBetweenGroupedMessages,\n );\n if (style && message.id) acc[message.id] = style;\n return acc;\n }, {}),\n // processedMessages were incorrectly rebuilt with a new object identity at some point, hence the .length usage\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n maxTimeBetweenGroupedMessages,\n processedMessages.length,\n shouldGroupByUser,\n groupStylesFn,\n ],\n );\n\n const {\n atBottom,\n isMessageListScrolledToBottom,\n newMessagesNotification,\n setIsMessageListScrolledToBottom,\n setNewMessagesNotification,\n } = useNewMessageNotification(processedMessages, client.userID, hasMoreNewer);\n\n useMarkRead({\n isMessageListScrolledToBottom,\n messageListIsThread: !!threadList,\n wasMarkedUnread: !!channelUnreadUiState?.first_unread_message_id,\n });\n\n const scrollToBottom = useCallback(async () => {\n if (hasMoreNewer) {\n await jumpToLatestMessage();\n return;\n }\n\n if (virtuoso.current) {\n virtuoso.current.scrollToIndex(processedMessages.length - 1);\n }\n\n setNewMessagesNotification(false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n virtuoso,\n processedMessages,\n setNewMessagesNotification,\n // processedMessages were incorrectly rebuilt with a new object identity at some point, hence the .length usage\n processedMessages.length,\n hasMoreNewer,\n jumpToLatestMessage,\n ]);\n\n useScrollToBottomOnNewMessage({\n messages,\n scrollToBottom,\n scrollToLatestMessageOnFocus,\n });\n\n const numItemsPrepended = usePrependedMessagesCount(\n processedMessages,\n !disableDateSeparator,\n );\n\n const { messageSetKey } = useMessageSetKey({ messages });\n\n const shouldForceScrollToBottom = useShouldForceScrollToBottom(\n processedMessages,\n client.userID,\n );\n\n const handleItemsRendered = useMemo(\n () =>\n makeItemsRenderedHandler(\n [\n toggleShowUnreadMessagesNotification,\n (rendered) => floatingDateItemsRenderedRef.current?.(rendered),\n ],\n processedMessages,\n ),\n [processedMessages, toggleShowUnreadMessagesNotification],\n );\n const followOutput = (isAtBottom: boolean) => {\n if (hasMoreNewer || suppressAutoscroll) {\n return false;\n }\n\n if (shouldForceScrollToBottom()) {\n return isAtBottom ? stickToBottomScrollBehavior : 'auto';\n }\n // a message from another user has been received - don't scroll to bottom unless already there\n return isAtBottom ? stickToBottomScrollBehavior : false;\n };\n\n const computeItemKey = useCallback<ComputeItemKey<UnknownType, VirtuosoContext>>(\n (index, _, { numItemsPrepended, processedMessages }) =>\n processedMessages[calculateItemIndex(index, numItemsPrepended)].id,\n [],\n );\n\n const atBottomStateChange = (isAtBottom: boolean) => {\n atBottom.current = isAtBottom;\n setIsMessageListScrolledToBottom(isAtBottom);\n\n if (isAtBottom) {\n loadMoreNewer?.(messageLimit);\n setNewMessagesNotification?.(false);\n }\n };\n const atTopStateChange = (isAtTop: boolean) => {\n if (isAtTop) {\n loadMore?.(messageLimit);\n }\n };\n\n useEffect(() => {\n let scrollTimeout: ReturnType<typeof setTimeout>;\n if (highlightedMessageId) {\n const index = findMessageIndex(processedMessages, highlightedMessageId);\n if (index !== -1) {\n scrollTimeout = setTimeout(() => {\n virtuoso.current?.scrollToIndex({ align: 'center', index });\n }, 0);\n }\n }\n return () => {\n clearTimeout(scrollTimeout);\n };\n }, [highlightedMessageId, processedMessages]);\n\n const id = useStableId();\n\n if (!processedMessages) return null;\n\n const dialogManagerId = threadList\n ? `virtualized-message-list-dialog-manager-thread-${id}`\n : `virtualized-message-list-dialog-manager-${id}`;\n\n return (\n <VirtualizedMessageListContextProvider value={{ scrollToBottom }}>\n <MessageTranslationViewProvider>\n <MessageListMainPanel>\n <DialogManagerProvider id={dialogManagerId}>\n {!threadList && showUnreadMessagesNotification && (\n <UnreadMessagesNotification\n unreadCount={channelUnreadUiState?.unread_messages}\n />\n )}\n <div\n className={\n customClasses?.virtualizedMessageList || 'str-chat__virtual-list'\n }\n >\n <FloatingDateSeparator\n disableDateSeparator={disableDateSeparator}\n itemsRenderedRef={floatingDateItemsRenderedRef}\n processedMessages={processedMessages}\n />\n <Virtuoso<UnknownType, VirtuosoContext>\n atBottomStateChange={atBottomStateChange}\n atBottomThreshold={100}\n atTopStateChange={atTopStateChange}\n atTopThreshold={100}\n className='str-chat__message-list-scroll'\n components={{\n EmptyPlaceholder,\n Header,\n Item,\n ...(TypingIndicator && {\n Footer: () =>\n isMessageListScrolledToBottom ? (\n <TypingIndicator\n isMessageListScrolledToBottom={isMessageListScrolledToBottom}\n scrollToBottom={scrollToBottom}\n threadList={threadList}\n />\n ) : null,\n }),\n ...virtuosoComponentsFromProps,\n }}\n computeItemKey={computeItemKey}\n context={{\n additionalMessageComposerProps,\n closeReactionSelectorOnClick,\n customClasses,\n customMessageRenderer,\n DateSeparator,\n firstUnreadMessageId: channelUnreadUiState?.first_unread_message_id,\n formatDate,\n head,\n lastOwnMessage,\n lastReadDate: channelUnreadUiState?.last_read,\n lastReadMessageId: channelUnreadUiState?.last_read_message_id,\n lastReceivedMessageId,\n loadingMore,\n Message: MessageUIComponent,\n messageActions,\n messageGroupStyles,\n MessageSystem,\n numItemsPrepended,\n openThread,\n ownMessagesDeliveredToOthers,\n ownMessagesReadByOthers,\n processedMessages,\n reactionDetailsSort,\n renderText,\n returnAllReadData,\n shouldGroupByUser,\n showAvatar,\n sortReactionDetails,\n sortReactions,\n threadList,\n unreadMessageCount: channelUnreadUiState?.unread_messages,\n UnreadMessagesSeparator,\n virtuosoRef: virtuoso,\n }}\n firstItemIndex={calculateFirstItemIndex(numItemsPrepended)}\n followOutput={followOutput}\n increaseViewportBy={{ bottom: 200, top: 0 }}\n initialTopMostItemIndex={calculateInitialTopMostItemIndex(\n processedMessages,\n highlightedMessageId,\n )}\n itemContent={messageRenderer}\n itemSize={fractionalItemSize}\n itemsRendered={handleItemsRendered}\n key={messageSetKey}\n overscan={overscan}\n ref={virtuoso}\n style={{ overflowX: 'hidden' }}\n totalCount={processedMessages.length}\n {...overridingVirtuosoProps}\n {...(scrollSeekPlaceHolder ? { scrollSeek: scrollSeekPlaceHolder } : {})}\n {...(defaultItemHeight ? { defaultItemHeight } : {})}\n />\n <NewMessageNotification\n newMessageCount={channelUnreadUiState?.unread_messages}\n showNotification={newMessagesNotification || hasMoreNewer}\n />\n <ScrollToLatestMessageButton\n isMessageListScrolledToBottom={isMessageListScrolledToBottom}\n isNotAtLatestMessageSet={hasMoreNewer}\n onClick={scrollToBottom}\n threadList={threadList}\n />\n </div>\n </DialogManagerProvider>\n <NotificationList panel={notificationTarget} />\n </MessageListMainPanel>\n {giphyPreviewMessage && <GiphyPreviewMessage message={giphyPreviewMessage} />}\n </MessageTranslationViewProvider>\n </VirtualizedMessageListContextProvider>\n );\n};\n\nexport type VirtualizedMessageListProps = Partial<\n Pick<MessageProps, PropsDrilledToMessage>\n> & {\n /** Additional props to be passed the underlying [`react-virtuoso` virtualized list dependency](https://virtuoso.dev/virtuoso-api-reference/) */\n additionalVirtuosoProps?: VirtuosoProps<UnknownType, VirtuosoContext>;\n channelUnreadUiState?: ChannelStateContextValue['channelUnreadUiState'];\n /** If true, picking a reaction from the `ReactionSelector` component will close the selector */\n closeReactionSelectorOnClick?: boolean;\n /** Custom render function, if passed, certain UI props are ignored */\n customMessageRenderer?: (\n messageList: RenderedMessage[],\n index: number,\n ) => React.ReactElement;\n /** @deprecated Use additionalVirtuosoProps.defaultItemHeight instead. Will be removed with next major release - `v11.0.0`.\n * If set, the default item height is used for the calculation of the total list height. Use if you expect messages with a lot of height variance\n * */\n defaultItemHeight?: number;\n /** Disables the injection of date separator components in MessageList, defaults to `true` */\n disableDateSeparator?: boolean;\n /** Callback function to set group styles for each message */\n groupStyles?: (\n message: RenderedMessage,\n previousMessage: RenderedMessage,\n nextMessage: RenderedMessage,\n noGroupByUser: boolean,\n maxTimeBetweenGroupedMessages?: number,\n ) => GroupStyle;\n /** Whether or not the list has more items to load */\n hasMore?: boolean;\n /** Whether or not the list has newer items to load */\n hasMoreNewer?: boolean;\n /**\n * @deprecated Use additionalVirtuosoProps.components.Header to override default component rendered above the list ove messages.\n * Element to be rendered at the top of the thread message list. By default, these are the Message and ThreadStart components\n */\n head?: React.ReactElement;\n /** Hides the `MessageDeleted` components from the list, defaults to `false` */\n hideDeletedMessages?: boolean;\n /** Hides the `DateSeparator` component when new messages are received in a channel that's watched but not active, defaults to false */\n hideNewMessageSeparator?: boolean;\n /** The id of the message to highlight and center */\n highlightedMessageId?: string;\n /** Whether or not the list is currently loading more items */\n loadingMore?: boolean;\n /** Whether or not the list is currently loading newer items */\n loadingMoreNewer?: boolean;\n /** Function called when more messages are to be loaded, defaults to function stored in [ChannelActionContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_action_context/) */\n loadMore?: ChannelActionContextValue['loadMore'] | (() => Promise<void>);\n /** Function called when new messages are to be loaded, defaults to function stored in [ChannelActionContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_action_context/) */\n loadMoreNewer?: ChannelActionContextValue['loadMore'] | (() => Promise<void>);\n /** Maximum time in milliseconds that should occur between messages to still consider them grouped together */\n maxTimeBetweenGroupedMessages?: number;\n /** Custom UI component to display a message, defaults to and accepts same props as [MessageUI](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageUI.tsx) */\n Message?: React.ComponentType<MessageUIComponentProps>;\n /** The limit to use when paginating messages */\n messageLimit?: number;\n /** Optional prop to override the messages available from [ChannelStateContext](https://getstream.io/chat/docs/sdk/react/contexts/channel_state_context/) */\n messages?: LocalMessage[];\n /**\n * @deprecated Use additionalVirtuosoProps.overscan instead. Will be removed with next major release - `v11.0.0`.\n * The amount of extra content the list should render in addition to what's necessary to fill in the viewport\n */\n overscan?: number;\n /** Keep track of read receipts for each message sent by the user. When disabled, only the last own message delivery / read status is rendered. */\n returnAllReadData?: boolean;\n /**\n * Allows to review changes introduced to messages array on per message basis (e.g. date separator injected before a message).\n * The array returned from the function is appended to the array of messages that are later rendered into React elements in the `VirtualizedMessageList`.\n */\n reviewProcessedMessage?: ProcessMessagesParams['reviewProcessedMessage'];\n /**\n * @deprecated Pass additionalVirtuosoProps.scrollSeekConfiguration and specify the placeholder in additionalVirtuosoProps.components.ScrollSeekPlaceholder instead. Will be removed with next major release - `v11.0.0`.\n * Performance improvement by showing placeholders if user scrolls fast through list.\n * it can be used like this:\n * ```\n * {\n * enter: (velocity) => Math.abs(velocity) > 120,\n * exit: (velocity) => Math.abs(velocity) < 40,\n * change: () => null,\n * placeholder: ({index, height})=> <div style={{height: height + \"px\"}}>{index}</div>,\n * }\n * ```\n */\n scrollSeekPlaceHolder?: ScrollSeekConfiguration & {\n placeholder: React.ComponentType<ScrollSeekPlaceholderProps>;\n };\n /** When `true`, the list will scroll to the latest message when the window regains focus */\n scrollToLatestMessageOnFocus?: boolean;\n /** If true, the Giphy preview will render as a separate component above the `MessageComposer`, rather than inline with the other messages in the list */\n separateGiphyPreview?: boolean;\n /** If true, group messages belonging to the same user, otherwise show each message individually */\n shouldGroupByUser?: boolean;\n /**\n * The floating notification informing about unread messages will be shown when the\n * UnreadMessagesSeparator is not visible. The default is false, that means the notification\n * is shown only when viewing unread messages.\n */\n showUnreadNotificationAlways?: boolean;\n /** The scrollTo behavior when new messages appear. Use `\"smooth\"` for regular chat channels, and `\"auto\"` (which results in instant scroll to bottom) if you expect high throughput. */\n stickToBottomScrollBehavior?: 'smooth' | 'auto';\n /** stops the list from autoscrolling when new messages are loaded */\n suppressAutoscroll?: boolean;\n /** If true, indicates the message list is a thread */\n threadList?: boolean;\n};\n\n/**\n * The VirtualizedMessageList component renders a list of messages in a virtualized list.\n * It is a consumer of the React contexts set in [Channel](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Channel/Channel.tsx).\n */\nexport function VirtualizedMessageList(props: VirtualizedMessageListProps) {\n const { jumpToLatestMessage, loadMore, loadMoreNewer } = useChannelActionContext(\n 'VirtualizedMessageList',\n );\n const {\n channel,\n channelUnreadUiState,\n hasMore,\n hasMoreNewer,\n highlightedMessageId,\n loadingMore,\n loadingMoreNewer,\n messages: contextMessages,\n notifications,\n read,\n suppressAutoscroll,\n } = useChannelStateContext('VirtualizedMessageList');\n\n const messages = props.messages || contextMessages;\n\n return (\n <VirtualizedMessageListWithContext\n channel={channel}\n channelUnreadUiState={props.channelUnreadUiState ?? channelUnreadUiState}\n hasMore={!!hasMore}\n hasMoreNewer={!!hasMoreNewer}\n highlightedMessageId={highlightedMessageId}\n jumpToLatestMessage={jumpToLatestMessage}\n loadingMore={!!loadingMore}\n loadingMoreNewer={!!loadingMoreNewer}\n loadMore={loadMore}\n loadMoreNewer={loadMoreNewer}\n messages={messages}\n notifications={notifications}\n read={read}\n suppressAutoscroll={suppressAutoscroll}\n {...props}\n />\n );\n}\n","// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charAt#getting_whole_characters\nexport const getWholeChar = (str: string, i: number) => {\n const code = str.charCodeAt(i);\n\n if (Number.isNaN(code)) return '';\n\n if (code < 0xd800 || code > 0xdfff) return str.charAt(i);\n\n if (0xd800 <= code && code <= 0xdbff) {\n if (str.length <= i + 1) {\n throw 'High surrogate without following low surrogate';\n }\n\n const next = str.charCodeAt(i + 1);\n\n if (0xdc00 > next || next > 0xdfff) {\n throw 'High surrogate without following low surrogate';\n }\n\n return str.charAt(i) + str.charAt(i + 1);\n }\n\n if (i === 0) {\n throw 'Low surrogate without preceding high surrogate';\n }\n\n const prev = str.charCodeAt(i - 1);\n\n if (0xd800 > prev || prev > 0xdbff) {\n throw 'Low surrogate without preceding high surrogate';\n }\n\n return '';\n};\n","import { useEffect, useState } from 'react';\nimport type { SearchController, SearchControllerState, SearchSource } from 'stream-chat';\n\nimport { useStateStore } from '../../../store';\n\nconst searchControllerStateSelector = (value: SearchControllerState) => ({\n sources: value.sources,\n});\n\nexport type UseSearchQueriesInProgressParams = {\n searchController: SearchController;\n};\n\nexport const useSearchQueriesInProgress = (searchController: SearchController) => {\n const [queriesInProgress, setQueriesInProgress] = useState<string[]>([]);\n const { sources } = useStateStore(\n searchController.state,\n searchControllerStateSelector,\n );\n\n useEffect(() => {\n const subscriptions = sources.map((source: SearchSource) =>\n source.state.subscribeWithSelector(\n (value) => ({ isLoading: value.isLoading }),\n ({ isLoading }) => {\n setQueriesInProgress((prev) => {\n if (isLoading) return prev.concat(source.type);\n return prev.filter((type) => type !== source.type);\n });\n },\n ),\n );\n\n return () => {\n subscriptions.forEach((unsubscribe) => unsubscribe());\n };\n }, [sources]);\n return queriesInProgress;\n};\n","import { useEffect } from 'react';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nexport const useConnectionRecoveredListener = (forceUpdate?: () => void) => {\n const { client } = useChatContext('useConnectionRecoveredListener');\n\n useEffect(() => {\n const handleEvent = () => {\n if (forceUpdate) {\n forceUpdate();\n }\n };\n\n client.on('connection.recovered', handleEvent);\n\n return () => {\n client.off('connection.recovered', handleEvent);\n };\n }, [client, forceUpdate]);\n};\n","import { useEffect } from 'react';\n\nconst MOBILE_NAV_BREAKPOINT = 768;\n\nexport const useMobileNavigation = (\n channelListRef: React.RefObject<HTMLDivElement | null>,\n navOpen: boolean,\n closeMobileNav?: () => void,\n) => {\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (typeof window !== 'undefined' && window.innerWidth >= MOBILE_NAV_BREAKPOINT) {\n return;\n }\n if (\n closeMobileNav &&\n channelListRef.current &&\n !channelListRef.current.contains(event.target as Node) &&\n navOpen\n ) {\n closeMobileNav();\n }\n };\n\n document.addEventListener('click', handleClickOutside);\n\n return () => {\n document.removeEventListener('click', handleClickOutside);\n };\n }, [channelListRef, closeMobileNav, navOpen]);\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport uniqBy from 'lodash.uniqby';\n\nimport type {\n APIErrorResponse,\n Channel,\n ChannelFilters,\n ChannelOptions,\n ChannelSort,\n ErrorFromResponse,\n StreamChat,\n} from 'stream-chat';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { ChannelsQueryState } from '../../Chat/hooks/useChannelsQueryState';\n\nconst RECOVER_LOADED_CHANNELS_THROTTLE_INTERVAL_IN_MS = 5000;\nconst MIN_RECOVER_LOADED_CHANNELS_THROTTLE_INTERVAL_IN_MS = 2000;\n\ntype AllowedQueryType = Extract<\n ChannelsQueryState['queryInProgress'],\n 'reload' | 'load-more'\n>;\n\nexport type CustomQueryChannelParams = {\n currentChannels: Array<Channel>;\n queryType: AllowedQueryType;\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>;\n setHasNextPage: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nexport type CustomQueryChannelsFn = (params: CustomQueryChannelParams) => Promise<void>;\n\nexport const usePaginatedChannels = (\n client: StreamChat,\n filters: ChannelFilters,\n sort: ChannelSort,\n options: ChannelOptions,\n activeChannelHandler: (\n channels: Array<Channel>,\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n ) => void,\n recoveryThrottleIntervalMs: number = RECOVER_LOADED_CHANNELS_THROTTLE_INTERVAL_IN_MS,\n customQueryChannels?: CustomQueryChannelsFn,\n) => {\n const {\n channelsQueryState: { error, setError, setQueryInProgress },\n } = useChatContext('usePaginatedChannels');\n const [channels, setChannels] = useState<Array<Channel>>([]);\n const [hasNextPage, setHasNextPage] = useState(true);\n const lastRecoveryTimestamp = useRef<number | undefined>(undefined);\n\n const recoveryThrottleInterval =\n recoveryThrottleIntervalMs < MIN_RECOVER_LOADED_CHANNELS_THROTTLE_INTERVAL_IN_MS\n ? MIN_RECOVER_LOADED_CHANNELS_THROTTLE_INTERVAL_IN_MS\n : (recoveryThrottleIntervalMs ?? RECOVER_LOADED_CHANNELS_THROTTLE_INTERVAL_IN_MS);\n // memoize props\n const filterString = useMemo(() => JSON.stringify(filters), [filters]);\n const sortString = useMemo(() => JSON.stringify(sort), [sort]);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const queryChannels = async (queryType = 'load-more') => {\n setError(null);\n\n if (queryType === 'reload') {\n setChannels([]);\n }\n setQueryInProgress(queryType as AllowedQueryType);\n\n try {\n if (customQueryChannels) {\n await customQueryChannels({\n currentChannels: channels,\n queryType: queryType as AllowedQueryType,\n setChannels,\n setHasNextPage,\n });\n } else {\n const offset = queryType === 'reload' ? 0 : channels.length;\n\n const newOptions = {\n offset,\n ...options,\n };\n\n const channelQueryResponse = await client.queryChannels(\n filters,\n sort || {},\n newOptions,\n );\n\n const newChannels =\n queryType === 'reload'\n ? channelQueryResponse\n : uniqBy([...channels, ...channelQueryResponse], 'cid');\n\n setChannels(newChannels);\n setHasNextPage(channelQueryResponse.length >= (newOptions.limit ?? 1));\n\n // Set active channel only on load of first page\n if (!offset && activeChannelHandler) {\n activeChannelHandler(newChannels, setChannels);\n }\n }\n } catch (error) {\n console.warn(error);\n setError(error as ErrorFromResponse<APIErrorResponse>);\n }\n\n setQueryInProgress(null);\n };\n\n const throttleRecover = useCallback(() => {\n const now = Date.now();\n const isFirstRecovery = !lastRecoveryTimestamp.current;\n const timeElapsedSinceLastRecoveryMs = lastRecoveryTimestamp.current\n ? now - lastRecoveryTimestamp.current\n : 0;\n\n if (\n !isFirstRecovery &&\n timeElapsedSinceLastRecoveryMs < recoveryThrottleInterval &&\n !error\n ) {\n return;\n }\n\n lastRecoveryTimestamp.current = now;\n queryChannels('reload');\n }, [error, queryChannels, recoveryThrottleInterval]);\n\n const loadNextPage = () => queryChannels();\n\n useEffect(() => {\n if (client.recoverStateOnReconnect) return;\n const { unsubscribe } = client.on('connection.recovered', throttleRecover);\n\n return () => {\n unsubscribe();\n };\n }, [client, throttleRecover]);\n\n useEffect(() => {\n queryChannels('reload');\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filterString, sortString]);\n\n return {\n channels,\n hasNextPage,\n loadNextPage,\n setChannels,\n };\n};\n","import uniqBy from 'lodash.uniqby';\nimport type { Channel, ChannelSort, ChannelSortBase } from 'stream-chat';\n\nimport type { ChannelListProps } from './ChannelList';\n\ntype MoveChannelUpParams = {\n channels: Array<Channel>;\n cid: string;\n activeChannel?: Channel;\n};\n\n/**\n * @deprecated\n */\nexport const moveChannelUp = ({ activeChannel, channels, cid }: MoveChannelUpParams) => {\n // get index of channel to move up\n const channelIndex = channels.findIndex((channel) => channel.cid === cid);\n\n if (!activeChannel && channelIndex <= 0) return channels;\n\n // get channel to move up\n const channel = activeChannel || channels[channelIndex];\n\n return uniqBy([channel, ...channels], 'cid');\n};\n\n/**\n * Expects channel array sorted by `{ pinned_at: -1 }`.\n *\n * TODO: add support for the `{ pinned_at: 1 }`\n */\nexport function findLastPinnedChannelIndex({ channels }: { channels: Channel[] }) {\n let lastPinnedChannelIndex: number | null = null;\n\n for (const channel of channels) {\n if (!isChannelPinned(channel)) break;\n\n if (typeof lastPinnedChannelIndex === 'number') {\n lastPinnedChannelIndex++;\n } else {\n lastPinnedChannelIndex = 0;\n }\n }\n\n return lastPinnedChannelIndex;\n}\n\ntype MoveChannelUpwardsParams = {\n channels: Array<Channel>;\n channelToMove: Channel;\n sort: ChannelSort;\n /**\n * If the index of the channel within `channels` list which is being moved upwards\n * (`channelToMove`) is known, you can supply it to skip extra calculation.\n */\n channelToMoveIndexWithinChannels?: number;\n};\n\nexport const moveChannelUpwards = ({\n channels,\n channelToMove,\n channelToMoveIndexWithinChannels,\n sort,\n}: MoveChannelUpwardsParams) => {\n // get index of channel to move up\n const targetChannelIndex =\n channelToMoveIndexWithinChannels ??\n channels.findIndex((channel) => channel.cid === channelToMove.cid);\n\n const targetChannelExistsWithinList = targetChannelIndex >= 0;\n const targetChannelAlreadyAtTheTop = targetChannelIndex === 0;\n\n // pinned channels should not move within the list based on recent activity, channels which\n // receive messages and are not pinned should move upwards but only under the last pinned channel\n // in the list\n const considerPinnedChannels = shouldConsiderPinnedChannels(sort);\n const isTargetChannelPinned = isChannelPinned(channelToMove);\n\n if (targetChannelAlreadyAtTheTop || (considerPinnedChannels && isTargetChannelPinned)) {\n return channels;\n }\n\n const newChannels = [...channels];\n\n // target channel index is known, remove it from the list\n if (targetChannelExistsWithinList) {\n newChannels.splice(targetChannelIndex, 1);\n }\n\n // as position of pinned channels has to stay unchanged, we need to\n // find last pinned channel in the list to move the target channel after\n let lastPinnedChannelIndex: number | null = null;\n if (considerPinnedChannels) {\n lastPinnedChannelIndex = findLastPinnedChannelIndex({ channels: newChannels });\n }\n\n // re-insert it at the new place (to specific index if pinned channels are considered)\n newChannels.splice(\n typeof lastPinnedChannelIndex === 'number' ? lastPinnedChannelIndex + 1 : 0,\n 0,\n channelToMove,\n );\n\n return newChannels;\n};\n\n/**\n * Returns `true` only if object with `pinned_at` property is first within the `sort` array\n * or if `pinned_at` key of the `sort` object gets picked first when using `for...in` looping mechanism\n * and value of the `pinned_at` is either `1` or `-1`.\n */\nexport const shouldConsiderPinnedChannels = (sort: ChannelListProps['sort']) => {\n const value = extractSortValue({ atIndex: 0, sort, targetKey: 'pinned_at' });\n\n if (typeof value !== 'number') return false;\n\n return Math.abs(value) === 1;\n};\n\nexport const extractSortValue = ({\n atIndex,\n sort,\n targetKey,\n}: {\n atIndex: number;\n targetKey: keyof ChannelSortBase;\n sort?: ChannelListProps['sort'];\n}) => {\n if (!sort) return null;\n let option: null | ChannelSortBase = null;\n\n if (Array.isArray(sort)) {\n option = sort[atIndex] ?? null;\n } else {\n let index = 0;\n for (const key in sort) {\n if (index !== atIndex) {\n index++;\n continue;\n }\n\n if (key !== targetKey) {\n return null;\n }\n\n option = sort;\n\n break;\n }\n }\n\n return option?.[targetKey] ?? null;\n};\n\n/**\n * Returns `true` only if `archived` property is of type `boolean` within `filters` object.\n */\nexport const shouldConsiderArchivedChannels = (filters: ChannelListProps['filters']) => {\n if (!filters) return false;\n\n return typeof filters.archived === 'boolean';\n};\n\n/**\n * Returns `true` only if `pinned_at` property is of type `string` within `membership` object.\n */\nexport const isChannelPinned = (channel: Channel) => {\n if (!channel) return false;\n\n const membership = channel.state.membership;\n\n return typeof membership.pinned_at === 'string';\n};\n\n/**\n * Returns `true` only if `archived_at` property is of type `string` within `membership` object.\n */\nexport const isChannelArchived = (channel: Channel) => {\n if (!channel) return false;\n\n const membership = channel.state.membership;\n\n return typeof membership.archived_at === 'string';\n};\n","import { useCallback, useEffect, useMemo, useRef } from 'react';\nimport type { Channel, Event } from 'stream-chat';\nimport type { Dispatch, SetStateAction } from 'react';\n\nimport {\n extractSortValue,\n findLastPinnedChannelIndex,\n isChannelArchived,\n isChannelPinned,\n moveChannelUpwards,\n shouldConsiderArchivedChannels,\n shouldConsiderPinnedChannels,\n} from '../utils';\nimport { useChatContext } from '../../../context';\nimport { getChannel } from '../../../utils';\nimport type { ChannelListProps } from '../ChannelList';\n\ntype SetChannels = Dispatch<SetStateAction<Channel[]>>;\n\ntype BaseParameters = {\n event: Event;\n setChannels: SetChannels;\n};\n\ntype RepeatedParameters = {\n customHandler?: (\n setChannels: BaseParameters['setChannels'],\n event: BaseParameters['event'],\n ) => void;\n};\n\ntype HandleMessageNewParameters = BaseParameters &\n RepeatedParameters & {\n allowNewMessagesFromUnfilteredChannels: boolean;\n lockChannelOrder: boolean;\n } & Required<Pick<ChannelListProps, 'filters' | 'sort'>>;\n\ntype HandleNotificationMessageNewParameters = BaseParameters &\n RepeatedParameters & {\n allowNewMessagesFromUnfilteredChannels: boolean;\n lockChannelOrder: boolean;\n } & Required<Pick<ChannelListProps, 'filters' | 'sort'>>;\n\ntype HandleNotificationRemovedFromChannelParameters = BaseParameters & RepeatedParameters;\n\ntype HandleNotificationAddedToChannelParameters = BaseParameters &\n RepeatedParameters & {\n allowNewMessagesFromUnfilteredChannels: boolean;\n lockChannelOrder: boolean;\n } & Required<Pick<ChannelListProps, 'sort'>>;\n\ntype HandleChannelVisibleParameters = BaseParameters &\n RepeatedParameters &\n Required<Pick<ChannelListProps, 'sort' | 'filters'>>;\n\ntype HandleMemberUpdatedParameters = BaseParameters & {\n lockChannelOrder: boolean;\n} & Required<Pick<ChannelListProps, 'sort' | 'filters'>>;\n\ntype HandleChannelDeletedParameters = BaseParameters & RepeatedParameters;\n\ntype HandleChannelHiddenParameters = BaseParameters & RepeatedParameters;\n\ntype HandleChannelTruncatedParameters = BaseParameters & RepeatedParameters;\n\ntype HandleChannelUpdatedParameters = BaseParameters & RepeatedParameters;\n\ntype HandleUserPresenceChangedParameters = BaseParameters;\n\nconst shared = ({\n customHandler,\n event,\n setChannels,\n}: BaseParameters & RepeatedParameters) => {\n if (typeof customHandler === 'function') {\n return customHandler(setChannels, event);\n }\n\n setChannels((channels) => {\n const channelIndex = channels.findIndex((channel) => channel.cid === event.cid);\n\n if (channelIndex < 0) return channels;\n\n channels.splice(channelIndex, 1);\n\n return [...channels];\n });\n};\n\nexport const useChannelListShapeDefaults = () => {\n const { client } = useChatContext();\n\n const handleMessageNew = useCallback(\n ({\n allowNewMessagesFromUnfilteredChannels,\n customHandler,\n event,\n filters,\n lockChannelOrder,\n setChannels,\n sort,\n }: HandleMessageNewParameters) => {\n if (typeof customHandler === 'function') {\n return customHandler(setChannels, event);\n }\n\n const channelType = event.channel_type;\n const channelId = event.channel_id;\n\n if (!channelType || !channelId) return;\n\n setChannels((currentChannels) => {\n const targetChannel = client.channel(channelType, channelId);\n const targetChannelIndex = currentChannels.indexOf(targetChannel);\n const targetChannelExistsWithinList = targetChannelIndex >= 0;\n\n const isTargetChannelPinned = isChannelPinned(targetChannel);\n const isTargetChannelArchived = isChannelArchived(targetChannel);\n\n const considerArchivedChannels = shouldConsiderArchivedChannels(filters);\n const considerPinnedChannels = shouldConsiderPinnedChannels(sort);\n\n if (\n // filter is defined, target channel is archived and filter option is set to false\n (considerArchivedChannels && isTargetChannelArchived && !filters.archived) ||\n // filter is defined, target channel isn't archived and filter option is set to true\n (considerArchivedChannels && !isTargetChannelArchived && filters.archived) ||\n // sort option is defined, target channel is pinned\n (considerPinnedChannels && isTargetChannelPinned) ||\n // list order is locked\n lockChannelOrder ||\n // target channel is not within the loaded list and loading from cache is disallowed\n (!targetChannelExistsWithinList && !allowNewMessagesFromUnfilteredChannels)\n ) {\n return currentChannels;\n }\n\n return moveChannelUpwards({\n channels: currentChannels,\n channelToMove: targetChannel,\n channelToMoveIndexWithinChannels: targetChannelIndex,\n sort,\n });\n });\n },\n [client],\n );\n\n const handleNotificationMessageNew = useCallback(\n async ({\n allowNewMessagesFromUnfilteredChannels,\n customHandler,\n event,\n filters,\n setChannels,\n sort,\n }: HandleNotificationMessageNewParameters) => {\n if (typeof customHandler === 'function') {\n return customHandler(setChannels, event);\n }\n\n if (!event.channel) {\n return;\n }\n\n const channel = await getChannel({\n client,\n id: event.channel.id,\n type: event.channel.type,\n });\n\n const considerArchivedChannels = shouldConsiderArchivedChannels(filters);\n if (isChannelArchived(channel) && considerArchivedChannels && !filters.archived) {\n return;\n }\n\n if (!allowNewMessagesFromUnfilteredChannels) {\n return;\n }\n\n setChannels((channels) =>\n moveChannelUpwards({\n channels,\n channelToMove: channel,\n sort,\n }),\n );\n },\n [client],\n );\n\n const handleNotificationAddedToChannel = useCallback(\n async ({\n allowNewMessagesFromUnfilteredChannels,\n customHandler,\n event,\n setChannels,\n sort,\n }: HandleNotificationAddedToChannelParameters) => {\n if (typeof customHandler === 'function') {\n return customHandler(setChannels, event);\n }\n\n if (!event.channel || !allowNewMessagesFromUnfilteredChannels) {\n return;\n }\n\n const channel = await getChannel({\n client,\n id: event.channel.id,\n members: event.channel.members?.reduce<string[]>(\n (newMembers, { user, user_id }) => {\n const userId = user_id || user?.id;\n\n if (userId) newMembers.push(userId);\n\n return newMembers;\n },\n [],\n ),\n type: event.channel.type,\n });\n\n // membership has been reset (target channel shouldn't be pinned nor archived)\n setChannels((channels) =>\n moveChannelUpwards({\n channels,\n channelToMove: channel,\n sort,\n }),\n );\n },\n [client],\n );\n\n const handleNotificationRemovedFromChannel = useCallback(\n ({\n customHandler,\n event,\n setChannels,\n }: HandleNotificationRemovedFromChannelParameters) => {\n if (typeof customHandler === 'function') {\n return customHandler(setChannels, event);\n }\n\n setChannels((channels) =>\n channels.filter((channel) => channel.cid !== event.channel?.cid),\n );\n },\n [],\n );\n\n const handleMemberUpdated = useCallback(\n ({\n event,\n filters,\n lockChannelOrder,\n setChannels,\n sort,\n }: HandleMemberUpdatedParameters) => {\n if (\n !event.member?.user ||\n event.member.user.id !== client.userID ||\n !event.channel_type\n ) {\n return;\n }\n\n const channelType = event.channel_type;\n const channelId = event.channel_id;\n\n const considerPinnedChannels = shouldConsiderPinnedChannels(sort);\n const considerArchivedChannels = shouldConsiderArchivedChannels(filters);\n\n // `pinned_at` nor `archived` properties are set or channel list order is locked, return early\n if ((!considerPinnedChannels && !considerArchivedChannels) || lockChannelOrder) {\n return;\n }\n\n const pinnedAtSort = extractSortValue({ atIndex: 0, sort, targetKey: 'pinned_at' });\n\n setChannels((currentChannels) => {\n const targetChannel = client.channel(channelType, channelId);\n // assumes that channel instances are not changing\n const targetChannelIndex = currentChannels.indexOf(targetChannel);\n const targetChannelExistsWithinList = targetChannelIndex >= 0;\n\n const isTargetChannelArchived = isChannelArchived(targetChannel);\n const isTargetChannelPinned = isChannelPinned(targetChannel);\n\n const newChannels = [...currentChannels];\n\n if (targetChannelExistsWithinList) {\n newChannels.splice(targetChannelIndex, 1);\n }\n\n // handle archiving (remove channel)\n if (\n (considerArchivedChannels && isTargetChannelArchived && !filters.archived) ||\n (considerArchivedChannels && !isTargetChannelArchived && filters.archived)\n ) {\n return newChannels;\n }\n\n let lastPinnedChannelIndex: number | null = null;\n\n // calculate last pinned channel index only if `pinned_at` sort is set to\n // ascending order or if it's in descending order while the pin is being removed, otherwise\n // we move to the top (index 0)\n if (pinnedAtSort === 1 || (pinnedAtSort === -1 && !isTargetChannelPinned)) {\n lastPinnedChannelIndex = findLastPinnedChannelIndex({ channels: newChannels });\n }\n\n const newTargetChannelIndex =\n typeof lastPinnedChannelIndex === 'number' ? lastPinnedChannelIndex + 1 : 0;\n\n newChannels.splice(newTargetChannelIndex, 0, targetChannel);\n\n return newChannels;\n });\n },\n [client],\n );\n\n const handleChannelDeleted = useCallback(\n (p: HandleChannelDeletedParameters) => shared(p),\n [],\n );\n\n const handleChannelHidden = useCallback(\n (p: HandleChannelHiddenParameters) => shared(p),\n [],\n );\n\n const handleChannelVisible = useCallback(\n async ({\n customHandler,\n event,\n filters,\n setChannels,\n sort,\n }: HandleChannelVisibleParameters) => {\n if (typeof customHandler === 'function') {\n return customHandler(setChannels, event);\n }\n\n if (!event.channel_id && !event.channel_type) {\n return;\n }\n\n const channel = await getChannel({\n client,\n id: event.channel_id,\n type: event.channel_type,\n });\n\n const considerArchivedChannels = shouldConsiderArchivedChannels(filters);\n if (isChannelArchived(channel) && considerArchivedChannels && !filters.archived) {\n return;\n }\n\n setChannels((channels) =>\n moveChannelUpwards({\n channels,\n channelToMove: channel,\n sort,\n }),\n );\n },\n [client],\n );\n\n const handleChannelTruncated = useCallback(\n ({ customHandler, event, setChannels }: HandleChannelTruncatedParameters) => {\n if (typeof customHandler === 'function') {\n return customHandler(setChannels, event);\n }\n\n // TODO: not sure whether this is needed\n setChannels((channels) => [...channels]);\n // if (forceUpdate) {\n // forceUpdate();\n // }\n },\n [],\n );\n\n const handleChannelUpdated = useCallback(\n ({ customHandler, event, setChannels }: HandleChannelUpdatedParameters) => {\n if (typeof customHandler === 'function') {\n return customHandler(setChannels, event);\n }\n\n setChannels((channels) => {\n const channelIndex = channels.findIndex(\n (channel) => channel.cid === event.channel?.cid,\n );\n\n if (channelIndex > -1 && event.channel) {\n const newChannels = channels;\n newChannels[channelIndex].data = {\n ...event.channel,\n hidden: event.channel?.hidden ?? newChannels[channelIndex].data?.hidden,\n own_capabilities:\n event.channel?.own_capabilities ??\n newChannels[channelIndex].data?.own_capabilities,\n };\n\n return [...newChannels];\n }\n\n return channels;\n });\n\n // if (forceUpdate) {\n // forceUpdate();\n // }\n },\n [],\n );\n\n const handleUserPresenceChanged = useCallback(\n ({ event, setChannels }: HandleUserPresenceChangedParameters) => {\n setChannels((channels) => {\n const newChannels = channels.map((channel) => {\n if (!event.user?.id || !channel.state.members[event.user.id]) {\n return channel;\n }\n\n // FIXME: oh no...\n const newChannel = channel;\n newChannel.state.members[event.user.id].user = event.user;\n\n return newChannel;\n });\n\n return newChannels;\n });\n },\n [],\n );\n\n return useMemo(\n () => ({\n handleChannelDeleted,\n handleChannelHidden,\n handleChannelTruncated,\n handleChannelUpdated,\n handleChannelVisible,\n handleMemberUpdated,\n handleMessageNew,\n handleNotificationAddedToChannel,\n handleNotificationMessageNew,\n handleNotificationRemovedFromChannel,\n handleUserPresenceChanged,\n }),\n [\n handleChannelDeleted,\n handleChannelHidden,\n handleChannelTruncated,\n handleChannelUpdated,\n handleChannelVisible,\n handleMemberUpdated,\n handleMessageNew,\n handleNotificationAddedToChannel,\n handleNotificationMessageNew,\n handleNotificationRemovedFromChannel,\n handleUserPresenceChanged,\n ],\n );\n};\n\ntype UseDefaultHandleChannelListShapeParameters = Required<\n Pick<\n ChannelListProps,\n 'allowNewMessagesFromUnfilteredChannels' | 'lockChannelOrder' | 'filters' | 'sort'\n >\n> &\n Pick<\n ChannelListProps,\n | 'onAddedToChannel'\n | 'onChannelDeleted'\n | 'onChannelHidden'\n | 'onChannelTruncated'\n | 'onChannelUpdated'\n | 'onChannelVisible'\n | 'onMessageNew'\n | 'onMessageNewHandler'\n | 'onRemovedFromChannel'\n > & {\n setChannels: SetChannels;\n customHandleChannelListShape?: (data: {\n defaults: ReturnType<typeof useChannelListShapeDefaults>;\n event: Event;\n setChannels: SetChannels;\n }) => void;\n };\n\nexport const usePrepareShapeHandlers = ({\n allowNewMessagesFromUnfilteredChannels,\n customHandleChannelListShape,\n filters,\n lockChannelOrder,\n onAddedToChannel,\n onChannelDeleted,\n onChannelHidden,\n onChannelTruncated,\n onChannelUpdated,\n onChannelVisible,\n onMessageNew,\n onMessageNewHandler,\n onRemovedFromChannel,\n setChannels,\n sort,\n}: UseDefaultHandleChannelListShapeParameters) => {\n const defaults = useChannelListShapeDefaults();\n\n const defaultHandleChannelListShapeRef = useRef<(e: Event) => void>(undefined);\n\n const customHandleChannelListShapeRef = useRef<(e: Event) => void>(undefined);\n\n customHandleChannelListShapeRef.current = (event: Event) => {\n customHandleChannelListShape?.({ defaults, event, setChannels });\n };\n\n defaultHandleChannelListShapeRef.current = (event: Event) => {\n switch (event.type) {\n case 'message.new':\n defaults.handleMessageNew({\n allowNewMessagesFromUnfilteredChannels,\n customHandler: onMessageNewHandler,\n event,\n filters,\n lockChannelOrder,\n setChannels,\n sort,\n });\n break;\n case 'notification.message_new':\n defaults.handleNotificationMessageNew({\n allowNewMessagesFromUnfilteredChannels,\n customHandler: onMessageNew,\n event,\n filters,\n lockChannelOrder,\n setChannels,\n sort,\n });\n break;\n case 'notification.added_to_channel':\n defaults.handleNotificationAddedToChannel({\n allowNewMessagesFromUnfilteredChannels,\n customHandler: onAddedToChannel,\n event,\n lockChannelOrder,\n setChannels,\n sort,\n });\n break;\n case 'notification.removed_from_channel':\n defaults.handleNotificationRemovedFromChannel({\n customHandler: onRemovedFromChannel,\n event,\n setChannels,\n });\n break;\n case 'channel.deleted':\n defaults.handleChannelDeleted({\n customHandler: onChannelDeleted,\n event,\n setChannels,\n });\n break;\n case 'channel.hidden':\n defaults.handleChannelHidden({\n customHandler: onChannelHidden,\n event,\n setChannels,\n });\n break;\n case 'channel.visible':\n defaults.handleChannelVisible({\n customHandler: onChannelVisible,\n event,\n filters,\n setChannels,\n sort,\n });\n break;\n case 'channel.truncated':\n defaults.handleChannelTruncated({\n customHandler: onChannelTruncated,\n event,\n setChannels,\n });\n break;\n case 'channel.updated':\n defaults.handleChannelUpdated({\n customHandler: onChannelUpdated,\n event,\n setChannels,\n });\n break;\n case 'user.presence.changed':\n defaults.handleUserPresenceChanged({ event, setChannels });\n break;\n case 'member.updated':\n defaults.handleMemberUpdated({\n event,\n filters,\n lockChannelOrder,\n setChannels,\n sort,\n });\n break;\n default:\n break;\n }\n };\n\n const defaultFn = useCallback((e: Event) => {\n defaultHandleChannelListShapeRef.current?.(e);\n }, []);\n\n const customFn = useMemo(() => {\n if (!customHandleChannelListShape) return null;\n return (e: Event) => {\n customHandleChannelListShapeRef.current?.(e);\n };\n }, [customHandleChannelListShape]);\n\n return {\n customHandler: customFn,\n defaultHandler: defaultFn,\n };\n};\n\nexport const useChannelListShape = (handler: (e: Event) => void) => {\n const { client } = useChatContext();\n\n useEffect(() => {\n const subscription = client.on('all', handler);\n\n return subscription.unsubscribe;\n }, [client, handler]);\n};\n","import React from 'react';\nimport type { PropsWithChildren } from 'react';\nimport type { APIErrorResponse, Channel, ErrorFromResponse } from 'stream-chat';\n\nimport { LoadingChannels } from '../Loading/LoadingChannels';\nimport { NullComponent } from '../UtilityComponents';\nimport { useComponentContext, useTranslationContext } from '../../context';\n\nexport type ChannelListUIProps = {\n /** Whether the channel query request returned an errored response */\n error: ErrorFromResponse<APIErrorResponse> | null;\n /** The channels currently loaded in the list, only defined if `sendChannelsToList` on `ChannelList` is true */\n loadedChannels?: Channel[];\n /** Whether the channels are currently loading */\n loading?: boolean;\n /** Local state hook that resets the currently loaded channels */\n setChannels?: React.Dispatch<React.SetStateAction<Channel[]>>;\n};\n\n/**\n * A preview list of channels, allowing you to select the channel you want to open\n */\nexport const ChannelListUI = (props: PropsWithChildren<ChannelListUIProps>) => {\n const { children, error = null, loading = false } = props;\n const { LoadingErrorIndicator = NullComponent, LoadingIndicator = LoadingChannels } =\n useComponentContext('ChannelListUI');\n const { t } = useTranslationContext('ChannelListUI');\n\n if (error) {\n return <LoadingErrorIndicator error={error} />;\n }\n\n return (\n <div className='str-chat__channel-list-inner'>\n <div\n aria-label={t('aria/Channel list')}\n className='str-chat__channel-list-inner__main'\n role='listbox'\n >\n {loading ? <LoadingIndicator /> : children}\n </div>\n </div>\n );\n};\n","import React, { createContext, useContext } from 'react';\nimport type { PropsWithChildren } from 'react';\nimport type { SearchController } from 'stream-chat';\nimport type { SearchProps } from './Search';\n\nexport type SearchContextValue = {\n /** Instance of the search controller that handles the data management */\n searchController: SearchController;\n /** Reference to the container element of the search component */\n containerRef: React.RefObject<HTMLDivElement | null>;\n /** Reference to the container element of the filter buttons */\n filterButtonsContainerRef: React.RefObject<HTMLDivElement | null>;\n} & Pick<SearchProps, 'disabled' | 'placeholder'> &\n Required<Pick<SearchProps, 'exitSearchOnInputBlur' | 'directMessagingChannelType'>>;\n\nexport const SearchContext = createContext<SearchContextValue | undefined>(undefined);\n\n/**\n * Context provider for components rendered within the `Search` component\n */\nexport const SearchContextProvider = ({\n children,\n value,\n}: PropsWithChildren<{\n value: SearchContextValue;\n}>) => (\n <SearchContext.Provider value={value as unknown as SearchContextValue}>\n {children}\n </SearchContext.Provider>\n);\n\nexport const useSearchContext = () => {\n const contextValue = useContext(SearchContext);\n return contextValue as unknown as SearchContextValue;\n};\n","import clsx from 'clsx';\nimport React, { useEffect, useState } from 'react';\n\nimport { useSearchContext } from '../SearchContext';\nimport { useSearchQueriesInProgress } from '../hooks';\nimport { useTranslationContext } from '../../../context';\nimport { useStateStore } from '../../../store';\nimport { Button, IconCircleX, IconMagnifyingGlassSearch } from '../../../components';\n\nimport type { SearchControllerState } from 'stream-chat';\n\nconst searchControllerStateSelector = (nextValue: SearchControllerState) => ({\n isActive: nextValue.isActive,\n searchQuery: nextValue.searchQuery,\n});\n\nexport const SearchBar = () => {\n const { t } = useTranslationContext();\n const {\n disabled,\n exitSearchOnInputBlur,\n filterButtonsContainerRef,\n placeholder,\n searchController,\n } = useSearchContext();\n const queriesInProgress = useSearchQueriesInProgress(searchController);\n const clearButtonRef = React.useRef<HTMLButtonElement | null>(null);\n\n const [input, setInput] = useState<HTMLInputElement | null>(null);\n const { isActive, searchQuery } = useStateStore(\n searchController.state,\n searchControllerStateSelector,\n );\n\n useEffect(() => {\n if (!input) return;\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n input.blur();\n searchController.exit();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [searchController, input]);\n\n return (\n <div className='str-chat__search-bar' data-testid='search-bar'>\n <div\n className={clsx('str-chat__search-bar__input-wrapper', {\n 'str-chat__search-bar__input-wrapper--active': isActive,\n })}\n >\n <IconMagnifyingGlassSearch />\n <input\n className='str-chat__search-bar__input'\n data-testid='search-input'\n disabled={disabled}\n onBlur={({ currentTarget, relatedTarget }) => {\n if (\n exitSearchOnInputBlur &&\n // input is empty\n !currentTarget.value &&\n // clicking on filter buttons or clear button shouldn't trigger exit search on blur\n !filterButtonsContainerRef.current?.contains(relatedTarget) &&\n // clicking clear button shouldn't trigger exit search on blur\n (!clearButtonRef.current || relatedTarget !== clearButtonRef.current)\n ) {\n searchController.exit();\n }\n }}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => {\n if (event.target.value) {\n searchController.search(event.target.value);\n } else if (!event.target.value) {\n searchController.clear();\n }\n }}\n onFocus={searchController.activate}\n placeholder={placeholder ?? t('Search')}\n ref={setInput}\n type='text'\n value={searchQuery}\n />\n {searchQuery && (\n <Button\n appearance='ghost'\n circular\n className='str-chat__search-bar__clear-button'\n data-testid='clear-input-button'\n disabled={queriesInProgress.length > 0} // prevent user from clearing the input while query is in progress and avoid out-of-sync UX\n onClick={() => {\n searchController.clear();\n input?.focus();\n }}\n ref={clearButtonRef}\n size='xs'\n variant='secondary'\n >\n <IconCircleX />\n </Button>\n )}\n </div>\n {isActive && (\n <Button\n appearance='ghost'\n className='str-chat__search-bar__exit-search-button'\n data-testid='search-bar-button'\n onClick={() => {\n input?.blur();\n searchController.exit();\n }}\n size='sm'\n variant='secondary'\n >\n {t('Cancel')}\n </Button>\n )}\n </div>\n );\n};\n","import React, { useCallback, useMemo } from 'react';\nimport uniqBy from 'lodash.uniqby';\nimport type { ComponentType } from 'react';\nimport type { Channel, MessageResponse, User } from 'stream-chat';\n\nimport { useSearchContext } from '../SearchContext';\nimport { Avatar } from '../../../components/Avatar';\nimport { ChannelListItem } from '../../../components/ChannelListItem';\nimport { useChannelListContext, useChatContext } from '../../../context';\nimport { DEFAULT_JUMP_TO_PAGE_SIZE } from '../../../constants/limits';\nimport { Timestamp } from '../../../components/Message/Timestamp';\n\nexport type ChannelSearchResultItemProps = {\n item: Channel;\n};\n\nexport const ChannelSearchResultItem = ({ item }: ChannelSearchResultItemProps) => {\n const { setActiveChannel } = useChatContext();\n const { setChannels } = useChannelListContext();\n\n const onSelect = useCallback(() => {\n setActiveChannel(item);\n setChannels?.((channels) => uniqBy([item, ...channels], 'cid'));\n }, [item, setActiveChannel, setChannels]);\n\n return (\n <ChannelListItem\n channel={item}\n className='str-chat__search-result'\n onSelect={onSelect}\n />\n );\n};\n\nexport type ChannelByMessageSearchResultItemProps = {\n item: MessageResponse;\n};\n\nexport const MessageSearchResultItem = ({\n item,\n}: ChannelByMessageSearchResultItemProps) => {\n const {\n channel: activeChannel,\n client,\n searchController,\n setActiveChannel,\n } = useChatContext();\n const { setChannels } = useChannelListContext();\n\n const channel = useMemo(() => {\n const { channel: channelData } = item;\n const type = channelData?.type ?? 'unknown';\n const id = channelData?.id ?? 'unknown';\n return client.channel(type, id);\n }, [client, item]);\n\n const onSelect = useCallback(async () => {\n if (!channel) return;\n await channel.state.loadMessageIntoState(\n item.id,\n undefined,\n DEFAULT_JUMP_TO_PAGE_SIZE,\n );\n // FIXME: message focus should be handled by yet non-existent msg list controller in client packaged\n searchController._internalState.partialNext({ focusedMessage: item });\n setActiveChannel(channel);\n setChannels?.((channels) => uniqBy([channel, ...channels], 'cid'));\n }, [channel, item, searchController, setActiveChannel, setChannels]);\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const getLatestMessagePreview = useCallback(() => item.text!, [item]);\n\n if (!channel) return;\n\n return (\n <ChannelListItem\n active={\n channel.cid === activeChannel?.cid &&\n item.id === searchController._internalState.getLatestValue().focusedMessage?.id\n }\n channel={channel}\n className='str-chat__search-result'\n getLatestMessagePreview={getLatestMessagePreview}\n onSelect={onSelect}\n />\n );\n};\n\nexport type UserSearchResultItemProps = {\n item: User;\n};\n\nexport const UserSearchResultItem = ({ item }: UserSearchResultItemProps) => {\n const { client, setActiveChannel } = useChatContext();\n const { setChannels } = useChannelListContext();\n const { directMessagingChannelType } = useSearchContext();\n\n const onClick = useCallback(() => {\n const newChannel = client.channel(directMessagingChannelType, {\n members: [client.userID as string, item.id],\n });\n newChannel.watch();\n setActiveChannel(newChannel);\n setChannels?.((channels) => uniqBy([newChannel, ...channels], 'cid'));\n }, [client, item, setActiveChannel, setChannels, directMessagingChannelType]);\n\n return (\n <div className='str-chat__search-result-container'>\n <button\n aria-label={`Select User Channel: ${item.name || ''}`}\n className='str-chat__search-result str-chat__search-result--user'\n data-testid='search-result-user'\n onClick={onClick}\n role='option'\n >\n <Avatar\n imageUrl={item.image}\n isOnline={item.online}\n size='xl'\n userName={item.name || item.id}\n />\n <div className='str-chat__search-result-data'>\n <div className='str-chat__search-result__display-name'>\n {item.name || item.username || item.id}\n </div>\n <Timestamp\n customClass='str-chat__search-result__last-active-timestamp'\n timestamp={item.last_active}\n />\n </div>\n </button>\n </div>\n );\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type SearchResultItemComponents = Record<string, ComponentType<{ item: any }>>;\n\nexport const DefaultSearchResultItems: SearchResultItemComponents = {\n channels: ChannelSearchResultItem,\n messages: MessageSearchResultItem,\n users: UserSearchResultItem,\n};\n","import type { PropsWithChildren } from 'react';\nimport React, { createContext, useContext } from 'react';\nimport type { SearchSource } from 'stream-chat';\n\nexport type SearchSourceResultsContextValue = {\n searchSource: SearchSource;\n};\n\nexport const SearchSourceResultsContext = createContext<\n SearchSourceResultsContextValue | undefined\n>(undefined);\n\n/**\n * Context provider for components rendered within the `SearchSourceResults`\n */\nexport const SearchSourceResultsContextProvider = ({\n children,\n value,\n}: PropsWithChildren<{\n value: SearchSourceResultsContextValue;\n}>) => (\n <SearchSourceResultsContext.Provider\n value={value as unknown as SearchSourceResultsContextValue}\n >\n {children}\n </SearchSourceResultsContext.Provider>\n);\n\nexport const useSearchSourceResultsContext = () => {\n const contextValue = useContext(SearchSourceResultsContext);\n return contextValue as unknown as SearchSourceResultsContextValue;\n};\n","import React from 'react';\nimport { useTranslationContext } from '../../../context';\nimport { useSearchSourceResultsContext } from '../SearchSourceResultsContext';\n\nexport const SearchSourceResultsLoadingIndicator = () => {\n const { t } = useTranslationContext();\n const { searchSource } = useSearchSourceResultsContext();\n return (\n <div\n className='str-chat__search-source-results__loading-indicator'\n data-testid='search-loading-indicator'\n >\n {t('Searching for {{ searchSourceType }}...', {\n searchSourceType: searchSource.type,\n })}\n </div>\n );\n};\n","import React from 'react';\nimport type { SearchSourceState } from 'stream-chat';\n\nimport { SearchSourceResultsLoadingIndicator as DefaultSearchSourceResultsLoadingIndicator } from './SearchSourceResultsLoadingIndicator';\nimport { useSearchSourceResultsContext } from '../SearchSourceResultsContext';\nimport { useComponentContext, useTranslationContext } from '../../../context';\nimport { useStateStore } from '../../../store';\n\nconst searchSourceStateSelector = (value: SearchSourceState) => ({\n hasNext: value.hasNext,\n isLoading: value.isLoading,\n});\n\nexport const SearchSourceResultListFooter = () => {\n const { t } = useTranslationContext();\n const {\n SearchSourceResultsLoadingIndicator = DefaultSearchSourceResultsLoadingIndicator,\n } = useComponentContext();\n const { searchSource } = useSearchSourceResultsContext();\n const { hasNext, isLoading } = useStateStore(\n searchSource.state,\n searchSourceStateSelector,\n );\n\n return (\n <div\n className='str-chat__search-source-result-list__footer'\n data-testid='search-footer'\n >\n {isLoading ? (\n <SearchSourceResultsLoadingIndicator />\n ) : !hasNext ? (\n <div className='str-chat__search-source-results---empty'>\n {t('All results loaded')}\n </div>\n ) : null}\n </div>\n );\n};\n","import React from 'react';\nimport type { ComponentType } from 'react';\nimport type { SearchSourceState, SearchSourceType } from 'stream-chat';\n\nimport { DefaultSearchResultItems } from './SearchResultItem';\nimport { SearchSourceResultListFooter as DefaultSearchSourceResultListFooter } from './SearchSourceResultListFooter';\nimport { useSearchSourceResultsContext } from '../SearchSourceResultsContext';\nimport { InfiniteScrollPaginator } from '../../../components/InfiniteScrollPaginator/InfiniteScrollPaginator';\nimport { useComponentContext } from '../../../context';\nimport { useStateStore } from '../../../store';\nimport type { SearchResultItemComponents } from './SearchResultItem';\n\nconst searchSourceStateSelector = (nextValue: SearchSourceState) => ({\n items: nextValue.items,\n});\n\nexport type SearchSourceResultListProps = {\n loadMoreDebounceMs?: number;\n loadMoreThresholdPx?: number;\n SearchResultItems?: SearchResultItemComponents;\n};\n\nexport const SearchSourceResultList = ({\n loadMoreDebounceMs = 100,\n loadMoreThresholdPx = 80,\n SearchResultItems = DefaultSearchResultItems,\n}: SearchSourceResultListProps) => {\n const { SearchSourceResultListFooter = DefaultSearchSourceResultListFooter } =\n useComponentContext();\n\n const { searchSource } = useSearchSourceResultsContext();\n const { items } = useStateStore(searchSource.state, searchSourceStateSelector);\n\n const SearchResultItem = SearchResultItems[\n searchSource.type as SearchSourceType\n ] as ComponentType<{ item: unknown }>;\n\n if (!SearchResultItem) return null;\n\n return (\n <div\n className='str-chat__search-source-result-list'\n data-testid='search-source-result-list'\n >\n <InfiniteScrollPaginator\n loadNextDebounceMs={loadMoreDebounceMs}\n loadNextOnScrollToBottom={searchSource.search}\n threshold={loadMoreThresholdPx}\n >\n {items?.map((item, i) => (\n <SearchResultItem\n item={item}\n key={`source-search-result-${searchSource.type}-${i}`}\n />\n ))}\n <SearchSourceResultListFooter />\n </InfiniteScrollPaginator>\n </div>\n );\n};\n","import React from 'react';\nimport { useTranslationContext } from '../../../context';\n\nexport const SearchSourceResultsEmpty = () => {\n const { t } = useTranslationContext();\n return (\n <div className='str-chat__search-source-results-empty'>{t('No results found')}</div>\n );\n};\n","export const SearchSourceResultsHeader = () => null;\n","import React from 'react';\nimport type { SearchSource, SearchSourceState } from 'stream-chat';\n\nimport { SearchSourceResultList as DefaultSearchSourceResultList } from './SearchSourceResultList';\nimport { SearchSourceResultsEmpty as DefaultSearchSourceResultsEmpty } from './SearchSourceResultsEmpty';\nimport { SearchSourceResultsHeader as DefaultSearchSourceResultsHeader } from './SearchSourceResultsHeader';\nimport { SearchSourceResultsContextProvider } from '../SearchSourceResultsContext';\nimport { useComponentContext } from '../../../context';\nimport { useStateStore } from '../../../store';\n\nconst searchSourceStateSelector = (nextValue: SearchSourceState) => ({\n isLoading: nextValue.isLoading,\n items: nextValue.items,\n});\n\nexport type SearchSourceResultsProps = { searchSource: SearchSource };\n\nexport const SearchSourceResults = ({ searchSource }: SearchSourceResultsProps) => {\n const {\n SearchSourceResultList = DefaultSearchSourceResultList,\n SearchSourceResultsEmpty = DefaultSearchSourceResultsEmpty,\n SearchSourceResultsHeader = DefaultSearchSourceResultsHeader,\n } = useComponentContext();\n const { isLoading, items } = useStateStore(\n searchSource.state,\n searchSourceStateSelector,\n );\n\n if (!items && !isLoading) return null;\n\n return (\n <SearchSourceResultsContextProvider value={{ searchSource }}>\n <div\n className='str-chat__search-source-results'\n data-testid='search-source-results'\n >\n <SearchSourceResultsHeader />\n {items?.length || isLoading ? (\n <SearchSourceResultList />\n ) : (\n <SearchSourceResultsEmpty />\n )}\n </div>\n </SearchSourceResultsContextProvider>\n );\n};\n","import clsx from 'clsx';\nimport React, { useMemo } from 'react';\nimport type { SearchSource, SearchSourceState } from 'stream-chat';\n\nimport { useSearchContext } from '../SearchContext';\nimport { useTranslationContext } from '../../../context';\nimport { useStateStore } from '../../../store';\nimport { Button } from '../../../components';\n\nconst searchSourceStateSelector = (nextValue: SearchSourceState) => ({\n isActive: nextValue.isActive,\n});\n\ntype SearchSourceFilterButtonProps = {\n source: SearchSource;\n};\n\nconst SearchSourceFilterButton = ({ source }: SearchSourceFilterButtonProps) => {\n const { t } = useTranslationContext();\n const { searchController } = useSearchContext();\n const { isActive } = useStateStore(source.state, searchSourceStateSelector);\n const label = `search-results-header-filter-source-button-label--${source.type}`;\n\n const knownLabels = useMemo<Record<string, string>>(\n () => ({\n 'search-results-header-filter-source-button-label--channels': t(\n 'search-results-header-filter-source-button-label--channels',\n ),\n 'search-results-header-filter-source-button-label--messages': t(\n 'search-results-header-filter-source-button-label--messages',\n ),\n 'search-results-header-filter-source-button-label--users': t(\n 'search-results-header-filter-source-button-label--users',\n ),\n }),\n [t],\n );\n\n return (\n <Button\n appearance='outline'\n aria-label={t('aria/Search results header filter button')}\n aria-pressed={isActive}\n className={clsx('str-chat__search-results-header__filter-source-button', {\n 'str-chat__search-results-header__filter-source-button--active': isActive,\n })}\n key={label}\n onClick={() => {\n if (source.isActive) {\n searchController.deactivateSource(source.type);\n } else {\n searchController.activateSource(source.type);\n if (searchController.searchQuery && !source.items?.length)\n source.search(searchController.searchQuery);\n }\n }}\n size='xs'\n variant='secondary'\n >\n {knownLabels[label] ?? t(label)}\n </Button>\n );\n};\n\nexport const SearchResultsHeader = () => {\n const { filterButtonsContainerRef, searchController } = useSearchContext();\n\n // render nothing if there's only one source (can't change filters)\n if (searchController.sources.length < 2) return null;\n\n return (\n <div className='str-chat__search-results-header' data-testid='search-results-header'>\n <div\n className='str-chat__search-results-header__filter-source-buttons'\n data-testid='filter-source-buttons'\n ref={filterButtonsContainerRef}\n >\n {searchController.sources.map((source) => (\n <SearchSourceFilterButton key={source.type} source={source} />\n ))}\n </div>\n </div>\n );\n};\n","import React from 'react';\n\nimport { useTranslationContext } from '../../../context';\n\nimport type { SearchSource } from 'stream-chat';\n\nexport type SearchResultsPresearchProps = {\n activeSources: SearchSource[];\n};\n\nexport const SearchResultsPresearch = () => {\n const { t } = useTranslationContext();\n return (\n <div className='str-chat__search-results-presearch'>\n {t('Start typing to search')}\n </div>\n );\n};\n","import React from 'react';\nimport type { SearchControllerState } from 'stream-chat';\n\nimport { SearchSourceResults as DefaultSourceSearchResults } from './SearchSourceResults';\nimport { SearchResultsHeader as DefaultSearchResultsHeader } from './SearchResultsHeader';\nimport { SearchResultsPresearch as DefaultSearchResultsPresearch } from './SearchResultsPresearch';\nimport { useSearchContext } from '../SearchContext';\nimport { useComponentContext, useTranslationContext } from '../../../context';\nimport { useStateStore } from '../../../store';\n\nconst searchControllerStateSelector = (nextValue: SearchControllerState) => ({\n activeSources: nextValue.sources.filter((s) => s.isActive),\n isActive: nextValue.isActive,\n searchQuery: nextValue.searchQuery,\n});\n\nexport const SearchResults = () => {\n const { t } = useTranslationContext('ResultsContainer');\n const {\n SearchResultsHeader = DefaultSearchResultsHeader,\n SearchResultsPresearch = DefaultSearchResultsPresearch,\n SearchSourceResults = DefaultSourceSearchResults,\n } = useComponentContext();\n const { searchController } = useSearchContext();\n const { activeSources, isActive, searchQuery } = useStateStore(\n searchController.state,\n searchControllerStateSelector,\n );\n\n return !isActive ? null : (\n <div aria-label={t('aria/Search results')} className='str-chat__search-results'>\n <SearchResultsHeader />\n {!searchQuery ? (\n <SearchResultsPresearch activeSources={activeSources} />\n ) : (\n activeSources.map((source) => (\n <SearchSourceResults key={source.type} searchSource={source} />\n ))\n )}\n </div>\n );\n};\n","import clsx from 'clsx';\nimport React, { useRef } from 'react';\nimport type { SearchControllerState } from 'stream-chat';\n\nimport { SearchBar as DefaultSearchBar } from './SearchBar/SearchBar';\nimport { SearchResults as DefaultSearchResults } from './SearchResults/SearchResults';\nimport { SearchContextProvider } from './SearchContext';\nimport { useChatContext, useComponentContext } from '../../context';\nimport { useStateStore } from '../../store';\n\ntype SearchControllerStateSelectorReturnValue = {\n isActive: boolean;\n};\n\nconst searchControllerStateSelector = (\n nextValue: SearchControllerState,\n): SearchControllerStateSelectorReturnValue => ({ isActive: nextValue.isActive });\n\nexport type SearchProps = {\n /** The type of channel to create on user result select, defaults to `messaging` */\n directMessagingChannelType?: string;\n /** Sets the input element into disabled state */\n disabled?: boolean;\n /** Clear the search state/results on every click outside the search input, defaults to `false` */\n exitSearchOnInputBlur?: boolean;\n /** Custom placeholder text to be displayed in the search input */\n placeholder?: string;\n};\n\nexport const Search = ({\n directMessagingChannelType = 'messaging',\n disabled,\n exitSearchOnInputBlur = false,\n placeholder,\n}: SearchProps) => {\n const { SearchBar = DefaultSearchBar, SearchResults = DefaultSearchResults } =\n useComponentContext();\n const containerRef = useRef<HTMLDivElement | null>(null);\n const filterButtonsContainerRef = useRef<HTMLDivElement | null>(null);\n\n const { searchController } = useChatContext();\n\n const { isActive } = useStateStore<\n SearchControllerState,\n SearchControllerStateSelectorReturnValue\n >(searchController.state, searchControllerStateSelector);\n\n return (\n <SearchContextProvider\n value={{\n containerRef,\n directMessagingChannelType,\n disabled,\n exitSearchOnInputBlur,\n filterButtonsContainerRef,\n placeholder,\n searchController,\n }}\n >\n <div\n className={clsx('str-chat__search', {\n 'str-chat__search--active': isActive,\n })}\n data-testid='search'\n ref={containerRef}\n >\n <SearchBar />\n <SearchResults />\n </div>\n </SearchContextProvider>\n );\n};\n","import type { PropsWithChildren } from 'react';\nimport React, { useEffect } from 'react';\nimport { LoadingIndicator } from '../Loading';\nimport { deprecationAndReplacementWarning } from '../../utils/deprecationWarning';\nimport { useTranslationContext } from '../../context';\nimport { Button } from '../Button';\n\nexport type LoadMoreButtonProps = {\n /** onClick handler load more button. Pagination logic should be executed in this handler. */\n onClick: React.MouseEventHandler<HTMLButtonElement>;\n /** indicates whether a loading request is in progress */\n isLoading?: boolean;\n /**\n * @desc If true, LoadingIndicator is displayed instead of button\n * @deprecated Use loading prop instead of refreshing. Planned for removal: https://github.com/GetStream/stream-chat-react/issues/1804\n */\n refreshing?: boolean;\n};\n\nconst UnMemoizedLoadMoreButton = ({\n children,\n isLoading,\n onClick,\n refreshing,\n}: PropsWithChildren<LoadMoreButtonProps>) => {\n const { t } = useTranslationContext('UnMemoizedLoadMoreButton');\n\n const childrenOrDefaultString = children ?? t('Load more');\n const loading = typeof isLoading !== 'undefined' ? isLoading : refreshing;\n\n useEffect(() => {\n deprecationAndReplacementWarning([[{ refreshing }, { isLoading }]], 'LoadMoreButton');\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <div className='str-chat__load-more-button'>\n <Button\n appearance='outline'\n aria-label={t('aria/Load More Channels')}\n data-testid='load-more-button'\n disabled={loading}\n onClick={onClick}\n size='sm'\n variant='secondary'\n >\n {loading ? <LoadingIndicator /> : childrenOrDefaultString}\n </Button>\n </div>\n );\n};\n\nexport const LoadMoreButton = React.memo(\n UnMemoizedLoadMoreButton,\n) as typeof UnMemoizedLoadMoreButton;\n","import type { PropsWithChildren } from 'react';\nimport React, { useEffect } from 'react';\n\nimport type { LoadMoreButtonProps } from './LoadMoreButton';\nimport { LoadMoreButton as DefaultLoadMoreButton } from './LoadMoreButton';\nimport type { PaginatorProps } from '../../types/types';\nimport { deprecationAndReplacementWarning } from '../../utils/deprecationWarning';\n\nexport type LoadMorePaginatorProps = PaginatorProps & {\n /** A UI button component that handles pagination logic */\n LoadMoreButton?: React.ComponentType<LoadMoreButtonProps>;\n /** indicates if the `LoadMoreButton` should be displayed at the top of the list of channels instead of the bottom of the list (the default) */\n reverse?: boolean;\n};\n\nexport const UnMemoizedLoadMorePaginator = (\n props: PropsWithChildren<LoadMorePaginatorProps>,\n) => {\n const {\n children,\n hasNextPage,\n isLoading,\n LoadMoreButton = DefaultLoadMoreButton,\n loadNextPage,\n refreshing,\n reverse,\n } = props;\n const loadingState = typeof isLoading !== 'undefined' ? isLoading : refreshing;\n\n useEffect(() => {\n deprecationAndReplacementWarning(\n [[{ refreshing }, { isLoading }]],\n 'LoadMorePaginator',\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <>\n {!reverse && children}\n {hasNextPage && <LoadMoreButton isLoading={loadingState} onClick={loadNextPage} />}\n {reverse && children}\n </>\n );\n};\n\nexport const LoadMorePaginator = React.memo(\n UnMemoizedLoadMorePaginator,\n) as typeof UnMemoizedLoadMorePaginator;\n","import React, { type ComponentType } from 'react';\nimport clsx from 'clsx';\nimport { useChatContext, useTranslationContext } from '../../context';\nimport { IconLayoutAlignLeft } from '../Icons';\nimport { ToggleSidebarButton } from '../Button/ToggleSidebarButton';\n\nexport type ChannelListHeaderProps = {\n ToggleButtonIcon?: ComponentType;\n};\n\nexport const ChannelListHeader = ({\n ToggleButtonIcon = IconLayoutAlignLeft,\n}: ChannelListHeaderProps) => {\n const { t } = useTranslationContext();\n const { channel, navOpen } = useChatContext();\n return (\n <div\n className={clsx('str-chat__channel-list__header', {\n 'str-chat__channel-list__header--sidebar-collapsed': !navOpen,\n })}\n >\n <div className='str-chat__channel-list__header__title'>{t('Chats')}</div>\n <ToggleSidebarButton canCollapse={!!channel} mode={'collapse'}>\n <ToggleButtonIcon />\n </ToggleSidebarButton>\n </div>\n );\n};\n","import type { ReactNode } from 'react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport clsx from 'clsx';\nimport type {\n Channel,\n ChannelFilters,\n ChannelOptions,\n ChannelSort,\n Event,\n SearchControllerState,\n} from 'stream-chat';\n\nimport { useConnectionRecoveredListener } from './hooks/useConnectionRecoveredListener';\nimport { useMobileNavigation } from './hooks/useMobileNavigation';\nimport type { CustomQueryChannelsFn } from './hooks/usePaginatedChannels';\nimport { usePaginatedChannels } from './hooks/usePaginatedChannels';\nimport {\n useChannelListShape,\n usePrepareShapeHandlers,\n} from './hooks/useChannelListShape';\nimport { useStateStore } from '../../store';\nimport { ChannelListUI as DefaultChannelListUI } from './ChannelListUI';\nimport { ChannelListItem } from '../ChannelListItem/ChannelListItem';\nimport { Search as DefaultSearch } from '../Search';\nimport type { EmptyStateIndicatorProps } from '../EmptyStateIndicator';\nimport { EmptyStateIndicator as DefaultEmptyStateIndicator } from '../EmptyStateIndicator';\nimport type { LoadMorePaginatorProps } from '../LoadMore/LoadMorePaginator';\nimport { LoadMorePaginator } from '../LoadMore/LoadMorePaginator';\nimport { NotificationList as DefaultNotificationList } from '../Notifications';\nimport type { ChatContextValue } from '../../context';\nimport {\n ChannelListContextProvider,\n DialogManagerProvider,\n useChatContext,\n useComponentContext,\n} from '../../context';\nimport { moveChannelUpwards } from './utils';\nimport type { TranslationContextValue } from '../../context/TranslationContext';\nimport type { PaginatorProps } from '../../types/types';\nimport { ChannelListHeader } from './ChannelListHeader';\nimport { useStableId } from '../UtilityComponents/useStableId';\n\nconst DEFAULT_FILTERS = {};\nconst DEFAULT_OPTIONS = {};\nconst DEFAULT_SORT = {};\n\nconst searchControllerStateSelector = (nextValue: SearchControllerState) => ({\n searchIsActive: nextValue.isActive,\n});\n\nexport type ChannelListProps = {\n /**\n * When the client receives `message.new`, `notification.message_new`, and `notification.added_to_channel` events, we automatically\n * push that channel to the top of the list. If the channel doesn't currently exist in the list, we grab the channel from\n * `client.activeChannels` and push it to the top of the list. You can disable this behavior by setting this prop\n * to false, which will prevent channels not in the list from incrementing the list. The default is true.\n */\n allowNewMessagesFromUnfilteredChannels?: boolean;\n /** Optional function to filter channels prior to loading in the DOM. Do not use any complex or async logic that would delay the loading of the ChannelList. We recommend using a pure function with array methods like filter/sort/reduce. */\n channelRenderFilterFn?: (channels: Array<Channel>) => Array<Channel>;\n // FIXME: how is this even legal (WHY IS IT STRING?!)\n /** Set a channel (with this ID) to active and manually move it to the top of the list */\n customActiveChannel?: string;\n /** Custom function that handles the channel pagination. Has to build query filters, sort and options and query and append channels to the current channels state and update the hasNext pagination flag after each query. */\n customQueryChannels?: CustomQueryChannelsFn;\n /** Custom UI component for rendering an empty list, defaults to and accepts same props as: [EmptyStateIndicator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/EmptyStateIndicator/EmptyStateIndicator.tsx) */\n EmptyStateIndicator?: React.ComponentType<EmptyStateIndicatorProps>;\n /** An object containing channel query filters */\n filters?: ChannelFilters;\n /** Custom function that generates the message preview in ChannelPreview component */\n getLatestMessagePreview?: (\n channel: Channel,\n t: TranslationContextValue['t'],\n userLanguage: TranslationContextValue['userLanguage'],\n isMessageAIGenerated?: ChatContextValue['isMessageAIGenerated'],\n ) => ReactNode;\n /** When true, channels won't dynamically sort by most recent message */\n lockChannelOrder?: boolean;\n /** Function to override the default behavior when a user is added to a channel, corresponds to [notification.added\\_to\\_channel](https://getstream.io/chat/docs/javascript/event_object/?language=javascript) event */\n onAddedToChannel?: (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n event: Event,\n ) => void;\n /** Function to override the default behavior when a channel is deleted, corresponds to [channel.deleted](https://getstream.io/chat/docs/javascript/event_object/?language=javascript) event */\n onChannelDeleted?: (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n event: Event,\n ) => void;\n /** Function to override the default behavior when a channel is hidden, corresponds to [channel.hidden](https://getstream.io/chat/docs/javascript/event_object/?language=javascript) event */\n onChannelHidden?: (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n event: Event,\n ) => void;\n /** Function to override the default behavior when a channel is truncated, corresponds to [channel.truncated](https://getstream.io/chat/docs/javascript/event_object/?language=javascript) event */\n onChannelTruncated?: (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n event: Event,\n ) => void;\n /** Function to override the default behavior when a channel is updated, corresponds to [channel.updated](https://getstream.io/chat/docs/javascript/event_object/?language=javascript) event */\n onChannelUpdated?: (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n event: Event,\n ) => void;\n /** Function to override the default channel visible behavior, corresponds to [channel.visible](https://getstream.io/chat/docs/javascript/event_object/?language=javascript) event */\n onChannelVisible?: (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n event: Event,\n ) => void;\n /** Function to override the default behavior when a message is received on a channel not being watched, corresponds to [notification.message\\_new](https://getstream.io/chat/docs/javascript/event_object/?language=javascript) event */\n onMessageNew?: (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n event: Event,\n ) => void;\n /** Function to override the default behavior when a message is received on a channel being watched, handles [message.new](https://getstream.io/chat/docs/javascript/event_object/?language=javascript) event */\n onMessageNewHandler?: (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n event: Event,\n ) => void;\n /** Function to override the default behavior when a user gets removed from a channel, corresponds to [notification.removed\\_from\\_channel](https://getstream.io/chat/docs/javascript/event_object/?language=javascript) event */\n onRemovedFromChannel?: (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n event: Event,\n ) => void;\n /** An object containing channel query options */\n options?: ChannelOptions;\n /** Custom UI component to handle channel pagination logic, defaults to and accepts same props as: [LoadMorePaginator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/LoadMore/LoadMorePaginator.tsx) */\n Paginator?: React.ComponentType<PaginatorProps | LoadMorePaginatorProps>;\n /**\n * Custom interval during which the recovery channel list queries will be prevented.\n * This is to avoid firing unnecessary queries during internet connection fluctuation.\n * Recovery channel query is triggered upon `connection.recovered` and leads to complete channel list reload with pagination offset 0.\n * The minimum throttle interval is 2000ms. The default throttle interval is 5000ms.\n */\n recoveryThrottleIntervalMs?: number;\n /** Function to override the default behavior when rendering channels, so this function is called instead of rendering the Preview directly */\n renderChannels?: (\n channels: Channel[],\n channelPreview: (item: Channel) => React.ReactNode,\n ) => React.ReactNode;\n /** If true, sends the list's currently loaded channels to the `List` component as the `loadedChannels` prop */\n sendChannelsToList?: boolean;\n /** Last channel will be set as active channel if true, defaults to true */\n setActiveChannelOnMount?: boolean;\n /** Whether or not to load the list with a search component, defaults to false */\n showChannelSearch?: boolean;\n /** An object containing channel query sort parameters */\n sort?: ChannelSort;\n /** An object containing query parameters for fetching channel watchers */\n watchers?: { limit?: number; offset?: number };\n};\n\nconst UnMemoizedChannelList = (props: ChannelListProps) => {\n const {\n allowNewMessagesFromUnfilteredChannels = true,\n channelRenderFilterFn,\n customActiveChannel,\n customQueryChannels,\n EmptyStateIndicator = DefaultEmptyStateIndicator,\n filters = {},\n getLatestMessagePreview,\n lockChannelOrder = false,\n onAddedToChannel,\n onChannelDeleted,\n onChannelHidden,\n onChannelTruncated,\n onChannelUpdated,\n onChannelVisible,\n onMessageNew,\n onMessageNewHandler,\n onRemovedFromChannel,\n options,\n Paginator = LoadMorePaginator,\n recoveryThrottleIntervalMs,\n renderChannels,\n sendChannelsToList = false,\n setActiveChannelOnMount = true,\n showChannelSearch = false,\n sort = DEFAULT_SORT,\n watchers = {},\n } = props;\n\n const stableId = useStableId();\n\n const {\n channel,\n channelsQueryState,\n client,\n closeMobileNav,\n customClasses,\n navOpen = true,\n searchController,\n setActiveChannel,\n theme,\n useImageFlagEmojisOnWindows,\n } = useChatContext('ChannelList');\n const {\n ChannelListUI = DefaultChannelListUI,\n NotificationList = DefaultNotificationList,\n Search = DefaultSearch,\n } = useComponentContext();\n\n const channelListRef = useRef<HTMLDivElement | null>(null);\n const [channelUpdateCount, setChannelUpdateCount] = useState(0);\n\n // Indicator relevant when Search component that relies on SearchController is used\n const { searchIsActive } = useStateStore(\n searchController.state,\n searchControllerStateSelector,\n );\n /**\n * Set a channel with id {customActiveChannel} as active and move it to the top of the list.\n * If customActiveChannel prop is absent, then set the first channel in list as active channel.\n */\n const activeChannelHandler = async (\n channels: Array<Channel>,\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n ) => {\n if (!channels.length) {\n return;\n }\n\n if (customActiveChannel) {\n // FIXME: this is wrong...\n let customActiveChannelObject = channels.find(\n (chan) => chan.id === customActiveChannel,\n );\n\n if (!customActiveChannelObject) {\n [customActiveChannelObject] = await client.queryChannels({\n id: customActiveChannel,\n });\n }\n\n if (customActiveChannelObject) {\n setActiveChannel(customActiveChannelObject, watchers);\n\n const newChannels = moveChannelUpwards({\n channels,\n channelToMove: customActiveChannelObject,\n sort,\n });\n\n setChannels(newChannels);\n return;\n }\n }\n\n if (setActiveChannelOnMount) {\n setActiveChannel(channels[0], watchers);\n }\n };\n\n /**\n * For some events, inner properties on the channel will update but the shallow comparison will not\n * force a re-render. Incrementing this dummy variable ensures the channel previews update.\n */\n const forceUpdate = useCallback(() => setChannelUpdateCount((count) => count + 1), []);\n\n const { channels, hasNextPage, loadNextPage, setChannels } = usePaginatedChannels(\n client,\n filters || DEFAULT_FILTERS,\n sort || DEFAULT_SORT,\n options || DEFAULT_OPTIONS,\n activeChannelHandler,\n recoveryThrottleIntervalMs,\n customQueryChannels,\n );\n\n const loadedChannels = channelRenderFilterFn\n ? channelRenderFilterFn(channels)\n : channels;\n\n useMobileNavigation(channelListRef, navOpen, closeMobileNav);\n\n const { customHandler, defaultHandler } = usePrepareShapeHandlers({\n allowNewMessagesFromUnfilteredChannels,\n filters,\n lockChannelOrder,\n onAddedToChannel,\n onChannelDeleted,\n onChannelHidden,\n onChannelTruncated,\n onChannelUpdated,\n onChannelVisible,\n onMessageNew,\n onMessageNewHandler,\n onRemovedFromChannel,\n setChannels,\n sort,\n // TODO: implement\n // customHandleChannelListShape\n });\n\n useChannelListShape(customHandler ?? defaultHandler);\n\n // TODO: maybe move this too\n useConnectionRecoveredListener(forceUpdate);\n\n useEffect(() => {\n const handleEvent = (event: Event) => {\n if (event.cid === channel?.cid) {\n setActiveChannel();\n }\n };\n\n client.on('channel.deleted', handleEvent);\n client.on('channel.hidden', handleEvent);\n\n return () => {\n client.off('channel.deleted', handleEvent);\n client.off('channel.hidden', handleEvent);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [channel?.cid]);\n\n const renderChannel = (item: Channel) => {\n const previewProps = {\n activeChannel: channel,\n channel: item,\n // forces the update of preview component on channel update\n channelUpdateCount,\n getLatestMessagePreview,\n setActiveChannel,\n watchers,\n };\n\n return <ChannelListItem key={item.cid} {...previewProps} />;\n };\n\n const baseClass = 'str-chat__channel-list';\n const className = clsx(\n customClasses?.chat ?? 'str-chat',\n theme,\n customClasses?.channelList ?? `${baseClass}`,\n {\n 'str-chat--windows-flags':\n useImageFlagEmojisOnWindows && navigator.userAgent.match(/Win/),\n [`${baseClass}--open`]: navOpen,\n },\n );\n\n const showChannelList = !searchIsActive;\n return (\n <DialogManagerProvider id={`channel-list-dialog-manager-${stableId}`}>\n <ChannelListContextProvider\n value={{ channels, hasNextPage, loadNextPage, setChannels }}\n >\n <div className={className} ref={channelListRef}>\n <ChannelListHeader />\n {showChannelSearch && <Search />}\n {showChannelList && (\n <ChannelListUI\n error={channelsQueryState.error}\n loadedChannels={sendChannelsToList ? loadedChannels : undefined}\n loading={\n !!channelsQueryState.queryInProgress &&\n ['reload', 'uninitialized'].includes(channelsQueryState.queryInProgress)\n }\n setChannels={setChannels}\n >\n {!loadedChannels?.length ? (\n <EmptyStateIndicator listType='channel' />\n ) : (\n <Paginator\n hasNextPage={hasNextPage}\n isLoading={channelsQueryState.queryInProgress === 'load-more'}\n loadNextPage={loadNextPage}\n >\n {renderChannels\n ? renderChannels(loadedChannels, renderChannel)\n : loadedChannels.map((channel) => renderChannel(channel))}\n </Paginator>\n )}\n </ChannelListUI>\n )}\n <NotificationList panel='channel-list' />\n </div>\n </ChannelListContextProvider>\n </DialogManagerProvider>\n );\n};\n\n/**\n * Renders a preview list of Channels, allowing you to select the Channel you want to open\n */\nexport const ChannelList = React.memo(\n UnMemoizedChannelList,\n) as typeof UnMemoizedChannelList;\n","import { useEffect } from 'react';\nimport type { Channel, Event } from 'stream-chat';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nexport const useChannelDeletedListener = (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n customHandler?: (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n event: Event,\n ) => void,\n) => {\n const { client } = useChatContext('useChannelDeletedListener');\n\n useEffect(() => {\n const handleEvent = (event: Event) => {\n if (customHandler && typeof customHandler === 'function') {\n customHandler(setChannels, event);\n } else {\n setChannels((channels) => {\n const channelIndex = channels.findIndex((channel) => channel.cid === event.cid);\n\n if (channelIndex < 0) return [...channels];\n\n // Remove the deleted channel from the list\n channels.splice(channelIndex, 1);\n\n return [...channels];\n });\n }\n };\n\n client.on('channel.deleted', handleEvent);\n\n return () => {\n client.off('channel.deleted', handleEvent);\n };\n }, [client, customHandler, setChannels]);\n};\n","import { useEffect } from 'react';\nimport type { Channel, Event } from 'stream-chat';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nexport const useChannelHiddenListener = (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n customHandler?: (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n event: Event,\n ) => void,\n) => {\n const { client } = useChatContext('useChannelHiddenListener');\n\n useEffect(() => {\n const handleEvent = (event: Event) => {\n if (customHandler && typeof customHandler === 'function') {\n customHandler(setChannels, event);\n } else {\n setChannels((channels) => {\n const channelIndex = channels.findIndex((channel) => channel.cid === event.cid);\n if (channelIndex < 0) return [...channels];\n\n // Remove the hidden channel from the list.s\n channels.splice(channelIndex, 1);\n\n return [...channels];\n });\n }\n };\n\n client.on('channel.hidden', handleEvent);\n\n return () => {\n client.off('channel.hidden', handleEvent);\n };\n }, [client, customHandler, setChannels]);\n};\n","import { useEffect } from 'react';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { Channel, Event } from 'stream-chat';\n\nexport const useChannelTruncatedListener = (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n customHandler?: (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n event: Event,\n ) => void,\n forceUpdate?: () => void,\n) => {\n const { client } = useChatContext('useChannelTruncatedListener');\n\n useEffect(() => {\n const handleEvent = (event: Event) => {\n setChannels((channels) => [...channels]);\n\n if (customHandler && typeof customHandler === 'function') {\n customHandler(setChannels, event);\n }\n if (forceUpdate) {\n forceUpdate();\n }\n };\n\n client.on('channel.truncated', handleEvent);\n\n return () => {\n client.off('channel.truncated', handleEvent);\n };\n }, [client, customHandler, forceUpdate, setChannels]);\n};\n","import { useEffect } from 'react';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { Channel, Event } from 'stream-chat';\n\nexport const useChannelUpdatedListener = (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n customHandler?: (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n event: Event,\n ) => void,\n forceUpdate?: () => void,\n) => {\n const { client } = useChatContext('useChannelUpdatedListener');\n\n useEffect(() => {\n const handleEvent = (event: Event) => {\n setChannels((channels) => {\n const channelIndex = channels.findIndex(\n (channel) => channel.cid === event.channel?.cid,\n );\n\n if (channelIndex > -1 && event.channel) {\n const newChannels = channels;\n newChannels[channelIndex].data = {\n ...event.channel,\n hidden: event.channel?.hidden ?? newChannels[channelIndex].data?.hidden,\n own_capabilities:\n event.channel?.own_capabilities ??\n newChannels[channelIndex].data?.own_capabilities,\n };\n\n return [...newChannels];\n }\n\n return channels;\n });\n if (forceUpdate) {\n forceUpdate();\n }\n if (customHandler && typeof customHandler === 'function') {\n customHandler(setChannels, event);\n }\n };\n\n client.on('channel.updated', handleEvent);\n\n return () => {\n client.off('channel.updated', handleEvent);\n };\n }, [client, customHandler, forceUpdate, setChannels]);\n};\n","import { useEffect } from 'react';\nimport uniqBy from 'lodash.uniqby';\n\nimport { getChannel } from '../../../utils/getChannel';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { Channel, Event } from 'stream-chat';\n\nexport const useChannelVisibleListener = (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n customHandler?: (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n event: Event,\n ) => void,\n) => {\n const { client } = useChatContext('useChannelVisibleListener');\n\n useEffect(() => {\n const handleEvent = async (event: Event) => {\n if (customHandler && typeof customHandler === 'function') {\n customHandler(setChannels, event);\n } else if (event.type && event.channel_type && event.channel_id) {\n const channel = await getChannel({\n client,\n id: event.channel_id,\n type: event.channel_type,\n });\n setChannels((channels) => uniqBy([channel, ...channels], 'cid'));\n }\n };\n\n client.on('channel.visible', handleEvent);\n\n return () => {\n client.off('channel.visible', handleEvent);\n };\n }, [client, customHandler, setChannels]);\n};\n","import { useEffect } from 'react';\nimport uniqBy from 'lodash.uniqby';\n\nimport { moveChannelUp } from '../utils';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { Channel, Event } from 'stream-chat';\n\nexport const useMessageNewListener = (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n customHandler?: (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n event: Event,\n ) => void,\n lockChannelOrder = false,\n allowNewMessagesFromUnfilteredChannels = true,\n) => {\n const { client } = useChatContext('useMessageNewListener');\n\n useEffect(() => {\n const handleEvent = (event: Event) => {\n if (customHandler && typeof customHandler === 'function') {\n customHandler(setChannels, event);\n } else {\n setChannels((channels) => {\n const channelInList =\n channels.filter((channel) => channel.cid === event.cid).length > 0;\n\n if (\n !channelInList &&\n allowNewMessagesFromUnfilteredChannels &&\n event.channel_type\n ) {\n const channel = client.channel(event.channel_type, event.channel_id);\n return uniqBy([channel, ...channels], 'cid');\n }\n\n if (!lockChannelOrder) return moveChannelUp({ channels, cid: event.cid || '' });\n\n return channels;\n });\n }\n };\n\n client.on('message.new', handleEvent);\n\n return () => {\n client.off('message.new', handleEvent);\n };\n }, [\n allowNewMessagesFromUnfilteredChannels,\n client,\n customHandler,\n lockChannelOrder,\n setChannels,\n ]);\n};\n","import { useEffect } from 'react';\nimport uniqBy from 'lodash.uniqby';\n\nimport { getChannel } from '../../../utils/getChannel';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { Channel, Event } from 'stream-chat';\n\nexport const useNotificationAddedToChannelListener = (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n customHandler?: (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n event: Event,\n ) => void,\n allowNewMessagesFromUnfilteredChannels = true,\n) => {\n const { client } = useChatContext('useNotificationAddedToChannelListener');\n\n useEffect(() => {\n const handleEvent = async (event: Event) => {\n if (customHandler && typeof customHandler === 'function') {\n customHandler(setChannels, event);\n } else if (allowNewMessagesFromUnfilteredChannels && event.channel?.type) {\n const channel = await getChannel({\n client,\n id: event.channel.id,\n members: event.channel.members?.reduce<string[]>((acc, { user, user_id }) => {\n const userId = user_id || user?.id;\n if (userId) {\n acc.push(userId);\n }\n return acc;\n }, []),\n type: event.channel.type,\n });\n setChannels((channels) => uniqBy([channel, ...channels], 'cid'));\n }\n };\n\n client.on('notification.added_to_channel', handleEvent);\n\n return () => {\n client.off('notification.added_to_channel', handleEvent);\n };\n }, [allowNewMessagesFromUnfilteredChannels, client, customHandler, setChannels]);\n};\n","import { useEffect } from 'react';\nimport uniqBy from 'lodash.uniqby';\n\nimport { getChannel } from '../../../utils/getChannel';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { Channel, Event } from 'stream-chat';\n\nexport const useNotificationMessageNewListener = (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n customHandler?: (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n event: Event,\n ) => void,\n allowNewMessagesFromUnfilteredChannels = true,\n) => {\n const { client } = useChatContext('useNotificationMessageNewListener');\n\n useEffect(() => {\n const handleEvent = async (event: Event) => {\n if (customHandler && typeof customHandler === 'function') {\n customHandler(setChannels, event);\n } else if (allowNewMessagesFromUnfilteredChannels && event.channel?.type) {\n const channel = await getChannel({\n client,\n id: event.channel.id,\n type: event.channel.type,\n });\n setChannels((channels) => uniqBy([channel, ...channels], 'cid'));\n }\n };\n\n client.on('notification.message_new', handleEvent);\n\n return () => {\n client.off('notification.message_new', handleEvent);\n };\n }, [allowNewMessagesFromUnfilteredChannels, client, customHandler, setChannels]);\n};\n","import { useEffect } from 'react';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { Channel, Event } from 'stream-chat';\n\nexport const useNotificationRemovedFromChannelListener = (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n customHandler?: (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n event: Event,\n ) => void,\n) => {\n const { client } = useChatContext('useNotificationRemovedFromChannelListener');\n\n useEffect(() => {\n const handleEvent = (event: Event) => {\n if (customHandler && typeof customHandler === 'function') {\n customHandler(setChannels, event);\n } else {\n setChannels((channels) =>\n channels.filter((channel) => channel.cid !== event.channel?.cid),\n );\n }\n };\n\n client.on('notification.removed_from_channel', handleEvent);\n\n return () => {\n client.off('notification.removed_from_channel', handleEvent);\n };\n }, [client, customHandler, setChannels]);\n};\n","import { useEffect } from 'react';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { Channel, Event } from 'stream-chat';\n\nexport const useUserPresenceChangedListener = (\n setChannels: React.Dispatch<React.SetStateAction<Array<Channel>>>,\n) => {\n const { client } = useChatContext('useUserPresenceChangedListener');\n\n useEffect(() => {\n const handleEvent = (event: Event) => {\n setChannels((channels) => {\n const newChannels = channels.map((channel) => {\n if (!event.user?.id || !channel.state.members[event.user.id]) {\n return channel;\n }\n\n const newChannel = channel; // dumb workaround for linter\n newChannel.state.members[event.user.id].user = event.user;\n\n return newChannel;\n });\n\n return [...newChannels];\n });\n };\n\n client.on('user.presence.changed', handleEvent);\n\n return () => {\n client.off('user.presence.changed', handleEvent);\n };\n }, [client, setChannels]);\n};\n","import { useCallback } from 'react';\nimport { useSyncExternalStore } from 'use-sync-external-store/shim';\nimport type { Channel, EventTypes } from 'stream-chat';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst noop = () => {};\n\nexport function useSelectedChannelState<O>(_: {\n channel: Channel;\n selector: (channel: Channel) => O;\n stateChangeEventKeys?: EventTypes[];\n}): O;\nexport function useSelectedChannelState<O>(_: {\n selector: (channel: Channel) => O;\n channel?: Channel | undefined;\n stateChangeEventKeys?: EventTypes[];\n}): O | undefined;\nexport function useSelectedChannelState<O>({\n channel,\n selector,\n stateChangeEventKeys = ['all'],\n}: {\n selector: (channel: Channel) => O;\n channel?: Channel;\n stateChangeEventKeys?: EventTypes[];\n}): O | undefined {\n const subscribe = useCallback(\n (onStoreChange: (value: O) => void) => {\n if (!channel) return noop;\n\n const subscriptions = stateChangeEventKeys.map((et) =>\n channel.on(et, () => {\n onStoreChange(selector(channel));\n }),\n );\n\n return () => subscriptions.forEach((subscription) => subscription.unsubscribe());\n },\n [channel, selector, stateChangeEventKeys],\n );\n\n const getSnapshot = useCallback(() => {\n if (!channel) return undefined;\n\n return selector(channel);\n }, [channel, selector]);\n\n return useSyncExternalStore(subscribe, getSnapshot);\n}\n","import type { Channel, ChannelMemberResponse, EventTypes } from 'stream-chat';\nimport { useSelectedChannelState } from './useSelectedChannelState';\n\nconst selector = (c: Channel) => c.state.membership;\nconst keys: EventTypes[] = ['member.updated'];\n\nexport function useChannelMembershipState(channel: Channel): ChannelMemberResponse;\nexport function useChannelMembershipState(\n channel?: Channel | undefined,\n): ChannelMemberResponse | undefined;\nexport function useChannelMembershipState(channel?: Channel) {\n return useSelectedChannelState({ channel, selector, stateChangeEventKeys: keys });\n}\n","import type { Channel, ChannelMemberResponse, EventTypes } from 'stream-chat';\nimport { useSelectedChannelState } from './useSelectedChannelState';\n\nconst selector = (c: Channel) => c.state.members;\nconst keys: EventTypes[] = [\n 'member.updated',\n 'member.added',\n 'member.removed',\n 'user.banned',\n 'user.unbanned',\n 'user.deleted',\n 'user.presence.changed',\n];\n\nexport function useChannelMembersState(\n channel: Channel,\n): Record<string, ChannelMemberResponse>;\nexport function useChannelMembersState(\n channel?: Channel | undefined,\n): Record<string, ChannelMemberResponse> | undefined;\nexport function useChannelMembersState(channel?: Channel) {\n return useSelectedChannelState({ channel, selector, stateChangeEventKeys: keys });\n}\n","import { useEffect, useState } from 'react';\n\nimport { useChatContext } from '../../../context/ChatContext';\n\nimport type { Channel } from 'stream-chat';\n\nexport const useIsChannelMuted = (channel: Channel) => {\n const { client } = useChatContext('useIsChannelMuted');\n\n const [muted, setMuted] = useState(channel.muteStatus());\n\n useEffect(() => {\n const handleEvent = () => setMuted(channel.muteStatus());\n\n client.on('notification.channel_mutes_updated', handleEvent);\n return () => client.off('notification.channel_mutes_updated', handleEvent);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [muted]);\n\n return muted;\n};\n","import { type ComponentPropsWithoutRef, useMemo, useState } from 'react';\nimport { match, P } from 'ts-pattern';\n\nimport { useChatContext, useTranslationContext } from '../../context';\nimport { useChannelMembershipState, useChannelMembersState } from '../ChannelList';\nimport { useChannelListItemContext } from './ChannelListItem';\nimport { Button } from '../Button';\nimport {\n IconArchive,\n IconArrowBoxLeft,\n IconCircleBanSign,\n IconMute,\n IconPin,\n} from '../Icons';\nimport { useIsChannelMuted } from './hooks/useIsChannelMuted';\nimport { ContextMenuButton, useDialogOnNearestManager } from '../Dialog';\nimport { addNotificationTargetTag, useNotificationTarget } from '../Notifications';\nimport { ChannelListItemActionButtons } from './ChannelListItemActionButtons';\n\nconst useMuteActionButtonBehavior = () => {\n const { client } = useChatContext();\n const { channel } = useChannelListItemContext();\n const { t } = useTranslationContext();\n const { muted: isMuted } = useIsChannelMuted(channel);\n const [inProgress, setInProgress] = useState(false);\n const panel = useNotificationTarget();\n\n return {\n 'aria-pressed': isMuted,\n disabled: inProgress,\n onClick: async (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n try {\n setInProgress(true);\n if (isMuted) {\n await channel.unmute();\n } else {\n await channel.mute();\n }\n } catch (error) {\n client.notifications.addError({\n message: t('Failed to update channel mute status'),\n options: {\n originalError:\n error instanceof Error ? error : new Error('An unknown error occurred'),\n tags: addNotificationTargetTag(panel),\n type: 'channelListItem:mute:failed',\n },\n origin: {\n emitter: ChannelListItemActionButtons.name,\n },\n });\n } finally {\n setInProgress(false);\n }\n },\n title: isMuted ? t('Unmute') : t('Mute'),\n } satisfies ComponentPropsWithoutRef<'button'>;\n};\n\nconst useArchiveActionButtonBehavior = () => {\n const { channel } = useChannelListItemContext();\n const { client } = useChatContext();\n const membership = useChannelMembershipState(channel);\n const { t } = useTranslationContext();\n const [inProgress, setInProgress] = useState(false);\n const panel = useNotificationTarget();\n\n return {\n 'aria-pressed': typeof membership.archived_at === 'string',\n disabled: inProgress,\n onClick: async (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n try {\n setInProgress(true);\n if (membership.archived_at) {\n await channel.unarchive();\n } else {\n await channel.archive();\n }\n } catch (error) {\n client.notifications.addError({\n message: t('Failed to update channel archive status'),\n options: {\n originalError:\n error instanceof Error ? error : new Error('An unknown error occurred'),\n tags: addNotificationTargetTag(panel),\n type: 'channelListItem:archive:failed',\n },\n origin: {\n emitter: ChannelListItemActionButtons.name,\n },\n });\n } finally {\n setInProgress(false);\n }\n },\n title: membership.archived_at ? t('Unarchive') : t('Archive'),\n } satisfies ComponentPropsWithoutRef<'button'>;\n};\n\ntype ChannelActionItem = ({ placement: 'quick' } | { placement: 'dropdown' }) & {\n Component: React.ComponentType;\n type: string;\n};\n\nexport const defaultChannelActionSet: ChannelActionItem[] = [\n {\n Component() {\n const behaviorProps = useArchiveActionButtonBehavior();\n\n return (\n <Button\n appearance='ghost'\n aria-label={behaviorProps.title}\n circular\n size='sm'\n variant='secondary'\n {...behaviorProps}\n >\n <IconArchive />\n </Button>\n );\n },\n placement: 'quick',\n type: 'archive',\n },\n {\n Component() {\n const behaviorProps = useMuteActionButtonBehavior();\n\n return (\n <Button\n appearance='ghost'\n aria-label={behaviorProps.title}\n circular\n size='sm'\n variant='secondary'\n {...behaviorProps}\n >\n <IconMute />\n </Button>\n );\n },\n placement: 'quick',\n type: 'mute',\n },\n {\n Component() {\n const behaviorProps = useArchiveActionButtonBehavior();\n\n return (\n <ContextMenuButton\n aria-label={behaviorProps.title}\n Icon={IconArchive}\n {...behaviorProps}\n >\n {behaviorProps.title}\n </ContextMenuButton>\n );\n },\n placement: 'dropdown',\n type: 'archive',\n },\n {\n Component() {\n const behaviorProps = useMuteActionButtonBehavior();\n\n return (\n <ContextMenuButton\n aria-label={behaviorProps.title}\n Icon={IconMute}\n {...behaviorProps}\n >\n {behaviorProps.title}\n </ContextMenuButton>\n );\n },\n placement: 'dropdown',\n type: 'mute',\n },\n {\n Component() {\n const { client } = useChatContext();\n const { t } = useTranslationContext();\n const { channel } = useChannelListItemContext();\n const [inProgress, setInProgress] = useState(false);\n const members = useChannelMembersState(channel);\n const panel = useNotificationTarget();\n const isUserBanned = Object.values(members || {}).some(\n (member) => member.user?.id !== client.userID && member.banned,\n );\n\n const title = isUserBanned ? t('Unblock User') : t('Block User');\n\n return (\n <ContextMenuButton\n aria-label={title}\n disabled={inProgress}\n Icon={IconCircleBanSign}\n onClick={async () => {\n try {\n setInProgress(true);\n const otherUserId = Object.keys(channel.state.members).find(\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n (userId) => userId !== client.userID!,\n );\n\n if (!otherUserId) return;\n\n if (isUserBanned) {\n await channel.unbanUser(otherUserId);\n } else {\n await channel.banUser(otherUserId, {});\n }\n } catch (error) {\n client.notifications.addError({\n message: t('Failed to block user'),\n options: {\n originalError:\n error instanceof Error\n ? error\n : new Error('An unknown error occurred'),\n tags: addNotificationTargetTag(panel),\n type: 'channelListItem:ban:failed',\n },\n origin: {\n emitter: ChannelListItemActionButtons.name,\n },\n });\n } finally {\n setInProgress(false);\n }\n }}\n >\n {title}\n </ContextMenuButton>\n );\n },\n placement: 'dropdown',\n type: 'ban',\n },\n {\n Component() {\n const { t } = useTranslationContext();\n const { client } = useChatContext();\n const { channel } = useChannelListItemContext();\n const membership = useChannelMembershipState(channel);\n const dialogId = ChannelListItemActionButtons.getDialogId(\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n channel.id!,\n );\n const { dialog } = useDialogOnNearestManager({ id: dialogId });\n const [inProgress, setInProgress] = useState(false);\n const panel = useNotificationTarget();\n\n const title = membership.pinned_at ? t('Unpin') : t('Pin');\n\n return (\n <ContextMenuButton\n aria-label={title}\n disabled={inProgress}\n Icon={IconPin}\n onClick={async (e) => {\n e.stopPropagation();\n let error: Error | null = null;\n try {\n setInProgress(true);\n if (membership.pinned_at) {\n await channel.unpin();\n } else {\n await channel.pin();\n }\n } catch (e) {\n error = e instanceof Error ? e : new Error('An unknown error occurred');\n client.notifications.addError({\n message: t('Failed to update channel pinned status'),\n options: {\n originalError: error,\n tags: addNotificationTargetTag(panel),\n type: 'channelListItem:pin:failed',\n },\n origin: {\n emitter: ChannelListItemActionButtons.name,\n },\n });\n } finally {\n if (!error) dialog?.close();\n setInProgress(false);\n }\n }}\n title={title}\n >\n {title}\n </ContextMenuButton>\n );\n },\n placement: 'dropdown',\n type: 'pin',\n },\n {\n Component() {\n const { t } = useTranslationContext();\n const { channel } = useChannelListItemContext();\n const { client } = useChatContext();\n const [inProgress, setInProgress] = useState(false);\n const panel = useNotificationTarget();\n\n const title = t('Leave Channel');\n\n return (\n <ContextMenuButton\n aria-label={title}\n disabled={inProgress}\n Icon={IconArrowBoxLeft}\n onClick={async (e) => {\n e.stopPropagation();\n try {\n setInProgress(true);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n await channel.removeMembers([client.userID!]);\n } catch (error) {\n client.notifications.addError({\n message: t('Failed to leave channel'),\n options: {\n originalError:\n error instanceof Error\n ? error\n : new Error('An unknown error occurred'),\n tags: addNotificationTargetTag(panel),\n type: 'channelListItem:leave:failed',\n },\n origin: {\n emitter: ChannelListItemActionButtons.name,\n },\n });\n } finally {\n setInProgress(false);\n }\n }}\n title={title}\n variant='destructive'\n >\n {title}\n </ContextMenuButton>\n );\n },\n placement: 'dropdown',\n type: 'leave',\n },\n];\n\nexport const useBaseChannelActionSetFilter = (channelActionSet: ChannelActionItem[]) => {\n const { channel } = useChannelListItemContext();\n const membership = useChannelMembershipState(channel);\n const isDirectMessageChannel =\n channel.type === 'messaging' &&\n // assuming one of the users is current user\n channel.data?.member_count === 2 &&\n channel.id?.startsWith('!members-');\n const memberCount = channel.data?.member_count ?? 0;\n const connectedUserIsMember = typeof membership.user !== 'undefined';\n\n const ownCapabilities = channel.data?.own_capabilities;\n\n return useMemo(() => {\n const filtered = channelActionSet.filter((action) =>\n match({\n action,\n connectedUserIsMember,\n isDirectMessageChannel,\n memberCount,\n ownCapabilities,\n })\n .returnType<boolean>()\n // only allow defined actions if they match these pre-defined conditions\n .with(\n {\n action: { connectedUserIsMember: true, placement: 'quick', type: 'archive' },\n isDirectMessageChannel: true,\n },\n {\n action: {\n connectedUserIsMember: true,\n placement: 'dropdown',\n type: 'archive',\n },\n isDirectMessageChannel: false,\n },\n {\n action: { placement: 'dropdown', type: 'mute' },\n isDirectMessageChannel: true,\n ownCapabilities: P.when((capabilities) =>\n capabilities?.includes('mute-channel'),\n ),\n },\n {\n action: { placement: 'quick', type: 'mute' },\n isDirectMessageChannel: false,\n ownCapabilities: P.when((capabilities) =>\n capabilities?.includes('mute-channel'),\n ),\n },\n {\n action: { type: 'ban' },\n memberCount: P.number.gt(0).and(P.number.lte(2)),\n ownCapabilities: P.when((capabilities) =>\n capabilities?.includes('ban-channel-members'),\n ),\n },\n {\n action: { type: 'leave' },\n ownCapabilities: P.when((capabilities) =>\n capabilities?.includes('leave-channel'),\n ),\n },\n {\n action: { connectedUserIsMember: true, type: 'pin' },\n },\n () => true,\n )\n .otherwise(() => false),\n );\n\n return filtered;\n }, [\n channelActionSet,\n isDirectMessageChannel,\n memberCount,\n ownCapabilities,\n connectedUserIsMember,\n ]);\n};\n","import React, { type ComponentProps, type ComponentType, type ReactNode } from 'react';\n\nimport { Button } from '../Button';\nimport { IconDotGrid1x3Horizontal } from '../Icons';\n\nimport clsx from 'clsx';\nimport { ContextMenu, useDialogIsOpen, useDialogOnNearestManager } from '../Dialog';\nimport {\n defaultChannelActionSet,\n useBaseChannelActionSetFilter,\n} from './ChannelListItemActionButtons.defaults';\nimport { useSplitActionSet } from '../Chat/hooks/useSplitActionSet';\nimport { useChannelListItemContext } from './ChannelListItem';\n\nexport type ChannelListItemActionButtonsProps = ComponentProps<ComponentType>; // hack to allow empty props\n\ninterface ChannelListItemActionButtonsInterface {\n (props: ChannelListItemActionButtonsProps): ReactNode;\n getDialogId: (channelId: string) => string;\n displayName: string;\n}\n\nexport const ChannelListItemActionButtons: ChannelListItemActionButtonsInterface = () => {\n const { channel } = useChannelListItemContext();\n const [referenceElement, setReferenceElement] =\n React.useState<HTMLButtonElement | null>(null);\n const dialogId = ChannelListItemActionButtons.getDialogId(\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n channel.id!,\n );\n const { dialog, dialogManager } = useDialogOnNearestManager({ id: dialogId });\n const dialogIsOpen = useDialogIsOpen(dialogId, dialogManager?.id);\n\n const filteredActionSet = useBaseChannelActionSetFilter(defaultChannelActionSet);\n const splitActionSet = useSplitActionSet(filteredActionSet);\n\n if (\n splitActionSet.quickActionSet.length + splitActionSet.dropdownActionSet.length ===\n 0\n ) {\n // no buttons to render, omit rendering wrapper\n return null;\n }\n\n return (\n <div\n className={clsx('str-chat__channel-list-item__action-buttons', {\n 'str-chat__channel-list-item__action-buttons--active': dialogIsOpen,\n })}\n >\n {splitActionSet.dropdownActionSet.length > 0 && (\n <Button\n appearance='ghost'\n aria-expanded={dialogIsOpen}\n aria-pressed={dialogIsOpen}\n circular\n onClick={(e) => {\n e.stopPropagation();\n\n dialog.toggle();\n }}\n ref={setReferenceElement}\n size='sm'\n variant='secondary'\n >\n <IconDotGrid1x3Horizontal />\n </Button>\n )}\n {splitActionSet.quickActionSet.map(({ Component, type }) => (\n <Component key={type} />\n ))}\n <ContextMenu\n className='str-chat__channel-list-item__action-buttons-context-menu'\n dialogManagerId={dialogManager?.id}\n id={dialog.id}\n onClose={dialog?.close}\n placement='bottom-start'\n referenceElement={referenceElement}\n tabIndex={-1}\n trapFocus\n >\n {splitActionSet.dropdownActionSet.map(({ Component, type }) => (\n <Component key={type} />\n ))}\n </ContextMenu>\n </div>\n );\n};\n\nChannelListItemActionButtons.getDialogId = (channelId: string) =>\n `channel-action-buttons-${channelId}`;\n\nChannelListItemActionButtons.displayName = 'ChannelListItemActionButtons';\n","import React, { useMemo } from 'react';\nimport type { LocalMessage } from 'stream-chat';\n\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { getDateString, isDate } from '../../i18n/utils';\n\nexport type ChannelListItemTimestampProps = {\n /** The last message in the channel, used to extract the timestamp */\n lastMessage?: LocalMessage;\n};\n\nexport function ChannelListItemTimestamp({ lastMessage }: ChannelListItemTimestampProps) {\n const { t, tDateTimeParser } = useTranslationContext('ChannelListItemTimestamp');\n\n const timestamp = lastMessage?.created_at;\n const normalizedTimestamp =\n timestamp && isDate(timestamp) ? timestamp.toISOString() : undefined;\n\n const when = useMemo(\n () =>\n getDateString({\n messageCreatedAt: normalizedTimestamp,\n t,\n tDateTimeParser,\n timestampTranslationKey: 'timestamp/ChannelPreviewTimestamp',\n }),\n [normalizedTimestamp, t, tDateTimeParser],\n );\n\n if (!when) return null;\n\n return (\n <time\n className='str-chat__channel-list-item-timestamp'\n dateTime={normalizedTimestamp}\n >\n {when}\n </time>\n );\n}\n","import { useMemo } from 'react';\nimport type { Attachment, LocalMessage } from 'stream-chat';\n\nimport {\n getTranslatedMessageText,\n type TranslationContextValue,\n useChatContext,\n useTranslationContext,\n} from '../../../context';\n\nimport type { MessageDeliveryStatus } from '../../ChannelListItem';\n\nexport type ChannelPreviewMessageType =\n | 'text'\n | 'deleted'\n | 'error'\n | 'empty'\n | 'image'\n | 'giphy'\n | 'video'\n | 'voice'\n | 'file'\n | 'link'\n | 'location'\n | 'poll';\n\n/**\n * Delivery status of the last own message.\n * Determines which delivery status icon to render in the preview.\n *\n * - `sending` — Clock icon\n * - `sent` — Single checkmark icon\n * - `delivered` — Double checkmark icon\n * - `read` — Double checkmark icon (with distinct color)\n */\nexport type ChannelPreviewDeliveryStatus = 'sending' | 'sent' | 'delivered' | 'read';\n\nexport type LatestMessagePreviewData = {\n /**\n * The type of content being previewed.\n * Use this to render the appropriate content-type icon.\n */\n type: ChannelPreviewMessageType;\n /**\n * The preview text to display.\n */\n text: string;\n /**\n * Delivery status of own message.\n * Only present for own messages that are not in error state.\n * Use this to render the delivery status icon (clock, checkmark, double checkmark).\n */\n deliveryStatus?: ChannelPreviewDeliveryStatus;\n /**\n * Sender name prefix.\n * - `\"You\"` (translated) for own messages\n * - Sender's display name for incoming messages in group channels (>2 members)\n * - `undefined` for incoming messages in direct conversations\n */\n senderName?: string;\n};\n\nfunction getAttachmentContentType(attachment: Attachment): ChannelPreviewMessageType {\n if (!attachment) return 'text';\n\n // TODO: add audio (non-voice) content type when supported by the design\n if (attachment.type === 'giphy') return 'giphy';\n if (attachment.type === 'image') return 'image';\n if (attachment.type === 'video') return 'video';\n if (attachment.type === 'voiceRecording') return 'voice';\n if (attachment.type === 'file') return 'file';\n if (attachment.og_scrape_url || attachment.title_link) return 'link';\n\n return 'file';\n}\n\nfunction getAttachmentFallbackText(\n type: ChannelPreviewMessageType,\n count: number,\n t: TranslationContextValue['t'],\n): string {\n switch (type) {\n case 'image':\n return t('imageCount', { count });\n case 'video':\n return t('videoCount', { count });\n case 'voice':\n return t('voiceMessageCount', { count });\n case 'link':\n return t('linkCount', { count });\n case 'file':\n default:\n return t('fileCount', { count });\n }\n}\n\nexport type UseLatestMessagePreviewParams = {\n /** The channel to generate preview for */\n participantCount?: number;\n /** The latest message in the channel */\n latestMessage?: LocalMessage;\n /**\n * Delivery status from the `useMessageDeliveryStatus` hook.\n * When provided, used to determine the delivery status icon.\n * When omitted, delivery status icons are not shown.\n */\n messageDeliveryStatus?: MessageDeliveryStatus;\n};\n\nexport const useLatestMessagePreview = ({\n latestMessage,\n messageDeliveryStatus,\n participantCount = Infinity,\n}: UseLatestMessagePreviewParams): LatestMessagePreviewData => {\n const { client } = useChatContext('useLatestMessagePreview');\n const { t, userLanguage } = useTranslationContext('useLatestMessagePreview');\n\n return useMemo(() => {\n if (!latestMessage) {\n return { text: t('Nothing yet...'), type: 'empty' as const };\n }\n\n if (latestMessage.status === 'failed' || latestMessage.type === 'error') {\n return { text: t('Message failed to send'), type: 'error' as const };\n }\n\n const isOwnMessage = latestMessage.user?.id === client.user?.id;\n\n let deliveryStatus: ChannelPreviewDeliveryStatus | undefined;\n if (isOwnMessage) {\n deliveryStatus = messageDeliveryStatus ?? (latestMessage.status as 'sending');\n }\n\n let senderName: string | undefined;\n if (isOwnMessage) {\n senderName = t('You');\n } else if (!isOwnMessage && participantCount > 2) {\n senderName = latestMessage.user?.name || latestMessage.user?.id;\n }\n\n if (latestMessage.deleted_at) {\n return {\n deliveryStatus,\n senderName,\n text: t('Message deleted'),\n type: 'deleted' as const,\n };\n }\n\n if (latestMessage.poll) {\n return {\n deliveryStatus,\n senderName,\n text: t('Poll'),\n type: 'poll' as const,\n };\n }\n\n const textContent =\n getTranslatedMessageText({ language: userLanguage, message: latestMessage }) ||\n latestMessage.text;\n\n if (latestMessage.shared_location) {\n return {\n deliveryStatus,\n senderName,\n text: textContent || t('Location'),\n type: 'location' as const,\n };\n }\n\n if (latestMessage.attachments && latestMessage.attachments.length) {\n const attachments = latestMessage.attachments;\n\n let contentType: ChannelPreviewMessageType;\n\n const [firstAttachment] = attachments;\n const firstAttachmentType = getAttachmentContentType(firstAttachment);\n\n if (\n attachments.every(\n (attachment) => getAttachmentContentType(attachment) === firstAttachmentType,\n )\n ) {\n contentType = firstAttachmentType;\n } else {\n contentType = 'file';\n }\n\n let text =\n contentType === 'giphy'\n ? 'Giphy'\n : // prioritize message text content if available\n textContent ||\n // then fallback text of the single attachment if only one attachment is present and it's not a voice recording (fallback text is generic for voice recordings, so not useful in the preview)\n (attachments.length === 1 && contentType !== 'voice'\n ? firstAttachment.fallback || firstAttachment.title\n : '') ||\n // then generic fallback text based on attachment type and count\n getAttachmentFallbackText(contentType, attachments.length, t);\n\n // attach duration for audio/video attachments if available\n if (\n contentType !== 'giphy' &&\n attachments.length === 1 &&\n typeof firstAttachment.duration === 'number'\n ) {\n const minutes = Math.floor(firstAttachment.duration / 60);\n const seconds = Math.ceil(firstAttachment.duration) % 60;\n const durationString = `${minutes}:${seconds.toString().padStart(2, '0')}`;\n text += ` (${durationString})`;\n }\n\n return {\n deliveryStatus,\n senderName,\n text,\n type: contentType,\n };\n }\n\n if (textContent) {\n return {\n deliveryStatus,\n senderName,\n text: textContent,\n type: 'text' as const,\n };\n }\n\n return { text: t('Empty message...'), type: 'empty' as const };\n }, [\n client.user?.id,\n latestMessage,\n messageDeliveryStatus,\n participantCount,\n t,\n userLanguage,\n ]);\n};\n","import React from 'react';\nimport clsx from 'clsx';\nimport {\n type ChannelPreviewDeliveryStatus,\n type ChannelPreviewMessageType,\n useLatestMessagePreview,\n type UseLatestMessagePreviewParams,\n} from './hooks/useLatestMessagePreview';\nimport {\n IconCamera1,\n IconChainLink,\n IconCheckmark1Small,\n IconCircleBanSign,\n IconClock,\n IconDoubleCheckmark1Small,\n IconExclamationCircle1,\n IconFileBend,\n IconMapPin,\n IconMicrophone,\n IconVideo,\n} from '../Icons';\n\nconst deliveryStatusIconMap: Record<ChannelPreviewDeliveryStatus, React.ComponentType> = {\n delivered: IconDoubleCheckmark1Small,\n read: IconDoubleCheckmark1Small,\n sending: IconClock,\n sent: IconCheckmark1Small,\n};\n\nconst contentTypeIconMap: Partial<\n Record<ChannelPreviewMessageType, React.ComponentType>\n> = {\n deleted: IconCircleBanSign,\n error: IconExclamationCircle1,\n file: IconFileBend,\n giphy: IconFileBend,\n image: IconCamera1,\n link: IconChainLink,\n location: IconMapPin,\n video: IconVideo,\n voice: IconMicrophone,\n};\n\nexport const SummarizedMessagePreview = ({\n latestMessage,\n messageDeliveryStatus,\n participantCount,\n}: UseLatestMessagePreviewParams) => {\n const { deliveryStatus, senderName, text, type } = useLatestMessagePreview({\n latestMessage,\n messageDeliveryStatus,\n participantCount,\n });\n\n const DeliveryStatusIcon = deliveryStatus\n ? deliveryStatusIconMap[deliveryStatus]\n : undefined;\n const ContentTypeIcon = contentTypeIconMap[type];\n\n return (\n <div\n className={clsx('str-chat__summarized-message-preview', {\n [`str-chat__summarized-message-preview--${type}`]: type,\n })}\n >\n {type !== 'error' && (\n <>\n {DeliveryStatusIcon && (\n <span\n className={clsx('str-chat__summarized-message-preview__delivery-status', {\n [`str-chat__summarized-message-preview__delivery-status--${deliveryStatus}`]:\n deliveryStatus,\n })}\n >\n <DeliveryStatusIcon />\n </span>\n )}\n {senderName && (\n <span className='str-chat__summarized-message-preview__sender'>\n {senderName}:\n </span>\n )}\n </>\n )}\n {ContentTypeIcon && <ContentTypeIcon />}\n <span className='str-chat__summarized-message-preview__text'>{text}</span>\n </div>\n );\n};\n","import React, { useRef } from 'react';\nimport clsx from 'clsx';\n\nimport { ChannelListItemActionButtons as DefaultChannelListItemActionButtons } from './ChannelListItemActionButtons';\nimport { ChannelListItemTimestamp } from './ChannelListItemTimestamp';\n\nimport { ChannelAvatar as DefaultChannelAvatar } from '../Avatar';\nimport { Badge } from '../Badge';\nimport { IconMute } from '../Icons';\nimport { useComponentContext } from '../../context';\nimport type { ChannelListItemUIProps } from './ChannelListItem';\nimport { SummarizedMessagePreview } from '../SummarizedMessagePreview';\n\nconst UnMemoizedChannelListItemUI = (props: ChannelListItemUIProps) => {\n const {\n active,\n channel,\n className: customClassName = '',\n displayImage,\n displayTitle,\n groupChannelDisplayInfo,\n lastMessage,\n messageDeliveryStatus,\n muted,\n onSelect: customOnSelectChannel,\n setActiveChannel,\n unread,\n watchers,\n } = props;\n\n const {\n Avatar = DefaultChannelAvatar,\n ChannelListItemActionButtons = DefaultChannelListItemActionButtons,\n } = useComponentContext();\n\n const channelPreviewButton = useRef<HTMLButtonElement | null>(null);\n\n const avatarName =\n displayTitle || channel.state.messages[channel.state.messages.length - 1]?.user?.id;\n\n const onSelectChannel = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (customOnSelectChannel) {\n customOnSelectChannel(e);\n } else if (setActiveChannel) {\n setActiveChannel(channel, watchers);\n }\n if (channelPreviewButton?.current) {\n channelPreviewButton.current.blur();\n }\n };\n\n return (\n <div className='str-chat__channel-list-item-container'>\n <ChannelListItemActionButtons />\n <button\n aria-label={`Select Channel: ${displayTitle || ''}`}\n aria-pressed={active}\n className={clsx(\n 'str-chat__channel-list-item',\n typeof unread === 'number' &&\n unread > 0 &&\n 'str-chat__channel-list-item--unread',\n muted && 'str-chat__channel-list-item--muted',\n customClassName,\n )}\n data-testid='channel-list-item-button'\n onClick={onSelectChannel}\n ref={channelPreviewButton}\n role='option'\n >\n <Avatar\n displayMembers={groupChannelDisplayInfo?.members}\n imageUrl={displayImage}\n overflowCount={groupChannelDisplayInfo?.overflowCount}\n size='xl'\n userName={avatarName}\n />\n <div className='str-chat__channel-list-item-data'>\n <div className='str-chat__channel-list-item-data__first-row'>\n <div className='str-chat__channel-list-item-data__title'>\n <span>{displayTitle || 'N/A'}</span>\n {muted && <IconMute />}\n </div>\n <div className='str-chat__channel-list-item-data__timestamp-and-badge'>\n <ChannelListItemTimestamp lastMessage={lastMessage} />\n {typeof unread === 'number' && unread > 0 && (\n <Badge data-testid='unread-badge' size='md' variant='primary'>\n {unread}\n </Badge>\n )}\n </div>\n </div>\n <SummarizedMessagePreview\n latestMessage={lastMessage}\n messageDeliveryStatus={messageDeliveryStatus}\n participantCount={channel.data?.member_count}\n />\n </div>\n </button>\n </div>\n );\n};\n\n/**\n * Used as preview component for channel item in [ChannelList](#channellist) component.\n * Its best suited for messenger type chat.\n */\nexport const ChannelListItemUI = React.memo(\n UnMemoizedChannelListItemUI,\n) as typeof UnMemoizedChannelListItemUI;\n","import { useCallback, useEffect, useState } from 'react';\nimport type { Channel, Event, LocalMessage, UserResponse } from 'stream-chat';\n\nimport { useChatContext } from '../../../context';\n\nexport enum MessageDeliveryStatus {\n SENT = 'sent',\n DELIVERED = 'delivered',\n READ = 'read',\n}\n\ntype UseMessageStatusParamsChannelPreviewProps = {\n channel: Channel;\n /** The last message received in a channel */\n lastMessage?: LocalMessage;\n};\n\nexport const useMessageDeliveryStatus = ({\n channel,\n lastMessage,\n}: UseMessageStatusParamsChannelPreviewProps) => {\n const { client } = useChatContext();\n const [messageDeliveryStatus, setMessageDeliveryStatus] = useState<\n MessageDeliveryStatus | undefined\n >();\n\n const isOwnMessage = useCallback(\n (message?: { user?: UserResponse | null }) =>\n client.user && message && message.user?.id === client.user.id,\n [client],\n );\n\n useEffect(() => {\n // empty channel\n if (!lastMessage) {\n setMessageDeliveryStatus(undefined);\n }\n\n const lastMessageIsOwn = isOwnMessage(lastMessage);\n if (!lastMessage?.created_at || !lastMessageIsOwn) return;\n\n const msgRef = {\n msgId: lastMessage.id,\n timestampMs: lastMessage.created_at.getTime(),\n };\n const readersForMessage = channel.messageReceiptsTracker.readersForMessage(msgRef);\n const deliveredForMessage =\n channel.messageReceiptsTracker.deliveredForMessage(msgRef);\n setMessageDeliveryStatus(\n readersForMessage.length > 1 ||\n (readersForMessage.length === 1 && readersForMessage[0].id !== client.user?.id)\n ? MessageDeliveryStatus.READ\n : deliveredForMessage.length > 1 ||\n (deliveredForMessage.length === 1 &&\n deliveredForMessage[0].id !== client.user?.id)\n ? MessageDeliveryStatus.DELIVERED\n : MessageDeliveryStatus.SENT,\n );\n }, [channel, client, isOwnMessage, lastMessage]);\n\n useEffect(() => {\n const handleMessageNew = (event: Event) => {\n // the last message is not mine, so do not show the delivery status\n if (!isOwnMessage(event.message)) {\n return setMessageDeliveryStatus(undefined);\n }\n return setMessageDeliveryStatus(MessageDeliveryStatus.SENT);\n };\n\n channel.on('message.new', handleMessageNew);\n\n return () => {\n channel.off('message.new', handleMessageNew);\n };\n }, [channel, isOwnMessage]);\n\n useEffect(() => {\n if (!isOwnMessage(lastMessage)) return;\n const handleMessageDelivered = (event: Event) => {\n if (\n event.user?.id !== client.user?.id &&\n lastMessage &&\n lastMessage.id === event.last_delivered_message_id\n )\n setMessageDeliveryStatus(MessageDeliveryStatus.DELIVERED);\n };\n\n const handleMarkRead = (event: Event) => {\n if (event.user?.id !== client.user?.id)\n setMessageDeliveryStatus(MessageDeliveryStatus.READ);\n };\n\n channel.on('message.delivered', handleMessageDelivered);\n channel.on('message.read', handleMarkRead);\n\n return () => {\n channel.off('message.delivered', handleMessageDelivered);\n channel.off('message.read', handleMarkRead);\n };\n }, [channel, client, isOwnMessage, lastMessage]);\n\n return {\n messageDeliveryStatus,\n };\n};\n","import throttle from 'lodash.throttle';\nimport React, { useContext, useEffect, useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport type { Channel, Event, LocalMessage } from 'stream-chat';\n\nimport { ChannelListItemUI as DefaultChannelListItemUI } from './ChannelListItemUI';\nimport { useIsChannelMuted } from './hooks/useIsChannelMuted';\nimport { useChannelPreviewInfo } from './hooks/useChannelPreviewInfo';\nimport { getLatestMessagePreview as defaultGetLatestMessagePreview } from './utils';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { useMessageDeliveryStatus } from './hooks/useMessageDeliveryStatus';\nimport type { MessageDeliveryStatus } from './hooks/useMessageDeliveryStatus';\nimport type { GroupChannelDisplayInfo } from './utils';\nimport {\n type ChatContextValue,\n type TranslationContextValue,\n useChatContext,\n useComponentContext,\n} from '../../context';\n\nexport type ChannelListItemUIProps = ChannelListItemProps & {\n /** Image of Channel to display */\n displayImage?: string;\n /** Title of Channel to display */\n displayTitle?: string;\n /** Title of Channel to display */\n groupChannelDisplayInfo?: GroupChannelDisplayInfo;\n /** The last message received in a channel */\n lastMessage?: LocalMessage;\n /** @deprecated Use latestMessagePreview prop instead. */\n latestMessage?: ReactNode;\n /** Latest message preview to display, will be a string or JSX element supporting markdown. */\n latestMessagePreview?: ReactNode;\n /** Status describing whether own message has been delivered or read by another. If the last message is not an own message, then the status is undefined. */\n messageDeliveryStatus?: MessageDeliveryStatus;\n /** Whether the channel is muted by the current user */\n muted?: boolean;\n /** Number of unread Messages */\n unread?: number;\n};\n\nexport type ChannelListItemProps = {\n /** Comes from either the `channelRenderFilterFn` or `usePaginatedChannels` call from [ChannelList](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/ChannelList.tsx) */\n channel: Channel;\n /** If the component's channel is the active (selected) Channel */\n active?: boolean;\n /** Current selected channel object */\n activeChannel?: Channel;\n /** Forces the update of preview component on channel update */\n channelUpdateCount?: number;\n /** Custom class for the channel preview root */\n className?: string;\n /** Custom function that generates the message preview in ChannelListItem component */\n getLatestMessagePreview?: (\n channel: Channel,\n t: TranslationContextValue['t'],\n userLanguage: TranslationContextValue['userLanguage'],\n isMessageAIGenerated: ChatContextValue['isMessageAIGenerated'],\n ) => ReactNode;\n key?: string;\n /** Custom ChannelListItem click handler function */\n onSelect?: (event: React.MouseEvent) => void;\n /** Setter for selected Channel */\n setActiveChannel?: ChatContextValue['setActiveChannel'];\n /** Object containing watcher parameters */\n watchers?: { limit?: number; offset?: number };\n};\n\nconst ChannelListItemContext = React.createContext<{ channel: Channel }>({\n channel: null as unknown as Channel,\n});\n\nexport const useChannelListItemContext = () => useContext(ChannelListItemContext);\n\nexport const ChannelListItem = (props: ChannelListItemProps) => {\n const {\n active,\n channel,\n channelUpdateCount,\n getLatestMessagePreview = defaultGetLatestMessagePreview,\n } = props;\n const { ChannelListItemUI = DefaultChannelListItemUI } = useComponentContext();\n const {\n channel: activeChannel,\n client,\n isMessageAIGenerated,\n setActiveChannel,\n } = useChatContext('ChannelPreview');\n const { t, userLanguage } = useTranslationContext('ChannelPreview');\n const { displayImage, displayTitle, groupChannelDisplayInfo } = useChannelPreviewInfo({\n channel,\n });\n\n const [lastMessage, setLastMessage] = useState<LocalMessage>(\n channel.state.messages[channel.state.messages.length - 1],\n );\n const [latestMessagePreview, setLatestMessagePreview] = useState<ReactNode>(() =>\n getLatestMessagePreview(channel, t, userLanguage, isMessageAIGenerated),\n );\n\n const [unread, setUnread] = useState(0);\n const { messageDeliveryStatus } = useMessageDeliveryStatus({\n channel,\n lastMessage,\n });\n\n const isActive =\n typeof active === 'undefined' ? activeChannel?.cid === channel.cid : active;\n const { muted } = useIsChannelMuted(channel);\n\n useEffect(() => {\n const handleEvent = (event: Event) => {\n if (!event.cid) return setUnread(0);\n if (channel.cid === event.cid) setUnread(0);\n };\n\n client.on('notification.mark_read', handleEvent);\n return () => client.off('notification.mark_read', handleEvent);\n }, [channel, client]);\n\n useEffect(() => {\n const handleEvent = (event: Event) => {\n if (channel.cid !== event.cid) return;\n if (event.user?.id !== client.user?.id) return;\n setUnread(channel.countUnread());\n };\n channel.on('notification.mark_unread', handleEvent);\n return () => {\n channel.off('notification.mark_unread', handleEvent);\n };\n }, [channel, client]);\n\n const refreshUnreadCount = useMemo(\n () =>\n throttle(() => {\n if (muted) {\n setUnread(0);\n } else {\n setUnread(channel.countUnread());\n }\n }, 400),\n [channel, muted],\n );\n\n useEffect(() => {\n refreshUnreadCount();\n setLatestMessagePreview(\n getLatestMessagePreview(channel, t, userLanguage, isMessageAIGenerated),\n );\n\n const handleEvent = (event: Event) => {\n const deletedMessagesInAnotherChannel =\n event.type === 'user.messages.deleted' && event.cid && event.cid !== channel.cid;\n\n if (deletedMessagesInAnotherChannel) return;\n\n setLastMessage(\n channel.state.latestMessages[channel.state.latestMessages.length - 1],\n );\n setLatestMessagePreview(\n getLatestMessagePreview(channel, t, userLanguage, isMessageAIGenerated),\n );\n refreshUnreadCount();\n };\n\n channel.on('message.new', handleEvent);\n channel.on('message.updated', handleEvent);\n channel.on('message.deleted', handleEvent);\n client.on('user.messages.deleted', handleEvent);\n channel.on('message.undeleted', handleEvent);\n channel.on('channel.truncated', handleEvent);\n\n return () => {\n channel.off('message.new', handleEvent);\n channel.off('message.updated', handleEvent);\n channel.off('message.deleted', handleEvent);\n client.off('user.messages.deleted', handleEvent);\n channel.off('message.undeleted', handleEvent);\n channel.off('channel.truncated', handleEvent);\n };\n }, [\n channel,\n client,\n refreshUnreadCount,\n channelUpdateCount,\n getLatestMessagePreview,\n t,\n userLanguage,\n isMessageAIGenerated,\n ]);\n\n const channelPreviewContextValue = useMemo(() => ({ channel }), [channel]);\n\n if (!ChannelListItemUI) return null;\n\n return (\n <ChannelListItemContext.Provider value={channelPreviewContextValue}>\n <ChannelListItemUI\n {...props}\n active={isActive}\n displayImage={displayImage}\n displayTitle={displayTitle}\n groupChannelDisplayInfo={groupChannelDisplayInfo}\n lastMessage={lastMessage}\n latestMessage={latestMessagePreview}\n latestMessagePreview={latestMessagePreview}\n messageDeliveryStatus={messageDeliveryStatus}\n muted={muted}\n setActiveChannel={setActiveChannel}\n unread={unread}\n />\n </ChannelListItemContext.Provider>\n );\n};\n","import { useMemo } from 'react';\n\nimport type { ChatContextValue } from '../../../context/ChatContext';\n\nexport const useCreateChatContext = (value: ChatContextValue) => {\n const {\n channel,\n channelsQueryState,\n client,\n closeMobileNav,\n customClasses,\n getAppSettings,\n isMessageAIGenerated,\n latestMessageDatesByChannels,\n mutes,\n navOpen,\n openMobileNav,\n searchController,\n setActiveChannel,\n theme,\n useImageFlagEmojisOnWindows,\n } = value;\n\n const channelCid = channel?.cid;\n const channelsQueryError = channelsQueryState.error;\n const channelsQueryInProgress = channelsQueryState.queryInProgress;\n const clientValues = `${client.clientID}${Object.keys(client.activeChannels).length}${\n Object.keys(client.listeners).length\n }${client.mutedChannels.length}\n ${client.user?.id}`;\n const mutedUsersLength = mutes.length;\n\n const chatContext: ChatContextValue = useMemo(\n () => ({\n channel,\n channelsQueryState,\n client,\n closeMobileNav,\n customClasses,\n getAppSettings,\n isMessageAIGenerated,\n latestMessageDatesByChannels,\n mutes,\n navOpen,\n openMobileNav,\n searchController,\n setActiveChannel,\n theme,\n useImageFlagEmojisOnWindows,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n channelCid,\n channelsQueryError,\n channelsQueryInProgress,\n clientValues,\n getAppSettings,\n searchController,\n mutedUsersLength,\n navOpen,\n isMessageAIGenerated,\n ],\n );\n\n return chatContext;\n};\n","import type { Dispatch, SetStateAction } from 'react';\nimport { useState } from 'react';\nimport type { APIErrorResponse, ErrorFromResponse } from 'stream-chat';\n\ntype ChannelQueryState =\n | 'uninitialized' // the initial state before the first channels query is triggered\n | 'reload' // the initial channels query (loading the first page) is in progress\n | 'load-more' // loading the next page of channels\n | null; // at least one channels page has been loaded and there is no query in progress at the moment\n\nexport interface ChannelsQueryState {\n error: ErrorFromResponse<APIErrorResponse> | null;\n queryInProgress: ChannelQueryState;\n setError: Dispatch<SetStateAction<ErrorFromResponse<APIErrorResponse> | null>>;\n setQueryInProgress: Dispatch<SetStateAction<ChannelQueryState>>;\n}\n\nexport const useChannelsQueryState = (): ChannelsQueryState => {\n const [error, setError] = useState<ErrorFromResponse<APIErrorResponse> | null>(null);\n const [queryInProgress, setQueryInProgress] =\n useState<ChannelQueryState>('uninitialized');\n\n return {\n error,\n queryInProgress,\n setError,\n setQueryInProgress,\n };\n};\n","import React, { useMemo } from 'react';\nimport {\n ChannelSearchSource,\n MessageSearchSource,\n SearchController,\n UserSearchSource,\n} from 'stream-chat';\nimport type { PropsWithChildren } from 'react';\nimport type { StreamChat } from 'stream-chat';\n\nimport { useChat } from './hooks/useChat';\nimport { useCreateChatContext } from './hooks/useCreateChatContext';\nimport { useChannelsQueryState } from './hooks/useChannelsQueryState';\nimport { ChatProvider } from '../../context/ChatContext';\nimport { TranslationProvider } from '../../context/TranslationContext';\nimport type { CustomClasses } from '../../context/ChatContext';\nimport { type MessageContextValue, ModalDialogManagerProvider } from '../../context';\nimport type { SupportedTranslations } from '../../i18n/types';\nimport type { Streami18n } from '../../i18n/Streami18n';\n\nexport type ChatProps = {\n /** The StreamChat client object */\n client: StreamChat;\n /** Object containing custom CSS classnames to override the library's default container CSS */\n customClasses?: CustomClasses;\n /** Sets the default fallback language for UI component translation, defaults to 'en' for English */\n defaultLanguage?: SupportedTranslations;\n /** Instance of Stream i18n */\n i18nInstance?: Streami18n;\n /**\n * Initial open state of the sidebar. Omit for responsive (viewport-derived); set to true/false for an explicit initial state.\n */\n initialNavOpen?: boolean;\n /** Instance of SearchController class that allows to control all the search operations. */\n searchController?: SearchController;\n /** Used for injecting className/s to the Channel and ChannelList components */\n theme?: string;\n /**\n * Windows 10 does not support country flag emojis out of the box. It chooses to render these emojis as characters instead. Stream\n * Chat can override this behavior by loading a custom web font that will render images instead (PNGs or SVGs depending on the platform).\n * Set this prop to true if you want to use these custom emojis for Windows users.\n *\n * Note: requires importing `stream-chat-react/css/v2/emoji-replacement.css` style sheet\n */\n useImageFlagEmojisOnWindows?: boolean;\n} & Partial<Pick<MessageContextValue, 'isMessageAIGenerated'>>;\n\n/**\n * Wrapper component for a StreamChat application. Chat needs to be placed around any other chat components\n * as it provides the ChatContext.\n */\nexport const Chat = (props: PropsWithChildren<ChatProps>) => {\n const {\n children,\n client,\n customClasses,\n defaultLanguage,\n i18nInstance,\n initialNavOpen,\n isMessageAIGenerated,\n searchController: customChannelSearchController,\n theme = 'messaging light',\n useImageFlagEmojisOnWindows = false,\n } = props;\n\n const {\n channel,\n closeMobileNav,\n getAppSettings,\n latestMessageDatesByChannels,\n mutes,\n navOpen,\n openMobileNav,\n setActiveChannel,\n translators,\n } = useChat({\n client,\n defaultLanguage,\n i18nInstance,\n initialNavOpen,\n });\n\n const channelsQueryState = useChannelsQueryState();\n\n const searchController = useMemo(\n () =>\n customChannelSearchController ??\n new SearchController({\n sources: [\n new ChannelSearchSource(client),\n new UserSearchSource(client),\n new MessageSearchSource(client),\n ],\n }),\n [client, customChannelSearchController],\n );\n\n const chatContextValue = useCreateChatContext({\n channel,\n channelsQueryState,\n client,\n closeMobileNav,\n customClasses,\n getAppSettings,\n isMessageAIGenerated,\n latestMessageDatesByChannels,\n mutes,\n navOpen,\n openMobileNav,\n searchController,\n setActiveChannel,\n theme,\n useImageFlagEmojisOnWindows,\n });\n\n if (!translators.t) return null;\n\n return (\n <ChatProvider value={chatContextValue}>\n <TranslationProvider value={translators}>\n <ModalDialogManagerProvider>{children}</ModalDialogManagerProvider>\n </TranslationProvider>\n </ChatProvider>\n );\n};\n","import { useEffect, useState } from 'react';\n\nimport { StreamChat } from 'stream-chat';\n\nimport type {\n OwnUserResponse,\n StreamChatOptions,\n TokenOrProvider,\n UserResponse,\n} from 'stream-chat';\n\n/**\n * React hook to create, connect and return `StreamChat` client.\n */\nexport const useCreateChatClient = ({\n apiKey,\n options,\n tokenOrProvider,\n userData,\n}: {\n apiKey: string;\n tokenOrProvider: TokenOrProvider;\n userData: OwnUserResponse | UserResponse;\n options?: StreamChatOptions;\n}) => {\n const [chatClient, setChatClient] = useState<StreamChat | null>(null);\n const [cachedUserData, setCachedUserData] = useState(userData);\n\n if (userData.id !== cachedUserData.id) {\n setCachedUserData(userData);\n }\n\n const [cachedOptions] = useState(options);\n\n useEffect(() => {\n const client = new StreamChat(apiKey, undefined, cachedOptions);\n let didUserConnectInterrupt = false;\n\n const connectionPromise = client\n .connectUser(cachedUserData, tokenOrProvider)\n .then(() => {\n if (!didUserConnectInterrupt) setChatClient(client);\n });\n\n return () => {\n didUserConnectInterrupt = true;\n setChatClient(null);\n connectionPromise\n .then(() => client.disconnectUser())\n .then(() => {\n console.log(`Connection for user \"${cachedUserData.id}\" has been closed`);\n });\n };\n }, [apiKey, cachedUserData, cachedOptions, tokenOrProvider]);\n\n return chatClient;\n};\n","import React, { useCallback, useEffect, useMemo } from 'react';\nimport clsx from 'clsx';\n\nimport type { ThreadState } from 'stream-chat';\nimport type { ComponentPropsWithoutRef } from 'react';\n\nimport { Timestamp } from '../../Message/Timestamp';\nimport { Avatar, type AvatarProps, AvatarStack } from '../../Avatar';\nimport { useChannelPreviewInfo } from '../../ChannelListItem';\nimport { useChatContext, useTranslationContext } from '../../../context';\nimport { useThreadsViewContext } from '../../ChatView';\nimport { useThreadListItemContext } from './ThreadListItem';\nimport { useStateStore } from '../../../store';\nimport { Badge } from '../../Badge';\nimport { SummarizedMessagePreview } from '../../SummarizedMessagePreview';\nimport { NAV_SIDEBAR_DESKTOP_BREAKPOINT } from '../../Chat';\n\nexport type ThreadListItemUIProps = ComponentPropsWithoutRef<'button'> & {\n resetHighlighting?: () => void;\n};\n\nexport const ThreadListItemUI = ({\n resetHighlighting,\n ...props\n}: ThreadListItemUIProps) => {\n const { client } = useChatContext();\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const thread = useThreadListItemContext()!;\n\n const selector = useCallback(\n (nextValue: ThreadState) => ({\n channel: nextValue.channel,\n deletedAt: nextValue.deletedAt,\n latestReply: nextValue.replies.at(-1),\n ownUnreadMessageCount:\n (client.userID && nextValue.read[client.userID]?.unreadMessageCount) || 0,\n parentMessage: nextValue.parentMessage,\n participants: nextValue.participants,\n replyCount: nextValue.replyCount,\n }),\n [client],\n );\n\n const {\n channel,\n deletedAt,\n latestReply,\n ownUnreadMessageCount,\n parentMessage,\n participants,\n replyCount,\n } = useStateStore(thread.state, selector);\n\n const { displayTitle: channelDisplayTitle } = useChannelPreviewInfo({ channel });\n const { t } = useTranslationContext('ThreadListItemUI');\n\n const { closeMobileNav } = useChatContext('ThreadListItemUI');\n const { activeThread, setActiveThread } = useThreadsViewContext();\n\n const avatarProps: Partial<AvatarProps> | undefined = deletedAt\n ? undefined\n : ({\n imageUrl: latestReply?.user?.image,\n userName: latestReply?.user?.name || latestReply?.user?.id,\n } as const);\n\n const displayInfo = useMemo(() => {\n if (!participants) return [];\n\n return participants.slice(0, 3).map((participant) => ({\n id: participant.user?.id ?? undefined,\n imageUrl: participant.user?.image,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n userName: participant.user?.name || participant.user!.id,\n }));\n }, [participants]);\n\n useEffect(() => {\n if (!resetHighlighting) return;\n\n const reset = resetHighlighting;\n\n const timeout = setTimeout(() => {\n reset();\n }, 2000);\n\n return () => clearTimeout(timeout);\n }, [resetHighlighting]);\n\n return (\n <div className='str-chat__thread-list-item-container'>\n <button\n aria-pressed={activeThread === thread}\n className={clsx('str-chat__thread-list-item', {\n 'str-chat__thread-list-item--highlighted':\n typeof resetHighlighting !== 'undefined',\n })}\n data-thread-id={thread.id}\n onClick={() => {\n if (\n typeof window !== 'undefined' &&\n window.innerWidth < NAV_SIDEBAR_DESKTOP_BREAKPOINT\n ) {\n closeMobileNav();\n }\n setActiveThread(thread);\n }}\n role='option'\n {...props}\n >\n <Avatar size='xl' {...avatarProps} />\n <div className='str-chat__thread-list-item__content'>\n <div className='str-chat__thread-list-item__content-leading'>\n <span className='str-chat__thread-list-item__title'>\n {channelDisplayTitle}\n </span>\n <SummarizedMessagePreview\n latestMessage={parentMessage}\n participantCount={participants?.length}\n />\n </div>\n <div className='str-chat__thread-list-item__content-trailing'>\n <div className='str-chat__thread-list-item__reply-information'>\n <AvatarStack displayInfo={displayInfo} size='sm' />\n <span className='str-chat__thread-list-item__reply-count'>\n {t('replyCount', { count: replyCount })}\n </span>\n </div>\n <Timestamp\n customClass='str-chat__thread-list-item__timestamp'\n timestamp={latestReply?.created_at}\n />\n </div>\n </div>\n {ownUnreadMessageCount > 0 && (\n <Badge size='md' variant='primary'>\n {ownUnreadMessageCount}\n </Badge>\n )}\n </button>\n </div>\n );\n};\n","import React, { createContext, useContext } from 'react';\n\nimport type { Thread } from 'stream-chat';\n\nimport { useComponentContext } from '../../../context';\nimport { ThreadListItemUI as DefaultThreadListItemUI } from './ThreadListItemUI';\n\nimport type { ThreadListItemUIProps } from './ThreadListItemUI';\n\nexport type ThreadListItemProps = {\n thread: Thread;\n threadListItemUIProps?: ThreadListItemUIProps;\n};\n\nconst ThreadListItemContext = createContext<Thread | undefined>(undefined);\n\nexport const useThreadListItemContext = () => useContext(ThreadListItemContext);\n\nexport const ThreadListItem = ({\n thread,\n threadListItemUIProps,\n}: ThreadListItemProps) => {\n const { ThreadListItemUI = DefaultThreadListItemUI } = useComponentContext();\n\n return (\n <ThreadListItemContext.Provider value={thread}>\n <ThreadListItemUI {...threadListItemUIProps} />\n </ThreadListItemContext.Provider>\n );\n};\n","import React from 'react';\n\nimport { useTranslationContext } from '../../../context';\nimport { IconBubbles } from '../../Icons';\n\nexport const ThreadListEmptyPlaceholder = () => {\n const { t } = useTranslationContext('ThreadListEmptyPlaceholder');\n\n return (\n <div className='str-chat__thread-list-empty-placeholder'>\n <IconBubbles />\n <p>{t('Reply to a message to start a thread')}</p>\n </div>\n );\n};\n","import React from 'react';\nimport clsx from 'clsx';\n\nimport type { ThreadManagerState } from 'stream-chat';\n\nimport { IconArrowRotateRightLeftRepeatRefresh } from '../../Icons';\nimport { useChatContext, useTranslationContext } from '../../../context';\nimport { useStateStore } from '../../../store';\nimport { LoadingIndicator } from '../../Loading';\n\nconst selector = (nextValue: ThreadManagerState) => ({\n isLoading: nextValue.pagination.isLoading,\n unseenThreadIds: nextValue.unseenThreadIds,\n});\n\nexport const ThreadListUnseenThreadsBanner = () => {\n const { client } = useChatContext();\n const { t } = useTranslationContext();\n const { isLoading, unseenThreadIds } = useStateStore(client.threads.state, selector);\n\n if (!unseenThreadIds.length) return null;\n\n return (\n <button\n className={clsx('str-chat__unseen-threads-banner', {\n 'str-chat__unseen-threads-banner--loading': isLoading,\n })}\n disabled={isLoading}\n onClick={() => client.threads.reload()}\n >\n {!isLoading && (\n <>\n <IconArrowRotateRightLeftRepeatRefresh />\n <span>\n {t('ThreadListUnseenThreadsBanner/unreadThreads', {\n count: unseenThreadIds.length,\n })}\n </span>\n </>\n )}\n {isLoading && (\n <>\n <LoadingIndicator />\n <span>{t('ThreadListUnseenThreadsBanner/loading')}</span>\n </>\n )}\n </button>\n );\n};\n","import React from 'react';\n\nimport type { ThreadManagerState } from 'stream-chat';\n\nimport { LoadingIndicator as DefaultLoadingIndicator } from '../../Loading';\nimport { useChatContext, useComponentContext } from '../../../context';\nimport { useStateStore } from '../../../store';\n\nconst selector = (nextValue: ThreadManagerState) => ({\n isLoadingNext: nextValue.pagination.isLoadingNext,\n});\n\nexport const ThreadListLoadingIndicator = () => {\n const { LoadingIndicator = DefaultLoadingIndicator } = useComponentContext();\n const { client } = useChatContext();\n const { isLoadingNext } = useStateStore(client.threads.state, selector);\n\n if (!isLoadingNext) return null;\n\n return (\n <div className='str-chat__thread-list-loading-indicator'>\n <LoadingIndicator />\n </div>\n );\n};\n","import React, { type ComponentType } from 'react';\nimport clsx from 'clsx';\nimport { useChatContext, useTranslationContext } from '../../../context';\nimport { IconLayoutAlignLeft } from '../../Icons';\nimport { useThreadsViewContext } from '../../ChatView';\nimport { ToggleSidebarButton } from '../../Button/ToggleSidebarButton';\n\nexport type ChannelListHeaderProps = {\n ToggleButtonIcon?: ComponentType;\n};\n\nexport const ThreadListHeader = ({\n ToggleButtonIcon = IconLayoutAlignLeft,\n}: ChannelListHeaderProps) => {\n const { t } = useTranslationContext();\n const { navOpen } = useChatContext();\n const { activeThread } = useThreadsViewContext();\n return (\n <div\n className={clsx('str-chat__thread-list__header', {\n 'str-chat__thread-list__header--sidebar-collapsed': !navOpen,\n })}\n >\n <div className='str-chat__thread-list__header__title'>{t('Threads')}</div>\n <ToggleSidebarButton canCollapse={!!activeThread} mode={'collapse'}>\n <ToggleButtonIcon />\n </ToggleSidebarButton>\n </div>\n );\n};\n","import React, { useEffect, useState } from 'react';\nimport type { ComputeItemKey, VirtuosoProps } from 'react-virtuoso';\nimport { Virtuoso } from 'react-virtuoso';\nimport clsx from 'clsx';\n\nimport type { Thread, ThreadManager, ThreadManagerState } from 'stream-chat';\n\nimport { ThreadListItem as DefaultThreadListItem } from './ThreadListItem';\nimport { ThreadListEmptyPlaceholder as DefaultThreadListEmptyPlaceholder } from './ThreadListEmptyPlaceholder';\nimport { ThreadListUnseenThreadsBanner as DefaultThreadListUnseenThreadsBanner } from './ThreadListUnseenThreadsBanner';\nimport { ThreadListLoadingIndicator as DefaultThreadListLoadingIndicator } from './ThreadListLoadingIndicator';\nimport { LoadingChannels } from '../../Loading';\nimport { NotificationList } from '../../Notifications';\nimport { useChatContext, useComponentContext } from '../../../context';\nimport { useStateStore } from '../../../store';\nimport { ThreadListHeader } from './ThreadListHeader';\n\nconst selector = (nextValue: ThreadManagerState) => ({\n isLoading: nextValue.pagination.isLoading,\n threads: nextValue.threads,\n});\n\nconst computeItemKey: ComputeItemKey<Thread, unknown> = (_, item) => item.id;\n\ntype ThreadListProps = {\n virtuosoProps?: VirtuosoProps<Thread, unknown>;\n};\n\nexport const useThreadList = () => {\n const { client } = useChatContext();\n\n useEffect(() => {\n const handleVisibilityChange = () => {\n if (document.visibilityState === 'visible') {\n client.threads.activate();\n }\n if (document.visibilityState === 'hidden') {\n client.threads.deactivate();\n }\n };\n\n handleVisibilityChange();\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n return () => {\n client.threads.deactivate();\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n };\n }, [client]);\n};\n\nconst useThreadHighlighting = (threadManager: ThreadManager) => {\n const [threadsToHighlight, setThreadsToHighlight] = useState<\n Record<string, () => void>\n >({});\n\n useEffect(() => {\n const unsubscribe = threadManager.state.subscribeWithSelector(\n (state) => state.threads,\n (nextThreads, previousThreads) => {\n if (!previousThreads) return;\n\n const resetByThreadId: Record<string, () => void> = {};\n\n for (const thread of nextThreads) {\n if (previousThreads.includes(thread)) continue;\n\n resetByThreadId[thread.id] = () => {\n setThreadsToHighlight((pv) => {\n const copy = { ...pv };\n delete copy[thread.id];\n return copy;\n });\n };\n }\n\n setThreadsToHighlight(resetByThreadId);\n },\n );\n\n return unsubscribe;\n });\n\n return threadsToHighlight;\n};\n\nexport const ThreadList = ({ virtuosoProps }: ThreadListProps) => {\n const { client, navOpen = true } = useChatContext();\n const {\n NotificationList: NotificationListFromContext = NotificationList,\n ThreadListEmptyPlaceholder = DefaultThreadListEmptyPlaceholder,\n ThreadListItem = DefaultThreadListItem,\n ThreadListLoadingIndicator = DefaultThreadListLoadingIndicator,\n ThreadListUnseenThreadsBanner = DefaultThreadListUnseenThreadsBanner,\n } = useComponentContext();\n const { isLoading, threads } = useStateStore(client.threads.state, selector);\n\n const resetByThreadId = useThreadHighlighting(client.threads);\n\n useThreadList();\n\n if (isLoading && !threads.length) {\n return (\n <div\n className={clsx('str-chat__thread-list-container', {\n 'str-chat__thread-list-container--open': navOpen,\n })}\n >\n <ThreadListHeader />\n <div className='str-chat__thread-list str-chat__thread-list--loading'>\n <LoadingChannels />\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={clsx('str-chat__thread-list-container', {\n 'str-chat__thread-list-container--open': navOpen,\n })}\n >\n <ThreadListHeader />\n {/* TODO: allow re-load on stale ThreadManager state */}\n <ThreadListUnseenThreadsBanner />\n <Virtuoso\n atBottomStateChange={(atBottom) => atBottom && client.threads.loadNextPage()}\n className='str-chat__thread-list'\n components={{\n EmptyPlaceholder: ThreadListEmptyPlaceholder,\n Footer: ThreadListLoadingIndicator,\n }}\n computeItemKey={computeItemKey}\n data={threads}\n itemContent={(_, thread) => (\n <ThreadListItem\n thread={thread}\n threadListItemUIProps={{\n resetHighlighting: resetByThreadId[thread.id],\n }}\n />\n )}\n // TODO: handle visibility (for a button that scrolls to the unread thread)\n // itemsRendered={(items) => console.log({ items })}\n {...virtuosoProps}\n />\n <NotificationListFromContext panel='thread-list' />\n </div>\n );\n};\n","import React, { type ComponentType, forwardRef } from 'react';\nimport clsx from 'clsx';\nimport type { NotificationSeverity } from 'stream-chat';\nimport { type Notification as NotificationType } from 'stream-chat';\n\nimport {\n IconArrowRotateRightLeftRepeatRefresh,\n IconCheckmark2,\n IconCrossMedium,\n IconExclamationCircle,\n IconExclamationTriangle,\n} from '../../components/Icons';\nimport { useChatContext } from '../../context/ChatContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { Button } from '../Button';\n\ntype NotificationEntryDirection = 'bottom' | 'left' | 'right' | 'top';\ntype NotificationTransitionState = 'enter' | 'exit';\n\nexport type NotificationIconProps = {\n notification: NotificationType;\n};\n\nconst IconsBySeverity: Record<NotificationSeverity, ComponentType | null> = {\n error: IconExclamationCircle,\n info: null, // IconCircleInfoTooltip,\n loading: IconArrowRotateRightLeftRepeatRefresh,\n success: IconCheckmark2,\n warning: IconExclamationTriangle,\n};\n\nconst DefaultNotificationIcon = ({ notification }: NotificationIconProps) => {\n if (!notification.severity) return null;\n\n const Icon = IconsBySeverity[notification.severity] ?? null;\n return (\n Icon && (\n <div className='str-chat__notification-icon'>\n <Icon />\n </div>\n )\n );\n};\n\nexport type NotificationProps = {\n /** Notification from client.notifications state */\n notification: NotificationType;\n /** Optional class name */\n className?: string;\n /** Direction from which the notification enters. */\n entryDirection?: NotificationEntryDirection;\n /** Optional custom icon component. */\n Icon?: React.ComponentType<NotificationIconProps>;\n /** Optional dismiss handler */\n onDismiss?: () => void;\n /** Show close button (for persistent notifications) */\n showClose?: boolean;\n /** Optional transition state applied by NotificationList. */\n transitionState?: NotificationTransitionState;\n};\n\nexport const Notification = forwardRef<HTMLDivElement, NotificationProps>(\n (\n {\n className,\n entryDirection,\n Icon = DefaultNotificationIcon,\n notification,\n onDismiss,\n showClose = false,\n transitionState,\n }: NotificationProps,\n ref,\n ) => {\n const { client } = useChatContext();\n const { t } = useTranslationContext();\n\n const displayMessage = t('translationBuilderTopic/notification', {\n notification,\n value: notification.message,\n });\n\n const handleDismiss = () => {\n if (onDismiss) {\n onDismiss();\n return;\n }\n\n client.notifications.remove(notification.id);\n };\n\n const isPersistent = !notification.duration;\n\n const severity = notification.severity;\n\n return (\n <div\n aria-live='polite'\n className={clsx(\n 'str-chat__notification',\n entryDirection && `str-chat__notification--enter-from-${entryDirection}`,\n transitionState === 'enter' && 'str-chat__notification--is-entering',\n transitionState === 'exit' && 'str-chat__notification--is-exiting',\n severity && `str-chat__notification--${severity}`,\n severity === 'loading' && 'str-chat__notification--loading',\n className,\n )}\n data-testid='notification'\n ref={ref}\n >\n <div className='str-chat__notification-content'>\n {Icon && <Icon notification={notification} />}\n <div className='str-chat__notification-message'>{displayMessage}</div>\n </div>\n {notification.actions && notification.actions.length > 0 && (\n <div className='str-chat__notification-actions'>\n {notification.actions.map((action, index) => (\n <Button\n appearance='outline'\n className='str-chat__notification-action'\n inverseTheme\n key={index}\n onClick={() => {\n action.handler();\n }}\n size='sm'\n variant='secondary'\n >\n {action.label}\n </Button>\n ))}\n </div>\n )}\n {(showClose || isPersistent) && (\n <Button\n appearance='ghost'\n aria-label='Dismiss'\n circular\n className='str-chat__notification-close-button'\n inverseTheme\n onClick={handleDismiss}\n size='sm'\n variant='secondary'\n >\n <IconCrossMedium />\n </Button>\n )}\n </div>\n );\n },\n);\n\nNotification.displayName = 'Notification';\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport clsx from 'clsx';\nimport type { Notification } from 'stream-chat';\n\nimport { useChatContext } from '../../context';\nimport { useNotifications } from './hooks/useNotifications';\nimport { Notification as NotificationComponent } from './Notification';\n\nimport type { NotificationTargetPanel } from './notificationTarget';\n\nexport type NotificationListFilter = (notification: Notification) => boolean;\nexport type NotificationListEnterFrom = 'bottom' | 'left' | 'right' | 'top';\nexport type NotificationListVerticalAlignment = 'bottom' | 'top';\n\nexport type NotificationListProps = {\n /** Optional class name for the list container */\n className?: string;\n /**\n * Direction from which the replacement notification enters the single visible slot.\n * Travel distance is configured in `ENTER_TRANSLATION` below.\n */\n enterFrom?: NotificationListEnterFrom;\n /**\n * When provided, this list only shows notifications that pass the filter.\n * Use to declare which notifications this list consumes (e.g. by origin.emitter, origin.context.channelId, or metadata).\n */\n filter?: NotificationListFilter;\n /** Panel target consumed by this list. */\n panel?: NotificationTargetPanel;\n /** Fallback panel when emitted notifications do not include origin.context.panel. */\n fallbackPanel?: NotificationTargetPanel;\n /** Vertical alignment of the single notification slot within its parent. Defaults to `bottom`. */\n verticalAlignment?: NotificationListVerticalAlignment;\n};\n\n// Entry motion is controlled through CSS variables so the keyframe can stay shared in SCSS.\n// Use full-size percentages on the active axis to make a replacement notification slide in\n// from outside its slot. If future tuning needs more travel, prefer `calc(100% + gap)` here.\nconst ENTER_TRANSLATION: Record<NotificationListEnterFrom, { x: string; y: string }> = {\n bottom: { x: '0%', y: '100%' },\n left: { x: '-100%', y: '0%' },\n right: { x: '100%', y: '0%' },\n top: { x: '0%', y: '-100%' },\n};\n\nconst EXIT_ANIMATION_MS = 340;\n\nconst isEnterFrom = (value: unknown): value is NotificationListEnterFrom =>\n value === 'bottom' || value === 'left' || value === 'right' || value === 'top';\n\nconst getNotificationEnterFrom = (\n notification: Notification | null,\n fallbackEnterFrom: NotificationListEnterFrom,\n) => {\n if (!notification) return fallbackEnterFrom;\n\n const metadataEnterFrom = notification.metadata?.entryDirection;\n if (isEnterFrom(metadataEnterFrom)) return metadataEnterFrom;\n\n const originEnterFrom = notification.origin.context?.entryDirection;\n if (isEnterFrom(originEnterFrom)) return originEnterFrom;\n\n return fallbackEnterFrom;\n};\n\nexport const NotificationList = ({\n className,\n enterFrom = 'bottom',\n fallbackPanel,\n filter,\n panel,\n verticalAlignment = 'bottom',\n}: NotificationListProps) => {\n const { client } = useChatContext();\n const exitTimeoutRef = useRef<number | null>(null);\n const latestNotificationRef = useRef<Notification | null>(null);\n const listRef = useRef<HTMLDivElement | null>(null);\n const observedElementRef = useRef<HTMLDivElement | null>(null);\n const startedTimeoutIdsRef = useRef<Set<string> | null>(null);\n\n if (!startedTimeoutIdsRef.current) {\n startedTimeoutIdsRef.current = new Set<string>();\n }\n\n const [displayedNotification, setDisplayedNotification] = useState<Notification | null>(\n null,\n );\n const [transitionState, setTransitionState] = useState<'enter' | 'exit'>('enter');\n const notifications = useNotifications({ fallbackPanel, filter, panel });\n const nextNotification = notifications[0] ?? null;\n\n const dismiss = useCallback(\n (id: string) => {\n startedTimeoutIdsRef.current?.delete(id);\n client.notifications.remove(id);\n },\n [client],\n );\n\n useEffect(() => {\n const notificationIds = new Set(notifications.map(({ id }) => id));\n\n startedTimeoutIdsRef.current?.forEach((id) => {\n if (!notificationIds.has(id)) {\n startedTimeoutIdsRef.current?.delete(id);\n }\n });\n }, [notifications]);\n\n useEffect(() => {\n latestNotificationRef.current = nextNotification;\n }, [nextNotification]);\n\n useEffect(\n () => () => {\n if (exitTimeoutRef.current) {\n window.clearTimeout(exitTimeoutRef.current);\n }\n },\n [],\n );\n\n useEffect(() => {\n if (!displayedNotification) {\n if (!nextNotification) return;\n\n setDisplayedNotification(nextNotification);\n setTransitionState('enter');\n return;\n }\n\n if (displayedNotification.id === nextNotification?.id) return;\n if (transitionState === 'exit') return;\n\n setTransitionState('exit');\n exitTimeoutRef.current = window.setTimeout(() => {\n setDisplayedNotification(latestNotificationRef.current);\n setTransitionState('enter');\n exitTimeoutRef.current = null;\n }, EXIT_ANIMATION_MS);\n }, [displayedNotification, nextNotification, transitionState]);\n\n const notification = displayedNotification;\n const notificationEnterFrom = getNotificationEnterFrom(notification, enterFrom);\n\n useEffect(() => {\n const element = observedElementRef.current;\n if (!element || !notification || transitionState === 'exit') return;\n\n const startTimeout = () => {\n if (\n !startedTimeoutIdsRef.current ||\n startedTimeoutIdsRef.current.has(notification.id)\n )\n return;\n\n startedTimeoutIdsRef.current.add(notification.id);\n client.notifications.startTimeout(notification.id);\n };\n\n if (typeof IntersectionObserver === 'undefined') {\n startTimeout();\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n const [entry] = entries;\n if (!entry?.isIntersecting) return;\n\n startTimeout();\n observer.disconnect();\n },\n {\n root: listRef.current,\n threshold: 0.5,\n },\n );\n\n observer.observe(element);\n\n return () => {\n observer.disconnect();\n };\n }, [client, notification, transitionState]);\n\n if (!notification) return null;\n\n return (\n <div\n aria-label='Notifications'\n className={clsx(\n 'str-chat__notification-list',\n `str-chat__notification-list--enter-from-${notificationEnterFrom}`,\n `str-chat__notification-list--position-${verticalAlignment}`,\n panel && `str-chat__notification-list--${panel}`,\n className,\n )}\n data-testid='notification-list'\n ref={listRef}\n role='region'\n style={\n {\n '--str-chat__notification-list-enter-x':\n ENTER_TRANSLATION[notificationEnterFrom].x,\n '--str-chat__notification-list-enter-y':\n ENTER_TRANSLATION[notificationEnterFrom].y,\n } as React.CSSProperties\n }\n >\n <div\n aria-hidden\n className='str-chat__notification-list__edge str-chat__notification-list__edge--top'\n />\n <NotificationComponent\n entryDirection={notificationEnterFrom}\n key={notification.id}\n notification={notification}\n onDismiss={() => dismiss(notification.id)}\n ref={(element) => {\n observedElementRef.current = element;\n }}\n showClose={!notification.duration}\n transitionState={transitionState}\n />\n <div\n aria-hidden\n className='str-chat__notification-list__edge str-chat__notification-list__edge--bottom'\n />\n </div>\n );\n};\n","import React from 'react';\nimport type { Attachment } from 'stream-chat';\n\nimport { FileSizeIndicator } from './components';\nimport type { AudioPlayerState } from '../AudioPlayback/AudioPlayer';\nimport { useAudioPlayer } from '../AudioPlayback/WithAudioPlayback';\nimport { useStateStore } from '../../store';\nimport { useMessageContext } from '../../context';\nimport type { AudioPlayer } from '../AudioPlayback/AudioPlayer';\nimport { PlayButton } from '../Button/PlayButton';\nimport { FileIcon } from '../FileIcon';\nimport { DurationDisplay, ProgressBar } from '../AudioPlayback';\n\ntype AudioAttachmentUIProps = {\n audioPlayer: AudioPlayer;\n};\n\n// todo: finish creating a BaseAudioPlayer derived from VoiceRecordingPlayerUI and AudioAttachmentUI\nconst AudioAttachmentUI = ({ audioPlayer }: AudioAttachmentUIProps) => {\n const dataTestId = 'audio-widget';\n const rootClassName = 'str-chat__message-attachment-audio-widget';\n\n const { durationSeconds, isPlaying, progress, secondsElapsed } =\n useStateStore(audioPlayer?.state, audioPlayerStateSelector) ?? {};\n\n return (\n <div className={rootClassName} data-testid={dataTestId}>\n <div className='str-chat__message-attachment-audio-widget--play-controls'>\n <PlayButton isPlaying={!!isPlaying} onClick={audioPlayer.togglePlay} />\n </div>\n <div className='str-chat__message-attachment-audio-widget--data'>\n <div className='str-chat__message-attachment-audio-widget--text-first-row'>\n <div className='str-chat__message-attachment-audio-widget--title'>\n {audioPlayer.title}\n </div>\n <FileIcon\n className='str-chat__file-icon'\n mimeType={audioPlayer.mimeType}\n size='sm'\n />\n {/*<DownloadButton assetUrl={audioPlayer.src} />*/}\n </div>\n <div className='str-chat__message-attachment-audio-widget--text-second-row'>\n {durationSeconds ? (\n <>\n <DurationDisplay\n duration={durationSeconds}\n isPlaying={!!isPlaying}\n secondsElapsed={secondsElapsed}\n />\n <ProgressBar progress={progress ?? 0} seek={audioPlayer.seek} />\n </>\n ) : (\n <>\n <FileSizeIndicator fileSize={audioPlayer.fileSize} />\n <ProgressBar progress={progress ?? 0} seek={audioPlayer.seek} />\n </>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport type AudioProps = {\n attachment: Attachment;\n};\n\nconst audioPlayerStateSelector = (state: AudioPlayerState) => ({\n durationSeconds: state.durationSeconds,\n isPlaying: state.isPlaying,\n progress: state.progressPercent,\n secondsElapsed: state.secondsElapsed,\n});\n\n/**\n * Audio attachment with play/pause button and progress bar\n */\nexport const Audio = (props: AudioProps) => {\n const {\n attachment: { asset_url, duration, file_size, mime_type, title },\n } = props;\n\n /**\n * Introducing message context. This could be breaking change, therefore the fallback to {} is provided.\n * If this component is used outside the message context, then there will be no audio player namespacing\n * => scrolling away from the message in virtualized ML would create a new AudioPlayer instance.\n *\n * Edge case: the requester (message) has multiple attachments with the same assetURL - does not happen\n * with the default SDK components, but can be done with custom API calls.In this case all the Audio\n * widgets will share the state.\n */\n const { message, threadList } = useMessageContext() ?? {};\n\n const audioPlayer = useAudioPlayer({\n durationSeconds: duration,\n fileSize: file_size,\n mimeType: mime_type,\n requester:\n message?.id &&\n `${threadList ? (message.parent_id ?? message.id) : ''}${message.id}`,\n src: asset_url,\n title,\n waveformData: props.attachment.waveform_data,\n });\n\n return audioPlayer ? <AudioAttachmentUI audioPlayer={audioPlayer} /> : null;\n};\n","import React, { useEffect, useMemo, useRef } from 'react';\nimport type { Action, Attachment } from 'stream-chat';\n\nimport { useTranslationContext } from '../../context';\n\nimport type { ActionHandlerReturnType } from '../Message/hooks/useActionHandler';\nimport { Button } from '../Button';\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 { actionHandler, actions, defaultFocusedActionValue, id, text } = props;\n const { t } = useTranslationContext('UnMemoizedAttachmentActions');\n const buttonRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\n const handleActionClick = (\n event: React.MouseEvent<HTMLButtonElement, MouseEvent>,\n name?: string,\n value?: string,\n ) => actionHandler?.(name, value, event);\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 button.focus();\n }\n }, [focusIndex]);\n\n return (\n <div className='str-chat__message-attachment-actions'>\n <div className='str-chat__message-attachment-actions-form'>\n <span>{text}</span>\n {actions.map((action, index) => (\n <Button\n appearance='ghost'\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 {action.text ? (knownActionText[action.text] ?? t(action.text)) : null}\n </Button>\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","import React from 'react';\nimport type { Attachment } from 'stream-chat';\n\nimport { FileSizeIndicator } from './components';\nimport { FileIcon } from '../FileIcon';\nimport { useMessageContext, useTranslationContext } from '../../context';\nimport {\n type AudioPlayer,\n type AudioPlayerState,\n DurationDisplay,\n PlaybackRateButton,\n WaveProgressBar,\n} from '../AudioPlayback';\nimport { useAudioPlayer } from '../AudioPlayback/WithAudioPlayback';\nimport { useStateStore } from '../../store';\nimport { PlayButton } from '../Button';\n\nconst rootClassName = 'str-chat__message-attachment__voice-recording-widget';\n\nconst audioPlayerStateSelector = (state: AudioPlayerState) => ({\n canPlayRecord: state.canPlayRecord,\n durationSeconds: state.durationSeconds,\n isPlaying: state.isPlaying,\n playbackRate: state.currentPlaybackRate,\n progress: state.progressPercent,\n secondsElapsed: state.secondsElapsed,\n});\n\ntype VoiceRecordingPlayerUIProps = {\n audioPlayer: AudioPlayer;\n};\n\n// todo: finish creating a BaseAudioPlayer derived from VoiceRecordingPlayerUI and AudioAttachmentUI\nconst VoiceRecordingPlayerUI = ({ audioPlayer }: VoiceRecordingPlayerUIProps) => {\n const {\n canPlayRecord,\n durationSeconds,\n isPlaying,\n playbackRate,\n progress,\n secondsElapsed,\n } = useStateStore(audioPlayer?.state, audioPlayerStateSelector) ?? {};\n\n return (\n <div className={rootClassName} data-testid='voice-recording-widget'>\n <PlayButton isPlaying={!!isPlaying} onClick={audioPlayer.togglePlay} />\n <div className='str-chat__message-attachment__voice-recording-widget__metadata'>\n <div className='str-chat__message-attachment__voice-recording-widget__audio-state'>\n <div className='str-chat__message-attachment__voice-recording-widget__timer'>\n {durationSeconds ? (\n <DurationDisplay\n duration={durationSeconds}\n isPlaying={!!isPlaying}\n secondsElapsed={secondsElapsed}\n showRemaining\n />\n ) : (\n <FileSizeIndicator\n fileSize={audioPlayer.fileSize}\n maximumFractionDigits={0}\n />\n )}\n </div>\n <WaveProgressBar\n progress={progress}\n seek={audioPlayer.seek}\n waveformData={audioPlayer.waveformData || []}\n />\n </div>\n </div>\n <div className='str-chat__message-attachment__voice-recording-widget__right-section'>\n <PlaybackRateButton\n disabled={!canPlayRecord}\n onClick={audioPlayer.increasePlaybackRate}\n >\n x{playbackRate?.toString()}\n </PlaybackRateButton>\n </div>\n </div>\n );\n};\n\nexport type VoiceRecordingPlayerProps = Pick<VoiceRecordingProps, 'attachment'> & {\n /** An array of fractional numeric values of playback speed to override the defaults (1.0, 1.5, 2.0) */\n playbackRates?: number[];\n};\n\nexport const VoiceRecordingPlayer = ({\n attachment,\n playbackRates,\n}: VoiceRecordingPlayerProps) => {\n const { t } = useTranslationContext();\n const {\n asset_url,\n duration = 0,\n file_size,\n mime_type,\n title = t('Voice message'),\n waveform_data,\n } = attachment;\n\n /**\n * Introducing message context. This could be breaking change, therefore the fallback to {} is provided.\n * If this component is used outside the message context, then there will be no audio player namespacing\n * => scrolling away from the message in virtualized ML would create a new AudioPlayer instance.\n *\n * Edge case: the requester (message) has multiple attachments with the same assetURL - does not happen\n * with the default SDK components, but can be done with custom API calls.In this case all the Audio\n * widgets will share the state.\n */\n const { message, threadList } = useMessageContext() ?? {};\n\n const audioPlayer = useAudioPlayer({\n durationSeconds: duration ?? 0,\n fileSize: file_size,\n mimeType: mime_type,\n playbackRates,\n requester:\n message?.id &&\n `${threadList ? (message.parent_id ?? message.id) : ''}${message.id}`,\n src: asset_url,\n title,\n waveformData: waveform_data,\n });\n\n return audioPlayer ? <VoiceRecordingPlayerUI audioPlayer={audioPlayer} /> : null;\n};\n\nexport type QuotedVoiceRecordingProps = Pick<VoiceRecordingProps, 'attachment'>;\n\nexport const QuotedVoiceRecording = ({ attachment }: QuotedVoiceRecordingProps) => (\n // const { t } = useTranslationContext();\n // const title = attachment.title || t('Voice message');\n <div className={rootClassName} data-testid='quoted-voice-recording-widget'>\n <div className='str-chat__message-attachment__voice-recording-widget__metadata'>\n <div className='str-chat__message-attachment__voice-recording-widget__audio-state'>\n <div className='str-chat__message-attachment__voice-recording-widget__timer'>\n {attachment.duration ? (\n <DurationDisplay\n duration={attachment.duration}\n isPlaying={false}\n secondsElapsed={undefined}\n />\n ) : (\n <FileSizeIndicator\n fileSize={attachment.file_size}\n maximumFractionDigits={0}\n />\n )}\n </div>\n </div>\n </div>\n <FileIcon mimeType={attachment.mime_type} />\n </div>\n);\n\nexport type VoiceRecordingProps = {\n /** The attachment object from the message's attachment list. */\n attachment: Attachment;\n /** A boolean flag to signal whether the attachment will be rendered inside the quoted reply. */\n isQuoted?: boolean;\n};\n\nexport const VoiceRecording = ({ attachment, isQuoted }: VoiceRecordingProps) =>\n isQuoted ? (\n <QuotedVoiceRecording attachment={attachment} />\n ) : (\n <VoiceRecordingPlayer attachment={attachment} />\n );\n","import React, { useCallback, useState } from 'react';\nimport clsx from 'clsx';\n\nimport type { BaseImageProps } from '../BaseImage';\nimport type { GalleryItem } from '../Gallery/GalleryContext';\nimport { BaseImage as DefaultBaseImage } from '../BaseImage';\nimport { Gallery as DefaultGallery, GalleryUI } from '../Gallery';\nimport { LoadingIndicator } from '../Loading';\nimport { GlobalModal } from '../Modal';\nimport { useComponentContext, useTranslationContext } from '../../context';\nimport { IconArrowRotateClockwise } from '../Icons';\nimport { VideoThumbnail } from '../VideoPlayer/VideoThumbnail';\n\nconst MAX_VISIBLE_THUMBNAILS = 4;\nconst BASE_IMAGE_PROP_KEYS = [\n 'className',\n 'crossOrigin',\n 'decoding',\n 'draggable',\n 'fetchPriority',\n 'height',\n 'loading',\n 'onError',\n 'onLoad',\n 'ref',\n 'showDownloadButtonOnError',\n 'sizes',\n 'srcSet',\n 'style',\n 'title',\n 'useMap',\n 'width',\n] as const satisfies ReadonlyArray<keyof Omit<BaseImageProps, 'src'>>;\ntype BaseImagePropsWithoutSrc = Omit<BaseImageProps, 'src'>;\ntype PartialBaseImagePropMap = Partial<\n Record<(typeof BASE_IMAGE_PROP_KEYS)[number], unknown>\n>;\n\nexport type ModalGalleryProps = {\n /** Array of media attachments to display */\n items: GalleryItem[];\n className?: string;\n /** Whether clicking the empty gallery background should close the modal (default: true) */\n closeOnBackgroundClick?: boolean;\n modalClassName?: string;\n};\n\nexport const ModalGallery = ({\n className,\n closeOnBackgroundClick = true,\n items,\n modalClassName,\n}: ModalGalleryProps) => {\n const {\n BaseImage = DefaultBaseImage,\n Gallery = DefaultGallery,\n Modal = GlobalModal,\n } = useComponentContext();\n const [modalOpen, setModalOpen] = useState(false);\n const [selectedIndex, setSelectedIndex] = useState(0);\n const usesDefaultBaseImage = BaseImage === DefaultBaseImage;\n\n const closeModal = useCallback(() => {\n setModalOpen(false);\n }, []);\n\n const handleThumbnailClick = useCallback((index: number) => {\n setSelectedIndex(index);\n setModalOpen(true);\n }, []);\n\n const itemCount = items.length;\n const visibleItems = items.slice(0, MAX_VISIBLE_THUMBNAILS);\n const overflowCount = itemCount - MAX_VISIBLE_THUMBNAILS;\n\n return (\n <>\n <div\n className={clsx('str-chat__modal-gallery', className, {\n 'str-chat__modal-gallery--three-images': itemCount === 3,\n 'str-chat__modal-gallery--two-images': itemCount === 2,\n })}\n >\n {visibleItems.map((item, index) => {\n const isLastVisible = index === MAX_VISIBLE_THUMBNAILS - 1;\n const showOverlay = isLastVisible && overflowCount > 0;\n\n return (\n <ThumbnailButton\n BaseImage={BaseImage}\n baseImageUsesDefaultBehavior={usesDefaultBaseImage}\n index={index}\n item={item}\n itemCount={itemCount}\n key={index}\n onClick={() => handleThumbnailClick(index)}\n overflowCount={overflowCount}\n showOverlay={showOverlay}\n />\n );\n })}\n </div>\n <Modal\n className={clsx('str-chat__gallery-modal', modalClassName)}\n onClose={closeModal}\n open={modalOpen}\n >\n <Gallery\n closeOnBackgroundClick={closeOnBackgroundClick}\n GalleryUI={GalleryUI}\n initialIndex={selectedIndex}\n items={items}\n onRequestClose={closeModal}\n />\n </Modal>\n </>\n );\n};\n\ntype ThumbnailButtonProps = {\n BaseImage: React.ComponentType<BaseImageProps>;\n baseImageUsesDefaultBehavior: boolean;\n index: number;\n item: GalleryItem;\n itemCount: number;\n onClick: () => void;\n overflowCount: number;\n showOverlay: boolean;\n};\n\nconst ThumbnailButton = ({\n BaseImage,\n baseImageUsesDefaultBehavior,\n index,\n item,\n itemCount,\n onClick,\n overflowCount,\n showOverlay,\n}: ThumbnailButtonProps) => {\n const { t } = useTranslationContext();\n const imageUrl = item.imageUrl;\n const [isLoadFailed, setIsLoadFailed] = useState(false);\n const [isImageLoading, setIsImageLoading] = useState(Boolean(imageUrl));\n const [retryCount, setRetryCount] = useState(0);\n\n const {\n onError: itemOnError,\n onLoad: itemOnLoad,\n ...baseImageProps\n } = getBaseImageProps(item);\n const showRetryIndicator = isLoadFailed && !showOverlay;\n const showLoadingIndicator = isImageLoading && !showRetryIndicator && !showOverlay;\n\n const handleButtonClick = () => {\n if (showRetryIndicator) {\n setIsLoadFailed(false);\n setIsImageLoading(true);\n setRetryCount((currentRetryCount) => currentRetryCount + 1);\n return;\n }\n\n onClick();\n };\n\n const buttonLabel = showRetryIndicator\n ? t('aria/Retry upload')\n : itemCountAwareLabel({ imageIndex: index + 1, itemCount, t });\n\n return (\n <button\n aria-label={buttonLabel}\n className={clsx('str-chat__modal-gallery__image', {\n 'str-chat__modal-gallery__image--load-failed': showRetryIndicator,\n 'str-chat__modal-gallery__image--loading': showLoadingIndicator,\n })}\n onClick={handleButtonClick}\n type='button'\n >\n {item.videoThumbnailUrl ? (\n <VideoThumbnail alt={t('User uploaded content')} src={item.videoThumbnailUrl} />\n ) : (\n <BaseImage\n // Remount the image on retry so the browser gets a fresh load attempt and\n // BaseImage clears its local load-failed state.\n key={retryCount}\n {...baseImageProps}\n alt={item.alt ?? t('User uploaded content')}\n onError={(event) => {\n setIsImageLoading(false);\n setIsLoadFailed(true);\n itemOnError?.(event);\n }}\n onLoad={(event) => {\n setIsImageLoading(false);\n setIsLoadFailed(false);\n itemOnLoad?.(event);\n }}\n src={imageUrl}\n {...(baseImageUsesDefaultBehavior ? { showDownloadButtonOnError: false } : {})}\n />\n )}\n {showLoadingIndicator && (\n <div\n aria-hidden='true'\n className='str-chat__modal-gallery__image-loading-overlay'\n data-testid='str-chat__modal-gallery__image-loading-overlay'\n >\n <LoadingIndicator />\n </div>\n )}\n {showRetryIndicator && (\n <div\n aria-hidden='true'\n className='str-chat__modal-gallery__image-load-failed-overlay'\n data-testid='str-chat__modal-gallery__image-load-failed-overlay'\n >\n <div className='str-chat__modal-gallery__image-retry-indicator'>\n <IconArrowRotateClockwise />\n </div>\n </div>\n )}\n {showOverlay && (\n <div className='str-chat__modal-gallery__placeholder'>+{overflowCount}</div>\n )}\n </button>\n );\n};\n\nconst itemCountAwareLabel = ({\n imageIndex,\n itemCount,\n t,\n}: {\n imageIndex: number;\n itemCount: number;\n t: ReturnType<typeof useTranslationContext>['t'];\n}) =>\n itemCount === 1\n ? t('Open image in gallery')\n : t('Open gallery at image {{ index }}', {\n index: imageIndex,\n });\n\nconst getBaseImageProps = (item: GalleryItem): BaseImagePropsWithoutSrc => {\n const baseImageProps: PartialBaseImagePropMap = {};\n for (const key of BASE_IMAGE_PROP_KEYS) {\n const value = item[key];\n if (value !== undefined) {\n baseImageProps[key] = value;\n }\n }\n\n return baseImageProps as BaseImagePropsWithoutSrc;\n};\n","import React from 'react';\nimport { ModalGallery as DefaultModalGallery } from './ModalGallery';\nimport { useComponentContext } from '../../context';\nimport type { GalleryItem } from '../Gallery/GalleryContext';\n\nexport type ImageProps = GalleryItem;\n\n/**\n * Display image with tap-to-expand modal gallery.\n */\nexport const ImageComponent = (galleryItem: ImageProps) => {\n const { ModalGallery = DefaultModalGallery } = useComponentContext();\n\n return <ModalGallery items={[galleryItem]} modalClassName='str-chat__image-modal' />;\n};\n","import type { Attachment } from 'stream-chat';\nimport { useTranslationContext } from '../../../context';\nimport clsx from 'clsx';\nimport React from 'react';\n\nexport const UnableToRenderCard = ({ type }: { type?: Attachment['type'] }) => {\n const { t } = useTranslationContext('Card');\n\n return (\n <div\n className={clsx('str-chat__message-attachment-card', {\n [`str-chat__message-attachment-card--${type}`]: type,\n })}\n >\n <div className='str-chat__message-attachment-card--content'>\n <div className='str-chat__message-attachment-card--text'>\n {t('this content could not be displayed')}\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { BaseImage } from '../../BaseImage';\nimport { SafeAnchor } from '../../SafeAnchor';\nimport { useChannelStateContext } from '../../../context/ChannelStateContext';\n\nimport type { Attachment } from 'stream-chat';\nimport type { RenderAttachmentProps } from '../utils';\nimport type { Dimensions } from '../../../types/types';\nimport { IconChainLink } from '../../Icons';\nimport { UnableToRenderCard } from './UnableToRenderCard';\nimport clsx from 'clsx';\n\ntype CardRootProps = {\n cardUrl: string | undefined;\n children: React.ReactNode;\n type?: CardProps['type'];\n};\n\nconst CardRoot = ({ cardUrl, children, type }: CardRootProps) => {\n const className = clsx(\n `str-chat__message-attachment-card str-chat__message-attachment-card--${type}`,\n );\n\n return cardUrl ? (\n <SafeAnchor\n className={className}\n href={cardUrl}\n rel='noopener noreferrer'\n target='_blank'\n >\n {children}\n </SafeAnchor>\n ) : (\n <div className={className}>{children}</div>\n );\n};\n\ntype CardHeaderProps = Pick<CardProps, 'title' | 'type' | 'image_url' | 'thumb_url'> & {\n dimensions: Dimensions;\n image?: string;\n};\n\nconst CardHeader = (props: CardHeaderProps) => {\n const { dimensions, image, image_url, thumb_url, title } = props;\n\n return image ? (\n <div\n className='str-chat__message-attachment-card--header str-chat__message-attachment-card-react--header'\n data-testid={'card-header'}\n >\n <BaseImage\n alt={title || image}\n data-testid='image-test'\n src={image_url ?? thumb_url}\n title={title || image}\n {...dimensions}\n />\n </div>\n ) : null;\n};\n\ntype CardContentProps = RenderAttachmentProps['attachment'];\n\nconst CardContent = (props: CardContentProps) => {\n const { og_scrape_url, text, title, title_link } = props;\n const url = title_link || og_scrape_url;\n\n return (\n <div className='str-chat__message-attachment-card--content'>\n {title && <div className='str-chat__message-attachment-card--title'>{title}</div>}\n {text && <div className='str-chat__message-attachment-card--text'>{text}</div>}\n {url && (\n <div\n className='str-chat__message-attachment-card--source-link'\n data-testid='card-source-link'\n >\n <IconChainLink />\n <div className='str-chat__message-attachment-card--url'>{url}</div>\n </div>\n )}\n </div>\n );\n};\n\nexport type CardProps = RenderAttachmentProps['attachment'] & {\n compact?: boolean;\n};\n\nconst UnMemoizedCard = (props: CardProps) => {\n const { giphy, image_url, og_scrape_url, thumb_url, title, title_link, type } = props;\n const { giphyVersion: giphyVersionName } = useChannelStateContext('');\n const cardUrl = title_link || og_scrape_url;\n\n let image = thumb_url || image_url;\n const dimensions: { height?: string; width?: string } = {};\n\n if (type === 'giphy' && typeof giphy !== 'undefined') {\n const giphyVersion =\n giphy[giphyVersionName as keyof NonNullable<Attachment['giphy']>];\n image = giphyVersion.url;\n dimensions.height = giphyVersion.height;\n dimensions.width = giphyVersion.width;\n }\n\n if (!title && !cardUrl && !image) {\n return <UnableToRenderCard />;\n }\n\n return (\n <CardRoot cardUrl={cardUrl} type={type}>\n <CardHeader {...props} dimensions={dimensions} image={image} />\n <CardContent {...props} />\n </CardRoot>\n );\n};\n\n/**\n * Simple Card Layout for displaying links\n */\nexport const Card = React.memo(UnMemoizedCard) as typeof UnMemoizedCard;\n","import React from 'react';\nimport { useComponentContext } from '../../context/ComponentContext';\nimport { FileIcon } from '../FileIcon';\nimport type { Attachment } from 'stream-chat';\n\nimport { FileSizeIndicator } from './components';\n\nexport type FileAttachmentProps = {\n attachment: Attachment;\n};\n\nexport const FileAttachment = ({ attachment }: FileAttachmentProps) => {\n const { AttachmentFileIcon } = useComponentContext();\n const FileIconComponent = AttachmentFileIcon ?? FileIcon;\n return (\n <div\n className='str-chat__message-attachment-file--item'\n data-testid='attachment-file'\n >\n <FileIconComponent\n className='str-chat__file-icon'\n fileName={attachment.title}\n mimeType={attachment.mime_type}\n />\n <div className='str-chat__message-attachment-file--item__info'>\n <div className='str-chat__message-attachment-file--item__first-row'>\n <div\n className='str-chat__message-attachment-file--item__name'\n data-testid='file-title'\n >\n {attachment.title}\n </div>\n {/*<DownloadButton assetUrl={attachment.asset_url} />*/}\n </div>\n <div className='str-chat__message-attachment-file--item__data'>\n <FileSizeIndicator fileSize={attachment.file_size} />\n </div>\n </div>\n </div>\n );\n};\n","import type { Attachment } from 'stream-chat';\nimport { BaseImage as DefaultBaseImage } from '../BaseImage';\nimport { toGalleryItemDescriptors } from '../Gallery';\nimport clsx from 'clsx';\nimport {\n useChannelStateContext,\n useComponentContext,\n useTranslationContext,\n} from '../../context';\nimport { IconGiphy } from '../Icons';\nimport { useMemo } from 'react';\n\nexport type GiphyAttachmentProps = {\n attachment: Attachment;\n};\n\nexport const Giphy = ({ attachment }: GiphyAttachmentProps) => {\n const { giphyVersion: giphyVersionName } = useChannelStateContext();\n const { BaseImage = DefaultBaseImage } = useComponentContext();\n const { t } = useTranslationContext();\n const usesDefaultBaseImage = BaseImage === DefaultBaseImage;\n\n const imageDescriptors = useMemo(\n () => toGalleryItemDescriptors(attachment, { giphyVersionName }),\n [attachment, giphyVersionName],\n );\n\n if (!imageDescriptors?.imageUrl) return null;\n\n const { alt, dimensions, imageUrl, title } = imageDescriptors;\n\n return (\n <div className={clsx(`str-chat__message-attachment-giphy`)}>\n <BaseImage\n alt={alt ?? title ?? t('User uploaded content')}\n height={dimensions?.height}\n src={imageUrl}\n width={dimensions?.width}\n {...(usesDefaultBaseImage ? { showDownloadButtonOnError: false } : {})}\n />\n <GiphyBadge />\n </div>\n );\n};\n\nconst GiphyBadge = () => (\n <div className='str-chat__giphy-badge'>\n <IconGiphy />\n Giphy\n </div>\n);\n","import type { ComponentType } from 'react';\nimport { useEffect } from 'react';\nimport { useRef, useState } from 'react';\nimport React from 'react';\nimport type { Coords, SharedLocationResponse } from 'stream-chat';\nimport { useChatContext, useTranslationContext } from '../../context';\nimport { ExternalLinkIcon } from './icons';\nimport { IconMapPin } from '../Icons';\nimport { Button } from '../Button';\n\nexport type GeolocationMapProps = Coords;\n\nexport type GeolocationProps = {\n location: SharedLocationResponse;\n GeolocationAttachmentMapPlaceholder?: ComponentType<GeolocationAttachmentMapPlaceholderProps>;\n GeolocationMap?: ComponentType<GeolocationMapProps>;\n};\n\nexport const Geolocation = ({\n GeolocationAttachmentMapPlaceholder = DefaultGeolocationAttachmentMapPlaceholder,\n GeolocationMap,\n location,\n}: GeolocationProps) => {\n const { channel, client } = useChatContext();\n const { t } = useTranslationContext();\n\n const [stoppedSharing, setStoppedSharing] = useState(\n !!location.end_at && new Date(location.end_at).getTime() < new Date().getTime(),\n );\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n const isMyLocation = location.user_id === client.userID;\n const isLiveLocation = !!location.end_at;\n\n useEffect(() => {\n if (!location.end_at) return;\n clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(\n () => setStoppedSharing(true),\n new Date(location.end_at).getTime() - Date.now(),\n );\n }, [location.end_at]);\n\n return (\n <div\n className='str-chat__message-attachment-geolocation'\n data-testid='attachment-geolocation'\n >\n <div className='str-chat__message-attachment-geolocation__location-preview'>\n {GeolocationMap ? (\n <GeolocationMap latitude={location.latitude} longitude={location.longitude} />\n ) : (\n <GeolocationAttachmentMapPlaceholder location={location} />\n )}\n </div>\n <div className='str-chat__message-attachment-geolocation__status'>\n {isLiveLocation ? (\n stoppedSharing ? (\n t('Location sharing ended')\n ) : isMyLocation ? (\n <div className='str-chat__message-attachment-geolocation__status--active'>\n <Button\n appearance='outline'\n className='str-chat__message-attachment-geolocation__stop-sharing-button'\n onClick={() => channel?.stopLiveLocationSharing(location)}\n size='sm'\n variant='secondary'\n >\n {t('Stop sharing')}\n </Button>\n <div className='str-chat__message-attachment-geolocation__status--active-until'>\n {t('Live until {{ timestamp }}', {\n timestamp: t('timestamp/LiveLocation', { timestamp: location.end_at }),\n })}\n </div>\n </div>\n ) : (\n <div className='str-chat__message-attachment-geolocation__status--active'>\n <div className='str-chat__message-attachment-geolocation__status--active-status'>\n {t('Live location')}\n </div>\n <div className='str-chat__message-attachment-geolocation__status--active-until'>\n {t('Live until {{ timestamp }}', {\n timestamp: t('timestamp/LiveLocation', { timestamp: location.end_at }),\n })}\n </div>\n </div>\n )\n ) : (\n t('Current location')\n )}\n </div>\n </div>\n );\n};\n\nexport type GeolocationAttachmentMapPlaceholderProps = {\n location: SharedLocationResponse;\n};\n\nconst DefaultGeolocationAttachmentMapPlaceholder = ({\n location,\n}: GeolocationAttachmentMapPlaceholderProps) => (\n <div\n className='str-chat__message-attachment-geolocation__placeholder'\n data-testid='geolocation-attachment-map-placeholder'\n >\n <IconMapPin />\n <a\n className='str-chat__message-attachment-geolocation__placeholder-link'\n href={`https://maps.google.com?q=${[location.latitude, location.longitude].join()}`}\n rel='noreferrer'\n target='_blank'\n >\n <ExternalLinkIcon />\n </a>\n </div>\n);\n","import React from 'react';\nimport type { Attachment } from 'stream-chat';\n\nimport { FileIcon } from '../FileIcon';\nimport { useTranslationContext } from '../../context';\n\nexport type UnsupportedAttachmentProps = {\n attachment: Attachment;\n};\n\nexport const UnsupportedAttachment = ({ attachment }: UnsupportedAttachmentProps) => {\n const { t } = useTranslationContext('UnsupportedAttachment');\n return (\n <div\n className='str-chat__message-attachment-unsupported'\n data-testid='attachment-unsupported'\n >\n <FileIcon className='str-chat__file-icon' />\n <div className='str-chat__message-attachment-unsupported__metadata'>\n <div\n className='str-chat__message-attachment-unsupported__title'\n data-testid='unsupported-attachment-title'\n >\n {attachment.title || t('Unsupported attachment')}\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { IconEyeOpen } from '../Icons';\nimport { useTranslationContext } from '../../context';\n\nexport const VisibilityDisclaimer = () => {\n const { t } = useTranslationContext();\n return (\n <div className='str-chat__visibility-disclaimer'>\n <IconEyeOpen />\n {t('Only visible to you')}\n </div>\n );\n};\n","import type { VideoAttachment as VideoAttachmentType } from 'stream-chat';\nimport { useChannelStateContext } from '../../context';\nimport React, { type ComponentType, useLayoutEffect, useRef, useState } from 'react';\nimport type { VideoAttachmentConfiguration } from '../../types/types';\nimport { getCssDimensionsVariables } from './utils';\nimport type { VideoPlayerProps } from '../VideoPlayer';\nimport { VideoPlayer as DefaultVideoPlayer } from '../VideoPlayer';\nimport { VideoThumbnail } from '../VideoPlayer/VideoThumbnail';\n\nexport type VideoAttachmentProps = {\n attachment: VideoAttachmentType;\n VideoPlayer?: ComponentType<VideoPlayerProps>;\n};\n\nexport const VideoAttachment = ({\n attachment,\n VideoPlayer = DefaultVideoPlayer,\n}: VideoAttachmentProps) => {\n const { shouldGenerateVideoThumbnail, videoAttachmentSizeHandler } =\n useChannelStateContext();\n const videoElement = useRef<HTMLDivElement>(null);\n const [attachmentConfiguration, setAttachmentConfiguration] =\n useState<VideoAttachmentConfiguration>();\n const [showVideo, setShowVideo] = React.useState(!shouldGenerateVideoThumbnail);\n\n useLayoutEffect(() => {\n if (videoElement.current && videoAttachmentSizeHandler) {\n const config = videoAttachmentSizeHandler(\n attachment,\n videoElement.current,\n shouldGenerateVideoThumbnail,\n );\n setAttachmentConfiguration(config);\n }\n }, [\n videoElement,\n videoAttachmentSizeHandler,\n attachment,\n shouldGenerateVideoThumbnail,\n ]);\n\n const renderThumbnailFirst = Boolean(\n attachment.thumb_url && shouldGenerateVideoThumbnail,\n );\n\n // todo: handle failed thumbnail loading\n return (\n <div\n className='str-chat__player-wrapper'\n data-testid='video-wrapper'\n ref={videoElement}\n style={getCssDimensionsVariables(attachment.thumb_url || '')}\n >\n {renderThumbnailFirst && !showVideo ? (\n <VideoThumbnail\n alt={attachment.title}\n data-testid='image-test'\n onPlay={() => setShowVideo(true)}\n src={attachment.thumb_url}\n title={attachment.title}\n />\n ) : (\n <VideoPlayer\n isPlaying={renderThumbnailFirst}\n thumbnailUrl={attachmentConfiguration?.thumbUrl}\n videoUrl={attachmentConfiguration?.url}\n />\n )}\n </div>\n );\n};\n","import React, {\n type PropsWithChildren,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport clsx from 'clsx';\nimport type {\n Attachment,\n LocalAttachment,\n SharedLocationResponse,\n VideoAttachment as VideoAttachmentType,\n} from 'stream-chat';\nimport {\n isAudioAttachment,\n isFileAttachment,\n isSharedLocationResponse,\n isVideoAttachment,\n isVoiceRecordingAttachment,\n} from 'stream-chat';\n\nimport { Audio as DefaultAudioAttachment } from './Audio';\nimport { AttachmentActions as DefaultAttachmentActions } from './AttachmentActions';\nimport { VoiceRecording as DefaultVoiceRecording } from './VoiceRecording';\nimport { type GalleryItem, toGalleryItemDescriptors } from '../Gallery';\nimport { ImageComponent as DefaultImage } from './Image';\nimport { Card as DefaultCard } from './LinkPreview/Card';\nimport { FileAttachment as DefaultFile } from './FileAttachment';\nimport { Giphy as DefaultGiphy } from './Giphy';\nimport { Geolocation as DefaultGeolocation } from './Geolocation';\nimport { ModalGallery as DefaultModalGallery } from './ModalGallery';\nimport { UnsupportedAttachment as DefaultUnsupportedAttachment } from './UnsupportedAttachment';\nimport {\n type AttachmentComponentType,\n type GalleryAttachment,\n type GeolocationContainerProps,\n getCssDimensionsVariables,\n isGalleryAttachmentType,\n isSvgAttachment,\n type RenderAttachmentProps,\n type RenderGalleryProps,\n type RenderMediaProps,\n SUPPORTED_VIDEO_FORMATS,\n} from './utils';\nimport { useChannelStateContext } from '../../context/ChannelStateContext';\nimport type { ImageAttachmentConfiguration } from '../../types/types';\nimport { VisibilityDisclaimer } from './VisibilityDisclaimer';\nimport { VideoAttachment } from './VideoAttachment';\nimport type { AttachmentProps } from './Attachment';\n\nexport type AttachmentContainerProps = {\n attachment: Attachment | GalleryAttachment | SharedLocationResponse;\n componentType: AttachmentComponentType;\n};\nexport const AttachmentWithinContainer = ({\n attachment,\n children,\n componentType,\n}: PropsWithChildren<AttachmentContainerProps>) => {\n const isGAT = isGalleryAttachmentType(attachment);\n let extra = '';\n\n if (!isGAT && !isSharedLocationResponse(attachment)) {\n extra =\n componentType === 'card' && !attachment?.image_url && !attachment?.thumb_url\n ? 'no-image'\n : attachment?.actions?.length\n ? 'actions'\n : '';\n }\n\n const classNames = clsx(\n 'str-chat__message-attachment str-chat__message-attachment-dynamic-size',\n {\n [`str-chat__message-attachment--${componentType}`]: componentType,\n [`str-chat__message-attachment--${(attachment as Attachment)?.type}`]: (\n attachment as Attachment\n )?.type,\n [`str-chat__message-attachment--${componentType}--${extra}`]:\n componentType && extra,\n 'str-chat__message-attachment--svg-image': isSvgAttachment(attachment),\n 'str-chat__message-attachment-with-actions': extra === 'actions',\n },\n );\n\n return <div className={classNames}>{children}</div>;\n};\n\nexport const AttachmentActionsContainer = ({\n actionHandler,\n attachment,\n AttachmentActions = DefaultAttachmentActions,\n attachmentActionsDefaultFocus,\n}: RenderAttachmentProps) => {\n if (!attachment.actions?.length) return null;\n\n const defaultFocusedActionValue =\n attachment.type && attachmentActionsDefaultFocus?.[attachment.type];\n\n return (\n <AttachmentActions\n {...attachment}\n actionHandler={actionHandler}\n actions={attachment.actions}\n defaultFocusedActionValue={defaultFocusedActionValue}\n id={(attachment as LocalAttachment).localMetadata?.id || ''}\n text={attachment.text || ''}\n />\n );\n};\n\nexport const MediaContainer = (props: RenderMediaProps) => {\n const { attachments: mediaAttachments } = props;\n if (!mediaAttachments.length) return null;\n\n if (mediaAttachments.length > 1) {\n return (\n <GalleryContainer\n {...props}\n attachment={{ items: mediaAttachments, type: 'gallery' }}\n />\n );\n }\n\n const mediaAttachment = mediaAttachments[0];\n const { attachments: _attachments, ...rest } = props; // eslint-disable-line @typescript-eslint/no-unused-vars\n\n if (isVideoAttachment(mediaAttachment, SUPPORTED_VIDEO_FORMATS)) {\n return <VideoContainer attachment={mediaAttachment} {...rest} />;\n }\n\n return <ImageContainer attachment={mediaAttachment} {...rest} />;\n};\n\nexport const CardContainer = (props: RenderAttachmentProps) => {\n const { attachment, Card = DefaultCard } = props;\n const componentType = 'card';\n\n if (attachment.actions && attachment.actions.length) {\n return (\n <AttachmentWithinContainer attachment={attachment} componentType={componentType}>\n <div className='str-chat__attachment'>\n <Card {...attachment} />\n <AttachmentActionsContainer {...props} />\n </div>\n </AttachmentWithinContainer>\n );\n }\n\n return (\n <AttachmentWithinContainer attachment={attachment} componentType={componentType}>\n <Card {...attachment} />\n </AttachmentWithinContainer>\n );\n};\n\nexport const GiphyContainer = (props: RenderAttachmentProps) => {\n const { attachment, Giphy = DefaultGiphy } = props;\n const componentType = 'giphy';\n\n if (attachment.actions && attachment.actions.length) {\n return (\n <AttachmentWithinContainer attachment={attachment} componentType={componentType}>\n <div className='str-chat__attachment'>\n <VisibilityDisclaimer />\n <Giphy attachment={attachment} />\n <AttachmentActionsContainer {...props} />\n </div>\n </AttachmentWithinContainer>\n );\n }\n\n return (\n <AttachmentWithinContainer attachment={attachment} componentType={componentType}>\n <Giphy attachment={attachment} />\n </AttachmentWithinContainer>\n );\n};\n\nexport const FileContainer = (props: RenderAttachmentProps) => {\n const { attachment } = props;\n\n if (isVoiceRecordingAttachment(attachment)) {\n return <VoiceRecordingContainer {...props} />;\n }\n\n if (isAudioAttachment(attachment)) {\n return <AudioContainer {...props} />;\n }\n\n if (!attachment.asset_url || !isFileAttachment(attachment, SUPPORTED_VIDEO_FORMATS)) {\n return null;\n }\n\n return <OtherFilesContainer {...props} />;\n};\n\nexport const GalleryContainer = ({\n attachment,\n ModalGallery = DefaultModalGallery,\n}: RenderGalleryProps) => {\n const items = useMemo<GalleryItem[]>(\n () =>\n attachment.items.reduce<GalleryItem[]>((acc, attachment) => {\n const item = toGalleryItemDescriptors(attachment);\n if (item) acc.push(item);\n return acc;\n }, []),\n [attachment.items],\n );\n return (\n <AttachmentWithinContainer attachment={attachment} componentType='gallery'>\n <ModalGallery items={items} key='gallery' />\n </AttachmentWithinContainer>\n );\n};\n\nexport const ImageContainer = (props: RenderAttachmentProps) => {\n const { attachment, Image = DefaultImage } = props;\n const componentType = 'image';\n const imageElement = useRef<HTMLImageElement>(null);\n const { imageAttachmentSizeHandler } = useChannelStateContext();\n const [attachmentConfiguration, setAttachmentConfiguration] = useState<\n ImageAttachmentConfiguration | undefined\n >(undefined);\n\n useLayoutEffect(() => {\n if (imageElement.current && imageAttachmentSizeHandler) {\n const config = imageAttachmentSizeHandler(attachment, imageElement.current);\n setAttachmentConfiguration(config);\n }\n }, [imageElement, imageAttachmentSizeHandler, attachment]);\n\n const imgUrlFromAttachment = attachment.image_url || attachment.thumb_url || '';\n\n const imageConfig: GalleryItem = {\n ...toGalleryItemDescriptors({\n ...attachment,\n image_url: attachmentConfiguration?.url || imgUrlFromAttachment,\n }),\n ref: imageElement,\n style: getCssDimensionsVariables(imgUrlFromAttachment),\n };\n\n if (attachment.actions && attachment.actions.length) {\n return (\n <AttachmentWithinContainer attachment={attachment} componentType={componentType}>\n <div className='str-chat__attachment'>\n <Image {...imageConfig} />\n <AttachmentActionsContainer {...props} />\n </div>\n </AttachmentWithinContainer>\n );\n }\n\n return (\n <AttachmentWithinContainer attachment={attachment} componentType={componentType}>\n <Image {...imageConfig} />\n </AttachmentWithinContainer>\n );\n};\n\nexport const OtherFilesContainer = ({\n attachment,\n File = DefaultFile,\n}: RenderAttachmentProps) => {\n if (!attachment.asset_url) return null;\n\n return (\n <AttachmentWithinContainer attachment={attachment} componentType='file'>\n <File attachment={attachment} />\n </AttachmentWithinContainer>\n );\n};\n\nexport const AudioContainer = ({\n attachment,\n Audio = DefaultAudioAttachment,\n}: RenderAttachmentProps) => (\n <AttachmentWithinContainer attachment={attachment} componentType='audio'>\n <div className='str-chat__attachment'>\n <Audio attachment={attachment} />\n </div>\n </AttachmentWithinContainer>\n);\n\nexport const VoiceRecordingContainer = ({\n attachment,\n isQuoted,\n VoiceRecording = DefaultVoiceRecording,\n}: RenderAttachmentProps) => (\n <AttachmentWithinContainer attachment={attachment} componentType='voiceRecording'>\n <div className='str-chat__attachment'>\n <VoiceRecording attachment={attachment} isQuoted={isQuoted} />\n </div>\n </AttachmentWithinContainer>\n);\n\nexport const VideoContainer = (\n props: Omit<AttachmentProps, 'attachments'> & { attachment: VideoAttachmentType },\n) => {\n const { attachment, Media } = props;\n const componentType = 'media';\n\n return attachment.actions?.length ? (\n <AttachmentWithinContainer attachment={attachment} componentType={componentType}>\n <div className='str-chat__attachment'>\n <VideoAttachment attachment={attachment} VideoPlayer={Media} />\n <AttachmentActionsContainer {...props} />\n </div>\n </AttachmentWithinContainer>\n ) : (\n <AttachmentWithinContainer attachment={attachment} componentType={componentType}>\n <VideoAttachment attachment={attachment} VideoPlayer={Media} />\n </AttachmentWithinContainer>\n );\n};\n\nexport const GeolocationContainer = ({\n Geolocation = DefaultGeolocation,\n location,\n}: GeolocationContainerProps) => (\n <AttachmentWithinContainer attachment={location} componentType='geolocation'>\n <Geolocation location={location} />\n </AttachmentWithinContainer>\n);\n\nexport const UnsupportedAttachmentContainer = ({\n attachment,\n UnsupportedAttachment = DefaultUnsupportedAttachment,\n}: RenderAttachmentProps) => (\n <>\n <UnsupportedAttachment attachment={attachment} />\n </>\n);\n","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","import { LiveLocationManager } from 'stream-chat';\nimport { useEffect, useMemo } from 'react';\nimport type { LiveLocationManagerConstructorParameters, StreamChat } from 'stream-chat';\n\nconst isMobile = () => /Mobi/i.test(navigator.userAgent);\n/**\n * Checks whether the current browser is Safari.\n */\nexport const isSafari = () => {\n if (typeof navigator === 'undefined') return false;\n return /^((?!chrome|android).)*safari/i.test(navigator.userAgent || '');\n};\n\n/**\n * Checks whether the current browser is Firefox.\n */\nexport const isFirefox = () => {\n if (typeof navigator === 'undefined') return false;\n return navigator.userAgent?.includes('Firefox');\n};\n\n/**\n * Checks whether the current browser is Google Chrome.\n */\nexport const isChrome = () => {\n if (typeof navigator === 'undefined') return false;\n return navigator.userAgent?.includes('Chrome');\n};\n\nconst browser = () => {\n if (isChrome()) return 'chrome';\n if (isFirefox()) return 'firefox';\n if (isSafari()) return 'safari';\n return 'other';\n};\n\nexport const useLiveLocationSharingManager = ({\n client,\n getDeviceId,\n watchLocation,\n}: Omit<LiveLocationManagerConstructorParameters, 'client' | 'getDeviceId'> & {\n client?: StreamChat | null;\n getDeviceId?: () => string;\n}) => {\n const manager = useMemo(() => {\n if (!client) return null;\n\n return new LiveLocationManager({\n client,\n getDeviceId:\n getDeviceId ??\n (() => `web-${isMobile() ? 'mobile' : 'desktop'}-${browser()}-${client.userID}`),\n watchLocation,\n });\n }, [client, getDeviceId, watchLocation]);\n\n useEffect(() => {\n if (!manager) return;\n\n manager.init();\n\n return () => {\n manager.unregisterSubscriptions();\n };\n }, [manager]);\n\n return manager;\n};\n","import { useEffect, useState } from 'react';\nimport type { ChannelState } from 'stream-chat';\n\nimport { useChannelStateContext } from '../../../context/ChannelStateContext';\nimport { useChatContext } from '../../../context/ChatContext';\nimport { useTranslationContext } from '../../../context/TranslationContext';\n\n/**\n * Returns the channel header online status text (e.g. \"Online\", \"Offline\", or \"X members, Y online\").\n * Returns null when the channel has no members (nothing to show).\n */\nexport function useChannelHeaderOnlineStatus(): string | null {\n const { t } = useTranslationContext();\n const { client } = useChatContext();\n const { channel, watcherCount = 0 } = useChannelStateContext();\n const { member_count: memberCount = 0 } = channel?.data || {};\n\n // todo: we need reactive state for watchers in LLC\n const [watchers, setWatchers] = useState<ChannelState['watchers']>(() =>\n Object.assign({}, channel?.state?.watchers ?? {}),\n );\n\n useEffect(() => {\n if (!channel) return;\n const subscription = channel.on('user.watching.start', (event) => {\n setWatchers((prev) => {\n if (!event.user?.id) return prev;\n if (prev[event.user.id]) return prev;\n return Object.assign({ [event.user.id]: event.user }, prev);\n });\n });\n return () => subscription.unsubscribe();\n }, [channel]);\n\n if (!memberCount) return null;\n\n const isDmChannel =\n memberCount === 1 ||\n (memberCount === 2 &&\n Object.values(channel?.state?.members ?? {}).some(\n ({ user }) => user?.id === client.user?.id,\n ));\n\n if (isDmChannel) {\n const hasWatchers = Object.keys(watchers).length > 0;\n return hasWatchers ? t('Online') : t('Offline');\n }\n\n return `${t('{{ memberCount }} members', { memberCount })}, ${t('{{ watcherCount }} online', { watcherCount })}`;\n}\n","import React from 'react';\n\nimport { IconLayoutAlignLeft } from '../Icons/icons';\nimport { type ChannelAvatarProps, ChannelAvatar as DefaultAvatar } from '../Avatar';\nimport { TypingIndicatorHeader } from '../TypingIndicator/TypingIndicatorHeader';\nimport { useChannelHeaderOnlineStatus } from './hooks/useChannelHeaderOnlineStatus';\nimport { useChannelPreviewInfo } from '../ChannelListItem/hooks/useChannelPreviewInfo';\nimport { useChannelStateContext } from '../../context/ChannelStateContext';\nimport { useChatContext } from '../../context/ChatContext';\nimport { useTypingContext } from '../../context/TypingContext';\nimport clsx from 'clsx';\nimport { ToggleSidebarButton } from '../Button/ToggleSidebarButton';\n\nconst ChannelHeaderSubtitle = () => {\n const { channelConfig } = useChannelStateContext('ChannelHeaderSubtitle');\n const { client } = useChatContext('ChannelHeaderSubtitle');\n const { typing = {} } = useTypingContext('ChannelHeaderSubtitle');\n const onlineStatusText = useChannelHeaderOnlineStatus();\n const typingInChannel = Object.values(typing).filter(\n ({ parent_id, user }) => user?.id !== client.user?.id && !parent_id,\n );\n const hasTyping = channelConfig?.typing_events !== false && typingInChannel.length > 0;\n\n if (!hasTyping && !onlineStatusText) return null;\n\n return (\n <div className='str-chat__channel-header__data__subtitle'>\n <span\n className='str-chat__subtitle-content-transition'\n key={hasTyping ? 'typing' : 'default'}\n >\n {hasTyping ? <TypingIndicatorHeader /> : onlineStatusText}\n </span>\n </div>\n );\n};\n\nexport type ChannelHeaderProps = {\n /** UI component to display an avatar, defaults to [Avatar](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Avatar/Avatar.tsx) component and accepts the same props as: [ChannelAvatar](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Avatar/ChannelAvatar.tsx) */\n Avatar?: React.ComponentType<ChannelAvatarProps>;\n /** Manually set the image to render, defaults to the Channel image */\n image?: string;\n /** UI component to display menu icon, defaults to IconLayoutAlignLeft*/\n MenuIcon?: React.ComponentType;\n /** Set title manually */\n title?: string;\n};\n\n/**\n * The ChannelHeader component renders some basic information about a Channel.\n */\nexport const ChannelHeader = (props: ChannelHeaderProps) => {\n const {\n Avatar = DefaultAvatar,\n image: overrideImage,\n MenuIcon = IconLayoutAlignLeft,\n title: overrideTitle,\n } = props;\n\n const { channel } = useChannelStateContext();\n const { navOpen } = useChatContext();\n const { displayImage, displayTitle, groupChannelDisplayInfo } = useChannelPreviewInfo({\n channel,\n overrideImage,\n overrideTitle,\n });\n\n return (\n <div\n className={clsx('str-chat__channel-header', {\n 'str-chat__channel-header--sidebar-collapsed': !navOpen,\n })}\n >\n <ToggleSidebarButton mode='expand'>\n <MenuIcon />\n </ToggleSidebarButton>\n <div className='str-chat__channel-header__data'>\n <div className='str-chat__channel-header__data__title'>{displayTitle}</div>\n <ChannelHeaderSubtitle />\n </div>\n <Avatar\n className='str-chat__avatar--channel-header'\n displayMembers={groupChannelDisplayInfo?.members}\n imageUrl={displayImage}\n overflowCount={groupChannelDisplayInfo?.overflowCount}\n size='lg'\n userName={displayTitle}\n />\n </div>\n );\n};\n","import type { PropsWithChildren } from 'react';\nimport React from 'react';\nimport clsx from 'clsx';\n\nimport type { LocalMessage } from 'stream-chat';\nimport { useChannelStateContext } from '../../context/ChannelStateContext';\n\nexport type WindowProps = {\n /** optional prop to force addition of class str-chat__main-panel---with-thread-opn to the Window root element */\n thread?: LocalMessage;\n};\n\nconst UnMemoizedWindow = (props: PropsWithChildren<WindowProps>) => {\n const { children, thread: propThread } = props;\n\n const { thread: contextThread } = useChannelStateContext('Window');\n\n return (\n <div\n className={clsx('str-chat__main-panel', {\n 'str-chat__main-panel--thread-open': contextThread || propThread,\n })}\n >\n {children}\n </div>\n );\n};\n\n/**\n * A UI component for conditionally displaying a Thread or Channel\n */\nexport const Window = React.memo(UnMemoizedWindow) as typeof UnMemoizedWindow;\n"],"names":["useState","useEffect","StateStore","nanoid","useCallback","useStateStore","useLayoutEffect","createPortal","jsx","dialogId","useContext","useMemo","createContext","useMessageComposerController","isMessageBounced","useChannelActionContext","ComponentContext","useTranslationContext","useChannelStateContext","sanitizeUrl","useChatContext","selector","notifications","isNotificationForPanel","jsxs","BaseIcon","Button","IconPause","IconPlaySolid","module","this","e","n","t","o","u","a","r","i","d","s","h","c","f","m","topic","require$$0","_","defaultTranslatorFunction","predefinedFormatters","LocalizedFormat","calendar","TranslationTopic","IconLoadingCircle","useRef","isNetworkSendFailure","validateAndGetMessage","isUserMuted","defaultPinPermissions","useThreadContext","message","text","forwardRef","Header","Fragment","usePopoverPosition","focus","FocusScope","useComponentContext","IconCrossMedium","IconPeople","IconExclamation","Avatar","DefaultAvatar","IconChevronRight","ContextMenuRoot","menuClassName","IconChevronLeft","Item","IconArrowLeft","MessageBouncePrompt","IconExclamationCircle","IconCircleBanSign","isMessageErrorRetryable","ACTIONS_NOT_WORKING_IN_THREAD","useNotificationTarget","formatMessage","addNotificationTargetTag","IconArrowRightUp","AvatarStack","DefaultAvatarStack","IconPin","mapToUserNameOrId","IconClock","IconCheckmark1Small","IconDoubleCheckmark1Small","getReadByTooltipText","transform","findAndReplace","visit","visitor","SKIP","Component","defaultUrlTransform","find","remarkPlugins","renderText","defaultRenderText","messageHasAttachments","messageTextHasEmojisOnly","isDate","getDateString","Timestamp","DefaultTimestamp","IconTranslate","stateSelector","attachmentManagerStateSelector","pollComposerStateSelector","locationComposerStateSelector","MessageComposer","attachmentManagerConfigStateSelector","UploadButton","useHandleFileChangeWrapper","UploadFileInput","useMessageComposerContext","useIsCooldownActive","dataTransferItemsToFiles","RecordingPermission","logError","renderAudio","toAudioBuffer","createFileFromBlobs","getExtensionFromMimeType","MediaRecordingState","RecordingAttachmentType","getRecordedMediaTypeFromMimeType","recording","editingAuditStateStateSelector","IconCrossSmall","IconImages1Alt","BaseImage","DefaultImagePlaceholder","isGiphyAttachment","isScrapedContent","isLocalVideoAttachment","isVideoAttachment","isLocalImageAttachment","isImageAttachment","FileArchiveIcon","FileCodeIcon","FileExcelIcon","FilePdfIcon","FilePowerPointIcon","FileWordIcon","FileAudioIcon","FileVideoIcon","fileIconSet.FileFallbackIcon","isAudioAttachment","isVoiceRecordingAttachment","isFileAttachment","IconChart5","IconMapPin","IconFileBend","IconChainLink","IconVideo","IconVideoSolid","IconMicrophone","AttachmentIcon","PreviewImage","renderedText","IconBookmark","IconBellNotification","IconChevronDown","duration","pollStateSelector","NumericInput","IconPlusSmall","TextInput","IconCheckmark2","isVoteAnswer","paginationStateSelector","votes","mousewheelListener","DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD","IconTrophy","AddCommentPrompt","DefaultAddCommentPrompt","EndPollAlert","DefaultEndPollAlert","PollAnswerList","DefaultPollAnswerList","PollResults","DefaultPollResults","DefaultSuggestPollOptionForm","PollOptionsFullList","DefaultPollOptionsFullList","PollOptionSelector","DefaultPollOptionSelector","PollActions","DefaultPollActions","PollHeader","DefaultPollHeader","PollContent","DefaultPollContent","IconDotGrid2x3","IconCircleMinus","IconPaperPlane","VotingVisibility","IconPeopleRemove","IconFlag2","IconMute","IconPeopleAdd","IconVolumeFull","createElement","IconPlusLarge","AttachmentSelectorButton","IconRunShortcut","IconPaperclip","PollCreationDialog","DefaultPollCreationDialog","ShareLocationDialog","DefaultLocationDialog","CHANNEL_CONTAINER_ID","IconExclamationTriangle","linkify","audioPlayerStateSelector","useAudioPlayer","DefaultBaseImage","LoadingIndicator","IconArrowRotateClockwise","MessageTimestamp","DefaultMessageTimestamp","IconArrowDownCircle","GalleryUI","DefaultGalleryUI","AudioAttachmentPreview","DefaultFileAttachmentPreview","FileAttachmentPreview","UnsupportedAttachmentPreview","DefaultUnknownAttachmentPreview","isLocalVoiceRecordingAttachment","isLocalAudioAttachment","isLocalFileAttachment","isLocalAttachment","IconThunder","linkPreviewsManagerStateSelector","LinkPreviewsManager","IconTrashBin","RecordingPermissionDeniedNotification","DefaultRecordingPermissionDeniedNotification","StartRecordingAudioButton","isRecording","textComposerStateSelector","searchSourceStateSelector","DefaultSuggestionListItem","messageComposerStateSelector","DefaultSuggestionList","useDropzone","rootClassName","IconFileArrowLeftIn","CooldownTimer","DefaultCooldownTimer","SendButton","StopAIGenerationButton","DefaultStopAIGenerationButton","DefaultSendButton","AttachmentPreviewList","DefaultAttachmentPreviewList","EditedMessagePreview","DefaultEditedMessagePreview","LinkPreviewList","DefaultLinkPreviewList","QuotedMessagePreview","DefaultQuotedMessagePreview","VoiceRecordingPreviewSlot","DefaultVoiceRecordingPreviewSlot","AdditionalMessageComposerActions","DefaultAdditionalMessageComposerActions","AttachmentSelector","DefaultAttachmentSelector","AudioRecorder","DefaultAudioRecorder","CommandChip","DefaultCommandChip","SendToChannelCheckbox","DefaultSendToChannelCheckbox","TextareaComposer","DefaultTextareaComposer","MessageComposerContextProvider","MessageComposerUI","DefaultMessageComposerUI","useTypingContext","defaultDateTimeParser","isLanguageSupported","isMobile","threadStateSelector","IconLayoutAlignLeft","useChatViewContext","ThreadStart","DefaultThreadStart","MESSAGE_ACTIONS","ThreadHead","DefaultThreadHead","ThreadHeader","DefaultThreadHeader","LegacyThreadContext","ReactionSelector","DefaultReactionSelector","IconBubbleText6ChatMessage","IconCloseQuote2","IconUnpin","IconSquareBehindSquare2_Copy","IconEditBig","IconBubbleWideNotificationChatMessage","IconBellOff","IconBookmarkRemove","IconPeopleAdded","IconEmojiSmile","IconArrowShareLeft","reactions","MessageReactionsDetail","DefaultMessageReactionsDetail","IconDotGrid1x3Horizontal","Attachment","DefaultAttachment","MessageActions","DefaultMessageActions","MessageAlsoSentInChannelIndicator","DefaultMessageAlsoSentInChannelIndicator","MessageBlocked","DefaultMessageBlocked","DefaultMessageBouncePrompt","MessageDeletedBubble","DefaultMessageDeletedBubble","MessageEditedIndicator","DefaultMessageEditedIndicator","MessageReactions","DefaultMessageReactions","MessageRepliesCountButton","DefaultMessageRepliesCountButton","MessageStatus","DefaultMessageStatus","MessageTranslationIndicator","DefaultMessageTranslationIndicator","PinIndicator","DefaultPinIndicator","QuotedMessage","DefaultQuotedMessage","ReminderNotification","DefaultReminderNotification","StreamedMessageText","DefaultStreamedMessageText","isDateSeparatorMessage","isMessageBlocked","messageHasSingleAttachment","messageHasGiphyAttachment","messageHasReactions","isMessageEdited","countEmojis","areMessageUIPropsEqual","DefaultMessageUI","getMessageActions","areMessagePropsEqual","processMessages","insertIntro","getGroupStyles","getLastReceived","observedTarget","IconArrowUp","isIntroMessage","isLocalMessage","DateSeparator","DefaultDateSeparator","DefaultMessageSystem","UnreadMessagesSeparator","DefaultUnreadMessagesSeparator","getIsFirstUnreadMessage","IconArrowDown","DEFAULT_NEXT_CHANNEL_PAGE_SIZE","DefaultEmptyStateIndicator","DefaultLoadingIndicator","MessageListMainPanel","DefaultMessageListMainPanel","NewMessageNotification","DefaultNewMessageNotification","NotificationList","DefaultNotificationList","TypingIndicator","DefaultTypingIndicator","UnreadMessagesNotification","DefaultUnreadMessagesNotification","GiphyPreviewMessage","DefaultGiphyPreviewMessage","computeItemKey","numItemsPrepended","processedMessages","Virtuoso","searchControllerStateSelector","error","channel","getChannel","IconMagnifyingGlassSearch","IconCircleX","useChannelListContext","DEFAULT_JUMP_TO_PAGE_SIZE","getLatestMessagePreview","SearchSourceResultsLoadingIndicator","DefaultSearchSourceResultsLoadingIndicator","SearchSourceResultListFooter","DefaultSearchSourceResultListFooter","SearchSourceResultList","DefaultSearchSourceResultList","SearchSourceResultsEmpty","DefaultSearchSourceResultsEmpty","SearchSourceResultsHeader","DefaultSearchSourceResultsHeader","SearchResultsHeader","DefaultSearchResultsHeader","SearchResultsPresearch","DefaultSearchResultsPresearch","SearchSourceResults","DefaultSourceSearchResults","SearchBar","DefaultSearchBar","SearchResults","DefaultSearchResults","LoadMoreButton","DefaultLoadMoreButton","ChannelListUI","DefaultChannelListUI","Search","DefaultSearch","channels","setChannels","ChannelListContextProvider","useSyncExternalStore","keys","IconArchive","IconArrowBoxLeft","match","P","IconExclamationCircle1","IconCamera1","DefaultChannelAvatar","ChannelListItemActionButtons","DefaultChannelListItemActionButtons","MessageDeliveryStatus","defaultGetLatestMessagePreview","ChannelListItemUI","DefaultChannelListItemUI","SearchController","ChannelSearchSource","UserSearchSource","MessageSearchSource","ChatProvider","TranslationProvider","StreamChat","useThreadsViewContext","ThreadListItemUI","DefaultThreadListItemUI","IconBubbles","IconArrowRotateRightLeftRepeatRefresh","ThreadListEmptyPlaceholder","DefaultThreadListEmptyPlaceholder","ThreadListItem","DefaultThreadListItem","ThreadListLoadingIndicator","DefaultThreadListLoadingIndicator","ThreadListUnseenThreadsBanner","DefaultThreadListUnseenThreadsBanner","NotificationComponent","Gallery","DefaultGallery","ModalGallery","DefaultModalGallery","IconEyeOpen","VideoPlayer","DefaultVideoPlayer","isSharedLocationResponse","AttachmentActions","DefaultAttachmentActions","Card","DefaultCard","Giphy","DefaultGiphy","attachment","Image","DefaultImage","File","DefaultFile","Audio","DefaultAudioAttachment","VoiceRecording","DefaultVoiceRecording","Geolocation","DefaultGeolocation","UnsupportedAttachment","DefaultUnsupportedAttachment","LiveLocationManager"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","x_google_ignoreList":[22,23,24,25,26,27,32,33,34,35,36,37,38,39,40,41,42,43]}
|