From bfe196bac5e618bfbeab4f6fabef3e5a18194868 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 7 Nov 2023 13:37:47 -0600 Subject: Extract shell state into separate context (#1824) * WIP * Add shell state * Integrate new shell state for drawer and minimal shell mode * Replace isDrawerSwipeDisabled * Split shell state into separate contexts to avoid needless re-renders * Fix typo --------- Co-authored-by: Paul Frazee --- src/view/shell/index.tsx | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) (limited to 'src/view/shell/index.tsx') diff --git a/src/view/shell/index.tsx b/src/view/shell/index.tsx index b564f99f8..703edf27a 100644 --- a/src/view/shell/index.tsx +++ b/src/view/shell/index.tsx @@ -6,6 +6,7 @@ import { StyleSheet, useWindowDimensions, View, + BackHandler, } from 'react-native' import {useSafeAreaInsets} from 'react-native-safe-area-context' import {Drawer} from 'react-native-drawer-layout' @@ -18,7 +19,6 @@ import {DrawerContent} from './Drawer' import {Composer} from './Composer' import {useTheme} from 'lib/ThemeContext' import {usePalette} from 'lib/hooks/usePalette' -import * as backHandler from 'lib/routes/back-handler' import {RoutesContainer, TabsNavigator} from '../../Navigation' import {isStateAtTabRoot} from 'lib/routes/helpers' import { @@ -26,9 +26,18 @@ import { initialWindowMetrics, } from 'react-native-safe-area-context' import {useOTAUpdate} from 'lib/hooks/useOTAUpdate' +import { + useIsDrawerOpen, + useSetDrawerOpen, + useIsDrawerSwipeDisabled, +} from '#/state/shell' +import {isAndroid} from 'platform/detection' const ShellInner = observer(function ShellInnerImpl() { const store = useStores() + const isDrawerOpen = useIsDrawerOpen() + const isDrawerSwipeDisabled = useIsDrawerSwipeDisabled() + const setIsDrawerOpen = useSetDrawerOpen() useOTAUpdate() // this hook polls for OTA updates every few seconds const winDim = useWindowDimensions() const safeAreaInsets = useSafeAreaInsets() @@ -38,20 +47,26 @@ const ShellInner = observer(function ShellInnerImpl() { ) const renderDrawerContent = React.useCallback(() => , []) const onOpenDrawer = React.useCallback( - () => store.shell.openDrawer(), - [store], + () => setIsDrawerOpen(true), + [setIsDrawerOpen], ) const onCloseDrawer = React.useCallback( - () => store.shell.closeDrawer(), - [store], + () => setIsDrawerOpen(false), + [setIsDrawerOpen], ) const canGoBack = useNavigationState(state => !isStateAtTabRoot(state)) React.useEffect(() => { - const listener = backHandler.init(store) + let listener = {remove() {}} + if (isAndroid) { + listener = BackHandler.addEventListener('hardwareBackPress', () => { + setIsDrawerOpen(false) + return store.shell.closeAnyActiveElement() + }) + } return () => { - listener() + listener.remove() } - }, [store]) + }, [store, setIsDrawerOpen]) return ( <> @@ -59,14 +74,12 @@ const ShellInner = observer(function ShellInnerImpl() { -- cgit 1.4.1