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 (