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 {useIntentHandler} from '#/lib/hooks/useIntentHandler' import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' import {type NavigationProp} from '#/lib/routes/types' import {useGeolocation} from '#/state/geolocation' 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 {AgeAssuranceRedirectDialog} from '#/components/ageAssurance/AgeAssuranceRedirectDialog' import {BlockedGeoOverlay} from '#/components/BlockedGeoOverlay' import {EmailDialog} from '#/components/dialogs/EmailDialog' import {LinkWarningDialog} from '#/components/dialogs/LinkWarning' import {MutedWordsDialog} from '#/components/dialogs/MutedWords' import {SigninDialog} from '#/components/dialogs/Signin' import { Outlet as PolicyUpdateOverlayPortalOutlet, usePolicyUpdateContext, } from '#/components/PolicyUpdateOverlay' 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) const {state: policyUpdateState} = usePolicyUpdateContext() 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 ( <> {/* Until policy update has been completed by the user, don't render anything that is portaled */} {policyUpdateState.completed && ( <> )} {showDrawerDelayedExit && ( <> { // Only close if press happens outside of the drawer if (ev.target === ev.currentTarget) { setDrawerOpen(false) } }} accessibilityLabel={_(msg`Close drawer menu`)} accessibilityHint=""> )} ) } export function Shell() { const t = useTheme() const {geolocation} = useGeolocation() return ( {geolocation?.isAgeBlockedGeo ? ( ) : ( )} ) } const styles = StyleSheet.create({ drawerMask: { ...a.fixed, width: '100%', height: '100%', top: 0, left: 0, }, drawerContainer: { display: 'flex', ...a.fixed, top: 0, left: 0, height: '100%', width: 330, maxWidth: '80%', }, })