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;