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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (466) 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 +16 -0
  4. package/lib/commonjs/a11y/hooks/useA11yLabel.js.map +1 -0
  5. package/lib/commonjs/a11y/hooks/useAccessibilityActivateAction.js +25 -0
  6. package/lib/commonjs/a11y/hooks/useAccessibilityActivateAction.js.map +1 -0
  7. package/lib/commonjs/a11y/hooks/useAnnounceOnStateChange.js +36 -0
  8. package/lib/commonjs/a11y/hooks/useAnnounceOnStateChange.js.map +1 -0
  9. package/lib/commonjs/a11y/hooks/useReducedMotionPreference.js +34 -0
  10. package/lib/commonjs/a11y/hooks/useReducedMotionPreference.js.map +1 -0
  11. package/lib/commonjs/a11y/hooks/useResolvedModalAccessibilityProps.js +20 -0
  12. package/lib/commonjs/a11y/hooks/useResolvedModalAccessibilityProps.js.map +1 -0
  13. package/lib/commonjs/a11y/hooks/useScreenReaderEnabled.js +37 -0
  14. package/lib/commonjs/a11y/hooks/useScreenReaderEnabled.js.map +1 -0
  15. package/lib/commonjs/a11y/index.js +81 -0
  16. package/lib/commonjs/a11y/index.js.map +1 -0
  17. package/lib/commonjs/components/AITypingIndicatorView/AITypingIndicatorView.js +10 -0
  18. package/lib/commonjs/components/AITypingIndicatorView/AITypingIndicatorView.js.map +1 -1
  19. package/lib/commonjs/components/Accessibility/NotificationAnnouncer.js +37 -0
  20. package/lib/commonjs/components/Accessibility/NotificationAnnouncer.js.map +1 -0
  21. package/lib/commonjs/components/Accessibility/hooks/useIncomingMessageAnnouncements.js +109 -0
  22. package/lib/commonjs/components/Accessibility/hooks/useIncomingMessageAnnouncements.js.map +1 -0
  23. package/lib/commonjs/components/Accessibility/index.js +37 -0
  24. package/lib/commonjs/components/Accessibility/index.js.map +1 -0
  25. package/lib/commonjs/components/Accessibility/useAccessibilityAnnouncer.js +15 -0
  26. package/lib/commonjs/components/Accessibility/useAccessibilityAnnouncer.js.map +1 -0
  27. package/lib/commonjs/components/AttachmentPicker/AttachmentPicker.js +20 -0
  28. package/lib/commonjs/components/AttachmentPicker/AttachmentPicker.js.map +1 -1
  29. package/lib/commonjs/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentMediaPicker.js +1 -0
  30. package/lib/commonjs/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentMediaPicker.js.map +1 -1
  31. package/lib/commonjs/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.js +19 -2
  32. package/lib/commonjs/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.js.map +1 -1
  33. package/lib/commonjs/components/AttachmentPicker/components/AttachmentPickerContent.js +2 -1
  34. package/lib/commonjs/components/AttachmentPicker/components/AttachmentPickerContent.js.map +1 -1
  35. package/lib/commonjs/components/AttachmentPicker/components/AttachmentTypePickerButton.js +9 -1
  36. package/lib/commonjs/components/AttachmentPicker/components/AttachmentTypePickerButton.js.map +1 -1
  37. package/lib/commonjs/components/Channel/Channel.js +2 -1
  38. package/lib/commonjs/components/Channel/Channel.js.map +1 -1
  39. package/lib/commonjs/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js +4 -0
  40. package/lib/commonjs/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js.map +1 -1
  41. package/lib/commonjs/components/ImageGallery/components/ImageGalleryFooter.js +2 -2
  42. package/lib/commonjs/components/ImageGallery/components/ImageGalleryFooter.js.map +1 -1
  43. package/lib/commonjs/components/ImageGallery/components/ImageGalleryHeader.js +1 -1
  44. package/lib/commonjs/components/ImageGallery/components/ImageGalleryHeader.js.map +1 -1
  45. package/lib/commonjs/components/ImageGallery/components/ImageGalleryVideoControl.js +1 -1
  46. package/lib/commonjs/components/ImageGallery/components/ImageGalleryVideoControl.js.map +1 -1
  47. package/lib/commonjs/components/Indicators/LoadingDots.js +2 -0
  48. package/lib/commonjs/components/Indicators/LoadingDots.js.map +1 -1
  49. package/lib/commonjs/components/Indicators/LoadingErrorIndicator.js +3 -0
  50. package/lib/commonjs/components/Indicators/LoadingErrorIndicator.js.map +1 -1
  51. package/lib/commonjs/components/Indicators/LoadingIndicator.js +2 -0
  52. package/lib/commonjs/components/Indicators/LoadingIndicator.js.map +1 -1
  53. package/lib/commonjs/components/MessageInput/components/AttachmentPreview/AttachmentRemoveControl.js +16 -4
  54. package/lib/commonjs/components/MessageInput/components/AttachmentPreview/AttachmentRemoveControl.js.map +1 -1
  55. package/lib/commonjs/components/MessageInput/components/AudioRecorder/AudioRecorder.js +3 -0
  56. package/lib/commonjs/components/MessageInput/components/AudioRecorder/AudioRecorder.js.map +1 -1
  57. package/lib/commonjs/components/MessageInput/components/AudioRecorder/AudioRecordingButton.js +5 -0
  58. package/lib/commonjs/components/MessageInput/components/AudioRecorder/AudioRecordingButton.js.map +1 -1
  59. package/lib/commonjs/components/MessageInput/components/InputButtons/AttachButton.js +12 -3
  60. package/lib/commonjs/components/MessageInput/components/InputButtons/AttachButton.js.map +1 -1
  61. package/lib/commonjs/components/MessageInput/components/OutputButtons/EditButton.js +1 -0
  62. package/lib/commonjs/components/MessageInput/components/OutputButtons/EditButton.js.map +1 -1
  63. package/lib/commonjs/components/MessageInput/components/OutputButtons/SendButton.js +1 -0
  64. package/lib/commonjs/components/MessageInput/components/OutputButtons/SendButton.js.map +1 -1
  65. package/lib/commonjs/components/MessageList/MessageFlashList.js +19 -2
  66. package/lib/commonjs/components/MessageList/MessageFlashList.js.map +1 -1
  67. package/lib/commonjs/components/MessageList/MessageList.js +32 -8
  68. package/lib/commonjs/components/MessageList/MessageList.js.map +1 -1
  69. package/lib/commonjs/components/MessageList/ScrollToBottomButton.js +12 -1
  70. package/lib/commonjs/components/MessageList/ScrollToBottomButton.js.map +1 -1
  71. package/lib/commonjs/components/MessageList/UnreadMessagesNotification.js +1 -0
  72. package/lib/commonjs/components/MessageList/UnreadMessagesNotification.js.map +1 -1
  73. package/lib/commonjs/components/MessageList/hooks/useScrollToBottomAccessibilityAction.js +47 -0
  74. package/lib/commonjs/components/MessageList/hooks/useScrollToBottomAccessibilityAction.js.map +1 -0
  75. package/lib/commonjs/components/MessageMenu/MessageActionList.js +4 -1
  76. package/lib/commonjs/components/MessageMenu/MessageActionList.js.map +1 -1
  77. package/lib/commonjs/components/MessageMenu/MessageActionListItem.js +12 -3
  78. package/lib/commonjs/components/MessageMenu/MessageActionListItem.js.map +1 -1
  79. package/lib/commonjs/components/MessageMenu/MessageReactionPicker.js +2 -0
  80. package/lib/commonjs/components/MessageMenu/MessageReactionPicker.js.map +1 -1
  81. package/lib/commonjs/components/MessageMenu/ReactionButton.js +9 -1
  82. package/lib/commonjs/components/MessageMenu/ReactionButton.js.map +1 -1
  83. package/lib/commonjs/components/Poll/components/CreatePollHeader.js +2 -0
  84. package/lib/commonjs/components/Poll/components/CreatePollHeader.js.map +1 -1
  85. package/lib/commonjs/components/Poll/components/MultipleVotesSettings.js +2 -0
  86. package/lib/commonjs/components/Poll/components/MultipleVotesSettings.js.map +1 -1
  87. package/lib/commonjs/components/Poll/components/PollModalHeader.js +1 -0
  88. package/lib/commonjs/components/Poll/components/PollModalHeader.js.map +1 -1
  89. package/lib/commonjs/components/Poll/components/PollOption.js +15 -0
  90. package/lib/commonjs/components/Poll/components/PollOption.js.map +1 -1
  91. package/lib/commonjs/components/ProgressControl/ProgressControl.js +10 -0
  92. package/lib/commonjs/components/ProgressControl/ProgressControl.js.map +1 -1
  93. package/lib/commonjs/components/Reply/Reply.js +3 -0
  94. package/lib/commonjs/components/Reply/Reply.js.map +1 -1
  95. package/lib/commonjs/components/UIComponents/BottomSheetModal.js +6 -3
  96. package/lib/commonjs/components/UIComponents/BottomSheetModal.js.map +1 -1
  97. package/lib/commonjs/components/index.js +11 -0
  98. package/lib/commonjs/components/index.js.map +1 -1
  99. package/lib/commonjs/components/ui/Avatar/Avatar.js +17 -2
  100. package/lib/commonjs/components/ui/Avatar/Avatar.js.map +1 -1
  101. package/lib/commonjs/components/ui/Avatar/ChannelAvatar.js +3 -1
  102. package/lib/commonjs/components/ui/Avatar/ChannelAvatar.js.map +1 -1
  103. package/lib/commonjs/components/ui/Avatar/UserAvatar.js +1 -0
  104. package/lib/commonjs/components/ui/Avatar/UserAvatar.js.map +1 -1
  105. package/lib/commonjs/components/ui/Button/Button.js +64 -21
  106. package/lib/commonjs/components/ui/Button/Button.js.map +1 -1
  107. package/lib/commonjs/components/ui/Input/Input.js +63 -21
  108. package/lib/commonjs/components/ui/Input/Input.js.map +1 -1
  109. package/lib/commonjs/contexts/accessibilityContext/AccessibilityContext.js +134 -0
  110. package/lib/commonjs/contexts/accessibilityContext/AccessibilityContext.js.map +1 -0
  111. package/lib/commonjs/contexts/accessibilityContext/index.js +15 -0
  112. package/lib/commonjs/contexts/accessibilityContext/index.js.map +1 -0
  113. package/lib/commonjs/contexts/index.js +11 -0
  114. package/lib/commonjs/contexts/index.js.map +1 -1
  115. package/lib/commonjs/contexts/overlayContext/OverlayContext.js.map +1 -1
  116. package/lib/commonjs/contexts/overlayContext/OverlayProvider.js +19 -14
  117. package/lib/commonjs/contexts/overlayContext/OverlayProvider.js.map +1 -1
  118. package/lib/commonjs/hooks/index.js +11 -0
  119. package/lib/commonjs/hooks/index.js.map +1 -1
  120. package/lib/commonjs/i18n/en.json +57 -1
  121. package/lib/commonjs/i18n/es.json +57 -1
  122. package/lib/commonjs/i18n/fr.json +57 -1
  123. package/lib/commonjs/i18n/he.json +57 -1
  124. package/lib/commonjs/i18n/hi.json +57 -1
  125. package/lib/commonjs/i18n/it.json +57 -1
  126. package/lib/commonjs/i18n/ja.json +57 -1
  127. package/lib/commonjs/i18n/ko.json +57 -1
  128. package/lib/commonjs/i18n/nl.json +57 -1
  129. package/lib/commonjs/i18n/pt-br.json +57 -1
  130. package/lib/commonjs/i18n/ru.json +57 -1
  131. package/lib/commonjs/i18n/tr.json +57 -1
  132. package/lib/commonjs/mock-builders/DB/mock.js +3 -1
  133. package/lib/commonjs/mock-builders/DB/mock.js.map +1 -1
  134. package/lib/commonjs/test-utils/BetterSqlite.js +3 -2
  135. package/lib/commonjs/test-utils/BetterSqlite.js.map +1 -1
  136. package/lib/commonjs/version.json +1 -1
  137. package/lib/module/a11y/a11yUtils.js +40 -0
  138. package/lib/module/a11y/a11yUtils.js.map +1 -0
  139. package/lib/module/a11y/hooks/useA11yLabel.js +16 -0
  140. package/lib/module/a11y/hooks/useA11yLabel.js.map +1 -0
  141. package/lib/module/a11y/hooks/useAccessibilityActivateAction.js +25 -0
  142. package/lib/module/a11y/hooks/useAccessibilityActivateAction.js.map +1 -0
  143. package/lib/module/a11y/hooks/useAnnounceOnStateChange.js +36 -0
  144. package/lib/module/a11y/hooks/useAnnounceOnStateChange.js.map +1 -0
  145. package/lib/module/a11y/hooks/useReducedMotionPreference.js +34 -0
  146. package/lib/module/a11y/hooks/useReducedMotionPreference.js.map +1 -0
  147. package/lib/module/a11y/hooks/useResolvedModalAccessibilityProps.js +20 -0
  148. package/lib/module/a11y/hooks/useResolvedModalAccessibilityProps.js.map +1 -0
  149. package/lib/module/a11y/hooks/useScreenReaderEnabled.js +37 -0
  150. package/lib/module/a11y/hooks/useScreenReaderEnabled.js.map +1 -0
  151. package/lib/module/a11y/index.js +81 -0
  152. package/lib/module/a11y/index.js.map +1 -0
  153. package/lib/module/components/AITypingIndicatorView/AITypingIndicatorView.js +10 -0
  154. package/lib/module/components/AITypingIndicatorView/AITypingIndicatorView.js.map +1 -1
  155. package/lib/module/components/Accessibility/NotificationAnnouncer.js +37 -0
  156. package/lib/module/components/Accessibility/NotificationAnnouncer.js.map +1 -0
  157. package/lib/module/components/Accessibility/hooks/useIncomingMessageAnnouncements.js +109 -0
  158. package/lib/module/components/Accessibility/hooks/useIncomingMessageAnnouncements.js.map +1 -0
  159. package/lib/module/components/Accessibility/index.js +37 -0
  160. package/lib/module/components/Accessibility/index.js.map +1 -0
  161. package/lib/module/components/Accessibility/useAccessibilityAnnouncer.js +15 -0
  162. package/lib/module/components/Accessibility/useAccessibilityAnnouncer.js.map +1 -0
  163. package/lib/module/components/AttachmentPicker/AttachmentPicker.js +20 -0
  164. package/lib/module/components/AttachmentPicker/AttachmentPicker.js.map +1 -1
  165. package/lib/module/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentMediaPicker.js +1 -0
  166. package/lib/module/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentMediaPicker.js.map +1 -1
  167. package/lib/module/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.js +19 -2
  168. package/lib/module/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.js.map +1 -1
  169. package/lib/module/components/AttachmentPicker/components/AttachmentPickerContent.js +2 -1
  170. package/lib/module/components/AttachmentPicker/components/AttachmentPickerContent.js.map +1 -1
  171. package/lib/module/components/AttachmentPicker/components/AttachmentTypePickerButton.js +9 -1
  172. package/lib/module/components/AttachmentPicker/components/AttachmentTypePickerButton.js.map +1 -1
  173. package/lib/module/components/Channel/Channel.js +2 -1
  174. package/lib/module/components/Channel/Channel.js.map +1 -1
  175. package/lib/module/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js +4 -0
  176. package/lib/module/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js.map +1 -1
  177. package/lib/module/components/ImageGallery/components/ImageGalleryFooter.js +2 -2
  178. package/lib/module/components/ImageGallery/components/ImageGalleryFooter.js.map +1 -1
  179. package/lib/module/components/ImageGallery/components/ImageGalleryHeader.js +1 -1
  180. package/lib/module/components/ImageGallery/components/ImageGalleryHeader.js.map +1 -1
  181. package/lib/module/components/ImageGallery/components/ImageGalleryVideoControl.js +1 -1
  182. package/lib/module/components/ImageGallery/components/ImageGalleryVideoControl.js.map +1 -1
  183. package/lib/module/components/Indicators/LoadingDots.js +2 -0
  184. package/lib/module/components/Indicators/LoadingDots.js.map +1 -1
  185. package/lib/module/components/Indicators/LoadingErrorIndicator.js +3 -0
  186. package/lib/module/components/Indicators/LoadingErrorIndicator.js.map +1 -1
  187. package/lib/module/components/Indicators/LoadingIndicator.js +2 -0
  188. package/lib/module/components/Indicators/LoadingIndicator.js.map +1 -1
  189. package/lib/module/components/MessageInput/components/AttachmentPreview/AttachmentRemoveControl.js +16 -4
  190. package/lib/module/components/MessageInput/components/AttachmentPreview/AttachmentRemoveControl.js.map +1 -1
  191. package/lib/module/components/MessageInput/components/AudioRecorder/AudioRecorder.js +3 -0
  192. package/lib/module/components/MessageInput/components/AudioRecorder/AudioRecorder.js.map +1 -1
  193. package/lib/module/components/MessageInput/components/AudioRecorder/AudioRecordingButton.js +5 -0
  194. package/lib/module/components/MessageInput/components/AudioRecorder/AudioRecordingButton.js.map +1 -1
  195. package/lib/module/components/MessageInput/components/InputButtons/AttachButton.js +12 -3
  196. package/lib/module/components/MessageInput/components/InputButtons/AttachButton.js.map +1 -1
  197. package/lib/module/components/MessageInput/components/OutputButtons/EditButton.js +1 -0
  198. package/lib/module/components/MessageInput/components/OutputButtons/EditButton.js.map +1 -1
  199. package/lib/module/components/MessageInput/components/OutputButtons/SendButton.js +1 -0
  200. package/lib/module/components/MessageInput/components/OutputButtons/SendButton.js.map +1 -1
  201. package/lib/module/components/MessageList/MessageFlashList.js +19 -2
  202. package/lib/module/components/MessageList/MessageFlashList.js.map +1 -1
  203. package/lib/module/components/MessageList/MessageList.js +32 -8
  204. package/lib/module/components/MessageList/MessageList.js.map +1 -1
  205. package/lib/module/components/MessageList/ScrollToBottomButton.js +12 -1
  206. package/lib/module/components/MessageList/ScrollToBottomButton.js.map +1 -1
  207. package/lib/module/components/MessageList/UnreadMessagesNotification.js +1 -0
  208. package/lib/module/components/MessageList/UnreadMessagesNotification.js.map +1 -1
  209. package/lib/module/components/MessageList/hooks/useScrollToBottomAccessibilityAction.js +47 -0
  210. package/lib/module/components/MessageList/hooks/useScrollToBottomAccessibilityAction.js.map +1 -0
  211. package/lib/module/components/MessageMenu/MessageActionList.js +4 -1
  212. package/lib/module/components/MessageMenu/MessageActionList.js.map +1 -1
  213. package/lib/module/components/MessageMenu/MessageActionListItem.js +12 -3
  214. package/lib/module/components/MessageMenu/MessageActionListItem.js.map +1 -1
  215. package/lib/module/components/MessageMenu/MessageReactionPicker.js +2 -0
  216. package/lib/module/components/MessageMenu/MessageReactionPicker.js.map +1 -1
  217. package/lib/module/components/MessageMenu/ReactionButton.js +9 -1
  218. package/lib/module/components/MessageMenu/ReactionButton.js.map +1 -1
  219. package/lib/module/components/Poll/components/CreatePollHeader.js +2 -0
  220. package/lib/module/components/Poll/components/CreatePollHeader.js.map +1 -1
  221. package/lib/module/components/Poll/components/MultipleVotesSettings.js +2 -0
  222. package/lib/module/components/Poll/components/MultipleVotesSettings.js.map +1 -1
  223. package/lib/module/components/Poll/components/PollModalHeader.js +1 -0
  224. package/lib/module/components/Poll/components/PollModalHeader.js.map +1 -1
  225. package/lib/module/components/Poll/components/PollOption.js +15 -0
  226. package/lib/module/components/Poll/components/PollOption.js.map +1 -1
  227. package/lib/module/components/ProgressControl/ProgressControl.js +10 -0
  228. package/lib/module/components/ProgressControl/ProgressControl.js.map +1 -1
  229. package/lib/module/components/Reply/Reply.js +3 -0
  230. package/lib/module/components/Reply/Reply.js.map +1 -1
  231. package/lib/module/components/UIComponents/BottomSheetModal.js +6 -3
  232. package/lib/module/components/UIComponents/BottomSheetModal.js.map +1 -1
  233. package/lib/module/components/index.js +11 -0
  234. package/lib/module/components/index.js.map +1 -1
  235. package/lib/module/components/ui/Avatar/Avatar.js +17 -2
  236. package/lib/module/components/ui/Avatar/Avatar.js.map +1 -1
  237. package/lib/module/components/ui/Avatar/ChannelAvatar.js +3 -1
  238. package/lib/module/components/ui/Avatar/ChannelAvatar.js.map +1 -1
  239. package/lib/module/components/ui/Avatar/UserAvatar.js +1 -0
  240. package/lib/module/components/ui/Avatar/UserAvatar.js.map +1 -1
  241. package/lib/module/components/ui/Button/Button.js +64 -21
  242. package/lib/module/components/ui/Button/Button.js.map +1 -1
  243. package/lib/module/components/ui/Input/Input.js +63 -21
  244. package/lib/module/components/ui/Input/Input.js.map +1 -1
  245. package/lib/module/contexts/accessibilityContext/AccessibilityContext.js +134 -0
  246. package/lib/module/contexts/accessibilityContext/AccessibilityContext.js.map +1 -0
  247. package/lib/module/contexts/accessibilityContext/index.js +15 -0
  248. package/lib/module/contexts/accessibilityContext/index.js.map +1 -0
  249. package/lib/module/contexts/index.js +11 -0
  250. package/lib/module/contexts/index.js.map +1 -1
  251. package/lib/module/contexts/overlayContext/OverlayContext.js.map +1 -1
  252. package/lib/module/contexts/overlayContext/OverlayProvider.js +19 -14
  253. package/lib/module/contexts/overlayContext/OverlayProvider.js.map +1 -1
  254. package/lib/module/hooks/index.js +11 -0
  255. package/lib/module/hooks/index.js.map +1 -1
  256. package/lib/module/i18n/en.json +57 -1
  257. package/lib/module/i18n/es.json +57 -1
  258. package/lib/module/i18n/fr.json +57 -1
  259. package/lib/module/i18n/he.json +57 -1
  260. package/lib/module/i18n/hi.json +57 -1
  261. package/lib/module/i18n/it.json +57 -1
  262. package/lib/module/i18n/ja.json +57 -1
  263. package/lib/module/i18n/ko.json +57 -1
  264. package/lib/module/i18n/nl.json +57 -1
  265. package/lib/module/i18n/pt-br.json +57 -1
  266. package/lib/module/i18n/ru.json +57 -1
  267. package/lib/module/i18n/tr.json +57 -1
  268. package/lib/module/mock-builders/DB/mock.js +3 -1
  269. package/lib/module/mock-builders/DB/mock.js.map +1 -1
  270. package/lib/module/test-utils/BetterSqlite.js +3 -2
  271. package/lib/module/test-utils/BetterSqlite.js.map +1 -1
  272. package/lib/module/version.json +1 -1
  273. package/lib/typescript/a11y/a11yUtils.d.ts +31 -0
  274. package/lib/typescript/a11y/a11yUtils.d.ts.map +1 -0
  275. package/lib/typescript/a11y/hooks/useA11yLabel.d.ts +13 -0
  276. package/lib/typescript/a11y/hooks/useA11yLabel.d.ts.map +1 -0
  277. package/lib/typescript/a11y/hooks/useAccessibilityActivateAction.d.ts +17 -0
  278. package/lib/typescript/a11y/hooks/useAccessibilityActivateAction.d.ts.map +1 -0
  279. package/lib/typescript/a11y/hooks/useAnnounceOnStateChange.d.ts +14 -0
  280. package/lib/typescript/a11y/hooks/useAnnounceOnStateChange.d.ts.map +1 -0
  281. package/lib/typescript/a11y/hooks/useReducedMotionPreference.d.ts +6 -0
  282. package/lib/typescript/a11y/hooks/useReducedMotionPreference.d.ts.map +1 -0
  283. package/lib/typescript/a11y/hooks/useResolvedModalAccessibilityProps.d.ts +18 -0
  284. package/lib/typescript/a11y/hooks/useResolvedModalAccessibilityProps.d.ts.map +1 -0
  285. package/lib/typescript/a11y/hooks/useScreenReaderEnabled.d.ts +10 -0
  286. package/lib/typescript/a11y/hooks/useScreenReaderEnabled.d.ts.map +1 -0
  287. package/lib/typescript/a11y/index.d.ts +8 -0
  288. package/lib/typescript/a11y/index.d.ts.map +1 -0
  289. package/lib/typescript/components/AITypingIndicatorView/AITypingIndicatorView.d.ts.map +1 -1
  290. package/lib/typescript/components/Accessibility/NotificationAnnouncer.d.ts +12 -0
  291. package/lib/typescript/components/Accessibility/NotificationAnnouncer.d.ts.map +1 -0
  292. package/lib/typescript/components/Accessibility/hooks/useIncomingMessageAnnouncements.d.ts +20 -0
  293. package/lib/typescript/components/Accessibility/hooks/useIncomingMessageAnnouncements.d.ts.map +1 -0
  294. package/lib/typescript/components/Accessibility/index.d.ts +4 -0
  295. package/lib/typescript/components/Accessibility/index.d.ts.map +1 -0
  296. package/lib/typescript/components/Accessibility/useAccessibilityAnnouncer.d.ts +15 -0
  297. package/lib/typescript/components/Accessibility/useAccessibilityAnnouncer.d.ts.map +1 -0
  298. package/lib/typescript/components/AttachmentPicker/AttachmentPicker.d.ts.map +1 -1
  299. package/lib/typescript/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentMediaPicker.d.ts.map +1 -1
  300. package/lib/typescript/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.d.ts.map +1 -1
  301. package/lib/typescript/components/AttachmentPicker/components/AttachmentPickerContent.d.ts.map +1 -1
  302. package/lib/typescript/components/AttachmentPicker/components/AttachmentTypePickerButton.d.ts +2 -1
  303. package/lib/typescript/components/AttachmentPicker/components/AttachmentTypePickerButton.d.ts.map +1 -1
  304. package/lib/typescript/components/Channel/Channel.d.ts.map +1 -1
  305. package/lib/typescript/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.d.ts.map +1 -1
  306. package/lib/typescript/components/Indicators/LoadingDots.d.ts.map +1 -1
  307. package/lib/typescript/components/Indicators/LoadingErrorIndicator.d.ts.map +1 -1
  308. package/lib/typescript/components/MessageInput/components/AttachmentPreview/AttachmentRemoveControl.d.ts +5 -2
  309. package/lib/typescript/components/MessageInput/components/AttachmentPreview/AttachmentRemoveControl.d.ts.map +1 -1
  310. package/lib/typescript/components/MessageInput/components/AudioRecorder/AudioRecorder.d.ts.map +1 -1
  311. package/lib/typescript/components/MessageInput/components/AudioRecorder/AudioRecordingButton.d.ts.map +1 -1
  312. package/lib/typescript/components/MessageInput/components/InputButtons/AttachButton.d.ts +1 -0
  313. package/lib/typescript/components/MessageInput/components/InputButtons/AttachButton.d.ts.map +1 -1
  314. package/lib/typescript/components/MessageInput/components/OutputButtons/EditButton.d.ts.map +1 -1
  315. package/lib/typescript/components/MessageInput/components/OutputButtons/SendButton.d.ts.map +1 -1
  316. package/lib/typescript/components/MessageList/MessageFlashList.d.ts.map +1 -1
  317. package/lib/typescript/components/MessageList/MessageList.d.ts.map +1 -1
  318. package/lib/typescript/components/MessageList/ScrollToBottomButton.d.ts +2 -0
  319. package/lib/typescript/components/MessageList/ScrollToBottomButton.d.ts.map +1 -1
  320. package/lib/typescript/components/MessageList/UnreadMessagesNotification.d.ts.map +1 -1
  321. package/lib/typescript/components/MessageList/hooks/useScrollToBottomAccessibilityAction.d.ts +20 -0
  322. package/lib/typescript/components/MessageList/hooks/useScrollToBottomAccessibilityAction.d.ts.map +1 -0
  323. package/lib/typescript/components/MessageMenu/MessageActionList.d.ts.map +1 -1
  324. package/lib/typescript/components/MessageMenu/MessageActionListItem.d.ts.map +1 -1
  325. package/lib/typescript/components/MessageMenu/MessageReactionPicker.d.ts.map +1 -1
  326. package/lib/typescript/components/MessageMenu/ReactionButton.d.ts.map +1 -1
  327. package/lib/typescript/components/Poll/components/CreatePollHeader.d.ts.map +1 -1
  328. package/lib/typescript/components/Poll/components/MultipleVotesSettings.d.ts.map +1 -1
  329. package/lib/typescript/components/Poll/components/PollModalHeader.d.ts.map +1 -1
  330. package/lib/typescript/components/Poll/components/PollOption.d.ts.map +1 -1
  331. package/lib/typescript/components/ProgressControl/ProgressControl.d.ts.map +1 -1
  332. package/lib/typescript/components/Reply/Reply.d.ts.map +1 -1
  333. package/lib/typescript/components/UIComponents/BottomSheetModal.d.ts.map +1 -1
  334. package/lib/typescript/components/index.d.ts +1 -0
  335. package/lib/typescript/components/index.d.ts.map +1 -1
  336. package/lib/typescript/components/ui/Avatar/Avatar.d.ts +12 -1
  337. package/lib/typescript/components/ui/Avatar/Avatar.d.ts.map +1 -1
  338. package/lib/typescript/components/ui/Avatar/ChannelAvatar.d.ts.map +1 -1
  339. package/lib/typescript/components/ui/Avatar/UserAvatar.d.ts.map +1 -1
  340. package/lib/typescript/components/ui/Button/Button.d.ts +10 -1
  341. package/lib/typescript/components/ui/Button/Button.d.ts.map +1 -1
  342. package/lib/typescript/components/ui/Input/Input.d.ts.map +1 -1
  343. package/lib/typescript/contexts/accessibilityContext/AccessibilityContext.d.ts +34 -0
  344. package/lib/typescript/contexts/accessibilityContext/AccessibilityContext.d.ts.map +1 -0
  345. package/lib/typescript/contexts/accessibilityContext/index.d.ts +2 -0
  346. package/lib/typescript/contexts/accessibilityContext/index.d.ts.map +1 -0
  347. package/lib/typescript/contexts/index.d.ts +1 -0
  348. package/lib/typescript/contexts/index.d.ts.map +1 -1
  349. package/lib/typescript/contexts/overlayContext/OverlayContext.d.ts +7 -0
  350. package/lib/typescript/contexts/overlayContext/OverlayContext.d.ts.map +1 -1
  351. package/lib/typescript/contexts/overlayContext/OverlayProvider.d.ts.map +1 -1
  352. package/lib/typescript/hooks/index.d.ts +1 -0
  353. package/lib/typescript/hooks/index.d.ts.map +1 -1
  354. package/lib/typescript/hooks/useTranslatedMessage.d.ts +2 -2
  355. package/lib/typescript/i18n/en.json +57 -1
  356. package/lib/typescript/i18n/es.json +57 -1
  357. package/lib/typescript/i18n/fr.json +57 -1
  358. package/lib/typescript/i18n/he.json +57 -1
  359. package/lib/typescript/i18n/hi.json +57 -1
  360. package/lib/typescript/i18n/it.json +57 -1
  361. package/lib/typescript/i18n/ja.json +57 -1
  362. package/lib/typescript/i18n/ko.json +57 -1
  363. package/lib/typescript/i18n/nl.json +57 -1
  364. package/lib/typescript/i18n/pt-br.json +57 -1
  365. package/lib/typescript/i18n/ru.json +57 -1
  366. package/lib/typescript/i18n/tr.json +57 -1
  367. package/lib/typescript/test-utils/BetterSqlite.d.ts.map +1 -1
  368. package/lib/typescript/utils/i18n/Streami18n.d.ts +56 -0
  369. package/lib/typescript/utils/i18n/Streami18n.d.ts.map +1 -1
  370. package/package.json +1 -1
  371. package/src/__tests__/offline-support/offline-feature.tsx +40 -34
  372. package/src/a11y/__tests__/a11yUtils.test.ts +70 -0
  373. package/src/a11y/a11yUtils.ts +50 -0
  374. package/src/a11y/hooks/useA11yLabel.ts +22 -0
  375. package/src/a11y/hooks/useAccessibilityActivateAction.ts +44 -0
  376. package/src/a11y/hooks/useAnnounceOnStateChange.ts +47 -0
  377. package/src/a11y/hooks/useReducedMotionPreference.ts +38 -0
  378. package/src/a11y/hooks/useResolvedModalAccessibilityProps.ts +30 -0
  379. package/src/a11y/hooks/useScreenReaderEnabled.ts +44 -0
  380. package/src/a11y/index.ts +7 -0
  381. package/src/components/AITypingIndicatorView/AITypingIndicatorView.tsx +17 -2
  382. package/src/components/AITypingIndicatorView/__tests__/AITypingIndicatorView.test.tsx +73 -0
  383. package/src/components/Accessibility/NotificationAnnouncer.tsx +43 -0
  384. package/src/components/Accessibility/__tests__/AccessibilityAnnouncer.test.tsx +75 -0
  385. package/src/components/Accessibility/hooks/useIncomingMessageAnnouncements.ts +157 -0
  386. package/src/components/Accessibility/index.ts +3 -0
  387. package/src/components/Accessibility/useAccessibilityAnnouncer.ts +30 -0
  388. package/src/components/AttachmentPicker/AttachmentPicker.tsx +23 -1
  389. package/src/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentMediaPicker.tsx +1 -0
  390. package/src/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.tsx +15 -2
  391. package/src/components/AttachmentPicker/components/AttachmentPickerContent.tsx +1 -0
  392. package/src/components/AttachmentPicker/components/AttachmentTypePickerButton.tsx +9 -0
  393. package/src/components/Channel/Channel.tsx +3 -0
  394. package/src/components/ChannelList/__tests__/ChannelListView.test.tsx +16 -5
  395. package/src/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.tsx +14 -1
  396. package/src/components/ImageGallery/__tests__/ImageGalleryFooter.test.tsx +9 -3
  397. package/src/components/ImageGallery/__tests__/ImageGalleryHeader.test.tsx +4 -1
  398. package/src/components/ImageGallery/components/ImageGalleryFooter.tsx +2 -2
  399. package/src/components/ImageGallery/components/ImageGalleryHeader.tsx +1 -1
  400. package/src/components/ImageGallery/components/ImageGalleryVideoControl.tsx +1 -1
  401. package/src/components/Indicators/LoadingDots.tsx +5 -1
  402. package/src/components/Indicators/LoadingErrorIndicator.tsx +7 -1
  403. package/src/components/Indicators/LoadingIndicator.tsx +1 -1
  404. package/src/components/Message/MessageItemView/__tests__/__snapshots__/MessageAuthor.test.tsx.snap +2 -0
  405. package/src/components/MessageInput/__tests__/__snapshots__/AttachButton.test.tsx.snap +30 -15
  406. package/src/components/MessageInput/__tests__/__snapshots__/SendButton.test.tsx.snap +20 -10
  407. package/src/components/MessageInput/components/AttachmentPreview/AttachmentRemoveControl.tsx +18 -2
  408. package/src/components/MessageInput/components/AudioRecorder/AudioRecorder.tsx +3 -0
  409. package/src/components/MessageInput/components/AudioRecorder/AudioRecordingButton.tsx +8 -1
  410. package/src/components/MessageInput/components/InputButtons/AttachButton.tsx +13 -3
  411. package/src/components/MessageInput/components/OutputButtons/EditButton.tsx +1 -0
  412. package/src/components/MessageInput/components/OutputButtons/SendButton.tsx +1 -0
  413. package/src/components/MessageList/MessageFlashList.tsx +23 -2
  414. package/src/components/MessageList/MessageList.tsx +32 -2
  415. package/src/components/MessageList/ScrollToBottomButton.tsx +19 -1
  416. package/src/components/MessageList/UnreadMessagesNotification.tsx +1 -0
  417. package/src/components/MessageList/__tests__/MessageList.test.tsx +186 -0
  418. package/src/components/MessageList/__tests__/ScrollToBottomButton.test.tsx +2 -2
  419. package/src/components/MessageList/__tests__/__snapshots__/ScrollToBottomButton.test.tsx.snap +4 -1
  420. package/src/components/MessageList/__tests__/__snapshots__/TypingIndicator.test.tsx.snap +6 -0
  421. package/src/components/MessageList/hooks/useScrollToBottomAccessibilityAction.ts +74 -0
  422. package/src/components/MessageMenu/MessageActionList.tsx +4 -1
  423. package/src/components/MessageMenu/MessageActionListItem.tsx +11 -4
  424. package/src/components/MessageMenu/MessageReactionPicker.tsx +2 -0
  425. package/src/components/MessageMenu/ReactionButton.tsx +7 -1
  426. package/src/components/MessageMenu/__tests__/MessageReactionPicker.test.tsx +13 -15
  427. package/src/components/MessageMenu/__tests__/MessageUserReactions.test.tsx +20 -18
  428. package/src/components/MessageMenu/__tests__/ReactionButton.test.tsx +18 -5
  429. package/src/components/Poll/components/CreatePollHeader.tsx +2 -0
  430. package/src/components/Poll/components/MultipleVotesSettings.tsx +2 -0
  431. package/src/components/Poll/components/PollModalHeader.tsx +1 -0
  432. package/src/components/Poll/components/PollOption.tsx +11 -0
  433. package/src/components/ProgressControl/ProgressControl.tsx +8 -0
  434. package/src/components/Reply/Reply.tsx +9 -2
  435. package/src/components/Thread/__tests__/__snapshots__/Thread.test.tsx.snap +23 -6
  436. package/src/components/UIComponents/BottomSheetModal.tsx +4 -0
  437. package/src/components/index.ts +2 -0
  438. package/src/components/ui/Avatar/Avatar.tsx +24 -2
  439. package/src/components/ui/Avatar/ChannelAvatar.tsx +3 -0
  440. package/src/components/ui/Avatar/UserAvatar.tsx +1 -0
  441. package/src/components/ui/Button/Button.tsx +50 -0
  442. package/src/components/ui/Button/__tests__/Button.test.tsx +44 -0
  443. package/src/components/ui/Input/Input.tsx +35 -0
  444. package/src/contexts/accessibilityContext/AccessibilityContext.tsx +199 -0
  445. package/src/contexts/accessibilityContext/__tests__/AccessibilityContext.test.tsx +65 -0
  446. package/src/contexts/accessibilityContext/index.ts +1 -0
  447. package/src/contexts/index.ts +1 -0
  448. package/src/contexts/overlayContext/OverlayContext.tsx +7 -0
  449. package/src/contexts/overlayContext/OverlayProvider.tsx +18 -14
  450. package/src/contexts/overlayContext/__tests__/OverlayProvider.test.tsx +51 -0
  451. package/src/hooks/index.ts +1 -0
  452. package/src/i18n/en.json +57 -1
  453. package/src/i18n/es.json +57 -1
  454. package/src/i18n/fr.json +57 -1
  455. package/src/i18n/he.json +57 -1
  456. package/src/i18n/hi.json +57 -1
  457. package/src/i18n/it.json +57 -1
  458. package/src/i18n/ja.json +57 -1
  459. package/src/i18n/ko.json +57 -1
  460. package/src/i18n/nl.json +57 -1
  461. package/src/i18n/pt-br.json +57 -1
  462. package/src/i18n/ru.json +57 -1
  463. package/src/i18n/tr.json +57 -1
  464. package/src/mock-builders/DB/mock.ts +2 -1
  465. package/src/test-utils/BetterSqlite.ts +3 -1
  466. package/src/version.json +1 -1
@@ -0,0 +1,199 @@
1
+ import React, {
2
+ PropsWithChildren,
3
+ useCallback,
4
+ useContext,
5
+ useEffect,
6
+ useMemo,
7
+ useRef,
8
+ } from 'react';
9
+ import { AccessibilityInfo } from 'react-native';
10
+
11
+ import { AccessibilityAnnouncerContext } from '../../components/Accessibility/useAccessibilityAnnouncer';
12
+ import type {
13
+ AccessibilityAnnounce,
14
+ AccessibilityAnnouncePriority,
15
+ } from '../../components/Accessibility/useAccessibilityAnnouncer';
16
+
17
+ const ANNOUNCE_DEBOUNCE_MS = 50;
18
+
19
+ type SequenceByPriority = { [key in AccessibilityAnnouncePriority]: number };
20
+ type TimeoutByPriority = {
21
+ [key in AccessibilityAnnouncePriority]: ReturnType<typeof setTimeout> | undefined;
22
+ };
23
+
24
+ /** Tri-state for gesture-alternative toggles. */
25
+ export type A11yMode = 'auto' | 'always' | 'never';
26
+
27
+ export type AccessibilityConfig = {
28
+ /**
29
+ * Master toggle. Default FALSE — integrators must opt in. When false, the SDK
30
+ * behaves exactly as it does today; no a11y attributes are added, no announcer
31
+ * mounts, no listeners attached.
32
+ */
33
+ enabled?: boolean;
34
+ /** For testing — force "screen reader on" UI even when no SR is active. */
35
+ forceScreenReaderMode?: boolean;
36
+ /** Announce new messages via the announcer. Default true (when enabled). */
37
+ announceNewMessages?: boolean;
38
+ /** Announce typing indicator. Default false (noisy on mobile). */
39
+ announceTypingIndicator?: boolean;
40
+ /** Announce connection state (offline/online). Default true. */
41
+ announceConnectionState?: boolean;
42
+ /** Audio recorder gesture-alternative. 'auto' (default), 'always', 'never'. */
43
+ audioRecorderTapMode?: A11yMode;
44
+ /** Image gallery gesture-alternative. 'auto' (default), 'always', 'never'. */
45
+ imageGalleryScreenReaderMode?: A11yMode;
46
+ /** Message actions trigger. 'long-press' (no alt button), 'auto' (default — show button when SR is on), 'always-button'. */
47
+ messageActionsTrigger?: 'long-press' | 'auto' | 'always-button';
48
+ };
49
+
50
+ /** Fully-resolved config — every field is populated with its default. */
51
+ export type ResolvedAccessibilityConfig = Required<AccessibilityConfig>;
52
+
53
+ export const accessibilityContextDefaultValue: ResolvedAccessibilityConfig = {
54
+ announceConnectionState: true,
55
+ announceNewMessages: true,
56
+ announceTypingIndicator: false,
57
+ audioRecorderTapMode: 'auto',
58
+ enabled: false,
59
+ forceScreenReaderMode: false,
60
+ imageGalleryScreenReaderMode: 'auto',
61
+ messageActionsTrigger: 'auto',
62
+ };
63
+
64
+ export const AccessibilityContext = React.createContext<ResolvedAccessibilityConfig>(
65
+ accessibilityContextDefaultValue,
66
+ );
67
+
68
+ const AccessibilityAnnouncerProvider = ({ children }: PropsWithChildren) => {
69
+ const sequenceByPriorityRef = useRef<SequenceByPriority>({ assertive: 0, polite: 0 });
70
+ const timeoutByPriorityRef = useRef<TimeoutByPriority>({
71
+ assertive: undefined,
72
+ polite: undefined,
73
+ });
74
+ const unmountedRef = useRef(false);
75
+
76
+ const clearPendingTimeout = useCallback((priority: AccessibilityAnnouncePriority) => {
77
+ if (!timeoutByPriorityRef.current[priority]) return;
78
+ clearTimeout(timeoutByPriorityRef.current[priority]);
79
+ timeoutByPriorityRef.current[priority] = undefined;
80
+ }, []);
81
+
82
+ const announce = useCallback<AccessibilityAnnounce>(
83
+ (message, priority = 'polite') => {
84
+ if (!message) return;
85
+ const sequence = sequenceByPriorityRef.current[priority] + 1;
86
+ sequenceByPriorityRef.current[priority] = sequence;
87
+ clearPendingTimeout(priority);
88
+ timeoutByPriorityRef.current[priority] = setTimeout(() => {
89
+ if (unmountedRef.current) return;
90
+ if (sequenceByPriorityRef.current[priority] !== sequence) return;
91
+ AccessibilityInfo.announceForAccessibility(message);
92
+ timeoutByPriorityRef.current[priority] = undefined;
93
+ }, ANNOUNCE_DEBOUNCE_MS);
94
+ },
95
+ [clearPendingTimeout],
96
+ );
97
+
98
+ useEffect(() => {
99
+ unmountedRef.current = false;
100
+ return () => {
101
+ unmountedRef.current = true;
102
+ clearPendingTimeout('assertive');
103
+ clearPendingTimeout('polite');
104
+ };
105
+ }, [clearPendingTimeout]);
106
+
107
+ const contextValue = useMemo(() => ({ announce }), [announce]);
108
+
109
+ return (
110
+ <AccessibilityAnnouncerContext.Provider value={contextValue}>
111
+ {children}
112
+ </AccessibilityAnnouncerContext.Provider>
113
+ );
114
+ };
115
+
116
+ export const AccessibilityProvider = ({
117
+ children,
118
+ value,
119
+ }: PropsWithChildren<{ value?: AccessibilityConfig }>) => {
120
+ const {
121
+ announceConnectionState = accessibilityContextDefaultValue.announceConnectionState,
122
+ announceNewMessages = accessibilityContextDefaultValue.announceNewMessages,
123
+ announceTypingIndicator = accessibilityContextDefaultValue.announceTypingIndicator,
124
+ audioRecorderTapMode = accessibilityContextDefaultValue.audioRecorderTapMode,
125
+ enabled = accessibilityContextDefaultValue.enabled,
126
+ forceScreenReaderMode = accessibilityContextDefaultValue.forceScreenReaderMode,
127
+ imageGalleryScreenReaderMode = accessibilityContextDefaultValue.imageGalleryScreenReaderMode,
128
+ messageActionsTrigger = accessibilityContextDefaultValue.messageActionsTrigger,
129
+ } = value ?? {};
130
+
131
+ const resolved = useMemo<ResolvedAccessibilityConfig>(
132
+ () => ({
133
+ announceConnectionState,
134
+ announceNewMessages,
135
+ announceTypingIndicator,
136
+ audioRecorderTapMode,
137
+ enabled,
138
+ forceScreenReaderMode,
139
+ imageGalleryScreenReaderMode,
140
+ messageActionsTrigger,
141
+ }),
142
+ [
143
+ announceConnectionState,
144
+ announceNewMessages,
145
+ announceTypingIndicator,
146
+ audioRecorderTapMode,
147
+ enabled,
148
+ forceScreenReaderMode,
149
+ imageGalleryScreenReaderMode,
150
+ messageActionsTrigger,
151
+ ],
152
+ );
153
+
154
+ return (
155
+ <AccessibilityContext.Provider value={resolved}>
156
+ {enabled ? (
157
+ <AccessibilityAnnouncerProvider>{children}</AccessibilityAnnouncerProvider>
158
+ ) : (
159
+ children
160
+ )}
161
+ </AccessibilityContext.Provider>
162
+ );
163
+ };
164
+
165
+ export const useAccessibilityContext = (): ResolvedAccessibilityConfig => {
166
+ const {
167
+ announceConnectionState,
168
+ announceNewMessages,
169
+ announceTypingIndicator,
170
+ audioRecorderTapMode,
171
+ enabled,
172
+ forceScreenReaderMode,
173
+ imageGalleryScreenReaderMode,
174
+ messageActionsTrigger,
175
+ } = useContext(AccessibilityContext);
176
+
177
+ return useMemo(
178
+ () => ({
179
+ announceConnectionState,
180
+ announceNewMessages,
181
+ announceTypingIndicator,
182
+ audioRecorderTapMode,
183
+ enabled,
184
+ forceScreenReaderMode,
185
+ imageGalleryScreenReaderMode,
186
+ messageActionsTrigger,
187
+ }),
188
+ [
189
+ announceConnectionState,
190
+ announceNewMessages,
191
+ announceTypingIndicator,
192
+ audioRecorderTapMode,
193
+ enabled,
194
+ forceScreenReaderMode,
195
+ imageGalleryScreenReaderMode,
196
+ messageActionsTrigger,
197
+ ],
198
+ );
199
+ };
@@ -0,0 +1,65 @@
1
+ import React from 'react';
2
+
3
+ import { render, renderHook } from '@testing-library/react-native';
4
+
5
+ import {
6
+ AccessibilityConfig,
7
+ AccessibilityProvider,
8
+ ResolvedAccessibilityConfig,
9
+ accessibilityContextDefaultValue,
10
+ useAccessibilityContext,
11
+ } from '../AccessibilityContext';
12
+
13
+ const wrap =
14
+ (props: Parameters<typeof AccessibilityProvider>[0]) =>
15
+ ({ children }: { children: React.ReactNode }) => (
16
+ <AccessibilityProvider {...props}>{children}</AccessibilityProvider>
17
+ );
18
+
19
+ describe('AccessibilityContext', () => {
20
+ it('defaults to disabled', () => {
21
+ const { result } = renderHook(() => useAccessibilityContext(), {
22
+ wrapper: wrap({ children: null }),
23
+ });
24
+ expect(result.current.enabled).toBe(false);
25
+ expect(result.current).toEqual(accessibilityContextDefaultValue);
26
+ });
27
+
28
+ it('merges integrator config with defaults', () => {
29
+ const { result } = renderHook(() => useAccessibilityContext(), {
30
+ wrapper: wrap({ children: null, value: { enabled: true, audioRecorderTapMode: 'always' } }),
31
+ });
32
+ expect(result.current.enabled).toBe(true);
33
+ expect(result.current.audioRecorderTapMode).toBe('always');
34
+ expect(result.current.announceNewMessages).toBe(true);
35
+ expect(result.current.announceTypingIndicator).toBe(false);
36
+ });
37
+
38
+ it('returns defaults when used outside the provider', () => {
39
+ const { result } = renderHook(() => useAccessibilityContext());
40
+ expect(result.current).toEqual(accessibilityContextDefaultValue);
41
+ });
42
+
43
+ it('keeps the resolved value stable when equivalent config objects are recreated', () => {
44
+ const contextValues: ResolvedAccessibilityConfig[] = [];
45
+
46
+ const ContextValueProbe = () => {
47
+ contextValues.push(useAccessibilityContext());
48
+ return null;
49
+ };
50
+
51
+ const renderProvider = (value: AccessibilityConfig) => (
52
+ <AccessibilityProvider value={value}>
53
+ <ContextValueProbe />
54
+ </AccessibilityProvider>
55
+ );
56
+
57
+ const { rerender } = render(renderProvider({ audioRecorderTapMode: 'always', enabled: true }));
58
+ const firstValue = contextValues[contextValues.length - 1];
59
+
60
+ rerender(renderProvider({ audioRecorderTapMode: 'always', enabled: true }));
61
+ const secondValue = contextValues[contextValues.length - 1];
62
+
63
+ expect(secondValue).toBe(firstValue);
64
+ });
65
+ });
@@ -0,0 +1 @@
1
+ export * from './AccessibilityContext';
@@ -1,3 +1,4 @@
1
+ export * from './accessibilityContext/AccessibilityContext';
1
2
  export * from './attachmentPickerContext/AttachmentPickerContext';
2
3
  export * from './componentsContext/ComponentsContext';
3
4
  export * from './bottomSheetContext/BottomSheetContext';
@@ -3,6 +3,7 @@ import React, { useContext } from 'react';
3
3
  import { SharedValue } from 'react-native-reanimated';
4
4
 
5
5
  import type { Streami18n } from '../../utils/i18n/Streami18n';
6
+ import type { AccessibilityConfig } from '../accessibilityContext/AccessibilityContext';
6
7
  import { ImageGalleryProviderProps } from '../imageGalleryContext/ImageGalleryContext';
7
8
  import type { DeepPartial } from '../themeContext/ThemeContext';
8
9
  import type { Theme } from '../themeContext/utils/theme';
@@ -24,6 +25,12 @@ export const OverlayContext = React.createContext(
24
25
  );
25
26
 
26
27
  export type OverlayProviderProps = ImageGalleryProviderProps & {
28
+ /**
29
+ * Opt-in accessibility configuration. A11y is OFF by default — pass
30
+ * `accessibility={{ enabled: true }}` to enable screen-reader announcements,
31
+ * gesture alternatives, and semantic a11y attributes across the SDK.
32
+ */
33
+ accessibility?: AccessibilityConfig;
27
34
  /** https://github.com/GetStream/stream-chat-react-native/wiki/Internationalization-(i18n) */
28
35
  i18nInstance?: Streami18n;
29
36
  value?: Partial<OverlayContextValue>;
@@ -12,6 +12,7 @@ import { OverlayContext, OverlayProviderProps } from './OverlayContext';
12
12
  import { ImageGallery } from '../../components/ImageGallery/ImageGallery';
13
13
  import { useStreami18n } from '../../hooks/useStreami18n';
14
14
 
15
+ import { AccessibilityProvider } from '../accessibilityContext/AccessibilityContext';
15
16
  import { ImageGalleryProvider } from '../imageGalleryContext/ImageGalleryContext';
16
17
  import { ThemeProvider } from '../themeContext/ThemeContext';
17
18
 
@@ -42,12 +43,13 @@ import {
42
43
  */
43
44
  export const OverlayProvider = (props: PropsWithChildren<OverlayProviderProps>) => {
44
45
  const {
45
- children,
46
- i18nInstance,
47
- value,
46
+ accessibility,
48
47
  autoPlayVideo,
48
+ children,
49
49
  giphyVersion,
50
+ i18nInstance,
50
51
  numberOfImageGalleryGridColumns,
52
+ value,
51
53
  } = props;
52
54
 
53
55
  const [overlay, setOverlay] = useState(value?.overlay || 'none');
@@ -100,17 +102,19 @@ export const OverlayProvider = (props: PropsWithChildren<OverlayProviderProps>)
100
102
 
101
103
  return (
102
104
  <TranslationProvider value={{ ...translators, userLanguage: DEFAULT_USER_LANGUAGE }}>
103
- <OverlayContext.Provider value={overlayContext}>
104
- <ImageGalleryProvider value={imageGalleryProviderProps}>
105
- <ThemeProvider style={overlayContext.style}>
106
- <PortalProvider>
107
- {children}
108
- {overlay === 'gallery' && <ImageGallery overlayOpacity={overlayOpacity} />}
109
- <MessageOverlayHostLayer />
110
- </PortalProvider>
111
- </ThemeProvider>
112
- </ImageGalleryProvider>
113
- </OverlayContext.Provider>
105
+ <AccessibilityProvider value={accessibility}>
106
+ <OverlayContext.Provider value={overlayContext}>
107
+ <ImageGalleryProvider value={imageGalleryProviderProps}>
108
+ <ThemeProvider style={overlayContext.style}>
109
+ <PortalProvider>
110
+ {children}
111
+ {overlay === 'gallery' && <ImageGallery overlayOpacity={overlayOpacity} />}
112
+ <MessageOverlayHostLayer />
113
+ </PortalProvider>
114
+ </ThemeProvider>
115
+ </ImageGalleryProvider>
116
+ </OverlayContext.Provider>
117
+ </AccessibilityProvider>
114
118
  </TranslationProvider>
115
119
  );
116
120
  };
@@ -0,0 +1,51 @@
1
+ import React from 'react';
2
+ import { AccessibilityInfo } from 'react-native';
3
+
4
+ import { renderHook, waitFor } from '@testing-library/react-native';
5
+
6
+ import { useAccessibilityAnnouncer } from '../../../components/Accessibility/useAccessibilityAnnouncer';
7
+ import { useAccessibilityContext } from '../../accessibilityContext/AccessibilityContext';
8
+ import { OverlayProvider } from '../OverlayProvider';
9
+
10
+ jest.mock('react-native/Libraries/Components/AccessibilityInfo/AccessibilityInfo', () => ({
11
+ __esModule: true,
12
+ default: {
13
+ addEventListener: jest.fn().mockReturnValue({ remove: jest.fn() }),
14
+ announceForAccessibility: jest.fn(),
15
+ isReduceMotionEnabled: jest.fn().mockResolvedValue(false),
16
+ isScreenReaderEnabled: jest.fn().mockResolvedValue(false),
17
+ },
18
+ }));
19
+
20
+ describe('OverlayProvider accessibility', () => {
21
+ beforeEach(() => {
22
+ (AccessibilityInfo.announceForAccessibility as jest.Mock).mockClear();
23
+ });
24
+
25
+ it('provides accessibility config and announcer to descendants', async () => {
26
+ const wrapper = ({ children }: { children: React.ReactNode }) => (
27
+ <OverlayProvider accessibility={{ audioRecorderTapMode: 'always', enabled: true }}>
28
+ {children}
29
+ </OverlayProvider>
30
+ );
31
+
32
+ const { result } = renderHook(
33
+ () => ({
34
+ announce: useAccessibilityAnnouncer(),
35
+ accessibility: useAccessibilityContext(),
36
+ }),
37
+ { wrapper },
38
+ );
39
+
40
+ expect(result.current.accessibility.enabled).toBe(true);
41
+ expect(result.current.accessibility.audioRecorderTapMode).toBe('always');
42
+
43
+ result.current.announce('overlay announcement');
44
+
45
+ await waitFor(() =>
46
+ expect(AccessibilityInfo.announceForAccessibility).toHaveBeenCalledWith(
47
+ 'overlay announcement',
48
+ ),
49
+ );
50
+ });
51
+ });
@@ -1,3 +1,4 @@
1
+ export * from '../a11y';
1
2
  export * from './useAppStateListener';
2
3
  export * from './useStreami18n';
3
4
  export * from './useViewport';
package/src/i18n/en.json CHANGED
@@ -236,5 +236,61 @@
236
236
  "Unsupported Attachment": "Unsupported Attachment",
237
237
  "+{{count}} More Options_one": "+{{count}} More Option",
238
238
  "+{{count}} More Options_other": "+{{count}} More Options",
239
- "+{{count}} More Options_many": "+{{count}} More Options"
239
+ "+{{count}} More Options_many": "+{{count}} More Options",
240
+ "a11y/AI is generating": "AI is generating",
241
+ "a11y/AI is thinking": "AI is thinking",
242
+ "a11y/Avatar of {{name}}": "Avatar of {{name}}",
243
+ "a11y/Connected": "Connected",
244
+ "a11y/Delivered": "Delivered",
245
+ "a11y/Loading": "Loading",
246
+ "a11y/Loading failed": "Loading failed",
247
+ "a11y/Message actions": "Message actions",
248
+ "a11y/New message from {{user}}": "New message from {{user}}",
249
+ "a11y/Offline": "Offline",
250
+ "a11y/Open message actions": "Open message actions",
251
+ "a11y/Reaction {{emoji}} by {{count}} users": "Reaction {{emoji}} by {{count}} users",
252
+ "a11y/Read": "Read",
253
+ "a11y/Reconnecting": "Reconnecting",
254
+ "a11y/Reply to {{user}}": "Reply to {{user}}",
255
+ "a11y/Remove edit": "Remove edit",
256
+ "a11y/Remove reply": "Remove reply",
257
+ "a11y/Scroll to bottom": "Scroll to bottom",
258
+ "a11y/Scroll to bottom, {{count}} new messages": "Scroll to bottom, {{count}} new messages",
259
+ "a11y/Scroll to latest": "Scroll to latest",
260
+ "a11y/Scroll to latest, {{count}} unread": "Scroll to latest, {{count}} unread",
261
+ "a11y/Send message": "Send message",
262
+ "a11y/Sending": "Sending",
263
+ "a11y/Sent": "Sent",
264
+ "a11y/Voice message recording. Hold to record.": "Voice message recording. Hold to record.",
265
+ "a11y/{{count}} new messages": "{{count}} new messages",
266
+ "a11y/Add attachment": "Add attachment",
267
+ "a11y/Close attachments": "Close attachments",
268
+ "a11y/Remove attachment": "Remove Attachment",
269
+ "a11y/Close poll": "Close poll",
270
+ "a11y/Close poll creation": "Close poll creation",
271
+ "a11y/Create poll": "Create poll",
272
+ "a11y/Decrease maximum votes": "Decrease maximum votes",
273
+ "a11y/Delete voice recording": "Delete voice recording",
274
+ "a11y/Deselect image": "Deselect image",
275
+ "a11y/Deselect video": "Deselect video",
276
+ "a11y/Dismiss unread messages": "Dismiss unread messages",
277
+ "a11y/Grid Icon": "Grid Icon",
278
+ "a11y/Hide Overlay": "Hide Overlay",
279
+ "a11y/Increase maximum votes": "Increase maximum votes",
280
+ "a11y/Open camera": "Open camera",
281
+ "a11y/Open commands": "Open commands",
282
+ "a11y/Open file picker": "Open file picker",
283
+ "a11y/Open more reactions": "Open more reactions",
284
+ "a11y/Open photo picker": "Open photo picker",
285
+ "a11y/Open poll creation": "Open poll creation",
286
+ "a11y/Open video recorder": "Open video recorder",
287
+ "a11y/Play Pause Button": "Play Pause Button",
288
+ "a11y/reaction-button-{{type}}-{{selected}}": "reaction-button-{{type}}-{{selected}}",
289
+ "a11y/Save edited message": "Save edited message",
290
+ "a11y/Select image": "Select image",
291
+ "a11y/Select video": "Select video",
292
+ "a11y/Send voice recording": "Send voice recording",
293
+ "a11y/Share Button": "Share Button",
294
+ "a11y/Start voice recording": "Start voice recording",
295
+ "a11y/Stop voice recording": "Stop voice recording"
240
296
  }
package/src/i18n/es.json CHANGED
@@ -236,5 +236,61 @@
236
236
  "Unsupported Attachment": "Adjunto no admitido",
237
237
  "+{{count}} More Options_one": "+{{count}} opción más",
238
238
  "+{{count}} More Options_other": "+{{count}} opciones más",
239
- "+{{count}} More Options_many": "+{{count}} opciones más"
239
+ "+{{count}} More Options_many": "+{{count}} opciones más",
240
+ "a11y/AI is generating": "La IA está generando",
241
+ "a11y/AI is thinking": "La IA está pensando",
242
+ "a11y/Avatar of {{name}}": "Avatar de {{name}}",
243
+ "a11y/Connected": "Conectado",
244
+ "a11y/Delivered": "Entregado",
245
+ "a11y/Loading": "Cargando",
246
+ "a11y/Loading failed": "Error al cargar",
247
+ "a11y/Message actions": "Acciones del mensaje",
248
+ "a11y/New message from {{user}}": "Nuevo mensaje de {{user}}",
249
+ "a11y/Offline": "Sin conexión",
250
+ "a11y/Open message actions": "Abrir acciones del mensaje",
251
+ "a11y/Reaction {{emoji}} by {{count}} users": "Reacción {{emoji}} de {{count}} usuarios",
252
+ "a11y/Read": "Leído",
253
+ "a11y/Reconnecting": "Reconectando",
254
+ "a11y/Reply to {{user}}": "Responder a {{user}}",
255
+ "a11y/Remove edit": "Eliminar edición",
256
+ "a11y/Remove reply": "Eliminar respuesta",
257
+ "a11y/Scroll to bottom": "Ir al final",
258
+ "a11y/Scroll to bottom, {{count}} new messages": "Ir al final, {{count}} mensajes nuevos",
259
+ "a11y/Scroll to latest": "Ir al último mensaje",
260
+ "a11y/Scroll to latest, {{count}} unread": "Ir al último mensaje, {{count}} sin leer",
261
+ "a11y/Send message": "Enviar mensaje",
262
+ "a11y/Sending": "Enviando",
263
+ "a11y/Sent": "Enviado",
264
+ "a11y/Voice message recording. Hold to record.": "Grabación de mensaje de voz. Mantén pulsado para grabar.",
265
+ "a11y/{{count}} new messages": "{{count}} mensajes nuevos",
266
+ "a11y/Add attachment": "Add attachment",
267
+ "a11y/Close attachments": "Close attachments",
268
+ "a11y/Remove attachment": "Remove Attachment",
269
+ "a11y/Close poll": "Close poll",
270
+ "a11y/Close poll creation": "Close poll creation",
271
+ "a11y/Create poll": "Create poll",
272
+ "a11y/Decrease maximum votes": "Decrease maximum votes",
273
+ "a11y/Delete voice recording": "Delete voice recording",
274
+ "a11y/Deselect image": "Deselect image",
275
+ "a11y/Deselect video": "Deselect video",
276
+ "a11y/Dismiss unread messages": "Dismiss unread messages",
277
+ "a11y/Grid Icon": "Grid Icon",
278
+ "a11y/Hide Overlay": "Hide Overlay",
279
+ "a11y/Increase maximum votes": "Increase maximum votes",
280
+ "a11y/Open camera": "Open camera",
281
+ "a11y/Open commands": "Open commands",
282
+ "a11y/Open file picker": "Open file picker",
283
+ "a11y/Open more reactions": "Open more reactions",
284
+ "a11y/Open photo picker": "Open photo picker",
285
+ "a11y/Open poll creation": "Open poll creation",
286
+ "a11y/Open video recorder": "Open video recorder",
287
+ "a11y/Play Pause Button": "Play Pause Button",
288
+ "a11y/reaction-button-{{type}}-{{selected}}": "reaction-button-{{type}}-{{selected}}",
289
+ "a11y/Save edited message": "Save edited message",
290
+ "a11y/Select image": "Select image",
291
+ "a11y/Select video": "Select video",
292
+ "a11y/Send voice recording": "Send voice recording",
293
+ "a11y/Share Button": "Share Button",
294
+ "a11y/Start voice recording": "Start voice recording",
295
+ "a11y/Stop voice recording": "Stop voice recording"
240
296
  }
package/src/i18n/fr.json CHANGED
@@ -236,5 +236,61 @@
236
236
  "Unsupported Attachment": "Pièce jointe non prise en charge",
237
237
  "+{{count}} More Options_one": "+{{count}} option supplémentaire",
238
238
  "+{{count}} More Options_other": "+{{count}} options supplémentaires",
239
- "+{{count}} More Options_many": "+{{count}} options supplémentaires"
239
+ "+{{count}} More Options_many": "+{{count}} options supplémentaires",
240
+ "a11y/AI is generating": "L'IA génère une réponse",
241
+ "a11y/AI is thinking": "L'IA réfléchit",
242
+ "a11y/Avatar of {{name}}": "Avatar de {{name}}",
243
+ "a11y/Connected": "Connecté",
244
+ "a11y/Delivered": "Distribué",
245
+ "a11y/Loading": "Chargement",
246
+ "a11y/Loading failed": "Échec du chargement",
247
+ "a11y/Message actions": "Actions du message",
248
+ "a11y/New message from {{user}}": "Nouveau message de {{user}}",
249
+ "a11y/Offline": "Hors ligne",
250
+ "a11y/Open message actions": "Ouvrir les actions du message",
251
+ "a11y/Reaction {{emoji}} by {{count}} users": "Réaction {{emoji}} par {{count}} utilisateurs",
252
+ "a11y/Read": "Lu",
253
+ "a11y/Reconnecting": "Reconnexion",
254
+ "a11y/Reply to {{user}}": "Répondre à {{user}}",
255
+ "a11y/Remove edit": "Supprimer la modification",
256
+ "a11y/Remove reply": "Supprimer la réponse",
257
+ "a11y/Scroll to bottom": "Aller en bas",
258
+ "a11y/Scroll to bottom, {{count}} new messages": "Aller en bas, {{count}} nouveaux messages",
259
+ "a11y/Scroll to latest": "Aller au dernier message",
260
+ "a11y/Scroll to latest, {{count}} unread": "Aller au dernier message, {{count}} non lus",
261
+ "a11y/Send message": "Envoyer le message",
262
+ "a11y/Sending": "Envoi",
263
+ "a11y/Sent": "Envoyé",
264
+ "a11y/Voice message recording. Hold to record.": "Enregistrement d'un message vocal. Maintenez appuyé pour enregistrer.",
265
+ "a11y/{{count}} new messages": "{{count}} nouveaux messages",
266
+ "a11y/Add attachment": "Add attachment",
267
+ "a11y/Close attachments": "Close attachments",
268
+ "a11y/Remove attachment": "Remove Attachment",
269
+ "a11y/Close poll": "Close poll",
270
+ "a11y/Close poll creation": "Close poll creation",
271
+ "a11y/Create poll": "Create poll",
272
+ "a11y/Decrease maximum votes": "Decrease maximum votes",
273
+ "a11y/Delete voice recording": "Delete voice recording",
274
+ "a11y/Deselect image": "Deselect image",
275
+ "a11y/Deselect video": "Deselect video",
276
+ "a11y/Dismiss unread messages": "Dismiss unread messages",
277
+ "a11y/Grid Icon": "Grid Icon",
278
+ "a11y/Hide Overlay": "Hide Overlay",
279
+ "a11y/Increase maximum votes": "Increase maximum votes",
280
+ "a11y/Open camera": "Open camera",
281
+ "a11y/Open commands": "Open commands",
282
+ "a11y/Open file picker": "Open file picker",
283
+ "a11y/Open more reactions": "Open more reactions",
284
+ "a11y/Open photo picker": "Open photo picker",
285
+ "a11y/Open poll creation": "Open poll creation",
286
+ "a11y/Open video recorder": "Open video recorder",
287
+ "a11y/Play Pause Button": "Play Pause Button",
288
+ "a11y/reaction-button-{{type}}-{{selected}}": "reaction-button-{{type}}-{{selected}}",
289
+ "a11y/Save edited message": "Save edited message",
290
+ "a11y/Select image": "Select image",
291
+ "a11y/Select video": "Select video",
292
+ "a11y/Send voice recording": "Send voice recording",
293
+ "a11y/Share Button": "Share Button",
294
+ "a11y/Start voice recording": "Start voice recording",
295
+ "a11y/Stop voice recording": "Stop voice recording"
240
296
  }
package/src/i18n/he.json CHANGED
@@ -236,5 +236,61 @@
236
236
  "Unsupported Attachment": "קובץ לא נתמך",
237
237
  "+{{count}} More Options_one": "+עוד אפשרות {{count}}",
238
238
  "+{{count}} More Options_other": "+עוד {{count}} אפשרויות",
239
- "+{{count}} More Options_many": "+עוד {{count}} אפשרויות"
239
+ "+{{count}} More Options_many": "+עוד {{count}} אפשרויות",
240
+ "a11y/AI is generating": "הבינה המלאכותית יוצרת תשובה",
241
+ "a11y/AI is thinking": "הבינה המלאכותית חושבת",
242
+ "a11y/Avatar of {{name}}": "תמונת פרופיל של {{name}}",
243
+ "a11y/Connected": "מחובר",
244
+ "a11y/Delivered": "נמסר",
245
+ "a11y/Loading": "טוען",
246
+ "a11y/Loading failed": "הטעינה נכשלה",
247
+ "a11y/Message actions": "פעולות הודעה",
248
+ "a11y/New message from {{user}}": "הודעה חדשה מ-{{user}}",
249
+ "a11y/Offline": "לא מקוון",
250
+ "a11y/Open message actions": "פתח פעולות הודעה",
251
+ "a11y/Reaction {{emoji}} by {{count}} users": "תגובה {{emoji}} מאת {{count}} משתמשים",
252
+ "a11y/Read": "נקרא",
253
+ "a11y/Reconnecting": "מתחבר מחדש",
254
+ "a11y/Reply to {{user}}": "השב ל-{{user}}",
255
+ "a11y/Remove edit": "הסר עריכה",
256
+ "a11y/Remove reply": "הסר תגובה",
257
+ "a11y/Scroll to bottom": "גלול לתחתית",
258
+ "a11y/Scroll to bottom, {{count}} new messages": "גלול לתחתית, {{count}} הודעות חדשות",
259
+ "a11y/Scroll to latest": "גלול להודעה האחרונה",
260
+ "a11y/Scroll to latest, {{count}} unread": "גלול להודעה האחרונה, {{count}} לא נקראו",
261
+ "a11y/Send message": "שלח הודעה",
262
+ "a11y/Sending": "שולח",
263
+ "a11y/Sent": "נשלח",
264
+ "a11y/Voice message recording. Hold to record.": "הקלטת הודעה קולית. החזק כדי להקליט.",
265
+ "a11y/{{count}} new messages": "{{count}} הודעות חדשות",
266
+ "a11y/Add attachment": "Add attachment",
267
+ "a11y/Close attachments": "Close attachments",
268
+ "a11y/Remove attachment": "Remove Attachment",
269
+ "a11y/Close poll": "Close poll",
270
+ "a11y/Close poll creation": "Close poll creation",
271
+ "a11y/Create poll": "Create poll",
272
+ "a11y/Decrease maximum votes": "Decrease maximum votes",
273
+ "a11y/Delete voice recording": "Delete voice recording",
274
+ "a11y/Deselect image": "Deselect image",
275
+ "a11y/Deselect video": "Deselect video",
276
+ "a11y/Dismiss unread messages": "Dismiss unread messages",
277
+ "a11y/Grid Icon": "Grid Icon",
278
+ "a11y/Hide Overlay": "Hide Overlay",
279
+ "a11y/Increase maximum votes": "Increase maximum votes",
280
+ "a11y/Open camera": "Open camera",
281
+ "a11y/Open commands": "Open commands",
282
+ "a11y/Open file picker": "Open file picker",
283
+ "a11y/Open more reactions": "Open more reactions",
284
+ "a11y/Open photo picker": "Open photo picker",
285
+ "a11y/Open poll creation": "Open poll creation",
286
+ "a11y/Open video recorder": "Open video recorder",
287
+ "a11y/Play Pause Button": "Play Pause Button",
288
+ "a11y/reaction-button-{{type}}-{{selected}}": "reaction-button-{{type}}-{{selected}}",
289
+ "a11y/Save edited message": "Save edited message",
290
+ "a11y/Select image": "Select image",
291
+ "a11y/Select video": "Select video",
292
+ "a11y/Send voice recording": "Send voice recording",
293
+ "a11y/Share Button": "Share Button",
294
+ "a11y/Start voice recording": "Start voice recording",
295
+ "a11y/Stop voice recording": "Stop voice recording"
240
296
  }