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
@@ -163,6 +163,7 @@ export const MultipleVotesSettings = () => {
163
163
  style={[styles.row, multipleAnswers.row]}
164
164
  >
165
165
  <Button
166
+ accessibilityLabelKey='a11y/Decrease maximum votes'
166
167
  variant='secondary'
167
168
  type='outline'
168
169
  size='md'
@@ -175,6 +176,7 @@ export const MultipleVotesSettings = () => {
175
176
  />
176
177
  <MaxVotesTextInput />
177
178
  <Button
179
+ accessibilityLabelKey='a11y/Increase maximum votes'
178
180
  variant='secondary'
179
181
  type='outline'
180
182
  size='md'
@@ -25,6 +25,7 @@ export const PollModalHeader = ({ onPress, title }: PollModalHeaderProps) => {
25
25
  <View style={[styles.container, container]}>
26
26
  <View style={styles.sideContainer}>
27
27
  <Button
28
+ accessibilityLabelKey='a11y/Close poll'
28
29
  variant='secondary'
29
30
  type='solid'
30
31
  size='md'
@@ -25,6 +25,11 @@ import { UserAvatarStack } from '../../ui/Avatar/AvatarStack';
25
25
  import { useIsPollCreatedByCurrentUser } from '../hook/useIsPollCreatedByCurrentUser';
26
26
  import { usePollState } from '../hooks/usePollState';
27
27
 
28
+ const pollVoteAccessibilityStates = {
29
+ checked: { checked: true, selected: true },
30
+ unchecked: { checked: false, selected: false },
31
+ } as const;
32
+
28
33
  export type PollOptionProps = {
29
34
  option: PollOptionClass;
30
35
  showProgressBar?: boolean;
@@ -190,9 +195,15 @@ export const VoteButton = ({ onPress, option }: PollVoteButtonProps) => {
190
195
  }, [message, onPress, poll, toggleVote]);
191
196
 
192
197
  const hasVote = !!ownVotesByOptionId[option.id];
198
+ const accessibilityState = hasVote
199
+ ? pollVoteAccessibilityStates.checked
200
+ : pollVoteAccessibilityStates.unchecked;
193
201
 
194
202
  return ownCapabilities.castPollVote && !isClosed ? (
195
203
  <Pressable
204
+ accessibilityLabel={option.text}
205
+ accessibilityRole={poll.data?.enforce_unique_vote ? 'radio' : 'checkbox'}
206
+ accessibilityState={accessibilityState}
196
207
  onPress={onPressHandler}
197
208
  style={({ pressed }) => [
198
209
  { opacity: pressed ? 0.5 : 1 },
@@ -110,9 +110,17 @@ export const ProgressControl = (props: ProgressControlProps) => {
110
110
  [widthInNumbers],
111
111
  );
112
112
 
113
+ const progressPercent = Math.round(progress * 100);
114
+ const accessibilityValue = useMemo(
115
+ () => ({ max: 100, min: 0, now: progressPercent }),
116
+ [progressPercent],
117
+ );
118
+
113
119
  return (
114
120
  <GestureDetector gesture={pan}>
115
121
  <View
122
+ accessibilityRole={onEndDrag ? 'adjustable' : 'progressbar'}
123
+ accessibilityValue={accessibilityValue}
116
124
  onLayout={({ nativeEvent }) => {
117
125
  setWidthInNumbers(nativeEvent.layout.width);
118
126
  }}
@@ -151,7 +151,11 @@ export const ReplyWithContext = (props: ReplyPropsWithContext) => {
151
151
  }
152
152
 
153
153
  return (
154
- <View style={[!messageFromContext?.quoted_message ? styles.wrapper : null, wrapper]}>
154
+ <View
155
+ accessibilityLabel={title}
156
+ accessibilityRole='text'
157
+ style={[!messageFromContext?.quoted_message ? styles.wrapper : null, wrapper]}
158
+ >
155
159
  <View style={[styles.container, container, stylesProp?.container]}>
156
160
  <View style={[styles.leftContainer, leftContainer, stylesProp?.leftContainer]}>
157
161
  <Text numberOfLines={1} style={[styles.title, titleStyle, stylesProp?.title]}>
@@ -166,7 +170,10 @@ export const ReplyWithContext = (props: ReplyPropsWithContext) => {
166
170
  </View>
167
171
  {onDismiss ? (
168
172
  <View style={[styles.dismissWrapper, dismissWrapper, stylesProp?.dismissWrapper]}>
169
- <AttachmentRemoveControl onPress={onDismiss} />
173
+ <AttachmentRemoveControl
174
+ accessibilityLabelKey={mode === 'edit' ? 'a11y/Remove edit' : 'a11y/Remove reply'}
175
+ onPress={onDismiss}
176
+ />
170
177
  </View>
171
178
  ) : null}
172
179
  </View>
@@ -412,6 +412,8 @@ exports[`Thread should match thread snapshot 1`] = `
412
412
  testID="avatar-image"
413
413
  >
414
414
  <Image
415
+ accessibilityElementsHidden={true}
416
+ importantForAccessibility="no"
415
417
  onError={[Function]}
416
418
  source={
417
419
  {
@@ -753,6 +755,8 @@ exports[`Thread should match thread snapshot 1`] = `
753
755
  testID="avatar-image"
754
756
  >
755
757
  <Image
758
+ accessibilityElementsHidden={true}
759
+ importantForAccessibility="no"
756
760
  onError={[Function]}
757
761
  source={
758
762
  {
@@ -1127,6 +1131,8 @@ exports[`Thread should match thread snapshot 1`] = `
1127
1131
  testID="avatar-image"
1128
1132
  >
1129
1133
  <Image
1134
+ accessibilityElementsHidden={true}
1135
+ importantForAccessibility="no"
1130
1136
  onError={[Function]}
1131
1137
  source={
1132
1138
  {
@@ -1459,6 +1465,8 @@ exports[`Thread should match thread snapshot 1`] = `
1459
1465
  testID="avatar-image"
1460
1466
  >
1461
1467
  <Image
1468
+ accessibilityElementsHidden={true}
1469
+ importantForAccessibility="no"
1462
1470
  onError={[Function]}
1463
1471
  source={
1464
1472
  {
@@ -1726,6 +1734,9 @@ exports[`Thread should match thread snapshot 1`] = `
1726
1734
  </View>
1727
1735
  </RCTScrollView>
1728
1736
  <View
1737
+ accessibilityElementsHidden={true}
1738
+ accessible={false}
1739
+ importantForAccessibility="no-hide-descendants"
1729
1740
  style={
1730
1741
  {
1731
1742
  "left": 0,
@@ -1827,13 +1838,14 @@ exports[`Thread should match thread snapshot 1`] = `
1827
1838
  }
1828
1839
  >
1829
1840
  <View
1841
+ accessibilityRole="button"
1830
1842
  accessibilityState={
1831
1843
  {
1832
1844
  "busy": undefined,
1833
1845
  "checked": undefined,
1834
1846
  "disabled": false,
1835
1847
  "expanded": undefined,
1836
- "selected": undefined,
1848
+ "selected": false,
1837
1849
  }
1838
1850
  }
1839
1851
  accessibilityValue={
@@ -2191,13 +2203,14 @@ exports[`Thread should match thread snapshot 1`] = `
2191
2203
  }
2192
2204
  >
2193
2205
  <View
2206
+ accessibilityRole="button"
2194
2207
  accessibilityState={
2195
2208
  {
2196
2209
  "busy": undefined,
2197
2210
  "checked": undefined,
2198
2211
  "disabled": true,
2199
2212
  "expanded": undefined,
2200
- "selected": undefined,
2213
+ "selected": false,
2201
2214
  }
2202
2215
  }
2203
2216
  accessibilityValue={
@@ -2374,13 +2387,14 @@ exports[`Thread should match thread snapshot 1`] = `
2374
2387
  }
2375
2388
  >
2376
2389
  <View
2390
+ accessibilityRole="button"
2377
2391
  accessibilityState={
2378
2392
  {
2379
2393
  "busy": undefined,
2380
2394
  "checked": undefined,
2381
2395
  "disabled": false,
2382
2396
  "expanded": undefined,
2383
- "selected": undefined,
2397
+ "selected": false,
2384
2398
  }
2385
2399
  }
2386
2400
  accessibilityValue={
@@ -2513,13 +2527,14 @@ exports[`Thread should match thread snapshot 1`] = `
2513
2527
  }
2514
2528
  >
2515
2529
  <View
2530
+ accessibilityRole="button"
2516
2531
  accessibilityState={
2517
2532
  {
2518
2533
  "busy": undefined,
2519
2534
  "checked": undefined,
2520
2535
  "disabled": false,
2521
2536
  "expanded": undefined,
2522
- "selected": undefined,
2537
+ "selected": false,
2523
2538
  }
2524
2539
  }
2525
2540
  accessibilityValue={
@@ -2681,13 +2696,14 @@ exports[`Thread should match thread snapshot 1`] = `
2681
2696
  }
2682
2697
  >
2683
2698
  <View
2699
+ accessibilityRole="button"
2684
2700
  accessibilityState={
2685
2701
  {
2686
2702
  "busy": undefined,
2687
2703
  "checked": undefined,
2688
2704
  "disabled": false,
2689
2705
  "expanded": undefined,
2690
- "selected": undefined,
2706
+ "selected": false,
2691
2707
  }
2692
2708
  }
2693
2709
  accessibilityValue={
@@ -2816,13 +2832,14 @@ exports[`Thread should match thread snapshot 1`] = `
2816
2832
  }
2817
2833
  >
2818
2834
  <View
2835
+ accessibilityRole="button"
2819
2836
  accessibilityState={
2820
2837
  {
2821
2838
  "busy": undefined,
2822
2839
  "checked": undefined,
2823
2840
  "disabled": false,
2824
2841
  "expanded": undefined,
2825
- "selected": undefined,
2842
+ "selected": false,
2826
2843
  }
2827
2844
  }
2828
2845
  accessibilityValue={
@@ -38,6 +38,7 @@ import {
38
38
  getBottomSheetTopSnapIndex,
39
39
  } from './BottomSheetModal.utils';
40
40
 
41
+ import { useResolvedModalAccessibilityProps } from '../../a11y/hooks/useResolvedModalAccessibilityProps';
41
42
  import { BottomSheetProvider } from '../../contexts/bottomSheetContext/BottomSheetContext';
42
43
  import { useTheme } from '../../contexts/themeContext/ThemeContext';
43
44
  import { useStableCallback } from '../../hooks';
@@ -501,6 +502,8 @@ const BottomSheetModalInner = (props: PropsWithChildren<BottomSheetModalProps>)
501
502
 
502
503
  const onBackdropPress = useStableCallback(() => close());
503
504
 
505
+ const modalA11yProps = useResolvedModalAccessibilityProps();
506
+
504
507
  const bottomSheetModalContextValue = useMemo(
505
508
  () => ({
506
509
  close,
@@ -523,6 +526,7 @@ const BottomSheetModalInner = (props: PropsWithChildren<BottomSheetModalProps>)
523
526
  <Animated.View
524
527
  pointerEvents='box-none'
525
528
  style={[{ height: maxHeight }, sheetViewportAnimatedStyle]}
529
+ {...modalA11yProps}
526
530
  >
527
531
  <GestureDetector gesture={panGesture}>
528
532
  <Animated.View style={[styles.container, { height: maxHeight }, container]}>
@@ -1,3 +1,5 @@
1
+ export * from './Accessibility';
2
+
1
3
  export * from './Attachment/Attachment';
2
4
  export * from './Attachment/Audio';
3
5
  export * from './Attachment/UrlPreview';
@@ -3,16 +3,28 @@ import { ColorValue, StyleProp, StyleSheet, View, ViewStyle } from 'react-native
3
3
 
4
4
  import { avatarSizes } from './constants';
5
5
 
6
+ import { useA11yLabel } from '../../../a11y/hooks/useA11yLabel';
6
7
  import { useComponentsContext } from '../../../contexts/componentsContext/ComponentsContext';
7
8
  import { useTheme } from '../../../contexts/themeContext/ThemeContext';
8
9
  import { primitives } from '../../../theme';
9
10
 
10
11
  export type AvatarProps = {
11
12
  size: '2xl' | 'xl' | 'lg' | 'md' | 'sm' | 'xs';
13
+ /**
14
+ * Override for the auto-generated accessibility label. When omitted and a
15
+ * `name` is provided, the SDK uses `a11y/Avatar of {{name}}`.
16
+ */
17
+ accessibilityLabel?: string;
18
+ backgroundColor?: ColorValue;
12
19
  imageUrl?: string;
20
+ /**
21
+ * Display name of the entity this avatar represents (user, channel). Used to
22
+ * compose the default `accessibilityLabel`. Optional — when neither this nor
23
+ * `accessibilityLabel` is provided, the avatar is left unlabeled.
24
+ */
25
+ name?: string;
13
26
  placeholder?: React.ReactNode;
14
27
  showBorder?: boolean;
15
- backgroundColor?: ColorValue;
16
28
  style?: StyleProp<ViewStyle>;
17
29
  };
18
30
 
@@ -24,14 +36,19 @@ export const Avatar = (props: AvatarProps) => {
24
36
  const { ImageComponent } = useComponentsContext();
25
37
  const defaultAvatarBg = semantics.avatarPaletteBg1;
26
38
  const {
39
+ accessibilityLabel: accessibilityLabelOverride,
27
40
  backgroundColor = defaultAvatarBg,
28
- size,
29
41
  imageUrl,
42
+ name,
30
43
  placeholder,
31
44
  showBorder,
45
+ size,
32
46
  style,
33
47
  } = props;
34
48
  const styles = useStyles();
49
+ const accessibilityLabelParams = useMemo(() => ({ name: name ?? '' }), [name]);
50
+ const composedLabel = useA11yLabel('a11y/Avatar of {{name}}', accessibilityLabelParams);
51
+ const accessibilityLabel = accessibilityLabelOverride ?? (name ? composedLabel : undefined);
35
52
 
36
53
  const onHandleError = useCallback(() => {
37
54
  setError(true);
@@ -39,6 +56,9 @@ export const Avatar = (props: AvatarProps) => {
39
56
 
40
57
  return (
41
58
  <View
59
+ accessibilityLabel={accessibilityLabel}
60
+ accessibilityRole={accessibilityLabel ? 'image' : undefined}
61
+ accessible={accessibilityLabel ? true : undefined}
42
62
  style={[
43
63
  styles.container,
44
64
  avatarSizes[size],
@@ -50,6 +70,8 @@ export const Avatar = (props: AvatarProps) => {
50
70
  >
51
71
  {imageUrl && !error ? (
52
72
  <ImageComponent
73
+ accessibilityElementsHidden
74
+ importantForAccessibility='no'
53
75
  onError={onHandleError}
54
76
  source={{ uri: imageUrl }}
55
77
  style={[styles.image, avatarSizes[size]]}
@@ -45,11 +45,14 @@ export const ChannelAvatar = (props: ChannelAvatarProps) => {
45
45
  [usersForGroup, client.user?.id],
46
46
  );
47
47
 
48
+ const channelName = (channel.data?.name as string | undefined) ?? channel.cid;
49
+
48
50
  if (channelImage) {
49
51
  return (
50
52
  <Avatar
51
53
  backgroundColor={avatarBackgroundColor}
52
54
  imageUrl={channelImage}
55
+ name={channelName}
53
56
  showBorder={showBorder}
54
57
  size={size}
55
58
  />
@@ -50,6 +50,7 @@ export const UserAvatar = (props: UserAvatarProps) => {
50
50
  <Avatar
51
51
  backgroundColor={avatarBackgroundColor}
52
52
  imageUrl={user?.image}
53
+ name={user?.name || user?.id}
53
54
  placeholder={placeholder}
54
55
  showBorder={showBorder}
55
56
  size={size}
@@ -6,13 +6,45 @@ import { Pressable, PressableProps } from 'react-native-gesture-handler';
6
6
  import { buttonPadding, buttonSizes } from './constants';
7
7
  import { useButtonStyles } from './hooks/useButtonStyles';
8
8
 
9
+ import { useA11yLabel } from '../../../a11y/hooks/useA11yLabel';
10
+ import { useAccessibilityActivateAction } from '../../../a11y/hooks/useAccessibilityActivateAction';
9
11
  import { useTheme } from '../../../contexts/themeContext/ThemeContext';
10
12
  import { IconProps } from '../../../icons/utils/base';
11
13
  import { primitives } from '../../../theme';
12
14
 
13
15
  export type IconRenderer = (props: IconProps) => React.ReactNode;
14
16
 
17
+ const buttonAccessibilityStates = {
18
+ disabled: { disabled: true, selected: false },
19
+ disabledSelected: { disabled: true, selected: true },
20
+ enabled: { disabled: false, selected: false },
21
+ selected: { disabled: false, selected: true },
22
+ } as const;
23
+
24
+ const getButtonAccessibilityState = ({
25
+ disabled,
26
+ selected,
27
+ }: {
28
+ disabled: boolean;
29
+ selected: boolean;
30
+ }) => {
31
+ if (disabled)
32
+ return selected
33
+ ? buttonAccessibilityStates.disabledSelected
34
+ : buttonAccessibilityStates.disabled;
35
+ return selected ? buttonAccessibilityStates.selected : buttonAccessibilityStates.enabled;
36
+ };
37
+
15
38
  export type ButtonProps = PressableProps & {
39
+ /**
40
+ * Translation key used for the button's accessibility label when SDK
41
+ * accessibility is enabled. Prefer this for SDK-owned icon-only buttons.
42
+ */
43
+ accessibilityLabelKey?: string;
44
+ /**
45
+ * Optional interpolation params for `accessibilityLabelKey`.
46
+ */
47
+ accessibilityLabelParams?: Record<string, unknown>;
16
48
  /**
17
49
  * The style of the button.
18
50
  */
@@ -53,6 +85,9 @@ export type ButtonProps = PressableProps & {
53
85
  };
54
86
 
55
87
  export const Button = ({
88
+ accessibilityLabel,
89
+ accessibilityLabelKey,
90
+ accessibilityLabelParams,
56
91
  variant,
57
92
  type,
58
93
  selected = false,
@@ -78,6 +113,16 @@ export const Button = ({
78
113
  const RightIcon = isRTL ? LeadingIcon : TrailingIcon;
79
114
  const IconOnlyIcon = LeadingIcon ?? TrailingIcon;
80
115
  const PrimaryIcon = iconOnly ? IconOnlyIcon : LeftIcon;
116
+ const accessibilityState = getButtonAccessibilityState({ disabled: !!disabled, selected });
117
+ const translatedAccessibilityLabel = useA11yLabel(
118
+ accessibilityLabelKey ?? '',
119
+ accessibilityLabelParams,
120
+ );
121
+ const resolvedAccessibilityLabel = translatedAccessibilityLabel ?? accessibilityLabel;
122
+ const accessibilityActivateActionProps = useAccessibilityActivateAction({
123
+ onPress: rest.onPress,
124
+ shouldHandleActivate: !!rest.onPress && !disabled && !!resolvedAccessibilityLabel,
125
+ });
81
126
 
82
127
  return (
83
128
  <View
@@ -97,6 +142,10 @@ export const Button = ({
97
142
  onLayout={onLayout}
98
143
  >
99
144
  <Pressable
145
+ accessible
146
+ accessibilityLabel={resolvedAccessibilityLabel}
147
+ accessibilityRole='button'
148
+ accessibilityState={accessibilityState}
100
149
  style={({ pressed }) => [
101
150
  {
102
151
  backgroundColor: pressed
@@ -109,6 +158,7 @@ export const Button = ({
109
158
  styles.container,
110
159
  ]}
111
160
  disabled={disabled}
161
+ {...accessibilityActivateActionProps}
112
162
  {...rest}
113
163
  >
114
164
  {PrimaryIcon ? (
@@ -0,0 +1,44 @@
1
+ import React from 'react';
2
+
3
+ import { render, screen, waitFor } from '@testing-library/react-native';
4
+
5
+ import { OverlayProvider } from '../../../../contexts';
6
+ import { Button } from '../Button';
7
+
8
+ describe('Button accessibilityLabelKey', () => {
9
+ it('uses the translated accessibility label when accessibility is enabled', async () => {
10
+ render(
11
+ <OverlayProvider accessibility={{ enabled: true }}>
12
+ <Button
13
+ accessibilityLabelKey='a11y/Add attachment'
14
+ iconOnly
15
+ onPress={jest.fn()}
16
+ size='md'
17
+ type='outline'
18
+ variant='secondary'
19
+ />
20
+ </OverlayProvider>,
21
+ );
22
+
23
+ await waitFor(() => {
24
+ expect(screen.getByLabelText('Add attachment')).toBeTruthy();
25
+ });
26
+ });
27
+
28
+ it('supports a plain accessibilityLabel without the translation path', () => {
29
+ render(
30
+ <OverlayProvider>
31
+ <Button
32
+ accessibilityLabel='Legacy label'
33
+ iconOnly
34
+ onPress={jest.fn()}
35
+ size='md'
36
+ type='outline'
37
+ variant='secondary'
38
+ />
39
+ </OverlayProvider>,
40
+ );
41
+
42
+ expect(screen.getByLabelText('Legacy label')).toBeTruthy();
43
+ });
44
+ });
@@ -18,6 +18,25 @@ import { InfoTooltip } from '../../../icons/info';
18
18
  import { primitives } from '../../../theme';
19
19
  import { IconRenderer } from '../Button';
20
20
 
21
+ const inputAccessibilityStates = {
22
+ disabled: { disabled: true, selected: false },
23
+ disabledSelected: { disabled: true, selected: true },
24
+ enabled: { disabled: false, selected: false },
25
+ selected: { disabled: false, selected: true },
26
+ } as const;
27
+
28
+ const getInputAccessibilityState = ({
29
+ disabled,
30
+ selected,
31
+ }: {
32
+ disabled: boolean;
33
+ selected: boolean;
34
+ }) => {
35
+ if (disabled)
36
+ return selected ? inputAccessibilityStates.disabledSelected : inputAccessibilityStates.disabled;
37
+ return selected ? inputAccessibilityStates.selected : inputAccessibilityStates.enabled;
38
+ };
39
+
21
40
  export type InputProps = TextInputProps & {
22
41
  title?: string;
23
42
  description?: string;
@@ -59,6 +78,10 @@ export const Input = ({
59
78
 
60
79
  const LeftIcon = isRTL ? TrailingIcon : LeadingIcon;
61
80
  const RightIcon = isRTL ? LeadingIcon : TrailingIcon;
81
+ const accessibilityState = getInputAccessibilityState({
82
+ disabled: !editable,
83
+ selected: isFocused,
84
+ });
62
85
 
63
86
  const handleFocus = useCallback(
64
87
  (e: TextInputFocusEvent) => {
@@ -104,6 +127,9 @@ export const Input = ({
104
127
  />
105
128
  ) : null}
106
129
  <TextInput
130
+ accessibilityHint={description}
131
+ accessibilityLabel={props.accessibilityLabel ?? title}
132
+ accessibilityState={accessibilityState}
107
133
  editable={editable}
108
134
  onFocus={handleFocus}
109
135
  onBlur={handleBlur}
@@ -111,6 +137,15 @@ export const Input = ({
111
137
  placeholderTextColor={semantics.inputTextPlaceholder}
112
138
  {...props}
113
139
  />
140
+ {state === 'error' && errorMessage ? (
141
+ <View
142
+ accessibilityLiveRegion='assertive'
143
+ accessibilityRole='alert'
144
+ style={{ width: 0, height: 0 }}
145
+ >
146
+ <Text>{errorMessage}</Text>
147
+ </View>
148
+ ) : null}
114
149
  {RightIcon ? (
115
150
  <RightIcon
116
151
  height={20}