diff --git a/src/view/screens.tsx b/src/view/screens.tsx index 00cfb95652..3d49b8eabe 100644 --- a/src/view/screens.tsx +++ b/src/view/screens.tsx @@ -12,6 +12,8 @@ import { State, } from 'lib/routes/types' +import {BottomBar} from './shell/BottomBar' + import {HomeScreen} from './screens/Home' import {SearchScreen} from './screens/Search' import {NotificationsScreen} from './screens/Notifications' @@ -167,7 +169,7 @@ function HomeDrawerNavigator() { return ( + screenOptions={{swipeEdgeWidth: 300, headerShown: false}}> ) @@ -176,7 +178,11 @@ function HomeDrawerNavigator() { function HomeStackNavigator() { return ( + screenOptions={{ + gestureEnabled: true, + fullScreenGestureEnabled: true, + headerShown: false, + }}> {commonScreens(HomeStack)} @@ -187,7 +193,7 @@ function NotificationsDrawerNavigator() { return ( + screenOptions={{swipeEdgeWidth: 300, headerShown: false}}> + screenOptions={{ + gestureEnabled: true, + fullScreenGestureEnabled: true, + headerShown: false, + }}> + screenOptions={{swipeEdgeWidth: 300, headerShown: false}}> ) @@ -222,7 +232,11 @@ function SearchDrawerNavigator() { function SearchStackNavigator() { return ( + screenOptions={{ + gestureEnabled: true, + fullScreenGestureEnabled: true, + headerShown: false, + }}> {commonScreens(SearchStack)} @@ -230,17 +244,20 @@ function SearchStackNavigator() { } function TabsNavigator() { + const tabBar = React.useCallback(props => , []) return ( - - - - - - - + + + + + ) } diff --git a/src/view/shell/mobile/BottomBar.tsx b/src/view/shell/BottomBar.tsx similarity index 75% rename from src/view/shell/mobile/BottomBar.tsx rename to src/view/shell/BottomBar.tsx index 73c2501abc..100866f747 100644 --- a/src/view/shell/mobile/BottomBar.tsx +++ b/src/view/shell/BottomBar.tsx @@ -6,6 +6,8 @@ import { TouchableOpacity, View, } from 'react-native' +import {StackActions} from '@react-navigation/native' +import {BottomTabBarProps} from '@react-navigation/bottom-tabs' import {useSafeAreaInsets} from 'react-native-safe-area-context' import {observer} from 'mobx-react-lite' import {Text} from 'view/com/util/text/Text' @@ -26,7 +28,15 @@ import { import {colors} from 'lib/styles' import {usePalette} from 'lib/hooks/usePalette' -export const BottomBar = observer(() => { +function currentRoute(state) { + let node = state.routes[state.index] + while (node.state?.routes && typeof node.state?.index === 'number') { + node = node.state?.routes[node.state?.index] + } + return node +} + +export const BottomBar = observer(({navigation}: BottomTabBarProps) => { const store = useStores() const pal = usePalette('default') const minimalShellInterp = useAnimatedValue(0) @@ -54,62 +64,40 @@ export const BottomBar = observer(() => { transform: [{translateY: Animated.multiply(minimalShellInterp, 100)}], } - const onPressHome = React.useCallback(() => { - track('MobileShell:HomeButtonPressed') - if (store.nav.tab.fixedTabPurpose === TabPurpose.Default) { - if (!store.nav.tab.canGoBack) { + const onPressTab = React.useCallback( + (tab: string) => { + track(`MobileShell:${tab}ButtonPressed`) + const state = navigation.getState() + const curr = currentRoute(state).name + if (curr === tab || curr === `${tab}Stack`) { store.emitScreenSoftReset() + } else if (state.routes[state.index].name === `${tab}Stack`) { + navigation.dispatch(StackActions.popToTop()) } else { - store.nav.tab.fixedTabReset() + navigation.navigate(`${tab}Stack`) } - } else { - store.nav.switchTo(TabPurpose.Default, false) - if (store.nav.tab.index === 0) { - store.nav.tab.fixedTabReset() - } - } - }, [store, track]) - const onPressSearch = React.useCallback(() => { - track('MobileShell:SearchButtonPressed') - if (store.nav.tab.fixedTabPurpose === TabPurpose.Search) { - if (!store.nav.tab.canGoBack) { - store.emitScreenSoftReset() - } else { - store.nav.tab.fixedTabReset() - } - } else { - store.nav.switchTo(TabPurpose.Search, false) - if (store.nav.tab.index === 0) { - store.nav.tab.fixedTabReset() - } - } - }, [store, track]) - const onPressNotifications = React.useCallback(() => { - track('MobileShell:NotificationsButtonPressed') - if (store.nav.tab.fixedTabPurpose === TabPurpose.Notifs) { - if (!store.nav.tab.canGoBack) { - store.emitScreenSoftReset() - } else { - store.nav.tab.fixedTabReset() - } - } else { - store.nav.switchTo(TabPurpose.Notifs, false) - if (store.nav.tab.index === 0) { - store.nav.tab.fixedTabReset() - } - } - }, [store, track]) + }, + [store, track, navigation], + ) + const onPressHome = React.useCallback(() => onPressTab('Home'), [onPressTab]) + const onPressSearch = React.useCallback( + () => onPressTab('Search'), + [onPressTab], + ) + const onPressNotifications = React.useCallback( + () => onPressTab('Notifications'), + [onPressTab], + ) const onPressProfile = React.useCallback(() => { track('MobileShell:ProfileButtonPressed') - store.nav.navigate(`/profile/${store.me.handle}`) - }, [store, track]) + navigation.navigate('Profile', {name: store.me.handle}) + }, [navigation, track, store.me.handle]) - const isAtHome = - store.nav.tab.current.url === TabPurposeMainPath[TabPurpose.Default] - const isAtSearch = - store.nav.tab.current.url === TabPurposeMainPath[TabPurpose.Search] + const curr = currentRoute(navigation.getState()).name + const isAtHome = curr === 'HomeStack' || curr === 'Home' + const isAtSearch = curr === 'SearchStack' || curr === 'Search' const isAtNotifications = - store.nav.tab.current.url === TabPurposeMainPath[TabPurpose.Notifs] + curr === 'NotificationsStack' || curr === 'Notifications' return (