From d4b28df091684e37b7464a58b3c623a2f0da90ec Mon Sep 17 00:00:00 2001 From: Zhiyuan Zheng Date: Fri, 9 Apr 2021 21:43:12 +0200 Subject: [PATCH] Refine accessibility --- src/components/Account.tsx | 1 + src/components/Button.tsx | 71 +++++++++---------- src/components/GracefullyImage.tsx | 16 +++-- src/components/Hashtag.tsx | 6 +- src/components/Header/Right.tsx | 21 +++++- src/components/Icon.tsx | 6 +- src/components/Instance.tsx | 40 ++++++++--- src/components/Instance/Info.tsx | 6 +- src/components/Menu/Container.tsx | 6 +- src/components/Menu/Row.tsx | 21 ++++-- src/components/Message.tsx | 8 ++- src/components/Parse/Emojis.tsx | 10 +-- src/components/Parse/HTML.tsx | 2 + src/components/Timeline/Default.tsx | 2 + src/components/Timeline/Notifications.tsx | 6 +- src/components/Timeline/Shared/Actions.tsx | 32 +++++++++ .../Timeline/Shared/ActionsUsers.tsx | 24 ++++++- .../Timeline/Shared/Attachment/Audio.tsx | 1 + .../Timeline/Shared/Attachment/Image.tsx | 1 + .../Shared/Attachment/Unsupported.tsx | 10 ++- .../Timeline/Shared/Attachment/Video.tsx | 1 + src/components/Timeline/Shared/Avatar.tsx | 16 ++++- src/components/Timeline/Shared/Card.tsx | 2 + .../Timeline/Shared/HeaderDefault.tsx | 3 + .../Timeline/Shared/HeaderShared/Account.tsx | 13 +++- .../Shared/HeaderShared/Application.tsx | 1 + .../Timeline/Shared/HeaderShared/Muted.tsx | 3 + .../Shared/HeaderShared/Visibility.tsx | 8 +++ src/i18n/en/common.json | 3 + src/i18n/en/components/timeline.json | 48 +++++++++++-- src/i18n/en/screens/compose.json | 41 ++++++++++- src/i18n/en/screens/imageViewer.json | 6 +- src/i18n/en/screens/tabs.json | 16 +++++ src/screens/Announcements.tsx | 2 +- src/screens/Compose/DraftsList/Root.tsx | 6 +- src/screens/Compose/EditAttachment/Image.tsx | 10 ++- src/screens/Compose/EditAttachment/Submit.tsx | 7 +- src/screens/Compose/Root.tsx | 39 ++++++++-- src/screens/Compose/Root/Actions.tsx | 56 ++++++++++++++- src/screens/Compose/Root/Drafts.tsx | 9 ++- src/screens/Compose/Root/Footer.tsx | 23 ++++-- .../Compose/Root/Footer/Attachments.tsx | 21 +++++- src/screens/Compose/Root/Footer/Emojis.tsx | 41 ++++++++++- src/screens/Compose/Root/Footer/Poll.tsx | 30 ++++++++ .../Compose/Root/Header/SpoilerInput.tsx | 3 +- src/screens/Compose/utils/initialState.ts | 2 +- src/screens/Compose/utils/types.d.ts | 2 +- .../components/ImageItem.android.tsx | 4 ++ src/screens/ImagesViewer.tsx | 2 + src/screens/Tabs.tsx | 23 +++--- src/screens/Tabs/Local.tsx | 2 + src/screens/Tabs/Me/Switch/Root.tsx | 31 +++++--- src/screens/Tabs/Notifications.tsx | 2 + src/screens/Tabs/Public.tsx | 2 + src/screens/Tabs/Shared/Account.tsx | 8 ++- src/screens/Tabs/Shared/sharedScreens.tsx | 1 + .../accessibility/AccessibilityManager.tsx | 26 +++++-- 57 files changed, 661 insertions(+), 142 deletions(-) diff --git a/src/components/Account.tsx b/src/components/Account.tsx index dfff5f0f..1b4d78f7 100644 --- a/src/components/Account.tsx +++ b/src/components/Account.tsx @@ -31,6 +31,7 @@ const ComponentAccount: React.FC = ({ return ( diff --git a/src/components/Button.tsx b/src/components/Button.tsx index 8efb28c2..ecce14f5 100644 --- a/src/components/Button.tsx +++ b/src/components/Button.tsx @@ -4,6 +4,7 @@ import layoutAnimation from '@utils/styles/layoutAnimation' import { useTheme } from '@utils/styles/ThemeManager' import React, { useEffect, useMemo, useRef } from 'react' import { + AccessibilityProps, Pressable, StyleProp, StyleSheet, @@ -14,15 +15,18 @@ import { import { Flow } from 'react-native-animated-spinkit' export interface Props { + accessibilityLabel?: AccessibilityProps['accessibilityLabel'] + accessibilityHint?: AccessibilityProps['accessibilityHint'] + style?: StyleProp type: 'icon' | 'text' content: string + selected?: boolean loading?: boolean destructive?: boolean disabled?: boolean - active?: boolean strokeWidth?: number size?: 'S' | 'M' | 'L' @@ -34,13 +38,15 @@ export interface Props { } const Button: React.FC = ({ + accessibilityLabel, + accessibilityHint, style: customStyle, type, content, + selected, loading = false, destructive = false, disabled = false, - active = false, strokeWidth, size = 'M', spacing = 'S', @@ -57,7 +63,7 @@ const Button: React.FC = ({ } else { mounted.current = true } - }, [content, loading, disabled, active]) + }, [content, loading, disabled]) const loadingSpinkit = useMemo( () => ( @@ -68,40 +74,22 @@ const Button: React.FC = ({ [mode] ) - const colorContent = useMemo(() => { - if (active) { + const mainColor = useMemo(() => { + if (selected) { return theme.blue + } else if (overlay) { + return theme.primaryOverlay + } else if (disabled || loading) { + return theme.disabled } else { - if (overlay) { - return theme.primaryOverlay + if (destructive) { + return theme.red } else { - if (disabled) { - return theme.secondary - } else { - if (destructive) { - return theme.red - } else { - return theme.primaryDefault - } - } + return theme.primaryDefault } } - }, [mode, disabled]) - const colorBorder = useMemo(() => { - if (active) { - return theme.blue - } else { - if (disabled || loading) { - return theme.secondary - } else { - if (destructive) { - return theme.red - } else { - return theme.primaryDefault - } - } - } - }, [mode, loading, disabled]) + }, [mode, disabled, loading, selected]) + const colorBackground = useMemo(() => { if (overlay) { return theme.backgroundOverlayInvert @@ -117,7 +105,7 @@ const Button: React.FC = ({ <> = ({ <> = ({ ) } - }, [mode, content, loading, disabled, active]) + }, [mode, content, loading, disabled]) enum spacingMapping { XS = 'S', @@ -156,11 +144,20 @@ const Button: React.FC = ({ return ( = ({ testID='base' onPress={onPress} children={children} - disabled={disabled || active || loading} + disabled={selected || disabled || loading} /> ) } diff --git a/src/components/GracefullyImage.tsx b/src/components/GracefullyImage.tsx index 6e597b39..37cac47f 100644 --- a/src/components/GracefullyImage.tsx +++ b/src/components/GracefullyImage.tsx @@ -1,6 +1,7 @@ import { useTheme } from '@utils/styles/ThemeManager' import React, { useCallback, useMemo, useRef, useState } from 'react' import { + AccessibilityProps, Image, ImageStyle, Pressable, @@ -18,6 +19,9 @@ import { Blurhash } from 'react-native-blurhash' // preview, original, remote -> first show preview, then original, if original failed, then remote export interface Props { + accessibilityLabel?: AccessibilityProps['accessibilityLabel'] + accessibilityHint?: AccessibilityProps['accessibilityHint'] + hidden?: boolean uri: { preview?: string; original?: string; remote?: string } blurhash?: string @@ -36,6 +40,8 @@ export interface Props { const GracefullyImage = React.memo( ({ + accessibilityLabel, + accessibilityHint, hidden = false, uri, blurhash, @@ -103,10 +109,7 @@ const GracefullyImage = React.memo( } else { return ( ) } @@ -117,6 +120,11 @@ const GracefullyImage = React.memo( return (