UNPKG

antd-mobile

Version:
192 lines (191 loc) 7.74 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CollapsePanel = exports.Collapse = void 0; var _web = require("@react-spring/web"); var _ahooks = require("ahooks"); var _antdMobileIcons = require("antd-mobile-icons"); var _classnames = _interopRequireDefault(require("classnames")); var _react = _interopRequireWildcard(require("react")); var _nativeProps = require("../../utils/native-props"); var _shouldRender = require("../../utils/should-render"); var _traverseReactNode = require("../../utils/traverse-react-node"); var _useIsomorphicUpdateLayoutEffect = require("../../utils/use-isomorphic-update-layout-effect"); var _useMutationEffect = require("../../utils/use-mutation-effect"); var _usePropsValue = require("../../utils/use-props-value"); var _withDefaultProps = require("../../utils/with-default-props"); var _configProvider = require("../config-provider"); var _list = _interopRequireDefault(require("../list")); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const classPrefix = `adm-collapse`; const CollapsePanel = () => { return null; }; exports.CollapsePanel = CollapsePanel; const CollapsePanelContent = props => { const { visible } = props; const innerRef = (0, _react.useRef)(null); const shouldRender = (0, _shouldRender.useShouldRender)(visible, props.forceRender, props.destroyOnClose); const [{ height }, api] = (0, _web.useSpring)(() => ({ from: { height: 0 }, config: { precision: 0.01, mass: 1, tension: 200, friction: 25, clamp: true } })); (0, _ahooks.useMount)(() => { if (!visible) return; const inner = innerRef.current; if (!inner) return; api.start({ height: inner.offsetHeight, immediate: true }); }); (0, _useIsomorphicUpdateLayoutEffect.useIsomorphicUpdateLayoutEffect)(() => { const inner = innerRef.current; if (!inner) return; if (visible) { let lastMotionId = 0; let cancelObserve = () => {}; const handleMotion = () => { lastMotionId += 1; const motionId = lastMotionId; api.start({ height: inner.offsetHeight })[0].then(() => { if (motionId === lastMotionId) { cancelObserve(); } }); }; cancelObserve = (0, _useMutationEffect.observe)(inner, { childList: true, subtree: true }, handleMotion); handleMotion(); return cancelObserve; } else { api.start({ height: inner.offsetHeight, immediate: true }); api.start({ height: 0 }); } }, [visible]); return _react.default.createElement(_web.animated.div, { className: (0, _classnames.default)(`${classPrefix}-panel-content`, { [`${classPrefix}-panel-content-active`]: visible }), style: { height: height.to(v => { if (height.idle && visible) { return 'auto'; } else { return v; } }) } }, _react.default.createElement("div", { className: `${classPrefix}-panel-content-inner`, ref: innerRef }, _react.default.createElement(_list.default.Item, null, shouldRender && props.children))); }; const Collapse = props => { const { collapse: componentConfig = {} } = (0, _configProvider.useConfig)(); const mergedProps = (0, _withDefaultProps.mergeProps)(componentConfig, props); const panels = []; (0, _traverseReactNode.traverseReactNode)(mergedProps.children, child => { if (!(0, _react.isValidElement)(child)) return; const key = child.key; if (typeof key !== 'string') return; panels.push(child); }); const handlePropsValue = () => { var _a; if (!mergedProps.accordion) { return { value: mergedProps.activeKey, defaultValue: (_a = mergedProps.defaultActiveKey) !== null && _a !== void 0 ? _a : [], onChange: mergedProps.onChange }; } const initValue = { value: [], defaultValue: [], onChange: v => { var _a, _b; (_a = mergedProps.onChange) === null || _a === void 0 ? void 0 : _a.call(mergedProps, (_b = v[0]) !== null && _b !== void 0 ? _b : null); } }; if (mergedProps.activeKey === undefined) { initValue.value = undefined; } else if (mergedProps.activeKey !== null) { initValue.value = [mergedProps.activeKey]; } if (![null, undefined].includes(mergedProps.defaultActiveKey)) { initValue.defaultValue = [mergedProps.defaultActiveKey]; } return initValue; }; const [activeKey, setActiveKey] = (0, _usePropsValue.usePropsValue)(handlePropsValue()); const activeKeyList = activeKey === null ? [] : Array.isArray(activeKey) ? activeKey : [activeKey]; return (0, _nativeProps.withNativeProps)(mergedProps, _react.default.createElement("div", { className: classPrefix }, _react.default.createElement(_list.default, null, panels.map(panel => { const key = panel.key; const active = activeKeyList.includes(key); function handleClick(event) { var _a, _b; if (mergedProps.accordion) { if (active) { setActiveKey([]); } else { setActiveKey([key]); } } else { if (active) { setActiveKey(activeKeyList.filter(v => v !== key)); } else { setActiveKey([...activeKeyList, key]); } } (_b = (_a = panel.props).onClick) === null || _b === void 0 ? void 0 : _b.call(_a, event); } const arrow = (0, _withDefaultProps.mergeProp)(_react.default.createElement(_antdMobileIcons.DownOutline, null), mergedProps.arrow, mergedProps.arrowIcon, panel.props.arrow, panel.props.arrowIcon); const arrowIcon = typeof arrow === 'function' ? arrow(active) : _react.default.createElement("div", { className: (0, _classnames.default)(`${classPrefix}-arrow`, { [`${classPrefix}-arrow-active`]: active }) }, arrow); return _react.default.createElement(_react.default.Fragment, { key: key }, (0, _nativeProps.withNativeProps)(panel.props, _react.default.createElement(_list.default.Item, { className: `${classPrefix}-panel-header`, onClick: handleClick, disabled: panel.props.disabled, arrowIcon: arrowIcon }, panel.props.title)), _react.default.createElement(CollapsePanelContent, { visible: active, forceRender: !!panel.props.forceRender, destroyOnClose: !!panel.props.destroyOnClose }, panel.props.children)); })))); }; exports.Collapse = Collapse;