@re-flex/ui
Version:
Re-Flex ui library
31 lines (30 loc) • 1.37 kB
JavaScript
import StyledCollapse from "@re-flex/styled/Collapse";
import { useTheme } from "@re-flex/styles";
import clsx from "clsx";
import React, { useCallback, useMemo } from "react";
const Collapse = ({ children, open = false, starterHeight = 0, className, ...rest }) => {
const theme = useTheme();
const collapseRef = React.useRef(null);
const [maxHeight, setMaxHeight] = React.useState(0);
React.useEffect(() => {
const target = collapseRef.current;
if (!!target) {
const resizer = new ResizeObserver(listenChange);
resizer.observe(target, { box: "border-box" });
return () => {
resizer.unobserve(target);
resizer.disconnect();
};
}
}, [collapseRef]);
const listenChange = useCallback(() => {
setMaxHeight(collapseRef.current?.scrollHeight || 0);
}, [collapseRef.current, open]);
const collapseHeight = useMemo(() => {
return ((open ? collapseRef.current?.scrollHeight || maxHeight : starterHeight) +
"px");
}, [open, collapseRef, maxHeight, starterHeight]);
return (React.createElement(StyledCollapse, { ...rest, className: clsx(theme.prefix + "-collapse-content", className), height: collapseHeight },
React.createElement("div", { ref: collapseRef }, children)));
};
export default Collapse;