@rc-component/collapse
Version:
rc-collapse ui component for react
85 lines (83 loc) • 2.55 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import classNames from 'classnames';
import useMergedState from "@rc-component/util/es/hooks/useMergedState";
import warning from "@rc-component/util/es/warning";
import React from 'react';
import useItems from "./hooks/useItems";
import CollapsePanel from "./Panel";
import pickAttrs from "@rc-component/util/es/pickAttrs";
function getActiveKeysArray(activeKey) {
let currentActiveKey = activeKey;
if (!Array.isArray(currentActiveKey)) {
const activeKeyType = typeof currentActiveKey;
currentActiveKey = activeKeyType === 'number' || activeKeyType === 'string' ? [currentActiveKey] : [];
}
return currentActiveKey.map(key => String(key));
}
const Collapse = /*#__PURE__*/React.forwardRef((props, ref) => {
const {
prefixCls = 'rc-collapse',
destroyOnHidden = false,
style,
accordion,
className,
children,
collapsible,
openMotion,
expandIcon,
activeKey: rawActiveKey,
defaultActiveKey,
onChange,
items,
classNames: customizeClassNames,
styles
} = props;
const collapseClassName = classNames(prefixCls, className);
const [activeKey, setActiveKey] = useMergedState([], {
value: rawActiveKey,
onChange: v => onChange?.(v),
defaultValue: defaultActiveKey,
postState: getActiveKeysArray
});
const onItemClick = key => setActiveKey(() => {
if (accordion) {
return activeKey[0] === key ? [] : [key];
}
const index = activeKey.indexOf(key);
const isActive = index > -1;
if (isActive) {
return activeKey.filter(item => item !== key);
}
return [...activeKey, key];
});
// ======================== Children ========================
warning(!children, '[rc-collapse] `children` will be removed in next major version. Please use `items` instead.');
const mergedChildren = useItems(items, children, {
prefixCls,
accordion,
openMotion,
expandIcon,
collapsible,
destroyOnHidden,
onItemClick,
activeKey,
classNames: customizeClassNames,
styles
});
// ======================== Render ========================
return /*#__PURE__*/React.createElement("div", _extends({
ref: ref,
className: collapseClassName,
style: style,
role: accordion ? 'tablist' : undefined
}, pickAttrs(props, {
aria: true,
data: true
})), mergedChildren);
});
export default Object.assign(Collapse, {
/**
* @deprecated use `items` instead, will be removed in `v4.0.0`
*/
Panel: CollapsePanel
});