@appbuckets/react-ui
Version:
Just Another React UI Framework
152 lines (149 loc) • 4.76 kB
JavaScript
import { __assign } from 'tslib';
import * as React from 'react';
import clsx from 'clsx';
import { Transition } from 'react-transition-group';
import { useForkRef, childrenUtils, Ref } from '@appbuckets/react-ui-core';
import {
reflow,
getTransitionProps,
createTransitionStyle,
} from '@appbuckets/react-ui-styles/transitions';
import '../BucketTheme/BucketTheme.js';
import { useWithDefaultProps } from '../BucketTheme/BucketContext.js';
/* --------
* Component Render
* -------- */
var Fade = React.forwardRef(function (receivedProps, ref) {
/** Get component props */
var props = 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.useRef(null);
var foreignRef = useForkRef(
children === null || children === void 0 ? void 0 : children.ref,
ref
);
var handleRef = 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 */
reflow(node);
/** Get transition props */
var transitionProps = getTransitionProps(
{ style: style, timeout: timeout, easing: easing },
{ mode: 'enter' }
);
/** Set CSS for Transition */
node.style.webkitTransition = createTransitionStyle(
'opacity',
transitionProps
);
node.style.transition = 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 = getTransitionProps(
{ style: style, timeout: timeout, easing: easing },
{ mode: 'exit' }
);
/** Set CSS for Transition */
node.style.webkitTransition = createTransitionStyle(
'opacity',
transitionProps
);
node.style.transition = createTransitionStyle('opacity', transitionProps);
/** Call user defined handler */
if (userDefinedOnExitHandler) {
userDefinedOnExitHandler(node);
}
});
var handleExited = normalizedTransitionCallback(userDefinedOnExitedHandler);
// ----
// Component Render
// ----
return React.createElement(
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(
state,
'transitionable fade',
children === null || children === void 0
? void 0
: children.props.className
);
return (
!childrenUtils.isNil(children) &&
React.createElement(
Ref,
{ innerRef: handleRef },
React.cloneElement(children, {
className: classes,
style: __assign(
__assign(
{
visibility:
state === 'exited' && !visible ? 'hidden' : undefined,
},
style
),
children === null || children === void 0
? void 0
: children.props.style
),
})
)
);
}
);
});
Fade.displayName = 'Fade';
export { Fade as default };