stream-chat-react-native-core 10.0.0-rc.2 → 10.0.0-rc.3
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/lib/commonjs/ai-components/README.md +50 -2
- package/lib/commonjs/ai-components/index.js +24 -0
- package/lib/commonjs/ai-components/index.js.map +1 -1
- package/lib/commonjs/ai-components/message-composer/ComposerView.js +4 -2
- package/lib/commonjs/ai-components/message-composer/ComposerView.js.map +1 -1
- package/lib/commonjs/ai-components/message-composer/SpeechToTextButton.js +4 -1
- package/lib/commonjs/ai-components/message-composer/SpeechToTextButton.js.map +1 -1
- package/lib/commonjs/ai-components/native/AIDictation.js +6 -0
- package/lib/commonjs/ai-components/native/AIDictation.js.map +1 -1
- package/lib/commonjs/ai-components/store/dictation/store.js +4 -2
- package/lib/commonjs/ai-components/store/dictation/store.js.map +1 -1
- package/lib/commonjs/ai-components/store/dictation/useDictationState.js +4 -2
- package/lib/commonjs/ai-components/store/dictation/useDictationState.js.map +1 -1
- package/lib/commonjs/ai-components/store/index.js +22 -0
- package/lib/commonjs/ai-components/store/index.js.map +1 -1
- package/lib/commonjs/ai-components/theme.js +3 -0
- package/lib/commonjs/ai-components/theme.js.map +1 -1
- package/lib/commonjs/ai-components/transcription/useDictation.js +7 -3
- package/lib/commonjs/ai-components/transcription/useDictation.js.map +1 -1
- package/lib/commonjs/ai-components/transcription/useDictationAudioLevel.js +32 -0
- package/lib/commonjs/ai-components/transcription/useDictationAudioLevel.js.map +1 -0
- package/lib/commonjs/ai-components/voice-visualization/VoiceGlow.js +79 -0
- package/lib/commonjs/ai-components/voice-visualization/VoiceGlow.js.map +1 -0
- package/lib/commonjs/ai-components/voice-visualization/VoiceVisualizationView.js +147 -0
- package/lib/commonjs/ai-components/voice-visualization/VoiceVisualizationView.js.map +1 -0
- package/lib/commonjs/ai-components/voice-visualization/VoiceWave.js +58 -0
- package/lib/commonjs/ai-components/voice-visualization/VoiceWave.js.map +1 -0
- package/lib/commonjs/ai-components/voice-visualization/bounce.js +60 -0
- package/lib/commonjs/ai-components/voice-visualization/bounce.js.map +1 -0
- package/lib/commonjs/ai-components/voice-visualization/driver.js +208 -0
- package/lib/commonjs/ai-components/voice-visualization/driver.js.map +1 -0
- package/lib/commonjs/ai-components/voice-visualization/glowShader.js +218 -0
- package/lib/commonjs/ai-components/voice-visualization/glowShader.js.map +1 -0
- package/lib/commonjs/ai-components/voice-visualization/index.js +18 -0
- package/lib/commonjs/ai-components/voice-visualization/index.js.map +1 -0
- package/lib/commonjs/ai-components/voice-visualization/math.js +70 -0
- package/lib/commonjs/ai-components/voice-visualization/math.js.map +1 -0
- package/lib/commonjs/ai-components/voice-visualization/palette.js +47 -0
- package/lib/commonjs/ai-components/voice-visualization/palette.js.map +1 -0
- package/lib/commonjs/ai-components/voice-visualization/simplex.js +77 -0
- package/lib/commonjs/ai-components/voice-visualization/simplex.js.map +1 -0
- package/lib/commonjs/ai-components/voice-visualization/styles.js +33 -0
- package/lib/commonjs/ai-components/voice-visualization/styles.js.map +1 -0
- package/lib/commonjs/ai-components/voice-visualization/types.js +4 -0
- package/lib/commonjs/ai-components/voice-visualization/types.js.map +1 -0
- package/lib/commonjs/ai-components/voice-visualization/useReduceMotion.js +28 -0
- package/lib/commonjs/ai-components/voice-visualization/useReduceMotion.js.map +1 -0
- package/lib/commonjs/ai-components/voice-visualization/useVoiceVisualization.js +129 -0
- package/lib/commonjs/ai-components/voice-visualization/useVoiceVisualization.js.map +1 -0
- package/lib/commonjs/ai-components/voice-visualization/waveGeometry.js +124 -0
- package/lib/commonjs/ai-components/voice-visualization/waveGeometry.js.map +1 -0
- package/lib/commonjs/components/Channel/hooks/useChannelLifecycle.js +2 -1
- package/lib/commonjs/components/Channel/hooks/useChannelLifecycle.js.map +1 -1
- package/lib/commonjs/components/ChannelDetails/components/members/ChannelMemberItem.js +1 -1
- package/lib/commonjs/components/ChannelDetails/components/members/ChannelMemberItem.js.map +1 -1
- package/lib/commonjs/components/ChannelDetails/hooks/useChannelDetailsMemberStatusText.js +1 -1
- package/lib/commonjs/components/ChannelDetails/hooks/useChannelDetailsMemberStatusText.js.map +1 -1
- package/lib/commonjs/components/ChannelList/ChannelListView.js +0 -2
- package/lib/commonjs/components/ChannelList/ChannelListView.js.map +1 -1
- package/lib/commonjs/components/ChannelList/hooks/usePaginatedChannels.js +1 -1
- package/lib/commonjs/components/ChannelList/hooks/usePaginatedChannels.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/ChannelDetailsBottomSheet.js +1 -1
- package/lib/commonjs/components/ChannelPreview/ChannelDetailsBottomSheet.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/ChannelLastMessagePreview.js +1 -0
- package/lib/commonjs/components/ChannelPreview/ChannelLastMessagePreview.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js +2 -0
- package/lib/commonjs/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/ChannelPreviewTitle.js +1 -0
- package/lib/commonjs/components/ChannelPreview/ChannelPreviewTitle.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/ChannelPreviewView.js +1 -1
- package/lib/commonjs/components/ChannelPreview/ChannelPreviewView.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/hooks/useChannelPreviewData.js +5 -5
- package/lib/commonjs/components/ChannelPreview/hooks/useChannelPreviewData.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/hooks/useChannelPreviewDisplayName.js +1 -1
- package/lib/commonjs/components/ChannelPreview/hooks/useChannelPreviewDisplayName.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/hooks/useChannelPreviewDisplayPresence.js +1 -1
- package/lib/commonjs/components/ChannelPreview/hooks/useChannelPreviewDisplayPresence.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/hooks/useChannelPreviewPollLabel.js +4 -1
- package/lib/commonjs/components/ChannelPreview/hooks/useChannelPreviewPollLabel.js.map +1 -1
- package/lib/commonjs/components/Chat/hooks/useConnectionLifecycle.js +6 -2
- package/lib/commonjs/components/Chat/hooks/useConnectionLifecycle.js.map +1 -1
- package/lib/commonjs/components/Indicators/LoadingErrorIndicator.js +5 -0
- package/lib/commonjs/components/Indicators/LoadingErrorIndicator.js.map +1 -1
- package/lib/commonjs/components/Message/Message.js +1 -1
- package/lib/commonjs/components/Message/Message.js.map +1 -1
- package/lib/commonjs/components/Message/MessageItemView/MessageStatus.js +4 -0
- package/lib/commonjs/components/Message/MessageItemView/MessageStatus.js.map +1 -1
- package/lib/commonjs/components/Message/MessageItemView/MessageWrapper.js +7 -4
- package/lib/commonjs/components/Message/MessageItemView/MessageWrapper.js.map +1 -1
- package/lib/commonjs/components/Message/hooks/useCreateMessageActionHandlers.js +3 -3
- package/lib/commonjs/components/Message/hooks/useCreateMessageActionHandlers.js.map +1 -1
- package/lib/commonjs/components/Message/hooks/useProcessReactions.js +2 -2
- package/lib/commonjs/components/Message/hooks/useProcessReactions.js.map +1 -1
- package/lib/commonjs/components/Message/hooks/useUserMuteActive.js +1 -1
- package/lib/commonjs/components/Message/hooks/useUserMuteActive.js.map +1 -1
- package/lib/commonjs/components/MessageInput/MessageComposer.js +2 -1
- package/lib/commonjs/components/MessageInput/MessageComposer.js.map +1 -1
- package/lib/commonjs/components/MessageList/MessageFlashList.js +2 -2
- package/lib/commonjs/components/MessageList/MessageFlashList.js.map +1 -1
- package/lib/commonjs/components/MessageList/MessageList.js +2 -2
- package/lib/commonjs/components/MessageList/MessageList.js.map +1 -1
- package/lib/commonjs/components/MessageList/hooks/useOwnUnreadCount.js +1 -1
- package/lib/commonjs/components/MessageList/hooks/useOwnUnreadCount.js.map +1 -1
- package/lib/commonjs/components/MessageMenu/MessageUserReactionsItem.js +1 -1
- package/lib/commonjs/components/MessageMenu/MessageUserReactionsItem.js.map +1 -1
- package/lib/commonjs/components/MessageMenu/hooks/useMessageOwnReactions.js +2 -2
- package/lib/commonjs/components/MessageMenu/hooks/useMessageOwnReactions.js.map +1 -1
- package/lib/commonjs/components/Poll/components/PollAnswersList.js +1 -1
- package/lib/commonjs/components/Poll/components/PollAnswersList.js.map +1 -1
- package/lib/commonjs/components/Poll/components/PollButtons.js +1 -1
- package/lib/commonjs/components/Poll/components/PollButtons.js.map +1 -1
- package/lib/commonjs/components/Poll/hook/useIsPollCreatedByCurrentUser.js +1 -1
- package/lib/commonjs/components/Poll/hook/useIsPollCreatedByCurrentUser.js.map +1 -1
- package/lib/commonjs/components/Thread/Thread.js +1 -1
- package/lib/commonjs/components/Thread/Thread.js.map +1 -1
- package/lib/commonjs/components/ThreadList/ThreadListItem.js +1 -1
- package/lib/commonjs/components/ThreadList/ThreadListItem.js.map +1 -1
- package/lib/commonjs/components/ThreadList/ThreadListUnreadBanner.js +9 -2
- package/lib/commonjs/components/ThreadList/ThreadListUnreadBanner.js.map +1 -1
- package/lib/commonjs/components/index.js +24 -0
- package/lib/commonjs/components/index.js.map +1 -1
- package/lib/commonjs/contexts/componentsContext/defaultComponents.js +0 -2
- package/lib/commonjs/contexts/componentsContext/defaultComponents.js.map +1 -1
- package/lib/commonjs/contexts/liveLocationManagerContext/LiveLocationManagerContext.js +1 -1
- package/lib/commonjs/contexts/liveLocationManagerContext/LiveLocationManagerContext.js.map +1 -1
- package/lib/commonjs/hooks/actions/useChannelActionItems.js +1 -1
- package/lib/commonjs/hooks/actions/useChannelActionItems.js.map +1 -1
- package/lib/commonjs/hooks/actions/useChannelActions.js +2 -2
- package/lib/commonjs/hooks/actions/useChannelActions.js.map +1 -1
- package/lib/commonjs/hooks/actions/useChannelMemberActionItems.js +1 -1
- package/lib/commonjs/hooks/actions/useChannelMemberActionItems.js.map +1 -1
- package/lib/commonjs/hooks/index.js +11 -0
- package/lib/commonjs/hooks/index.js.map +1 -1
- package/lib/commonjs/hooks/messagePreview/useMessageDeliveryStatus.js +6 -6
- package/lib/commonjs/hooks/messagePreview/useMessageDeliveryStatus.js.map +1 -1
- package/lib/commonjs/hooks/useIsDirectChat.js +1 -1
- package/lib/commonjs/hooks/useIsDirectChat.js.map +1 -1
- package/lib/commonjs/i18n/runtimeDefaults.js +1 -0
- package/lib/commonjs/i18n/runtimeDefaults.js.map +1 -1
- package/lib/commonjs/store/apis/getChannelMessages.js +5 -3
- package/lib/commonjs/store/apis/getChannelMessages.js.map +1 -1
- package/lib/commonjs/store/apis/getChannels.js +6 -3
- package/lib/commonjs/store/apis/getChannels.js.map +1 -1
- package/lib/commonjs/store/apis/getChannelsForFilterSort.js +2 -1
- package/lib/commonjs/store/apis/getChannelsForFilterSort.js.map +1 -1
- package/lib/commonjs/store/apis/queries/selectMessagesForChannels.js +7 -5
- package/lib/commonjs/store/apis/queries/selectMessagesForChannels.js.map +1 -1
- package/lib/commonjs/utils/installNativeMultipartAdapter.js.map +1 -1
- package/lib/commonjs/version.json +1 -1
- package/lib/module/ai-components/README.md +50 -2
- package/lib/module/ai-components/index.js +24 -0
- package/lib/module/ai-components/index.js.map +1 -1
- package/lib/module/ai-components/message-composer/ComposerView.js +4 -2
- package/lib/module/ai-components/message-composer/ComposerView.js.map +1 -1
- package/lib/module/ai-components/message-composer/SpeechToTextButton.js +4 -1
- package/lib/module/ai-components/message-composer/SpeechToTextButton.js.map +1 -1
- package/lib/module/ai-components/native/AIDictation.js +6 -0
- package/lib/module/ai-components/native/AIDictation.js.map +1 -1
- package/lib/module/ai-components/store/dictation/store.js +4 -2
- package/lib/module/ai-components/store/dictation/store.js.map +1 -1
- package/lib/module/ai-components/store/dictation/useDictationState.js +4 -2
- package/lib/module/ai-components/store/dictation/useDictationState.js.map +1 -1
- package/lib/module/ai-components/store/index.js +22 -0
- package/lib/module/ai-components/store/index.js.map +1 -1
- package/lib/module/ai-components/theme.js +3 -0
- package/lib/module/ai-components/theme.js.map +1 -1
- package/lib/module/ai-components/transcription/useDictation.js +7 -3
- package/lib/module/ai-components/transcription/useDictation.js.map +1 -1
- package/lib/module/ai-components/transcription/useDictationAudioLevel.js +32 -0
- package/lib/module/ai-components/transcription/useDictationAudioLevel.js.map +1 -0
- package/lib/module/ai-components/voice-visualization/VoiceGlow.js +79 -0
- package/lib/module/ai-components/voice-visualization/VoiceGlow.js.map +1 -0
- package/lib/module/ai-components/voice-visualization/VoiceVisualizationView.js +147 -0
- package/lib/module/ai-components/voice-visualization/VoiceVisualizationView.js.map +1 -0
- package/lib/module/ai-components/voice-visualization/VoiceWave.js +58 -0
- package/lib/module/ai-components/voice-visualization/VoiceWave.js.map +1 -0
- package/lib/module/ai-components/voice-visualization/bounce.js +60 -0
- package/lib/module/ai-components/voice-visualization/bounce.js.map +1 -0
- package/lib/module/ai-components/voice-visualization/driver.js +208 -0
- package/lib/module/ai-components/voice-visualization/driver.js.map +1 -0
- package/lib/module/ai-components/voice-visualization/glowShader.js +218 -0
- package/lib/module/ai-components/voice-visualization/glowShader.js.map +1 -0
- package/lib/module/ai-components/voice-visualization/index.js +18 -0
- package/lib/module/ai-components/voice-visualization/index.js.map +1 -0
- package/lib/module/ai-components/voice-visualization/math.js +70 -0
- package/lib/module/ai-components/voice-visualization/math.js.map +1 -0
- package/lib/module/ai-components/voice-visualization/palette.js +47 -0
- package/lib/module/ai-components/voice-visualization/palette.js.map +1 -0
- package/lib/module/ai-components/voice-visualization/simplex.js +77 -0
- package/lib/module/ai-components/voice-visualization/simplex.js.map +1 -0
- package/lib/module/ai-components/voice-visualization/styles.js +33 -0
- package/lib/module/ai-components/voice-visualization/styles.js.map +1 -0
- package/lib/module/ai-components/voice-visualization/types.js +4 -0
- package/lib/module/ai-components/voice-visualization/types.js.map +1 -0
- package/lib/module/ai-components/voice-visualization/useReduceMotion.js +28 -0
- package/lib/module/ai-components/voice-visualization/useReduceMotion.js.map +1 -0
- package/lib/module/ai-components/voice-visualization/useVoiceVisualization.js +129 -0
- package/lib/module/ai-components/voice-visualization/useVoiceVisualization.js.map +1 -0
- package/lib/module/ai-components/voice-visualization/waveGeometry.js +124 -0
- package/lib/module/ai-components/voice-visualization/waveGeometry.js.map +1 -0
- package/lib/module/components/Channel/hooks/useChannelLifecycle.js +2 -1
- package/lib/module/components/Channel/hooks/useChannelLifecycle.js.map +1 -1
- package/lib/module/components/ChannelDetails/components/members/ChannelMemberItem.js +1 -1
- package/lib/module/components/ChannelDetails/components/members/ChannelMemberItem.js.map +1 -1
- package/lib/module/components/ChannelDetails/hooks/useChannelDetailsMemberStatusText.js +1 -1
- package/lib/module/components/ChannelDetails/hooks/useChannelDetailsMemberStatusText.js.map +1 -1
- package/lib/module/components/ChannelList/ChannelListView.js +0 -2
- package/lib/module/components/ChannelList/ChannelListView.js.map +1 -1
- package/lib/module/components/ChannelList/hooks/usePaginatedChannels.js +1 -1
- package/lib/module/components/ChannelList/hooks/usePaginatedChannels.js.map +1 -1
- package/lib/module/components/ChannelPreview/ChannelDetailsBottomSheet.js +1 -1
- package/lib/module/components/ChannelPreview/ChannelDetailsBottomSheet.js.map +1 -1
- package/lib/module/components/ChannelPreview/ChannelLastMessagePreview.js +1 -0
- package/lib/module/components/ChannelPreview/ChannelLastMessagePreview.js.map +1 -1
- package/lib/module/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js +2 -0
- package/lib/module/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js.map +1 -1
- package/lib/module/components/ChannelPreview/ChannelPreviewTitle.js +1 -0
- package/lib/module/components/ChannelPreview/ChannelPreviewTitle.js.map +1 -1
- package/lib/module/components/ChannelPreview/ChannelPreviewView.js +1 -1
- package/lib/module/components/ChannelPreview/ChannelPreviewView.js.map +1 -1
- package/lib/module/components/ChannelPreview/hooks/useChannelPreviewData.js +5 -5
- package/lib/module/components/ChannelPreview/hooks/useChannelPreviewData.js.map +1 -1
- package/lib/module/components/ChannelPreview/hooks/useChannelPreviewDisplayName.js +1 -1
- package/lib/module/components/ChannelPreview/hooks/useChannelPreviewDisplayName.js.map +1 -1
- package/lib/module/components/ChannelPreview/hooks/useChannelPreviewDisplayPresence.js +1 -1
- package/lib/module/components/ChannelPreview/hooks/useChannelPreviewDisplayPresence.js.map +1 -1
- package/lib/module/components/ChannelPreview/hooks/useChannelPreviewPollLabel.js +4 -1
- package/lib/module/components/ChannelPreview/hooks/useChannelPreviewPollLabel.js.map +1 -1
- package/lib/module/components/Chat/hooks/useConnectionLifecycle.js +6 -2
- package/lib/module/components/Chat/hooks/useConnectionLifecycle.js.map +1 -1
- package/lib/module/components/Indicators/LoadingErrorIndicator.js +5 -0
- package/lib/module/components/Indicators/LoadingErrorIndicator.js.map +1 -1
- package/lib/module/components/Message/Message.js +1 -1
- package/lib/module/components/Message/Message.js.map +1 -1
- package/lib/module/components/Message/MessageItemView/MessageStatus.js +4 -0
- package/lib/module/components/Message/MessageItemView/MessageStatus.js.map +1 -1
- package/lib/module/components/Message/MessageItemView/MessageWrapper.js +7 -4
- package/lib/module/components/Message/MessageItemView/MessageWrapper.js.map +1 -1
- package/lib/module/components/Message/hooks/useCreateMessageActionHandlers.js +3 -3
- package/lib/module/components/Message/hooks/useCreateMessageActionHandlers.js.map +1 -1
- package/lib/module/components/Message/hooks/useProcessReactions.js +2 -2
- package/lib/module/components/Message/hooks/useProcessReactions.js.map +1 -1
- package/lib/module/components/Message/hooks/useUserMuteActive.js +1 -1
- package/lib/module/components/Message/hooks/useUserMuteActive.js.map +1 -1
- package/lib/module/components/MessageInput/MessageComposer.js +2 -1
- package/lib/module/components/MessageInput/MessageComposer.js.map +1 -1
- package/lib/module/components/MessageList/MessageFlashList.js +2 -2
- package/lib/module/components/MessageList/MessageFlashList.js.map +1 -1
- package/lib/module/components/MessageList/MessageList.js +2 -2
- package/lib/module/components/MessageList/MessageList.js.map +1 -1
- package/lib/module/components/MessageList/hooks/useOwnUnreadCount.js +1 -1
- package/lib/module/components/MessageList/hooks/useOwnUnreadCount.js.map +1 -1
- package/lib/module/components/MessageMenu/MessageUserReactionsItem.js +1 -1
- package/lib/module/components/MessageMenu/MessageUserReactionsItem.js.map +1 -1
- package/lib/module/components/MessageMenu/hooks/useMessageOwnReactions.js +2 -2
- package/lib/module/components/MessageMenu/hooks/useMessageOwnReactions.js.map +1 -1
- package/lib/module/components/Poll/components/PollAnswersList.js +1 -1
- package/lib/module/components/Poll/components/PollAnswersList.js.map +1 -1
- package/lib/module/components/Poll/components/PollButtons.js +1 -1
- package/lib/module/components/Poll/components/PollButtons.js.map +1 -1
- package/lib/module/components/Poll/hook/useIsPollCreatedByCurrentUser.js +1 -1
- package/lib/module/components/Poll/hook/useIsPollCreatedByCurrentUser.js.map +1 -1
- package/lib/module/components/Thread/Thread.js +1 -1
- package/lib/module/components/Thread/Thread.js.map +1 -1
- package/lib/module/components/ThreadList/ThreadListItem.js +1 -1
- package/lib/module/components/ThreadList/ThreadListItem.js.map +1 -1
- package/lib/module/components/ThreadList/ThreadListUnreadBanner.js +9 -2
- package/lib/module/components/ThreadList/ThreadListUnreadBanner.js.map +1 -1
- package/lib/module/components/index.js +24 -0
- package/lib/module/components/index.js.map +1 -1
- package/lib/module/contexts/componentsContext/defaultComponents.js +0 -2
- package/lib/module/contexts/componentsContext/defaultComponents.js.map +1 -1
- package/lib/module/contexts/liveLocationManagerContext/LiveLocationManagerContext.js +1 -1
- package/lib/module/contexts/liveLocationManagerContext/LiveLocationManagerContext.js.map +1 -1
- package/lib/module/hooks/actions/useChannelActionItems.js +1 -1
- package/lib/module/hooks/actions/useChannelActionItems.js.map +1 -1
- package/lib/module/hooks/actions/useChannelActions.js +2 -2
- package/lib/module/hooks/actions/useChannelActions.js.map +1 -1
- package/lib/module/hooks/actions/useChannelMemberActionItems.js +1 -1
- package/lib/module/hooks/actions/useChannelMemberActionItems.js.map +1 -1
- package/lib/module/hooks/index.js +11 -0
- package/lib/module/hooks/index.js.map +1 -1
- package/lib/module/hooks/messagePreview/useMessageDeliveryStatus.js +6 -6
- package/lib/module/hooks/messagePreview/useMessageDeliveryStatus.js.map +1 -1
- package/lib/module/hooks/useIsDirectChat.js +1 -1
- package/lib/module/hooks/useIsDirectChat.js.map +1 -1
- package/lib/module/i18n/runtimeDefaults.js +1 -0
- package/lib/module/i18n/runtimeDefaults.js.map +1 -1
- package/lib/module/store/apis/getChannelMessages.js +5 -3
- package/lib/module/store/apis/getChannelMessages.js.map +1 -1
- package/lib/module/store/apis/getChannels.js +6 -3
- package/lib/module/store/apis/getChannels.js.map +1 -1
- package/lib/module/store/apis/getChannelsForFilterSort.js +2 -1
- package/lib/module/store/apis/getChannelsForFilterSort.js.map +1 -1
- package/lib/module/store/apis/queries/selectMessagesForChannels.js +7 -5
- package/lib/module/store/apis/queries/selectMessagesForChannels.js.map +1 -1
- package/lib/module/utils/installNativeMultipartAdapter.js.map +1 -1
- package/lib/module/version.json +1 -1
- package/lib/typescript/ai-components/index.d.ts +3 -1
- package/lib/typescript/ai-components/index.d.ts.map +1 -1
- package/lib/typescript/ai-components/message-composer/ComposerView.d.ts.map +1 -1
- package/lib/typescript/ai-components/native/AIDictation.d.ts +6 -0
- package/lib/typescript/ai-components/native/AIDictation.d.ts.map +1 -1
- package/lib/typescript/ai-components/store/dictation/store.d.ts +7 -0
- package/lib/typescript/ai-components/store/dictation/store.d.ts.map +1 -1
- package/lib/typescript/ai-components/store/dictation/useDictationState.d.ts +1 -0
- package/lib/typescript/ai-components/store/dictation/useDictationState.d.ts.map +1 -1
- package/lib/typescript/ai-components/store/index.d.ts +2 -0
- package/lib/typescript/ai-components/store/index.d.ts.map +1 -1
- package/lib/typescript/ai-components/theme.d.ts +13 -0
- package/lib/typescript/ai-components/theme.d.ts.map +1 -1
- package/lib/typescript/ai-components/transcription/useDictation.d.ts +9 -1
- package/lib/typescript/ai-components/transcription/useDictation.d.ts.map +1 -1
- package/lib/typescript/ai-components/transcription/useDictationAudioLevel.d.ts +11 -0
- package/lib/typescript/ai-components/transcription/useDictationAudioLevel.d.ts.map +1 -0
- package/lib/typescript/ai-components/voice-visualization/VoiceGlow.d.ts +13 -0
- package/lib/typescript/ai-components/voice-visualization/VoiceGlow.d.ts.map +1 -0
- package/lib/typescript/ai-components/voice-visualization/VoiceVisualizationView.d.ts +26 -0
- package/lib/typescript/ai-components/voice-visualization/VoiceVisualizationView.d.ts.map +1 -0
- package/lib/typescript/ai-components/voice-visualization/VoiceWave.d.ts +13 -0
- package/lib/typescript/ai-components/voice-visualization/VoiceWave.d.ts.map +1 -0
- package/lib/typescript/ai-components/voice-visualization/bounce.d.ts +20 -0
- package/lib/typescript/ai-components/voice-visualization/bounce.d.ts.map +1 -0
- package/lib/typescript/ai-components/voice-visualization/driver.d.ts +96 -0
- package/lib/typescript/ai-components/voice-visualization/driver.d.ts.map +1 -0
- package/lib/typescript/ai-components/voice-visualization/glowShader.d.ts +7 -0
- package/lib/typescript/ai-components/voice-visualization/glowShader.d.ts.map +1 -0
- package/lib/typescript/ai-components/voice-visualization/index.d.ts +4 -0
- package/lib/typescript/ai-components/voice-visualization/index.d.ts.map +1 -0
- package/lib/typescript/ai-components/voice-visualization/math.d.ts +26 -0
- package/lib/typescript/ai-components/voice-visualization/math.d.ts.map +1 -0
- package/lib/typescript/ai-components/voice-visualization/palette.d.ts +18 -0
- package/lib/typescript/ai-components/voice-visualization/palette.d.ts.map +1 -0
- package/lib/typescript/ai-components/voice-visualization/simplex.d.ts +11 -0
- package/lib/typescript/ai-components/voice-visualization/simplex.d.ts.map +1 -0
- package/lib/typescript/ai-components/voice-visualization/styles.d.ts +24 -0
- package/lib/typescript/ai-components/voice-visualization/styles.d.ts.map +1 -0
- package/lib/typescript/ai-components/voice-visualization/types.d.ts +45 -0
- package/lib/typescript/ai-components/voice-visualization/types.d.ts.map +1 -0
- package/lib/typescript/ai-components/voice-visualization/useReduceMotion.d.ts +10 -0
- package/lib/typescript/ai-components/voice-visualization/useReduceMotion.d.ts.map +1 -0
- package/lib/typescript/ai-components/voice-visualization/useVoiceVisualization.d.ts +18 -0
- package/lib/typescript/ai-components/voice-visualization/useVoiceVisualization.d.ts.map +1 -0
- package/lib/typescript/ai-components/voice-visualization/waveGeometry.d.ts +25 -0
- package/lib/typescript/ai-components/voice-visualization/waveGeometry.d.ts.map +1 -0
- package/lib/typescript/components/Channel/hooks/useChannelLifecycle.d.ts.map +1 -1
- package/lib/typescript/components/ChannelList/ChannelListView.d.ts +1 -1
- package/lib/typescript/components/ChannelList/ChannelListView.d.ts.map +1 -1
- package/lib/typescript/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.d.ts.map +1 -1
- package/lib/typescript/components/ChannelPreview/hooks/useChannelPreviewData.d.ts.map +1 -1
- package/lib/typescript/components/Chat/hooks/useConnectionLifecycle.d.ts +5 -4
- package/lib/typescript/components/Chat/hooks/useConnectionLifecycle.d.ts.map +1 -1
- package/lib/typescript/components/Indicators/LoadingErrorIndicator.d.ts +1 -1
- package/lib/typescript/components/Indicators/LoadingErrorIndicator.d.ts.map +1 -1
- package/lib/typescript/components/Message/MessageItemView/MessageStatus.d.ts.map +1 -1
- package/lib/typescript/components/Message/MessageItemView/MessageWrapper.d.ts.map +1 -1
- package/lib/typescript/components/MessageInput/MessageComposer.d.ts.map +1 -1
- package/lib/typescript/components/ThreadList/ThreadListUnreadBanner.d.ts.map +1 -1
- package/lib/typescript/components/index.d.ts +2 -0
- package/lib/typescript/components/index.d.ts.map +1 -1
- package/lib/typescript/contexts/componentsContext/defaultComponents.d.ts +0 -1
- package/lib/typescript/contexts/componentsContext/defaultComponents.d.ts.map +1 -1
- package/lib/typescript/hooks/index.d.ts +1 -0
- package/lib/typescript/hooks/index.d.ts.map +1 -1
- package/lib/typescript/hooks/messagePreview/useMessageDeliveryStatus.d.ts +3 -0
- package/lib/typescript/hooks/messagePreview/useMessageDeliveryStatus.d.ts.map +1 -1
- package/lib/typescript/i18n/keys.d.ts +3 -1
- package/lib/typescript/i18n/keys.d.ts.map +1 -1
- package/lib/typescript/i18n/runtimeDefaults.d.ts +1 -0
- package/lib/typescript/i18n/runtimeDefaults.d.ts.map +1 -1
- package/lib/typescript/store/apis/getChannelMessages.d.ts +2 -1
- package/lib/typescript/store/apis/getChannelMessages.d.ts.map +1 -1
- package/lib/typescript/store/apis/getChannels.d.ts +3 -1
- package/lib/typescript/store/apis/getChannels.d.ts.map +1 -1
- package/lib/typescript/store/apis/getChannelsForFilterSort.d.ts.map +1 -1
- package/lib/typescript/store/apis/queries/selectMessagesForChannels.d.ts +3 -1
- package/lib/typescript/store/apis/queries/selectMessagesForChannels.d.ts.map +1 -1
- package/lib/typescript/utils/installNativeMultipartAdapter.d.ts +5 -3
- package/lib/typescript/utils/installNativeMultipartAdapter.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/__tests__/offline-support/offline-feature.tsx +7 -7
- package/src/__tests__/offline-support/optimistic-update.tsx +5 -5
- package/src/ai-components/README.md +50 -2
- package/src/ai-components/__tests__/VoiceVisualization.test.tsx +208 -0
- package/src/ai-components/__tests__/dictation.test.tsx +58 -1
- package/src/ai-components/__tests__/voiceDriver.test.ts +317 -0
- package/src/ai-components/__tests__/voicePalette.test.ts +124 -0
- package/src/ai-components/index.ts +3 -1
- package/src/ai-components/message-composer/ComposerView.tsx +6 -3
- package/src/ai-components/message-composer/SpeechToTextButton.tsx +5 -2
- package/src/ai-components/native/AIDictation.ts +11 -0
- package/src/ai-components/store/dictation/store.ts +9 -0
- package/src/ai-components/store/dictation/useDictationState.ts +2 -1
- package/src/ai-components/store/index.ts +2 -0
- package/src/ai-components/theme.ts +16 -0
- package/src/ai-components/transcription/useDictation.ts +16 -3
- package/src/ai-components/transcription/useDictationAudioLevel.ts +38 -0
- package/src/ai-components/voice-visualization/VoiceGlow.tsx +79 -0
- package/src/ai-components/voice-visualization/VoiceVisualizationView.tsx +179 -0
- package/src/ai-components/voice-visualization/VoiceWave.tsx +67 -0
- package/src/ai-components/voice-visualization/bounce.ts +61 -0
- package/src/ai-components/voice-visualization/driver.ts +240 -0
- package/src/ai-components/voice-visualization/glowShader.ts +227 -0
- package/src/ai-components/voice-visualization/index.ts +3 -0
- package/src/ai-components/voice-visualization/math.ts +73 -0
- package/src/ai-components/voice-visualization/palette.ts +59 -0
- package/src/ai-components/voice-visualization/simplex.ts +92 -0
- package/src/ai-components/voice-visualization/styles.ts +42 -0
- package/src/ai-components/voice-visualization/types.ts +44 -0
- package/src/ai-components/voice-visualization/useReduceMotion.ts +34 -0
- package/src/ai-components/voice-visualization/useVoiceVisualization.ts +153 -0
- package/src/ai-components/voice-visualization/waveGeometry.ts +137 -0
- package/src/components/Channel/__tests__/Channel.test.tsx +44 -5
- package/src/components/Channel/hooks/useChannelLifecycle.ts +4 -1
- package/src/components/ChannelDetails/__tests__/ChannelDetails.test.tsx +1 -1
- package/src/components/ChannelDetails/__tests__/ChannelDetailsActionsSection.test.tsx +1 -1
- package/src/components/ChannelDetails/__tests__/ChannelDetailsEditButton.test.tsx +1 -1
- package/src/components/ChannelDetails/__tests__/ChannelDetailsMemberSection.test.tsx +1 -1
- package/src/components/ChannelDetails/__tests__/ChannelDetailsNavHeader.test.tsx +1 -1
- package/src/components/ChannelDetails/__tests__/ChannelDetailsProfile.test.tsx +2 -2
- package/src/components/ChannelDetails/__tests__/ChannelEditDetailsForm.test.tsx +1 -1
- package/src/components/ChannelDetails/__tests__/ChannelEditDetailsFormContent.test.tsx +2 -2
- package/src/components/ChannelDetails/__tests__/ChannelEditName.test.tsx +1 -1
- package/src/components/ChannelDetails/__tests__/members/ChannelAddMembersForm.test.tsx +1 -1
- package/src/components/ChannelDetails/__tests__/members/ChannelMemberActionsSheet.test.tsx +2 -2
- package/src/components/ChannelDetails/__tests__/members/ChannelMemberItem.test.tsx +1 -1
- package/src/components/ChannelDetails/__tests__/useChannelDetailsMemberStatusText.test.tsx +1 -1
- package/src/components/ChannelDetails/components/members/ChannelMemberItem.tsx +1 -1
- package/src/components/ChannelDetails/hooks/useChannelDetailsMemberStatusText.ts +1 -1
- package/src/components/ChannelList/ChannelListView.tsx +1 -3
- package/src/components/ChannelList/__tests__/ChannelList.test.tsx +44 -0
- package/src/components/ChannelList/hooks/usePaginatedChannels.ts +1 -1
- package/src/components/ChannelPreview/ChannelDetailsBottomSheet.tsx +1 -1
- package/src/components/ChannelPreview/ChannelLastMessagePreview.tsx +1 -1
- package/src/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.tsx +8 -2
- package/src/components/ChannelPreview/ChannelPreviewTitle.tsx +1 -1
- package/src/components/ChannelPreview/ChannelPreviewView.tsx +1 -1
- package/src/components/ChannelPreview/__tests__/ChannelPreview.test.tsx +4 -4
- package/src/components/ChannelPreview/__tests__/ChannelPreviewView.test.tsx +40 -0
- package/src/components/ChannelPreview/hooks/__tests__/useChannelPreviewData.test.tsx +51 -0
- package/src/components/ChannelPreview/hooks/__tests__/useChannelPreviewDisplayName.test.tsx +1 -1
- package/src/components/ChannelPreview/hooks/__tests__/useChannelPreviewDisplayPresence.test.tsx +1 -1
- package/src/components/ChannelPreview/hooks/__tests__/useChannelPreviewPollLabel.test.tsx +87 -0
- package/src/components/ChannelPreview/hooks/useChannelPreviewData.ts +3 -4
- package/src/components/ChannelPreview/hooks/useChannelPreviewDisplayName.ts +1 -1
- package/src/components/ChannelPreview/hooks/useChannelPreviewDisplayPresence.ts +1 -1
- package/src/components/ChannelPreview/hooks/useChannelPreviewPollLabel.ts +1 -1
- package/src/components/Chat/__tests__/Chat.test.tsx +31 -1
- package/src/components/Chat/hooks/useConnectionLifecycle.ts +12 -6
- package/src/components/Indicators/LoadingErrorIndicator.tsx +8 -1
- package/src/components/Message/Message.tsx +1 -1
- package/src/components/Message/MessageItemView/MessageStatus.tsx +16 -2
- package/src/components/Message/MessageItemView/MessageWrapper.tsx +14 -4
- package/src/components/Message/MessageItemView/__tests__/MessageStatus.test.tsx +21 -0
- package/src/components/Message/hooks/__tests__/useCreateMessageActionHandlers.test.tsx +1 -1
- package/src/components/Message/hooks/__tests__/useUserMuteActive.test.tsx +1 -1
- package/src/components/Message/hooks/useCreateMessageActionHandlers.ts +3 -3
- package/src/components/Message/hooks/useProcessReactions.ts +2 -2
- package/src/components/Message/hooks/useUserMuteActive.ts +1 -1
- package/src/components/MessageInput/MessageComposer.tsx +4 -2
- package/src/components/MessageList/MessageFlashList.tsx +2 -2
- package/src/components/MessageList/MessageList.tsx +2 -2
- package/src/components/MessageList/__tests__/MessageList.test.tsx +26 -8
- package/src/components/MessageList/__tests__/ScrollToBottomButton.test.tsx +3 -3
- package/src/components/MessageList/hooks/useOwnUnreadCount.ts +1 -1
- package/src/components/MessageMenu/MessageUserReactionsItem.tsx +1 -1
- package/src/components/MessageMenu/hooks/useMessageOwnReactions.ts +2 -2
- package/src/components/Poll/components/PollAnswersList.tsx +1 -1
- package/src/components/Poll/components/PollButtons.tsx +1 -1
- package/src/components/Poll/hook/useIsPollCreatedByCurrentUser.ts +1 -1
- package/src/components/Thread/Thread.tsx +1 -1
- package/src/components/Thread/__tests__/Thread.test.tsx +4 -2
- package/src/components/ThreadList/ThreadListItem.tsx +1 -1
- package/src/components/ThreadList/ThreadListUnreadBanner.tsx +6 -2
- package/src/components/ThreadList/__tests__/ThreadList.test.tsx +21 -0
- package/src/components/index.ts +2 -0
- package/src/contexts/componentsContext/defaultComponents.ts +0 -2
- package/src/contexts/liveLocationManagerContext/LiveLocationManagerContext.tsx +1 -1
- package/src/hooks/__tests__/useChannelMuteActive.test.tsx +1 -1
- package/src/hooks/__tests__/useIsDirectChat.test.tsx +1 -1
- package/src/hooks/actions/__tests__/useChannelActionItems.test.tsx +1 -1
- package/src/hooks/actions/__tests__/useChannelActions.test.tsx +1 -1
- package/src/hooks/actions/__tests__/useChannelMemberActionItems.test.tsx +6 -6
- package/src/hooks/actions/useChannelActionItems.tsx +1 -1
- package/src/hooks/actions/useChannelActions.ts +2 -2
- package/src/hooks/actions/useChannelMemberActionItems.tsx +1 -1
- package/src/hooks/index.ts +1 -0
- package/src/hooks/messagePreview/__tests__/useMessageDeliveryStatus.test.tsx +57 -32
- package/src/hooks/messagePreview/useMessageDeliveryStatus.ts +13 -7
- package/src/hooks/useIsDirectChat.ts +1 -1
- package/src/i18n/__tests__/catalog.fixture.json +2 -0
- package/src/i18n/keys.ts +3 -0
- package/src/i18n/runtimeDefaults.ts +1 -0
- package/src/store/__tests__/selectMessagesForChannels.test.ts +34 -12
- package/src/store/apis/getChannelMessages.ts +4 -1
- package/src/store/apis/getChannels.ts +5 -1
- package/src/store/apis/getChannelsForFilterSort.ts +1 -0
- package/src/store/apis/queries/selectMessagesForChannels.ts +7 -2
- package/src/utils/installNativeMultipartAdapter.ts +5 -3
- package/src/version.json +1 -1
|
@@ -45,7 +45,7 @@ export const ChannelDetailsHeader = ({ channel }: ChannelDetailsHeaderProps) =>
|
|
|
45
45
|
const isOtherMemberOnline = useMemo(
|
|
46
46
|
() =>
|
|
47
47
|
Object.values(members).some(
|
|
48
|
-
(member) => member.user?.id !== client.
|
|
48
|
+
(member) => member.user?.id !== client.userId && member.user?.online,
|
|
49
49
|
),
|
|
50
50
|
[client, members],
|
|
51
51
|
);
|
|
@@ -29,7 +29,7 @@ export const ChannelLastMessagePreview = ({ message }: ChannelLastMessagePreview
|
|
|
29
29
|
width={16}
|
|
30
30
|
/>
|
|
31
31
|
) : null}
|
|
32
|
-
<Text numberOfLines={1} style={[styles.subtitle]}>
|
|
32
|
+
<Text numberOfLines={1} style={[styles.subtitle]} testID='channel-preview-message'>
|
|
33
33
|
{messagePreviewTitle}
|
|
34
34
|
</Text>
|
|
35
35
|
</View>
|
|
@@ -96,7 +96,11 @@ export const ChannelMessagePreviewDeliveryStatus = ({
|
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
if (!isLastMessageByCurrentUser) {
|
|
99
|
-
return
|
|
99
|
+
return (
|
|
100
|
+
<Text style={styles.username} testID='channel-preview-sender'>
|
|
101
|
+
{message?.user?.name || message?.user?.id}:
|
|
102
|
+
</Text>
|
|
103
|
+
);
|
|
100
104
|
}
|
|
101
105
|
|
|
102
106
|
return (
|
|
@@ -122,7 +126,9 @@ export const ChannelMessagePreviewDeliveryStatus = ({
|
|
|
122
126
|
) : status === MessageDeliveryStatus.SENT ? (
|
|
123
127
|
<icons.Check stroke={semantics.chatTextTimestamp} height={16} width={16} {...checkIcon} />
|
|
124
128
|
) : null}
|
|
125
|
-
<Text style={styles.text}
|
|
129
|
+
<Text style={styles.text} testID='channel-preview-sender'>
|
|
130
|
+
{t('common.you.label', 'You')}:
|
|
131
|
+
</Text>
|
|
126
132
|
</View>
|
|
127
133
|
</CompositeAccessibilityProbe>
|
|
128
134
|
);
|
|
@@ -19,7 +19,7 @@ export const ChannelPreviewTitle = ({ channel, title }: ChannelPreviewTitleProps
|
|
|
19
19
|
const displayName = useChannelPreviewDisplayName(channel);
|
|
20
20
|
|
|
21
21
|
return (
|
|
22
|
-
<Text numberOfLines={1} style={styles.title}>
|
|
22
|
+
<Text numberOfLines={1} style={styles.title} testID='channel-preview-title'>
|
|
23
23
|
{title ?? displayName}
|
|
24
24
|
</Text>
|
|
25
25
|
);
|
|
@@ -77,7 +77,7 @@ const ChannelPreviewViewWithContext = (props: ChannelPreviewViewPropsWithContext
|
|
|
77
77
|
} = useTheme();
|
|
78
78
|
const styles = useStyles();
|
|
79
79
|
const swipeRegistry = useSwipeRegistryContext();
|
|
80
|
-
const accessibilityHint = useA11yLabel('
|
|
80
|
+
const accessibilityHint = useA11yLabel('channelPreview.doubleTapToOpen.accessibilityLabel');
|
|
81
81
|
|
|
82
82
|
const onPress = useStableCallback(() => {
|
|
83
83
|
if (swipeRegistry?.hasOpen()) {
|
|
@@ -145,7 +145,7 @@ describe('ChannelPreview', () => {
|
|
|
145
145
|
describe('notification.mark_read event', () => {
|
|
146
146
|
it("should not update the unread count if the event's cid does not match the channel's cid", async () => {
|
|
147
147
|
channel = await initChannelFromData(chatClient);
|
|
148
|
-
seedUnread(channel, chatClient.
|
|
148
|
+
seedUnread(channel, chatClient.userId as string, 10);
|
|
149
149
|
|
|
150
150
|
const { getByTestId } = render(<TestComponent />);
|
|
151
151
|
|
|
@@ -167,7 +167,7 @@ describe('ChannelPreview', () => {
|
|
|
167
167
|
|
|
168
168
|
it('should update the unread count to 0', async () => {
|
|
169
169
|
channel = await initChannelFromData(chatClient);
|
|
170
|
-
seedUnread(channel, chatClient.
|
|
170
|
+
seedUnread(channel, chatClient.userId as string, 10);
|
|
171
171
|
|
|
172
172
|
const { getByTestId } = render(<TestComponent />);
|
|
173
173
|
|
|
@@ -327,7 +327,7 @@ describe('ChannelPreview', () => {
|
|
|
327
327
|
muteStatus: { createdAt: null, expiresAt: null, muted: true },
|
|
328
328
|
});
|
|
329
329
|
});
|
|
330
|
-
seedUnread(channel, chatClient.
|
|
330
|
+
seedUnread(channel, chatClient.userId as string, 5);
|
|
331
331
|
|
|
332
332
|
const { getByTestId } = render(<TestComponent />);
|
|
333
333
|
|
|
@@ -360,7 +360,7 @@ describe('ChannelPreview', () => {
|
|
|
360
360
|
it('should update the unread count on "message.new" event', async () => {
|
|
361
361
|
const someOtherUser = generateUser({ id: 'not-me' });
|
|
362
362
|
channel = await initChannelFromData(chatClient);
|
|
363
|
-
seedUnread(channel, chatClient.
|
|
363
|
+
seedUnread(channel, chatClient.userId as string, 0);
|
|
364
364
|
|
|
365
365
|
const { getByTestId } = render(<TestComponent />);
|
|
366
366
|
|
|
@@ -4,6 +4,8 @@ import { fireEvent, render, screen, waitFor } from '@testing-library/react-nativ
|
|
|
4
4
|
import truncate from 'lodash/truncate';
|
|
5
5
|
import type { Channel as ChannelType, StreamChat } from 'stream-chat';
|
|
6
6
|
|
|
7
|
+
import { OverlayProvider } from '../../../contexts/overlayContext/OverlayProvider';
|
|
8
|
+
import type { TranslationDictionary } from '../../../i18n/types';
|
|
7
9
|
import { getOrCreateChannelApi } from '../../../mock-builders/api/getOrCreateChannel';
|
|
8
10
|
import { useMockedApis } from '../../../mock-builders/api/useMockedApis';
|
|
9
11
|
import { generateChannelResponse } from '../../../mock-builders/generator/channel';
|
|
@@ -11,6 +13,7 @@ import { generateMember } from '../../../mock-builders/generator/member';
|
|
|
11
13
|
import { generateMessage } from '../../../mock-builders/generator/message';
|
|
12
14
|
import { generateUser } from '../../../mock-builders/generator/user';
|
|
13
15
|
import { getTestClientWithUser } from '../../../mock-builders/mock';
|
|
16
|
+
import { Streami18n } from '../../../utils/i18n/Streami18n';
|
|
14
17
|
import { Chat } from '../../Chat/Chat';
|
|
15
18
|
import { ChannelPreviewView } from '../ChannelPreviewView';
|
|
16
19
|
|
|
@@ -56,6 +59,43 @@ describe('ChannelPreviewView', () => {
|
|
|
56
59
|
});
|
|
57
60
|
});
|
|
58
61
|
|
|
62
|
+
it("takes its accessibility hint from its own key, not the gallery's", async () => {
|
|
63
|
+
await initializeChannel(generateChannelResponse());
|
|
64
|
+
const i18nInstance = new Streami18n({ logger: () => {} });
|
|
65
|
+
i18nInstance.registerTranslation('en', {
|
|
66
|
+
'attachment.gallery.doubleTapToOpen.accessibilityLabel': 'Double tap to view the photo',
|
|
67
|
+
} as TranslationDictionary);
|
|
68
|
+
|
|
69
|
+
const { rerender } = render(
|
|
70
|
+
<OverlayProvider accessibility={{ enabled: true }}>
|
|
71
|
+
<Chat client={chatClient} i18nInstance={i18nInstance}>
|
|
72
|
+
<ChannelPreviewView channel={channel as ChannelType} onSelect={jest.fn()} />
|
|
73
|
+
</Chat>
|
|
74
|
+
</OverlayProvider>,
|
|
75
|
+
);
|
|
76
|
+
await waitFor(() =>
|
|
77
|
+
expect(screen.getByTestId('channel-preview-button').props.accessibilityHint).toBe(
|
|
78
|
+
'Double tap to open',
|
|
79
|
+
),
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
i18nInstance.registerTranslation('en', {
|
|
83
|
+
'channelPreview.doubleTapToOpen.accessibilityLabel': 'Double tap to open the channel',
|
|
84
|
+
} as TranslationDictionary);
|
|
85
|
+
rerender(
|
|
86
|
+
<OverlayProvider accessibility={{ enabled: true }}>
|
|
87
|
+
<Chat client={chatClient} i18nInstance={i18nInstance}>
|
|
88
|
+
<ChannelPreviewView channel={channel as ChannelType} onSelect={jest.fn()} />
|
|
89
|
+
</Chat>
|
|
90
|
+
</OverlayProvider>,
|
|
91
|
+
);
|
|
92
|
+
await waitFor(() =>
|
|
93
|
+
expect(screen.getByTestId('channel-preview-button').props.accessibilityHint).toBe(
|
|
94
|
+
'Double tap to open the channel',
|
|
95
|
+
),
|
|
96
|
+
);
|
|
97
|
+
});
|
|
98
|
+
|
|
59
99
|
it('should render name of channel', async () => {
|
|
60
100
|
const channelName = Date.now().toString();
|
|
61
101
|
await initializeChannel(
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { StateStore } from '@stream-io/state-store';
|
|
2
|
+
import { act, renderHook } from '@testing-library/react-native';
|
|
3
|
+
import { Channel, ChannelMemberResponse, StreamChat } from 'stream-chat';
|
|
4
|
+
|
|
5
|
+
import { convertDateToTimestamp } from '../../../../mock-builders/generator/time';
|
|
6
|
+
import { useChannelPreviewData } from '../useChannelPreviewData';
|
|
7
|
+
|
|
8
|
+
describe('useChannelPreviewData', () => {
|
|
9
|
+
const buildMockChannel = (membership: Record<string, unknown>) =>
|
|
10
|
+
({
|
|
11
|
+
messageComposer: { registerDraftEventSubscriptions: () => () => undefined },
|
|
12
|
+
messagePaginator: { aggregateState: new StateStore({ latestMessage: null }) },
|
|
13
|
+
state: new StateStore({ membership, muteStatus: { muted: false }, read: {} }),
|
|
14
|
+
}) as unknown as Channel;
|
|
15
|
+
const client = { userId: 'me' } as unknown as StreamChat;
|
|
16
|
+
|
|
17
|
+
it('does not re-render when re-hydration replaces membership with an equal copy', () => {
|
|
18
|
+
const channel = buildMockChannel({ pinned_at: null, user_id: 'me' });
|
|
19
|
+
let renders = 0;
|
|
20
|
+
const { result } = renderHook(() => {
|
|
21
|
+
renders++;
|
|
22
|
+
return useChannelPreviewData(channel, client);
|
|
23
|
+
});
|
|
24
|
+
const rendersBefore = renders;
|
|
25
|
+
|
|
26
|
+
act(() => {
|
|
27
|
+
channel.state.partialNext({
|
|
28
|
+
membership: { pinned_at: null, user_id: 'me' } as unknown as ChannelMemberResponse,
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
expect(renders).toBe(rendersBefore);
|
|
33
|
+
expect(result.current.pinned).toBe(false);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('updates when the channel is pinned', () => {
|
|
37
|
+
const channel = buildMockChannel({ pinned_at: null, user_id: 'me' });
|
|
38
|
+
const { result } = renderHook(() => useChannelPreviewData(channel, client));
|
|
39
|
+
|
|
40
|
+
act(() => {
|
|
41
|
+
channel.state.partialNext({
|
|
42
|
+
membership: {
|
|
43
|
+
pinned_at: convertDateToTimestamp('2026-06-15T08:00:00.000Z'),
|
|
44
|
+
user_id: 'me',
|
|
45
|
+
} as unknown as ChannelMemberResponse,
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
expect(result.current.pinned).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
@@ -24,7 +24,7 @@ describe('useChannelPreviewDisplayName', () => {
|
|
|
24
24
|
jest
|
|
25
25
|
.spyOn(ChatContext, 'useChatContext')
|
|
26
26
|
.mockImplementation(
|
|
27
|
-
() => ({ client: {
|
|
27
|
+
() => ({ client: { userId: OWN_USER_ID } }) as unknown as ChatContextValue,
|
|
28
28
|
);
|
|
29
29
|
jest.spyOn(useChannelNameModule, 'useChannelName').mockReturnValue(undefined);
|
|
30
30
|
});
|
package/src/components/ChannelPreview/hooks/__tests__/useChannelPreviewDisplayPresence.test.tsx
CHANGED
|
@@ -18,7 +18,7 @@ describe('useChannelPreviewDisplayPresence', () => {
|
|
|
18
18
|
jest.clearAllMocks();
|
|
19
19
|
chatClient = await getTestClientWithUser({
|
|
20
20
|
id: currentUserId,
|
|
21
|
-
|
|
21
|
+
userId: currentUserId,
|
|
22
22
|
} as unknown as Parameters<typeof getTestClientWithUser>[0]);
|
|
23
23
|
|
|
24
24
|
// Create mock channel
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import React, { PropsWithChildren } from 'react';
|
|
2
|
+
|
|
3
|
+
import { act, renderHook } from '@testing-library/react-native';
|
|
4
|
+
import { Poll, PollResponseData, PollVoteResponseData, StreamChat } from 'stream-chat';
|
|
5
|
+
|
|
6
|
+
import { ChatProvider } from '../../../../contexts/chatContext/ChatContext';
|
|
7
|
+
import { useChannelPreviewPollLabel } from '../useChannelPreviewPollLabel';
|
|
8
|
+
|
|
9
|
+
const OWN_USER = { id: 'own-user' };
|
|
10
|
+
const MESSAGE_ID = 'message-id';
|
|
11
|
+
const POLL_ID = 'poll-id';
|
|
12
|
+
|
|
13
|
+
const generateVote = (id: string, optionId: string, createdAt: string) =>
|
|
14
|
+
({
|
|
15
|
+
created_at: new Date(createdAt).getTime(),
|
|
16
|
+
id,
|
|
17
|
+
option_id: optionId,
|
|
18
|
+
poll_id: POLL_ID,
|
|
19
|
+
updated_at: new Date(createdAt).getTime(),
|
|
20
|
+
user: OWN_USER,
|
|
21
|
+
user_id: OWN_USER.id,
|
|
22
|
+
}) as unknown as PollVoteResponseData;
|
|
23
|
+
|
|
24
|
+
const setup = (ownVotes: PollVoteResponseData[]) => {
|
|
25
|
+
const client = {
|
|
26
|
+
deletePollVote: jest.fn(() => new Promise(() => {})),
|
|
27
|
+
user: OWN_USER,
|
|
28
|
+
userID: OWN_USER.id,
|
|
29
|
+
} as unknown as StreamChat;
|
|
30
|
+
const latestVotesByOption: Record<string, PollVoteResponseData[]> = {};
|
|
31
|
+
const voteCountsByOption: Record<string, number> = {};
|
|
32
|
+
ownVotes.forEach((vote) => {
|
|
33
|
+
latestVotesByOption[vote.option_id as string] = [vote];
|
|
34
|
+
voteCountsByOption[vote.option_id as string] = 1;
|
|
35
|
+
});
|
|
36
|
+
const poll = new Poll({
|
|
37
|
+
client,
|
|
38
|
+
poll: {
|
|
39
|
+
enforce_unique_vote: false,
|
|
40
|
+
id: POLL_ID,
|
|
41
|
+
latest_answers: [],
|
|
42
|
+
latest_votes_by_option: latestVotesByOption,
|
|
43
|
+
name: 'Poll',
|
|
44
|
+
options: [
|
|
45
|
+
{ id: 'option-a', text: 'A' },
|
|
46
|
+
{ id: 'option-b', text: 'B' },
|
|
47
|
+
],
|
|
48
|
+
own_votes: ownVotes,
|
|
49
|
+
vote_count: ownVotes.length,
|
|
50
|
+
vote_counts_by_option: voteCountsByOption,
|
|
51
|
+
} as unknown as PollResponseData,
|
|
52
|
+
});
|
|
53
|
+
(client as unknown as { polls: unknown }).polls = { fromState: () => poll };
|
|
54
|
+
|
|
55
|
+
const wrapper = ({ children }: PropsWithChildren) => (
|
|
56
|
+
<ChatProvider value={{ client } as never}>{children}</ChatProvider>
|
|
57
|
+
);
|
|
58
|
+
const hook = renderHook(() => useChannelPreviewPollLabel({ pollId: POLL_ID }), { wrapper });
|
|
59
|
+
return { ...hook, poll };
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
describe('useChannelPreviewPollLabel', () => {
|
|
63
|
+
it('returns no label once the only vote is removed', () => {
|
|
64
|
+
const vote = generateVote('vote-a', 'option-a', '2026-10-27T10:00:00.000Z');
|
|
65
|
+
const { poll, result } = setup([vote]);
|
|
66
|
+
expect(result.current).toBe('You voted: A');
|
|
67
|
+
|
|
68
|
+
act(() => {
|
|
69
|
+
poll.removeVote(vote.id, MESSAGE_ID);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
expect(result.current).toBeUndefined();
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('labels the remaining latest vote once another option loses its only vote', () => {
|
|
76
|
+
const voteA = generateVote('vote-a', 'option-a', '2026-10-27T10:00:00.000Z');
|
|
77
|
+
const voteB = generateVote('vote-b', 'option-b', '2026-10-27T09:00:00.000Z');
|
|
78
|
+
const { poll, result } = setup([voteA, voteB]);
|
|
79
|
+
|
|
80
|
+
act(() => {
|
|
81
|
+
poll.removeVote(voteA.id, MESSAGE_ID);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
expect(poll.data.latest_votes_by_option['option-a'] ?? []).toEqual([]);
|
|
85
|
+
expect(result.current).toBe('You voted: B');
|
|
86
|
+
});
|
|
87
|
+
});
|
|
@@ -22,7 +22,7 @@ const lastMessageSelector = (state: MessagePaginatorAggregateState) => ({
|
|
|
22
22
|
});
|
|
23
23
|
|
|
24
24
|
export const useChannelPreviewData = (channel: Channel, client: StreamChat) => {
|
|
25
|
-
const userId = client.
|
|
25
|
+
const userId = client.userId;
|
|
26
26
|
const { lastMessage } =
|
|
27
27
|
useStateStore(channel.messagePaginator.aggregateState, lastMessageSelector) ?? {};
|
|
28
28
|
|
|
@@ -30,20 +30,19 @@ export const useChannelPreviewData = (channel: Channel, client: StreamChat) => {
|
|
|
30
30
|
// rather than one subscription per concern.
|
|
31
31
|
const previewStateSelector = useCallback(
|
|
32
32
|
(state: MembershipState & MuteStatusState & ReadState) => ({
|
|
33
|
-
membership: state.membership,
|
|
34
33
|
muteStatus: state.muteStatus,
|
|
34
|
+
pinned: state.membership?.pinned_at != null,
|
|
35
35
|
unread: userId ? (state.read[userId]?.unread_messages ?? 0) : 0,
|
|
36
36
|
}),
|
|
37
37
|
[userId],
|
|
38
38
|
);
|
|
39
39
|
const {
|
|
40
|
-
membership,
|
|
41
40
|
muteStatus,
|
|
41
|
+
pinned = false,
|
|
42
42
|
unread: reactiveUnread,
|
|
43
43
|
} = useStateStore(channel.state, previewStateSelector) ?? {};
|
|
44
44
|
|
|
45
45
|
const muted = muteStatus?.muted ?? false;
|
|
46
|
-
const pinned = membership?.pinned_at != null;
|
|
47
46
|
// Muted channels show no unread count.
|
|
48
47
|
const unread = muted ? 0 : (reactiveUnread ?? 0);
|
|
49
48
|
|
|
@@ -18,7 +18,7 @@ const pickName = (member: ChannelMemberResponse) => ({
|
|
|
18
18
|
export const useChannelPreviewDisplayName = (channel?: Channel) => {
|
|
19
19
|
const { client } = useChatContext();
|
|
20
20
|
const { t } = useTranslationContext();
|
|
21
|
-
const currentUserId = client?.
|
|
21
|
+
const currentUserId = client?.userId;
|
|
22
22
|
const members = useChannelMembersState(channel, pickName);
|
|
23
23
|
const channelName = useChannelName(channel);
|
|
24
24
|
|
|
@@ -11,7 +11,7 @@ import { useSyncClientEventsToChannel } from '../../../hooks/useSyncClientEvents
|
|
|
11
11
|
const selector = (channel: Channel, client: StreamChat) => {
|
|
12
12
|
const members = channel.state.members;
|
|
13
13
|
const membersCount = Object.keys(members).length;
|
|
14
|
-
const otherMember = Object.values(members).find((member) => member.user?.id !== client.
|
|
14
|
+
const otherMember = Object.values(members).find((member) => member.user?.id !== client.userId);
|
|
15
15
|
|
|
16
16
|
if (membersCount !== 2) return false;
|
|
17
17
|
return otherMember?.user?.online ?? false;
|
|
@@ -32,7 +32,7 @@ export const useChannelPreviewPollLabel = ({ pollId }: UseChannelPreviewPollLabe
|
|
|
32
32
|
() =>
|
|
33
33
|
latestVotesByOption
|
|
34
34
|
? Object.values(latestVotesByOption)
|
|
35
|
-
.
|
|
35
|
+
.flatMap((votes) => votes?.[0] ?? [])
|
|
36
36
|
.sort((a, b) => b.created_at - a.created_at)
|
|
37
37
|
: [],
|
|
38
38
|
[latestVotesByOption],
|
|
@@ -4,7 +4,7 @@ import { View } from 'react-native';
|
|
|
4
4
|
import NetInfo from '@react-native-community/netinfo';
|
|
5
5
|
import { act, cleanup, render, screen, waitFor } from '@testing-library/react-native';
|
|
6
6
|
|
|
7
|
-
import
|
|
7
|
+
import { StreamChat } from 'stream-chat';
|
|
8
8
|
|
|
9
9
|
import type { ChatContextValue } from '../../../contexts/chatContext/ChatContext';
|
|
10
10
|
import { useChatContext } from '../../../contexts/chatContext/ChatContext';
|
|
@@ -136,6 +136,36 @@ describe('Chat', () => {
|
|
|
136
136
|
expect(chatClient.networkConnection.isOnline).toBe(true);
|
|
137
137
|
});
|
|
138
138
|
|
|
139
|
+
it('keeps a reporter the app registered before mounting', async () => {
|
|
140
|
+
const statusReporter = jest.fn(() => () => undefined);
|
|
141
|
+
chatClient.config.set({ client: { networkConnection: { statusReporter } } });
|
|
142
|
+
|
|
143
|
+
const { getByTestId } = render(
|
|
144
|
+
<Chat client={chatClient}>
|
|
145
|
+
<View testID='children' />
|
|
146
|
+
</Chat>,
|
|
147
|
+
);
|
|
148
|
+
await waitFor(() => expect(getByTestId('children')).toBeTruthy());
|
|
149
|
+
|
|
150
|
+
expect(chatClient.networkConnection.config.statusReporter).toBe(statusReporter);
|
|
151
|
+
expect(NetInfo.addEventListener).not.toHaveBeenCalled();
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('keeps a reporter passed to the client constructor', async () => {
|
|
155
|
+
const statusReporter = jest.fn(() => () => undefined);
|
|
156
|
+
const client = new StreamChat('key', { client: { networkConnection: { statusReporter } } });
|
|
157
|
+
|
|
158
|
+
const { getByTestId } = render(
|
|
159
|
+
<Chat client={client}>
|
|
160
|
+
<View testID='children' />
|
|
161
|
+
</Chat>,
|
|
162
|
+
);
|
|
163
|
+
await waitFor(() => expect(getByTestId('children')).toBeTruthy());
|
|
164
|
+
|
|
165
|
+
expect(client.networkConnection.config.statusReporter).toBe(statusReporter);
|
|
166
|
+
expect(NetInfo.addEventListener).not.toHaveBeenCalled();
|
|
167
|
+
});
|
|
168
|
+
|
|
139
169
|
it('keeps the NetInfo listener alive after unmount, because the client outlives <Chat>', async () => {
|
|
140
170
|
// The reporter's lifetime is the CLIENT's, not this component's. Releasing it here would leave
|
|
141
171
|
// `isOnline` frozen at a stale value (`setStatusReporter(null)` keeps the last status by design),
|
|
@@ -9,9 +9,9 @@ import type { NetworkStatusReporter, StreamChat } from 'stream-chat';
|
|
|
9
9
|
import { useAppStateListener } from '../../../hooks/useAppStateListener';
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
|
-
* Installs the NetInfo network status reporter on the client
|
|
13
|
-
* is in the background, reopening it in the foreground (push
|
|
14
|
-
* no socket is active).
|
|
12
|
+
* Installs the NetInfo network status reporter on the client, unless the app registered one, and
|
|
13
|
+
* closes the WebSocket while the app is in the background, reopening it in the foreground (push
|
|
14
|
+
* notifications are only delivered while no socket is active).
|
|
15
15
|
*
|
|
16
16
|
* Read the results with `useNetworkConnectionState()` and `useWSConnectionState()`.
|
|
17
17
|
*
|
|
@@ -32,7 +32,7 @@ export const useConnectionLifecycle = (client: StreamChat, closeConnectionOnBack
|
|
|
32
32
|
|
|
33
33
|
const onForeground = useCallback(() => {
|
|
34
34
|
// Without a user ID, opening the connection would raise an unneeded error.
|
|
35
|
-
if (!clientExists || !client.
|
|
35
|
+
if (!clientExists || !client.userId) {
|
|
36
36
|
return;
|
|
37
37
|
}
|
|
38
38
|
|
|
@@ -44,7 +44,7 @@ export const useConnectionLifecycle = (client: StreamChat, closeConnectionOnBack
|
|
|
44
44
|
// A `<Chat>` mounted while the app is already active (Android recreating the activity) never sees
|
|
45
45
|
// the background-to-foreground change that reopens a socket its predecessor closed.
|
|
46
46
|
useEffect(() => {
|
|
47
|
-
if (!closeConnectionOnBackground || !clientExists || !client.
|
|
47
|
+
if (!closeConnectionOnBackground || !clientExists || !client.userId) return;
|
|
48
48
|
if (AppState.currentState === 'active' && client.wsConnection.connection?.isDisconnected) {
|
|
49
49
|
client.openConnection();
|
|
50
50
|
}
|
|
@@ -55,6 +55,11 @@ export const useConnectionLifecycle = (client: StreamChat, closeConnectionOnBack
|
|
|
55
55
|
return;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
// a reporter the app registered, through `client.config` or the client's constructor wins
|
|
59
|
+
if (client.config.getConfig('client')?.networkConnection?.statusReporter) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
58
63
|
// Set through the client config so `client.config.get('client')` shows the installed reporter.
|
|
59
64
|
// Required on React Native: the client's fallback mirrors its own WebSocket and cannot report
|
|
60
65
|
// the network returning before the socket notices.
|
|
@@ -74,7 +79,8 @@ export const useConnectionLifecycle = (client: StreamChat, closeConnectionOnBack
|
|
|
74
79
|
};
|
|
75
80
|
|
|
76
81
|
/**
|
|
77
|
-
* Subscribes to NetInfo and reports every change to the client. `<Chat>` installs it in an effect
|
|
82
|
+
* Subscribes to NetInfo and reports every change to the client. `<Chat>` installs it in an effect,
|
|
83
|
+
* unless a reporter is registered in `client.config`.
|
|
78
84
|
*
|
|
79
85
|
* When you build the client yourself, install it at construction instead:
|
|
80
86
|
*
|
|
@@ -33,7 +33,7 @@ const LoadingErrorWrapper = (props: React.PropsWithChildren<LoadingErrorWrapperP
|
|
|
33
33
|
|
|
34
34
|
export type LoadingErrorProps = {
|
|
35
35
|
error?: Error;
|
|
36
|
-
listType?: 'channel' | 'message' | 'default';
|
|
36
|
+
listType?: 'channel' | 'message' | 'thread' | 'default';
|
|
37
37
|
loadNextPage?: () => Promise<void>;
|
|
38
38
|
retry?: () => void;
|
|
39
39
|
};
|
|
@@ -64,6 +64,13 @@ export const LoadingErrorIndicator = (props: LoadingErrorProps) => {
|
|
|
64
64
|
)}
|
|
65
65
|
/>
|
|
66
66
|
);
|
|
67
|
+
case 'thread':
|
|
68
|
+
return (
|
|
69
|
+
<LoadingErrorWrapper
|
|
70
|
+
onPress={retry}
|
|
71
|
+
text={t('indicators.loading.replies.error', 'Error loading replies...')}
|
|
72
|
+
/>
|
|
73
|
+
);
|
|
67
74
|
default:
|
|
68
75
|
return <LoadingErrorWrapper text={t('indicators.loading.error', 'Error loading')} />;
|
|
69
76
|
}
|
|
@@ -343,7 +343,7 @@ const MessageWithContext = (props: MessagePropsWithContext) => {
|
|
|
343
343
|
const actionsEnabled =
|
|
344
344
|
message.type === 'regular' && message.status === MessageStatusTypes.RECEIVED;
|
|
345
345
|
|
|
346
|
-
const isMyMessage = client && message && client.
|
|
346
|
+
const isMyMessage = client && message && client.userId === message.user?.id;
|
|
347
347
|
|
|
348
348
|
const handleAction = async (name: string, value: string) => {
|
|
349
349
|
if (message.id) {
|
|
@@ -71,6 +71,7 @@ const MessageStatusWithContext = (props: MessageStatusPropsWithContext) => {
|
|
|
71
71
|
<icons.CheckAll
|
|
72
72
|
height={16}
|
|
73
73
|
stroke={styles.readCheck.color}
|
|
74
|
+
testID='message-status-read'
|
|
74
75
|
width={16}
|
|
75
76
|
{...checkAllIcon}
|
|
76
77
|
/>
|
|
@@ -78,13 +79,26 @@ const MessageStatusWithContext = (props: MessageStatusPropsWithContext) => {
|
|
|
78
79
|
<icons.CheckAll
|
|
79
80
|
stroke={styles.deliveredCheck.color}
|
|
80
81
|
height={16}
|
|
82
|
+
testID='message-status-delivered'
|
|
81
83
|
width={16}
|
|
82
84
|
{...checkAllIcon}
|
|
83
85
|
/>
|
|
84
86
|
) : sending ? (
|
|
85
|
-
<icons.Time
|
|
87
|
+
<icons.Time
|
|
88
|
+
stroke={styles.sendingCheck.color}
|
|
89
|
+
height={16}
|
|
90
|
+
testID='message-status-sending'
|
|
91
|
+
width={16}
|
|
92
|
+
{...timeIcon}
|
|
93
|
+
/>
|
|
86
94
|
) : sent ? (
|
|
87
|
-
<icons.Check
|
|
95
|
+
<icons.Check
|
|
96
|
+
stroke={styles.sentCheck.color}
|
|
97
|
+
height={16}
|
|
98
|
+
testID='message-status-sent'
|
|
99
|
+
width={16}
|
|
100
|
+
{...checkIcon}
|
|
101
|
+
/>
|
|
88
102
|
) : null}
|
|
89
103
|
</View>
|
|
90
104
|
</>
|
|
@@ -57,8 +57,9 @@ export const MessageWrapper = React.memo(function MessageWrapper(props: MessageW
|
|
|
57
57
|
const createdAtTimestamp = message.created_at;
|
|
58
58
|
const messageId = message.id;
|
|
59
59
|
const nextMessageId = nextMessage?.id;
|
|
60
|
-
const nextMessageIsOwn = nextMessage?.user?.id === client.
|
|
60
|
+
const nextMessageIsOwn = nextMessage?.user?.id === client.userId;
|
|
61
61
|
const nextMessageCreatedAt = nextMessage?.created_at ?? undefined;
|
|
62
|
+
const isThreadList = !!messagePaginator.parentMessageId;
|
|
62
63
|
|
|
63
64
|
// The unread separator goes on the row above the first unread message from another user. It is
|
|
64
65
|
// located per message inside the selector, so the flag stays `false` for every other row and a
|
|
@@ -66,7 +67,9 @@ export const MessageWrapper = React.memo(function MessageWrapper(props: MessageW
|
|
|
66
67
|
const showUnreadSeparatorSelector = useCallback(
|
|
67
68
|
(snapshot: UnreadSnapshotState) => {
|
|
68
69
|
let showUnreadSeparator: boolean;
|
|
69
|
-
if (
|
|
70
|
+
if (isThreadList) {
|
|
71
|
+
showUnreadSeparator = false;
|
|
72
|
+
} else if (snapshot.firstUnreadMessageId) {
|
|
70
73
|
// Frozen boundary (channel open or mark-unread): anchor to the known first unread ID.
|
|
71
74
|
showUnreadSeparator = nextMessageId === snapshot.firstUnreadMessageId;
|
|
72
75
|
} else if (snapshot.unreadCount) {
|
|
@@ -103,7 +106,14 @@ export const MessageWrapper = React.memo(function MessageWrapper(props: MessageW
|
|
|
103
106
|
unreadCount: showUnreadSeparator ? snapshot.unreadCount : undefined,
|
|
104
107
|
};
|
|
105
108
|
},
|
|
106
|
-
[
|
|
109
|
+
[
|
|
110
|
+
createdAtTimestamp,
|
|
111
|
+
isThreadList,
|
|
112
|
+
messageId,
|
|
113
|
+
nextMessageCreatedAt,
|
|
114
|
+
nextMessageId,
|
|
115
|
+
nextMessageIsOwn,
|
|
116
|
+
],
|
|
107
117
|
);
|
|
108
118
|
const { showUnreadSeparator, unreadCount } = useStateStore(
|
|
109
119
|
messagePaginator.unreadStateSnapshot,
|
|
@@ -119,7 +129,7 @@ export const MessageWrapper = React.memo(function MessageWrapper(props: MessageW
|
|
|
119
129
|
|
|
120
130
|
const showUnreadUnderlay = !!shouldShowUnreadUnderlay && showUnreadSeparator;
|
|
121
131
|
|
|
122
|
-
const wrapMessageInTheme = client.
|
|
132
|
+
const wrapMessageInTheme = client.userId === message.user?.id && !!myMessageTheme;
|
|
123
133
|
const renderDateSeperator = dateSeparatorDate ? (
|
|
124
134
|
<View style={styles.dateSeparatorContainer}>
|
|
125
135
|
<InlineDateSeparator date={dateSeparatorDate} />
|
|
@@ -184,4 +184,25 @@ describe('MessageStatus', () => {
|
|
|
184
184
|
});
|
|
185
185
|
});
|
|
186
186
|
});
|
|
187
|
+
|
|
188
|
+
it.each([
|
|
189
|
+
[false, false, 'sending', 'message-status-sending'],
|
|
190
|
+
[true, true, 'received', 'message-status-read'],
|
|
191
|
+
[false, false, 'received', 'message-status-sent'],
|
|
192
|
+
[true, false, 'received', 'message-status-delivered'],
|
|
193
|
+
] as [boolean, boolean, string, string][])(
|
|
194
|
+
'exposes a status testID when delivered is %s, read is %s and status is %s',
|
|
195
|
+
async (delivered, read, status, testID) => {
|
|
196
|
+
const message = generateMessage({ user: generateUser() });
|
|
197
|
+
const { getByTestId } = renderMessageStatus({
|
|
198
|
+
delivered,
|
|
199
|
+
message: { ...message, status },
|
|
200
|
+
read,
|
|
201
|
+
});
|
|
202
|
+
// The icon row is hidden from screen readers in favour of the hidden text label.
|
|
203
|
+
await waitFor(() => {
|
|
204
|
+
expect(getByTestId(testID, { includeHiddenElements: true })).toBeTruthy();
|
|
205
|
+
});
|
|
206
|
+
},
|
|
207
|
+
);
|
|
187
208
|
});
|
|
@@ -22,7 +22,7 @@ const createClient = (mutedUsers: UserMuteResponse[] = []) =>
|
|
|
22
22
|
on: jest.fn(() => ({ unsubscribe: jest.fn() })),
|
|
23
23
|
pinMessage: jest.fn(),
|
|
24
24
|
unpinMessage: jest.fn(),
|
|
25
|
-
|
|
25
|
+
userId: 'current-user-id',
|
|
26
26
|
}) as unknown as StreamChat & {
|
|
27
27
|
moderation: { mute: jest.Mock; unmute: jest.Mock };
|
|
28
28
|
notifications: { add: jest.Mock; remove: jest.Mock; startTimeout: jest.Mock };
|
|
@@ -13,7 +13,7 @@ const muteOf = (targetId: string) =>
|
|
|
13
13
|
const createClient = () =>
|
|
14
14
|
({
|
|
15
15
|
mutedUsersStore: new StateStore<{ mutedUsers: UserMuteResponse[] }>({ mutedUsers: [] }),
|
|
16
|
-
|
|
16
|
+
userId: 'current-user-id',
|
|
17
17
|
}) as unknown as StreamChat;
|
|
18
18
|
|
|
19
19
|
describe('useUserMuteActive', () => {
|