import React from "react"; import { equals } from "ramda"; import { Animated, ViewProps, ViewStyle } from "react-native"; import { useScreenOrientationHandler } from "@applicaster/zapp-react-native-ui-components/Components/Screen/orientationHandler"; import { useMemoizedSafeAreaFrameWithActiveState } from "@applicaster/zapp-react-native-ui-components/Components/Screen/hooks"; import { PathnameContext } from "../../Contexts/PathnameContext"; import { ScreenDataContext } from "../../Contexts/ScreenDataContext"; import { ScreenContextProvider } from "../../Contexts/ScreenContext"; const fullWidthDimensions = { height: "100%", width: "100%", }; type Props = { children: any; style: any; pointerEvents: ViewProps["pointerEvents"]; overlayStyle: ViewStyle; animating: boolean; contentStyle: ViewStyle; pathname: string; isActive: boolean; screenData: NavigationScreenData; }; export function CurrentScreenContextProvider({ children, ...props }: { children: any; pathname: string; isActive: boolean; screenData: NavigationScreenData; }) { const { pathname, isActive = false, screenData } = props; const [initialScreenData, setInitialScreenData] = React.useState(screenData); React.useLayoutEffect(() => { const screenDataChanged = !equals(initialScreenData, screenData); if (isActive && screenDataChanged) { setInitialScreenData(screenData); } }, [initialScreenData, screenData, isActive]); return ( {children} ); } const withCurrentScreenContext = (Component) => function SceneComponent(props: Props) { return ( ); }; /** * Animated View container for any purpose. * Renders given children with given style object. * Optional property: pointer event (e.g. to prevent interaction with animating scene). * @param {React.Component} children Just about anything * @param {object} style Container style * @param {} pointerEvents box-none|none|box-only|auto (default) * @param overlayStyle * @param animating * @param contentStyle * @param screenUniqueId */ function SceneComponent({ children, style, pointerEvents = "auto", overlayStyle, animating, contentStyle, isActive = false, screenData, }: Props) { useScreenOrientationHandler({ screenData, isActive, }); // Use shared memoized frame hook - synchronized with useWaitForValidOrientation // to prevent race conditions during orientation changes // Pass isActive from props since Scene knows its active state from Transitioner const memoFrame = useMemoizedSafeAreaFrameWithActiveState({ updateForInactiveScreens: false, isActive, }); const isAnimating = animating && overlayStyle; const dimensions = isAnimating ? fullWidthDimensions : memoFrame; return ( {children} {isAnimating ? : null} ); } export const Scene = withCurrentScreenContext(SceneComponent);