import useWebsocket from '@api/websocket' import haptics from '@components/haptics' import Icon from '@components/Icon' import { BottomTabNavigationOptions, createBottomTabNavigator } from '@react-navigation/bottom-tabs' import { NavigatorScreenParams } from '@react-navigation/native' import { StackScreenProps } from '@react-navigation/stack' import { useTimelineQuery } from '@utils/queryHooks/timeline' import { getPreviousTab } from '@utils/slices/contextsSlice' import { getInstanceAccount, getInstanceActive, getInstanceNotification, updateInstanceNotification } from '@utils/slices/instancesSlice' import { useTheme } from '@utils/styles/ThemeManager' import React, { useCallback, useMemo } from 'react' import { Platform } from 'react-native' import FastImage from 'react-native-fast-image' import { useDispatch, useSelector } from 'react-redux' import TabLocal from './Tabs/Local' import TabMe from './Tabs/Me' import TabNotifications from './Tabs/Notifications' import TabPublic from './Tabs/Public' export type ScreenTabsParamList = { 'Tab-Local': NavigatorScreenParams 'Tab-Public': NavigatorScreenParams 'Tab-Compose': NavigatorScreenParams 'Tab-Notifications': NavigatorScreenParams 'Tab-Me': NavigatorScreenParams } export type ScreenTabsProp = StackScreenProps< Nav.RootStackParamList, 'Screen-Tabs' > const Tab = createBottomTabNavigator() const ScreenTabs = React.memo( ({ navigation }: ScreenTabsProp) => { const { mode, theme } = useTheme() const dispatch = useDispatch() const instanceActive = useSelector(getInstanceActive) const localAccount = useSelector( getInstanceAccount, (prev, next) => prev?.avatarStatic === next?.avatarStatic ) const screenOptions = useCallback( ({ route }): BottomTabNavigationOptions => ({ tabBarVisible: instanceActive !== -1, tabBarIcon: ({ focused, color, size }: { focused: boolean color: string size: number }) => { switch (route.name) { case 'Tab-Local': return case 'Tab-Public': return case 'Tab-Compose': return case 'Tab-Notifications': return case 'Tab-Me': return instanceActive !== -1 ? ( ) : ( ) default: return } } }), [instanceActive, localAccount?.avatarStatic] ) const tabBarOptions = useMemo( () => ({ activeTintColor: theme.primary, inactiveTintColor: theme.secondary, showLabel: false, ...(Platform.OS === 'android' && { keyboardHidesTabBar: true }) }), [mode] ) const composeListeners = useMemo( () => ({ tabPress: (e: any) => { e.preventDefault() haptics('Light') navigation.navigate('Screen-Compose') } }), [] ) const composeComponent = useCallback(() => null, []) // On launch check if there is any unread noficiations useTimelineQuery({ page: 'Notifications', options: { enabled: instanceActive !== -1, notifyOnChangeProps: [], select: data => { if (data.pages[0].body.length) { dispatch( updateInstanceNotification({ // @ts-ignore latestTime: data.pages[0].body[0].created_at }) ) } return data } } }) useWebsocket({ stream: 'user', event: 'notification' }) const localNotification = useSelector( getInstanceNotification, (prev, next) => prev?.readTime === next?.readTime && prev?.latestTime === next?.latestTime ) const previousTab = useSelector(getPreviousTab, () => true) return ( ) }, () => true ) export default ScreenTabs