@fruits-chain/react-native-xiaoshu
Version:
🌈 React Native UI library
172 lines (140 loc) • 6.54 kB
JavaScript
"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