UNPKG

4.13 kBJavaScriptView Raw
1import _extends from "@babel/runtime/helpers/esm/extends";
2import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
4var _collapseStyles;
5
6import classNames from 'classnames';
7import css from 'dom-helpers/css';
8import transitionEnd from 'dom-helpers/transitionEnd';
9import React, { useMemo } from 'react';
10import Transition, { ENTERED, ENTERING, EXITED, EXITING } from 'react-transition-group/Transition';
11import createChainedFunction from './createChainedFunction';
12import triggerBrowserReflow from './triggerBrowserReflow';
13var MARGINS = {
14 height: ['marginTop', 'marginBottom'],
15 width: ['marginLeft', 'marginRight']
16};
17
18function getDefaultDimensionValue(dimension, elem) {
19 var offset = "offset" + dimension[0].toUpperCase() + dimension.slice(1);
20 var value = elem[offset];
21 var margins = MARGINS[dimension];
22 return value + // @ts-ignore
23 parseInt(css(elem, margins[0]), 10) + // @ts-ignore
24 parseInt(css(elem, margins[1]), 10);
25}
26
27var collapseStyles = (_collapseStyles = {}, _collapseStyles[EXITED] = 'collapse', _collapseStyles[EXITING] = 'collapsing', _collapseStyles[ENTERING] = 'collapsing', _collapseStyles[ENTERED] = 'collapse show', _collapseStyles);
28var defaultProps = {
29 in: false,
30 timeout: 300,
31 mountOnEnter: false,
32 unmountOnExit: false,
33 appear: false,
34 getDimensionValue: getDefaultDimensionValue
35};
36var Collapse = React.forwardRef(function (_ref, ref) {
37 var onEnter = _ref.onEnter,
38 onEntering = _ref.onEntering,
39 onEntered = _ref.onEntered,
40 onExit = _ref.onExit,
41 onExiting = _ref.onExiting,
42 className = _ref.className,
43 children = _ref.children,
44 _ref$dimension = _ref.dimension,
45 dimension = _ref$dimension === void 0 ? 'height' : _ref$dimension,
46 _ref$getDimensionValu = _ref.getDimensionValue,
47 getDimensionValue = _ref$getDimensionValu === void 0 ? getDefaultDimensionValue : _ref$getDimensionValu,
48 props = _objectWithoutPropertiesLoose(_ref, ["onEnter", "onEntering", "onEntered", "onExit", "onExiting", "className", "children", "dimension", "getDimensionValue"]);
49
50 /* Compute dimension */
51 var computedDimension = typeof dimension === 'function' ? dimension() : dimension;
52 /* -- Expanding -- */
53
54 var handleEnter = useMemo(function () {
55 return createChainedFunction(function (elem) {
56 elem.style[computedDimension] = '0';
57 }, onEnter);
58 }, [computedDimension, onEnter]);
59 var handleEntering = useMemo(function () {
60 return createChainedFunction(function (elem) {
61 var scroll = "scroll" + computedDimension[0].toUpperCase() + computedDimension.slice(1);
62 elem.style[computedDimension] = elem[scroll] + "px";
63 }, onEntering);
64 }, [computedDimension, onEntering]);
65 var handleEntered = useMemo(function () {
66 return createChainedFunction(function (elem) {
67 elem.style[computedDimension] = null;
68 }, onEntered);
69 }, [computedDimension, onEntered]);
70 /* -- Collapsing -- */
71
72 var handleExit = useMemo(function () {
73 return createChainedFunction(function (elem) {
74 elem.style[computedDimension] = getDimensionValue(computedDimension, elem) + "px";
75 triggerBrowserReflow(elem);
76 }, onExit);
77 }, [onExit, getDimensionValue, computedDimension]);
78 var handleExiting = useMemo(function () {
79 return createChainedFunction(function (elem) {
80 elem.style[computedDimension] = null;
81 }, onExiting);
82 }, [computedDimension, onExiting]);
83 return /*#__PURE__*/React.createElement(Transition // @ts-ignore
84 , _extends({
85 ref: ref,
86 addEndListener: transitionEnd
87 }, props, {
88 "aria-expanded": props.role ? props.in : null,
89 onEnter: handleEnter,
90 onEntering: handleEntering,
91 onEntered: handleEntered,
92 onExit: handleExit,
93 onExiting: handleExiting
94 }), function (state, innerProps) {
95 return React.cloneElement(children, _extends({}, innerProps, {
96 className: classNames(className, children.props.className, collapseStyles[state], computedDimension === 'width' && 'width')
97 }));
98 });
99}); // @ts-ignore
100
101// @ts-ignore
102Collapse.defaultProps = defaultProps;
103export default Collapse;
\No newline at end of file