UNPKG

@nutui/nutui-react-taro

Version:

京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序

214 lines (213 loc) 9.96 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "SideBar", { enumerable: true, get: function() { return SideBar; } }); var _interop_require_default = require("@swc/helpers/_/_interop_require_default"); var _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard"); var _define_property = require("@swc/helpers/_/_define_property"); var _object_spread = require("@swc/helpers/_/_object_spread"); var _object_spread_props = require("@swc/helpers/_/_object_spread_props"); var _object_without_properties = require("@swc/helpers/_/_object_without_properties"); var _sliced_to_array = require("@swc/helpers/_/_sliced_to_array"); var _react = /*#__PURE__*/ _interop_require_wildcard._(require("react")); var _components = require("@tarojs/components"); var _classnames = /*#__PURE__*/ _interop_require_default._(require("classnames")); var _taro = /*#__PURE__*/ _interop_require_wildcard._(require("@tarojs/taro")); var _typings = require("../../utils/typings"); var _usepropsvalue = require("../../hooks/use-props-value"); var _useforceupdate = require("../../hooks/use-force-update"); var _raf = /*#__PURE__*/ _interop_require_default._(require("../../utils/raf")); var _useuuid = require("../../hooks/use-uuid"); var _index = /*#__PURE__*/ _interop_require_default._(require("../sidebaritem/index")); var _mergeprops = require("../../utils/merge-props"); var defaultProps = (0, _object_spread_props._)((0, _object_spread._)({}, _typings.ComponentDefaults), { contentDuration: 0, sidebarDuration: 0 }); var classPrefix = 'nut-sidebar'; var SideBar = function SideBar(props) { var _mergeProps = (0, _mergeprops.mergeProps)(defaultProps, props), contentDuration = _mergeProps.contentDuration, sidebarDuration = _mergeProps.sidebarDuration, children = _mergeProps.children, onClick = _mergeProps.onClick, onChange = _mergeProps.onChange, className = _mergeProps.className, rest = (0, _object_without_properties._)(_mergeProps, [ "contentDuration", "sidebarDuration", "children", "onClick", "onChange", "className" ]); var uuid = (0, _useuuid.useUuid)(); var _usePropsValue = (0, _sliced_to_array._)((0, _usepropsvalue.usePropsValue)({ value: props.value, defaultValue: props.defaultValue, finalValue: 0, onChange: onChange }), 2), value = _usePropsValue[0], setValue = _usePropsValue[1]; var titleItemsRef = (0, _react.useRef)([]); var navRef = (0, _react.useRef)(null); var getTitles = function getTitles() { var titles = []; _react.default.Children.forEach(children, function(child, idx) { if (/*#__PURE__*/ _react.default.isValidElement(child)) { var _$props = child === null || child === void 0 ? void 0 : child.props; if ((_$props === null || _$props === void 0 ? void 0 : _$props.title) || (_$props === null || _$props === void 0 ? void 0 : _$props.value)) { titles.push({ title: _$props.title, value: _$props.value || idx, disabled: _$props.disabled }); } } }); return titles; }; var titles = (0, _react.useRef)(getTitles()); var forceUpdate = (0, _useforceupdate.useForceUpdate)(); (0, _react.useEffect)(function() { titles.current = getTitles(); var current = ''; titles.current.forEach(function(title) { if (title.value === value) { current = value; } }); forceUpdate(); }, [ children ]); var classes = (0, _classnames.default)(classPrefix, className); var classesTitle = (0, _classnames.default)("".concat(classPrefix, "-titles"), "".concat(classPrefix, "-titles-scrollable")); var getRect = function getRect(selector) { return new Promise(function(resolve) { (0, _taro.createSelectorQuery)().select(selector).boundingClientRect().exec(function() { var rect = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : []; resolve(rect[0]); }); }); }; var getAllRect = function getAllRect(selector) { return new Promise(function(resolve) { (0, _taro.createSelectorQuery)().selectAll(selector).boundingClientRect().exec(function() { var rect = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : []; resolve(rect[0]); }); }); }; var scrollWithAnimation = (0, _react.useRef)(false); var navRectRef = (0, _react.useRef)(); var titleRectRef = (0, _react.useRef)([]); var _useState = (0, _sliced_to_array._)((0, _react.useState)(0), 2), scrollTop = _useState[0], setScrollTop = _useState[1]; var scrollDirection = function scrollDirection(to) { if (sidebarDuration === 0) { setScrollTop(to); return; } var from = scrollTop; var frames = Math.round(sidebarDuration / 16); var count = 0; function animate() { var progress = count / frames; var current = from + (to - from) * progress; setScrollTop(current); if (count < frames) { count++; (0, _raf.default)(animate); } } animate(); }; var scrollIntoView = function scrollIntoView(index) { (0, _raf.default)(function() { Promise.all([ getRect("#".concat(classPrefix, "-titles-").concat(uuid, " .").concat(classPrefix, "-list")), getAllRect("#".concat(classPrefix, "-titles-").concat(uuid, " .").concat(classPrefix, "-titles-item")) ]).then(function(param) { var _param = (0, _sliced_to_array._)(param, 2), navRect = _param[0], titleRects = _param[1]; navRectRef.current = navRect; titleRectRef.current = titleRects; var titleRect = titleRectRef.current[index]; if (!titleRect) return; (0, _taro.nextTick)(function() { scrollWithAnimation.current = true; }); scrollDirection(titleRect.height * (index - 1)); }); }); }; var getContentStyle = function getContentStyle() { var index = titles.current.findIndex(function(t) { return String(t.value) === String(value); }); index = index < 0 ? 0 : index; return { transform: "translateY(-".concat(index * 100, "%)"), transitionDuration: "".concat(contentDuration, "ms") }; }; (0, _react.useEffect)(function() { var index = titles.current.findIndex(function(t) { return String(t.value) === String(value); }); index = index < 0 ? 0 : index; scrollIntoView(index); }, [ value ]); var tabChange = function tabChange(item, index) { if (item.disabled) return; onClick === null || onClick === void 0 ? void 0 : onClick(item.value); setValue(item.value); }; return /*#__PURE__*/ _react.default.createElement(_components.View, (0, _object_spread._)({ className: classes }, rest), /*#__PURE__*/ _react.default.createElement(_components.ScrollView, { enableFlex: true, scrollX: false, scrollY: true, scrollTop: scrollTop, showScrollbar: false, scrollWithAnimation: _taro.default.getEnv() !== 'WEB' ? false : scrollWithAnimation.current, id: "".concat(classPrefix, "-titles-").concat(uuid), className: classesTitle }, /*#__PURE__*/ _react.default.createElement(_components.View, { className: "".concat(classPrefix, "-list"), ref: navRef }, titles.current.map(function(item, index) { return /*#__PURE__*/ _react.default.createElement(_components.View, { ref: function ref(ref) { return titleItemsRef.current.push(ref); }, id: "scrollIntoView".concat(index), onClick: function onClick(e) { tabChange(item, index); }, className: (0, _classnames.default)("".concat(classPrefix, "-titles-item"), (0, _define_property._)({}, "".concat(classPrefix, "-titles-item-active"), !item.disabled && String(item.value) === String(value))), key: item.value }, /*#__PURE__*/ _react.default.createElement(_components.View, { className: (0, _classnames.default)("".concat(classPrefix, "-ellipsis"), "".concat(classPrefix, "-titles-item-text"), (0, _define_property._)({}, "".concat(classPrefix, "-titles-item-disabled"), item.disabled)) }, item.title)); }))), /*#__PURE__*/ _react.default.createElement(_components.View, { className: "".concat(classPrefix, "-content-wrap") }, /*#__PURE__*/ _react.default.createElement(_components.View, { className: "".concat(classPrefix, "-content"), style: getContentStyle() }, _react.default.Children.map(children, function(child, idx) { if (!/*#__PURE__*/ _react.default.isValidElement(child)) { return null; } var childProps = (0, _object_spread_props._)((0, _object_spread._)({}, child.props), { active: value === child.props.value }); var _child_props_value; if (String(value) !== String((_child_props_value = child.props.value) !== null && _child_props_value !== void 0 ? _child_props_value : idx)) { childProps = (0, _object_spread._)({}, childProps); } return /*#__PURE__*/ _react.default.cloneElement(child, childProps); })))); }; SideBar.displayName = 'NutSideBar'; SideBar.Item = _index.default;