diff options
author | Eric Bailey <git@esb.lol> | 2023-11-07 13:37:47 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-07 11:37:47 -0800 |
commit | bfe196bac5e618bfbeab4f6fabef3e5a18194868 (patch) | |
tree | f3fd74b8472f5bcd3bbcf3b111a0f19b059de404 /src/view/shell/index.tsx | |
parent | 7158157f5fe07b8f97842736ea87b598baabb7da (diff) | |
download | voidsky-bfe196bac5e618bfbeab4f6fabef3e5a18194868.tar.zst |
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 <pfrazee@gmail.com>
Diffstat (limited to 'src/view/shell/index.tsx')
-rw-r--r-- | src/view/shell/index.tsx | 37 |
1 files changed, 25 insertions, 12 deletions
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(() => <DrawerContent />, []) 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() { <ErrorBoundary> <Drawer renderDrawerContent={renderDrawerContent} - open={store.shell.isDrawerOpen} + open={isDrawerOpen} onOpen={onOpenDrawer} onClose={onCloseDrawer} swipeEdgeWidth={winDim.width / 2} swipeEnabled={ - !canGoBack && - store.session.hasSession && - !store.shell.isDrawerSwipeDisabled + !canGoBack && store.session.hasSession && !isDrawerSwipeDisabled }> <TabsNavigator /> </Drawer> |