From c1fe12f5bfe5e41440c349dcbb4c345ee17c5bd0 Mon Sep 17 00:00:00 2001 From: Matin Zadeh Dolatabad Date: Wed, 17 May 2023 16:19:59 +0200 Subject: [PATCH 01/11] chore: update expo-image to 1.2.3 (#664) Issue: https://github.com/expo/expo/pull/22491 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 5c5f30574f..aeeac30a41 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "expo-constants": "~14.2.1", "expo-dev-client": "~2.1.1", "expo-device": "~5.2.1", - "expo-image": "^1.2.1", + "expo-image": "^1.2.3", "expo-image-manipulator": "^11.1.1", "expo-image-picker": "^14.1.1", "expo-localization": "~14.1.1", diff --git a/yarn.lock b/yarn.lock index 54006d89d2..541f587027 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8738,10 +8738,10 @@ expo-image-picker@^14.1.1: dependencies: expo-image-loader "~4.1.0" -expo-image@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/expo-image/-/expo-image-1.2.1.tgz#3f377cb3142de2107903f4e4f88a7f44785dee18" - integrity sha512-pYZFN0ctuIBA+sqUiw70rHQQ04WDyEcF549ObArdj0MNgSUCBJMFmu/jrWDmxOpEMF40lfLVIZKigJT7Bw+GYA== +expo-image@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/expo-image/-/expo-image-1.2.3.tgz#f3582d725ffb7437f8ce946ad44fe33f0aa0603d" + integrity sha512-+Mnx6rcneWSUGfHkUDV3cQ3R4lVwoIDFs/tcXVqnlxyNJdNxpW2cge9pS2Hpj3UDoZVhZPLR8LHS8E9wEaC0NA== expo-json-utils@~0.5.0: version "0.5.1" From b1c5794190b3090fe9ac88af68f035c2b9136258 Mon Sep 17 00:00:00 2001 From: LW Date: Wed, 17 May 2023 07:21:34 -0700 Subject: [PATCH 02/11] docs: update e2e mock server command (#662) --- docs/build.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build.md b/docs/build.md index 3fc3b123ad..953630a701 100644 --- a/docs/build.md +++ b/docs/build.md @@ -21,7 +21,7 @@ - If you are cloning or forking this repo as an open source developer, please check the tips below as well - Run e2e tests - Start in various console tabs: - - `yarn e2e:server` + - `yarn e2e:mock-server` - `yarn e2e:metro` - Run once: `yarn e2e:build` - Each test run: `yarn e2e:run` From b132ff7a7615eb6c8da0b60b226ff7e317c4033e Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 17 May 2023 15:27:02 +0100 Subject: [PATCH 03/11] Update build.md - minor typo (#696) This is not the smallest PR in the world, this is just a tribute. (actually, it's just one byte, so it might be the smallest PR in the world) --- docs/build.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build.md b/docs/build.md index 953630a701..33e7f6751b 100644 --- a/docs/build.md +++ b/docs/build.md @@ -31,7 +31,7 @@ - `npx react-native info` Checks what has been installed. - The android simulator won't be able to access localhost services unless you run `adb reverse tcp:{PORT} tcp:{PORT}` - For instance, the localhosted dev-wallet will need `adb reverse tcp:3001 tcp:3001` - - For some reason, the typescript compiler chokes on platform-specific files (e.g. `foo.native.ts`) but only when compiling for Web thus far. Therefore we always have one version of the file which doesn't use a platform specifier, and that should bee the Web version. ([More info](https://stackoverflow.com/questions/44001050/platform-specific-import-component-in-react-native-with-typescript).) + - For some reason, the typescript compiler chokes on platform-specific files (e.g. `foo.native.ts`) but only when compiling for Web thus far. Therefore we always have one version of the file which doesn't use a platform specifier, and that should be the Web version. ([More info](https://stackoverflow.com/questions/44001050/platform-specific-import-component-in-react-native-with-typescript).) ## Go-Server Build From 6dde5ede34cea0abcf4529c2c7d90d355dfa97a3 Mon Sep 17 00:00:00 2001 From: Mohammad Reza Mahmoudi Date: Wed, 17 May 2023 18:03:05 +0330 Subject: [PATCH 04/11] fix theme opposite labels (#700) --- src/lib/icons.tsx | 29 +++++++++++++++++++++++++++++ src/view/shell/desktop/RightNav.tsx | 12 +++++++++--- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/lib/icons.tsx b/src/lib/icons.tsx index 606d27ea4b..06f1950114 100644 --- a/src/lib/icons.tsx +++ b/src/lib/icons.tsx @@ -320,6 +320,35 @@ export function MoonIcon({ ) } +// Copyright (c) 2020 Refactoring UI Inc. +// https://github.com/tailwindlabs/heroicons/blob/master/LICENSE +export function SunIcon({ + style, + size, + strokeWidth = 1.5, +}: { + style?: StyleProp + size?: string | number + strokeWidth?: number +}) { + return ( + + + + ) +} + // Copyright (c) 2020 Refactoring UI Inc. // https://github.com/tailwindlabs/heroicons/blob/master/LICENSE export function UserIcon({ diff --git a/src/view/shell/desktop/RightNav.tsx b/src/view/shell/desktop/RightNav.tsx index d6663ce3d6..fcdea35e81 100644 --- a/src/view/shell/desktop/RightNav.tsx +++ b/src/view/shell/desktop/RightNav.tsx @@ -11,13 +11,14 @@ import {s} from 'lib/styles' import {useStores} from 'state/index' import {pluralize} from 'lib/strings/helpers' import {useColorSchemeStyle} from 'lib/hooks/useColorSchemeStyle' -import {MoonIcon} from 'lib/icons' +import {MoonIcon, SunIcon} from 'lib/icons' import {formatCount} from 'view/com/util/numeric/format' export const DesktopRightNav = observer(function DesktopRightNav() { const store = useStores() const pal = usePalette('default') const mode = useColorSchemeStyle('Light', 'Dark') + const otherMode = mode === 'Dark' ? 'Light' : 'Dark'; const onDarkmodePress = React.useCallback(() => { store.shell.setDarkMode(!store.shell.darkMode) @@ -71,10 +72,15 @@ export const DesktopRightNav = observer(function DesktopRightNav() { : 'Sets display to dark mode' }> - + { + mode === 'Dark' ? + + : + + } - {mode} mode + {otherMode} mode From d7826a3334cd5ef0cf4e6f816e1c85c49fa1a7a1 Mon Sep 17 00:00:00 2001 From: William Date: Wed, 17 May 2023 10:41:54 -0400 Subject: [PATCH 05/11] Properly set isInputFocused (#666) --- src/view/screens/SearchMobile.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/view/screens/SearchMobile.tsx b/src/view/screens/SearchMobile.tsx index 6152038d3d..f9b4864b29 100644 --- a/src/view/screens/SearchMobile.tsx +++ b/src/view/screens/SearchMobile.tsx @@ -121,7 +121,7 @@ export const SearchScreen = withAuthRequired( Date: Wed, 17 May 2023 10:43:08 -0400 Subject: [PATCH 06/11] hidereport button on own post (#676) --- src/view/com/util/forms/DropdownButton.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/view/com/util/forms/DropdownButton.tsx b/src/view/com/util/forms/DropdownButton.tsx index 10076360fe..36ef1f4098 100644 --- a/src/view/com/util/forms/DropdownButton.tsx +++ b/src/view/com/util/forms/DropdownButton.tsx @@ -209,7 +209,7 @@ export function PostDropdownBtn({ }, }, {sep: true}, - { + !isAuthor && { testID: 'postDropdownReportBtn', icon: 'circle-exclamation', label: 'Report post', From 656baa723913951e2a2961f00f0e5219660d0885 Mon Sep 17 00:00:00 2001 From: Ollie H Date: Wed, 17 May 2023 07:46:10 -0700 Subject: [PATCH 07/11] Close active elements on state change (#677) --- src/view/com/lightbox/Lightbox.web.tsx | 5 +++-- src/view/shell/index.web.tsx | 12 +++++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/view/com/lightbox/Lightbox.web.tsx b/src/view/com/lightbox/Lightbox.web.tsx index eff9af2d22..d389279b1e 100644 --- a/src/view/com/lightbox/Lightbox.web.tsx +++ b/src/view/com/lightbox/Lightbox.web.tsx @@ -21,6 +21,9 @@ interface Img { export const Lightbox = observer(function Lightbox() { const store = useStores() + + const onClose = useCallback(() => store.shell.closeLightbox(), [store.shell]) + if (!store.shell.isLightboxActive) { return null } @@ -29,8 +32,6 @@ export const Lightbox = observer(function Lightbox() { const initialIndex = activeLightbox instanceof models.ImagesLightbox ? activeLightbox.index : 0 - const onClose = () => store.shell.closeLightbox() - let imgs: Img[] | undefined if (activeLightbox instanceof models.ProfileImageLightbox) { const opts = activeLightbox diff --git a/src/view/shell/index.web.tsx b/src/view/shell/index.web.tsx index 349376436c..68ce370edb 100644 --- a/src/view/shell/index.web.tsx +++ b/src/view/shell/index.web.tsx @@ -1,4 +1,4 @@ -import React from 'react' +import React, {useEffect} from 'react' import {observer} from 'mobx-react-lite' import {View, StyleSheet, TouchableOpacity} from 'react-native' import {useStores} from 'state/index' @@ -14,11 +14,21 @@ import {RoutesContainer, FlatNavigator} from '../../Navigation' import {DrawerContent} from './Drawer' import {useWebMediaQueries} from '../../lib/hooks/useWebMediaQueries' import {BottomBarWeb} from './bottom-bar/BottomBarWeb' +import {useNavigation} from '@react-navigation/native' +import {NavigationProp} from 'lib/routes/types' const ShellInner = observer(() => { const store = useStores() const {isDesktop} = useWebMediaQueries() + const navigator = useNavigation() + + useEffect(() => { + navigator.addListener('state', () => { + store.shell.closeAnyActiveElement() + }) + }, [navigator, store.shell]) + return ( <> From 41f3a0551511c7141aa416efe92130c4bf020214 Mon Sep 17 00:00:00 2001 From: LW Date: Wed, 17 May 2023 07:50:28 -0700 Subject: [PATCH 08/11] style: remove `useUnreadCountLabel` hack from `50c1841` (#655) (#686) I just realized how `mobx` works (never used before lol) and now I feel dumb. --- src/Navigation.tsx | 7 +++---- src/lib/hooks/useSetTitle.ts | 8 ++++++-- src/lib/hooks/useUnreadCountLabel.ts | 19 ------------------- 3 files changed, 9 insertions(+), 25 deletions(-) delete mode 100644 src/lib/hooks/useUnreadCountLabel.ts diff --git a/src/Navigation.tsx b/src/Navigation.tsx index 17bb3c1590..09631701fc 100644 --- a/src/Navigation.tsx +++ b/src/Navigation.tsx @@ -28,7 +28,6 @@ import {isNative} from 'platform/detection' import {useColorSchemeStyle} from 'lib/hooks/useColorSchemeStyle' import {router} from './routes' import {usePalette} from 'lib/hooks/usePalette' -import {useUnreadCountLabel} from 'lib/hooks/useUnreadCountLabel' import {useStores} from './state' import {HomeScreen} from './view/screens/Home' @@ -296,9 +295,9 @@ const MyProfileTabNavigator = observer(() => { * The FlatNavigator is used by Web to represent the routes * in a single ("flat") stack. */ -function FlatNavigator() { +const FlatNavigator = observer(() => { const pal = usePalette('default') - const unreadCountLabel = useUnreadCountLabel() + const unreadCountLabel = useStores().me.notifications.unreadCountLabel const title = (page: string) => bskyTitle(page, unreadCountLabel) return ( ) -} +}) /** * The RoutesContainer should wrap all components which need access diff --git a/src/lib/hooks/useSetTitle.ts b/src/lib/hooks/useSetTitle.ts index 85ba44d299..c5c7a5ca16 100644 --- a/src/lib/hooks/useSetTitle.ts +++ b/src/lib/hooks/useSetTitle.ts @@ -3,11 +3,15 @@ import {useNavigation} from '@react-navigation/native' import {NavigationProp} from 'lib/routes/types' import {bskyTitle} from 'lib/strings/headings' -import {useUnreadCountLabel} from './useUnreadCountLabel' +import {useStores} from 'state/index' +/** + * Requires consuming component to be wrapped in `observer`: + * https://stackoverflow.com/a/71488009 + */ export function useSetTitle(title?: string) { const navigation = useNavigation() - const unreadCountLabel = useUnreadCountLabel() + const {unreadCountLabel} = useStores().me.notifications useEffect(() => { if (title) { navigation.setOptions({title: bskyTitle(title, unreadCountLabel)}) diff --git a/src/lib/hooks/useUnreadCountLabel.ts b/src/lib/hooks/useUnreadCountLabel.ts deleted file mode 100644 index e2bf77885d..0000000000 --- a/src/lib/hooks/useUnreadCountLabel.ts +++ /dev/null @@ -1,19 +0,0 @@ -import {useEffect, useReducer} from 'react' -import {DeviceEventEmitter} from 'react-native' -import {useStores} from 'state/index' - -export function useUnreadCountLabel() { - // HACK: We don't have anything like Redux selectors, - // and we don't want to use - // to react to the whole store - const [, forceUpdate] = useReducer(x => x + 1, 0) - useEffect(() => { - const subscription = DeviceEventEmitter.addListener( - 'unread-notifications', - forceUpdate, - ) - return () => subscription?.remove() - }, [forceUpdate]) - - return useStores().me.notifications.unreadCountLabel -} From 562faa76cce6e935295f30359cbd7180b912cec1 Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Wed, 17 May 2023 11:10:51 -0500 Subject: [PATCH 09/11] feat: add basic visual feedback on Button interactions (#708) * feat: add basic visual feedback on Button interaction * Use a more efficient approach to providing visual feedback * Fix some lint issues left over from another PR --------- Co-authored-by: Simek --- src/view/com/util/forms/Button.tsx | 17 ++++++++++++++++- src/view/shell/desktop/RightNav.tsx | 9 ++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/view/com/util/forms/Button.tsx b/src/view/com/util/forms/Button.tsx index a8f1f363f9..6a5f19f998 100644 --- a/src/view/com/util/forms/Button.tsx +++ b/src/view/com/util/forms/Button.tsx @@ -128,6 +128,7 @@ export function Button({ }, }, ) + const onPressWrapped = React.useCallback( (event: Event) => { event.stopPropagation() @@ -136,9 +137,23 @@ export function Button({ }, [onPress], ) + + const getStyle = React.useCallback( + state => { + const arr = [typeOuterStyle, styles.outer, style] + if (state.pressed) { + arr.push({opacity: 0.6}) + } else if (state.hovered) { + arr.push({opacity: 0.8}) + } + return arr + }, + [typeOuterStyle, style], + ) + return ( { store.shell.setDarkMode(!store.shell.darkMode) @@ -72,12 +72,11 @@ export const DesktopRightNav = observer(function DesktopRightNav() { : 'Sets display to dark mode' }> - { - mode === 'Dark' ? + {mode === 'Dark' ? ( - : + ) : ( - } + )} {otherMode} mode From f7f0db65d36506d1e32c3d349e4505136180afb0 Mon Sep 17 00:00:00 2001 From: renahlee Date: Tue, 16 May 2023 22:31:59 -0700 Subject: [PATCH 10/11] Update hint for notifications --- src/view/shell/Drawer.tsx | 6 +++++- src/view/shell/bottom-bar/BottomBar.tsx | 9 +++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/view/shell/Drawer.tsx b/src/view/shell/Drawer.tsx index d595bc524d..89e30002ee 100644 --- a/src/view/shell/Drawer.tsx +++ b/src/view/shell/Drawer.tsx @@ -222,7 +222,11 @@ export const DrawerContent = observer(() => { } label="Notifications" accessibilityLabel="Notifications" - accessibilityHint={`${store.me.notifications.unreadCountLabel} unread`} + accessibilityHint={ + notifications.unreadCountLabel === '' + ? 'No new notifications' + : `${notifications.unreadCountLabel} unread` + } count={notifications.unreadCountLabel} bold={isAtNotifications} onPress={onPressNotifications} diff --git a/src/view/shell/bottom-bar/BottomBar.tsx b/src/view/shell/bottom-bar/BottomBar.tsx index c11a0128c6..b057964c6f 100644 --- a/src/view/shell/bottom-bar/BottomBar.tsx +++ b/src/view/shell/bottom-bar/BottomBar.tsx @@ -38,6 +38,7 @@ export const BottomBar = observer(({navigation}: BottomTabBarProps) => { useNavigationTabState() const {footerMinimalShellTransform} = useMinimalShellMode() + const {notifications} = store.me const onPressTab = React.useCallback( (tab: string) => { @@ -138,11 +139,15 @@ export const BottomBar = observer(({navigation}: BottomTabBarProps) => { ) } onPress={onPressNotifications} - notificationCount={store.me.notifications.unreadCountLabel} + notificationCount={notifications.unreadCountLabel} accessible={true} accessibilityRole="tab" accessibilityLabel="Notifications" - accessibilityHint={`${store.me.notifications.unreadCountLabel} unread`} + accessibilityHint={ + notifications.unreadCountLabel === '' + ? 'No new notifications' + : `${notifications.unreadCountLabel} unread` + } /> Date: Wed, 17 May 2023 09:13:06 -0700 Subject: [PATCH 11/11] Update to empty hint if no notifications --- src/view/shell/Drawer.tsx | 2 +- src/view/shell/bottom-bar/BottomBar.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/view/shell/Drawer.tsx b/src/view/shell/Drawer.tsx index 89e30002ee..2ecdbaab29 100644 --- a/src/view/shell/Drawer.tsx +++ b/src/view/shell/Drawer.tsx @@ -224,7 +224,7 @@ export const DrawerContent = observer(() => { accessibilityLabel="Notifications" accessibilityHint={ notifications.unreadCountLabel === '' - ? 'No new notifications' + ? '' : `${notifications.unreadCountLabel} unread` } count={notifications.unreadCountLabel} diff --git a/src/view/shell/bottom-bar/BottomBar.tsx b/src/view/shell/bottom-bar/BottomBar.tsx index b057964c6f..ef9499f9fc 100644 --- a/src/view/shell/bottom-bar/BottomBar.tsx +++ b/src/view/shell/bottom-bar/BottomBar.tsx @@ -145,7 +145,7 @@ export const BottomBar = observer(({navigation}: BottomTabBarProps) => { accessibilityLabel="Notifications" accessibilityHint={ notifications.unreadCountLabel === '' - ? 'No new notifications' + ? '' : `${notifications.unreadCountLabel} unread` } />