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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (579) hide show
  1. package/README.md +1 -1
  2. package/lib/commonjs/a11y/hooks/useA11yLabel.js +4 -3
  3. package/lib/commonjs/a11y/hooks/useA11yLabel.js.map +1 -1
  4. package/lib/commonjs/a11y/hooks/useAccessibilityActivateAction.js +25 -0
  5. package/lib/commonjs/a11y/hooks/useAccessibilityActivateAction.js.map +1 -0
  6. package/lib/commonjs/a11y/index.js +11 -0
  7. package/lib/commonjs/a11y/index.js.map +1 -1
  8. package/lib/commonjs/components/AttachmentPicker/AttachmentPicker.js +20 -0
  9. package/lib/commonjs/components/AttachmentPicker/AttachmentPicker.js.map +1 -1
  10. package/lib/commonjs/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentMediaPicker.js +1 -0
  11. package/lib/commonjs/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentMediaPicker.js.map +1 -1
  12. package/lib/commonjs/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.js +19 -2
  13. package/lib/commonjs/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.js.map +1 -1
  14. package/lib/commonjs/components/AttachmentPicker/components/AttachmentPickerContent.js +4 -3
  15. package/lib/commonjs/components/AttachmentPicker/components/AttachmentPickerContent.js.map +1 -1
  16. package/lib/commonjs/components/AttachmentPicker/components/AttachmentTypePickerButton.js +9 -1
  17. package/lib/commonjs/components/AttachmentPicker/components/AttachmentTypePickerButton.js.map +1 -1
  18. package/lib/commonjs/components/Channel/Channel.js +10 -1
  19. package/lib/commonjs/components/Channel/Channel.js.map +1 -1
  20. package/lib/commonjs/components/Channel/hooks/useMessageListPagination.js +26 -3
  21. package/lib/commonjs/components/Channel/hooks/useMessageListPagination.js.map +1 -1
  22. package/lib/commonjs/components/ChannelList/ChannelList.js +29 -4
  23. package/lib/commonjs/components/ChannelList/ChannelList.js.map +1 -1
  24. package/lib/commonjs/components/ChannelList/hooks/useChannelActions.js +314 -11
  25. package/lib/commonjs/components/ChannelList/hooks/useChannelActions.js.map +1 -1
  26. package/lib/commonjs/components/ImageGallery/components/ImageGalleryFooter.js +2 -2
  27. package/lib/commonjs/components/ImageGallery/components/ImageGalleryFooter.js.map +1 -1
  28. package/lib/commonjs/components/ImageGallery/components/ImageGalleryHeader.js +1 -1
  29. package/lib/commonjs/components/ImageGallery/components/ImageGalleryHeader.js.map +1 -1
  30. package/lib/commonjs/components/ImageGallery/components/ImageGalleryVideoControl.js +1 -1
  31. package/lib/commonjs/components/ImageGallery/components/ImageGalleryVideoControl.js.map +1 -1
  32. package/lib/commonjs/components/Message/hooks/useMessageActionHandlers.js +202 -15
  33. package/lib/commonjs/components/Message/hooks/useMessageActionHandlers.js.map +1 -1
  34. package/lib/commonjs/components/MessageInput/MessageComposer.js +1 -1
  35. package/lib/commonjs/components/MessageInput/MessageComposerLeadingView.js +1 -1
  36. package/lib/commonjs/components/MessageInput/MessageComposerLeadingView.js.map +1 -1
  37. package/lib/commonjs/components/MessageInput/MessageInputHeaderView.js +1 -1
  38. package/lib/commonjs/components/MessageInput/MessageInputHeaderView.js.map +1 -1
  39. package/lib/commonjs/components/MessageInput/MessageInputTrailingView.js +1 -1
  40. package/lib/commonjs/components/MessageInput/MessageInputTrailingView.js.map +1 -1
  41. package/lib/commonjs/components/MessageInput/components/AttachmentPreview/AttachmentRemoveControl.js +16 -4
  42. package/lib/commonjs/components/MessageInput/components/AttachmentPreview/AttachmentRemoveControl.js.map +1 -1
  43. package/lib/commonjs/components/MessageInput/components/AttachmentPreview/AttachmentUploadPreviewList.js +7 -13
  44. package/lib/commonjs/components/MessageInput/components/AttachmentPreview/AttachmentUploadPreviewList.js.map +1 -1
  45. package/lib/commonjs/components/MessageInput/components/AudioRecorder/AudioRecorder.js +30 -6
  46. package/lib/commonjs/components/MessageInput/components/AudioRecorder/AudioRecorder.js.map +1 -1
  47. package/lib/commonjs/components/MessageInput/components/AudioRecorder/AudioRecordingButton.js +34 -9
  48. package/lib/commonjs/components/MessageInput/components/AudioRecorder/AudioRecordingButton.js.map +1 -1
  49. package/lib/commonjs/components/MessageInput/components/InputButtons/AttachButton.js +12 -3
  50. package/lib/commonjs/components/MessageInput/components/InputButtons/AttachButton.js.map +1 -1
  51. package/lib/commonjs/components/MessageInput/components/OutputButtons/EditButton.js +1 -0
  52. package/lib/commonjs/components/MessageInput/components/OutputButtons/EditButton.js.map +1 -1
  53. package/lib/commonjs/components/MessageInput/components/OutputButtons/SendButton.js +1 -0
  54. package/lib/commonjs/components/MessageInput/components/OutputButtons/SendButton.js.map +1 -1
  55. package/lib/commonjs/components/MessageInput/components/OutputButtons/index.js +1 -1
  56. package/lib/commonjs/components/MessageList/MessageFlashList.js +24 -4
  57. package/lib/commonjs/components/MessageList/MessageFlashList.js.map +1 -1
  58. package/lib/commonjs/components/MessageList/MessageList.js +24 -4
  59. package/lib/commonjs/components/MessageList/MessageList.js.map +1 -1
  60. package/lib/commonjs/components/MessageList/ScrollToBottomButton.js +12 -6
  61. package/lib/commonjs/components/MessageList/ScrollToBottomButton.js.map +1 -1
  62. package/lib/commonjs/components/MessageList/UnreadMessagesNotification.js +1 -0
  63. package/lib/commonjs/components/MessageList/UnreadMessagesNotification.js.map +1 -1
  64. package/lib/commonjs/components/MessageList/hooks/useScrollToBottomAccessibilityAction.js +47 -0
  65. package/lib/commonjs/components/MessageList/hooks/useScrollToBottomAccessibilityAction.js.map +1 -0
  66. package/lib/commonjs/components/MessageMenu/MessageActionListItem.js +12 -4
  67. package/lib/commonjs/components/MessageMenu/MessageActionListItem.js.map +1 -1
  68. package/lib/commonjs/components/MessageMenu/MessageReactionPicker.js +1 -0
  69. package/lib/commonjs/components/MessageMenu/MessageReactionPicker.js.map +1 -1
  70. package/lib/commonjs/components/MessageMenu/ReactionButton.js +9 -6
  71. package/lib/commonjs/components/MessageMenu/ReactionButton.js.map +1 -1
  72. package/lib/commonjs/components/MessageMenu/hooks/useFetchReactions.js +23 -2
  73. package/lib/commonjs/components/MessageMenu/hooks/useFetchReactions.js.map +1 -1
  74. package/lib/commonjs/components/Notifications/Notification.js +232 -0
  75. package/lib/commonjs/components/Notifications/Notification.js.map +1 -0
  76. package/lib/commonjs/components/Notifications/NotificationList.js +120 -0
  77. package/lib/commonjs/components/Notifications/NotificationList.js.map +1 -0
  78. package/lib/commonjs/components/Notifications/NotificationTargetContext.js +45 -0
  79. package/lib/commonjs/components/Notifications/NotificationTargetContext.js.map +1 -0
  80. package/lib/commonjs/components/Notifications/hooks/index.js +59 -0
  81. package/lib/commonjs/components/Notifications/hooks/index.js.map +1 -0
  82. package/lib/commonjs/components/Notifications/hooks/useNotificationApi.js +133 -0
  83. package/lib/commonjs/components/Notifications/hooks/useNotificationApi.js.map +1 -0
  84. package/lib/commonjs/components/Notifications/hooks/useNotificationListController.js +133 -0
  85. package/lib/commonjs/components/Notifications/hooks/useNotificationListController.js.map +1 -0
  86. package/lib/commonjs/components/Notifications/hooks/useNotificationTarget.js +26 -0
  87. package/lib/commonjs/components/Notifications/hooks/useNotificationTarget.js.map +1 -0
  88. package/lib/commonjs/components/Notifications/hooks/useNotifications.js +26 -0
  89. package/lib/commonjs/components/Notifications/hooks/useNotifications.js.map +1 -0
  90. package/lib/commonjs/components/Notifications/hooks/useSystemNotifications.js +22 -0
  91. package/lib/commonjs/components/Notifications/hooks/useSystemNotifications.js.map +1 -0
  92. package/lib/commonjs/components/Notifications/index.js +59 -0
  93. package/lib/commonjs/components/Notifications/index.js.map +1 -0
  94. package/lib/commonjs/components/Notifications/notificationTarget.js +220 -0
  95. package/lib/commonjs/components/Notifications/notificationTarget.js.map +1 -0
  96. package/lib/commonjs/components/Notifications/notificationTranslations.js +137 -0
  97. package/lib/commonjs/components/Notifications/notificationTranslations.js.map +1 -0
  98. package/lib/commonjs/components/Poll/components/CreatePollHeader.js +2 -0
  99. package/lib/commonjs/components/Poll/components/CreatePollHeader.js.map +1 -1
  100. package/lib/commonjs/components/Poll/components/MultipleVotesSettings.js +2 -0
  101. package/lib/commonjs/components/Poll/components/MultipleVotesSettings.js.map +1 -1
  102. package/lib/commonjs/components/Poll/components/PollModalHeader.js +1 -0
  103. package/lib/commonjs/components/Poll/components/PollModalHeader.js.map +1 -1
  104. package/lib/commonjs/components/Poll/components/PollOption.js +14 -9
  105. package/lib/commonjs/components/Poll/components/PollOption.js.map +1 -1
  106. package/lib/commonjs/components/Poll/hooks/usePollState.js +35 -3
  107. package/lib/commonjs/components/Poll/hooks/usePollState.js.map +1 -1
  108. package/lib/commonjs/components/Reply/Reply.js +1 -0
  109. package/lib/commonjs/components/Reply/Reply.js.map +1 -1
  110. package/lib/commonjs/components/Thread/Thread.js +19 -11
  111. package/lib/commonjs/components/Thread/Thread.js.map +1 -1
  112. package/lib/commonjs/components/ThreadList/ThreadList.js +30 -9
  113. package/lib/commonjs/components/ThreadList/ThreadList.js.map +1 -1
  114. package/lib/commonjs/components/index.js +11 -0
  115. package/lib/commonjs/components/index.js.map +1 -1
  116. package/lib/commonjs/components/ui/Avatar/Avatar.js +6 -3
  117. package/lib/commonjs/components/ui/Avatar/Avatar.js.map +1 -1
  118. package/lib/commonjs/components/ui/Button/Button.js +16 -3
  119. package/lib/commonjs/components/ui/Button/Button.js.map +1 -1
  120. package/lib/commonjs/contexts/accessibilityContext/AccessibilityContext.js +21 -1
  121. package/lib/commonjs/contexts/accessibilityContext/AccessibilityContext.js.map +1 -1
  122. package/lib/commonjs/contexts/componentsContext/defaultComponents.js +4 -0
  123. package/lib/commonjs/contexts/componentsContext/defaultComponents.js.map +1 -1
  124. package/lib/commonjs/contexts/messageInputContext/MessageInputContext.js +37 -0
  125. package/lib/commonjs/contexts/messageInputContext/MessageInputContext.js.map +1 -1
  126. package/lib/commonjs/contexts/themeContext/utils/theme.js +13 -0
  127. package/lib/commonjs/contexts/themeContext/utils/theme.js.map +1 -1
  128. package/lib/commonjs/hooks/index.js +11 -0
  129. package/lib/commonjs/hooks/index.js.map +1 -1
  130. package/lib/commonjs/hooks/useAudioPlayer.js +34 -1
  131. package/lib/commonjs/hooks/useAudioPlayer.js.map +1 -1
  132. package/lib/commonjs/hooks/useInAppNotificationsState.js.map +1 -1
  133. package/lib/commonjs/hooks/useLazyRef.js +13 -0
  134. package/lib/commonjs/hooks/useLazyRef.js.map +1 -0
  135. package/lib/commonjs/i18n/en.json +94 -1
  136. package/lib/commonjs/i18n/es.json +96 -3
  137. package/lib/commonjs/i18n/fr.json +94 -1
  138. package/lib/commonjs/i18n/he.json +94 -1
  139. package/lib/commonjs/i18n/hi.json +94 -1
  140. package/lib/commonjs/i18n/it.json +94 -1
  141. package/lib/commonjs/i18n/ja.json +94 -1
  142. package/lib/commonjs/i18n/ko.json +94 -1
  143. package/lib/commonjs/i18n/nl.json +94 -1
  144. package/lib/commonjs/i18n/pt-br.json +94 -1
  145. package/lib/commonjs/i18n/ru.json +94 -1
  146. package/lib/commonjs/i18n/tr.json +94 -1
  147. package/lib/commonjs/mock-builders/DB/mock.js +3 -1
  148. package/lib/commonjs/mock-builders/DB/mock.js.map +1 -1
  149. package/lib/commonjs/state-store/audio-player-pool.js +1 -0
  150. package/lib/commonjs/state-store/audio-player-pool.js.map +1 -1
  151. package/lib/commonjs/state-store/audio-player.js +92 -13
  152. package/lib/commonjs/state-store/audio-player.js.map +1 -1
  153. package/lib/commonjs/test-utils/BetterSqlite.js +3 -2
  154. package/lib/commonjs/test-utils/BetterSqlite.js.map +1 -1
  155. package/lib/commonjs/theme/generated/dark/StreamTokens.android.js +16 -16
  156. package/lib/commonjs/theme/generated/dark/StreamTokens.android.js.map +1 -1
  157. package/lib/commonjs/theme/generated/dark/StreamTokens.ios.js +8 -8
  158. package/lib/commonjs/theme/generated/dark/StreamTokens.ios.js.map +1 -1
  159. package/lib/commonjs/theme/generated/dark/StreamTokens.web.js +8 -8
  160. package/lib/commonjs/theme/generated/dark/StreamTokens.web.js.map +1 -1
  161. package/lib/commonjs/theme/generated/light/StreamTokens.android.js +16 -16
  162. package/lib/commonjs/theme/generated/light/StreamTokens.android.js.map +1 -1
  163. package/lib/commonjs/theme/generated/light/StreamTokens.ios.js +8 -8
  164. package/lib/commonjs/theme/generated/light/StreamTokens.ios.js.map +1 -1
  165. package/lib/commonjs/theme/generated/light/StreamTokens.web.js +8 -8
  166. package/lib/commonjs/theme/generated/light/StreamTokens.web.js.map +1 -1
  167. package/lib/commonjs/utils/animations/createBoundedZoomTransition.js +151 -0
  168. package/lib/commonjs/utils/animations/createBoundedZoomTransition.js.map +1 -0
  169. package/lib/commonjs/utils/{transitions.js → animations/transitions.js} +6 -0
  170. package/lib/commonjs/utils/animations/transitions.js.map +1 -0
  171. package/lib/commonjs/version.json +1 -1
  172. package/lib/module/a11y/hooks/useA11yLabel.js +4 -3
  173. package/lib/module/a11y/hooks/useA11yLabel.js.map +1 -1
  174. package/lib/module/a11y/hooks/useAccessibilityActivateAction.js +25 -0
  175. package/lib/module/a11y/hooks/useAccessibilityActivateAction.js.map +1 -0
  176. package/lib/module/a11y/index.js +11 -0
  177. package/lib/module/a11y/index.js.map +1 -1
  178. package/lib/module/components/AttachmentPicker/AttachmentPicker.js +20 -0
  179. package/lib/module/components/AttachmentPicker/AttachmentPicker.js.map +1 -1
  180. package/lib/module/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentMediaPicker.js +1 -0
  181. package/lib/module/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentMediaPicker.js.map +1 -1
  182. package/lib/module/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.js +19 -2
  183. package/lib/module/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.js.map +1 -1
  184. package/lib/module/components/AttachmentPicker/components/AttachmentPickerContent.js +4 -3
  185. package/lib/module/components/AttachmentPicker/components/AttachmentPickerContent.js.map +1 -1
  186. package/lib/module/components/AttachmentPicker/components/AttachmentTypePickerButton.js +9 -1
  187. package/lib/module/components/AttachmentPicker/components/AttachmentTypePickerButton.js.map +1 -1
  188. package/lib/module/components/Channel/Channel.js +10 -1
  189. package/lib/module/components/Channel/Channel.js.map +1 -1
  190. package/lib/module/components/Channel/hooks/useMessageListPagination.js +26 -3
  191. package/lib/module/components/Channel/hooks/useMessageListPagination.js.map +1 -1
  192. package/lib/module/components/ChannelList/ChannelList.js +29 -4
  193. package/lib/module/components/ChannelList/ChannelList.js.map +1 -1
  194. package/lib/module/components/ChannelList/hooks/useChannelActions.js +314 -11
  195. package/lib/module/components/ChannelList/hooks/useChannelActions.js.map +1 -1
  196. package/lib/module/components/ImageGallery/components/ImageGalleryFooter.js +2 -2
  197. package/lib/module/components/ImageGallery/components/ImageGalleryFooter.js.map +1 -1
  198. package/lib/module/components/ImageGallery/components/ImageGalleryHeader.js +1 -1
  199. package/lib/module/components/ImageGallery/components/ImageGalleryHeader.js.map +1 -1
  200. package/lib/module/components/ImageGallery/components/ImageGalleryVideoControl.js +1 -1
  201. package/lib/module/components/ImageGallery/components/ImageGalleryVideoControl.js.map +1 -1
  202. package/lib/module/components/Message/hooks/useMessageActionHandlers.js +202 -15
  203. package/lib/module/components/Message/hooks/useMessageActionHandlers.js.map +1 -1
  204. package/lib/module/components/MessageInput/MessageComposer.js +1 -1
  205. package/lib/module/components/MessageInput/MessageComposerLeadingView.js +1 -1
  206. package/lib/module/components/MessageInput/MessageComposerLeadingView.js.map +1 -1
  207. package/lib/module/components/MessageInput/MessageInputHeaderView.js +1 -1
  208. package/lib/module/components/MessageInput/MessageInputHeaderView.js.map +1 -1
  209. package/lib/module/components/MessageInput/MessageInputTrailingView.js +1 -1
  210. package/lib/module/components/MessageInput/MessageInputTrailingView.js.map +1 -1
  211. package/lib/module/components/MessageInput/components/AttachmentPreview/AttachmentRemoveControl.js +16 -4
  212. package/lib/module/components/MessageInput/components/AttachmentPreview/AttachmentRemoveControl.js.map +1 -1
  213. package/lib/module/components/MessageInput/components/AttachmentPreview/AttachmentUploadPreviewList.js +7 -13
  214. package/lib/module/components/MessageInput/components/AttachmentPreview/AttachmentUploadPreviewList.js.map +1 -1
  215. package/lib/module/components/MessageInput/components/AudioRecorder/AudioRecorder.js +30 -6
  216. package/lib/module/components/MessageInput/components/AudioRecorder/AudioRecorder.js.map +1 -1
  217. package/lib/module/components/MessageInput/components/AudioRecorder/AudioRecordingButton.js +34 -9
  218. package/lib/module/components/MessageInput/components/AudioRecorder/AudioRecordingButton.js.map +1 -1
  219. package/lib/module/components/MessageInput/components/InputButtons/AttachButton.js +12 -3
  220. package/lib/module/components/MessageInput/components/InputButtons/AttachButton.js.map +1 -1
  221. package/lib/module/components/MessageInput/components/OutputButtons/EditButton.js +1 -0
  222. package/lib/module/components/MessageInput/components/OutputButtons/EditButton.js.map +1 -1
  223. package/lib/module/components/MessageInput/components/OutputButtons/SendButton.js +1 -0
  224. package/lib/module/components/MessageInput/components/OutputButtons/SendButton.js.map +1 -1
  225. package/lib/module/components/MessageInput/components/OutputButtons/index.js +1 -1
  226. package/lib/module/components/MessageList/MessageFlashList.js +24 -4
  227. package/lib/module/components/MessageList/MessageFlashList.js.map +1 -1
  228. package/lib/module/components/MessageList/MessageList.js +24 -4
  229. package/lib/module/components/MessageList/MessageList.js.map +1 -1
  230. package/lib/module/components/MessageList/ScrollToBottomButton.js +12 -6
  231. package/lib/module/components/MessageList/ScrollToBottomButton.js.map +1 -1
  232. package/lib/module/components/MessageList/UnreadMessagesNotification.js +1 -0
  233. package/lib/module/components/MessageList/UnreadMessagesNotification.js.map +1 -1
  234. package/lib/module/components/MessageList/hooks/useScrollToBottomAccessibilityAction.js +47 -0
  235. package/lib/module/components/MessageList/hooks/useScrollToBottomAccessibilityAction.js.map +1 -0
  236. package/lib/module/components/MessageMenu/MessageActionListItem.js +12 -4
  237. package/lib/module/components/MessageMenu/MessageActionListItem.js.map +1 -1
  238. package/lib/module/components/MessageMenu/MessageReactionPicker.js +1 -0
  239. package/lib/module/components/MessageMenu/MessageReactionPicker.js.map +1 -1
  240. package/lib/module/components/MessageMenu/ReactionButton.js +9 -6
  241. package/lib/module/components/MessageMenu/ReactionButton.js.map +1 -1
  242. package/lib/module/components/MessageMenu/hooks/useFetchReactions.js +23 -2
  243. package/lib/module/components/MessageMenu/hooks/useFetchReactions.js.map +1 -1
  244. package/lib/module/components/Notifications/Notification.js +232 -0
  245. package/lib/module/components/Notifications/Notification.js.map +1 -0
  246. package/lib/module/components/Notifications/NotificationList.js +120 -0
  247. package/lib/module/components/Notifications/NotificationList.js.map +1 -0
  248. package/lib/module/components/Notifications/NotificationTargetContext.js +45 -0
  249. package/lib/module/components/Notifications/NotificationTargetContext.js.map +1 -0
  250. package/lib/module/components/Notifications/hooks/index.js +59 -0
  251. package/lib/module/components/Notifications/hooks/index.js.map +1 -0
  252. package/lib/module/components/Notifications/hooks/useNotificationApi.js +133 -0
  253. package/lib/module/components/Notifications/hooks/useNotificationApi.js.map +1 -0
  254. package/lib/module/components/Notifications/hooks/useNotificationListController.js +133 -0
  255. package/lib/module/components/Notifications/hooks/useNotificationListController.js.map +1 -0
  256. package/lib/module/components/Notifications/hooks/useNotificationTarget.js +26 -0
  257. package/lib/module/components/Notifications/hooks/useNotificationTarget.js.map +1 -0
  258. package/lib/module/components/Notifications/hooks/useNotifications.js +26 -0
  259. package/lib/module/components/Notifications/hooks/useNotifications.js.map +1 -0
  260. package/lib/module/components/Notifications/hooks/useSystemNotifications.js +22 -0
  261. package/lib/module/components/Notifications/hooks/useSystemNotifications.js.map +1 -0
  262. package/lib/module/components/Notifications/index.js +59 -0
  263. package/lib/module/components/Notifications/index.js.map +1 -0
  264. package/lib/module/components/Notifications/notificationTarget.js +220 -0
  265. package/lib/module/components/Notifications/notificationTarget.js.map +1 -0
  266. package/lib/module/components/Notifications/notificationTranslations.js +137 -0
  267. package/lib/module/components/Notifications/notificationTranslations.js.map +1 -0
  268. package/lib/module/components/Poll/components/CreatePollHeader.js +2 -0
  269. package/lib/module/components/Poll/components/CreatePollHeader.js.map +1 -1
  270. package/lib/module/components/Poll/components/MultipleVotesSettings.js +2 -0
  271. package/lib/module/components/Poll/components/MultipleVotesSettings.js.map +1 -1
  272. package/lib/module/components/Poll/components/PollModalHeader.js +1 -0
  273. package/lib/module/components/Poll/components/PollModalHeader.js.map +1 -1
  274. package/lib/module/components/Poll/components/PollOption.js +14 -9
  275. package/lib/module/components/Poll/components/PollOption.js.map +1 -1
  276. package/lib/module/components/Poll/hooks/usePollState.js +35 -3
  277. package/lib/module/components/Poll/hooks/usePollState.js.map +1 -1
  278. package/lib/module/components/Reply/Reply.js +1 -0
  279. package/lib/module/components/Reply/Reply.js.map +1 -1
  280. package/lib/module/components/Thread/Thread.js +19 -11
  281. package/lib/module/components/Thread/Thread.js.map +1 -1
  282. package/lib/module/components/ThreadList/ThreadList.js +30 -9
  283. package/lib/module/components/ThreadList/ThreadList.js.map +1 -1
  284. package/lib/module/components/index.js +11 -0
  285. package/lib/module/components/index.js.map +1 -1
  286. package/lib/module/components/ui/Avatar/Avatar.js +6 -3
  287. package/lib/module/components/ui/Avatar/Avatar.js.map +1 -1
  288. package/lib/module/components/ui/Button/Button.js +16 -3
  289. package/lib/module/components/ui/Button/Button.js.map +1 -1
  290. package/lib/module/contexts/accessibilityContext/AccessibilityContext.js +21 -1
  291. package/lib/module/contexts/accessibilityContext/AccessibilityContext.js.map +1 -1
  292. package/lib/module/contexts/componentsContext/defaultComponents.js +4 -0
  293. package/lib/module/contexts/componentsContext/defaultComponents.js.map +1 -1
  294. package/lib/module/contexts/messageInputContext/MessageInputContext.js +37 -0
  295. package/lib/module/contexts/messageInputContext/MessageInputContext.js.map +1 -1
  296. package/lib/module/contexts/themeContext/utils/theme.js +13 -0
  297. package/lib/module/contexts/themeContext/utils/theme.js.map +1 -1
  298. package/lib/module/hooks/index.js +11 -0
  299. package/lib/module/hooks/index.js.map +1 -1
  300. package/lib/module/hooks/useAudioPlayer.js +34 -1
  301. package/lib/module/hooks/useAudioPlayer.js.map +1 -1
  302. package/lib/module/hooks/useInAppNotificationsState.js.map +1 -1
  303. package/lib/module/hooks/useLazyRef.js +13 -0
  304. package/lib/module/hooks/useLazyRef.js.map +1 -0
  305. package/lib/module/i18n/en.json +94 -1
  306. package/lib/module/i18n/es.json +96 -3
  307. package/lib/module/i18n/fr.json +94 -1
  308. package/lib/module/i18n/he.json +94 -1
  309. package/lib/module/i18n/hi.json +94 -1
  310. package/lib/module/i18n/it.json +94 -1
  311. package/lib/module/i18n/ja.json +94 -1
  312. package/lib/module/i18n/ko.json +94 -1
  313. package/lib/module/i18n/nl.json +94 -1
  314. package/lib/module/i18n/pt-br.json +94 -1
  315. package/lib/module/i18n/ru.json +94 -1
  316. package/lib/module/i18n/tr.json +94 -1
  317. package/lib/module/mock-builders/DB/mock.js +3 -1
  318. package/lib/module/mock-builders/DB/mock.js.map +1 -1
  319. package/lib/module/state-store/audio-player-pool.js +1 -0
  320. package/lib/module/state-store/audio-player-pool.js.map +1 -1
  321. package/lib/module/state-store/audio-player.js +92 -13
  322. package/lib/module/state-store/audio-player.js.map +1 -1
  323. package/lib/module/test-utils/BetterSqlite.js +3 -2
  324. package/lib/module/test-utils/BetterSqlite.js.map +1 -1
  325. package/lib/module/theme/generated/dark/StreamTokens.android.js +16 -16
  326. package/lib/module/theme/generated/dark/StreamTokens.android.js.map +1 -1
  327. package/lib/module/theme/generated/dark/StreamTokens.ios.js +8 -8
  328. package/lib/module/theme/generated/dark/StreamTokens.ios.js.map +1 -1
  329. package/lib/module/theme/generated/dark/StreamTokens.web.js +8 -8
  330. package/lib/module/theme/generated/dark/StreamTokens.web.js.map +1 -1
  331. package/lib/module/theme/generated/light/StreamTokens.android.js +16 -16
  332. package/lib/module/theme/generated/light/StreamTokens.android.js.map +1 -1
  333. package/lib/module/theme/generated/light/StreamTokens.ios.js +8 -8
  334. package/lib/module/theme/generated/light/StreamTokens.ios.js.map +1 -1
  335. package/lib/module/theme/generated/light/StreamTokens.web.js +8 -8
  336. package/lib/module/theme/generated/light/StreamTokens.web.js.map +1 -1
  337. package/lib/module/utils/animations/createBoundedZoomTransition.js +151 -0
  338. package/lib/module/utils/animations/createBoundedZoomTransition.js.map +1 -0
  339. package/lib/module/utils/{transitions.js → animations/transitions.js} +6 -0
  340. package/lib/module/utils/animations/transitions.js.map +1 -0
  341. package/lib/module/version.json +1 -1
  342. package/lib/typescript/a11y/a11yUtils.d.ts +3 -3
  343. package/lib/typescript/a11y/a11yUtils.d.ts.map +1 -1
  344. package/lib/typescript/a11y/hooks/useA11yLabel.d.ts +2 -1
  345. package/lib/typescript/a11y/hooks/useA11yLabel.d.ts.map +1 -1
  346. package/lib/typescript/a11y/hooks/useAccessibilityActivateAction.d.ts +17 -0
  347. package/lib/typescript/a11y/hooks/useAccessibilityActivateAction.d.ts.map +1 -0
  348. package/lib/typescript/a11y/index.d.ts +1 -0
  349. package/lib/typescript/a11y/index.d.ts.map +1 -1
  350. package/lib/typescript/components/AttachmentPicker/AttachmentPicker.d.ts.map +1 -1
  351. package/lib/typescript/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentMediaPicker.d.ts.map +1 -1
  352. package/lib/typescript/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.d.ts.map +1 -1
  353. package/lib/typescript/components/AttachmentPicker/components/AttachmentPickerContent.d.ts.map +1 -1
  354. package/lib/typescript/components/AttachmentPicker/components/AttachmentTypePickerButton.d.ts +2 -1
  355. package/lib/typescript/components/AttachmentPicker/components/AttachmentTypePickerButton.d.ts.map +1 -1
  356. package/lib/typescript/components/Channel/Channel.d.ts +1 -0
  357. package/lib/typescript/components/Channel/Channel.d.ts.map +1 -1
  358. package/lib/typescript/components/Channel/hooks/useMessageListPagination.d.ts.map +1 -1
  359. package/lib/typescript/components/ChannelList/ChannelList.d.ts +1 -0
  360. package/lib/typescript/components/ChannelList/ChannelList.d.ts.map +1 -1
  361. package/lib/typescript/components/ChannelList/hooks/useChannelActions.d.ts.map +1 -1
  362. package/lib/typescript/components/Message/hooks/useMessageActionHandlers.d.ts.map +1 -1
  363. package/lib/typescript/components/MessageInput/components/AttachmentPreview/AttachmentRemoveControl.d.ts +5 -2
  364. package/lib/typescript/components/MessageInput/components/AttachmentPreview/AttachmentRemoveControl.d.ts.map +1 -1
  365. package/lib/typescript/components/MessageInput/components/AttachmentPreview/AttachmentUploadPreviewList.d.ts.map +1 -1
  366. package/lib/typescript/components/MessageInput/components/AudioRecorder/AudioRecorder.d.ts.map +1 -1
  367. package/lib/typescript/components/MessageInput/components/AudioRecorder/AudioRecordingButton.d.ts.map +1 -1
  368. package/lib/typescript/components/MessageInput/components/InputButtons/AttachButton.d.ts +1 -0
  369. package/lib/typescript/components/MessageInput/components/InputButtons/AttachButton.d.ts.map +1 -1
  370. package/lib/typescript/components/MessageInput/components/OutputButtons/EditButton.d.ts.map +1 -1
  371. package/lib/typescript/components/MessageInput/components/OutputButtons/SendButton.d.ts.map +1 -1
  372. package/lib/typescript/components/MessageList/MessageFlashList.d.ts.map +1 -1
  373. package/lib/typescript/components/MessageList/MessageList.d.ts.map +1 -1
  374. package/lib/typescript/components/MessageList/ScrollToBottomButton.d.ts +2 -0
  375. package/lib/typescript/components/MessageList/ScrollToBottomButton.d.ts.map +1 -1
  376. package/lib/typescript/components/MessageList/UnreadMessagesNotification.d.ts.map +1 -1
  377. package/lib/typescript/components/MessageList/hooks/useScrollToBottomAccessibilityAction.d.ts +20 -0
  378. package/lib/typescript/components/MessageList/hooks/useScrollToBottomAccessibilityAction.d.ts.map +1 -0
  379. package/lib/typescript/components/MessageMenu/MessageActionListItem.d.ts.map +1 -1
  380. package/lib/typescript/components/MessageMenu/MessageReactionPicker.d.ts.map +1 -1
  381. package/lib/typescript/components/MessageMenu/ReactionButton.d.ts.map +1 -1
  382. package/lib/typescript/components/MessageMenu/hooks/useFetchReactions.d.ts.map +1 -1
  383. package/lib/typescript/components/Notifications/Notification.d.ts +31 -0
  384. package/lib/typescript/components/Notifications/Notification.d.ts.map +1 -0
  385. package/lib/typescript/components/Notifications/NotificationList.d.ts +28 -0
  386. package/lib/typescript/components/Notifications/NotificationList.d.ts.map +1 -0
  387. package/lib/typescript/components/Notifications/NotificationTargetContext.d.ts +14 -0
  388. package/lib/typescript/components/Notifications/NotificationTargetContext.d.ts.map +1 -0
  389. package/lib/typescript/components/Notifications/hooks/index.d.ts +6 -0
  390. package/lib/typescript/components/Notifications/hooks/index.d.ts.map +1 -0
  391. package/lib/typescript/components/Notifications/hooks/useNotificationApi.d.ts +48 -0
  392. package/lib/typescript/components/Notifications/hooks/useNotificationApi.d.ts.map +1 -0
  393. package/lib/typescript/components/Notifications/hooks/useNotificationListController.d.ts +14 -0
  394. package/lib/typescript/components/Notifications/hooks/useNotificationListController.d.ts.map +1 -0
  395. package/lib/typescript/components/Notifications/hooks/useNotificationTarget.d.ts +3 -0
  396. package/lib/typescript/components/Notifications/hooks/useNotificationTarget.d.ts.map +1 -0
  397. package/lib/typescript/components/Notifications/hooks/useNotifications.d.ts +14 -0
  398. package/lib/typescript/components/Notifications/hooks/useNotifications.d.ts.map +1 -0
  399. package/lib/typescript/components/Notifications/hooks/useSystemNotifications.d.ts +9 -0
  400. package/lib/typescript/components/Notifications/hooks/useSystemNotifications.d.ts.map +1 -0
  401. package/lib/typescript/components/Notifications/index.d.ts +6 -0
  402. package/lib/typescript/components/Notifications/index.d.ts.map +1 -0
  403. package/lib/typescript/components/Notifications/notificationTarget.d.ts +55 -0
  404. package/lib/typescript/components/Notifications/notificationTarget.d.ts.map +1 -0
  405. package/lib/typescript/components/Notifications/notificationTranslations.d.ts +7 -0
  406. package/lib/typescript/components/Notifications/notificationTranslations.d.ts.map +1 -0
  407. package/lib/typescript/components/Poll/components/CreatePollHeader.d.ts.map +1 -1
  408. package/lib/typescript/components/Poll/components/MultipleVotesSettings.d.ts.map +1 -1
  409. package/lib/typescript/components/Poll/components/PollModalHeader.d.ts.map +1 -1
  410. package/lib/typescript/components/Poll/components/PollOption.d.ts.map +1 -1
  411. package/lib/typescript/components/Poll/hooks/usePollState.d.ts.map +1 -1
  412. package/lib/typescript/components/Reply/Reply.d.ts.map +1 -1
  413. package/lib/typescript/components/Thread/Thread.d.ts +1 -0
  414. package/lib/typescript/components/Thread/Thread.d.ts.map +1 -1
  415. package/lib/typescript/components/ThreadList/ThreadList.d.ts +3 -1
  416. package/lib/typescript/components/ThreadList/ThreadList.d.ts.map +1 -1
  417. package/lib/typescript/components/index.d.ts +1 -0
  418. package/lib/typescript/components/index.d.ts.map +1 -1
  419. package/lib/typescript/components/ui/Avatar/Avatar.d.ts.map +1 -1
  420. package/lib/typescript/components/ui/Button/Button.d.ts +10 -1
  421. package/lib/typescript/components/ui/Button/Button.d.ts.map +1 -1
  422. package/lib/typescript/contexts/accessibilityContext/AccessibilityContext.d.ts +1 -1
  423. package/lib/typescript/contexts/accessibilityContext/AccessibilityContext.d.ts.map +1 -1
  424. package/lib/typescript/contexts/componentsContext/defaultComponents.d.ts +3 -0
  425. package/lib/typescript/contexts/componentsContext/defaultComponents.d.ts.map +1 -1
  426. package/lib/typescript/contexts/messageInputContext/MessageInputContext.d.ts.map +1 -1
  427. package/lib/typescript/contexts/themeContext/ThemeContext.d.ts +13 -0
  428. package/lib/typescript/contexts/themeContext/ThemeContext.d.ts.map +1 -1
  429. package/lib/typescript/contexts/themeContext/utils/theme.d.ts +13 -0
  430. package/lib/typescript/contexts/themeContext/utils/theme.d.ts.map +1 -1
  431. package/lib/typescript/hooks/index.d.ts +1 -0
  432. package/lib/typescript/hooks/index.d.ts.map +1 -1
  433. package/lib/typescript/hooks/useAudioPlayer.d.ts.map +1 -1
  434. package/lib/typescript/hooks/useInAppNotificationsState.d.ts +6 -0
  435. package/lib/typescript/hooks/useInAppNotificationsState.d.ts.map +1 -1
  436. package/lib/typescript/hooks/useLazyRef.d.ts +7 -0
  437. package/lib/typescript/hooks/useLazyRef.d.ts.map +1 -0
  438. package/lib/typescript/i18n/en.json +94 -1
  439. package/lib/typescript/i18n/es.json +96 -3
  440. package/lib/typescript/i18n/fr.json +94 -1
  441. package/lib/typescript/i18n/he.json +94 -1
  442. package/lib/typescript/i18n/hi.json +94 -1
  443. package/lib/typescript/i18n/it.json +94 -1
  444. package/lib/typescript/i18n/ja.json +94 -1
  445. package/lib/typescript/i18n/ko.json +94 -1
  446. package/lib/typescript/i18n/nl.json +94 -1
  447. package/lib/typescript/i18n/pt-br.json +94 -1
  448. package/lib/typescript/i18n/ru.json +94 -1
  449. package/lib/typescript/i18n/tr.json +94 -1
  450. package/lib/typescript/state-store/audio-player-pool.d.ts.map +1 -1
  451. package/lib/typescript/state-store/audio-player.d.ts +13 -0
  452. package/lib/typescript/state-store/audio-player.d.ts.map +1 -1
  453. package/lib/typescript/test-utils/BetterSqlite.d.ts.map +1 -1
  454. package/lib/typescript/utils/animations/createBoundedZoomTransition.d.ts +21 -0
  455. package/lib/typescript/utils/animations/createBoundedZoomTransition.d.ts.map +1 -0
  456. package/lib/typescript/utils/animations/transitions.d.ts +21 -0
  457. package/lib/typescript/utils/animations/transitions.d.ts.map +1 -0
  458. package/lib/typescript/utils/i18n/Streami18n.d.ts +93 -0
  459. package/lib/typescript/utils/i18n/Streami18n.d.ts.map +1 -1
  460. package/package.json +2 -2
  461. package/src/__tests__/offline-support/offline-feature.tsx +40 -34
  462. package/src/a11y/a11yUtils.ts +2 -2
  463. package/src/a11y/hooks/useA11yLabel.ts +7 -4
  464. package/src/a11y/hooks/useAccessibilityActivateAction.ts +44 -0
  465. package/src/a11y/index.ts +1 -0
  466. package/src/components/AttachmentPicker/AttachmentPicker.tsx +23 -1
  467. package/src/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentMediaPicker.tsx +1 -0
  468. package/src/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.tsx +15 -2
  469. package/src/components/AttachmentPicker/components/AttachmentPickerContent.tsx +4 -3
  470. package/src/components/AttachmentPicker/components/AttachmentTypePickerButton.tsx +9 -0
  471. package/src/components/AttachmentPicker/components/__tests__/AttachmentPickerContent.test.tsx +19 -18
  472. package/src/components/Channel/Channel.tsx +15 -1
  473. package/src/components/Channel/__tests__/useMessageListPagination.test.tsx +34 -2
  474. package/src/components/Channel/hooks/useMessageListPagination.tsx +19 -3
  475. package/src/components/ChannelList/ChannelList.tsx +27 -5
  476. package/src/components/ChannelList/__tests__/ChannelListView.test.tsx +16 -5
  477. package/src/components/ChannelList/hooks/__tests__/useChannelActions.test.tsx +123 -0
  478. package/src/components/ChannelList/hooks/useChannelActions.ts +181 -12
  479. package/src/components/ImageGallery/__tests__/ImageGalleryFooter.test.tsx +9 -3
  480. package/src/components/ImageGallery/__tests__/ImageGalleryHeader.test.tsx +4 -1
  481. package/src/components/ImageGallery/components/ImageGalleryFooter.tsx +2 -2
  482. package/src/components/ImageGallery/components/ImageGalleryHeader.tsx +1 -1
  483. package/src/components/ImageGallery/components/ImageGalleryVideoControl.tsx +1 -1
  484. package/src/components/Message/hooks/__tests__/useMessageActionHandlers.test.tsx +131 -0
  485. package/src/components/Message/hooks/useMessageActionHandlers.ts +133 -23
  486. package/src/components/MessageInput/MessageComposer.tsx +1 -1
  487. package/src/components/MessageInput/MessageComposerLeadingView.tsx +1 -1
  488. package/src/components/MessageInput/MessageInputHeaderView.tsx +1 -1
  489. package/src/components/MessageInput/MessageInputTrailingView.tsx +1 -1
  490. package/src/components/MessageInput/components/AttachmentPreview/AttachmentRemoveControl.tsx +18 -2
  491. package/src/components/MessageInput/components/AttachmentPreview/AttachmentUploadPreviewList.tsx +1 -10
  492. package/src/components/MessageInput/components/AudioRecorder/AudioRecorder.tsx +13 -2
  493. package/src/components/MessageInput/components/AudioRecorder/AudioRecordingButton.tsx +35 -14
  494. package/src/components/MessageInput/components/InputButtons/AttachButton.tsx +13 -3
  495. package/src/components/MessageInput/components/OutputButtons/EditButton.tsx +1 -0
  496. package/src/components/MessageInput/components/OutputButtons/SendButton.tsx +1 -0
  497. package/src/components/MessageInput/components/OutputButtons/index.tsx +1 -1
  498. package/src/components/MessageList/MessageFlashList.tsx +26 -3
  499. package/src/components/MessageList/MessageList.tsx +26 -3
  500. package/src/components/MessageList/ScrollToBottomButton.tsx +18 -6
  501. package/src/components/MessageList/UnreadMessagesNotification.tsx +1 -0
  502. package/src/components/MessageList/__tests__/MessageList.test.tsx +221 -0
  503. package/src/components/MessageList/__tests__/ScrollToBottomButton.test.tsx +2 -2
  504. package/src/components/MessageList/__tests__/__snapshots__/ScrollToBottomButton.test.tsx.snap +3 -1
  505. package/src/components/MessageList/hooks/useScrollToBottomAccessibilityAction.ts +74 -0
  506. package/src/components/MessageMenu/MessageActionListItem.tsx +10 -4
  507. package/src/components/MessageMenu/MessageReactionPicker.tsx +1 -0
  508. package/src/components/MessageMenu/ReactionButton.tsx +7 -9
  509. package/src/components/MessageMenu/__tests__/MessageReactionPicker.test.tsx +13 -15
  510. package/src/components/MessageMenu/__tests__/MessageUserReactions.test.tsx +20 -18
  511. package/src/components/MessageMenu/__tests__/ReactionButton.test.tsx +18 -5
  512. package/src/components/MessageMenu/hooks/useFetchReactions.ts +17 -2
  513. package/src/components/Notifications/Notification.tsx +254 -0
  514. package/src/components/Notifications/NotificationList.tsx +160 -0
  515. package/src/components/Notifications/NotificationTargetContext.tsx +45 -0
  516. package/src/components/Notifications/__tests__/NotificationList.test.tsx +480 -0
  517. package/src/components/Notifications/__tests__/notificationTarget.test.ts +157 -0
  518. package/src/components/Notifications/hooks/__tests__/useNotificationApi.test.tsx +172 -0
  519. package/src/components/Notifications/hooks/__tests__/useNotificationTarget.test.tsx +85 -0
  520. package/src/components/Notifications/hooks/index.ts +5 -0
  521. package/src/components/Notifications/hooks/useNotificationApi.ts +248 -0
  522. package/src/components/Notifications/hooks/useNotificationListController.ts +160 -0
  523. package/src/components/Notifications/hooks/useNotificationTarget.ts +37 -0
  524. package/src/components/Notifications/hooks/useNotifications.ts +43 -0
  525. package/src/components/Notifications/hooks/useSystemNotifications.ts +33 -0
  526. package/src/components/Notifications/index.ts +5 -0
  527. package/src/components/Notifications/notificationTarget.ts +305 -0
  528. package/src/components/Notifications/notificationTranslations.ts +142 -0
  529. package/src/components/Poll/components/CreatePollHeader.tsx +2 -0
  530. package/src/components/Poll/components/MultipleVotesSettings.tsx +2 -0
  531. package/src/components/Poll/components/PollModalHeader.tsx +1 -0
  532. package/src/components/Poll/components/PollOption.tsx +10 -6
  533. package/src/components/Poll/hooks/usePollState.ts +26 -2
  534. package/src/components/Reply/Reply.tsx +4 -1
  535. package/src/components/Thread/Thread.tsx +24 -16
  536. package/src/components/Thread/__tests__/__snapshots__/Thread.test.tsx.snap +3 -0
  537. package/src/components/ThreadList/ThreadList.tsx +33 -9
  538. package/src/components/index.ts +2 -0
  539. package/src/components/ui/Avatar/Avatar.tsx +2 -1
  540. package/src/components/ui/Button/Button.tsx +26 -0
  541. package/src/components/ui/Button/__tests__/Button.test.tsx +44 -0
  542. package/src/contexts/accessibilityContext/AccessibilityContext.tsx +35 -1
  543. package/src/contexts/componentsContext/defaultComponents.ts +4 -0
  544. package/src/contexts/messageInputContext/MessageInputContext.tsx +36 -0
  545. package/src/contexts/themeContext/utils/theme.ts +26 -0
  546. package/src/hooks/index.ts +1 -0
  547. package/src/hooks/useAudioPlayer.ts +44 -3
  548. package/src/hooks/useInAppNotificationsState.ts +6 -0
  549. package/src/hooks/useLazyRef.ts +15 -0
  550. package/src/i18n/en.json +94 -1
  551. package/src/i18n/es.json +96 -3
  552. package/src/i18n/fr.json +94 -1
  553. package/src/i18n/he.json +94 -1
  554. package/src/i18n/hi.json +94 -1
  555. package/src/i18n/it.json +94 -1
  556. package/src/i18n/ja.json +94 -1
  557. package/src/i18n/ko.json +94 -1
  558. package/src/i18n/nl.json +94 -1
  559. package/src/i18n/pt-br.json +94 -1
  560. package/src/i18n/ru.json +94 -1
  561. package/src/i18n/tr.json +94 -1
  562. package/src/mock-builders/DB/mock.ts +2 -1
  563. package/src/state-store/__tests__/audio-player.test.ts +45 -0
  564. package/src/state-store/audio-player-pool.ts +1 -0
  565. package/src/state-store/audio-player.ts +108 -16
  566. package/src/test-utils/BetterSqlite.ts +3 -1
  567. package/src/theme/generated/dark/StreamTokens.android.ts +16 -16
  568. package/src/theme/generated/dark/StreamTokens.ios.ts +8 -8
  569. package/src/theme/generated/dark/StreamTokens.web.ts +8 -8
  570. package/src/theme/generated/light/StreamTokens.android.ts +16 -16
  571. package/src/theme/generated/light/StreamTokens.ios.ts +8 -8
  572. package/src/theme/generated/light/StreamTokens.web.ts +8 -8
  573. package/src/utils/animations/createBoundedZoomTransition.ts +117 -0
  574. package/src/utils/{transitions.ts → animations/transitions.ts} +6 -0
  575. package/src/version.json +1 -1
  576. package/lib/commonjs/utils/transitions.js.map +0 -1
  577. package/lib/module/utils/transitions.js.map +0 -1
  578. package/lib/typescript/utils/transitions.d.ts +0 -9
  579. package/lib/typescript/utils/transitions.d.ts.map +0 -1
@@ -18,6 +18,7 @@ import debounce from 'lodash/debounce';
18
18
  import type { Channel, Event, LocalMessage, MessageResponse } from 'stream-chat';
19
19
 
20
20
  import { useMessageList } from './hooks/useMessageList';
21
+ import { useScrollToBottomAccessibilityAction } from './hooks/useScrollToBottomAccessibilityAction';
21
22
  import { useShouldScrollToRecentOnNewOwnMessage } from './hooks/useShouldScrollToRecentOnNewOwnMessage';
22
23
 
23
24
  import { InlineLoadingMoreIndicator } from './InlineLoadingMoreIndicator';
@@ -70,7 +71,7 @@ import { useStateStore } from '../../hooks/useStateStore';
70
71
  import { bumpOverlayLayoutRevision } from '../../state-store';
71
72
  import { MessageInputHeightState } from '../../state-store/message-input-height-store';
72
73
  import { primitives } from '../../theme';
73
- import { transitions } from '../../utils/transitions';
74
+ import { transitions } from '../../utils/animations/transitions';
74
75
  import { useIncomingMessageAnnouncements } from '../Accessibility/hooks/useIncomingMessageAnnouncements';
75
76
  import { MessageWrapper } from '../Message/MessageItemView/MessageWrapper';
76
77
 
@@ -353,6 +354,7 @@ const MessageListWithContext = (props: MessageListPropsWithContext) => {
353
354
  EmptyStateIndicator,
354
355
  MessageListLoadingIndicator: LoadingIndicator,
355
356
  NetworkDownIndicator,
357
+ NotificationList,
356
358
  ScrollToBottomButton,
357
359
  StickyHeader,
358
360
  TypingIndicator,
@@ -1046,6 +1048,19 @@ const MessageListWithContext = (props: MessageListPropsWithContext) => {
1046
1048
  });
1047
1049
  });
1048
1050
 
1051
+ const scrollToBottomUnreadCount =
1052
+ scrollToBottomButtonVisible && !threadList ? channel?.countUnread() : undefined;
1053
+ const {
1054
+ accessibilityActions: messageListAccessibilityActions,
1055
+ onAccessibilityAction: messageListOnAccessibilityAction,
1056
+ } = useScrollToBottomAccessibilityAction({
1057
+ accessibilityActions: additionalFlatListProps?.accessibilityActions,
1058
+ onAccessibilityAction: additionalFlatListProps?.onAccessibilityAction,
1059
+ onScrollToBottom: goToNewMessages,
1060
+ unreadCount: scrollToBottomUnreadCount,
1061
+ visible: scrollToBottomButtonVisible,
1062
+ });
1063
+
1049
1064
  const scrollToIndexFailedRetryCountRef = useRef<number>(0);
1050
1065
  const failScrollTimeoutId = useRef<ReturnType<typeof setTimeout>>(undefined);
1051
1066
  const onScrollToIndexFailedRef = useRef<
@@ -1298,10 +1313,17 @@ const MessageListWithContext = (props: MessageListPropsWithContext) => {
1298
1313
  testID='message-flat-list'
1299
1314
  viewabilityConfig={flatListViewabilityConfig}
1300
1315
  {...additionalFlatListPropsExcludingStyle}
1316
+ accessibilityActions={messageListAccessibilityActions}
1317
+ onAccessibilityAction={messageListOnAccessibilityAction}
1301
1318
  />
1302
1319
  </MessageListItemProvider>
1303
1320
  )}
1304
- <View style={styles.stickyHeaderContainer}>
1321
+ <View
1322
+ accessibilityElementsHidden
1323
+ accessible={false}
1324
+ importantForAccessibility='no-hide-descendants'
1325
+ style={styles.stickyHeaderContainer}
1326
+ >
1305
1327
  {messageListLengthAfterUpdate && StickyHeader ? (
1306
1328
  <StickyHeader date={stickyHeaderDate} />
1307
1329
  ) : null}
@@ -1321,7 +1343,7 @@ const MessageListWithContext = (props: MessageListPropsWithContext) => {
1321
1343
  <ScrollToBottomButton
1322
1344
  onPress={goToNewMessages}
1323
1345
  showNotification={scrollToBottomButtonVisible}
1324
- unreadCount={threadList ? 0 : channel?.countUnread()}
1346
+ unreadCount={scrollToBottomUnreadCount}
1325
1347
  />
1326
1348
  </Animated.View>
1327
1349
  ) : null}
@@ -1335,6 +1357,7 @@ const MessageListWithContext = (props: MessageListPropsWithContext) => {
1335
1357
  />
1336
1358
  </View>
1337
1359
  ) : null}
1360
+ <NotificationList bottomOffset={messageInputFloating ? messageInputHeight + 16 : undefined} />
1338
1361
  </View>
1339
1362
  );
1340
1363
  };
@@ -3,13 +3,16 @@ import React from 'react';
3
3
  import { StyleSheet, View } from 'react-native';
4
4
  import Animated, { ZoomIn, ZoomOut } from 'react-native-reanimated';
5
5
 
6
- import { useA11yLabel } from '../../a11y/hooks/useA11yLabel';
7
6
  import { useTheme } from '../../contexts/themeContext/ThemeContext';
8
7
  import { Down } from '../../icons/arrow-up';
9
8
  import { primitives } from '../../theme';
10
9
  import { BadgeNotification } from '../ui';
11
10
  import { Button } from '../ui/Button';
12
11
 
12
+ export const SCROLL_TO_BOTTOM_ACCESSIBILITY_LABEL_KEY = 'a11y/Scroll to bottom';
13
+ export const SCROLL_TO_BOTTOM_WITH_COUNT_ACCESSIBILITY_LABEL_KEY =
14
+ 'a11y/Scroll to bottom, {{count}} new messages';
15
+
13
16
  export type ScrollToBottomButtonProps = {
14
17
  /** onPress handler */
15
18
  onPress: () => void;
@@ -23,9 +26,9 @@ export const ScrollToBottomButton = (props: ScrollToBottomButtonProps) => {
23
26
  const {
24
27
  theme: { semantics },
25
28
  } = useTheme();
26
- const a11yLabel = useA11yLabel(
27
- unreadCount ? 'a11y/Scroll to latest, {{count}} unread' : 'a11y/Scroll to latest',
28
- { count: unreadCount ?? 0 },
29
+ const accessibilityLabelParams = React.useMemo(
30
+ () => (unreadCount ? { count: unreadCount } : undefined),
31
+ [unreadCount],
29
32
  );
30
33
 
31
34
  if (!showNotification) {
@@ -47,7 +50,12 @@ export const ScrollToBottomButton = (props: ScrollToBottomButtonProps) => {
47
50
  ]}
48
51
  >
49
52
  <Button
50
- accessibilityLabel={a11yLabel}
53
+ accessibilityLabelKey={
54
+ unreadCount
55
+ ? SCROLL_TO_BOTTOM_WITH_COUNT_ACCESSIBILITY_LABEL_KEY
56
+ : SCROLL_TO_BOTTOM_ACCESSIBILITY_LABEL_KEY
57
+ }
58
+ accessibilityLabelParams={accessibilityLabelParams}
51
59
  variant='secondary'
52
60
  type='outline'
53
61
  LeadingIcon={Down}
@@ -58,7 +66,11 @@ export const ScrollToBottomButton = (props: ScrollToBottomButtonProps) => {
58
66
  />
59
67
  </View>
60
68
 
61
- <View style={styles.unreadCountNotificationContainer}>
69
+ <View
70
+ accessibilityElementsHidden
71
+ importantForAccessibility='no-hide-descendants'
72
+ style={styles.unreadCountNotificationContainer}
73
+ >
62
74
  {unreadCount ? (
63
75
  <BadgeNotification count={unreadCount} size='xs' type='primary' testID='unread-count' />
64
76
  ) : null}
@@ -84,6 +84,7 @@ export const UnreadMessagesNotification = (props: UnreadMessagesNotificationProp
84
84
  </View>
85
85
  <View style={styles.rightButtonContainer}>
86
86
  <Button
87
+ accessibilityLabelKey='a11y/Dismiss unread messages'
87
88
  variant='secondary'
88
89
  type='ghost'
89
90
  iconOnly
@@ -20,6 +20,7 @@ import { channelInitialState } from '../../Channel/hooks/useChannelDataState';
20
20
  import * as MessageListPaginationHook from '../../Channel/hooks/useMessageListPagination';
21
21
  import { Chat } from '../../Chat/Chat';
22
22
 
23
+ import { SCROLL_TO_BOTTOM_ACCESSIBILITY_ACTION_NAME } from '../hooks/useScrollToBottomAccessibilityAction';
23
24
  import { MessageList } from '../MessageList';
24
25
 
25
26
  describe('MessageList', () => {
@@ -183,6 +184,41 @@ describe('MessageList', () => {
183
184
  });
184
185
  });
185
186
 
187
+ it('should render client notifications in the message list notification host', async () => {
188
+ const user1 = generateUser();
189
+ const mockedChannel = generateChannelResponse({
190
+ members: [generateMember({ user: user1 })],
191
+ messages: [generateMessage({ user: user1 })],
192
+ });
193
+
194
+ const chatClient = await getTestClientWithUser({ id: 'testID' });
195
+ useMockedApis(chatClient, [getOrCreateChannelApi(mockedChannel)]);
196
+ const channel = chatClient.channel('messaging', mockedChannel.channel.id);
197
+ await channel.watch();
198
+
199
+ const { getByText } = render(
200
+ <OverlayProvider>
201
+ <Chat client={chatClient}>
202
+ <Channel channel={channel}>
203
+ <MessageList />
204
+ </Channel>
205
+ </Chat>
206
+ </OverlayProvider>,
207
+ );
208
+
209
+ act(() => {
210
+ chatClient.notifications.add({
211
+ message: 'Message list notification',
212
+ options: { severity: 'warning' },
213
+ origin: { emitter: 'MessageListTest' },
214
+ });
215
+ });
216
+
217
+ await waitFor(() => {
218
+ expect(getByText('Message list notification')).toBeTruthy();
219
+ });
220
+ });
221
+
186
222
  it('should render the is offline error', async () => {
187
223
  const user1 = generateUser();
188
224
  const mockedChannel = generateChannelResponse({
@@ -487,6 +523,49 @@ describe('MessageList pagination', () => {
487
523
  }));
488
524
  };
489
525
 
526
+ const renderMessageListForScrollToBottom = async ({
527
+ additionalFlatListProps,
528
+ accessibility = { enabled: true },
529
+ staleChannelState = false,
530
+ }: {
531
+ additionalFlatListProps?: React.ComponentProps<typeof MessageList>['additionalFlatListProps'];
532
+ accessibility?: React.ComponentProps<typeof OverlayProvider>['accessibility'];
533
+ staleChannelState?: boolean;
534
+ } = {}) => {
535
+ const user1 = generateUser();
536
+ const mockedChannel = generateChannelResponse({
537
+ members: [generateMember({ user: user1 })],
538
+ messages: Array.from({ length: 10 }, (_, i) => generateMessage({ text: `message-${i}` })),
539
+ });
540
+
541
+ const chatClient = await getTestClientWithUser({ id: 'testID' });
542
+ useMockedApis(chatClient, [getOrCreateChannelApi(mockedChannel)]);
543
+ const channel = chatClient.channel('messaging', mockedChannel.channel.id);
544
+ await channel.watch();
545
+
546
+ if (staleChannelState) {
547
+ channel.state = {
548
+ ...channelInitialState,
549
+ latestMessages: [],
550
+ members: Object.fromEntries(
551
+ Array.from({ length: 10 }, (_, i) => [i, generateMember({ user_id: String(i) })]),
552
+ ),
553
+ messages: Array.from({ length: 10 }, (_, i) => generateMessage({ id: String(i) })),
554
+ messageSets: [{ isCurrent: true, isLatest: true }],
555
+ } as unknown as typeof channel.state;
556
+ }
557
+
558
+ return render(
559
+ <OverlayProvider accessibility={accessibility}>
560
+ <Chat client={chatClient}>
561
+ <Channel channel={channel}>
562
+ <MessageList additionalFlatListProps={additionalFlatListProps} />
563
+ </Channel>
564
+ </Chat>
565
+ </OverlayProvider>,
566
+ );
567
+ };
568
+
490
569
  it('should load more recent messages when the user scrolls to the start of the list', async () => {
491
570
  const user1 = generateUser();
492
571
  const mockedChannel = generateChannelResponse({
@@ -630,4 +709,146 @@ describe('MessageList pagination', () => {
630
709
  expect(loadLatestMessages).toHaveBeenCalledTimes(1);
631
710
  });
632
711
  });
712
+
713
+ it('should not expose the scroll to bottom accessibility action when hidden', async () => {
714
+ const { getByTestId, queryByTestId } = await renderMessageListForScrollToBottom();
715
+
716
+ await waitFor(() => {
717
+ expect(queryByTestId('scroll-to-bottom-button')).toBeFalsy();
718
+ expect(getByTestId('message-flat-list').props.accessibilityActions).toBeUndefined();
719
+ });
720
+ });
721
+
722
+ it('should not expose the SDK scroll to bottom action when SDK accessibility is disabled', async () => {
723
+ const { getByTestId, queryByTestId } = await renderMessageListForScrollToBottom({
724
+ accessibility: { enabled: false },
725
+ staleChannelState: true,
726
+ });
727
+
728
+ act(() => {
729
+ fireEvent(getByTestId('message-flat-list'), 'scroll', {
730
+ nativeEvent: {
731
+ contentOffset: { y: 1900 },
732
+ contentSize: { height: 2000, width: 200 },
733
+ layoutMeasurement: { height: 400, width: 200 },
734
+ },
735
+ });
736
+ });
737
+
738
+ await waitFor(() => {
739
+ expect(queryByTestId('scroll-to-bottom-button')).toBeTruthy();
740
+ expect(getByTestId('message-flat-list').props.accessibilityActions ?? []).not.toEqual(
741
+ expect.arrayContaining([
742
+ expect.objectContaining({
743
+ name: SCROLL_TO_BOTTOM_ACCESSIBILITY_ACTION_NAME,
744
+ }),
745
+ ]),
746
+ );
747
+ });
748
+ });
749
+
750
+ it('should preserve additional message list accessibility actions when scroll to bottom is hidden', async () => {
751
+ const { getByTestId, queryByTestId } = await renderMessageListForScrollToBottom({
752
+ additionalFlatListProps: {
753
+ accessibilityActions: [{ label: 'Custom action', name: 'customAction' }],
754
+ },
755
+ });
756
+
757
+ await waitFor(() => {
758
+ expect(queryByTestId('scroll-to-bottom-button')).toBeFalsy();
759
+ expect(getByTestId('message-flat-list').props.accessibilityActions).toEqual([
760
+ { label: 'Custom action', name: 'customAction' },
761
+ ]);
762
+ });
763
+ });
764
+
765
+ it('should expose scroll to bottom as a message list accessibility action when visible', async () => {
766
+ const loadLatestMessages = jest.fn(() => Promise.resolve());
767
+ mockedHook({ loadLatestMessages });
768
+
769
+ const { getByTestId } = await renderMessageListForScrollToBottom({
770
+ staleChannelState: true,
771
+ });
772
+
773
+ act(() => {
774
+ fireEvent(getByTestId('message-flat-list'), 'scroll', {
775
+ nativeEvent: {
776
+ contentOffset: { y: 1900 },
777
+ contentSize: { height: 2000, width: 200 },
778
+ layoutMeasurement: { height: 400, width: 200 },
779
+ },
780
+ });
781
+ });
782
+
783
+ await waitFor(() => {
784
+ expect(getByTestId('message-flat-list').props.accessibilityActions).toEqual(
785
+ expect.arrayContaining([
786
+ expect.objectContaining({
787
+ label: expect.stringContaining('Scroll to bottom'),
788
+ name: SCROLL_TO_BOTTOM_ACCESSIBILITY_ACTION_NAME,
789
+ }),
790
+ ]),
791
+ );
792
+ });
793
+
794
+ await act(async () => {
795
+ await getByTestId('message-flat-list').props.onAccessibilityAction({
796
+ nativeEvent: { actionName: SCROLL_TO_BOTTOM_ACCESSIBILITY_ACTION_NAME },
797
+ });
798
+ });
799
+
800
+ expect(loadLatestMessages).toHaveBeenCalledTimes(1);
801
+ });
802
+
803
+ it('should preserve additional message list accessibility actions', async () => {
804
+ const loadLatestMessages = jest.fn(() => Promise.resolve());
805
+ const onAccessibilityAction = jest.fn();
806
+ mockedHook({ loadLatestMessages });
807
+
808
+ const { getByTestId } = await renderMessageListForScrollToBottom({
809
+ additionalFlatListProps: {
810
+ accessibilityActions: [{ label: 'Custom action', name: 'customAction' }],
811
+ onAccessibilityAction,
812
+ },
813
+ staleChannelState: true,
814
+ });
815
+
816
+ act(() => {
817
+ fireEvent(getByTestId('message-flat-list'), 'scroll', {
818
+ nativeEvent: {
819
+ contentOffset: { y: 1900 },
820
+ contentSize: { height: 2000, width: 200 },
821
+ layoutMeasurement: { height: 400, width: 200 },
822
+ },
823
+ });
824
+ });
825
+
826
+ await waitFor(() => {
827
+ expect(getByTestId('message-flat-list').props.accessibilityActions).toEqual(
828
+ expect.arrayContaining([
829
+ { label: 'Custom action', name: 'customAction' },
830
+ expect.objectContaining({
831
+ label: expect.stringContaining('Scroll to bottom'),
832
+ name: SCROLL_TO_BOTTOM_ACCESSIBILITY_ACTION_NAME,
833
+ }),
834
+ ]),
835
+ );
836
+ });
837
+
838
+ act(() => {
839
+ getByTestId('message-flat-list').props.onAccessibilityAction({
840
+ nativeEvent: { actionName: 'customAction' },
841
+ });
842
+ });
843
+ expect(onAccessibilityAction).toHaveBeenCalledTimes(1);
844
+
845
+ await act(async () => {
846
+ await getByTestId('message-flat-list').props.onAccessibilityAction({
847
+ nativeEvent: { actionName: SCROLL_TO_BOTTOM_ACCESSIBILITY_ACTION_NAME },
848
+ });
849
+ });
850
+
851
+ expect(loadLatestMessages).toHaveBeenCalledTimes(1);
852
+ expect(onAccessibilityAction).toHaveBeenCalledTimes(1);
853
+ });
633
854
  });
@@ -75,8 +75,8 @@ describe('ScrollToBottomButton', () => {
75
75
  </ThemeProvider>,
76
76
  );
77
77
  await waitFor(() => {
78
- expect(getByTestId('unread-count')).toBeTruthy();
79
- expect(getByText('3')).toBeTruthy();
78
+ expect(getByTestId('unread-count', { includeHiddenElements: true })).toBeTruthy();
79
+ expect(getByText('3', { includeHiddenElements: true })).toBeTruthy();
80
80
  });
81
81
  });
82
82
 
@@ -18,7 +18,7 @@ exports[`ScrollToBottomButton should render the message notification and match s
18
18
  },
19
19
  {
20
20
  "elevation": 2,
21
- "shadowColor": "rgba(0,0,0,0.12)",
21
+ "shadowColor": "rgb(0,0,0)",
22
22
  "shadowOffset": {
23
23
  "height": 1,
24
24
  "width": 0,
@@ -186,6 +186,8 @@ exports[`ScrollToBottomButton should render the message notification and match s
186
186
  </View>
187
187
  </View>
188
188
  <View
189
+ accessibilityElementsHidden={true}
190
+ importantForAccessibility="no-hide-descendants"
189
191
  style={
190
192
  {
191
193
  "position": "absolute",
@@ -0,0 +1,74 @@
1
+ import { useContext, useMemo } from 'react';
2
+
3
+ import type { AccessibilityActionEvent, AccessibilityProps } from 'react-native';
4
+
5
+ import { mergeAccessibilityActions } from '../../../a11y/a11yUtils';
6
+ import { useAccessibilityContext } from '../../../contexts/accessibilityContext/AccessibilityContext';
7
+ import { TranslationContext } from '../../../contexts/translationContext/TranslationContext';
8
+ import { useStableCallback } from '../../../hooks';
9
+ import {
10
+ SCROLL_TO_BOTTOM_ACCESSIBILITY_LABEL_KEY,
11
+ SCROLL_TO_BOTTOM_WITH_COUNT_ACCESSIBILITY_LABEL_KEY,
12
+ } from '../ScrollToBottomButton';
13
+
14
+ export const SCROLL_TO_BOTTOM_ACCESSIBILITY_ACTION_NAME = 'streamScrollToBottom';
15
+
16
+ type AccessibilityActions = AccessibilityProps['accessibilityActions'];
17
+ type OnAccessibilityAction = AccessibilityProps['onAccessibilityAction'];
18
+
19
+ type UseScrollToBottomAccessibilityActionParams = {
20
+ accessibilityActions?: AccessibilityActions;
21
+ onAccessibilityAction?: OnAccessibilityAction;
22
+ onScrollToBottom: () => Promise<void> | void;
23
+ unreadCount?: number;
24
+ visible: boolean;
25
+ };
26
+
27
+ export const useScrollToBottomAccessibilityAction = ({
28
+ accessibilityActions,
29
+ onAccessibilityAction,
30
+ onScrollToBottom,
31
+ unreadCount,
32
+ visible,
33
+ }: UseScrollToBottomAccessibilityActionParams) => {
34
+ const { enabled } = useAccessibilityContext();
35
+ const { t } = useContext(TranslationContext);
36
+
37
+ const scrollToBottomAccessibilityAction = useMemo(() => {
38
+ if (!enabled || !visible) {
39
+ return undefined;
40
+ }
41
+
42
+ return [
43
+ {
44
+ name: SCROLL_TO_BOTTOM_ACCESSIBILITY_ACTION_NAME,
45
+ label: unreadCount
46
+ ? t(SCROLL_TO_BOTTOM_WITH_COUNT_ACCESSIBILITY_LABEL_KEY, { count: unreadCount })
47
+ : t(SCROLL_TO_BOTTOM_ACCESSIBILITY_LABEL_KEY),
48
+ },
49
+ ];
50
+ }, [enabled, t, unreadCount, visible]);
51
+
52
+ const mergedAccessibilityActions = useMemo(
53
+ () => mergeAccessibilityActions(accessibilityActions, scrollToBottomAccessibilityAction),
54
+ [accessibilityActions, scrollToBottomAccessibilityAction],
55
+ );
56
+
57
+ const handleAccessibilityAction = useStableCallback((event: AccessibilityActionEvent) => {
58
+ if (event.nativeEvent.actionName === SCROLL_TO_BOTTOM_ACCESSIBILITY_ACTION_NAME) {
59
+ return onScrollToBottom();
60
+ }
61
+
62
+ return onAccessibilityAction?.(event);
63
+ });
64
+
65
+ return {
66
+ accessibilityActions: mergedAccessibilityActions.length
67
+ ? mergedAccessibilityActions
68
+ : undefined,
69
+ onAccessibilityAction:
70
+ (enabled && visible) || onAccessibilityAction
71
+ ? handleAccessibilityAction
72
+ : onAccessibilityAction,
73
+ };
74
+ };
@@ -3,6 +3,7 @@ import { StyleProp, StyleSheet, Text, TextStyle, View } from 'react-native';
3
3
 
4
4
  import { Pressable } from 'react-native-gesture-handler';
5
5
 
6
+ import { useAccessibilityActivateAction } from '../../a11y/hooks/useAccessibilityActivateAction';
6
7
  import { useTheme } from '../../contexts/themeContext/ThemeContext';
7
8
  import { useStableCallback } from '../../hooks';
8
9
  import { closeOverlay, scheduleActionOnClose } from '../../state-store';
@@ -74,20 +75,25 @@ export const MessageActionListItem = (props: MessageActionListItemProps) => {
74
75
  closeOverlay();
75
76
  scheduleActionOnClose(() => action());
76
77
  });
78
+ const accessibilityLabel = `${actionType} action list item`;
79
+ const accessibilityActivateActionProps = useAccessibilityActivateAction({
80
+ onPress: onActionPress,
81
+ shouldHandleActivate: true,
82
+ });
77
83
 
78
84
  return (
79
85
  <Pressable
86
+ accessible
87
+ accessibilityLabel={accessibilityLabel}
80
88
  accessibilityRole='menuitem'
89
+ {...accessibilityActivateActionProps}
81
90
  onPress={onActionPress}
82
91
  style={({ pressed }) => [
83
92
  styles.buttonContainer,
84
93
  { backgroundColor: pressed ? semantics.backgroundUtilityPressed : 'transparent' },
85
94
  ]}
86
95
  >
87
- <View
88
- accessibilityLabel={`${actionType} action list item`}
89
- style={[styles.container, container]}
90
- >
96
+ <View style={[styles.container, container]}>
91
97
  <View style={iconTheme}>{icon}</View>
92
98
  <Text style={[styles.titleStyle, titleStyle, titleTheme]}>{title}</Text>
93
99
  </View>
@@ -115,6 +115,7 @@ export const EmojiViewerButton = ({
115
115
  <>
116
116
  <View style={[styles.emojiViewerButton, emojiViewerButton]}>
117
117
  <Button
118
+ accessibilityLabelKey='a11y/Open more reactions'
118
119
  variant='secondary'
119
120
  type='outline'
120
121
  size='sm'
@@ -1,7 +1,6 @@
1
1
  import React, { useCallback, useMemo } from 'react';
2
2
  import { StyleSheet, View } from 'react-native';
3
3
 
4
- import { useA11yLabel } from '../../a11y/hooks/useA11yLabel';
5
4
  import { useTheme } from '../../contexts/themeContext/ThemeContext';
6
5
  import { IconProps } from '../../icons';
7
6
  import { Button, ButtonProps } from '../ui';
@@ -50,18 +49,17 @@ export const ReactionButton = (props: ReactionButtonProps) => {
50
49
  () => <Icon size={reactionIconSize ?? 24} />,
51
50
  [Icon, reactionIconSize],
52
51
  );
53
-
54
- const a11yLabel = useA11yLabel('a11y/Reaction {{emoji}} by {{count}} users', {
55
- count: count ?? '0',
56
- emoji: type,
57
- });
52
+ const selectedLabelState = selected ? 'selected' : 'unselected';
53
+ const accessibilityLabelParams = useMemo(
54
+ () => ({ selected: selectedLabelState, type }),
55
+ [selectedLabelState, type],
56
+ );
58
57
 
59
58
  return (
60
59
  <View style={styles.reactionButton}>
61
60
  <Button
62
- accessibilityLabel={
63
- a11yLabel ?? `reaction-button-${type}-${selected ? 'selected' : 'unselected'}`
64
- }
61
+ accessibilityLabelKey='a11y/reaction-button-{{type}}-{{selected}}'
62
+ accessibilityLabelParams={accessibilityLabelParams}
65
63
  variant={'secondary'}
66
64
  type={'outline'}
67
65
  iconOnly={!count}
@@ -80,12 +80,10 @@ describe('MessageReactionPicker', () => {
80
80
  });
81
81
 
82
82
  it('renders correctly with supported reactions', async () => {
83
- const { getAllByLabelText, getByLabelText } = renderComponent();
83
+ const { getAllByRole, getByLabelText } = renderComponent();
84
84
  await waitFor(() => {
85
85
  expect(getByLabelText('Reaction Selector on long pressing message')).toBeTruthy();
86
- expect(getAllByLabelText(/\breaction-button[^\s]+/)).toHaveLength(
87
- mockSupportedReactions.length,
88
- );
86
+ expect(getAllByRole('button')).toHaveLength(mockSupportedReactions.length + 1);
89
87
  });
90
88
  });
91
89
 
@@ -95,20 +93,20 @@ describe('MessageReactionPicker', () => {
95
93
  });
96
94
 
97
95
  it('marks own reactions as selected', async () => {
98
- const { getAllByLabelText } = renderComponent();
96
+ const { getAllByRole } = renderComponent();
99
97
 
100
98
  await waitFor(() => {
101
- const reactionButtons = getAllByLabelText(/\breaction-button[^\s]+/);
102
- expect(reactionButtons[0].props.accessibilityLabel).toBe('reaction-button-like-selected');
103
- expect(reactionButtons[1].props.accessibilityLabel).toBe('reaction-button-love-unselected');
99
+ const reactionButtons = getAllByRole('button');
100
+ expect(reactionButtons[0].props.accessibilityState.selected).toBe(true);
101
+ expect(reactionButtons[1].props.accessibilityState.selected).toBe(false);
104
102
  });
105
103
  });
106
104
 
107
105
  it('calls handleReaction and dismissOverlay when a reaction is pressed', async () => {
108
- const { getAllByLabelText } = renderComponent();
106
+ const { getAllByRole } = renderComponent();
109
107
 
110
108
  await waitFor(() => {
111
- const reactionButtons = getAllByLabelText(/\breaction-button[^\s]+/);
109
+ const reactionButtons = getAllByRole('button');
112
110
  fireEvent.press(reactionButtons[1]);
113
111
  expect(defaultProps.handleReaction).toHaveBeenCalledWith('love');
114
112
  expect(defaultProps.dismissOverlay).toHaveBeenCalled();
@@ -117,9 +115,9 @@ describe('MessageReactionPicker', () => {
117
115
  });
118
116
 
119
117
  it("doesn't call handleReaction when it's not provided", async () => {
120
- const { getAllByLabelText } = renderComponent({ handleReaction: undefined });
118
+ const { getAllByRole } = renderComponent({ handleReaction: undefined });
121
119
  await waitFor(() => {
122
- const reactionButtons = getAllByLabelText(/\breaction-button[^\s]+/);
120
+ const reactionButtons = getAllByRole('button');
123
121
 
124
122
  fireEvent.press(reactionButtons[1]);
125
123
 
@@ -132,11 +130,11 @@ describe('MessageReactionPicker', () => {
132
130
  { Icon: () => null, isMain: true, type: 'wow' },
133
131
  { Icon: () => null, isMain: true, type: 'haha' },
134
132
  ];
135
- const { getAllByLabelText } = renderComponent({ supportedReactions: customSupportedReactions });
133
+ const { getAllByRole } = renderComponent({ supportedReactions: customSupportedReactions });
136
134
 
137
135
  await waitFor(() => {
138
- const reactionButtons = getAllByLabelText(/\breaction-button[^\s]+/);
139
- expect(reactionButtons).toHaveLength(customSupportedReactions.length);
136
+ const reactionButtons = getAllByRole('button');
137
+ expect(reactionButtons).toHaveLength(customSupportedReactions.length + 1);
140
138
  });
141
139
  });
142
140
  });