@gluestack-ui-nightly/core
Version:
Universal UI components for React Native, Expo, and Next.js
58 lines • 2.22 kB
JSX
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