UNPKG

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