stream-chat-react-native-core 9.3.1-beta.6 → 9.3.1-beta.7

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 (205) hide show
  1. package/lib/commonjs/a11y/hooks/useAnnounceOnShow.js +27 -0
  2. package/lib/commonjs/a11y/hooks/useAnnounceOnShow.js.map +1 -0
  3. package/lib/commonjs/a11y/index.js +11 -0
  4. package/lib/commonjs/a11y/index.js.map +1 -1
  5. package/lib/commonjs/components/Accessibility/CompositeAccessibilityProbe.js +29 -0
  6. package/lib/commonjs/components/Accessibility/CompositeAccessibilityProbe.js.map +1 -0
  7. package/lib/commonjs/components/Accessibility/HiddenA11yText.js +30 -0
  8. package/lib/commonjs/components/Accessibility/HiddenA11yText.js.map +1 -0
  9. package/lib/commonjs/components/Accessibility/index.js +22 -0
  10. package/lib/commonjs/components/Accessibility/index.js.map +1 -1
  11. package/lib/commonjs/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js +31 -29
  12. package/lib/commonjs/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js.map +1 -1
  13. package/lib/commonjs/components/ChannelPreview/ChannelPreviewMutedStatus.js +11 -5
  14. package/lib/commonjs/components/ChannelPreview/ChannelPreviewMutedStatus.js.map +1 -1
  15. package/lib/commonjs/components/ChannelPreview/ChannelPreviewStatus.js +8 -1
  16. package/lib/commonjs/components/ChannelPreview/ChannelPreviewStatus.js.map +1 -1
  17. package/lib/commonjs/components/ChannelPreview/ChannelPreviewUnreadCount.js +8 -2
  18. package/lib/commonjs/components/ChannelPreview/ChannelPreviewUnreadCount.js.map +1 -1
  19. package/lib/commonjs/components/ChannelPreview/ChannelPreviewView.js +3 -0
  20. package/lib/commonjs/components/ChannelPreview/ChannelPreviewView.js.map +1 -1
  21. package/lib/commonjs/components/Message/MessageItemView/MessageContent.js +2 -1
  22. package/lib/commonjs/components/Message/MessageItemView/MessageContent.js.map +1 -1
  23. package/lib/commonjs/components/Message/MessageItemView/MessageFooter.js +2 -0
  24. package/lib/commonjs/components/Message/MessageItemView/MessageFooter.js.map +1 -1
  25. package/lib/commonjs/components/Message/MessageItemView/MessageStatus.js +35 -30
  26. package/lib/commonjs/components/Message/MessageItemView/MessageStatus.js.map +1 -1
  27. package/lib/commonjs/components/Message/MessageItemView/ReactionList/ReactionListClustered.js +19 -6
  28. package/lib/commonjs/components/Message/MessageItemView/ReactionList/ReactionListClustered.js.map +1 -1
  29. package/lib/commonjs/components/Message/MessageItemView/ReactionList/ReactionListItem.js +6 -1
  30. package/lib/commonjs/components/Message/MessageItemView/ReactionList/ReactionListItem.js.map +1 -1
  31. package/lib/commonjs/components/Message/hooks/useMessageActionHandlers.js +8 -0
  32. package/lib/commonjs/components/Message/hooks/useMessageActionHandlers.js.map +1 -1
  33. package/lib/commonjs/components/Poll/Poll.js +0 -17
  34. package/lib/commonjs/components/Poll/Poll.js.map +1 -1
  35. package/lib/commonjs/components/Reply/Reply.js +43 -6
  36. package/lib/commonjs/components/Reply/Reply.js.map +1 -1
  37. package/lib/commonjs/components/ui/Avatar/ChannelAvatar.js +17 -11
  38. package/lib/commonjs/components/ui/Avatar/ChannelAvatar.js.map +1 -1
  39. package/lib/commonjs/components/ui/Badge/BadgeNotification.js +3 -1
  40. package/lib/commonjs/components/ui/Badge/BadgeNotification.js.map +1 -1
  41. package/lib/commonjs/i18n/ar.json +20 -8
  42. package/lib/commonjs/i18n/en.json +17 -5
  43. package/lib/commonjs/i18n/es.json +17 -5
  44. package/lib/commonjs/i18n/fr.json +17 -5
  45. package/lib/commonjs/i18n/he.json +17 -5
  46. package/lib/commonjs/i18n/hi.json +18 -6
  47. package/lib/commonjs/i18n/it.json +17 -5
  48. package/lib/commonjs/i18n/ja.json +17 -5
  49. package/lib/commonjs/i18n/ko.json +17 -5
  50. package/lib/commonjs/i18n/nl.json +18 -6
  51. package/lib/commonjs/i18n/pt-br.json +19 -7
  52. package/lib/commonjs/i18n/ru.json +17 -5
  53. package/lib/commonjs/i18n/tr.json +18 -6
  54. package/lib/commonjs/version.json +1 -1
  55. package/lib/module/a11y/hooks/useAnnounceOnShow.js +27 -0
  56. package/lib/module/a11y/hooks/useAnnounceOnShow.js.map +1 -0
  57. package/lib/module/a11y/index.js +11 -0
  58. package/lib/module/a11y/index.js.map +1 -1
  59. package/lib/module/components/Accessibility/CompositeAccessibilityProbe.js +29 -0
  60. package/lib/module/components/Accessibility/CompositeAccessibilityProbe.js.map +1 -0
  61. package/lib/module/components/Accessibility/HiddenA11yText.js +30 -0
  62. package/lib/module/components/Accessibility/HiddenA11yText.js.map +1 -0
  63. package/lib/module/components/Accessibility/index.js +22 -0
  64. package/lib/module/components/Accessibility/index.js.map +1 -1
  65. package/lib/module/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js +31 -29
  66. package/lib/module/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js.map +1 -1
  67. package/lib/module/components/ChannelPreview/ChannelPreviewMutedStatus.js +11 -5
  68. package/lib/module/components/ChannelPreview/ChannelPreviewMutedStatus.js.map +1 -1
  69. package/lib/module/components/ChannelPreview/ChannelPreviewStatus.js +8 -1
  70. package/lib/module/components/ChannelPreview/ChannelPreviewStatus.js.map +1 -1
  71. package/lib/module/components/ChannelPreview/ChannelPreviewUnreadCount.js +8 -2
  72. package/lib/module/components/ChannelPreview/ChannelPreviewUnreadCount.js.map +1 -1
  73. package/lib/module/components/ChannelPreview/ChannelPreviewView.js +3 -0
  74. package/lib/module/components/ChannelPreview/ChannelPreviewView.js.map +1 -1
  75. package/lib/module/components/Message/MessageItemView/MessageContent.js +2 -1
  76. package/lib/module/components/Message/MessageItemView/MessageContent.js.map +1 -1
  77. package/lib/module/components/Message/MessageItemView/MessageFooter.js +2 -0
  78. package/lib/module/components/Message/MessageItemView/MessageFooter.js.map +1 -1
  79. package/lib/module/components/Message/MessageItemView/MessageStatus.js +35 -30
  80. package/lib/module/components/Message/MessageItemView/MessageStatus.js.map +1 -1
  81. package/lib/module/components/Message/MessageItemView/ReactionList/ReactionListClustered.js +19 -6
  82. package/lib/module/components/Message/MessageItemView/ReactionList/ReactionListClustered.js.map +1 -1
  83. package/lib/module/components/Message/MessageItemView/ReactionList/ReactionListItem.js +6 -1
  84. package/lib/module/components/Message/MessageItemView/ReactionList/ReactionListItem.js.map +1 -1
  85. package/lib/module/components/Message/hooks/useMessageActionHandlers.js +8 -0
  86. package/lib/module/components/Message/hooks/useMessageActionHandlers.js.map +1 -1
  87. package/lib/module/components/Poll/Poll.js +0 -17
  88. package/lib/module/components/Poll/Poll.js.map +1 -1
  89. package/lib/module/components/Reply/Reply.js +43 -6
  90. package/lib/module/components/Reply/Reply.js.map +1 -1
  91. package/lib/module/components/ui/Avatar/ChannelAvatar.js +17 -11
  92. package/lib/module/components/ui/Avatar/ChannelAvatar.js.map +1 -1
  93. package/lib/module/components/ui/Badge/BadgeNotification.js +3 -1
  94. package/lib/module/components/ui/Badge/BadgeNotification.js.map +1 -1
  95. package/lib/module/i18n/ar.json +20 -8
  96. package/lib/module/i18n/en.json +17 -5
  97. package/lib/module/i18n/es.json +17 -5
  98. package/lib/module/i18n/fr.json +17 -5
  99. package/lib/module/i18n/he.json +17 -5
  100. package/lib/module/i18n/hi.json +18 -6
  101. package/lib/module/i18n/it.json +17 -5
  102. package/lib/module/i18n/ja.json +17 -5
  103. package/lib/module/i18n/ko.json +17 -5
  104. package/lib/module/i18n/nl.json +18 -6
  105. package/lib/module/i18n/pt-br.json +19 -7
  106. package/lib/module/i18n/ru.json +17 -5
  107. package/lib/module/i18n/tr.json +18 -6
  108. package/lib/module/version.json +1 -1
  109. package/lib/typescript/a11y/hooks/useAnnounceOnShow.d.ts +21 -0
  110. package/lib/typescript/a11y/hooks/useAnnounceOnShow.d.ts.map +1 -0
  111. package/lib/typescript/a11y/index.d.ts +1 -0
  112. package/lib/typescript/a11y/index.d.ts.map +1 -1
  113. package/lib/typescript/components/Accessibility/CompositeAccessibilityProbe.d.ts +30 -0
  114. package/lib/typescript/components/Accessibility/CompositeAccessibilityProbe.d.ts.map +1 -0
  115. package/lib/typescript/components/Accessibility/HiddenA11yText.d.ts +25 -0
  116. package/lib/typescript/components/Accessibility/HiddenA11yText.d.ts.map +1 -0
  117. package/lib/typescript/components/Accessibility/index.d.ts +2 -0
  118. package/lib/typescript/components/Accessibility/index.d.ts.map +1 -1
  119. package/lib/typescript/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.d.ts.map +1 -1
  120. package/lib/typescript/components/ChannelPreview/ChannelPreviewMutedStatus.d.ts.map +1 -1
  121. package/lib/typescript/components/ChannelPreview/ChannelPreviewStatus.d.ts.map +1 -1
  122. package/lib/typescript/components/ChannelPreview/ChannelPreviewUnreadCount.d.ts.map +1 -1
  123. package/lib/typescript/components/ChannelPreview/ChannelPreviewView.d.ts.map +1 -1
  124. package/lib/typescript/components/Message/MessageItemView/MessageContent.d.ts.map +1 -1
  125. package/lib/typescript/components/Message/MessageItemView/MessageFooter.d.ts.map +1 -1
  126. package/lib/typescript/components/Message/MessageItemView/MessageStatus.d.ts.map +1 -1
  127. package/lib/typescript/components/Message/MessageItemView/ReactionList/ReactionListClustered.d.ts.map +1 -1
  128. package/lib/typescript/components/Message/MessageItemView/ReactionList/ReactionListItem.d.ts.map +1 -1
  129. package/lib/typescript/components/Message/MessageOverlayWrapper.d.ts +1 -1
  130. package/lib/typescript/components/Message/hooks/useMessageActionHandlers.d.ts.map +1 -1
  131. package/lib/typescript/components/Poll/Poll.d.ts.map +1 -1
  132. package/lib/typescript/components/Reply/Reply.d.ts.map +1 -1
  133. package/lib/typescript/components/ui/Avatar/ChannelAvatar.d.ts.map +1 -1
  134. package/lib/typescript/components/ui/Badge/BadgeNotification.d.ts +5 -0
  135. package/lib/typescript/components/ui/Badge/BadgeNotification.d.ts.map +1 -1
  136. package/lib/typescript/hooks/useTranslatedMessage.d.ts +1 -1
  137. package/lib/typescript/i18n/ar.json +20 -8
  138. package/lib/typescript/i18n/en.json +17 -5
  139. package/lib/typescript/i18n/es.json +17 -5
  140. package/lib/typescript/i18n/fr.json +17 -5
  141. package/lib/typescript/i18n/he.json +17 -5
  142. package/lib/typescript/i18n/hi.json +18 -6
  143. package/lib/typescript/i18n/it.json +17 -5
  144. package/lib/typescript/i18n/ja.json +17 -5
  145. package/lib/typescript/i18n/ko.json +17 -5
  146. package/lib/typescript/i18n/nl.json +18 -6
  147. package/lib/typescript/i18n/pt-br.json +19 -7
  148. package/lib/typescript/i18n/ru.json +17 -5
  149. package/lib/typescript/i18n/tr.json +18 -6
  150. package/lib/typescript/utils/i18n/Streami18n.d.ts +16 -4
  151. package/lib/typescript/utils/i18n/Streami18n.d.ts.map +1 -1
  152. package/package.json +1 -1
  153. package/src/a11y/hooks/useAnnounceOnShow.ts +44 -0
  154. package/src/a11y/index.ts +1 -0
  155. package/src/components/Accessibility/CompositeAccessibilityProbe.tsx +48 -0
  156. package/src/components/Accessibility/HiddenA11yText.tsx +49 -0
  157. package/src/components/Accessibility/index.ts +2 -0
  158. package/src/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.tsx +19 -16
  159. package/src/components/ChannelPreview/ChannelPreviewMutedStatus.tsx +8 -1
  160. package/src/components/ChannelPreview/ChannelPreviewStatus.tsx +10 -4
  161. package/src/components/ChannelPreview/ChannelPreviewUnreadCount.tsx +5 -1
  162. package/src/components/ChannelPreview/ChannelPreviewView.tsx +3 -0
  163. package/src/components/Message/MessageItemView/MessageContent.tsx +12 -1
  164. package/src/components/Message/MessageItemView/MessageFooter.tsx +6 -1
  165. package/src/components/Message/MessageItemView/MessageStatus.tsx +36 -39
  166. package/src/components/Message/MessageItemView/ReactionList/ReactionListClustered.tsx +24 -10
  167. package/src/components/Message/MessageItemView/ReactionList/ReactionListItem.tsx +5 -1
  168. package/src/components/Message/MessageItemView/__tests__/MessageStatus.test.tsx +10 -7
  169. package/src/components/Message/MessageItemView/__tests__/ReactionListBottom.test.tsx +1 -1
  170. package/src/components/Message/hooks/useMessageActionHandlers.ts +7 -0
  171. package/src/components/Poll/Poll.tsx +1 -25
  172. package/src/components/Reply/Reply.tsx +58 -7
  173. package/src/components/Thread/__tests__/__snapshots__/Thread.test.tsx.snap +8 -0
  174. package/src/components/ui/Avatar/ChannelAvatar.tsx +39 -29
  175. package/src/components/ui/Badge/BadgeNotification.tsx +11 -2
  176. package/src/i18n/ar.json +20 -8
  177. package/src/i18n/en.json +17 -5
  178. package/src/i18n/es.json +17 -5
  179. package/src/i18n/fr.json +17 -5
  180. package/src/i18n/he.json +17 -5
  181. package/src/i18n/hi.json +18 -6
  182. package/src/i18n/it.json +17 -5
  183. package/src/i18n/ja.json +17 -5
  184. package/src/i18n/ko.json +17 -5
  185. package/src/i18n/nl.json +18 -6
  186. package/src/i18n/pt-br.json +19 -7
  187. package/src/i18n/ru.json +17 -5
  188. package/src/i18n/tr.json +18 -6
  189. package/src/version.json +1 -1
  190. package/lib/commonjs/components/Poll/hooks/usePollAccessibilityActions.js +0 -150
  191. package/lib/commonjs/components/Poll/hooks/usePollAccessibilityActions.js.map +0 -1
  192. package/lib/commonjs/components/Poll/hooks/usePollAccessibilityLabel.js +0 -59
  193. package/lib/commonjs/components/Poll/hooks/usePollAccessibilityLabel.js.map +0 -1
  194. package/lib/module/components/Poll/hooks/usePollAccessibilityActions.js +0 -150
  195. package/lib/module/components/Poll/hooks/usePollAccessibilityActions.js.map +0 -1
  196. package/lib/module/components/Poll/hooks/usePollAccessibilityLabel.js +0 -59
  197. package/lib/module/components/Poll/hooks/usePollAccessibilityLabel.js.map +0 -1
  198. package/lib/typescript/components/Poll/hooks/usePollAccessibilityActions.d.ts +0 -25
  199. package/lib/typescript/components/Poll/hooks/usePollAccessibilityActions.d.ts.map +0 -1
  200. package/lib/typescript/components/Poll/hooks/usePollAccessibilityLabel.d.ts +0 -8
  201. package/lib/typescript/components/Poll/hooks/usePollAccessibilityLabel.d.ts.map +0 -1
  202. package/src/components/Poll/hooks/__tests__/usePollAccessibilityActions.test.tsx +0 -358
  203. package/src/components/Poll/hooks/__tests__/usePollAccessibilityLabel.test.tsx +0 -142
  204. package/src/components/Poll/hooks/usePollAccessibilityActions.ts +0 -191
  205. package/src/components/Poll/hooks/usePollAccessibilityLabel.ts +0 -75
@@ -1 +1 @@
1
- {"version":3,"file":"Streami18n.d.ts","sourceRoot":"","sources":["../../../../src/utils/i18n/Streami18n.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Streami18n.d.ts","sourceRoot":"","sources":["../../../../src/utils/i18n/Streami18n.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "stream-chat-react-native-core",
3
3
  "description": "The official React Native and Expo components for Stream Chat, a service for building chat applications",
4
- "version": "9.3.1-beta.6",
4
+ "version": "9.3.1-beta.7",
5
5
  "author": {
6
6
  "company": "Stream.io Inc",
7
7
  "name": "Stream.io Inc"
@@ -0,0 +1,44 @@
1
+ import { useEffect, useRef } from 'react';
2
+
3
+ import { useAccessibilityAnnouncer } from '../../components/Accessibility/useAccessibilityAnnouncer';
4
+
5
+ type Options = {
6
+ /** Delay before the announcement fires; lets entrance animations settle. */
7
+ delayMs?: number;
8
+ priority?: 'polite' | 'assertive';
9
+ };
10
+
11
+ /**
12
+ * Announces `message` once each time `visible` flips from false to true.
13
+ * Resets when `visible` flips back to false, so the next show re-announces —
14
+ * unlike `useAnnounceOnStateChange`, which announces on string change and
15
+ * dedupes consecutive identical strings.
16
+ *
17
+ * Use this for transient surfaces that appear and disappear repeatedly within
18
+ * a session (modals, autocomplete pickers, bottom sheets) where the user
19
+ * benefits from hearing the affordance on every reappearance.
20
+ *
21
+ * When `message` is undefined (typically because `useA11yLabel` returned
22
+ * undefined — a11y disabled or key missing), the hook is a no-op.
23
+ */
24
+ export const useAnnounceOnShow = (
25
+ visible: boolean,
26
+ message: string | undefined,
27
+ { delayMs = 500, priority = 'polite' }: Options = {},
28
+ ) => {
29
+ const announce = useAccessibilityAnnouncer();
30
+ const announcedRef = useRef(false);
31
+
32
+ useEffect(() => {
33
+ if (!visible) {
34
+ announcedRef.current = false;
35
+ return;
36
+ }
37
+ if (!message || announcedRef.current) return;
38
+ const id = setTimeout(() => {
39
+ announce(message, priority);
40
+ announcedRef.current = true;
41
+ }, delayMs);
42
+ return () => clearTimeout(id);
43
+ }, [visible, message, announce, priority, delayMs]);
44
+ };
package/src/a11y/index.ts CHANGED
@@ -3,5 +3,6 @@ export * from './hooks/useScreenReaderEnabled';
3
3
  export * from './hooks/useReducedMotionPreference';
4
4
  export * from './hooks/useResolvedModalAccessibilityProps';
5
5
  export * from './hooks/useAnnounceOnStateChange';
6
+ export * from './hooks/useAnnounceOnShow';
6
7
  export * from './hooks/useA11yLabel';
7
8
  export * from './hooks/useAccessibilityActivateAction';
@@ -0,0 +1,48 @@
1
+ import React, { PropsWithChildren } from 'react';
2
+ import { View } from 'react-native';
3
+
4
+ import { HiddenA11yText } from './HiddenA11yText';
5
+
6
+ export type CompositeAccessibilityProbeProps = {
7
+ /**
8
+ * The accessibility label that VoiceOver / TalkBack should announce for the
9
+ * wrapped content. When `undefined`, the probe is a no-op and the children
10
+ * render with no a11y modifications — use this to skip the wrapper when the
11
+ * SDK's a11y opt-in is off.
12
+ */
13
+ label: string | undefined;
14
+ };
15
+
16
+ /**
17
+ * Wraps decorative visual content with a single, cross platform stable
18
+ * accessibility focus stop carrying the provided `label`.
19
+ *
20
+ * iOS auto collapses descendants when a parent View is `accessible`, but on
21
+ * Android `importantForAccessibility='no-hide-descendants'` on the parent
22
+ * gets defeated by deeply nested descendants that set their own
23
+ * `accessible={true}` (our SDK's `<Avatar>` does this). A zero size accessible
24
+ * `<Text>` sidesteps that - Text is always accessible by default on both
25
+ * platforms and carries the label cleanly, while the visual subtree is
26
+ * marked decorative. More importantly, it's discoverable very very easily
27
+ * by screen readers.
28
+ *
29
+ * Use this anywhere you have non-Text visual content (avatars, icons,
30
+ * composed graphics) that should announce as a single semantic unit with a
31
+ * curated label, rather than letting screen readers walk the visual tree
32
+ * verbosely.
33
+ */
34
+ export const CompositeAccessibilityProbe = ({
35
+ children,
36
+ label,
37
+ }: PropsWithChildren<CompositeAccessibilityProbeProps>) => {
38
+ if (!label) return <>{children}</>;
39
+
40
+ return (
41
+ <>
42
+ <HiddenA11yText label={label} />
43
+ <View accessibilityElementsHidden importantForAccessibility='no-hide-descendants'>
44
+ {children}
45
+ </View>
46
+ </>
47
+ );
48
+ };
@@ -0,0 +1,49 @@
1
+ import React from 'react';
2
+ import { StyleSheet, Text } from 'react-native';
3
+
4
+ export type HiddenA11yTextProps = {
5
+ /**
6
+ * The text to inject into the accessibility tree. Rendered as actual Text
7
+ * content (not as `accessibilityLabel`) so the parent's compose loop on
8
+ * Android picks it up — Text without its own label isn't
9
+ * `isAccessibilityFocusable`, so it gets concatenated into the parent's
10
+ * announcement rather than being skipped as a drill-in target.
11
+ *
12
+ * Pass the result of `useA11yLabel(...)` directly: when SDK a11y is
13
+ * opt-out the value is `undefined` and the component renders nothing.
14
+ */
15
+ label: string | undefined;
16
+ };
17
+
18
+ /**
19
+ * A visually invisible Text that exists only to contribute extra information
20
+ * to a screen reader's announcement. Use it inside a parent that auto-composes
21
+ * descendant labels (Pressable, or any View with `accessible` + `accessibilityRole`)
22
+ * to splice in supplementary state like "you reacted", "and N more", etc.
23
+ *
24
+ * Not for "this whole element should be one focus stop with a curated label" -
25
+ * use `CompositeAccessibilityProbe` for that.
26
+ */
27
+ export const HiddenA11yText = ({ label }: HiddenA11yTextProps) => {
28
+ if (!label) return null;
29
+ // Both content and accessibilityLabel are set to the same string. Content
30
+ // keeps the Text on the parent's compose loop (label-only would make it
31
+ // `isAccessibilityFocusable` and potentially skipped on Android — though
32
+ // the opacity:0 hidden style usually saves it). accessibilityLabel keeps
33
+ // testing-library `getByLabelText(...)` queries working.
34
+ return (
35
+ <Text accessibilityLabel={label} style={styles.hidden}>
36
+ {label}
37
+ </Text>
38
+ );
39
+ };
40
+
41
+ const styles = StyleSheet.create({
42
+ hidden: {
43
+ height: 1,
44
+ opacity: 0,
45
+ overflow: 'hidden',
46
+ position: 'absolute',
47
+ width: 1,
48
+ },
49
+ });
@@ -1,3 +1,5 @@
1
+ export * from './CompositeAccessibilityProbe';
2
+ export * from './HiddenA11yText';
1
3
  export * from './NotificationAnnouncer';
2
4
  export * from './useAccessibilityAnnouncer';
3
5
  export * from './hooks/useIncomingMessageAnnouncements';
@@ -13,6 +13,7 @@ import { MessageDeliveryStatus, useMessageDeliveryStatus } from '../../hooks';
13
13
  import { Check, CheckAll, Time } from '../../icons';
14
14
  import { primitives } from '../../theme';
15
15
  import { MessageStatusTypes } from '../../utils/utils';
16
+ import { CompositeAccessibilityProbe } from '../Accessibility/CompositeAccessibilityProbe';
16
17
 
17
18
  export type ChannelMessagePreviewDeliveryStatusProps = Pick<ChannelPreviewProps, 'channel'> & {
18
19
  message: MessageResponse | LocalMessage;
@@ -66,11 +67,11 @@ export const ChannelMessagePreviewDeliveryStatus = ({
66
67
  message.status === MessageStatusTypes.SENDING
67
68
  ? 'a11y/Sending'
68
69
  : message.status === MessageStatusTypes.RECEIVED && status === MessageDeliveryStatus.READ
69
- ? 'a11y/Read'
70
+ ? 'a11y/Read, sent by you'
70
71
  : status === MessageDeliveryStatus.DELIVERED
71
- ? 'a11y/Delivered'
72
+ ? 'a11y/Delivered, sent by you'
72
73
  : status === MessageDeliveryStatus.SENT
73
- ? 'a11y/Sent'
74
+ ? 'a11y/Sent by you'
74
75
  : 'a11y/Sending',
75
76
  );
76
77
 
@@ -83,19 +84,21 @@ export const ChannelMessagePreviewDeliveryStatus = ({
83
84
  }
84
85
 
85
86
  return (
86
- <View accessibilityLabel={statusLabel} accessibilityRole='text' style={styles.container}>
87
- {message.status === MessageStatusTypes.SENDING ? (
88
- <Time stroke={semantics.chatTextTimestamp} height={16} width={16} {...timeIcon} />
89
- ) : message.status === MessageStatusTypes.RECEIVED &&
90
- status === MessageDeliveryStatus.READ ? (
91
- <CheckAll stroke={semantics.accentPrimary} height={16} width={16} {...checkAllIcon} />
92
- ) : status === MessageDeliveryStatus.DELIVERED ? (
93
- <CheckAll stroke={semantics.chatTextTimestamp} height={16} width={16} {...checkAllIcon} />
94
- ) : status === MessageDeliveryStatus.SENT ? (
95
- <Check stroke={semantics.chatTextTimestamp} height={16} width={16} {...checkIcon} />
96
- ) : null}
97
- <Text style={styles.text}>{t('You')}:</Text>
98
- </View>
87
+ <CompositeAccessibilityProbe label={statusLabel}>
88
+ <View style={styles.container}>
89
+ {message.status === MessageStatusTypes.SENDING ? (
90
+ <Time stroke={semantics.chatTextTimestamp} height={16} width={16} {...timeIcon} />
91
+ ) : message.status === MessageStatusTypes.RECEIVED &&
92
+ status === MessageDeliveryStatus.READ ? (
93
+ <CheckAll stroke={semantics.accentPrimary} height={16} width={16} {...checkAllIcon} />
94
+ ) : status === MessageDeliveryStatus.DELIVERED ? (
95
+ <CheckAll stroke={semantics.chatTextTimestamp} height={16} width={16} {...checkAllIcon} />
96
+ ) : status === MessageDeliveryStatus.SENT ? (
97
+ <Check stroke={semantics.chatTextTimestamp} height={16} width={16} {...checkIcon} />
98
+ ) : null}
99
+ <Text style={styles.text}>{t('You')}:</Text>
100
+ </View>
101
+ </CompositeAccessibilityProbe>
99
102
  );
100
103
  };
101
104
 
@@ -1,7 +1,9 @@
1
1
  import React from 'react';
2
2
 
3
+ import { useA11yLabel } from '../../a11y/hooks/useA11yLabel';
3
4
  import { useTheme } from '../../contexts/themeContext/ThemeContext';
4
5
  import { Mute } from '../../icons';
6
+ import { CompositeAccessibilityProbe } from '../Accessibility/CompositeAccessibilityProbe';
5
7
 
6
8
  /**
7
9
  * This UI component displays an avatar for a particular channel.
@@ -13,6 +15,11 @@ export const ChannelPreviewMutedStatus = () => {
13
15
  semantics,
14
16
  },
15
17
  } = useTheme();
18
+ const accessibilityLabel = useA11yLabel('a11y/Muted');
16
19
 
17
- return <Mute height={20} fill={semantics.textTertiary} width={20} {...mutedStatus} />;
20
+ return (
21
+ <CompositeAccessibilityProbe label={accessibilityLabel}>
22
+ <Mute height={20} fill={semantics.textTertiary} width={20} {...mutedStatus} />
23
+ </CompositeAccessibilityProbe>
24
+ );
18
25
  };
@@ -4,6 +4,7 @@ import { StyleSheet, Text } from 'react-native';
4
4
  import type { ChannelPreviewProps } from './ChannelPreview';
5
5
  import type { ChannelPreviewViewPropsWithContext } from './ChannelPreviewView';
6
6
 
7
+ import { useA11yLabel } from '../../a11y/hooks/useA11yLabel';
7
8
  import { useTheme } from '../../contexts/themeContext/ThemeContext';
8
9
  import { useTranslationContext } from '../../contexts/translationContext/TranslationContext';
9
10
 
@@ -35,11 +36,16 @@ export const ChannelPreviewStatus = (props: ChannelPreviewStatusProps) => {
35
36
  [created_at, t, tDateTimeParser],
36
37
  );
37
38
 
39
+ const visibleDate =
40
+ formatLatestMessageDate && latestMessageDate
41
+ ? formatLatestMessageDate(latestMessageDate).toString()
42
+ : formattedDate;
43
+ const labelParams = useMemo(() => ({ date: visibleDate ?? '' }), [visibleDate]);
44
+ const accessibilityLabel = useA11yLabel('a11y/Last message {{date}}', labelParams);
45
+
38
46
  return (
39
- <Text style={styles.date}>
40
- {formatLatestMessageDate && latestMessageDate
41
- ? formatLatestMessageDate(latestMessageDate).toString()
42
- : formattedDate}
47
+ <Text accessibilityLabel={accessibilityLabel} style={styles.date}>
48
+ {visibleDate}
43
49
  </Text>
44
50
  );
45
51
  };
@@ -1,7 +1,8 @@
1
- import React from 'react';
1
+ import React, { useMemo } from 'react';
2
2
 
3
3
  import { ChannelPreviewProps } from './ChannelPreview';
4
4
 
5
+ import { useA11yLabel } from '../../a11y/hooks/useA11yLabel';
5
6
  import type { ChannelsContextValue } from '../../contexts/channelsContext/ChannelsContext';
6
7
  import { BadgeNotification } from '../ui/Badge';
7
8
 
@@ -15,12 +16,15 @@ export type ChannelPreviewUnreadCountProps = Pick<ChannelsContextValue, 'maxUnre
15
16
 
16
17
  export const ChannelPreviewUnreadCount = (props: ChannelPreviewUnreadCountProps) => {
17
18
  const { maxUnreadCount, unread } = props;
19
+ const labelParams = useMemo(() => ({ count: unread ?? 0 }), [unread]);
20
+ const accessibilityLabel = useA11yLabel('a11y/{{count}} unread messages', labelParams);
18
21
  if (!unread) {
19
22
  return null;
20
23
  }
21
24
 
22
25
  return (
23
26
  <BadgeNotification
27
+ accessibilityLabel={accessibilityLabel}
24
28
  count={unread > maxUnreadCount ? maxUnreadCount : unread}
25
29
  size='sm'
26
30
  type='primary'
@@ -5,6 +5,7 @@ import type { ChannelPreviewProps } from './ChannelPreview';
5
5
 
6
6
  import type { LastMessageType } from './hooks/useChannelPreviewData';
7
7
 
8
+ import { useA11yLabel } from '../../a11y/hooks/useA11yLabel';
8
9
  import {
9
10
  ChannelsContextValue,
10
11
  useChannelsContext,
@@ -70,6 +71,7 @@ const ChannelPreviewViewWithContext = (props: ChannelPreviewViewPropsWithContext
70
71
  } = useTheme();
71
72
  const styles = useStyles();
72
73
  const swipeRegistry = useSwipeRegistryContext();
74
+ const accessibilityHint = useA11yLabel('a11y/Double tap to open');
73
75
 
74
76
  const onPress = useStableCallback(() => {
75
77
  if (swipeRegistry?.hasOpen()) {
@@ -84,6 +86,7 @@ const ChannelPreviewViewWithContext = (props: ChannelPreviewViewPropsWithContext
84
86
  return (
85
87
  <View style={[styles.wrapper, wrapper]}>
86
88
  <Pressable
89
+ accessibilityHint={accessibilityHint}
87
90
  onPress={onPress}
88
91
  style={({ pressed }) => [
89
92
  styles.container,
@@ -318,10 +318,21 @@ const MessageContentWithContext = (props: MessageContentPropsWithContext) => {
318
318
  </>
319
319
  );
320
320
 
321
+ // Drop the Pressable's single-focus-stop behavior when the message contains
322
+ // interactive children (poll options, attachment cells, the quoted-reply
323
+ // navigator, shared location). Without this, VO/TalkBack subsume those
324
+ // children into the row's one announcement and they can't be activated.
325
+ const hasInteractiveContent = !!(
326
+ message.poll_id ||
327
+ message.quoted_message ||
328
+ message.attachments?.length ||
329
+ message.shared_location
330
+ );
331
+
321
332
  return (
322
333
  <Pressable
323
334
  accessibilityHint={accessibilityHint}
324
- accessible={message.poll_id ? false : undefined}
335
+ accessible={hasInteractiveContent ? false : undefined}
325
336
  disabled={preventPress}
326
337
  onLongPress={(event) => {
327
338
  if (onLongPress) {
@@ -69,7 +69,12 @@ const MessageFooterWithContext = (props: MessageFooterPropsWithContext) => {
69
69
  const isEdited = isEditedMessage(message) && !isAIGenerated;
70
70
 
71
71
  return (
72
- <View style={[styles.container, container]} testID='message-status-time'>
72
+ <View
73
+ accessible
74
+ accessibilityRole='text'
75
+ style={[styles.container, container]}
76
+ testID='message-status-time'
77
+ >
73
78
  {Object.keys(members).length > 2 && alignment === 'left' && message.user?.name ? (
74
79
  <Text numberOfLines={1} ellipsizeMode='tail' style={[styles.name, name]}>
75
80
  {message.user.name}
@@ -1,6 +1,7 @@
1
1
  import React, { useMemo } from 'react';
2
2
  import { StyleSheet, View } from 'react-native';
3
3
 
4
+ import { useA11yLabel } from '../../../a11y/hooks/useA11yLabel';
4
5
  import { useChannelContext } from '../../../contexts/channelContext/ChannelContext';
5
6
  import {
6
7
  MessageContextValue,
@@ -12,6 +13,7 @@ import { CheckAll } from '../../../icons/checks';
12
13
  import { Time } from '../../../icons/clock';
13
14
  import { primitives } from '../../../theme';
14
15
  import { MessageStatusTypes } from '../../../utils/utils';
16
+ import { HiddenA11yText } from '../../Accessibility/HiddenA11yText';
15
17
  import { useShouldUseOverlayStyles } from '../hooks/useShouldUseOverlayStyles';
16
18
 
17
19
  export type MessageStatusPropsWithContext = Pick<
@@ -32,10 +34,6 @@ const MessageStatusWithContext = (props: MessageStatusPropsWithContext) => {
32
34
  },
33
35
  } = useTheme();
34
36
 
35
- if (message.status === MessageStatusTypes.FAILED || message.type === 'error') {
36
- return null;
37
- }
38
-
39
37
  const hasReadByGreaterThanOne = typeof readBy === 'number' && readBy > 1;
40
38
 
41
39
  // Variables to determine the status of the message
@@ -48,42 +46,41 @@ const MessageStatusWithContext = (props: MessageStatusPropsWithContext) => {
48
46
  !read &&
49
47
  message.type !== 'ephemeral';
50
48
 
49
+ const accessibilityLabel = useA11yLabel(
50
+ read
51
+ ? 'a11y/Read'
52
+ : delivered
53
+ ? 'a11y/Delivered'
54
+ : sending
55
+ ? 'a11y/Sending'
56
+ : sent
57
+ ? 'a11y/Sent'
58
+ : '',
59
+ );
60
+
61
+ if (message.status === MessageStatusTypes.FAILED || message.type === 'error') {
62
+ return null;
63
+ }
64
+
51
65
  return (
52
- <View style={[styles.container, container]}>
53
- {read ? (
54
- <CheckAll
55
- height={16}
56
- stroke={styles.readCheck.color}
57
- width={16}
58
- accessibilityLabel='Read'
59
- {...checkAllIcon}
60
- />
61
- ) : delivered ? (
62
- <CheckAll
63
- stroke={styles.deliveredCheck.color}
64
- height={16}
65
- width={16}
66
- accessibilityLabel='Delivered'
67
- {...checkAllIcon}
68
- />
69
- ) : sending ? (
70
- <Time
71
- stroke={styles.sendingCheck.color}
72
- height={16}
73
- width={16}
74
- accessibilityLabel='Sending'
75
- {...timeIcon}
76
- />
77
- ) : sent ? (
78
- <Check
79
- stroke={styles.sentCheck.color}
80
- height={16}
81
- width={16}
82
- accessibilityLabel='Sent'
83
- {...checkIcon}
84
- />
85
- ) : null}
86
- </View>
66
+ <>
67
+ <HiddenA11yText label={accessibilityLabel} />
68
+ <View
69
+ accessibilityElementsHidden={!!accessibilityLabel}
70
+ importantForAccessibility={accessibilityLabel ? 'no-hide-descendants' : undefined}
71
+ style={[styles.container, container]}
72
+ >
73
+ {read ? (
74
+ <CheckAll height={16} stroke={styles.readCheck.color} width={16} {...checkAllIcon} />
75
+ ) : delivered ? (
76
+ <CheckAll stroke={styles.deliveredCheck.color} height={16} width={16} {...checkAllIcon} />
77
+ ) : sending ? (
78
+ <Time stroke={styles.sendingCheck.color} height={16} width={16} {...timeIcon} />
79
+ ) : sent ? (
80
+ <Check stroke={styles.sentCheck.color} height={16} width={16} {...checkIcon} />
81
+ ) : null}
82
+ </View>
83
+ </>
87
84
  );
88
85
  };
89
86
 
@@ -1,8 +1,9 @@
1
- import React, { useMemo } from 'react';
1
+ import React, { Fragment, useMemo } from 'react';
2
2
  import { StyleProp, StyleSheet, Text, ViewStyle } from 'react-native';
3
3
 
4
4
  import { ReactionListItemWrapper } from './ReactionListItemWrapper';
5
5
 
6
+ import { useA11yLabel } from '../../../../a11y/hooks/useA11yLabel';
6
7
  import {
7
8
  MessageContextValue,
8
9
  useMessageContext,
@@ -19,6 +20,7 @@ import type { IconProps } from '../../../../icons/utils/base';
19
20
 
20
21
  import { primitives } from '../../../../theme';
21
22
  import type { ReactionData } from '../../../../utils/utils';
23
+ import { HiddenA11yText } from '../../../Accessibility/HiddenA11yText';
22
24
 
23
25
  type Props = Pick<IconProps, 'pathFill' | 'style'> & {
24
26
  size: number;
@@ -65,6 +67,8 @@ export const ReactionListClusteredWithContext = (props: ReactionListClusteredPro
65
67
  },
66
68
  } = useTheme();
67
69
  const styles = useStyles();
70
+ const accessibilityHint = useA11yLabel('a11y/Double tap to view reactions');
71
+ const youReacted = useA11yLabel('a11y/you reacted');
68
72
  const supportedReactionTypes = supportedReactions?.map(
69
73
  (supportedReaction) => supportedReaction.type,
70
74
  );
@@ -72,6 +76,9 @@ export const ReactionListClusteredWithContext = (props: ReactionListClusteredPro
72
76
  const moreReactionsCount = reactionsCount - 4;
73
77
  const reactionsCountText =
74
78
  moreReactionsCount < 99 ? moreReactionsCount : `+${moreReactionsCount}`;
79
+ const moreReactionsA11yText = useA11yLabel('a11y/and {{count}} more reactions', {
80
+ count: moreReactionsCount,
81
+ });
75
82
 
76
83
  const hasSupportedReactions = reactions?.some((reaction) =>
77
84
  supportedReactionTypes?.includes(reaction.type),
@@ -83,6 +90,8 @@ export const ReactionListClusteredWithContext = (props: ReactionListClusteredPro
83
90
 
84
91
  return (
85
92
  <ReactionListItemWrapper
93
+ accessibilityHint={accessibilityHint}
94
+ accessibilityLabel={accessibilityLabel}
86
95
  disabled={preventPress}
87
96
  onPress={(event) => {
88
97
  if (onPress) {
@@ -111,18 +120,23 @@ export const ReactionListClusteredWithContext = (props: ReactionListClusteredPro
111
120
  }
112
121
  }}
113
122
  style={containerStyle}
114
- accessibilityLabel={accessibilityLabel}
115
123
  >
116
124
  {reactions?.slice(0, 4).map((reaction) => (
117
- <Icon
118
- key={reaction.type}
119
- size={icon.size}
120
- style={[styles.iconStyle, icon.style]}
121
- supportedReactions={supportedReactions}
122
- type={reaction.type}
123
- />
125
+ <Fragment key={reaction.type}>
126
+ <Icon
127
+ size={icon.size}
128
+ style={[styles.iconStyle, icon.style]}
129
+ supportedReactions={supportedReactions}
130
+ type={reaction.type}
131
+ />
132
+ {reaction.own ? <HiddenA11yText label={youReacted} /> : null}
133
+ </Fragment>
124
134
  ))}
125
- {reactionsCount > 4 ? <Text style={styles.reactionCount}>{reactionsCountText}</Text> : null}
135
+ {reactionsCount > 4 ? (
136
+ <Text accessibilityLabel={moreReactionsA11yText} style={styles.reactionCount}>
137
+ {reactionsCountText}
138
+ </Text>
139
+ ) : null}
126
140
  </ReactionListItemWrapper>
127
141
  );
128
142
  };
@@ -3,6 +3,7 @@ import { StyleSheet, Text } from 'react-native';
3
3
 
4
4
  import { ReactionListItemWrapper } from './ReactionListItemWrapper';
5
5
 
6
+ import { useA11yLabel } from '../../../../a11y/hooks/useA11yLabel';
6
7
  import { MessageContextValue } from '../../../../contexts/messageContext/MessageContext';
7
8
  import { MessagesContextValue } from '../../../../contexts/messagesContext/MessagesContext';
8
9
  import { useTheme } from '../../../../contexts/themeContext/ThemeContext';
@@ -13,6 +14,7 @@ import type { IconProps } from '../../../../icons/utils/base';
13
14
 
14
15
  import { primitives } from '../../../../theme';
15
16
  import type { ReactionData } from '../../../../utils/utils';
17
+ import { HiddenA11yText } from '../../../Accessibility/HiddenA11yText';
16
18
  import { ReactionSummary } from '../../hooks/useProcessReactions';
17
19
 
18
20
  type Props = Pick<IconProps, 'pathFill' | 'style'> & {
@@ -66,12 +68,13 @@ export const ReactionListItem = (props: ReactionListItemProps) => {
66
68
  },
67
69
  } = useTheme();
68
70
  const styles = useStyles();
71
+ const youReacted = useA11yLabel('a11y/you reacted');
69
72
 
70
73
  return (
71
74
  <ReactionListItemWrapper
72
- accessibilityLabel='Reaction List Item'
73
75
  disabled={preventPress}
74
76
  key={reaction.type}
77
+ testID='reaction-list-item'
75
78
  onLongPress={(event) => {
76
79
  if (onLongPress) {
77
80
  onLongPress({
@@ -121,6 +124,7 @@ export const ReactionListItem = (props: ReactionListItemProps) => {
121
124
  type={reaction.type}
122
125
  />
123
126
  {showCount ? <Text style={styles.reactionCount}>{reaction.count}</Text> : null}
127
+ {selected ? <HiddenA11yText label={youReacted} /> : null}
124
128
  </ReactionListItemWrapper>
125
129
  );
126
130
  };
@@ -5,6 +5,7 @@ import type { Channel as ChannelType, StreamChat } from 'stream-chat';
5
5
 
6
6
  import { Channel } from '../../..';
7
7
  import { ChannelsStateProvider } from '../../../../contexts/channelsStateContext/ChannelsStateContext';
8
+ import { OverlayProvider } from '../../../../contexts/overlayContext/OverlayProvider';
8
9
  import { getOrCreateChannelApi } from '../../../../mock-builders/api/getOrCreateChannel';
9
10
  import { useMockedApis } from '../../../../mock-builders/api/useMockedApis';
10
11
  import { generateChannelResponse } from '../../../../mock-builders/generator/channel';
@@ -54,13 +55,15 @@ describe('MessageStatus', () => {
54
55
  channelProps?: Partial<React.ComponentProps<typeof Channel>>,
55
56
  ) =>
56
57
  render(
57
- <ChannelsStateProvider>
58
- <Chat client={chatClient}>
59
- <Channel channel={channel} {...channelProps}>
60
- <MessageStatus {...options} />
61
- </Channel>
62
- </Chat>
63
- </ChannelsStateProvider>,
58
+ <OverlayProvider accessibility={{ enabled: true }}>
59
+ <ChannelsStateProvider>
60
+ <Chat client={chatClient}>
61
+ <Channel channel={channel} {...channelProps}>
62
+ <MessageStatus {...options} />
63
+ </Channel>
64
+ </Chat>
65
+ </ChannelsStateProvider>
66
+ </OverlayProvider>,
64
67
  );
65
68
 
66
69
  // NOTE: Original source had `it.each('string', async () => { ... })` which was a
@@ -168,7 +168,7 @@ describe('ReactionListBottom', () => {
168
168
  { reactionListPosition: 'bottom', reactionListType: 'segmented' },
169
169
  );
170
170
 
171
- const reactionListBottomItem = screen.getByLabelText('Reaction List Item');
171
+ const reactionListBottomItem = screen.getByTestId('reaction-list-item');
172
172
 
173
173
  fireEvent(reactionListBottomItem, 'onPress');
174
174