UNPKG

@appbuckets/react-ui

Version:
189 lines (182 loc) 5.79 kB
'use strict'; var tslib = require('tslib'); var React = require('react'); var clsx = require('clsx'); var reactTransitionGroup = require('react-transition-group'); var reactUiCore = require('@appbuckets/react-ui-core'); var transitions = require('@appbuckets/react-ui-styles/transitions'); require('../BucketTheme/BucketTheme.js'); var BucketContext = require('../BucketTheme/BucketContext.js'); function _interopDefaultLegacy(e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; } function _interopNamespace(e) { if (e && e.__esModule) return e; var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty( n, k, d.get ? d : { enumerable: true, get: function () { return e[k]; }, } ); } }); } n['default'] = e; return Object.freeze(n); } var React__namespace = /*#__PURE__*/ _interopNamespace(React); var clsx__default = /*#__PURE__*/ _interopDefaultLegacy(clsx); /* -------- * Component Render * -------- */ var Fade = React__namespace.forwardRef(function (receivedProps, ref) { /** Get component props */ var props = BucketContext.useWithDefaultProps('fade', receivedProps); var appear = props.appear, children = props.children, easing = props.easing, mountOnEnter = props.mountOnEnter, style = props.style, timeout = props.timeout, visible = props.visible, unMountOnExit = props.unMountOnExit, userDefinedOnEnterHandler = props.onEnter, userDefinedOnExitHandler = props.onExit, userDefinedOnEnteringHandler = props.onEntering, userDefinedOnExitingHandler = props.onExiting, userDefinedOnEnteredHandler = props.onEntered, userDefinedOnExitedHandler = props.onExited; /** Initialize Ref */ var nodeRef = React__namespace.useRef(null); var foreignRef = reactUiCore.useForkRef( children === null || children === void 0 ? void 0 : children.ref, ref ); var handleRef = reactUiCore.useForkRef(nodeRef, foreignRef); /** Normalize transition handler */ var normalizedTransitionCallback = function (callback) { return function (maybeIsAppearing) { if (callback && nodeRef.current) { var node = nodeRef.current; /** onEnter and onExit callbacks have different arguments length */ if (maybeIsAppearing !== undefined) { callback(node, maybeIsAppearing); } else { callback(node); } } }; }; var handleEntering = normalizedTransitionCallback( userDefinedOnEnteringHandler ); var handleEnter = normalizedTransitionCallback(function (node, isAppearing) { /** Restart animation */ transitions.reflow(node); /** Get transition props */ var transitionProps = transitions.getTransitionProps( { style: style, timeout: timeout, easing: easing }, { mode: 'enter' } ); /** Set CSS for Transition */ node.style.webkitTransition = transitions.createTransitionStyle( 'opacity', transitionProps ); node.style.transition = transitions.createTransitionStyle( 'opacity', transitionProps ); /** Call user defined handler */ if (userDefinedOnEnterHandler) { userDefinedOnEnterHandler(node, isAppearing); } }); var handleEntered = normalizedTransitionCallback(userDefinedOnEnteredHandler); var handleExiting = normalizedTransitionCallback(userDefinedOnExitingHandler); var handleExit = normalizedTransitionCallback(function (node) { /** Get transition props */ var transitionProps = transitions.getTransitionProps( { style: style, timeout: timeout, easing: easing }, { mode: 'exit' } ); /** Set CSS for Transition */ node.style.webkitTransition = transitions.createTransitionStyle( 'opacity', transitionProps ); node.style.transition = transitions.createTransitionStyle( 'opacity', transitionProps ); /** Call user defined handler */ if (userDefinedOnExitHandler) { userDefinedOnExitHandler(node); } }); var handleExited = normalizedTransitionCallback(userDefinedOnExitedHandler); // ---- // Component Render // ---- return React__namespace.createElement( reactTransitionGroup.Transition, { appear: appear, in: visible, nodeRef: nodeRef, mountOnEnter: mountOnEnter, unmountOnExit: unMountOnExit, timeout: timeout || 300, onEnter: handleEnter, onEntering: handleEntering, onEntered: handleEntered, onExit: handleExit, onExiting: handleExiting, onExited: handleExited, }, function (state) { var classes = clsx__default['default']( state, 'transitionable fade', children === null || children === void 0 ? void 0 : children.props.className ); return ( !reactUiCore.childrenUtils.isNil(children) && React__namespace.createElement( reactUiCore.Ref, { innerRef: handleRef }, React__namespace.cloneElement(children, { className: classes, style: tslib.__assign( tslib.__assign( { visibility: state === 'exited' && !visible ? 'hidden' : undefined, }, style ), children === null || children === void 0 ? void 0 : children.props.style ), }) ) ); } ); }); Fade.displayName = 'Fade'; module.exports = Fade;