import {createContext, useCallback, useContext} from 'react' import {type GestureResponderEvent, Keyboard, View} from 'react-native' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useNavigation} from '@react-navigation/native' import {HITSLOP_30} from '#/lib/constants' import {type NavigationProp} from '#/lib/routes/types' import {isIOS} from '#/platform/detection' import {useSetDrawerOpen} from '#/state/shell' import { atoms as a, platform, type TextStyleProp, useBreakpoints, useGutters, useLayoutBreakpoints, useTheme, web, } from '#/alf' import {Button, ButtonIcon, type ButtonProps} from '#/components/Button' import {ArrowLeft_Stroke2_Corner0_Rounded as ArrowLeft} from '#/components/icons/Arrow' import {Menu_Stroke2_Corner0_Rounded as Menu} from '#/components/icons/Menu' import { BUTTON_VISUAL_ALIGNMENT_OFFSET, CENTER_COLUMN_OFFSET, HEADER_SLOT_SIZE, SCROLLBAR_OFFSET, } from '#/components/Layout/const' import {ScrollbarOffsetContext} from '#/components/Layout/context' import {Text} from '#/components/Typography' export function Outer({ children, noBottomBorder, headerRef, sticky = true, }: { children: React.ReactNode noBottomBorder?: boolean headerRef?: React.MutableRefObject sticky?: boolean }) { const t = useTheme() const gutters = useGutters([0, 'base']) const {gtMobile} = useBreakpoints() const {isWithinOffsetView} = useContext(ScrollbarOffsetContext) const {centerColumnOffset} = useLayoutBreakpoints() return ( {children} ) } const AlignmentContext = createContext<'platform' | 'left'>('platform') export function Content({ children, align = 'platform', }: { children?: React.ReactNode align?: 'platform' | 'left' }) { return ( {children} ) } export function Slot({children}: {children?: React.ReactNode}) { return {children} } export function BackButton({onPress, style, ...props}: Partial) { const {_} = useLingui() const navigation = useNavigation() const onPressBack = useCallback( (evt: GestureResponderEvent) => { onPress?.(evt) if (evt.defaultPrevented) return if (navigation.canGoBack()) { navigation.goBack() } else { navigation.navigate('Home') } }, [onPress, navigation], ) return ( ) } export function MenuButton() { const {_} = useLingui() const setDrawerOpen = useSetDrawerOpen() const {gtMobile} = useBreakpoints() const onPress = useCallback(() => { Keyboard.dismiss() setDrawerOpen(true) }, [setDrawerOpen]) return gtMobile ? null : ( ) } export function TitleText({ children, style, }: {children: React.ReactNode} & TextStyleProp) { const {gtMobile} = useBreakpoints() const align = useContext(AlignmentContext) return ( {children} ) } export function SubtitleText({children}: {children: React.ReactNode}) { const t = useTheme() const align = useContext(AlignmentContext) return ( {children} ) }