import React from 'react' import { Animated, GestureResponderEvent, TouchableOpacity, View, } from 'react-native' import {StackActions, useNavigationState} 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' import {useStores} from 'state/index' import {useAnalytics} from 'lib/analytics' import {clamp} from 'lib/numbers' import { HomeIcon, HomeIconSolid, MagnifyingGlassIcon2, MagnifyingGlassIcon2Solid, BellIcon, BellIconSolid, UserIcon, } from 'lib/icons' import {usePalette} from 'lib/hooks/usePalette' import {getTabState, TabState} from 'lib/routes/helpers' import {styles} from './BottomBarStyles' import {useMinimalShellMode} from 'lib/hooks/useMinimalShellMode' export const BottomBar = observer(({navigation}: BottomTabBarProps) => { const store = useStores() const pal = usePalette('default') const safeAreaInsets = useSafeAreaInsets() const {track} = useAnalytics() const {isAtHome, isAtSearch, isAtNotifications} = useNavigationState( state => { const res = { isAtHome: getTabState(state, 'Home') !== TabState.Outside, isAtSearch: getTabState(state, 'Search') !== TabState.Outside, isAtNotifications: getTabState(state, 'Notifications') !== TabState.Outside, } if (!res.isAtHome && !res.isAtNotifications && !res.isAtSearch) { // HACK for some reason useNavigationState will give us pre-hydration results // and not update after, so we force isAtHome if all came back false // -prf res.isAtHome = true } return res }, ) const {footerMinimalShellTransform} = useMinimalShellMode() const onPressTab = React.useCallback( (tab: string) => { track(`MobileShell:${tab}ButtonPressed`) const state = navigation.getState() const tabState = getTabState(state, tab) if (tabState === TabState.InsideAtRoot) { store.emitScreenSoftReset() } else if (tabState === TabState.Inside) { navigation.dispatch(StackActions.popToTop()) } else { navigation.navigate(`${tab}Tab`) } }, [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') navigation.navigate('Profile', {name: store.me.handle}) }, [navigation, track, store.me.handle]) return ( ) : ( ) } onPress={onPressHome} /> ) : ( ) } onPress={onPressSearch} /> ) : ( ) } onPress={onPressNotifications} notificationCount={ store.me.notifications.unreadCount + store.invitedUsers.numNotifs } /> } onPress={onPressProfile} /> ) }) function Btn({ testID, icon, notificationCount, onPress, onLongPress, }: { testID?: string icon: JSX.Element notificationCount?: number onPress?: (event: GestureResponderEvent) => void onLongPress?: (event: GestureResponderEvent) => void }) { return ( {notificationCount ? ( {notificationCount} ) : undefined} {icon} ) }