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.
Files changed (500) hide show
  1. package/lib/commonjs/ai-components/README.md +50 -2
  2. package/lib/commonjs/ai-components/index.js +24 -0
  3. package/lib/commonjs/ai-components/index.js.map +1 -1
  4. package/lib/commonjs/ai-components/message-composer/ComposerView.js +4 -2
  5. package/lib/commonjs/ai-components/message-composer/ComposerView.js.map +1 -1
  6. package/lib/commonjs/ai-components/message-composer/SpeechToTextButton.js +4 -1
  7. package/lib/commonjs/ai-components/message-composer/SpeechToTextButton.js.map +1 -1
  8. package/lib/commonjs/ai-components/native/AIDictation.js +6 -0
  9. package/lib/commonjs/ai-components/native/AIDictation.js.map +1 -1
  10. package/lib/commonjs/ai-components/store/dictation/store.js +4 -2
  11. package/lib/commonjs/ai-components/store/dictation/store.js.map +1 -1
  12. package/lib/commonjs/ai-components/store/dictation/useDictationState.js +4 -2
  13. package/lib/commonjs/ai-components/store/dictation/useDictationState.js.map +1 -1
  14. package/lib/commonjs/ai-components/store/index.js +22 -0
  15. package/lib/commonjs/ai-components/store/index.js.map +1 -1
  16. package/lib/commonjs/ai-components/theme.js +3 -0
  17. package/lib/commonjs/ai-components/theme.js.map +1 -1
  18. package/lib/commonjs/ai-components/transcription/useDictation.js +7 -3
  19. package/lib/commonjs/ai-components/transcription/useDictation.js.map +1 -1
  20. package/lib/commonjs/ai-components/transcription/useDictationAudioLevel.js +32 -0
  21. package/lib/commonjs/ai-components/transcription/useDictationAudioLevel.js.map +1 -0
  22. package/lib/commonjs/ai-components/voice-visualization/VoiceGlow.js +79 -0
  23. package/lib/commonjs/ai-components/voice-visualization/VoiceGlow.js.map +1 -0
  24. package/lib/commonjs/ai-components/voice-visualization/VoiceVisualizationView.js +147 -0
  25. package/lib/commonjs/ai-components/voice-visualization/VoiceVisualizationView.js.map +1 -0
  26. package/lib/commonjs/ai-components/voice-visualization/VoiceWave.js +58 -0
  27. package/lib/commonjs/ai-components/voice-visualization/VoiceWave.js.map +1 -0
  28. package/lib/commonjs/ai-components/voice-visualization/bounce.js +60 -0
  29. package/lib/commonjs/ai-components/voice-visualization/bounce.js.map +1 -0
  30. package/lib/commonjs/ai-components/voice-visualization/driver.js +208 -0
  31. package/lib/commonjs/ai-components/voice-visualization/driver.js.map +1 -0
  32. package/lib/commonjs/ai-components/voice-visualization/glowShader.js +218 -0
  33. package/lib/commonjs/ai-components/voice-visualization/glowShader.js.map +1 -0
  34. package/lib/commonjs/ai-components/voice-visualization/index.js +18 -0
  35. package/lib/commonjs/ai-components/voice-visualization/index.js.map +1 -0
  36. package/lib/commonjs/ai-components/voice-visualization/math.js +70 -0
  37. package/lib/commonjs/ai-components/voice-visualization/math.js.map +1 -0
  38. package/lib/commonjs/ai-components/voice-visualization/palette.js +47 -0
  39. package/lib/commonjs/ai-components/voice-visualization/palette.js.map +1 -0
  40. package/lib/commonjs/ai-components/voice-visualization/simplex.js +77 -0
  41. package/lib/commonjs/ai-components/voice-visualization/simplex.js.map +1 -0
  42. package/lib/commonjs/ai-components/voice-visualization/styles.js +33 -0
  43. package/lib/commonjs/ai-components/voice-visualization/styles.js.map +1 -0
  44. package/lib/commonjs/ai-components/voice-visualization/types.js +4 -0
  45. package/lib/commonjs/ai-components/voice-visualization/types.js.map +1 -0
  46. package/lib/commonjs/ai-components/voice-visualization/useReduceMotion.js +28 -0
  47. package/lib/commonjs/ai-components/voice-visualization/useReduceMotion.js.map +1 -0
  48. package/lib/commonjs/ai-components/voice-visualization/useVoiceVisualization.js +129 -0
  49. package/lib/commonjs/ai-components/voice-visualization/useVoiceVisualization.js.map +1 -0
  50. package/lib/commonjs/ai-components/voice-visualization/waveGeometry.js +124 -0
  51. package/lib/commonjs/ai-components/voice-visualization/waveGeometry.js.map +1 -0
  52. package/lib/commonjs/components/Channel/hooks/useChannelLifecycle.js +2 -1
  53. package/lib/commonjs/components/Channel/hooks/useChannelLifecycle.js.map +1 -1
  54. package/lib/commonjs/components/ChannelDetails/components/members/ChannelMemberItem.js +1 -1
  55. package/lib/commonjs/components/ChannelDetails/components/members/ChannelMemberItem.js.map +1 -1
  56. package/lib/commonjs/components/ChannelDetails/hooks/useChannelDetailsMemberStatusText.js +1 -1
  57. package/lib/commonjs/components/ChannelDetails/hooks/useChannelDetailsMemberStatusText.js.map +1 -1
  58. package/lib/commonjs/components/ChannelList/ChannelListView.js +0 -2
  59. package/lib/commonjs/components/ChannelList/ChannelListView.js.map +1 -1
  60. package/lib/commonjs/components/ChannelList/hooks/usePaginatedChannels.js +1 -1
  61. package/lib/commonjs/components/ChannelList/hooks/usePaginatedChannels.js.map +1 -1
  62. package/lib/commonjs/components/ChannelPreview/ChannelDetailsBottomSheet.js +1 -1
  63. package/lib/commonjs/components/ChannelPreview/ChannelDetailsBottomSheet.js.map +1 -1
  64. package/lib/commonjs/components/ChannelPreview/ChannelLastMessagePreview.js +1 -0
  65. package/lib/commonjs/components/ChannelPreview/ChannelLastMessagePreview.js.map +1 -1
  66. package/lib/commonjs/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js +2 -0
  67. package/lib/commonjs/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js.map +1 -1
  68. package/lib/commonjs/components/ChannelPreview/ChannelPreviewTitle.js +1 -0
  69. package/lib/commonjs/components/ChannelPreview/ChannelPreviewTitle.js.map +1 -1
  70. package/lib/commonjs/components/ChannelPreview/ChannelPreviewView.js +1 -1
  71. package/lib/commonjs/components/ChannelPreview/ChannelPreviewView.js.map +1 -1
  72. package/lib/commonjs/components/ChannelPreview/hooks/useChannelPreviewData.js +5 -5
  73. package/lib/commonjs/components/ChannelPreview/hooks/useChannelPreviewData.js.map +1 -1
  74. package/lib/commonjs/components/ChannelPreview/hooks/useChannelPreviewDisplayName.js +1 -1
  75. package/lib/commonjs/components/ChannelPreview/hooks/useChannelPreviewDisplayName.js.map +1 -1
  76. package/lib/commonjs/components/ChannelPreview/hooks/useChannelPreviewDisplayPresence.js +1 -1
  77. package/lib/commonjs/components/ChannelPreview/hooks/useChannelPreviewDisplayPresence.js.map +1 -1
  78. package/lib/commonjs/components/ChannelPreview/hooks/useChannelPreviewPollLabel.js +4 -1
  79. package/lib/commonjs/components/ChannelPreview/hooks/useChannelPreviewPollLabel.js.map +1 -1
  80. package/lib/commonjs/components/Chat/hooks/useConnectionLifecycle.js +6 -2
  81. package/lib/commonjs/components/Chat/hooks/useConnectionLifecycle.js.map +1 -1
  82. package/lib/commonjs/components/Indicators/LoadingErrorIndicator.js +5 -0
  83. package/lib/commonjs/components/Indicators/LoadingErrorIndicator.js.map +1 -1
  84. package/lib/commonjs/components/Message/Message.js +1 -1
  85. package/lib/commonjs/components/Message/Message.js.map +1 -1
  86. package/lib/commonjs/components/Message/MessageItemView/MessageStatus.js +4 -0
  87. package/lib/commonjs/components/Message/MessageItemView/MessageStatus.js.map +1 -1
  88. package/lib/commonjs/components/Message/MessageItemView/MessageWrapper.js +7 -4
  89. package/lib/commonjs/components/Message/MessageItemView/MessageWrapper.js.map +1 -1
  90. package/lib/commonjs/components/Message/hooks/useCreateMessageActionHandlers.js +3 -3
  91. package/lib/commonjs/components/Message/hooks/useCreateMessageActionHandlers.js.map +1 -1
  92. package/lib/commonjs/components/Message/hooks/useProcessReactions.js +2 -2
  93. package/lib/commonjs/components/Message/hooks/useProcessReactions.js.map +1 -1
  94. package/lib/commonjs/components/Message/hooks/useUserMuteActive.js +1 -1
  95. package/lib/commonjs/components/Message/hooks/useUserMuteActive.js.map +1 -1
  96. package/lib/commonjs/components/MessageInput/MessageComposer.js +2 -1
  97. package/lib/commonjs/components/MessageInput/MessageComposer.js.map +1 -1
  98. package/lib/commonjs/components/MessageList/MessageFlashList.js +2 -2
  99. package/lib/commonjs/components/MessageList/MessageFlashList.js.map +1 -1
  100. package/lib/commonjs/components/MessageList/MessageList.js +2 -2
  101. package/lib/commonjs/components/MessageList/MessageList.js.map +1 -1
  102. package/lib/commonjs/components/MessageList/hooks/useOwnUnreadCount.js +1 -1
  103. package/lib/commonjs/components/MessageList/hooks/useOwnUnreadCount.js.map +1 -1
  104. package/lib/commonjs/components/MessageMenu/MessageUserReactionsItem.js +1 -1
  105. package/lib/commonjs/components/MessageMenu/MessageUserReactionsItem.js.map +1 -1
  106. package/lib/commonjs/components/MessageMenu/hooks/useMessageOwnReactions.js +2 -2
  107. package/lib/commonjs/components/MessageMenu/hooks/useMessageOwnReactions.js.map +1 -1
  108. package/lib/commonjs/components/Poll/components/PollAnswersList.js +1 -1
  109. package/lib/commonjs/components/Poll/components/PollAnswersList.js.map +1 -1
  110. package/lib/commonjs/components/Poll/components/PollButtons.js +1 -1
  111. package/lib/commonjs/components/Poll/components/PollButtons.js.map +1 -1
  112. package/lib/commonjs/components/Poll/hook/useIsPollCreatedByCurrentUser.js +1 -1
  113. package/lib/commonjs/components/Poll/hook/useIsPollCreatedByCurrentUser.js.map +1 -1
  114. package/lib/commonjs/components/Thread/Thread.js +1 -1
  115. package/lib/commonjs/components/Thread/Thread.js.map +1 -1
  116. package/lib/commonjs/components/ThreadList/ThreadListItem.js +1 -1
  117. package/lib/commonjs/components/ThreadList/ThreadListItem.js.map +1 -1
  118. package/lib/commonjs/components/ThreadList/ThreadListUnreadBanner.js +9 -2
  119. package/lib/commonjs/components/ThreadList/ThreadListUnreadBanner.js.map +1 -1
  120. package/lib/commonjs/components/index.js +24 -0
  121. package/lib/commonjs/components/index.js.map +1 -1
  122. package/lib/commonjs/contexts/componentsContext/defaultComponents.js +0 -2
  123. package/lib/commonjs/contexts/componentsContext/defaultComponents.js.map +1 -1
  124. package/lib/commonjs/contexts/liveLocationManagerContext/LiveLocationManagerContext.js +1 -1
  125. package/lib/commonjs/contexts/liveLocationManagerContext/LiveLocationManagerContext.js.map +1 -1
  126. package/lib/commonjs/hooks/actions/useChannelActionItems.js +1 -1
  127. package/lib/commonjs/hooks/actions/useChannelActionItems.js.map +1 -1
  128. package/lib/commonjs/hooks/actions/useChannelActions.js +2 -2
  129. package/lib/commonjs/hooks/actions/useChannelActions.js.map +1 -1
  130. package/lib/commonjs/hooks/actions/useChannelMemberActionItems.js +1 -1
  131. package/lib/commonjs/hooks/actions/useChannelMemberActionItems.js.map +1 -1
  132. package/lib/commonjs/hooks/index.js +11 -0
  133. package/lib/commonjs/hooks/index.js.map +1 -1
  134. package/lib/commonjs/hooks/messagePreview/useMessageDeliveryStatus.js +6 -6
  135. package/lib/commonjs/hooks/messagePreview/useMessageDeliveryStatus.js.map +1 -1
  136. package/lib/commonjs/hooks/useIsDirectChat.js +1 -1
  137. package/lib/commonjs/hooks/useIsDirectChat.js.map +1 -1
  138. package/lib/commonjs/i18n/runtimeDefaults.js +1 -0
  139. package/lib/commonjs/i18n/runtimeDefaults.js.map +1 -1
  140. package/lib/commonjs/store/apis/getChannelMessages.js +5 -3
  141. package/lib/commonjs/store/apis/getChannelMessages.js.map +1 -1
  142. package/lib/commonjs/store/apis/getChannels.js +6 -3
  143. package/lib/commonjs/store/apis/getChannels.js.map +1 -1
  144. package/lib/commonjs/store/apis/getChannelsForFilterSort.js +2 -1
  145. package/lib/commonjs/store/apis/getChannelsForFilterSort.js.map +1 -1
  146. package/lib/commonjs/store/apis/queries/selectMessagesForChannels.js +7 -5
  147. package/lib/commonjs/store/apis/queries/selectMessagesForChannels.js.map +1 -1
  148. package/lib/commonjs/utils/installNativeMultipartAdapter.js.map +1 -1
  149. package/lib/commonjs/version.json +1 -1
  150. package/lib/module/ai-components/README.md +50 -2
  151. package/lib/module/ai-components/index.js +24 -0
  152. package/lib/module/ai-components/index.js.map +1 -1
  153. package/lib/module/ai-components/message-composer/ComposerView.js +4 -2
  154. package/lib/module/ai-components/message-composer/ComposerView.js.map +1 -1
  155. package/lib/module/ai-components/message-composer/SpeechToTextButton.js +4 -1
  156. package/lib/module/ai-components/message-composer/SpeechToTextButton.js.map +1 -1
  157. package/lib/module/ai-components/native/AIDictation.js +6 -0
  158. package/lib/module/ai-components/native/AIDictation.js.map +1 -1
  159. package/lib/module/ai-components/store/dictation/store.js +4 -2
  160. package/lib/module/ai-components/store/dictation/store.js.map +1 -1
  161. package/lib/module/ai-components/store/dictation/useDictationState.js +4 -2
  162. package/lib/module/ai-components/store/dictation/useDictationState.js.map +1 -1
  163. package/lib/module/ai-components/store/index.js +22 -0
  164. package/lib/module/ai-components/store/index.js.map +1 -1
  165. package/lib/module/ai-components/theme.js +3 -0
  166. package/lib/module/ai-components/theme.js.map +1 -1
  167. package/lib/module/ai-components/transcription/useDictation.js +7 -3
  168. package/lib/module/ai-components/transcription/useDictation.js.map +1 -1
  169. package/lib/module/ai-components/transcription/useDictationAudioLevel.js +32 -0
  170. package/lib/module/ai-components/transcription/useDictationAudioLevel.js.map +1 -0
  171. package/lib/module/ai-components/voice-visualization/VoiceGlow.js +79 -0
  172. package/lib/module/ai-components/voice-visualization/VoiceGlow.js.map +1 -0
  173. package/lib/module/ai-components/voice-visualization/VoiceVisualizationView.js +147 -0
  174. package/lib/module/ai-components/voice-visualization/VoiceVisualizationView.js.map +1 -0
  175. package/lib/module/ai-components/voice-visualization/VoiceWave.js +58 -0
  176. package/lib/module/ai-components/voice-visualization/VoiceWave.js.map +1 -0
  177. package/lib/module/ai-components/voice-visualization/bounce.js +60 -0
  178. package/lib/module/ai-components/voice-visualization/bounce.js.map +1 -0
  179. package/lib/module/ai-components/voice-visualization/driver.js +208 -0
  180. package/lib/module/ai-components/voice-visualization/driver.js.map +1 -0
  181. package/lib/module/ai-components/voice-visualization/glowShader.js +218 -0
  182. package/lib/module/ai-components/voice-visualization/glowShader.js.map +1 -0
  183. package/lib/module/ai-components/voice-visualization/index.js +18 -0
  184. package/lib/module/ai-components/voice-visualization/index.js.map +1 -0
  185. package/lib/module/ai-components/voice-visualization/math.js +70 -0
  186. package/lib/module/ai-components/voice-visualization/math.js.map +1 -0
  187. package/lib/module/ai-components/voice-visualization/palette.js +47 -0
  188. package/lib/module/ai-components/voice-visualization/palette.js.map +1 -0
  189. package/lib/module/ai-components/voice-visualization/simplex.js +77 -0
  190. package/lib/module/ai-components/voice-visualization/simplex.js.map +1 -0
  191. package/lib/module/ai-components/voice-visualization/styles.js +33 -0
  192. package/lib/module/ai-components/voice-visualization/styles.js.map +1 -0
  193. package/lib/module/ai-components/voice-visualization/types.js +4 -0
  194. package/lib/module/ai-components/voice-visualization/types.js.map +1 -0
  195. package/lib/module/ai-components/voice-visualization/useReduceMotion.js +28 -0
  196. package/lib/module/ai-components/voice-visualization/useReduceMotion.js.map +1 -0
  197. package/lib/module/ai-components/voice-visualization/useVoiceVisualization.js +129 -0
  198. package/lib/module/ai-components/voice-visualization/useVoiceVisualization.js.map +1 -0
  199. package/lib/module/ai-components/voice-visualization/waveGeometry.js +124 -0
  200. package/lib/module/ai-components/voice-visualization/waveGeometry.js.map +1 -0
  201. package/lib/module/components/Channel/hooks/useChannelLifecycle.js +2 -1
  202. package/lib/module/components/Channel/hooks/useChannelLifecycle.js.map +1 -1
  203. package/lib/module/components/ChannelDetails/components/members/ChannelMemberItem.js +1 -1
  204. package/lib/module/components/ChannelDetails/components/members/ChannelMemberItem.js.map +1 -1
  205. package/lib/module/components/ChannelDetails/hooks/useChannelDetailsMemberStatusText.js +1 -1
  206. package/lib/module/components/ChannelDetails/hooks/useChannelDetailsMemberStatusText.js.map +1 -1
  207. package/lib/module/components/ChannelList/ChannelListView.js +0 -2
  208. package/lib/module/components/ChannelList/ChannelListView.js.map +1 -1
  209. package/lib/module/components/ChannelList/hooks/usePaginatedChannels.js +1 -1
  210. package/lib/module/components/ChannelList/hooks/usePaginatedChannels.js.map +1 -1
  211. package/lib/module/components/ChannelPreview/ChannelDetailsBottomSheet.js +1 -1
  212. package/lib/module/components/ChannelPreview/ChannelDetailsBottomSheet.js.map +1 -1
  213. package/lib/module/components/ChannelPreview/ChannelLastMessagePreview.js +1 -0
  214. package/lib/module/components/ChannelPreview/ChannelLastMessagePreview.js.map +1 -1
  215. package/lib/module/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js +2 -0
  216. package/lib/module/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js.map +1 -1
  217. package/lib/module/components/ChannelPreview/ChannelPreviewTitle.js +1 -0
  218. package/lib/module/components/ChannelPreview/ChannelPreviewTitle.js.map +1 -1
  219. package/lib/module/components/ChannelPreview/ChannelPreviewView.js +1 -1
  220. package/lib/module/components/ChannelPreview/ChannelPreviewView.js.map +1 -1
  221. package/lib/module/components/ChannelPreview/hooks/useChannelPreviewData.js +5 -5
  222. package/lib/module/components/ChannelPreview/hooks/useChannelPreviewData.js.map +1 -1
  223. package/lib/module/components/ChannelPreview/hooks/useChannelPreviewDisplayName.js +1 -1
  224. package/lib/module/components/ChannelPreview/hooks/useChannelPreviewDisplayName.js.map +1 -1
  225. package/lib/module/components/ChannelPreview/hooks/useChannelPreviewDisplayPresence.js +1 -1
  226. package/lib/module/components/ChannelPreview/hooks/useChannelPreviewDisplayPresence.js.map +1 -1
  227. package/lib/module/components/ChannelPreview/hooks/useChannelPreviewPollLabel.js +4 -1
  228. package/lib/module/components/ChannelPreview/hooks/useChannelPreviewPollLabel.js.map +1 -1
  229. package/lib/module/components/Chat/hooks/useConnectionLifecycle.js +6 -2
  230. package/lib/module/components/Chat/hooks/useConnectionLifecycle.js.map +1 -1
  231. package/lib/module/components/Indicators/LoadingErrorIndicator.js +5 -0
  232. package/lib/module/components/Indicators/LoadingErrorIndicator.js.map +1 -1
  233. package/lib/module/components/Message/Message.js +1 -1
  234. package/lib/module/components/Message/Message.js.map +1 -1
  235. package/lib/module/components/Message/MessageItemView/MessageStatus.js +4 -0
  236. package/lib/module/components/Message/MessageItemView/MessageStatus.js.map +1 -1
  237. package/lib/module/components/Message/MessageItemView/MessageWrapper.js +7 -4
  238. package/lib/module/components/Message/MessageItemView/MessageWrapper.js.map +1 -1
  239. package/lib/module/components/Message/hooks/useCreateMessageActionHandlers.js +3 -3
  240. package/lib/module/components/Message/hooks/useCreateMessageActionHandlers.js.map +1 -1
  241. package/lib/module/components/Message/hooks/useProcessReactions.js +2 -2
  242. package/lib/module/components/Message/hooks/useProcessReactions.js.map +1 -1
  243. package/lib/module/components/Message/hooks/useUserMuteActive.js +1 -1
  244. package/lib/module/components/Message/hooks/useUserMuteActive.js.map +1 -1
  245. package/lib/module/components/MessageInput/MessageComposer.js +2 -1
  246. package/lib/module/components/MessageInput/MessageComposer.js.map +1 -1
  247. package/lib/module/components/MessageList/MessageFlashList.js +2 -2
  248. package/lib/module/components/MessageList/MessageFlashList.js.map +1 -1
  249. package/lib/module/components/MessageList/MessageList.js +2 -2
  250. package/lib/module/components/MessageList/MessageList.js.map +1 -1
  251. package/lib/module/components/MessageList/hooks/useOwnUnreadCount.js +1 -1
  252. package/lib/module/components/MessageList/hooks/useOwnUnreadCount.js.map +1 -1
  253. package/lib/module/components/MessageMenu/MessageUserReactionsItem.js +1 -1
  254. package/lib/module/components/MessageMenu/MessageUserReactionsItem.js.map +1 -1
  255. package/lib/module/components/MessageMenu/hooks/useMessageOwnReactions.js +2 -2
  256. package/lib/module/components/MessageMenu/hooks/useMessageOwnReactions.js.map +1 -1
  257. package/lib/module/components/Poll/components/PollAnswersList.js +1 -1
  258. package/lib/module/components/Poll/components/PollAnswersList.js.map +1 -1
  259. package/lib/module/components/Poll/components/PollButtons.js +1 -1
  260. package/lib/module/components/Poll/components/PollButtons.js.map +1 -1
  261. package/lib/module/components/Poll/hook/useIsPollCreatedByCurrentUser.js +1 -1
  262. package/lib/module/components/Poll/hook/useIsPollCreatedByCurrentUser.js.map +1 -1
  263. package/lib/module/components/Thread/Thread.js +1 -1
  264. package/lib/module/components/Thread/Thread.js.map +1 -1
  265. package/lib/module/components/ThreadList/ThreadListItem.js +1 -1
  266. package/lib/module/components/ThreadList/ThreadListItem.js.map +1 -1
  267. package/lib/module/components/ThreadList/ThreadListUnreadBanner.js +9 -2
  268. package/lib/module/components/ThreadList/ThreadListUnreadBanner.js.map +1 -1
  269. package/lib/module/components/index.js +24 -0
  270. package/lib/module/components/index.js.map +1 -1
  271. package/lib/module/contexts/componentsContext/defaultComponents.js +0 -2
  272. package/lib/module/contexts/componentsContext/defaultComponents.js.map +1 -1
  273. package/lib/module/contexts/liveLocationManagerContext/LiveLocationManagerContext.js +1 -1
  274. package/lib/module/contexts/liveLocationManagerContext/LiveLocationManagerContext.js.map +1 -1
  275. package/lib/module/hooks/actions/useChannelActionItems.js +1 -1
  276. package/lib/module/hooks/actions/useChannelActionItems.js.map +1 -1
  277. package/lib/module/hooks/actions/useChannelActions.js +2 -2
  278. package/lib/module/hooks/actions/useChannelActions.js.map +1 -1
  279. package/lib/module/hooks/actions/useChannelMemberActionItems.js +1 -1
  280. package/lib/module/hooks/actions/useChannelMemberActionItems.js.map +1 -1
  281. package/lib/module/hooks/index.js +11 -0
  282. package/lib/module/hooks/index.js.map +1 -1
  283. package/lib/module/hooks/messagePreview/useMessageDeliveryStatus.js +6 -6
  284. package/lib/module/hooks/messagePreview/useMessageDeliveryStatus.js.map +1 -1
  285. package/lib/module/hooks/useIsDirectChat.js +1 -1
  286. package/lib/module/hooks/useIsDirectChat.js.map +1 -1
  287. package/lib/module/i18n/runtimeDefaults.js +1 -0
  288. package/lib/module/i18n/runtimeDefaults.js.map +1 -1
  289. package/lib/module/store/apis/getChannelMessages.js +5 -3
  290. package/lib/module/store/apis/getChannelMessages.js.map +1 -1
  291. package/lib/module/store/apis/getChannels.js +6 -3
  292. package/lib/module/store/apis/getChannels.js.map +1 -1
  293. package/lib/module/store/apis/getChannelsForFilterSort.js +2 -1
  294. package/lib/module/store/apis/getChannelsForFilterSort.js.map +1 -1
  295. package/lib/module/store/apis/queries/selectMessagesForChannels.js +7 -5
  296. package/lib/module/store/apis/queries/selectMessagesForChannels.js.map +1 -1
  297. package/lib/module/utils/installNativeMultipartAdapter.js.map +1 -1
  298. package/lib/module/version.json +1 -1
  299. package/lib/typescript/ai-components/index.d.ts +3 -1
  300. package/lib/typescript/ai-components/index.d.ts.map +1 -1
  301. package/lib/typescript/ai-components/message-composer/ComposerView.d.ts.map +1 -1
  302. package/lib/typescript/ai-components/native/AIDictation.d.ts +6 -0
  303. package/lib/typescript/ai-components/native/AIDictation.d.ts.map +1 -1
  304. package/lib/typescript/ai-components/store/dictation/store.d.ts +7 -0
  305. package/lib/typescript/ai-components/store/dictation/store.d.ts.map +1 -1
  306. package/lib/typescript/ai-components/store/dictation/useDictationState.d.ts +1 -0
  307. package/lib/typescript/ai-components/store/dictation/useDictationState.d.ts.map +1 -1
  308. package/lib/typescript/ai-components/store/index.d.ts +2 -0
  309. package/lib/typescript/ai-components/store/index.d.ts.map +1 -1
  310. package/lib/typescript/ai-components/theme.d.ts +13 -0
  311. package/lib/typescript/ai-components/theme.d.ts.map +1 -1
  312. package/lib/typescript/ai-components/transcription/useDictation.d.ts +9 -1
  313. package/lib/typescript/ai-components/transcription/useDictation.d.ts.map +1 -1
  314. package/lib/typescript/ai-components/transcription/useDictationAudioLevel.d.ts +11 -0
  315. package/lib/typescript/ai-components/transcription/useDictationAudioLevel.d.ts.map +1 -0
  316. package/lib/typescript/ai-components/voice-visualization/VoiceGlow.d.ts +13 -0
  317. package/lib/typescript/ai-components/voice-visualization/VoiceGlow.d.ts.map +1 -0
  318. package/lib/typescript/ai-components/voice-visualization/VoiceVisualizationView.d.ts +26 -0
  319. package/lib/typescript/ai-components/voice-visualization/VoiceVisualizationView.d.ts.map +1 -0
  320. package/lib/typescript/ai-components/voice-visualization/VoiceWave.d.ts +13 -0
  321. package/lib/typescript/ai-components/voice-visualization/VoiceWave.d.ts.map +1 -0
  322. package/lib/typescript/ai-components/voice-visualization/bounce.d.ts +20 -0
  323. package/lib/typescript/ai-components/voice-visualization/bounce.d.ts.map +1 -0
  324. package/lib/typescript/ai-components/voice-visualization/driver.d.ts +96 -0
  325. package/lib/typescript/ai-components/voice-visualization/driver.d.ts.map +1 -0
  326. package/lib/typescript/ai-components/voice-visualization/glowShader.d.ts +7 -0
  327. package/lib/typescript/ai-components/voice-visualization/glowShader.d.ts.map +1 -0
  328. package/lib/typescript/ai-components/voice-visualization/index.d.ts +4 -0
  329. package/lib/typescript/ai-components/voice-visualization/index.d.ts.map +1 -0
  330. package/lib/typescript/ai-components/voice-visualization/math.d.ts +26 -0
  331. package/lib/typescript/ai-components/voice-visualization/math.d.ts.map +1 -0
  332. package/lib/typescript/ai-components/voice-visualization/palette.d.ts +18 -0
  333. package/lib/typescript/ai-components/voice-visualization/palette.d.ts.map +1 -0
  334. package/lib/typescript/ai-components/voice-visualization/simplex.d.ts +11 -0
  335. package/lib/typescript/ai-components/voice-visualization/simplex.d.ts.map +1 -0
  336. package/lib/typescript/ai-components/voice-visualization/styles.d.ts +24 -0
  337. package/lib/typescript/ai-components/voice-visualization/styles.d.ts.map +1 -0
  338. package/lib/typescript/ai-components/voice-visualization/types.d.ts +45 -0
  339. package/lib/typescript/ai-components/voice-visualization/types.d.ts.map +1 -0
  340. package/lib/typescript/ai-components/voice-visualization/useReduceMotion.d.ts +10 -0
  341. package/lib/typescript/ai-components/voice-visualization/useReduceMotion.d.ts.map +1 -0
  342. package/lib/typescript/ai-components/voice-visualization/useVoiceVisualization.d.ts +18 -0
  343. package/lib/typescript/ai-components/voice-visualization/useVoiceVisualization.d.ts.map +1 -0
  344. package/lib/typescript/ai-components/voice-visualization/waveGeometry.d.ts +25 -0
  345. package/lib/typescript/ai-components/voice-visualization/waveGeometry.d.ts.map +1 -0
  346. package/lib/typescript/components/Channel/hooks/useChannelLifecycle.d.ts.map +1 -1
  347. package/lib/typescript/components/ChannelList/ChannelListView.d.ts +1 -1
  348. package/lib/typescript/components/ChannelList/ChannelListView.d.ts.map +1 -1
  349. package/lib/typescript/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.d.ts.map +1 -1
  350. package/lib/typescript/components/ChannelPreview/hooks/useChannelPreviewData.d.ts.map +1 -1
  351. package/lib/typescript/components/Chat/hooks/useConnectionLifecycle.d.ts +5 -4
  352. package/lib/typescript/components/Chat/hooks/useConnectionLifecycle.d.ts.map +1 -1
  353. package/lib/typescript/components/Indicators/LoadingErrorIndicator.d.ts +1 -1
  354. package/lib/typescript/components/Indicators/LoadingErrorIndicator.d.ts.map +1 -1
  355. package/lib/typescript/components/Message/MessageItemView/MessageStatus.d.ts.map +1 -1
  356. package/lib/typescript/components/Message/MessageItemView/MessageWrapper.d.ts.map +1 -1
  357. package/lib/typescript/components/MessageInput/MessageComposer.d.ts.map +1 -1
  358. package/lib/typescript/components/ThreadList/ThreadListUnreadBanner.d.ts.map +1 -1
  359. package/lib/typescript/components/index.d.ts +2 -0
  360. package/lib/typescript/components/index.d.ts.map +1 -1
  361. package/lib/typescript/contexts/componentsContext/defaultComponents.d.ts +0 -1
  362. package/lib/typescript/contexts/componentsContext/defaultComponents.d.ts.map +1 -1
  363. package/lib/typescript/hooks/index.d.ts +1 -0
  364. package/lib/typescript/hooks/index.d.ts.map +1 -1
  365. package/lib/typescript/hooks/messagePreview/useMessageDeliveryStatus.d.ts +3 -0
  366. package/lib/typescript/hooks/messagePreview/useMessageDeliveryStatus.d.ts.map +1 -1
  367. package/lib/typescript/i18n/keys.d.ts +3 -1
  368. package/lib/typescript/i18n/keys.d.ts.map +1 -1
  369. package/lib/typescript/i18n/runtimeDefaults.d.ts +1 -0
  370. package/lib/typescript/i18n/runtimeDefaults.d.ts.map +1 -1
  371. package/lib/typescript/store/apis/getChannelMessages.d.ts +2 -1
  372. package/lib/typescript/store/apis/getChannelMessages.d.ts.map +1 -1
  373. package/lib/typescript/store/apis/getChannels.d.ts +3 -1
  374. package/lib/typescript/store/apis/getChannels.d.ts.map +1 -1
  375. package/lib/typescript/store/apis/getChannelsForFilterSort.d.ts.map +1 -1
  376. package/lib/typescript/store/apis/queries/selectMessagesForChannels.d.ts +3 -1
  377. package/lib/typescript/store/apis/queries/selectMessagesForChannels.d.ts.map +1 -1
  378. package/lib/typescript/utils/installNativeMultipartAdapter.d.ts +5 -3
  379. package/lib/typescript/utils/installNativeMultipartAdapter.d.ts.map +1 -1
  380. package/package.json +4 -4
  381. package/src/__tests__/offline-support/offline-feature.tsx +7 -7
  382. package/src/__tests__/offline-support/optimistic-update.tsx +5 -5
  383. package/src/ai-components/README.md +50 -2
  384. package/src/ai-components/__tests__/VoiceVisualization.test.tsx +208 -0
  385. package/src/ai-components/__tests__/dictation.test.tsx +58 -1
  386. package/src/ai-components/__tests__/voiceDriver.test.ts +317 -0
  387. package/src/ai-components/__tests__/voicePalette.test.ts +124 -0
  388. package/src/ai-components/index.ts +3 -1
  389. package/src/ai-components/message-composer/ComposerView.tsx +6 -3
  390. package/src/ai-components/message-composer/SpeechToTextButton.tsx +5 -2
  391. package/src/ai-components/native/AIDictation.ts +11 -0
  392. package/src/ai-components/store/dictation/store.ts +9 -0
  393. package/src/ai-components/store/dictation/useDictationState.ts +2 -1
  394. package/src/ai-components/store/index.ts +2 -0
  395. package/src/ai-components/theme.ts +16 -0
  396. package/src/ai-components/transcription/useDictation.ts +16 -3
  397. package/src/ai-components/transcription/useDictationAudioLevel.ts +38 -0
  398. package/src/ai-components/voice-visualization/VoiceGlow.tsx +79 -0
  399. package/src/ai-components/voice-visualization/VoiceVisualizationView.tsx +179 -0
  400. package/src/ai-components/voice-visualization/VoiceWave.tsx +67 -0
  401. package/src/ai-components/voice-visualization/bounce.ts +61 -0
  402. package/src/ai-components/voice-visualization/driver.ts +240 -0
  403. package/src/ai-components/voice-visualization/glowShader.ts +227 -0
  404. package/src/ai-components/voice-visualization/index.ts +3 -0
  405. package/src/ai-components/voice-visualization/math.ts +73 -0
  406. package/src/ai-components/voice-visualization/palette.ts +59 -0
  407. package/src/ai-components/voice-visualization/simplex.ts +92 -0
  408. package/src/ai-components/voice-visualization/styles.ts +42 -0
  409. package/src/ai-components/voice-visualization/types.ts +44 -0
  410. package/src/ai-components/voice-visualization/useReduceMotion.ts +34 -0
  411. package/src/ai-components/voice-visualization/useVoiceVisualization.ts +153 -0
  412. package/src/ai-components/voice-visualization/waveGeometry.ts +137 -0
  413. package/src/components/Channel/__tests__/Channel.test.tsx +44 -5
  414. package/src/components/Channel/hooks/useChannelLifecycle.ts +4 -1
  415. package/src/components/ChannelDetails/__tests__/ChannelDetails.test.tsx +1 -1
  416. package/src/components/ChannelDetails/__tests__/ChannelDetailsActionsSection.test.tsx +1 -1
  417. package/src/components/ChannelDetails/__tests__/ChannelDetailsEditButton.test.tsx +1 -1
  418. package/src/components/ChannelDetails/__tests__/ChannelDetailsMemberSection.test.tsx +1 -1
  419. package/src/components/ChannelDetails/__tests__/ChannelDetailsNavHeader.test.tsx +1 -1
  420. package/src/components/ChannelDetails/__tests__/ChannelDetailsProfile.test.tsx +2 -2
  421. package/src/components/ChannelDetails/__tests__/ChannelEditDetailsForm.test.tsx +1 -1
  422. package/src/components/ChannelDetails/__tests__/ChannelEditDetailsFormContent.test.tsx +2 -2
  423. package/src/components/ChannelDetails/__tests__/ChannelEditName.test.tsx +1 -1
  424. package/src/components/ChannelDetails/__tests__/members/ChannelAddMembersForm.test.tsx +1 -1
  425. package/src/components/ChannelDetails/__tests__/members/ChannelMemberActionsSheet.test.tsx +2 -2
  426. package/src/components/ChannelDetails/__tests__/members/ChannelMemberItem.test.tsx +1 -1
  427. package/src/components/ChannelDetails/__tests__/useChannelDetailsMemberStatusText.test.tsx +1 -1
  428. package/src/components/ChannelDetails/components/members/ChannelMemberItem.tsx +1 -1
  429. package/src/components/ChannelDetails/hooks/useChannelDetailsMemberStatusText.ts +1 -1
  430. package/src/components/ChannelList/ChannelListView.tsx +1 -3
  431. package/src/components/ChannelList/__tests__/ChannelList.test.tsx +44 -0
  432. package/src/components/ChannelList/hooks/usePaginatedChannels.ts +1 -1
  433. package/src/components/ChannelPreview/ChannelDetailsBottomSheet.tsx +1 -1
  434. package/src/components/ChannelPreview/ChannelLastMessagePreview.tsx +1 -1
  435. package/src/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.tsx +8 -2
  436. package/src/components/ChannelPreview/ChannelPreviewTitle.tsx +1 -1
  437. package/src/components/ChannelPreview/ChannelPreviewView.tsx +1 -1
  438. package/src/components/ChannelPreview/__tests__/ChannelPreview.test.tsx +4 -4
  439. package/src/components/ChannelPreview/__tests__/ChannelPreviewView.test.tsx +40 -0
  440. package/src/components/ChannelPreview/hooks/__tests__/useChannelPreviewData.test.tsx +51 -0
  441. package/src/components/ChannelPreview/hooks/__tests__/useChannelPreviewDisplayName.test.tsx +1 -1
  442. package/src/components/ChannelPreview/hooks/__tests__/useChannelPreviewDisplayPresence.test.tsx +1 -1
  443. package/src/components/ChannelPreview/hooks/__tests__/useChannelPreviewPollLabel.test.tsx +87 -0
  444. package/src/components/ChannelPreview/hooks/useChannelPreviewData.ts +3 -4
  445. package/src/components/ChannelPreview/hooks/useChannelPreviewDisplayName.ts +1 -1
  446. package/src/components/ChannelPreview/hooks/useChannelPreviewDisplayPresence.ts +1 -1
  447. package/src/components/ChannelPreview/hooks/useChannelPreviewPollLabel.ts +1 -1
  448. package/src/components/Chat/__tests__/Chat.test.tsx +31 -1
  449. package/src/components/Chat/hooks/useConnectionLifecycle.ts +12 -6
  450. package/src/components/Indicators/LoadingErrorIndicator.tsx +8 -1
  451. package/src/components/Message/Message.tsx +1 -1
  452. package/src/components/Message/MessageItemView/MessageStatus.tsx +16 -2
  453. package/src/components/Message/MessageItemView/MessageWrapper.tsx +14 -4
  454. package/src/components/Message/MessageItemView/__tests__/MessageStatus.test.tsx +21 -0
  455. package/src/components/Message/hooks/__tests__/useCreateMessageActionHandlers.test.tsx +1 -1
  456. package/src/components/Message/hooks/__tests__/useUserMuteActive.test.tsx +1 -1
  457. package/src/components/Message/hooks/useCreateMessageActionHandlers.ts +3 -3
  458. package/src/components/Message/hooks/useProcessReactions.ts +2 -2
  459. package/src/components/Message/hooks/useUserMuteActive.ts +1 -1
  460. package/src/components/MessageInput/MessageComposer.tsx +4 -2
  461. package/src/components/MessageList/MessageFlashList.tsx +2 -2
  462. package/src/components/MessageList/MessageList.tsx +2 -2
  463. package/src/components/MessageList/__tests__/MessageList.test.tsx +26 -8
  464. package/src/components/MessageList/__tests__/ScrollToBottomButton.test.tsx +3 -3
  465. package/src/components/MessageList/hooks/useOwnUnreadCount.ts +1 -1
  466. package/src/components/MessageMenu/MessageUserReactionsItem.tsx +1 -1
  467. package/src/components/MessageMenu/hooks/useMessageOwnReactions.ts +2 -2
  468. package/src/components/Poll/components/PollAnswersList.tsx +1 -1
  469. package/src/components/Poll/components/PollButtons.tsx +1 -1
  470. package/src/components/Poll/hook/useIsPollCreatedByCurrentUser.ts +1 -1
  471. package/src/components/Thread/Thread.tsx +1 -1
  472. package/src/components/Thread/__tests__/Thread.test.tsx +4 -2
  473. package/src/components/ThreadList/ThreadListItem.tsx +1 -1
  474. package/src/components/ThreadList/ThreadListUnreadBanner.tsx +6 -2
  475. package/src/components/ThreadList/__tests__/ThreadList.test.tsx +21 -0
  476. package/src/components/index.ts +2 -0
  477. package/src/contexts/componentsContext/defaultComponents.ts +0 -2
  478. package/src/contexts/liveLocationManagerContext/LiveLocationManagerContext.tsx +1 -1
  479. package/src/hooks/__tests__/useChannelMuteActive.test.tsx +1 -1
  480. package/src/hooks/__tests__/useIsDirectChat.test.tsx +1 -1
  481. package/src/hooks/actions/__tests__/useChannelActionItems.test.tsx +1 -1
  482. package/src/hooks/actions/__tests__/useChannelActions.test.tsx +1 -1
  483. package/src/hooks/actions/__tests__/useChannelMemberActionItems.test.tsx +6 -6
  484. package/src/hooks/actions/useChannelActionItems.tsx +1 -1
  485. package/src/hooks/actions/useChannelActions.ts +2 -2
  486. package/src/hooks/actions/useChannelMemberActionItems.tsx +1 -1
  487. package/src/hooks/index.ts +1 -0
  488. package/src/hooks/messagePreview/__tests__/useMessageDeliveryStatus.test.tsx +57 -32
  489. package/src/hooks/messagePreview/useMessageDeliveryStatus.ts +13 -7
  490. package/src/hooks/useIsDirectChat.ts +1 -1
  491. package/src/i18n/__tests__/catalog.fixture.json +2 -0
  492. package/src/i18n/keys.ts +3 -0
  493. package/src/i18n/runtimeDefaults.ts +1 -0
  494. package/src/store/__tests__/selectMessagesForChannels.test.ts +34 -12
  495. package/src/store/apis/getChannelMessages.ts +4 -1
  496. package/src/store/apis/getChannels.ts +5 -1
  497. package/src/store/apis/getChannelsForFilterSort.ts +1 -0
  498. package/src/store/apis/queries/selectMessagesForChannels.ts +7 -2
  499. package/src/utils/installNativeMultipartAdapter.ts +5 -3
  500. 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.userID && member.user?.online,
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 <Text style={styles.username}>{message?.user?.name || message?.user?.id}:</Text>;
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}>{t('common.you.label', 'You')}:</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('attachment.gallery.doubleTapToOpen.accessibilityLabel');
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.userID as string, 10);
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.userID as string, 10);
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.userID as string, 5);
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.userID as string, 0);
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: { userID: OWN_USER_ID } }) as unknown as ChatContextValue,
27
+ () => ({ client: { userId: OWN_USER_ID } }) as unknown as ChatContextValue,
28
28
  );
29
29
  jest.spyOn(useChannelNameModule, 'useChannelName').mockReturnValue(undefined);
30
30
  });
@@ -18,7 +18,7 @@ describe('useChannelPreviewDisplayPresence', () => {
18
18
  jest.clearAllMocks();
19
19
  chatClient = await getTestClientWithUser({
20
20
  id: currentUserId,
21
- userID: currentUserId,
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.userID;
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?.userID;
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.userID);
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
- .map((votes) => votes?.[0])
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 type { StreamChat } from 'stream-chat';
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 and closes the WebSocket while the app
13
- * is in the background, reopening it in the foreground (push notifications are only delivered while
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.userID) {
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.userID) return;
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.userID === message.user?.id;
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 stroke={styles.sendingCheck.color} height={16} width={16} {...timeIcon} />
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 stroke={styles.sentCheck.color} height={16} width={16} {...checkIcon} />
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.userID;
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 (snapshot.firstUnreadMessageId) {
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
- [createdAtTimestamp, messageId, nextMessageCreatedAt, nextMessageId, nextMessageIsOwn],
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.userID === message.user?.id && !!myMessageTheme;
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
- userID: 'current-user-id',
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
- userID: 'current-user-id',
16
+ userId: 'current-user-id',
17
17
  }) as unknown as StreamChat;
18
18
 
19
19
  describe('useUserMuteActive', () => {