UNPKG

@gluestack-ui-nightly/core

Version:

Universal UI components for React Native, Expo, and Next.js

58 lines 2.22 kB
import { ExitAnimationContext } from '../../overlay/creator'; import React, { forwardRef } from 'react'; import { Animated } from 'react-native'; const defaultTransitionConfig = { type: 'timing', useNativeDriver: true, duration: 0, delay: 0, }; export const OverlayAnimatePresence = forwardRef(({ children, visible = false, AnimatePresence, onExit }, ref) => { const animateValue = React.useRef(new Animated.Value(0)).current; const [animationState, setAnimationState] = React.useState(''); const prevVisible = React.useRef(visible); const { setExited } = React.useContext(ExitAnimationContext); React.useEffect(() => { var _a; if (animationState === 'entering' || animationState === 'exiting') { const startAnimation = animationState === 'entering' ? 1 : 0; const transition = defaultTransitionConfig; if (AnimatePresence) { Animated.sequence([ Animated[(_a = transition.type) !== null && _a !== void 0 ? _a : 'timing'](animateValue, { toValue: startAnimation, useNativeDriver: true, }), ]).start(() => { if (animationState === 'entering') { setAnimationState('entered'); } else if (animationState === 'exiting') { setAnimationState('exited'); } }); } } if (animationState === 'exited') { setExited(true); onExit(); } else if (animationState === 'entered') { setExited(false); } }, [animationState]); React.useEffect(() => { if (prevVisible.current !== visible && !visible) { setAnimationState('exiting'); } if (visible) { setAnimationState('entering'); } prevVisible.current = visible; }, [visible]); if (!AnimatePresence) { return children; } return (<AnimatePresence ref={ref}>{visible ? children : null}</AnimatePresence>); }); //# sourceMappingURL=OverlayAnimatePresence.jsx.map