UNPKG

@fruits-chain/react-native-xiaoshu

Version:
172 lines (140 loc) 6.54 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _isUndefined = _interopRequireDefault(require("lodash/isUndefined")); var _react = _interopRequireWildcard(require("react")); var _reactNative = require("react-native"); var _card = _interopRequireDefault(require("../card")); var _cell = _interopRequireDefault(require("../cell")); var _divider = _interopRequireDefault(require("../divider")); var _helpers = require("../helpers"); var _hooks = require("../hooks"); var _arrow = require("../icon/helper/arrow"); var _theme = _interopRequireDefault(require("../theme")); var _style = require("./style"); 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 }; } /** * Collapse 折叠面板 */ const Collapse = _ref => { let { children, title, titleStyle, titleTextStyle, iconStyle, iconColor, iconSize, bodyStyle, renderTitle, renderTitleExtra, renderBody, type = 'cell', onAnimationEnd, bodyPadding = true, headerDivider = true, bodyDivider, lazyRender = true, ...restProps } = _ref; const TOKENS = _theme.default.useThemeTokens(); const CV = _theme.default.createVar(TOKENS, _style.varCreator); const STYLES = _theme.default.createStyle(CV, _style.styleCreator, TOKENS); bodyDivider = (0, _helpers.getDefaultValue)(bodyDivider, type === 'cell'); const [collapse, onCollapse] = (0, _hooks.useControllableValue)(restProps, { defaultValuePropName: 'defaultCollapse', valuePropName: 'collapse', trigger: 'onCollapse', defaultValue: false }); const onAnimationEndPersistFn = (0, _hooks.usePersistFn)(v => { onAnimationEnd === null || onAnimationEnd === void 0 ? void 0 : onAnimationEnd(v); }); /** 记录当前是否可见,在不断 onLayout 的时候可以有一个判断的依据 */ const Visible = (0, _react.useRef)(collapse); const BodyHeight = (0, _react.useRef)(0); const MountedRef = (0, _react.useRef)(false); const AnimatedValue = (0, _react.useRef)(new _reactNative.Animated.Value(0)).current; const toggleBody = (0, _react.useCallback)((v, immediately) => { const action = _reactNative.Animated.timing(AnimatedValue, { toValue: v ? BodyHeight.current : 0, duration: immediately ? 0 : CV.collapse_transition_duration, useNativeDriver: false, easing: v ? _helpers.easing.easeOutCirc : _helpers.easing.easeInCubic }); action.start(_ref2 => { let { finished } = _ref2; if (finished) { onAnimationEndPersistFn(v); } }); }, [AnimatedValue, onAnimationEndPersistFn, CV.collapse_transition_duration]); // 初始化好组件 (0, _react.useEffect)(() => { MountedRef.current = true; }, []); (0, _react.useEffect)(() => { // 同步当前的状态 Visible.current = collapse; toggleBody(collapse, false); }, [collapse, toggleBody]); const onPressTitle = (0, _react.useCallback)(() => { onCollapse(!Visible.current); }, [onCollapse]); const onLayoutBody = (0, _react.useCallback)(e => { // 有点疑惑,折叠的过程中,高度在动态变化,通过 absolute 布局解决无法完全渲染 BodyHeight.current = e.nativeEvent.layout.height; // 当收齐的时候已知高度 toggleBody(Visible.current, Visible.current); }, [toggleBody]); const ArrowOutline = (0, _arrow.getArrowOutline)(collapse ? 'up' : 'down'); const arrowJSX = /*#__PURE__*/_react.default.createElement(ArrowOutline, { style: iconStyle, color: !(0, _isUndefined.default)(iconColor) ? iconColor : CV.collapse_icon_color, size: !(0, _isUndefined.default)(iconSize) ? iconSize : CV.collapse_icon_size }); const titleJSX = renderTitle ? renderTitle(collapse) : title; const titleExtraJSX = renderTitleExtra ? renderTitleExtra(collapse, arrowJSX) : arrowJSX; const bodyJSX = lazyRender && !MountedRef.current && !collapse ? null : renderBody ? renderBody() : children; const ctxJSX = /*#__PURE__*/_react.default.createElement(_reactNative.Animated.View, { style: [STYLES.collapse, { height: AnimatedValue }] }, /*#__PURE__*/_react.default.createElement(_reactNative.View, { collapsable: false, style: STYLES.body, onLayout: onLayoutBody }, /*#__PURE__*/_react.default.createElement(_reactNative.View, { style: [bodyPadding ? STYLES.body_padding : undefined, bodyStyle] }, bodyJSX), bodyDivider ? /*#__PURE__*/_react.default.createElement(_divider.default, { type: "light", style: STYLES.divider }) : null)); if (type === 'card') { return /*#__PURE__*/_react.default.createElement(_card.default, { square: true, title: titleJSX, extra: titleExtraJSX, headerDivider: headerDivider, titleStyle: titleStyle, titleTextStyle: titleTextStyle, bodyPadding: false, onPressHeader: onPressTitle }, ctxJSX); } return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_cell.default, { title: titleJSX, style: titleStyle, titleTextStyle: titleTextStyle, valueExtra: titleExtraJSX, onPress: onPressTitle, divider: headerDivider }), ctxJSX); }; var _default = /*#__PURE__*/(0, _react.memo)(Collapse); exports.default = _default; //# sourceMappingURL=index.js.map