UNPKG

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