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

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 (220) hide show
  1. package/lib/commonjs/a11y/hooks/useAccessibilityServiceEnabled.js +43 -0
  2. package/lib/commonjs/a11y/hooks/useAccessibilityServiceEnabled.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/OverlayA11yShield.js +45 -0
  6. package/lib/commonjs/components/Accessibility/OverlayA11yShield.js.map +1 -0
  7. package/lib/commonjs/components/Attachment/Gallery.js +10 -0
  8. package/lib/commonjs/components/Attachment/Gallery.js.map +1 -1
  9. package/lib/commonjs/components/ChannelPreview/ChannelPreviewStatus.js +12 -3
  10. package/lib/commonjs/components/ChannelPreview/ChannelPreviewStatus.js.map +1 -1
  11. package/lib/commonjs/components/ImageGallery/ImageGallery.js +56 -1
  12. package/lib/commonjs/components/ImageGallery/ImageGallery.js.map +1 -1
  13. package/lib/commonjs/components/Message/MessageItemView/Headers/MessageReminderHeader.js +2 -0
  14. package/lib/commonjs/components/Message/MessageItemView/Headers/MessageReminderHeader.js.map +1 -1
  15. package/lib/commonjs/components/Message/MessageItemView/Headers/SentToChannelHeader.js +2 -0
  16. package/lib/commonjs/components/Message/MessageItemView/Headers/SentToChannelHeader.js.map +1 -1
  17. package/lib/commonjs/components/Message/MessageItemView/MessageContent.js +26 -5
  18. package/lib/commonjs/components/Message/MessageItemView/MessageContent.js.map +1 -1
  19. package/lib/commonjs/components/Message/MessageItemView/MessageReplies.js +7 -3
  20. package/lib/commonjs/components/Message/MessageItemView/MessageReplies.js.map +1 -1
  21. package/lib/commonjs/components/Message/MessageItemView/MessageRepliesAvatars.js +2 -0
  22. package/lib/commonjs/components/Message/MessageItemView/MessageRepliesAvatars.js.map +1 -1
  23. package/lib/commonjs/components/Message/MessageItemView/MessageTextContainer.js +16 -6
  24. package/lib/commonjs/components/Message/MessageItemView/MessageTextContainer.js.map +1 -1
  25. package/lib/commonjs/components/Message/MessageItemView/ReactionList/ReactionListItem.js +4 -0
  26. package/lib/commonjs/components/Message/MessageItemView/ReactionList/ReactionListItem.js.map +1 -1
  27. package/lib/commonjs/components/Message/hooks/useCreateMessageContext.js +6 -1
  28. package/lib/commonjs/components/Message/hooks/useCreateMessageContext.js.map +1 -1
  29. package/lib/commonjs/components/MessageList/InlineDateSeparator.js +8 -1
  30. package/lib/commonjs/components/MessageList/InlineDateSeparator.js.map +1 -1
  31. package/lib/commonjs/components/MessageMenu/ReactionButton.js +0 -7
  32. package/lib/commonjs/components/MessageMenu/ReactionButton.js.map +1 -1
  33. package/lib/commonjs/components/Poll/Poll.js +2 -0
  34. package/lib/commonjs/components/Poll/Poll.js.map +1 -1
  35. package/lib/commonjs/components/Poll/components/PollOption.js +6 -1
  36. package/lib/commonjs/components/Poll/components/PollOption.js.map +1 -1
  37. package/lib/commonjs/contexts/accessibilityContext/AccessibilityContext.js +6 -22
  38. package/lib/commonjs/contexts/accessibilityContext/AccessibilityContext.js.map +1 -1
  39. package/lib/commonjs/contexts/messageContext/MessageContext.js.map +1 -1
  40. package/lib/commonjs/contexts/overlayContext/MessageOverlayHostLayer.js +1 -0
  41. package/lib/commonjs/contexts/overlayContext/MessageOverlayHostLayer.js.map +1 -1
  42. package/lib/commonjs/contexts/overlayContext/OverlayProvider.js +4 -1
  43. package/lib/commonjs/contexts/overlayContext/OverlayProvider.js.map +1 -1
  44. package/lib/commonjs/i18n/ar.json +7 -1
  45. package/lib/commonjs/i18n/en.json +7 -1
  46. package/lib/commonjs/i18n/es.json +7 -1
  47. package/lib/commonjs/i18n/fr.json +7 -1
  48. package/lib/commonjs/i18n/he.json +7 -1
  49. package/lib/commonjs/i18n/hi.json +7 -1
  50. package/lib/commonjs/i18n/it.json +7 -1
  51. package/lib/commonjs/i18n/ja.json +7 -1
  52. package/lib/commonjs/i18n/ko.json +7 -1
  53. package/lib/commonjs/i18n/nl.json +7 -1
  54. package/lib/commonjs/i18n/pt-br.json +7 -1
  55. package/lib/commonjs/i18n/ru.json +7 -1
  56. package/lib/commonjs/i18n/tr.json +7 -1
  57. package/lib/commonjs/state-store/image-gallery-state-store.js +13 -0
  58. package/lib/commonjs/state-store/image-gallery-state-store.js.map +1 -1
  59. package/lib/commonjs/utils/i18n/getDateString.js +26 -1
  60. package/lib/commonjs/utils/i18n/getDateString.js.map +1 -1
  61. package/lib/commonjs/version.json +1 -1
  62. package/lib/module/a11y/hooks/useAccessibilityServiceEnabled.js +43 -0
  63. package/lib/module/a11y/hooks/useAccessibilityServiceEnabled.js.map +1 -0
  64. package/lib/module/a11y/index.js +11 -0
  65. package/lib/module/a11y/index.js.map +1 -1
  66. package/lib/module/components/Accessibility/OverlayA11yShield.js +45 -0
  67. package/lib/module/components/Accessibility/OverlayA11yShield.js.map +1 -0
  68. package/lib/module/components/Attachment/Gallery.js +10 -0
  69. package/lib/module/components/Attachment/Gallery.js.map +1 -1
  70. package/lib/module/components/ChannelPreview/ChannelPreviewStatus.js +12 -3
  71. package/lib/module/components/ChannelPreview/ChannelPreviewStatus.js.map +1 -1
  72. package/lib/module/components/ImageGallery/ImageGallery.js +56 -1
  73. package/lib/module/components/ImageGallery/ImageGallery.js.map +1 -1
  74. package/lib/module/components/Message/MessageItemView/Headers/MessageReminderHeader.js +2 -0
  75. package/lib/module/components/Message/MessageItemView/Headers/MessageReminderHeader.js.map +1 -1
  76. package/lib/module/components/Message/MessageItemView/Headers/SentToChannelHeader.js +2 -0
  77. package/lib/module/components/Message/MessageItemView/Headers/SentToChannelHeader.js.map +1 -1
  78. package/lib/module/components/Message/MessageItemView/MessageContent.js +26 -5
  79. package/lib/module/components/Message/MessageItemView/MessageContent.js.map +1 -1
  80. package/lib/module/components/Message/MessageItemView/MessageReplies.js +7 -3
  81. package/lib/module/components/Message/MessageItemView/MessageReplies.js.map +1 -1
  82. package/lib/module/components/Message/MessageItemView/MessageRepliesAvatars.js +2 -0
  83. package/lib/module/components/Message/MessageItemView/MessageRepliesAvatars.js.map +1 -1
  84. package/lib/module/components/Message/MessageItemView/MessageTextContainer.js +16 -6
  85. package/lib/module/components/Message/MessageItemView/MessageTextContainer.js.map +1 -1
  86. package/lib/module/components/Message/MessageItemView/ReactionList/ReactionListItem.js +4 -0
  87. package/lib/module/components/Message/MessageItemView/ReactionList/ReactionListItem.js.map +1 -1
  88. package/lib/module/components/Message/hooks/useCreateMessageContext.js +6 -1
  89. package/lib/module/components/Message/hooks/useCreateMessageContext.js.map +1 -1
  90. package/lib/module/components/MessageList/InlineDateSeparator.js +8 -1
  91. package/lib/module/components/MessageList/InlineDateSeparator.js.map +1 -1
  92. package/lib/module/components/MessageMenu/ReactionButton.js +0 -7
  93. package/lib/module/components/MessageMenu/ReactionButton.js.map +1 -1
  94. package/lib/module/components/Poll/Poll.js +2 -0
  95. package/lib/module/components/Poll/Poll.js.map +1 -1
  96. package/lib/module/components/Poll/components/PollOption.js +6 -1
  97. package/lib/module/components/Poll/components/PollOption.js.map +1 -1
  98. package/lib/module/contexts/accessibilityContext/AccessibilityContext.js +6 -22
  99. package/lib/module/contexts/accessibilityContext/AccessibilityContext.js.map +1 -1
  100. package/lib/module/contexts/messageContext/MessageContext.js.map +1 -1
  101. package/lib/module/contexts/overlayContext/MessageOverlayHostLayer.js +1 -0
  102. package/lib/module/contexts/overlayContext/MessageOverlayHostLayer.js.map +1 -1
  103. package/lib/module/contexts/overlayContext/OverlayProvider.js +4 -1
  104. package/lib/module/contexts/overlayContext/OverlayProvider.js.map +1 -1
  105. package/lib/module/i18n/ar.json +7 -1
  106. package/lib/module/i18n/en.json +7 -1
  107. package/lib/module/i18n/es.json +7 -1
  108. package/lib/module/i18n/fr.json +7 -1
  109. package/lib/module/i18n/he.json +7 -1
  110. package/lib/module/i18n/hi.json +7 -1
  111. package/lib/module/i18n/it.json +7 -1
  112. package/lib/module/i18n/ja.json +7 -1
  113. package/lib/module/i18n/ko.json +7 -1
  114. package/lib/module/i18n/nl.json +7 -1
  115. package/lib/module/i18n/pt-br.json +7 -1
  116. package/lib/module/i18n/ru.json +7 -1
  117. package/lib/module/i18n/tr.json +7 -1
  118. package/lib/module/state-store/image-gallery-state-store.js +13 -0
  119. package/lib/module/state-store/image-gallery-state-store.js.map +1 -1
  120. package/lib/module/utils/i18n/getDateString.js +26 -1
  121. package/lib/module/utils/i18n/getDateString.js.map +1 -1
  122. package/lib/module/version.json +1 -1
  123. package/lib/typescript/a11y/hooks/useAccessibilityServiceEnabled.d.ts +20 -0
  124. package/lib/typescript/a11y/hooks/useAccessibilityServiceEnabled.d.ts.map +1 -0
  125. package/lib/typescript/a11y/index.d.ts +1 -0
  126. package/lib/typescript/a11y/index.d.ts.map +1 -1
  127. package/lib/typescript/components/Accessibility/OverlayA11yShield.d.ts +20 -0
  128. package/lib/typescript/components/Accessibility/OverlayA11yShield.d.ts.map +1 -0
  129. package/lib/typescript/components/Attachment/Gallery.d.ts.map +1 -1
  130. package/lib/typescript/components/ChannelPreview/ChannelPreviewStatus.d.ts.map +1 -1
  131. package/lib/typescript/components/ImageGallery/ImageGallery.d.ts.map +1 -1
  132. package/lib/typescript/components/Message/MessageItemView/Headers/MessageReminderHeader.d.ts.map +1 -1
  133. package/lib/typescript/components/Message/MessageItemView/Headers/SentToChannelHeader.d.ts.map +1 -1
  134. package/lib/typescript/components/Message/MessageItemView/MessageContent.d.ts +1 -1
  135. package/lib/typescript/components/Message/MessageItemView/MessageContent.d.ts.map +1 -1
  136. package/lib/typescript/components/Message/MessageItemView/MessageReplies.d.ts.map +1 -1
  137. package/lib/typescript/components/Message/MessageItemView/MessageRepliesAvatars.d.ts.map +1 -1
  138. package/lib/typescript/components/Message/MessageItemView/MessageTextContainer.d.ts +1 -1
  139. package/lib/typescript/components/Message/MessageItemView/MessageTextContainer.d.ts.map +1 -1
  140. package/lib/typescript/components/Message/MessageItemView/ReactionList/ReactionListItem.d.ts.map +1 -1
  141. package/lib/typescript/components/Message/hooks/useCreateMessageContext.d.ts +1 -1
  142. package/lib/typescript/components/Message/hooks/useCreateMessageContext.d.ts.map +1 -1
  143. package/lib/typescript/components/MessageList/InlineDateSeparator.d.ts.map +1 -1
  144. package/lib/typescript/components/MessageMenu/ReactionButton.d.ts.map +1 -1
  145. package/lib/typescript/components/Poll/components/PollOption.d.ts.map +1 -1
  146. package/lib/typescript/contexts/accessibilityContext/AccessibilityContext.d.ts +32 -2
  147. package/lib/typescript/contexts/accessibilityContext/AccessibilityContext.d.ts.map +1 -1
  148. package/lib/typescript/contexts/messageContext/MessageContext.d.ts +8 -0
  149. package/lib/typescript/contexts/messageContext/MessageContext.d.ts.map +1 -1
  150. package/lib/typescript/contexts/overlayContext/MessageOverlayHostLayer.d.ts.map +1 -1
  151. package/lib/typescript/contexts/overlayContext/OverlayProvider.d.ts.map +1 -1
  152. package/lib/typescript/i18n/ar.json +7 -1
  153. package/lib/typescript/i18n/en.json +7 -1
  154. package/lib/typescript/i18n/es.json +7 -1
  155. package/lib/typescript/i18n/fr.json +7 -1
  156. package/lib/typescript/i18n/he.json +7 -1
  157. package/lib/typescript/i18n/hi.json +7 -1
  158. package/lib/typescript/i18n/it.json +7 -1
  159. package/lib/typescript/i18n/ja.json +7 -1
  160. package/lib/typescript/i18n/ko.json +7 -1
  161. package/lib/typescript/i18n/nl.json +7 -1
  162. package/lib/typescript/i18n/pt-br.json +7 -1
  163. package/lib/typescript/i18n/ru.json +7 -1
  164. package/lib/typescript/i18n/tr.json +7 -1
  165. package/lib/typescript/state-store/image-gallery-state-store.d.ts +5 -1
  166. package/lib/typescript/state-store/image-gallery-state-store.d.ts.map +1 -1
  167. package/lib/typescript/utils/i18n/Streami18n.d.ts +6 -0
  168. package/lib/typescript/utils/i18n/Streami18n.d.ts.map +1 -1
  169. package/lib/typescript/utils/i18n/getDateString.d.ts +28 -0
  170. package/lib/typescript/utils/i18n/getDateString.d.ts.map +1 -1
  171. package/package.json +1 -1
  172. package/src/a11y/hooks/useAccessibilityServiceEnabled.ts +66 -0
  173. package/src/a11y/index.ts +1 -0
  174. package/src/components/Accessibility/OverlayA11yShield.tsx +57 -0
  175. package/src/components/Accessibility/__tests__/OverlayA11yShield.test.tsx +118 -0
  176. package/src/components/Attachment/Gallery.tsx +14 -2
  177. package/src/components/Channel/__tests__/ownCapabilities.test.tsx +25 -2
  178. package/src/components/ChannelPreview/ChannelPreviewStatus.tsx +17 -3
  179. package/src/components/ImageGallery/ImageGallery.tsx +82 -4
  180. package/src/components/ImageGallery/__tests__/ImageGallery.test.tsx +13 -3
  181. package/src/components/ImageGallery/__tests__/ImageGalleryAdjustable.test.tsx +141 -0
  182. package/src/components/Message/MessageItemView/Headers/MessageReminderHeader.tsx +7 -1
  183. package/src/components/Message/MessageItemView/Headers/SentToChannelHeader.tsx +7 -1
  184. package/src/components/Message/MessageItemView/MessageContent.tsx +34 -15
  185. package/src/components/Message/MessageItemView/MessageReplies.tsx +9 -7
  186. package/src/components/Message/MessageItemView/MessageRepliesAvatars.tsx +5 -1
  187. package/src/components/Message/MessageItemView/MessageTextContainer.tsx +27 -4
  188. package/src/components/Message/MessageItemView/ReactionList/ReactionListItem.tsx +2 -0
  189. package/src/components/Message/MessageItemView/__tests__/Message.test.tsx +10 -3
  190. package/src/components/Message/MessageItemView/__tests__/MessageReplies.test.tsx +10 -2
  191. package/src/components/Message/hooks/useCreateMessageContext.ts +12 -1
  192. package/src/components/MessageInput/__tests__/__snapshots__/AttachButton.test.tsx.snap +3 -0
  193. package/src/components/MessageInput/__tests__/__snapshots__/SendButton.test.tsx.snap +2 -0
  194. package/src/components/MessageList/InlineDateSeparator.tsx +10 -3
  195. package/src/components/MessageMenu/ReactionButton.tsx +0 -7
  196. package/src/components/MessageMenu/__tests__/ReactionButton.test.tsx +1 -14
  197. package/src/components/Poll/Poll.tsx +1 -1
  198. package/src/components/Poll/components/PollOption.tsx +7 -1
  199. package/src/components/Thread/__tests__/__snapshots__/Thread.test.tsx.snap +1 -0
  200. package/src/contexts/accessibilityContext/AccessibilityContext.tsx +60 -36
  201. package/src/contexts/messageContext/MessageContext.tsx +8 -0
  202. package/src/contexts/overlayContext/MessageOverlayHostLayer.tsx +5 -1
  203. package/src/contexts/overlayContext/OverlayProvider.tsx +6 -1
  204. package/src/i18n/ar.json +7 -1
  205. package/src/i18n/en.json +7 -1
  206. package/src/i18n/es.json +7 -1
  207. package/src/i18n/fr.json +7 -1
  208. package/src/i18n/he.json +7 -1
  209. package/src/i18n/hi.json +7 -1
  210. package/src/i18n/it.json +7 -1
  211. package/src/i18n/ja.json +7 -1
  212. package/src/i18n/ko.json +7 -1
  213. package/src/i18n/nl.json +7 -1
  214. package/src/i18n/pt-br.json +7 -1
  215. package/src/i18n/ru.json +7 -1
  216. package/src/i18n/tr.json +7 -1
  217. package/src/state-store/__tests__/image-gallery-state-store.test.ts +1 -0
  218. package/src/state-store/image-gallery-state-store.ts +13 -1
  219. package/src/utils/i18n/getDateString.ts +57 -0
  220. package/src/version.json +1 -1
@@ -50,7 +50,7 @@ export const PollHeader = () => {
50
50
  } = useTheme();
51
51
 
52
52
  return (
53
- <View style={styles.headerContainer}>
53
+ <View accessible accessibilityRole='text' style={styles.headerContainer}>
54
54
  <Text style={[styles.headerTitle, header.title]}>{name}</Text>
55
55
  <Text style={[styles.headerSubtitle, header.subtitle]}>{subtitle}</Text>
56
56
  </View>
@@ -92,6 +92,7 @@ export const PollAllOptions = ({
92
92
 
93
93
  export const PollOption = ({ option, showProgressBar = true, forceIncoming }: PollOptionProps) => {
94
94
  const { latestVotesByOption, voteCountsByOption, voteCount } = usePollState();
95
+ const { t } = useTranslationContext();
95
96
  const styles = useStyles();
96
97
 
97
98
  const relevantVotes = useMemo(
@@ -141,7 +142,12 @@ export const PollOption = ({ option, showProgressBar = true, forceIncoming }: Po
141
142
  />
142
143
  ) : null}
143
144
 
144
- <Text style={[styles.votesText, votesText]}>{voteCountsByOption[option.id] || 0}</Text>
145
+ <Text
146
+ accessibilityLabel={t('{{count}} votes', { count: votes })}
147
+ style={[styles.votesText, votesText]}
148
+ >
149
+ {votes}
150
+ </Text>
145
151
  </View>
146
152
  </View>
147
153
  {showProgressBar ? (
@@ -1017,6 +1017,7 @@ exports[`Thread should match thread snapshot 1`] = `
1017
1017
  testID="date-separator"
1018
1018
  >
1019
1019
  <Text
1020
+ accessibilityLabel="May 5, 2020"
1020
1021
  style={
1021
1022
  {
1022
1023
  "color": "#414552",
@@ -8,6 +8,8 @@ import React, {
8
8
  } from 'react';
9
9
  import { AccessibilityInfo } from 'react-native';
10
10
 
11
+ import type { LocalMessage } from 'stream-chat';
12
+
11
13
  import { AccessibilityAnnouncerContext } from '../../components/Accessibility/useAccessibilityAnnouncer';
12
14
  import type {
13
15
  AccessibilityAnnounce,
@@ -24,6 +26,39 @@ type TimeoutByPriority = {
24
26
  /** Tri-state for gesture-alternative toggles. */
25
27
  export type A11yMode = 'auto' | 'always' | 'never';
26
28
 
29
+ /**
30
+ * Resolved predicate stored on the context - consumers call `(message)` and
31
+ * receive the boolean directly.
32
+ */
33
+ export type HasInteractiveAccessibilityContent = (message: LocalMessage) => boolean;
34
+
35
+ /**
36
+ * Integrator facing override shape. Receives the SDK's baseline boolean as the
37
+ * second argument so overrides can extend rather than replace:
38
+ *
39
+ * ```
40
+ * hasInteractiveAccessibilityContent: (message, defaultValue) =>
41
+ * defaultValue || !!message.my_custom_field
42
+ * ```
43
+ *
44
+ * To replace fully, ignore the second argument. Must be stable across renders
45
+ * an unstable function will rerender every Message context consumer on every
46
+ * downstream render.
47
+ */
48
+ export type HasInteractiveAccessibilityContentConfig = (
49
+ message: LocalMessage,
50
+ defaultValue: boolean,
51
+ ) => boolean;
52
+
53
+ /** SDK baseline — true when the message renders interactive children. */
54
+ const defaultHasInteractiveAccessibilityContent: HasInteractiveAccessibilityContent = (message) =>
55
+ !!(
56
+ message.poll_id ||
57
+ message.quoted_message ||
58
+ message.attachments?.length ||
59
+ message.shared_location
60
+ );
61
+
27
62
  export type AccessibilityConfig = {
28
63
  /**
29
64
  * Master toggle. Default FALSE — integrators must opt in. When false, the SDK
@@ -45,10 +80,22 @@ export type AccessibilityConfig = {
45
80
  imageGalleryScreenReaderMode?: A11yMode;
46
81
  /** Message actions trigger. 'long-press' (no alt button), 'auto' (default — show button when SR is on), 'always-button'. */
47
82
  messageActionsTrigger?: 'long-press' | 'auto' | 'always-button';
83
+ /**
84
+ * Override the SDK's "this message has interactive children" decision.
85
+ * Will control what it means for a message to have interactive content.
86
+ * This affects the way we mark the message bubble as accessible and whether
87
+ * we let the children handle it on their own or whether we want the bubble to
88
+ * handle everything. See {@link HasInteractiveAccessibilityContentConfig}.
89
+ */
90
+ hasInteractiveAccessibilityContent?: HasInteractiveAccessibilityContentConfig;
48
91
  };
49
92
 
50
93
  /** Fully-resolved config — every field is populated with its default. */
51
- export type ResolvedAccessibilityConfig = Required<AccessibilityConfig>;
94
+ export type ResolvedAccessibilityConfig = Required<
95
+ Omit<AccessibilityConfig, 'hasInteractiveAccessibilityContent'>
96
+ > & {
97
+ hasInteractiveAccessibilityContent: HasInteractiveAccessibilityContent;
98
+ };
52
99
 
53
100
  export const accessibilityContextDefaultValue: ResolvedAccessibilityConfig = {
54
101
  announceConnectionState: true,
@@ -57,6 +104,7 @@ export const accessibilityContextDefaultValue: ResolvedAccessibilityConfig = {
57
104
  audioRecorderTapMode: 'auto',
58
105
  enabled: false,
59
106
  forceScreenReaderMode: false,
107
+ hasInteractiveAccessibilityContent: defaultHasInteractiveAccessibilityContent,
60
108
  imageGalleryScreenReaderMode: 'auto',
61
109
  messageActionsTrigger: 'auto',
62
110
  };
@@ -124,6 +172,7 @@ export const AccessibilityProvider = ({
124
172
  audioRecorderTapMode = accessibilityContextDefaultValue.audioRecorderTapMode,
125
173
  enabled = accessibilityContextDefaultValue.enabled,
126
174
  forceScreenReaderMode = accessibilityContextDefaultValue.forceScreenReaderMode,
175
+ hasInteractiveAccessibilityContent,
127
176
  imageGalleryScreenReaderMode = accessibilityContextDefaultValue.imageGalleryScreenReaderMode,
128
177
  messageActionsTrigger = accessibilityContextDefaultValue.messageActionsTrigger,
129
178
  } = value ?? {};
@@ -136,6 +185,13 @@ export const AccessibilityProvider = ({
136
185
  audioRecorderTapMode,
137
186
  enabled,
138
187
  forceScreenReaderMode,
188
+ hasInteractiveAccessibilityContent: hasInteractiveAccessibilityContent
189
+ ? (message) =>
190
+ hasInteractiveAccessibilityContent(
191
+ message,
192
+ accessibilityContextDefaultValue.hasInteractiveAccessibilityContent(message),
193
+ )
194
+ : accessibilityContextDefaultValue.hasInteractiveAccessibilityContent,
139
195
  imageGalleryScreenReaderMode,
140
196
  messageActionsTrigger,
141
197
  }),
@@ -146,6 +202,7 @@ export const AccessibilityProvider = ({
146
202
  audioRecorderTapMode,
147
203
  enabled,
148
204
  forceScreenReaderMode,
205
+ hasInteractiveAccessibilityContent,
149
206
  imageGalleryScreenReaderMode,
150
207
  messageActionsTrigger,
151
208
  ],
@@ -162,38 +219,5 @@ export const AccessibilityProvider = ({
162
219
  );
163
220
  };
164
221
 
165
- export const useAccessibilityContext = (): ResolvedAccessibilityConfig => {
166
- const {
167
- announceConnectionState,
168
- announceNewMessages,
169
- announceTypingIndicator,
170
- audioRecorderTapMode,
171
- enabled,
172
- forceScreenReaderMode,
173
- imageGalleryScreenReaderMode,
174
- messageActionsTrigger,
175
- } = useContext(AccessibilityContext);
176
-
177
- return useMemo(
178
- () => ({
179
- announceConnectionState,
180
- announceNewMessages,
181
- announceTypingIndicator,
182
- audioRecorderTapMode,
183
- enabled,
184
- forceScreenReaderMode,
185
- imageGalleryScreenReaderMode,
186
- messageActionsTrigger,
187
- }),
188
- [
189
- announceConnectionState,
190
- announceNewMessages,
191
- announceTypingIndicator,
192
- audioRecorderTapMode,
193
- enabled,
194
- forceScreenReaderMode,
195
- imageGalleryScreenReaderMode,
196
- messageActionsTrigger,
197
- ],
198
- );
199
- };
222
+ export const useAccessibilityContext = (): ResolvedAccessibilityConfig =>
223
+ useContext(AccessibilityContext);
@@ -45,6 +45,14 @@ export type MessageContextValue = {
45
45
  /** Whether or not any message attachment exposes actions. */
46
46
  hasAttachmentActions: boolean;
47
47
  handleToggleReaction: (reactionType: string) => Promise<void>;
48
+ /**
49
+ * Whether the message renders interactive children (poll options, attachment
50
+ * cells, the quoted-reply navigator, shared location) and the row should
51
+ * therefore drop its single focusstop so VO/TalkBack can drill into them.
52
+ * Resolved from `AccessibilityContext.hasInteractiveAccessibilityContent` -
53
+ * integrators override there to include their own custom content.
54
+ */
55
+ hasInteractiveAccessibilityContent: boolean;
48
56
  /** Whether or not message has reactions */
49
57
  hasReactions: boolean;
50
58
  /** Whether or not message has only a single attachment */
@@ -269,7 +269,11 @@ export const MessageOverlayHostLayer = () => {
269
269
 
270
270
  return (
271
271
  <GestureDetector gesture={tap}>
272
- <View pointerEvents='box-none' style={StyleSheet.absoluteFill}>
272
+ <View
273
+ accessibilityViewIsModal={isActive}
274
+ pointerEvents='box-none'
275
+ style={StyleSheet.absoluteFill}
276
+ >
273
277
  {isActive ? (
274
278
  <Animated.View pointerEvents='none' style={[StyleSheet.absoluteFill, backdropStyle]}>
275
279
  <OverlayBackground />
@@ -9,6 +9,7 @@ import { PortalProvider } from 'react-native-teleport';
9
9
  import { MessageOverlayHostLayer } from './MessageOverlayHostLayer';
10
10
  import { OverlayContext, OverlayProviderProps } from './OverlayContext';
11
11
 
12
+ import { OverlayA11yShield } from '../../components/Accessibility/OverlayA11yShield';
12
13
  import { ImageGallery } from '../../components/ImageGallery/ImageGallery';
13
14
  import { useStreami18n } from '../../hooks/useStreami18n';
14
15
 
@@ -107,7 +108,11 @@ export const OverlayProvider = (props: PropsWithChildren<OverlayProviderProps>)
107
108
  <ImageGalleryProvider value={imageGalleryProviderProps}>
108
109
  <ThemeProvider style={overlayContext.style}>
109
110
  <PortalProvider>
110
- {children}
111
+ {accessibility?.enabled ? (
112
+ <OverlayA11yShield>{children}</OverlayA11yShield>
113
+ ) : (
114
+ children
115
+ )}
111
116
  {overlay === 'gallery' && <ImageGallery overlayOpacity={overlayOpacity} />}
112
117
  <MessageOverlayHostLayer />
113
118
  </PortalProvider>
package/src/i18n/ar.json CHANGED
@@ -260,6 +260,7 @@
260
260
  "a11y/Direct chat with {{name}}": "محادثة مباشرة مع {{name}}",
261
261
  "a11y/Double tap to open": "انقر مرتين للفتح",
262
262
  "a11y/Double tap to view reactions": "انقر مرتين لعرض التفاعلات",
263
+ "a11y/Double tap to view thread": "انقر مرتين لعرض المحادثة الفرعية",
263
264
  "a11y/Editing message": "تعديل الرسالة",
264
265
  "a11y/Editing message: {{text}}": "تعديل الرسالة: {{text}}",
265
266
  "a11y/Last message {{date}}": "آخر رسالة {{date}}",
@@ -371,5 +372,10 @@
371
372
  "a11y/Swipe right to go through different actions": "اسحب لليمين للتنقل بين الإجراءات المختلفة",
372
373
  "a11y/Close": "Close",
373
374
  "a11y/Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.": "Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.",
374
- "a11y/{{count}} unread messages": "{{count}} رسائل غير مقروءة"
375
+ "a11y/{{count}} unread messages": "{{count}} رسائل غير مقروءة",
376
+ "a11y/Message from you": "رسالة منك",
377
+ "a11y/Message from {{sender}}": "رسالة من {{sender}}",
378
+ "a11y/Gallery Image": "صورة من المعرض",
379
+ "a11y/Gallery Video": "فيديو من المعرض",
380
+ "a11y/{{position}} of {{count}}": "{{position}} من {{count}}"
375
381
  }
package/src/i18n/en.json CHANGED
@@ -260,12 +260,15 @@
260
260
  "a11y/Direct chat with {{name}}": "Direct chat with {{name}}",
261
261
  "a11y/Double tap to open": "Double tap to open",
262
262
  "a11y/Double tap to view reactions": "Double tap to view reactions",
263
+ "a11y/Double tap to view thread": "Double tap to view thread",
263
264
  "a11y/Editing message": "Editing message",
264
265
  "a11y/Editing message: {{text}}": "Editing message: {{text}}",
265
266
  "a11y/Last message {{date}}": "Last message {{date}}",
266
267
  "a11y/Loading": "Loading",
267
268
  "a11y/Loading failed": "Loading failed",
268
269
  "a11y/Message actions": "Message actions",
270
+ "a11y/Message from you": "Message from you",
271
+ "a11y/Message from {{sender}}": "Message from {{sender}}",
269
272
  "a11y/Muted": "Muted",
270
273
  "a11y/New message from {{user}}": "New message from {{user}}",
271
274
  "a11y/Offline": "Offline",
@@ -371,5 +374,8 @@
371
374
  "size limit": "size limit",
372
375
  "unknown error": "unknown error",
373
376
  "unsupported file type": "unsupported file type",
374
- "a11y/{{count}} unread messages": "{{count}} unread messages"
377
+ "a11y/{{count}} unread messages": "{{count}} unread messages",
378
+ "a11y/Gallery Image": "Gallery image",
379
+ "a11y/Gallery Video": "Gallery video",
380
+ "a11y/{{position}} of {{count}}": "{{position}} of {{count}}"
375
381
  }
package/src/i18n/es.json CHANGED
@@ -260,6 +260,7 @@
260
260
  "a11y/Direct chat with {{name}}": "Chat directo con {{name}}",
261
261
  "a11y/Double tap to open": "Toca dos veces para abrir",
262
262
  "a11y/Double tap to view reactions": "Toca dos veces para ver las reacciones",
263
+ "a11y/Double tap to view thread": "Toca dos veces para ver el hilo",
263
264
  "a11y/Editing message": "Editando mensaje",
264
265
  "a11y/Editing message: {{text}}": "Editando mensaje: {{text}}",
265
266
  "a11y/Last message {{date}}": "Último mensaje {{date}}",
@@ -371,5 +372,10 @@
371
372
  "a11y/Swipe right to go through different actions": "Desliza a la derecha para recorrer las diferentes acciones",
372
373
  "a11y/Close": "Close",
373
374
  "a11y/Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.": "Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.",
374
- "a11y/{{count}} unread messages": "{{count}} mensajes sin leer"
375
+ "a11y/{{count}} unread messages": "{{count}} mensajes sin leer",
376
+ "a11y/Message from you": "Mensaje tuyo",
377
+ "a11y/Message from {{sender}}": "Mensaje de {{sender}}",
378
+ "a11y/Gallery Image": "Imagen de la galería",
379
+ "a11y/Gallery Video": "Vídeo de la galería",
380
+ "a11y/{{position}} of {{count}}": "{{position}} de {{count}}"
375
381
  }
package/src/i18n/fr.json CHANGED
@@ -260,6 +260,7 @@
260
260
  "a11y/Direct chat with {{name}}": "Discussion directe avec {{name}}",
261
261
  "a11y/Double tap to open": "Appuyez deux fois pour ouvrir",
262
262
  "a11y/Double tap to view reactions": "Appuyez deux fois pour voir les réactions",
263
+ "a11y/Double tap to view thread": "Appuyez deux fois pour voir le fil",
263
264
  "a11y/Editing message": "Modification du message",
264
265
  "a11y/Editing message: {{text}}": "Modification du message : {{text}}",
265
266
  "a11y/Last message {{date}}": "Dernier message {{date}}",
@@ -371,5 +372,10 @@
371
372
  "a11y/Swipe right to go through different actions": "Glissez vers la droite pour parcourir les différentes actions",
372
373
  "a11y/Close": "Close",
373
374
  "a11y/Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.": "Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.",
374
- "a11y/{{count}} unread messages": "{{count}} messages non lus"
375
+ "a11y/{{count}} unread messages": "{{count}} messages non lus",
376
+ "a11y/Message from you": "Votre message",
377
+ "a11y/Message from {{sender}}": "Message de {{sender}}",
378
+ "a11y/Gallery Image": "Image de la galerie",
379
+ "a11y/Gallery Video": "Vidéo de la galerie",
380
+ "a11y/{{position}} of {{count}}": "{{position}} sur {{count}}"
375
381
  }
package/src/i18n/he.json CHANGED
@@ -260,6 +260,7 @@
260
260
  "a11y/Direct chat with {{name}}": "צ׳אט ישיר עם {{name}}",
261
261
  "a11y/Double tap to open": "הקש פעמיים כדי לפתוח",
262
262
  "a11y/Double tap to view reactions": "הקש פעמיים כדי לראות תגובות",
263
+ "a11y/Double tap to view thread": "הקש פעמיים כדי לראות את השרשור",
263
264
  "a11y/Editing message": "עריכת הודעה",
264
265
  "a11y/Editing message: {{text}}": "עריכת הודעה: {{text}}",
265
266
  "a11y/Last message {{date}}": "הודעה אחרונה {{date}}",
@@ -371,5 +372,10 @@
371
372
  "a11y/Swipe right to go through different actions": "החלק ימינה כדי לעבור בין הפעולות השונות",
372
373
  "a11y/Close": "Close",
373
374
  "a11y/Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.": "Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.",
374
- "a11y/{{count}} unread messages": "{{count}} הודעות שלא נקראו"
375
+ "a11y/{{count}} unread messages": "{{count}} הודעות שלא נקראו",
376
+ "a11y/Message from you": "הודעה ממך",
377
+ "a11y/Message from {{sender}}": "הודעה מאת {{sender}}",
378
+ "a11y/Gallery Image": "תמונה מהגלריה",
379
+ "a11y/Gallery Video": "סרטון מהגלריה",
380
+ "a11y/{{position}} of {{count}}": "{{position}} מתוך {{count}}"
375
381
  }
package/src/i18n/hi.json CHANGED
@@ -260,6 +260,7 @@
260
260
  "a11y/Direct chat with {{name}}": "{{name}} के साथ सीधी चैट",
261
261
  "a11y/Double tap to open": "खोलने के लिए दो बार टैप करें",
262
262
  "a11y/Double tap to view reactions": "प्रतिक्रियाएँ देखने के लिए दो बार टैप करें",
263
+ "a11y/Double tap to view thread": "थ्रेड देखने के लिए दो बार टैप करें",
263
264
  "a11y/Editing message": "संदेश संपादित कर रहे हैं",
264
265
  "a11y/Editing message: {{text}}": "संदेश संपादित कर रहे हैं: {{text}}",
265
266
  "a11y/Last message {{date}}": "अंतिम संदेश {{date}}",
@@ -371,5 +372,10 @@
371
372
  "a11y/Swipe right to go through different actions": "विभिन्न क्रियाओं के बीच जाने के लिए दाएं स्वाइप करें",
372
373
  "a11y/Close": "Close",
373
374
  "a11y/Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.": "Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.",
374
- "a11y/{{count}} unread messages": "{{count}} अपठित संदेश"
375
+ "a11y/{{count}} unread messages": "{{count}} अपठित संदेश",
376
+ "a11y/Message from you": "आपका संदेश",
377
+ "a11y/Message from {{sender}}": "{{sender}} से संदेश",
378
+ "a11y/Gallery Image": "गैलरी छवि",
379
+ "a11y/Gallery Video": "गैलरी वीडियो",
380
+ "a11y/{{position}} of {{count}}": "{{count}} में से {{position}}"
375
381
  }
package/src/i18n/it.json CHANGED
@@ -260,6 +260,7 @@
260
260
  "a11y/Direct chat with {{name}}": "Chat diretta con {{name}}",
261
261
  "a11y/Double tap to open": "Tocca due volte per aprire",
262
262
  "a11y/Double tap to view reactions": "Tocca due volte per vedere le reazioni",
263
+ "a11y/Double tap to view thread": "Tocca due volte per vedere il thread",
263
264
  "a11y/Editing message": "Modifica del messaggio",
264
265
  "a11y/Editing message: {{text}}": "Modifica del messaggio: {{text}}",
265
266
  "a11y/Last message {{date}}": "Ultimo messaggio {{date}}",
@@ -371,5 +372,10 @@
371
372
  "a11y/Swipe right to go through different actions": "Scorri a destra per passare in rassegna le diverse azioni",
372
373
  "a11y/Close": "Close",
373
374
  "a11y/Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.": "Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.",
374
- "a11y/{{count}} unread messages": "{{count}} messaggi non letti"
375
+ "a11y/{{count}} unread messages": "{{count}} messaggi non letti",
376
+ "a11y/Message from you": "Messaggio da te",
377
+ "a11y/Message from {{sender}}": "Messaggio da {{sender}}",
378
+ "a11y/Gallery Image": "Immagine della galleria",
379
+ "a11y/Gallery Video": "Video della galleria",
380
+ "a11y/{{position}} of {{count}}": "{{position}} di {{count}}"
375
381
  }
package/src/i18n/ja.json CHANGED
@@ -260,6 +260,7 @@
260
260
  "a11y/Direct chat with {{name}}": "{{name}}とのダイレクトチャット",
261
261
  "a11y/Double tap to open": "ダブルタップで開く",
262
262
  "a11y/Double tap to view reactions": "ダブルタップでリアクションを表示",
263
+ "a11y/Double tap to view thread": "ダブルタップでスレッドを表示",
263
264
  "a11y/Editing message": "メッセージを編集中",
264
265
  "a11y/Editing message: {{text}}": "メッセージを編集中: {{text}}",
265
266
  "a11y/Last message {{date}}": "最後のメッセージ {{date}}",
@@ -371,5 +372,10 @@
371
372
  "a11y/Swipe right to go through different actions": "右にスワイプして異なるアクションを切り替えます",
372
373
  "a11y/Close": "Close",
373
374
  "a11y/Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.": "Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.",
374
- "a11y/{{count}} unread messages": "未読メッセージ{{count}}件"
375
+ "a11y/{{count}} unread messages": "未読メッセージ{{count}}件",
376
+ "a11y/Message from you": "あなたからのメッセージ",
377
+ "a11y/Message from {{sender}}": "{{sender}}からのメッセージ",
378
+ "a11y/Gallery Image": "ギャラリー画像",
379
+ "a11y/Gallery Video": "ギャラリービデオ",
380
+ "a11y/{{position}} of {{count}}": "{{count}} 中 {{position}}"
375
381
  }
package/src/i18n/ko.json CHANGED
@@ -260,6 +260,7 @@
260
260
  "a11y/Direct chat with {{name}}": "{{name}}님과의 다이렉트 채팅",
261
261
  "a11y/Double tap to open": "두 번 탭하여 열기",
262
262
  "a11y/Double tap to view reactions": "두 번 탭하여 반응 보기",
263
+ "a11y/Double tap to view thread": "두 번 탭하여 스레드 보기",
263
264
  "a11y/Editing message": "메시지 편집 중",
264
265
  "a11y/Editing message: {{text}}": "메시지 편집 중: {{text}}",
265
266
  "a11y/Last message {{date}}": "마지막 메시지 {{date}}",
@@ -371,5 +372,10 @@
371
372
  "a11y/Swipe right to go through different actions": "다른 작업을 탐색하려면 오른쪽으로 스와이프하세요",
372
373
  "a11y/Close": "Close",
373
374
  "a11y/Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.": "Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.",
374
- "a11y/{{count}} unread messages": "읽지 않은 메시지 {{count}}개"
375
+ "a11y/{{count}} unread messages": "읽지 않은 메시지 {{count}}개",
376
+ "a11y/Message from you": "내가 보낸 메시지",
377
+ "a11y/Message from {{sender}}": "{{sender}}님의 메시지",
378
+ "a11y/Gallery Image": "갤러리 이미지",
379
+ "a11y/Gallery Video": "갤러리 동영상",
380
+ "a11y/{{position}} of {{count}}": "{{count}}개 중 {{position}}번째"
375
381
  }
package/src/i18n/nl.json CHANGED
@@ -260,6 +260,7 @@
260
260
  "a11y/Direct chat with {{name}}": "Direct chat met {{name}}",
261
261
  "a11y/Double tap to open": "Dubbeltik om te openen",
262
262
  "a11y/Double tap to view reactions": "Dubbeltik om reacties te bekijken",
263
+ "a11y/Double tap to view thread": "Dubbeltik om de thread te bekijken",
263
264
  "a11y/Editing message": "Bericht bewerken",
264
265
  "a11y/Editing message: {{text}}": "Bericht bewerken: {{text}}",
265
266
  "a11y/Last message {{date}}": "Laatste bericht {{date}}",
@@ -371,5 +372,10 @@
371
372
  "a11y/Swipe right to go through different actions": "Veeg naar rechts om door verschillende acties te bladeren",
372
373
  "a11y/Close": "Close",
373
374
  "a11y/Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.": "Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.",
374
- "a11y/{{count}} unread messages": "{{count}} ongelezen berichten"
375
+ "a11y/{{count}} unread messages": "{{count}} ongelezen berichten",
376
+ "a11y/Message from you": "Bericht van jou",
377
+ "a11y/Message from {{sender}}": "Bericht van {{sender}}",
378
+ "a11y/Gallery Image": "Galerij-afbeelding",
379
+ "a11y/Gallery Video": "Galerij-video",
380
+ "a11y/{{position}} of {{count}}": "{{position}} van {{count}}"
375
381
  }
@@ -260,6 +260,7 @@
260
260
  "a11y/Direct chat with {{name}}": "Chat direto com {{name}}",
261
261
  "a11y/Double tap to open": "Toque duas vezes para abrir",
262
262
  "a11y/Double tap to view reactions": "Toque duas vezes para ver as reações",
263
+ "a11y/Double tap to view thread": "Toque duas vezes para ver o tópico",
263
264
  "a11y/Editing message": "Editando mensagem",
264
265
  "a11y/Editing message: {{text}}": "Editando mensagem: {{text}}",
265
266
  "a11y/Last message {{date}}": "Última mensagem {{date}}",
@@ -371,5 +372,10 @@
371
372
  "a11y/Swipe right to go through different actions": "Deslize para a direita para percorrer as diferentes ações",
372
373
  "a11y/Close": "Close",
373
374
  "a11y/Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.": "Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.",
374
- "a11y/{{count}} unread messages": "{{count}} mensagens não lidas"
375
+ "a11y/{{count}} unread messages": "{{count}} mensagens não lidas",
376
+ "a11y/Message from you": "Mensagem sua",
377
+ "a11y/Message from {{sender}}": "Mensagem de {{sender}}",
378
+ "a11y/Gallery Image": "Imagem da galeria",
379
+ "a11y/Gallery Video": "Vídeo da galeria",
380
+ "a11y/{{position}} of {{count}}": "{{position}} de {{count}}"
375
381
  }
package/src/i18n/ru.json CHANGED
@@ -260,6 +260,7 @@
260
260
  "a11y/Direct chat with {{name}}": "Прямой чат с {{name}}",
261
261
  "a11y/Double tap to open": "Дважды коснитесь, чтобы открыть",
262
262
  "a11y/Double tap to view reactions": "Дважды коснитесь, чтобы посмотреть реакции",
263
+ "a11y/Double tap to view thread": "Дважды коснитесь, чтобы посмотреть тред",
263
264
  "a11y/Editing message": "Редактирование сообщения",
264
265
  "a11y/Editing message: {{text}}": "Редактирование сообщения: {{text}}",
265
266
  "a11y/Last message {{date}}": "Последнее сообщение {{date}}",
@@ -371,5 +372,10 @@
371
372
  "a11y/Swipe right to go through different actions": "Смахните вправо, чтобы переключаться между действиями",
372
373
  "a11y/Close": "Close",
373
374
  "a11y/Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.": "Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.",
374
- "a11y/{{count}} unread messages": "{{count}} непрочитанных сообщений"
375
+ "a11y/{{count}} unread messages": "{{count}} непрочитанных сообщений",
376
+ "a11y/Message from you": "Сообщение от вас",
377
+ "a11y/Message from {{sender}}": "Сообщение от {{sender}}",
378
+ "a11y/Gallery Image": "Изображение из галереи",
379
+ "a11y/Gallery Video": "Видео из галереи",
380
+ "a11y/{{position}} of {{count}}": "{{position}} из {{count}}"
375
381
  }
package/src/i18n/tr.json CHANGED
@@ -260,6 +260,7 @@
260
260
  "a11y/Direct chat with {{name}}": "{{name}} ile doğrudan sohbet",
261
261
  "a11y/Double tap to open": "Açmak için iki kez dokun",
262
262
  "a11y/Double tap to view reactions": "Tepkileri görmek için iki kez dokun",
263
+ "a11y/Double tap to view thread": "Konuyu görmek için iki kez dokun",
263
264
  "a11y/Editing message": "Mesaj düzenleniyor",
264
265
  "a11y/Editing message: {{text}}": "Mesaj düzenleniyor: {{text}}",
265
266
  "a11y/Last message {{date}}": "Son mesaj {{date}}",
@@ -371,5 +372,10 @@
371
372
  "a11y/Swipe right to go through different actions": "Farklı eylemler arasında geçiş yapmak için sağa kaydır",
372
373
  "a11y/Close": "Close",
373
374
  "a11y/Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.": "Bottom sheet opened. Activate the close action or use the escape gesture to dismiss.",
374
- "a11y/{{count}} unread messages": "{{count}} okunmamış mesaj"
375
+ "a11y/{{count}} unread messages": "{{count}} okunmamış mesaj",
376
+ "a11y/Message from you": "Senden mesaj",
377
+ "a11y/Message from {{sender}}": "{{sender}} kullanıcısından mesaj",
378
+ "a11y/Gallery Image": "Galeri görüntüsü",
379
+ "a11y/Gallery Video": "Galeri videosu",
380
+ "a11y/{{position}} of {{count}}": "{{count}} öğeden {{position}}"
375
381
  }
@@ -88,6 +88,7 @@ describe('ImageGalleryStateStore', () => {
88
88
  assets: [],
89
89
  currentIndex: 0,
90
90
  messages: [],
91
+ requesterNode: null,
91
92
  selectedAttachmentUrl: undefined,
92
93
  });
93
94
  });
@@ -41,12 +41,14 @@ export type ImageGalleryState = {
41
41
  messages: LocalMessage[];
42
42
  selectedAttachmentUrl?: string;
43
43
  currentIndex: number;
44
+ requesterNode: number | null;
44
45
  };
45
46
 
46
47
  const INITIAL_STATE: ImageGalleryState = {
47
48
  assets: [],
48
49
  currentIndex: 0,
49
50
  messages: [],
51
+ requesterNode: null,
50
52
  selectedAttachmentUrl: undefined,
51
53
  };
52
54
 
@@ -80,6 +82,10 @@ export class ImageGalleryStateStore {
80
82
  return this.state.getLatestValue().selectedAttachmentUrl;
81
83
  }
82
84
 
85
+ get requesterNode() {
86
+ return this.state.getLatestValue().requesterNode;
87
+ }
88
+
83
89
  get attachmentsWithMessage() {
84
90
  const messages = this.messages;
85
91
 
@@ -151,6 +157,10 @@ export class ImageGalleryStateStore {
151
157
  this.state.partialNext({ currentIndex });
152
158
  }
153
159
 
160
+ set requesterNode(requesterNode: number | null) {
161
+ this.state.partialNext({ requesterNode });
162
+ }
163
+
154
164
  // APIs for managing messages
155
165
  appendMessages = (messages: LocalMessage[]) => {
156
166
  this.state.partialNext({ messages: [...this.messages, ...messages] });
@@ -164,12 +174,14 @@ export class ImageGalleryStateStore {
164
174
 
165
175
  openImageGallery = ({
166
176
  messages,
177
+ requesterNode = null,
167
178
  selectedAttachmentUrl,
168
179
  }: {
169
180
  messages: LocalMessage[];
181
+ requesterNode?: number | null;
170
182
  selectedAttachmentUrl?: string;
171
183
  }) => {
172
- this.state.partialNext({ messages, selectedAttachmentUrl });
184
+ this.state.partialNext({ messages, requesterNode, selectedAttachmentUrl });
173
185
  };
174
186
 
175
187
  subscribeToMessages = () => {
@@ -1,3 +1,6 @@
1
+ import type { TranslationLanguages } from 'stream-chat';
2
+
3
+ import { calendarFormats } from './calendarFormats';
1
4
  import { TimestampFormatterOptions } from './types';
2
5
 
3
6
  import { TranslatorFunctions } from '../../contexts/translationContext';
@@ -74,3 +77,57 @@ export function getDateString({
74
77
 
75
78
  return new Date(date).toDateString();
76
79
  }
80
+
81
+ type DateStringForA11yOptions = {
82
+ /**
83
+ * Optional calendar-format overrides applied on top of the locale defaults
84
+ * and the SDK's `sameElse: 'LL'` substitution. Use this when the visible
85
+ * date format diverges from the locale defaults (e.g. ChannelPreviewStatus
86
+ * uses `sameDay: 'LT'` to show the time instead of "Today").
87
+ */
88
+ calendarFormatOverrides?: Partial<{
89
+ lastDay: string;
90
+ lastWeek: string;
91
+ nextDay: string;
92
+ nextWeek: string;
93
+ sameDay: string;
94
+ sameElse: string;
95
+ }>;
96
+ date?: string | Date;
97
+ tDateTimeParser?: TranslatorFunctions['tDateTimeParser'];
98
+ userLanguage?: TranslationLanguages;
99
+ };
100
+
101
+ /**
102
+ * Produce a TTS-friendly calendar string. iOS VoiceOver reads numeric dates
103
+ * like "04/08/2026" character-by-character; substituting `LL` ("April 8, 2026")
104
+ * for the calendar `sameElse` slot fixes that. The relative slots
105
+ * (sameDay/lastDay/nextDay/lastWeek/nextWeek) are preserved from the locale,
106
+ * so "Today"/"Yesterday"/weekday names still come through.
107
+ */
108
+ export const getDateStringForA11y = ({
109
+ calendarFormatOverrides,
110
+ date,
111
+ tDateTimeParser,
112
+ userLanguage,
113
+ }: DateStringForA11yOptions): string | undefined => {
114
+ if (!date || (typeof date === 'string' && !Date.parse(date))) {
115
+ return undefined;
116
+ }
117
+ if (!tDateTimeParser) {
118
+ return undefined;
119
+ }
120
+
121
+ const parsedTime = tDateTimeParser(date);
122
+ if (!isDayOrMoment(parsedTime) || !parsedTime.calendar) {
123
+ return undefined;
124
+ }
125
+
126
+ const localeFormats = (userLanguage && calendarFormats[userLanguage]) || calendarFormats.en;
127
+
128
+ return parsedTime.calendar(undefined, {
129
+ ...localeFormats,
130
+ sameElse: 'LL',
131
+ ...calendarFormatOverrides,
132
+ });
133
+ };