UNPKG

native-base

Version:

Essential cross-platform UI components for React Native

186 lines (155 loc) 6.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Transition = void 0; var _react = _interopRequireWildcard(require("react")); var _reactNative = require("react-native"); function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } const transformStylesMap = { translateY: true, translateX: true, scale: true, scaleX: true, scaleY: true, rotate: true }; const defaultStyles = { opacity: 1, translateY: 0, translateX: 0, scale: 1, scaleX: 1, scaleY: 1, rotate: '0deg' }; const getAnimatedStyles = animateValue => (initial, to) => { const styles = { transform: [] }; for (let key in initial) { if (key === 'transition') { continue; } if (key in transformStylesMap) { var _styles$transform; (_styles$transform = styles.transform) === null || _styles$transform === void 0 ? void 0 : _styles$transform.push({ [key]: animateValue.interpolate({ inputRange: [0, 1], outputRange: [initial[key], to[key]] }) }); } else { styles[key] = animateValue.interpolate({ inputRange: [0, 1], outputRange: [initial[key], to[key]] }); } } return styles; }; const defaultTransitionConfig = { type: 'timing', useNativeDriver: true, duration: 250, delay: 0 }; const Transition = /*#__PURE__*/(0, _react.forwardRef)(({ children, onTransitionComplete, visible = false, initial, animate, exit, style, as, ...rest }, ref) => { const animateValue = _react.default.useRef(new _reactNative.Animated.Value(0)).current; const Component = _react.default.useMemo(() => { if (as) { return _reactNative.Animated.createAnimatedComponent(as); } return _reactNative.Animated.View; }, [as]); const [animationState, setAnimationState] = _react.default.useState(''); const prevVisible = _react.default.useRef(visible); _react.default.useEffect(() => { if (animationState === 'entering' || animationState === 'exiting') { var _transition$type; const entryTransition = { ...defaultTransitionConfig, ...(animate === null || animate === void 0 ? void 0 : animate.transition) }; const exitTransition = { ...defaultTransitionConfig, ...(exit === null || exit === void 0 ? void 0 : exit.transition) }; const startAnimation = animationState === 'entering' ? 1 : 0; const transition = startAnimation ? entryTransition : exitTransition; _reactNative.Animated.sequence([// @ts-ignore - delay is present in defaultTransitionConfig _reactNative.Animated.delay(transition.delay), _reactNative.Animated[(_transition$type = transition.type) !== null && _transition$type !== void 0 ? _transition$type : 'timing'](animateValue, { toValue: startAnimation, useNativeDriver: true, ...transition })]).start(() => { if (animationState === 'entering') { setAnimationState('entered'); } else if (animationState === 'exiting') { setAnimationState('exited'); } }); // }); } if (animationState === 'exited') { onTransitionComplete && onTransitionComplete('exited'); } else if (animationState === 'entered') { onTransitionComplete && onTransitionComplete('entered'); } // if (animationState === 'entering') { // // // } // eslint-disable-next-line react-hooks/exhaustive-deps }, [animationState, onTransitionComplete]); _react.default.useEffect(() => { // if (!visible) { if (prevVisible.current !== visible && !visible) { setAnimationState('exiting'); } if (visible) { setAnimationState('entering'); } prevVisible.current = visible; // } }, [visible]); // If exit animation is present and state is exiting, we replace 'initial' with 'exit' animation // const initialState = { ...defaultStyles, ...initial }; const initialState = animationState === 'exited' && exit ? { ...defaultStyles, ...exit } : { ...defaultStyles, ...initial }; // const initialState = { ...defaultStyles, ...initial }; // initial = // animationState === 'exited' // ? { ...defaultStyles, ...exit } // : { ...defaultStyles, ...initial }; const animateState = { ...defaultStyles, ...animate }; // const [initialState, setInitialState] = React.useState({ // ...defaultStyles, // ...initial, // }); // console.log('Initial state ', initial); // const [animateState] = React.useState({ ...defaultStyles, ...animate }); const styles = _react.default.useMemo(() => { // console.log('display state here', initial); return [getAnimatedStyles(animateValue)(initialState, animateState), style]; }, [animateValue, initial, animate, style]); return /*#__PURE__*/_react.default.createElement(Component // pointerEvents="box-none" , _extends({ pointerEvents: !visible ? 'none' : 'box-none' // https://github.com/facebook/react-native/issues/23090#issuecomment-710803743 // needsOffscreenAlphaCompositing // style={[styles]} , style: [styles], ref: ref }, rest), children); }); exports.Transition = Transition; //# sourceMappingURL=Transition.js.map