UNPKG

@rc-component/collapse

Version:
85 lines (83 loc) 2.55 kB
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 });