diff --git a/native/navigation/community-drawer-navigator.react.js b/native/navigation/community-drawer-navigator.react.js index e8b75fb9f..aa8474020 100644 --- a/native/navigation/community-drawer-navigator.react.js +++ b/native/navigation/community-drawer-navigator.react.js @@ -1,83 +1,84 @@ // @flow import type { DrawerNavigationHelpers, DrawerNavigationProp, } from '@react-navigation/core'; import { createDrawerNavigator } from '@react-navigation/drawer'; import * as React from 'react'; import { View, useWindowDimensions } from 'react-native'; import type { AppNavigationProp } from './app-navigator.react.js'; import CommunityDrawerContent from './community-drawer-content.react.js'; import { drawerSwipeEnabledSelector } from './nav-selectors.js'; import { NavContext } from './navigation-context.js'; import { TabNavigatorRouteName } from './route-names.js'; import type { NavigationRoute, ScreenParamList, CommunityDrawerParamList, } from './route-names.js'; import TabNavigator from './tab-navigator.react.js'; import { useStyles } from '../themes/colors.js'; const communityDrawerContent = () => ; export type CommunityDrawerNavigationProp< RouteName: $Keys = $Keys, > = DrawerNavigationProp; const Drawer = createDrawerNavigator< ScreenParamList, CommunityDrawerParamList, DrawerNavigationHelpers, >(); type Props = { +navigation: AppNavigationProp<'CommunityDrawerNavigator'>, +route: NavigationRoute<'CommunityDrawerNavigator'>, }; // eslint-disable-next-line no-unused-vars function CommunityDrawerNavigator(props: Props): React.Node { const styles = useStyles(unboundStyles); const navContext = React.useContext(NavContext); const swipeEnabled = React.useMemo( () => drawerSwipeEnabledSelector(navContext), [navContext], ); const { width: screenWidth } = useWindowDimensions(); const screenOptions = React.useMemo( () => ({ drawerStyle: styles.drawerStyle, headerShown: false, swipeEnabled, swipeEdgeWidth: screenWidth, + keyboardDismissMode: 'none', }), [styles.drawerStyle, swipeEnabled, screenWidth], ); return ( ); } const unboundStyles = { drawerView: { flex: 1, }, drawerStyle: { width: '80%', }, }; export { CommunityDrawerNavigator }; diff --git a/native/navigation/tab-navigator.react.js b/native/navigation/tab-navigator.react.js index 5ca771a16..734432fd7 100644 --- a/native/navigation/tab-navigator.react.js +++ b/native/navigation/tab-navigator.react.js @@ -1,228 +1,238 @@ // @flow import { BottomTabView } from '@react-navigation/bottom-tabs'; import type { BottomTabNavigationEventMap, BottomTabOptions, CreateNavigator, TabNavigationState, ParamListBase, BottomTabNavigationHelpers, BottomTabNavigationProp, ExtraBottomTabNavigatorProps, BottomTabNavigatorProps, TabAction, TabRouterOptions, } from '@react-navigation/core'; +import { useDrawerStatus } from '@react-navigation/drawer'; import { createNavigatorFactory, useNavigationBuilder, } from '@react-navigation/native'; import * as React from 'react'; +import { Keyboard } from 'react-native'; import { unreadCount } from 'lib/selectors/thread-selectors.js'; import CommunityDrawerButton from './community-drawer-button.react.js'; import type { CommunityDrawerNavigationProp } from './community-drawer-navigator.react.js'; import { CalendarRouteName, ChatRouteName, ProfileRouteName, AppsRouteName, type ScreenParamList, type TabParamList, type NavigationRoute, } from './route-names.js'; import { tabBar } from './tab-bar.react.js'; import TabRouter from './tab-router.js'; import AppsDirectory from '../apps/apps-directory.react.js'; import Calendar from '../calendar/calendar.react.js'; import Chat from '../chat/chat.react.js'; import SWMansionIcon from '../components/swmansion-icon.react.js'; import Profile from '../profile/profile.react.js'; import { useSelector } from '../redux/redux-utils.js'; import { useColors } from '../themes/colors.js'; const calendarTabOptions = { tabBarLabel: 'Calendar', tabBarIcon: ({ color }: { +color: string, ... }) => ( ), }; const getChatTabOptions = (badge: number) => ({ tabBarLabel: 'Inbox', tabBarIcon: ({ color }: { +color: string, ... }) => ( ), tabBarBadge: badge ? badge : undefined, }); const profileTabOptions = { tabBarLabel: 'Profile', tabBarIcon: ({ color }: { +color: string, ... }) => ( ), }; const appsTabOptions = { tabBarLabel: 'Apps', tabBarIcon: ({ color }: { +color: string, ... }) => ( ), }; export type CustomBottomTabNavigationHelpers< ParamList: ParamListBase = ParamListBase, > = { ...$Exact>, ... }; export type TabNavigationProp< RouteName: $Keys = $Keys, > = BottomTabNavigationProp; type TabNavigatorProps = BottomTabNavigatorProps< CustomBottomTabNavigationHelpers<>, >; const TabNavigator = React.memo(function TabNavigator({ id, initialRouteName, backBehavior, children, screenListeners, screenOptions, defaultScreenOptions, ...rest }: TabNavigatorProps) { const { state, descriptors, navigation } = useNavigationBuilder< TabNavigationState, TabAction, BottomTabOptions, TabRouterOptions, CustomBottomTabNavigationHelpers<>, BottomTabNavigationEventMap, ExtraBottomTabNavigatorProps, >(TabRouter, { id, initialRouteName, backBehavior, children, screenListeners, screenOptions, defaultScreenOptions, }); return ( ); }); const createTabNavigator: CreateNavigator< TabNavigationState, BottomTabOptions, BottomTabNavigationEventMap, ExtraBottomTabNavigatorProps, > = createNavigatorFactory< TabNavigationState, BottomTabOptions, BottomTabNavigationEventMap, BottomTabNavigationHelpers<>, ExtraBottomTabNavigatorProps, >(TabNavigator); const Tab = createTabNavigator< ScreenParamList, TabParamList, BottomTabNavigationHelpers, >(); type Props = { +navigation: CommunityDrawerNavigationProp<'TabNavigator'>, +route: NavigationRoute<'TabNavigator'>, }; function TabComponent(props: Props): React.Node { const colors = useColors(); const chatBadge = useSelector(unreadCount); const isCalendarEnabled = useSelector(state => state.enabledApps.calendar); let calendarTab; if (isCalendarEnabled) { calendarTab = ( ); } const headerLeft = React.useCallback( () => , [props.navigation], ); const appsOptions = React.useMemo( () => ({ ...appsTabOptions, headerShown: true, headerLeft, headerStyle: { backgroundColor: colors.tabBarBackground, }, headerShadowVisible: false, }), [colors.tabBarBackground, headerLeft], ); const tabBarScreenOptions = React.useMemo( () => ({ headerShown: false, tabBarHideOnKeyboard: false, tabBarActiveTintColor: colors.tabBarActiveTintColor, tabBarStyle: { backgroundColor: colors.tabBarBackground, borderTopWidth: 1, }, lazy: false, }), [colors.tabBarActiveTintColor, colors.tabBarBackground], ); + const drawerStatus = useDrawerStatus(); + const isDrawerOpen = drawerStatus === 'open'; + React.useEffect(() => { + if (isDrawerOpen) { + Keyboard.dismiss(); + } + }, [isDrawerOpen]); + return ( {calendarTab} ); } const styles = { icon: { fontSize: 28, }, }; export default TabComponent;