@ant-design/x
Version:
Craft AI-driven interfaces effortlessly
51 lines (47 loc) • 1.86 kB
JavaScript
import useMergedState from "rc-util/es/hooks/useMergedState";
import React from 'react';
import initCollapseMotion from "../../_util/motion";
const useCollapsible = (collapsible, prefixCls, rootPrefixCls) => {
// ============================ Collapsible ============================
const [enableCollapse, customizeExpandedKeys, customizeOnExpand] = React.useMemo(() => {
let baseConfig = {
expandedKeys: [],
onExpand: () => {}
};
if (!collapsible) {
return [false, baseConfig.expandedKeys, baseConfig.onExpand];
}
if (typeof collapsible === 'object') {
baseConfig = {
...baseConfig,
...collapsible
};
}
return [true, baseConfig.expandedKeys, baseConfig.onExpand];
}, [collapsible]);
// ============================ ExpandedKeys ============================
const [mergedExpandedKeys, setMergedExpandedKeys] = useMergedState([], {
value: customizeExpandedKeys,
onChange: customizeOnExpand
});
// ============================ Event ============================
const onItemExpand = curKey => {
setMergedExpandedKeys(preKeys => {
const keys = preKeys.includes(curKey) ? preKeys.filter(key => key !== curKey) : [...preKeys, curKey];
customizeOnExpand?.(keys);
return keys;
});
};
// ============================ Motion ============================
const collapseMotion = React.useMemo(() => {
if (!enableCollapse) return {};
return {
...initCollapseMotion(rootPrefixCls),
motionAppear: false,
leavedClassName: `${prefixCls}-content-hidden`
};
}, [rootPrefixCls, prefixCls, enableCollapse]);
// ============================ Return ============================
return [enableCollapse, mergedExpandedKeys, enableCollapse ? onItemExpand : undefined, collapseMotion];
};
export default useCollapsible;