about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorPaul Frazee <pfrazee@gmail.com>2023-09-22 17:04:47 -0700
committerGitHub <noreply@github.com>2023-09-22 17:04:47 -0700
commitb7697f08d65a0095bfc06578d689b8b8f61bef69 (patch)
tree128795c3c26d15785fd9e4b038f170c4fdaeac88 /src
parent88b95df200af3dd89ff9f629d50840a0ec2047f3 (diff)
downloadvoidsky-b7697f08d65a0095bfc06578d689b8b8f61bef69.tar.zst
Accessibility fixes: add missing labels, dynamically scale home header (#1516)
* Improve labels

* Dynanically adjust home header to account for font scaling
Diffstat (limited to 'src')
-rw-r--r--src/view/com/posts/FeedItem.tsx4
-rw-r--r--src/view/com/profile/ProfileHeader.tsx4
-rw-r--r--src/view/com/util/Link.tsx4
-rw-r--r--src/view/com/util/UserAvatar.tsx6
-rw-r--r--src/view/com/util/UserBanner.tsx6
-rw-r--r--src/view/screens/CustomFeed.tsx6
-rw-r--r--src/view/screens/Feeds.tsx5
-rw-r--r--src/view/screens/Home.tsx42
-rw-r--r--src/view/screens/Settings.tsx6
-rw-r--r--src/view/shell/desktop/LeftNav.tsx1
10 files changed, 52 insertions, 32 deletions
diff --git a/src/view/com/posts/FeedItem.tsx b/src/view/com/posts/FeedItem.tsx
index 71be3969a..f6b6e5339 100644
--- a/src/view/com/posts/FeedItem.tsx
+++ b/src/view/com/posts/FeedItem.tsx
@@ -203,9 +203,9 @@ export const FeedItem = observer(function FeedItemImpl({
             <Link
               style={styles.includeReason}
               href={makeProfileLink(item.reasonRepost.by)}
-              title={sanitizeDisplayName(
+              title={`Reposted by ${sanitizeDisplayName(
                 item.reasonRepost.by.displayName || item.reasonRepost.by.handle,
-              )}>
+              )}`}>
               <FontAwesomeIcon
                 icon="retweet"
                 style={{
diff --git a/src/view/com/profile/ProfileHeader.tsx b/src/view/com/profile/ProfileHeader.tsx
index 82b992551..57fa22f1e 100644
--- a/src/view/com/profile/ProfileHeader.tsx
+++ b/src/view/com/profile/ProfileHeader.tsx
@@ -454,7 +454,9 @@ const ProfileHeaderLoaded = observer(function ProfileHeaderLoadedImpl({
           {dropdownItems?.length ? (
             <NativeDropdown
               testID="profileHeaderDropdownBtn"
-              items={dropdownItems}>
+              items={dropdownItems}
+              accessibilityLabel="More options"
+              accessibilityHint="">
               <View style={[styles.btn, styles.secondaryBtn, pal.btn]}>
                 <FontAwesomeIcon icon="ellipsis" size={20} style={[pal.text]} />
               </View>
diff --git a/src/view/com/util/Link.tsx b/src/view/com/util/Link.tsx
index 1a6f047f6..8734cf32f 100644
--- a/src/view/com/util/Link.tsx
+++ b/src/view/com/util/Link.tsx
@@ -142,6 +142,7 @@ export const TextLink = observer(function TextLink({
   dataSet,
   title,
   onPress,
+  ...orgProps
 }: {
   testID?: string
   type?: TypographyVariant
@@ -190,7 +191,8 @@ export const TextLink = observer(function TextLink({
       title={title}
       // @ts-ignore web only -prf
       hrefAttrs={hrefAttrs} // hack to get open in new tab to work on safari. without this, safari will open in a new window
-      {...props}>
+      {...props}
+      {...orgProps}>
       {text}
     </Text>
   )
diff --git a/src/view/com/util/UserAvatar.tsx b/src/view/com/util/UserAvatar.tsx
index 7a42ab4d3..80d506b4a 100644
--- a/src/view/com/util/UserAvatar.tsx
+++ b/src/view/com/util/UserAvatar.tsx
@@ -230,7 +230,11 @@ export function UserAvatar({
 
   // onSelectNewAvatar is only passed as prop on the EditProfile component
   return onSelectNewAvatar ? (
-    <NativeDropdown testID="changeAvatarBtn" items={dropdownItems}>
+    <NativeDropdown
+      testID="changeAvatarBtn"
+      items={dropdownItems}
+      accessibilityLabel="Image options"
+      accessibilityHint="">
       {avatar ? (
         <HighPriorityImage
           testID="userAvatarImage"
diff --git a/src/view/com/util/UserBanner.tsx b/src/view/com/util/UserBanner.tsx
index 7c5c583c2..0b48dcdd7 100644
--- a/src/view/com/util/UserBanner.tsx
+++ b/src/view/com/util/UserBanner.tsx
@@ -106,7 +106,11 @@ export function UserBanner({
 
   // setUserBanner is only passed as prop on the EditProfile component
   return onSelectNewBanner ? (
-    <NativeDropdown testID="changeBannerBtn" items={dropdownItems}>
+    <NativeDropdown
+      testID="changeBannerBtn"
+      items={dropdownItems}
+      accessibilityLabel="Image options"
+      accessibilityHint="">
       {banner ? (
         <Image
           testID="userBannerImage"
diff --git a/src/view/screens/CustomFeed.tsx b/src/view/screens/CustomFeed.tsx
index f8ceda940..f9383639c 100644
--- a/src/view/screens/CustomFeed.tsx
+++ b/src/view/screens/CustomFeed.tsx
@@ -405,7 +405,11 @@ export const CustomFeedScreenInner = observer(
               )}
             </>
           ) : null}
-          <NativeDropdown testID="feedHeaderDropdownBtn" items={dropdownItems}>
+          <NativeDropdown
+            testID="feedHeaderDropdownBtn"
+            items={dropdownItems}
+            accessibilityLabel="More options"
+            accessibilityHint="">
             <View
               style={{
                 paddingLeft: 12,
diff --git a/src/view/screens/Feeds.tsx b/src/view/screens/Feeds.tsx
index 6ca24bae9..fc4d99cf5 100644
--- a/src/view/screens/Feeds.tsx
+++ b/src/view/screens/Feeds.tsx
@@ -120,7 +120,10 @@ export const FeedsScreen = withAuthRequired(
                 <Text type="title-lg" style={[pal.text, s.bold]}>
                   My Feeds
                 </Text>
-                <Link href="/settings/saved-feeds">
+                <Link
+                  href="/settings/saved-feeds"
+                  accessibilityLabel="Edit My Feeds"
+                  accessibilityHint="">
                   <CogIcon strokeWidth={1.5} style={pal.icon} size={28} />
                 </Link>
               </View>
diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx
index 60cda31db..e53d4a08e 100644
--- a/src/view/screens/Home.tsx
+++ b/src/view/screens/Home.tsx
@@ -1,5 +1,5 @@
 import React from 'react'
-import {FlatList, View} from 'react-native'
+import {FlatList, View, useWindowDimensions} from 'react-native'
 import {useFocusEffect, useIsFocused} from '@react-navigation/native'
 import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
 import {FontAwesomeIconStyle} from '@fortawesome/react-native-fontawesome'
@@ -26,9 +26,6 @@ import {useAnalytics} from 'lib/analytics/analytics'
 import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries'
 import {ComposeIcon2} from 'lib/icons'
 
-const HEADER_OFFSET_MOBILE = 78
-const HEADER_OFFSET_TABLET = 50
-const HEADER_OFFSET_DESKTOP = 0
 const POLL_FREQ = 30e3 // 30sec
 
 type Props = NativeStackScreenProps<HomeTabNavigatorParams, 'Home'>
@@ -160,16 +157,10 @@ const FeedPage = observer(function FeedPageImpl({
 }) {
   const store = useStores()
   const pal = usePalette('default')
-  const {isMobile, isTablet, isDesktop} = useWebMediaQueries()
+  const {isDesktop} = useWebMediaQueries()
   const [onMainScroll, isScrolledDown, resetMainScroll] = useOnMainScroll(store)
   const {screen, track} = useAnalytics()
-  const [headerOffset, setHeaderOffset] = React.useState(
-    isMobile
-      ? HEADER_OFFSET_MOBILE
-      : isTablet
-      ? HEADER_OFFSET_TABLET
-      : HEADER_OFFSET_DESKTOP,
-  )
+  const headerOffset = useHeaderOffset()
   const scrollElRef = React.useRef<FlatList>(null)
   const {appState} = useAppState({
     onForeground: () => doPoll(true),
@@ -214,17 +205,6 @@ const FeedPage = observer(function FeedPageImpl({
     }
   }, [isPageFocused, scrollToTop, feed])
 
-  // listens for resize events
-  React.useEffect(() => {
-    setHeaderOffset(
-      isMobile
-        ? HEADER_OFFSET_MOBILE
-        : isTablet
-        ? HEADER_OFFSET_TABLET
-        : HEADER_OFFSET_DESKTOP,
-    )
-  }, [isMobile, isTablet])
-
   // fires when page within screen is activated/deactivated
   // - check for latest
   React.useEffect(() => {
@@ -301,6 +281,8 @@ const FeedPage = observer(function FeedPageImpl({
             type="title-lg"
             href="/settings/home-feed"
             style={{fontWeight: 'bold'}}
+            accessibilityLabel="Feed Preferences"
+            accessibilityHint=""
             text={
               <FontAwesomeIcon
                 icon="sliders"
@@ -347,3 +329,17 @@ const FeedPage = observer(function FeedPageImpl({
     </View>
   )
 })
+
+function useHeaderOffset() {
+  const {isDesktop, isTablet} = useWebMediaQueries()
+  const {fontScale} = useWindowDimensions()
+  if (isDesktop) {
+    return 0
+  }
+  if (isTablet) {
+    return 50
+  }
+  // default text takes 44px, plus 34px of pad
+  // scale the 44px by the font scale
+  return 34 + 44 * fontScale
+}
diff --git a/src/view/screens/Settings.tsx b/src/view/screens/Settings.tsx
index 4783f3353..7b17b5347 100644
--- a/src/view/screens/Settings.tsx
+++ b/src/view/screens/Settings.tsx
@@ -651,7 +651,11 @@ function AccountDropdownBtn({handle}: {handle: string}) {
   ]
   return (
     <Pressable accessibilityRole="button" style={s.pl10}>
-      <NativeDropdown testID="accountSettingsDropdownBtn" items={items}>
+      <NativeDropdown
+        testID="accountSettingsDropdownBtn"
+        items={items}
+        accessibilityLabel="Account options"
+        accessibilityHint="">
         <FontAwesomeIcon
           icon="ellipsis-h"
           style={pal.textLight as FontAwesomeIconStyle}
diff --git a/src/view/shell/desktop/LeftNav.tsx b/src/view/shell/desktop/LeftNav.tsx
index 907df8641..b19d5e8ab 100644
--- a/src/view/shell/desktop/LeftNav.tsx
+++ b/src/view/shell/desktop/LeftNav.tsx
@@ -47,6 +47,7 @@ const ProfileCard = observer(function ProfileCardImpl() {
     <Link
       href={makeProfileLink(store.me)}
       style={[styles.profileCard, !isDesktop && styles.profileCardTablet]}
+      title="My Profile"
       asAnchor>
       <UserAvatar avatar={store.me.avatar} size={size} />
     </Link>