import React, {useContext, useMemo} from 'react' import {StyleSheet, View, ViewProps, ViewStyle} from 'react-native' import {StyleProp} from 'react-native' import { KeyboardAwareScrollView, KeyboardAwareScrollViewProps, } from 'react-native-keyboard-controller' import Animated, { AnimatedScrollViewProps, useAnimatedProps, } from 'react-native-reanimated' import {useSafeAreaInsets} from 'react-native-safe-area-context' import {isWeb} from '#/platform/detection' import {useShellLayout} from '#/state/shell/shell-layout' import {atoms as a, useBreakpoints, useTheme, web} from '#/alf' import {ScrollbarOffsetContext} from '#/components/Layout/context' export * from '#/components/Layout/const' export * as Header from '#/components/Layout/Header' export type ScreenProps = React.ComponentProps & { style?: StyleProp noInsetTop?: boolean } /** * Outermost component of every screen */ export const Screen = React.memo(function Screen({ style, noInsetTop, ...props }: ScreenProps) { const {top} = useSafeAreaInsets() return ( <> {isWeb && } ) }) export type ContentProps = AnimatedScrollViewProps & { style?: StyleProp contentContainerStyle?: StyleProp } /** * Default scroll view for simple pages */ export const Content = React.memo(function Content({ children, style, contentContainerStyle, ...props }: ContentProps) { const t = useTheme() const {footerHeight} = useShellLayout() const animatedProps = useAnimatedProps(() => { return { scrollIndicatorInsets: { bottom: footerHeight.get(), top: 0, right: 1, }, } satisfies AnimatedScrollViewProps }) return ( {isWeb ? ( // @ts-ignore web only -esb
{children}
) : ( children )}
) }) const scrollViewStyles = StyleSheet.create({ common: { width: '100%', }, contentContainer: { paddingBottom: 100, }, }) export type KeyboardAwareContentProps = KeyboardAwareScrollViewProps & { children: React.ReactNode contentContainerStyle?: StyleProp } /** * Default scroll view for simple pages. * * BE SURE TO TEST THIS WHEN USING, it's untested as of writing this comment. */ export const KeyboardAwareContent = React.memo(function LayoutScrollView({ children, style, contentContainerStyle, ...props }: KeyboardAwareContentProps) { return ( {isWeb ?
{children}
: children}
) }) /** * Utility component to center content within the screen */ export const Center = React.memo(function LayoutContent({ children, style, ...props }: ViewProps) { const {isWithinOffsetView} = useContext(ScrollbarOffsetContext) const {gtMobile} = useBreakpoints() const ctx = useMemo(() => ({isWithinOffsetView: true}), []) return ( {children} ) }) /** * Only used within `Layout.Screen`, not for reuse */ const WebCenterBorders = React.memo(function LayoutContent() { const t = useTheme() const {gtMobile} = useBreakpoints() return gtMobile ? ( ) : null })