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.
- package/lib/commonjs/a11y/hooks/useAnnounceOnShow.js +27 -0
- package/lib/commonjs/a11y/hooks/useAnnounceOnShow.js.map +1 -0
- package/lib/commonjs/a11y/index.js +11 -0
- package/lib/commonjs/a11y/index.js.map +1 -1
- package/lib/commonjs/components/Accessibility/CompositeAccessibilityProbe.js +29 -0
- package/lib/commonjs/components/Accessibility/CompositeAccessibilityProbe.js.map +1 -0
- package/lib/commonjs/components/Accessibility/HiddenA11yText.js +30 -0
- package/lib/commonjs/components/Accessibility/HiddenA11yText.js.map +1 -0
- package/lib/commonjs/components/Accessibility/index.js +22 -0
- package/lib/commonjs/components/Accessibility/index.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js +31 -29
- package/lib/commonjs/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/ChannelPreviewMutedStatus.js +11 -5
- package/lib/commonjs/components/ChannelPreview/ChannelPreviewMutedStatus.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/ChannelPreviewStatus.js +8 -1
- package/lib/commonjs/components/ChannelPreview/ChannelPreviewStatus.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/ChannelPreviewUnreadCount.js +8 -2
- package/lib/commonjs/components/ChannelPreview/ChannelPreviewUnreadCount.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/ChannelPreviewView.js +3 -0
- package/lib/commonjs/components/ChannelPreview/ChannelPreviewView.js.map +1 -1
- package/lib/commonjs/components/Message/MessageItemView/MessageContent.js +2 -1
- package/lib/commonjs/components/Message/MessageItemView/MessageContent.js.map +1 -1
- package/lib/commonjs/components/Message/MessageItemView/MessageFooter.js +2 -0
- package/lib/commonjs/components/Message/MessageItemView/MessageFooter.js.map +1 -1
- package/lib/commonjs/components/Message/MessageItemView/MessageStatus.js +35 -30
- package/lib/commonjs/components/Message/MessageItemView/MessageStatus.js.map +1 -1
- package/lib/commonjs/components/Message/MessageItemView/ReactionList/ReactionListClustered.js +19 -6
- package/lib/commonjs/components/Message/MessageItemView/ReactionList/ReactionListClustered.js.map +1 -1
- package/lib/commonjs/components/Message/MessageItemView/ReactionList/ReactionListItem.js +6 -1
- package/lib/commonjs/components/Message/MessageItemView/ReactionList/ReactionListItem.js.map +1 -1
- package/lib/commonjs/components/Message/hooks/useMessageActionHandlers.js +8 -0
- package/lib/commonjs/components/Message/hooks/useMessageActionHandlers.js.map +1 -1
- package/lib/commonjs/components/Poll/Poll.js +0 -17
- package/lib/commonjs/components/Poll/Poll.js.map +1 -1
- package/lib/commonjs/components/Reply/Reply.js +43 -6
- package/lib/commonjs/components/Reply/Reply.js.map +1 -1
- package/lib/commonjs/components/ui/Avatar/ChannelAvatar.js +17 -11
- package/lib/commonjs/components/ui/Avatar/ChannelAvatar.js.map +1 -1
- package/lib/commonjs/components/ui/Badge/BadgeNotification.js +3 -1
- package/lib/commonjs/components/ui/Badge/BadgeNotification.js.map +1 -1
- package/lib/commonjs/i18n/ar.json +20 -8
- package/lib/commonjs/i18n/en.json +17 -5
- package/lib/commonjs/i18n/es.json +17 -5
- package/lib/commonjs/i18n/fr.json +17 -5
- package/lib/commonjs/i18n/he.json +17 -5
- package/lib/commonjs/i18n/hi.json +18 -6
- package/lib/commonjs/i18n/it.json +17 -5
- package/lib/commonjs/i18n/ja.json +17 -5
- package/lib/commonjs/i18n/ko.json +17 -5
- package/lib/commonjs/i18n/nl.json +18 -6
- package/lib/commonjs/i18n/pt-br.json +19 -7
- package/lib/commonjs/i18n/ru.json +17 -5
- package/lib/commonjs/i18n/tr.json +18 -6
- package/lib/commonjs/version.json +1 -1
- package/lib/module/a11y/hooks/useAnnounceOnShow.js +27 -0
- package/lib/module/a11y/hooks/useAnnounceOnShow.js.map +1 -0
- package/lib/module/a11y/index.js +11 -0
- package/lib/module/a11y/index.js.map +1 -1
- package/lib/module/components/Accessibility/CompositeAccessibilityProbe.js +29 -0
- package/lib/module/components/Accessibility/CompositeAccessibilityProbe.js.map +1 -0
- package/lib/module/components/Accessibility/HiddenA11yText.js +30 -0
- package/lib/module/components/Accessibility/HiddenA11yText.js.map +1 -0
- package/lib/module/components/Accessibility/index.js +22 -0
- package/lib/module/components/Accessibility/index.js.map +1 -1
- package/lib/module/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js +31 -29
- package/lib/module/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.js.map +1 -1
- package/lib/module/components/ChannelPreview/ChannelPreviewMutedStatus.js +11 -5
- package/lib/module/components/ChannelPreview/ChannelPreviewMutedStatus.js.map +1 -1
- package/lib/module/components/ChannelPreview/ChannelPreviewStatus.js +8 -1
- package/lib/module/components/ChannelPreview/ChannelPreviewStatus.js.map +1 -1
- package/lib/module/components/ChannelPreview/ChannelPreviewUnreadCount.js +8 -2
- package/lib/module/components/ChannelPreview/ChannelPreviewUnreadCount.js.map +1 -1
- package/lib/module/components/ChannelPreview/ChannelPreviewView.js +3 -0
- package/lib/module/components/ChannelPreview/ChannelPreviewView.js.map +1 -1
- package/lib/module/components/Message/MessageItemView/MessageContent.js +2 -1
- package/lib/module/components/Message/MessageItemView/MessageContent.js.map +1 -1
- package/lib/module/components/Message/MessageItemView/MessageFooter.js +2 -0
- package/lib/module/components/Message/MessageItemView/MessageFooter.js.map +1 -1
- package/lib/module/components/Message/MessageItemView/MessageStatus.js +35 -30
- package/lib/module/components/Message/MessageItemView/MessageStatus.js.map +1 -1
- package/lib/module/components/Message/MessageItemView/ReactionList/ReactionListClustered.js +19 -6
- package/lib/module/components/Message/MessageItemView/ReactionList/ReactionListClustered.js.map +1 -1
- package/lib/module/components/Message/MessageItemView/ReactionList/ReactionListItem.js +6 -1
- package/lib/module/components/Message/MessageItemView/ReactionList/ReactionListItem.js.map +1 -1
- package/lib/module/components/Message/hooks/useMessageActionHandlers.js +8 -0
- package/lib/module/components/Message/hooks/useMessageActionHandlers.js.map +1 -1
- package/lib/module/components/Poll/Poll.js +0 -17
- package/lib/module/components/Poll/Poll.js.map +1 -1
- package/lib/module/components/Reply/Reply.js +43 -6
- package/lib/module/components/Reply/Reply.js.map +1 -1
- package/lib/module/components/ui/Avatar/ChannelAvatar.js +17 -11
- package/lib/module/components/ui/Avatar/ChannelAvatar.js.map +1 -1
- package/lib/module/components/ui/Badge/BadgeNotification.js +3 -1
- package/lib/module/components/ui/Badge/BadgeNotification.js.map +1 -1
- package/lib/module/i18n/ar.json +20 -8
- package/lib/module/i18n/en.json +17 -5
- package/lib/module/i18n/es.json +17 -5
- package/lib/module/i18n/fr.json +17 -5
- package/lib/module/i18n/he.json +17 -5
- package/lib/module/i18n/hi.json +18 -6
- package/lib/module/i18n/it.json +17 -5
- package/lib/module/i18n/ja.json +17 -5
- package/lib/module/i18n/ko.json +17 -5
- package/lib/module/i18n/nl.json +18 -6
- package/lib/module/i18n/pt-br.json +19 -7
- package/lib/module/i18n/ru.json +17 -5
- package/lib/module/i18n/tr.json +18 -6
- package/lib/module/version.json +1 -1
- package/lib/typescript/a11y/hooks/useAnnounceOnShow.d.ts +21 -0
- package/lib/typescript/a11y/hooks/useAnnounceOnShow.d.ts.map +1 -0
- package/lib/typescript/a11y/index.d.ts +1 -0
- package/lib/typescript/a11y/index.d.ts.map +1 -1
- package/lib/typescript/components/Accessibility/CompositeAccessibilityProbe.d.ts +30 -0
- package/lib/typescript/components/Accessibility/CompositeAccessibilityProbe.d.ts.map +1 -0
- package/lib/typescript/components/Accessibility/HiddenA11yText.d.ts +25 -0
- package/lib/typescript/components/Accessibility/HiddenA11yText.d.ts.map +1 -0
- package/lib/typescript/components/Accessibility/index.d.ts +2 -0
- package/lib/typescript/components/Accessibility/index.d.ts.map +1 -1
- package/lib/typescript/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.d.ts.map +1 -1
- package/lib/typescript/components/ChannelPreview/ChannelPreviewMutedStatus.d.ts.map +1 -1
- package/lib/typescript/components/ChannelPreview/ChannelPreviewStatus.d.ts.map +1 -1
- package/lib/typescript/components/ChannelPreview/ChannelPreviewUnreadCount.d.ts.map +1 -1
- package/lib/typescript/components/ChannelPreview/ChannelPreviewView.d.ts.map +1 -1
- package/lib/typescript/components/Message/MessageItemView/MessageContent.d.ts.map +1 -1
- package/lib/typescript/components/Message/MessageItemView/MessageFooter.d.ts.map +1 -1
- package/lib/typescript/components/Message/MessageItemView/MessageStatus.d.ts.map +1 -1
- package/lib/typescript/components/Message/MessageItemView/ReactionList/ReactionListClustered.d.ts.map +1 -1
- package/lib/typescript/components/Message/MessageItemView/ReactionList/ReactionListItem.d.ts.map +1 -1
- package/lib/typescript/components/Message/MessageOverlayWrapper.d.ts +1 -1
- package/lib/typescript/components/Message/hooks/useMessageActionHandlers.d.ts.map +1 -1
- package/lib/typescript/components/Poll/Poll.d.ts.map +1 -1
- package/lib/typescript/components/Reply/Reply.d.ts.map +1 -1
- package/lib/typescript/components/ui/Avatar/ChannelAvatar.d.ts.map +1 -1
- package/lib/typescript/components/ui/Badge/BadgeNotification.d.ts +5 -0
- package/lib/typescript/components/ui/Badge/BadgeNotification.d.ts.map +1 -1
- package/lib/typescript/hooks/useTranslatedMessage.d.ts +1 -1
- package/lib/typescript/i18n/ar.json +20 -8
- package/lib/typescript/i18n/en.json +17 -5
- package/lib/typescript/i18n/es.json +17 -5
- package/lib/typescript/i18n/fr.json +17 -5
- package/lib/typescript/i18n/he.json +17 -5
- package/lib/typescript/i18n/hi.json +18 -6
- package/lib/typescript/i18n/it.json +17 -5
- package/lib/typescript/i18n/ja.json +17 -5
- package/lib/typescript/i18n/ko.json +17 -5
- package/lib/typescript/i18n/nl.json +18 -6
- package/lib/typescript/i18n/pt-br.json +19 -7
- package/lib/typescript/i18n/ru.json +17 -5
- package/lib/typescript/i18n/tr.json +18 -6
- package/lib/typescript/utils/i18n/Streami18n.d.ts +16 -4
- package/lib/typescript/utils/i18n/Streami18n.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/a11y/hooks/useAnnounceOnShow.ts +44 -0
- package/src/a11y/index.ts +1 -0
- package/src/components/Accessibility/CompositeAccessibilityProbe.tsx +48 -0
- package/src/components/Accessibility/HiddenA11yText.tsx +49 -0
- package/src/components/Accessibility/index.ts +2 -0
- package/src/components/ChannelPreview/ChannelMessagePreviewDeliveryStatus.tsx +19 -16
- package/src/components/ChannelPreview/ChannelPreviewMutedStatus.tsx +8 -1
- package/src/components/ChannelPreview/ChannelPreviewStatus.tsx +10 -4
- package/src/components/ChannelPreview/ChannelPreviewUnreadCount.tsx +5 -1
- package/src/components/ChannelPreview/ChannelPreviewView.tsx +3 -0
- package/src/components/Message/MessageItemView/MessageContent.tsx +12 -1
- package/src/components/Message/MessageItemView/MessageFooter.tsx +6 -1
- package/src/components/Message/MessageItemView/MessageStatus.tsx +36 -39
- package/src/components/Message/MessageItemView/ReactionList/ReactionListClustered.tsx +24 -10
- package/src/components/Message/MessageItemView/ReactionList/ReactionListItem.tsx +5 -1
- package/src/components/Message/MessageItemView/__tests__/MessageStatus.test.tsx +10 -7
- package/src/components/Message/MessageItemView/__tests__/ReactionListBottom.test.tsx +1 -1
- package/src/components/Message/hooks/useMessageActionHandlers.ts +7 -0
- package/src/components/Poll/Poll.tsx +1 -25
- package/src/components/Reply/Reply.tsx +58 -7
- package/src/components/Thread/__tests__/__snapshots__/Thread.test.tsx.snap +8 -0
- package/src/components/ui/Avatar/ChannelAvatar.tsx +39 -29
- package/src/components/ui/Badge/BadgeNotification.tsx +11 -2
- package/src/i18n/ar.json +20 -8
- package/src/i18n/en.json +17 -5
- package/src/i18n/es.json +17 -5
- package/src/i18n/fr.json +17 -5
- package/src/i18n/he.json +17 -5
- package/src/i18n/hi.json +18 -6
- package/src/i18n/it.json +17 -5
- package/src/i18n/ja.json +17 -5
- package/src/i18n/ko.json +17 -5
- package/src/i18n/nl.json +18 -6
- package/src/i18n/pt-br.json +19 -7
- package/src/i18n/ru.json +17 -5
- package/src/i18n/tr.json +18 -6
- package/src/version.json +1 -1
- package/lib/commonjs/components/Poll/hooks/usePollAccessibilityActions.js +0 -150
- package/lib/commonjs/components/Poll/hooks/usePollAccessibilityActions.js.map +0 -1
- package/lib/commonjs/components/Poll/hooks/usePollAccessibilityLabel.js +0 -59
- package/lib/commonjs/components/Poll/hooks/usePollAccessibilityLabel.js.map +0 -1
- package/lib/module/components/Poll/hooks/usePollAccessibilityActions.js +0 -150
- package/lib/module/components/Poll/hooks/usePollAccessibilityActions.js.map +0 -1
- package/lib/module/components/Poll/hooks/usePollAccessibilityLabel.js +0 -59
- package/lib/module/components/Poll/hooks/usePollAccessibilityLabel.js.map +0 -1
- package/lib/typescript/components/Poll/hooks/usePollAccessibilityActions.d.ts +0 -25
- package/lib/typescript/components/Poll/hooks/usePollAccessibilityActions.d.ts.map +0 -1
- package/lib/typescript/components/Poll/hooks/usePollAccessibilityLabel.d.ts +0 -8
- package/lib/typescript/components/Poll/hooks/usePollAccessibilityLabel.d.ts.map +0 -1
- package/src/components/Poll/hooks/__tests__/usePollAccessibilityActions.test.tsx +0 -358
- package/src/components/Poll/hooks/__tests__/usePollAccessibilityLabel.test.tsx +0 -142
- package/src/components/Poll/hooks/usePollAccessibilityActions.ts +0 -191
- 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.
|
|
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
|
+
});
|
|
@@ -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
|
-
<
|
|
87
|
-
{
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
status ===
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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
|
|
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
|
-
{
|
|
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={
|
|
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
|
|
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
|
-
|
|
53
|
-
{
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
height={16}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
<
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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 ?
|
|
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
|
-
<
|
|
58
|
-
<
|
|
59
|
-
<
|
|
60
|
-
<
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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.
|
|
171
|
+
const reactionListBottomItem = screen.getByTestId('reaction-list-item');
|
|
172
172
|
|
|
173
173
|
fireEvent(reactionListBottomItem, 'onPress');
|
|
174
174
|
|