stream-chat-react-native-core 9.1.3 → 9.2.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/lib/commonjs/a11y/a11yUtils.js +40 -0
  2. package/lib/commonjs/a11y/a11yUtils.js.map +1 -0
  3. package/lib/commonjs/a11y/hooks/useA11yLabel.js +15 -0
  4. package/lib/commonjs/a11y/hooks/useA11yLabel.js.map +1 -0
  5. package/lib/commonjs/a11y/hooks/useAnnounceOnStateChange.js +36 -0
  6. package/lib/commonjs/a11y/hooks/useAnnounceOnStateChange.js.map +1 -0
  7. package/lib/commonjs/a11y/hooks/useReducedMotionPreference.js +34 -0
  8. package/lib/commonjs/a11y/hooks/useReducedMotionPreference.js.map +1 -0
  9. package/lib/commonjs/a11y/hooks/useResolvedModalAccessibilityProps.js +20 -0
  10. package/lib/commonjs/a11y/hooks/useResolvedModalAccessibilityProps.js.map +1 -0
  11. package/lib/commonjs/a11y/hooks/useScreenReaderEnabled.js +37 -0
  12. package/lib/commonjs/a11y/hooks/useScreenReaderEnabled.js.map +1 -0
  13. package/lib/commonjs/a11y/index.js +70 -0
  14. package/lib/commonjs/a11y/index.js.map +1 -0
  15. package/lib/commonjs/components/AITypingIndicatorView/AITypingIndicatorView.js +10 -0
  16. package/lib/commonjs/components/AITypingIndicatorView/AITypingIndicatorView.js.map +1 -1
  17. package/lib/commonjs/components/Accessibility/NotificationAnnouncer.js +37 -0
  18. package/lib/commonjs/components/Accessibility/NotificationAnnouncer.js.map +1 -0
  19. package/lib/commonjs/components/Accessibility/hooks/useIncomingMessageAnnouncements.js +109 -0
  20. package/lib/commonjs/components/Accessibility/hooks/useIncomingMessageAnnouncements.js.map +1 -0
  21. package/lib/commonjs/components/Accessibility/index.js +37 -0
  22. package/lib/commonjs/components/Accessibility/index.js.map +1 -0
  23. package/lib/commonjs/components/Accessibility/useAccessibilityAnnouncer.js +15 -0
  24. package/lib/commonjs/components/Accessibility/useAccessibilityAnnouncer.js.map +1 -0
  25. package/lib/commonjs/components/Channel/Channel.js +2 -1
  26. package/lib/commonjs/components/Channel/Channel.js.map +1 -1
  27. package/lib/commonjs/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js +4 -0
  28. package/lib/commonjs/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js.map +1 -1
  29. package/lib/commonjs/components/Indicators/LoadingDots.js +2 -0
  30. package/lib/commonjs/components/Indicators/LoadingDots.js.map +1 -1
  31. package/lib/commonjs/components/Indicators/LoadingErrorIndicator.js +3 -0
  32. package/lib/commonjs/components/Indicators/LoadingErrorIndicator.js.map +1 -1
  33. package/lib/commonjs/components/Indicators/LoadingIndicator.js +2 -0
  34. package/lib/commonjs/components/Indicators/LoadingIndicator.js.map +1 -1
  35. package/lib/commonjs/components/MessageList/MessageList.js +13 -6
  36. package/lib/commonjs/components/MessageList/MessageList.js.map +1 -1
  37. package/lib/commonjs/components/MessageList/ScrollToBottomButton.js +5 -0
  38. package/lib/commonjs/components/MessageList/ScrollToBottomButton.js.map +1 -1
  39. package/lib/commonjs/components/MessageMenu/MessageActionList.js +4 -1
  40. package/lib/commonjs/components/MessageMenu/MessageActionList.js.map +1 -1
  41. package/lib/commonjs/components/MessageMenu/MessageActionListItem.js +1 -0
  42. package/lib/commonjs/components/MessageMenu/MessageActionListItem.js.map +1 -1
  43. package/lib/commonjs/components/MessageMenu/MessageReactionPicker.js +1 -0
  44. package/lib/commonjs/components/MessageMenu/MessageReactionPicker.js.map +1 -1
  45. package/lib/commonjs/components/MessageMenu/ReactionButton.js +6 -1
  46. package/lib/commonjs/components/MessageMenu/ReactionButton.js.map +1 -1
  47. package/lib/commonjs/components/Poll/components/PollOption.js +15 -0
  48. package/lib/commonjs/components/Poll/components/PollOption.js.map +1 -1
  49. package/lib/commonjs/components/ProgressControl/ProgressControl.js +10 -0
  50. package/lib/commonjs/components/ProgressControl/ProgressControl.js.map +1 -1
  51. package/lib/commonjs/components/Reply/Reply.js +2 -0
  52. package/lib/commonjs/components/Reply/Reply.js.map +1 -1
  53. package/lib/commonjs/components/UIComponents/BottomSheetModal.js +6 -3
  54. package/lib/commonjs/components/UIComponents/BottomSheetModal.js.map +1 -1
  55. package/lib/commonjs/components/index.js +11 -0
  56. package/lib/commonjs/components/index.js.map +1 -1
  57. package/lib/commonjs/components/ui/Avatar/Avatar.js +14 -2
  58. package/lib/commonjs/components/ui/Avatar/Avatar.js.map +1 -1
  59. package/lib/commonjs/components/ui/Avatar/ChannelAvatar.js +3 -1
  60. package/lib/commonjs/components/ui/Avatar/ChannelAvatar.js.map +1 -1
  61. package/lib/commonjs/components/ui/Avatar/UserAvatar.js +1 -0
  62. package/lib/commonjs/components/ui/Avatar/UserAvatar.js.map +1 -1
  63. package/lib/commonjs/components/ui/Button/Button.js +49 -19
  64. package/lib/commonjs/components/ui/Button/Button.js.map +1 -1
  65. package/lib/commonjs/components/ui/Input/Input.js +63 -21
  66. package/lib/commonjs/components/ui/Input/Input.js.map +1 -1
  67. package/lib/commonjs/contexts/accessibilityContext/AccessibilityContext.js +114 -0
  68. package/lib/commonjs/contexts/accessibilityContext/AccessibilityContext.js.map +1 -0
  69. package/lib/commonjs/contexts/accessibilityContext/index.js +15 -0
  70. package/lib/commonjs/contexts/accessibilityContext/index.js.map +1 -0
  71. package/lib/commonjs/contexts/index.js +11 -0
  72. package/lib/commonjs/contexts/index.js.map +1 -1
  73. package/lib/commonjs/contexts/overlayContext/OverlayContext.js.map +1 -1
  74. package/lib/commonjs/contexts/overlayContext/OverlayProvider.js +19 -14
  75. package/lib/commonjs/contexts/overlayContext/OverlayProvider.js.map +1 -1
  76. package/lib/commonjs/hooks/index.js +11 -0
  77. package/lib/commonjs/hooks/index.js.map +1 -1
  78. package/lib/commonjs/i18n/en.json +23 -1
  79. package/lib/commonjs/i18n/es.json +23 -1
  80. package/lib/commonjs/i18n/fr.json +23 -1
  81. package/lib/commonjs/i18n/he.json +23 -1
  82. package/lib/commonjs/i18n/hi.json +23 -1
  83. package/lib/commonjs/i18n/it.json +23 -1
  84. package/lib/commonjs/i18n/ja.json +23 -1
  85. package/lib/commonjs/i18n/ko.json +23 -1
  86. package/lib/commonjs/i18n/nl.json +23 -1
  87. package/lib/commonjs/i18n/pt-br.json +23 -1
  88. package/lib/commonjs/i18n/ru.json +23 -1
  89. package/lib/commonjs/i18n/tr.json +23 -1
  90. package/lib/commonjs/version.json +1 -1
  91. package/lib/module/a11y/a11yUtils.js +40 -0
  92. package/lib/module/a11y/a11yUtils.js.map +1 -0
  93. package/lib/module/a11y/hooks/useA11yLabel.js +15 -0
  94. package/lib/module/a11y/hooks/useA11yLabel.js.map +1 -0
  95. package/lib/module/a11y/hooks/useAnnounceOnStateChange.js +36 -0
  96. package/lib/module/a11y/hooks/useAnnounceOnStateChange.js.map +1 -0
  97. package/lib/module/a11y/hooks/useReducedMotionPreference.js +34 -0
  98. package/lib/module/a11y/hooks/useReducedMotionPreference.js.map +1 -0
  99. package/lib/module/a11y/hooks/useResolvedModalAccessibilityProps.js +20 -0
  100. package/lib/module/a11y/hooks/useResolvedModalAccessibilityProps.js.map +1 -0
  101. package/lib/module/a11y/hooks/useScreenReaderEnabled.js +37 -0
  102. package/lib/module/a11y/hooks/useScreenReaderEnabled.js.map +1 -0
  103. package/lib/module/a11y/index.js +70 -0
  104. package/lib/module/a11y/index.js.map +1 -0
  105. package/lib/module/components/AITypingIndicatorView/AITypingIndicatorView.js +10 -0
  106. package/lib/module/components/AITypingIndicatorView/AITypingIndicatorView.js.map +1 -1
  107. package/lib/module/components/Accessibility/NotificationAnnouncer.js +37 -0
  108. package/lib/module/components/Accessibility/NotificationAnnouncer.js.map +1 -0
  109. package/lib/module/components/Accessibility/hooks/useIncomingMessageAnnouncements.js +109 -0
  110. package/lib/module/components/Accessibility/hooks/useIncomingMessageAnnouncements.js.map +1 -0
  111. package/lib/module/components/Accessibility/index.js +37 -0
  112. package/lib/module/components/Accessibility/index.js.map +1 -0
  113. package/lib/module/components/Accessibility/useAccessibilityAnnouncer.js +15 -0
  114. package/lib/module/components/Accessibility/useAccessibilityAnnouncer.js.map +1 -0
  115. package/lib/module/components/Channel/Channel.js +2 -1
  116. package/lib/module/components/Channel/Channel.js.map +1 -1
  117. package/lib/module/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js +4 -0
  118. package/lib/module/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js.map +1 -1
  119. package/lib/module/components/Indicators/LoadingDots.js +2 -0
  120. package/lib/module/components/Indicators/LoadingDots.js.map +1 -1
  121. package/lib/module/components/Indicators/LoadingErrorIndicator.js +3 -0
  122. package/lib/module/components/Indicators/LoadingErrorIndicator.js.map +1 -1
  123. package/lib/module/components/Indicators/LoadingIndicator.js +2 -0
  124. package/lib/module/components/Indicators/LoadingIndicator.js.map +1 -1
  125. package/lib/module/components/MessageList/MessageList.js +13 -6
  126. package/lib/module/components/MessageList/MessageList.js.map +1 -1
  127. package/lib/module/components/MessageList/ScrollToBottomButton.js +5 -0
  128. package/lib/module/components/MessageList/ScrollToBottomButton.js.map +1 -1
  129. package/lib/module/components/MessageMenu/MessageActionList.js +4 -1
  130. package/lib/module/components/MessageMenu/MessageActionList.js.map +1 -1
  131. package/lib/module/components/MessageMenu/MessageActionListItem.js +1 -0
  132. package/lib/module/components/MessageMenu/MessageActionListItem.js.map +1 -1
  133. package/lib/module/components/MessageMenu/MessageReactionPicker.js +1 -0
  134. package/lib/module/components/MessageMenu/MessageReactionPicker.js.map +1 -1
  135. package/lib/module/components/MessageMenu/ReactionButton.js +6 -1
  136. package/lib/module/components/MessageMenu/ReactionButton.js.map +1 -1
  137. package/lib/module/components/Poll/components/PollOption.js +15 -0
  138. package/lib/module/components/Poll/components/PollOption.js.map +1 -1
  139. package/lib/module/components/ProgressControl/ProgressControl.js +10 -0
  140. package/lib/module/components/ProgressControl/ProgressControl.js.map +1 -1
  141. package/lib/module/components/Reply/Reply.js +2 -0
  142. package/lib/module/components/Reply/Reply.js.map +1 -1
  143. package/lib/module/components/UIComponents/BottomSheetModal.js +6 -3
  144. package/lib/module/components/UIComponents/BottomSheetModal.js.map +1 -1
  145. package/lib/module/components/index.js +11 -0
  146. package/lib/module/components/index.js.map +1 -1
  147. package/lib/module/components/ui/Avatar/Avatar.js +14 -2
  148. package/lib/module/components/ui/Avatar/Avatar.js.map +1 -1
  149. package/lib/module/components/ui/Avatar/ChannelAvatar.js +3 -1
  150. package/lib/module/components/ui/Avatar/ChannelAvatar.js.map +1 -1
  151. package/lib/module/components/ui/Avatar/UserAvatar.js +1 -0
  152. package/lib/module/components/ui/Avatar/UserAvatar.js.map +1 -1
  153. package/lib/module/components/ui/Button/Button.js +49 -19
  154. package/lib/module/components/ui/Button/Button.js.map +1 -1
  155. package/lib/module/components/ui/Input/Input.js +63 -21
  156. package/lib/module/components/ui/Input/Input.js.map +1 -1
  157. package/lib/module/contexts/accessibilityContext/AccessibilityContext.js +114 -0
  158. package/lib/module/contexts/accessibilityContext/AccessibilityContext.js.map +1 -0
  159. package/lib/module/contexts/accessibilityContext/index.js +15 -0
  160. package/lib/module/contexts/accessibilityContext/index.js.map +1 -0
  161. package/lib/module/contexts/index.js +11 -0
  162. package/lib/module/contexts/index.js.map +1 -1
  163. package/lib/module/contexts/overlayContext/OverlayContext.js.map +1 -1
  164. package/lib/module/contexts/overlayContext/OverlayProvider.js +19 -14
  165. package/lib/module/contexts/overlayContext/OverlayProvider.js.map +1 -1
  166. package/lib/module/hooks/index.js +11 -0
  167. package/lib/module/hooks/index.js.map +1 -1
  168. package/lib/module/i18n/en.json +23 -1
  169. package/lib/module/i18n/es.json +23 -1
  170. package/lib/module/i18n/fr.json +23 -1
  171. package/lib/module/i18n/he.json +23 -1
  172. package/lib/module/i18n/hi.json +23 -1
  173. package/lib/module/i18n/it.json +23 -1
  174. package/lib/module/i18n/ja.json +23 -1
  175. package/lib/module/i18n/ko.json +23 -1
  176. package/lib/module/i18n/nl.json +23 -1
  177. package/lib/module/i18n/pt-br.json +23 -1
  178. package/lib/module/i18n/ru.json +23 -1
  179. package/lib/module/i18n/tr.json +23 -1
  180. package/lib/module/version.json +1 -1
  181. package/lib/typescript/a11y/a11yUtils.d.ts +31 -0
  182. package/lib/typescript/a11y/a11yUtils.d.ts.map +1 -0
  183. package/lib/typescript/a11y/hooks/useA11yLabel.d.ts +12 -0
  184. package/lib/typescript/a11y/hooks/useA11yLabel.d.ts.map +1 -0
  185. package/lib/typescript/a11y/hooks/useAnnounceOnStateChange.d.ts +14 -0
  186. package/lib/typescript/a11y/hooks/useAnnounceOnStateChange.d.ts.map +1 -0
  187. package/lib/typescript/a11y/hooks/useReducedMotionPreference.d.ts +6 -0
  188. package/lib/typescript/a11y/hooks/useReducedMotionPreference.d.ts.map +1 -0
  189. package/lib/typescript/a11y/hooks/useResolvedModalAccessibilityProps.d.ts +18 -0
  190. package/lib/typescript/a11y/hooks/useResolvedModalAccessibilityProps.d.ts.map +1 -0
  191. package/lib/typescript/a11y/hooks/useScreenReaderEnabled.d.ts +10 -0
  192. package/lib/typescript/a11y/hooks/useScreenReaderEnabled.d.ts.map +1 -0
  193. package/lib/typescript/a11y/index.d.ts +7 -0
  194. package/lib/typescript/a11y/index.d.ts.map +1 -0
  195. package/lib/typescript/components/AITypingIndicatorView/AITypingIndicatorView.d.ts.map +1 -1
  196. package/lib/typescript/components/Accessibility/NotificationAnnouncer.d.ts +12 -0
  197. package/lib/typescript/components/Accessibility/NotificationAnnouncer.d.ts.map +1 -0
  198. package/lib/typescript/components/Accessibility/hooks/useIncomingMessageAnnouncements.d.ts +20 -0
  199. package/lib/typescript/components/Accessibility/hooks/useIncomingMessageAnnouncements.d.ts.map +1 -0
  200. package/lib/typescript/components/Accessibility/index.d.ts +4 -0
  201. package/lib/typescript/components/Accessibility/index.d.ts.map +1 -0
  202. package/lib/typescript/components/Accessibility/useAccessibilityAnnouncer.d.ts +15 -0
  203. package/lib/typescript/components/Accessibility/useAccessibilityAnnouncer.d.ts.map +1 -0
  204. package/lib/typescript/components/Channel/Channel.d.ts.map +1 -1
  205. package/lib/typescript/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.d.ts.map +1 -1
  206. package/lib/typescript/components/Indicators/LoadingDots.d.ts.map +1 -1
  207. package/lib/typescript/components/Indicators/LoadingErrorIndicator.d.ts.map +1 -1
  208. package/lib/typescript/components/MessageList/MessageList.d.ts.map +1 -1
  209. package/lib/typescript/components/MessageList/ScrollToBottomButton.d.ts.map +1 -1
  210. package/lib/typescript/components/MessageMenu/MessageActionList.d.ts.map +1 -1
  211. package/lib/typescript/components/MessageMenu/MessageActionListItem.d.ts.map +1 -1
  212. package/lib/typescript/components/MessageMenu/MessageReactionPicker.d.ts.map +1 -1
  213. package/lib/typescript/components/MessageMenu/ReactionButton.d.ts.map +1 -1
  214. package/lib/typescript/components/Poll/components/PollOption.d.ts.map +1 -1
  215. package/lib/typescript/components/ProgressControl/ProgressControl.d.ts.map +1 -1
  216. package/lib/typescript/components/Reply/Reply.d.ts.map +1 -1
  217. package/lib/typescript/components/UIComponents/BottomSheetModal.d.ts.map +1 -1
  218. package/lib/typescript/components/index.d.ts +1 -0
  219. package/lib/typescript/components/index.d.ts.map +1 -1
  220. package/lib/typescript/components/ui/Avatar/Avatar.d.ts +12 -1
  221. package/lib/typescript/components/ui/Avatar/Avatar.d.ts.map +1 -1
  222. package/lib/typescript/components/ui/Avatar/ChannelAvatar.d.ts.map +1 -1
  223. package/lib/typescript/components/ui/Avatar/UserAvatar.d.ts.map +1 -1
  224. package/lib/typescript/components/ui/Button/Button.d.ts.map +1 -1
  225. package/lib/typescript/components/ui/Input/Input.d.ts.map +1 -1
  226. package/lib/typescript/contexts/accessibilityContext/AccessibilityContext.d.ts +34 -0
  227. package/lib/typescript/contexts/accessibilityContext/AccessibilityContext.d.ts.map +1 -0
  228. package/lib/typescript/contexts/accessibilityContext/index.d.ts +2 -0
  229. package/lib/typescript/contexts/accessibilityContext/index.d.ts.map +1 -0
  230. package/lib/typescript/contexts/index.d.ts +1 -0
  231. package/lib/typescript/contexts/index.d.ts.map +1 -1
  232. package/lib/typescript/contexts/overlayContext/OverlayContext.d.ts +7 -0
  233. package/lib/typescript/contexts/overlayContext/OverlayContext.d.ts.map +1 -1
  234. package/lib/typescript/contexts/overlayContext/OverlayProvider.d.ts.map +1 -1
  235. package/lib/typescript/hooks/index.d.ts +1 -0
  236. package/lib/typescript/hooks/index.d.ts.map +1 -1
  237. package/lib/typescript/hooks/useTranslatedMessage.d.ts +2 -2
  238. package/lib/typescript/i18n/en.json +23 -1
  239. package/lib/typescript/i18n/es.json +23 -1
  240. package/lib/typescript/i18n/fr.json +23 -1
  241. package/lib/typescript/i18n/he.json +23 -1
  242. package/lib/typescript/i18n/hi.json +23 -1
  243. package/lib/typescript/i18n/it.json +23 -1
  244. package/lib/typescript/i18n/ja.json +23 -1
  245. package/lib/typescript/i18n/ko.json +23 -1
  246. package/lib/typescript/i18n/nl.json +23 -1
  247. package/lib/typescript/i18n/pt-br.json +23 -1
  248. package/lib/typescript/i18n/ru.json +23 -1
  249. package/lib/typescript/i18n/tr.json +23 -1
  250. package/lib/typescript/utils/i18n/Streami18n.d.ts +22 -0
  251. package/lib/typescript/utils/i18n/Streami18n.d.ts.map +1 -1
  252. package/package.json +1 -1
  253. package/src/a11y/__tests__/a11yUtils.test.ts +70 -0
  254. package/src/a11y/a11yUtils.ts +50 -0
  255. package/src/a11y/hooks/useA11yLabel.ts +19 -0
  256. package/src/a11y/hooks/useAnnounceOnStateChange.ts +47 -0
  257. package/src/a11y/hooks/useReducedMotionPreference.ts +38 -0
  258. package/src/a11y/hooks/useResolvedModalAccessibilityProps.ts +30 -0
  259. package/src/a11y/hooks/useScreenReaderEnabled.ts +44 -0
  260. package/src/a11y/index.ts +6 -0
  261. package/src/components/AITypingIndicatorView/AITypingIndicatorView.tsx +17 -2
  262. package/src/components/AITypingIndicatorView/__tests__/AITypingIndicatorView.test.tsx +73 -0
  263. package/src/components/Accessibility/NotificationAnnouncer.tsx +43 -0
  264. package/src/components/Accessibility/__tests__/AccessibilityAnnouncer.test.tsx +75 -0
  265. package/src/components/Accessibility/hooks/useIncomingMessageAnnouncements.ts +157 -0
  266. package/src/components/Accessibility/index.ts +3 -0
  267. package/src/components/Accessibility/useAccessibilityAnnouncer.ts +30 -0
  268. package/src/components/Channel/Channel.tsx +3 -0
  269. package/src/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.tsx +14 -1
  270. package/src/components/Indicators/LoadingDots.tsx +5 -1
  271. package/src/components/Indicators/LoadingErrorIndicator.tsx +7 -1
  272. package/src/components/Indicators/LoadingIndicator.tsx +1 -1
  273. package/src/components/Message/MessageItemView/__tests__/__snapshots__/MessageAuthor.test.tsx.snap +2 -0
  274. package/src/components/MessageInput/__tests__/__snapshots__/AttachButton.test.tsx.snap +30 -15
  275. package/src/components/MessageInput/__tests__/__snapshots__/SendButton.test.tsx.snap +20 -10
  276. package/src/components/MessageList/MessageList.tsx +9 -0
  277. package/src/components/MessageList/ScrollToBottomButton.tsx +6 -0
  278. package/src/components/MessageList/__tests__/__snapshots__/ScrollToBottomButton.test.tsx.snap +2 -1
  279. package/src/components/MessageList/__tests__/__snapshots__/TypingIndicator.test.tsx.snap +6 -0
  280. package/src/components/MessageMenu/MessageActionList.tsx +4 -1
  281. package/src/components/MessageMenu/MessageActionListItem.tsx +1 -0
  282. package/src/components/MessageMenu/MessageReactionPicker.tsx +1 -0
  283. package/src/components/MessageMenu/ReactionButton.tsx +9 -1
  284. package/src/components/Poll/components/PollOption.tsx +11 -0
  285. package/src/components/ProgressControl/ProgressControl.tsx +8 -0
  286. package/src/components/Reply/Reply.tsx +5 -1
  287. package/src/components/Thread/__tests__/__snapshots__/Thread.test.tsx.snap +20 -6
  288. package/src/components/UIComponents/BottomSheetModal.tsx +4 -0
  289. package/src/components/index.ts +2 -0
  290. package/src/components/ui/Avatar/Avatar.tsx +23 -2
  291. package/src/components/ui/Avatar/ChannelAvatar.tsx +3 -0
  292. package/src/components/ui/Avatar/UserAvatar.tsx +1 -0
  293. package/src/components/ui/Button/Button.tsx +24 -0
  294. package/src/components/ui/Input/Input.tsx +35 -0
  295. package/src/contexts/accessibilityContext/AccessibilityContext.tsx +165 -0
  296. package/src/contexts/accessibilityContext/__tests__/AccessibilityContext.test.tsx +65 -0
  297. package/src/contexts/accessibilityContext/index.ts +1 -0
  298. package/src/contexts/index.ts +1 -0
  299. package/src/contexts/overlayContext/OverlayContext.tsx +7 -0
  300. package/src/contexts/overlayContext/OverlayProvider.tsx +18 -14
  301. package/src/contexts/overlayContext/__tests__/OverlayProvider.test.tsx +51 -0
  302. package/src/hooks/index.ts +1 -0
  303. package/src/i18n/en.json +23 -1
  304. package/src/i18n/es.json +23 -1
  305. package/src/i18n/fr.json +23 -1
  306. package/src/i18n/he.json +23 -1
  307. package/src/i18n/hi.json +23 -1
  308. package/src/i18n/it.json +23 -1
  309. package/src/i18n/ja.json +23 -1
  310. package/src/i18n/ko.json +23 -1
  311. package/src/i18n/nl.json +23 -1
  312. package/src/i18n/pt-br.json +23 -1
  313. package/src/i18n/ru.json +23 -1
  314. package/src/i18n/tr.json +23 -1
  315. package/src/version.json +1 -1
@@ -0,0 +1,157 @@
1
+ import { useCallback, useEffect, useRef } from 'react';
2
+
3
+ import type { Channel, Event, MessageResponse } from 'stream-chat';
4
+
5
+ import { useAccessibilityContext } from '../../../contexts/accessibilityContext/AccessibilityContext';
6
+ import { useTranslationContext } from '../../../contexts/translationContext/TranslationContext';
7
+ import { useAccessibilityAnnouncer } from '../useAccessibilityAnnouncer';
8
+
9
+ const MESSAGE_ANNOUNCEMENT_THROTTLE_MS = 1000;
10
+
11
+ const isAnnounceableIncomingMessage = (message: MessageResponse, ownUserId?: string): boolean => {
12
+ const messageUserId = message.user?.id;
13
+ if (!message.id || !messageUserId || messageUserId === ownUserId) return false;
14
+ return (
15
+ message.type !== 'deleted' &&
16
+ message.type !== 'ephemeral' &&
17
+ message.type !== 'error' &&
18
+ message.type !== 'system' &&
19
+ message.status !== 'failed' &&
20
+ message.status !== 'sending'
21
+ );
22
+ };
23
+
24
+ const getSenderName = (
25
+ message: MessageResponse,
26
+ t: ReturnType<typeof useTranslationContext>['t'],
27
+ ) => message.user?.name?.trim() || message.user?.id || t('Anonymous');
28
+
29
+ export type UseIncomingMessageAnnouncementsParams = {
30
+ activeThreadId?: string;
31
+ channel?: Channel;
32
+ ownUserId?: string;
33
+ threadList?: boolean;
34
+ };
35
+
36
+ /**
37
+ * Mirrors stream-chat-react's `useIncomingMessageAnnouncements`:
38
+ * - 1 message → "New message from {{user}}"
39
+ * - >1 messages within throttle window → "{{count}} new messages"
40
+ * - Throttled to one announcement per second
41
+ * - Bounded `announcedMessageIds` set so a long-running session does not leak.
42
+ *
43
+ * Subscribes to `channel.on('message.new')`. When AccessibilityContext.enabled
44
+ * is false OR `announceNewMessages` is false, the hook is a no-op (no
45
+ * subscription is opened, no listener cost is paid).
46
+ */
47
+ export const useIncomingMessageAnnouncements = ({
48
+ activeThreadId,
49
+ channel,
50
+ ownUserId,
51
+ threadList = false,
52
+ }: UseIncomingMessageAnnouncementsParams) => {
53
+ const { announceNewMessages, enabled } = useAccessibilityContext();
54
+ const announce = useAccessibilityAnnouncer();
55
+ const { t } = useTranslationContext();
56
+ const lastAnnouncementTimestampRef = useRef(0);
57
+ const flushTimeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);
58
+ const announcedMessageIdsRef = useRef(new Set<string>());
59
+ const pendingAnnouncementBatchRef = useRef<{ count: number; firstSender: string | null }>({
60
+ count: 0,
61
+ firstSender: null,
62
+ });
63
+
64
+ const flushPendingAnnouncements = useCallback(() => {
65
+ const pending = pendingAnnouncementBatchRef.current;
66
+ if (pending.count <= 0) return;
67
+
68
+ if (pending.count === 1) {
69
+ announce(
70
+ t('a11y/New message from {{user}}', {
71
+ user: pending.firstSender || t('Anonymous'),
72
+ }),
73
+ );
74
+ } else {
75
+ announce(t('a11y/{{count}} new messages', { count: pending.count }));
76
+ }
77
+
78
+ pending.count = 0;
79
+ pending.firstSender = null;
80
+ lastAnnouncementTimestampRef.current = Date.now();
81
+ }, [announce, t]);
82
+
83
+ const scheduleFlush = useCallback(() => {
84
+ if (flushTimeoutRef.current) return;
85
+ const now = Date.now();
86
+ const elapsed = now - lastAnnouncementTimestampRef.current;
87
+ if (elapsed >= MESSAGE_ANNOUNCEMENT_THROTTLE_MS) {
88
+ flushPendingAnnouncements();
89
+ return;
90
+ }
91
+ flushTimeoutRef.current = setTimeout(() => {
92
+ flushTimeoutRef.current = undefined;
93
+ flushPendingAnnouncements();
94
+ }, MESSAGE_ANNOUNCEMENT_THROTTLE_MS - elapsed);
95
+ }, [flushPendingAnnouncements]);
96
+
97
+ useEffect(
98
+ () => () => {
99
+ if (flushTimeoutRef.current) clearTimeout(flushTimeoutRef.current);
100
+ },
101
+ [],
102
+ );
103
+
104
+ useEffect(() => {
105
+ if (!enabled || !announceNewMessages || !channel) return;
106
+
107
+ const handleMessageNew = (event: Event) => {
108
+ const message = event.message;
109
+ if (!message) return;
110
+ if (
111
+ (event.cid && event.cid !== channel.cid) ||
112
+ !isAnnounceableIncomingMessage(message, ownUserId)
113
+ ) {
114
+ return;
115
+ }
116
+
117
+ const isReply = !!message.parent_id;
118
+ const belongsToActiveThread = !!activeThreadId && message.parent_id === activeThreadId;
119
+ const shouldAnnounceInThreadList = threadList && belongsToActiveThread;
120
+ const shouldAnnounceInMainList = !threadList && !isReply;
121
+ if (!shouldAnnounceInThreadList && !shouldAnnounceInMainList) return;
122
+
123
+ if (announcedMessageIdsRef.current.has(message.id || '')) return;
124
+ if (message.id) {
125
+ if (announcedMessageIdsRef.current.size > 500) {
126
+ announcedMessageIdsRef.current.clear();
127
+ }
128
+ announcedMessageIdsRef.current.add(message.id);
129
+ }
130
+
131
+ pendingAnnouncementBatchRef.current.count += 1;
132
+ if (!pendingAnnouncementBatchRef.current.firstSender) {
133
+ pendingAnnouncementBatchRef.current.firstSender = getSenderName(message, t);
134
+ }
135
+
136
+ scheduleFlush();
137
+ };
138
+
139
+ const subscription = channel.on('message.new', handleMessageNew);
140
+ return () => {
141
+ subscription.unsubscribe();
142
+ if (flushTimeoutRef.current) {
143
+ clearTimeout(flushTimeoutRef.current);
144
+ flushTimeoutRef.current = undefined;
145
+ }
146
+ };
147
+ }, [
148
+ activeThreadId,
149
+ announceNewMessages,
150
+ channel,
151
+ enabled,
152
+ ownUserId,
153
+ scheduleFlush,
154
+ t,
155
+ threadList,
156
+ ]);
157
+ };
@@ -0,0 +1,3 @@
1
+ export * from './NotificationAnnouncer';
2
+ export * from './useAccessibilityAnnouncer';
3
+ export * from './hooks/useIncomingMessageAnnouncements';
@@ -0,0 +1,30 @@
1
+ import { createContext, useContext } from 'react';
2
+
3
+ export type AccessibilityAnnouncePriority = 'assertive' | 'polite';
4
+ export type AccessibilityAnnounce = (
5
+ message: string,
6
+ priority?: AccessibilityAnnouncePriority,
7
+ ) => void;
8
+
9
+ export type AccessibilityAnnouncerContextValue = {
10
+ announce: AccessibilityAnnounce;
11
+ };
12
+
13
+ const noopAnnounce: AccessibilityAnnounce = () => undefined;
14
+
15
+ export const AccessibilityAnnouncerContext = createContext<
16
+ AccessibilityAnnouncerContextValue | undefined
17
+ >(undefined);
18
+
19
+ /**
20
+ * Returns the imperative announcer. When called outside the AccessibilityProvider's
21
+ * announcer context (which happens any time the SDK's a11y is disabled), this
22
+ * returns a no-op.
23
+ *
24
+ * Mirrors the React SDK's `useAriaLiveAnnouncer` so cross-SDK code reads the same.
25
+ */
26
+ export const useAccessibilityAnnouncer = (): AccessibilityAnnounce => {
27
+ const contextValue = useContext(AccessibilityAnnouncerContext);
28
+ if (!contextValue) return noopAnnounce;
29
+ return contextValue.announce;
30
+ };
@@ -49,6 +49,7 @@ import {
49
49
  AudioPlayerContextProps,
50
50
  AudioPlayerProvider,
51
51
  } from '../../contexts/audioPlayerContext/AudioPlayerContext';
52
+
52
53
  import { ChannelContextValue, ChannelProvider } from '../../contexts/channelContext/ChannelContext';
53
54
  import type { UseChannelStateValue } from '../../contexts/channelsStateContext/useChannelState';
54
55
  import { useChannelState } from '../../contexts/channelsStateContext/useChannelState';
@@ -111,6 +112,7 @@ import {
111
112
  MessageStatusTypes,
112
113
  ReactionData,
113
114
  } from '../../utils/utils';
115
+ import { NotificationAnnouncer } from '../Accessibility/NotificationAnnouncer';
114
116
  import { AttachmentPicker } from '../AttachmentPicker/AttachmentPicker';
115
117
  import type { KeyboardCompatibleViewProps } from '../KeyboardCompatibleView/KeyboardControllerAvoidingView';
116
118
  import { Emoji } from '../MessageMenu/EmojiPickerList';
@@ -1754,6 +1756,7 @@ const ChannelWithContext = (props: PropsWithChildren<ChannelPropsWithContext>) =
1754
1756
  <MessageComposerProvider value={messageComposerContext}>
1755
1757
  <MessageInputProvider value={inputMessageInputContext}>
1756
1758
  <AudioPlayerProvider value={audioPlayerContext}>
1759
+ <NotificationAnnouncer />
1757
1760
  <View style={{ height: '100%' }}>{children}</View>
1758
1761
  <AttachmentPicker />
1759
1762
  </AudioPlayerProvider>
@@ -5,6 +5,7 @@ import { LocalMessage, MessageResponse } from 'stream-chat';
5
5
 
6
6
  import { ChannelPreviewProps } from './ChannelPreview';
7
7
 
8
+ import { useA11yLabel } from '../../a11y/hooks/useA11yLabel';
8
9
  import { useChatContext } from '../../contexts/chatContext/ChatContext';
9
10
  import { useTheme } from '../../contexts/themeContext/ThemeContext';
10
11
  import { useTranslationContext } from '../../contexts/translationContext/TranslationContext';
@@ -61,6 +62,18 @@ export const ChannelMessagePreviewDeliveryStatus = ({
61
62
  isReadEventsEnabled: readEvents,
62
63
  });
63
64
 
65
+ const statusLabel = useA11yLabel(
66
+ message.status === MessageStatusTypes.SENDING
67
+ ? 'a11y/Sending'
68
+ : message.status === MessageStatusTypes.RECEIVED && status === MessageDeliveryStatus.READ
69
+ ? 'a11y/Read'
70
+ : status === MessageDeliveryStatus.DELIVERED
71
+ ? 'a11y/Delivered'
72
+ : status === MessageDeliveryStatus.SENT
73
+ ? 'a11y/Sent'
74
+ : 'a11y/Sending',
75
+ );
76
+
64
77
  if (!channel.data?.name && membersWithoutSelf.length === 1 && !isLastMessageByCurrentUser) {
65
78
  return null;
66
79
  }
@@ -70,7 +83,7 @@ export const ChannelMessagePreviewDeliveryStatus = ({
70
83
  }
71
84
 
72
85
  return (
73
- <View style={styles.container}>
86
+ <View accessibilityLabel={statusLabel} accessibilityRole='text' style={styles.container}>
74
87
  {message.status === MessageStatusTypes.SENDING ? (
75
88
  <Time stroke={semantics.chatTextTimestamp} height={16} width={16} {...timeIcon} />
76
89
  ) : message.status === MessageStatusTypes.RECEIVED &&
@@ -31,7 +31,11 @@ export const LoadingDots = (props: Props) => {
31
31
  const offsetLength = duration / numberOfDots;
32
32
 
33
33
  return (
34
- <View style={[{ flexDirection: 'row' }, container, style]}>
34
+ <View
35
+ accessibilityElementsHidden
36
+ importantForAccessibility='no-hide-descendants'
37
+ style={[{ flexDirection: 'row' }, container, style]}
38
+ >
35
39
  {Array.from(Array(numberOfDots)).map((_item, index) => (
36
40
  <LoadingDot
37
41
  diameter={diameter}
@@ -16,7 +16,13 @@ const LoadingErrorWrapper = (props: React.PropsWithChildren<LoadingErrorWrapperP
16
16
  const styles = useStyles();
17
17
 
18
18
  return (
19
- <TouchableOpacity onPress={onPress} style={styles.container}>
19
+ <TouchableOpacity
20
+ accessibilityHint={onPress ? 'Tap to retry' : undefined}
21
+ accessibilityLiveRegion='assertive'
22
+ accessibilityRole={onPress ? 'button' : 'alert'}
23
+ onPress={onPress}
24
+ style={styles.container}
25
+ >
20
26
  <Text style={styles.errorText} testID='loading-error'>
21
27
  {text}
22
28
  </Text>
@@ -12,7 +12,7 @@ const LoadingIndicatorWrapper = ({ text }: LoadingIndicatorWrapperProps) => {
12
12
  const styles = useStyles();
13
13
 
14
14
  return (
15
- <View style={styles.container}>
15
+ <View accessibilityLiveRegion='polite' accessibilityRole='progressbar' style={styles.container}>
16
16
  <Spinner height={20} width={20} />
17
17
  {text ? (
18
18
  <Text style={styles.loadingText} testID='loading'>
@@ -34,6 +34,8 @@ exports[`MessageAuthor should render message author 1`] = `
34
34
  testID="avatar-image"
35
35
  >
36
36
  <Image
37
+ accessibilityElementsHidden={true}
38
+ importantForAccessibility="no"
37
39
  onError={[Function]}
38
40
  source={
39
41
  {
@@ -36,13 +36,14 @@ exports[`AttachButton should call handleAttachButtonPress when the button is cli
36
36
  }
37
37
  >
38
38
  <View
39
+ accessibilityRole="button"
39
40
  accessibilityState={
40
41
  {
41
42
  "busy": undefined,
42
43
  "checked": undefined,
43
44
  "disabled": false,
44
45
  "expanded": undefined,
45
- "selected": undefined,
46
+ "selected": false,
46
47
  }
47
48
  }
48
49
  accessibilityValue={
@@ -196,13 +197,14 @@ exports[`AttachButton should call handleAttachButtonPress when the button is cli
196
197
  }
197
198
  >
198
199
  <View
200
+ accessibilityRole="button"
199
201
  accessibilityState={
200
202
  {
201
203
  "busy": undefined,
202
204
  "checked": undefined,
203
205
  "disabled": false,
204
206
  "expanded": undefined,
205
- "selected": undefined,
207
+ "selected": false,
206
208
  }
207
209
  }
208
210
  accessibilityValue={
@@ -335,13 +337,14 @@ exports[`AttachButton should call handleAttachButtonPress when the button is cli
335
337
  }
336
338
  >
337
339
  <View
340
+ accessibilityRole="button"
338
341
  accessibilityState={
339
342
  {
340
343
  "busy": undefined,
341
344
  "checked": undefined,
342
345
  "disabled": false,
343
346
  "expanded": undefined,
344
- "selected": undefined,
347
+ "selected": false,
345
348
  }
346
349
  }
347
350
  accessibilityValue={
@@ -503,13 +506,14 @@ exports[`AttachButton should call handleAttachButtonPress when the button is cli
503
506
  }
504
507
  >
505
508
  <View
509
+ accessibilityRole="button"
506
510
  accessibilityState={
507
511
  {
508
512
  "busy": undefined,
509
513
  "checked": undefined,
510
514
  "disabled": false,
511
515
  "expanded": undefined,
512
- "selected": undefined,
516
+ "selected": false,
513
517
  }
514
518
  }
515
519
  accessibilityValue={
@@ -638,13 +642,14 @@ exports[`AttachButton should call handleAttachButtonPress when the button is cli
638
642
  }
639
643
  >
640
644
  <View
645
+ accessibilityRole="button"
641
646
  accessibilityState={
642
647
  {
643
648
  "busy": undefined,
644
649
  "checked": undefined,
645
650
  "disabled": false,
646
651
  "expanded": undefined,
647
- "selected": undefined,
652
+ "selected": false,
648
653
  }
649
654
  }
650
655
  accessibilityValue={
@@ -905,13 +910,14 @@ exports[`AttachButton should render a enabled AttachButton 1`] = `
905
910
  }
906
911
  >
907
912
  <View
913
+ accessibilityRole="button"
908
914
  accessibilityState={
909
915
  {
910
916
  "busy": undefined,
911
917
  "checked": undefined,
912
918
  "disabled": false,
913
919
  "expanded": undefined,
914
- "selected": undefined,
920
+ "selected": false,
915
921
  }
916
922
  }
917
923
  accessibilityValue={
@@ -1065,13 +1071,14 @@ exports[`AttachButton should render a enabled AttachButton 1`] = `
1065
1071
  }
1066
1072
  >
1067
1073
  <View
1074
+ accessibilityRole="button"
1068
1075
  accessibilityState={
1069
1076
  {
1070
1077
  "busy": undefined,
1071
1078
  "checked": undefined,
1072
1079
  "disabled": false,
1073
1080
  "expanded": undefined,
1074
- "selected": undefined,
1081
+ "selected": false,
1075
1082
  }
1076
1083
  }
1077
1084
  accessibilityValue={
@@ -1204,13 +1211,14 @@ exports[`AttachButton should render a enabled AttachButton 1`] = `
1204
1211
  }
1205
1212
  >
1206
1213
  <View
1214
+ accessibilityRole="button"
1207
1215
  accessibilityState={
1208
1216
  {
1209
1217
  "busy": undefined,
1210
1218
  "checked": undefined,
1211
1219
  "disabled": false,
1212
1220
  "expanded": undefined,
1213
- "selected": undefined,
1221
+ "selected": false,
1214
1222
  }
1215
1223
  }
1216
1224
  accessibilityValue={
@@ -1372,13 +1380,14 @@ exports[`AttachButton should render a enabled AttachButton 1`] = `
1372
1380
  }
1373
1381
  >
1374
1382
  <View
1383
+ accessibilityRole="button"
1375
1384
  accessibilityState={
1376
1385
  {
1377
1386
  "busy": undefined,
1378
1387
  "checked": undefined,
1379
1388
  "disabled": false,
1380
1389
  "expanded": undefined,
1381
- "selected": undefined,
1390
+ "selected": false,
1382
1391
  }
1383
1392
  }
1384
1393
  accessibilityValue={
@@ -1507,13 +1516,14 @@ exports[`AttachButton should render a enabled AttachButton 1`] = `
1507
1516
  }
1508
1517
  >
1509
1518
  <View
1519
+ accessibilityRole="button"
1510
1520
  accessibilityState={
1511
1521
  {
1512
1522
  "busy": undefined,
1513
1523
  "checked": undefined,
1514
1524
  "disabled": false,
1515
1525
  "expanded": undefined,
1516
- "selected": undefined,
1526
+ "selected": false,
1517
1527
  }
1518
1528
  }
1519
1529
  accessibilityValue={
@@ -1774,13 +1784,14 @@ exports[`AttachButton should render an disabled AttachButton 1`] = `
1774
1784
  }
1775
1785
  >
1776
1786
  <View
1787
+ accessibilityRole="button"
1777
1788
  accessibilityState={
1778
1789
  {
1779
1790
  "busy": undefined,
1780
1791
  "checked": undefined,
1781
1792
  "disabled": true,
1782
1793
  "expanded": undefined,
1783
- "selected": undefined,
1794
+ "selected": false,
1784
1795
  }
1785
1796
  }
1786
1797
  accessibilityValue={
@@ -1934,13 +1945,14 @@ exports[`AttachButton should render an disabled AttachButton 1`] = `
1934
1945
  }
1935
1946
  >
1936
1947
  <View
1948
+ accessibilityRole="button"
1937
1949
  accessibilityState={
1938
1950
  {
1939
1951
  "busy": undefined,
1940
1952
  "checked": undefined,
1941
1953
  "disabled": false,
1942
1954
  "expanded": undefined,
1943
- "selected": undefined,
1955
+ "selected": false,
1944
1956
  }
1945
1957
  }
1946
1958
  accessibilityValue={
@@ -2073,13 +2085,14 @@ exports[`AttachButton should render an disabled AttachButton 1`] = `
2073
2085
  }
2074
2086
  >
2075
2087
  <View
2088
+ accessibilityRole="button"
2076
2089
  accessibilityState={
2077
2090
  {
2078
2091
  "busy": undefined,
2079
2092
  "checked": undefined,
2080
2093
  "disabled": false,
2081
2094
  "expanded": undefined,
2082
- "selected": undefined,
2095
+ "selected": false,
2083
2096
  }
2084
2097
  }
2085
2098
  accessibilityValue={
@@ -2241,13 +2254,14 @@ exports[`AttachButton should render an disabled AttachButton 1`] = `
2241
2254
  }
2242
2255
  >
2243
2256
  <View
2257
+ accessibilityRole="button"
2244
2258
  accessibilityState={
2245
2259
  {
2246
2260
  "busy": undefined,
2247
2261
  "checked": undefined,
2248
2262
  "disabled": false,
2249
2263
  "expanded": undefined,
2250
- "selected": undefined,
2264
+ "selected": false,
2251
2265
  }
2252
2266
  }
2253
2267
  accessibilityValue={
@@ -2376,13 +2390,14 @@ exports[`AttachButton should render an disabled AttachButton 1`] = `
2376
2390
  }
2377
2391
  >
2378
2392
  <View
2393
+ accessibilityRole="button"
2379
2394
  accessibilityState={
2380
2395
  {
2381
2396
  "busy": undefined,
2382
2397
  "checked": undefined,
2383
2398
  "disabled": false,
2384
2399
  "expanded": undefined,
2385
- "selected": undefined,
2400
+ "selected": false,
2386
2401
  }
2387
2402
  }
2388
2403
  accessibilityValue={