import {useEffect, useLayoutEffect, useState} from 'react' import {StyleSheet, TouchableWithoutFeedback, View} from 'react-native' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useNavigation} from '@react-navigation/native' import {RemoveScrollBar} from 'react-remove-scroll-bar' import {useColorSchemeStyle} from '#/lib/hooks/useColorSchemeStyle' import {useIntentHandler} from '#/lib/hooks/useIntentHandler' import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' import {NavigationProp} from '#/lib/routes/types' import {colors} from '#/lib/styles' import {useIsDrawerOpen, useSetDrawerOpen} from '#/state/shell' import {useComposerKeyboardShortcut} from '#/state/shell/composer/useComposerKeyboardShortcut' import {useCloseAllActiveElements} from '#/state/util' import {Lightbox} from '#/view/com/lightbox/Lightbox' import {ModalsContainer} from '#/view/com/modals/Modal' import {ErrorBoundary} from '#/view/com/util/ErrorBoundary' import {atoms as a, select, useTheme} from '#/alf' import {MutedWordsDialog} from '#/components/dialogs/MutedWords' import {SigninDialog} from '#/components/dialogs/Signin' import {Outlet as PortalOutlet} from '#/components/Portal' import {FlatNavigator, RoutesContainer} from '#/Navigation' import {Composer} from './Composer.web' import {DrawerContent} from './Drawer' function ShellInner() { const t = useTheme() const isDrawerOpen = useIsDrawerOpen() const setDrawerOpen = useSetDrawerOpen() const {isDesktop} = useWebMediaQueries() const navigator = useNavigation() const closeAllActiveElements = useCloseAllActiveElements() const {_} = useLingui() const showDrawer = !isDesktop && isDrawerOpen const [showDrawerDelayedExit, setShowDrawerDelayedExit] = useState(showDrawer) useLayoutEffect(() => { if (showDrawer !== showDrawerDelayedExit) { if (showDrawer) { setShowDrawerDelayedExit(true) } else { const timeout = setTimeout(() => { setShowDrawerDelayedExit(false) }, 160) return () => clearTimeout(timeout) } } }, [showDrawer, showDrawerDelayedExit]) useComposerKeyboardShortcut() useIntentHandler() useEffect(() => { const unsubscribe = navigator.addListener('state', () => { closeAllActiveElements() }) return unsubscribe }, [navigator, closeAllActiveElements]) return ( <> {showDrawerDelayedExit && ( <> { // Only close if press happens outside of the drawer if (ev.target === ev.currentTarget) { setDrawerOpen(false) } }} accessibilityLabel={_(msg`Close drawer menu`)} accessibilityHint=""> )} ) } export const Shell: React.FC = function ShellImpl() { const pageBg = useColorSchemeStyle(styles.bgLight, styles.bgDark) return ( ) } const styles = StyleSheet.create({ bgLight: { backgroundColor: colors.white, }, bgDark: { backgroundColor: colors.black, // TODO }, drawerMask: { position: 'fixed', width: '100%', height: '100%', top: 0, left: 0, }, drawerContainer: { display: 'flex', position: 'fixed', top: 0, left: 0, height: '100%', width: 330, maxWidth: '80%', }, })