UNPKG

@nutui/nutui-react-taro

Version:

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

270 lines (269 loc) 12.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: all[name] }); } _export(exports, { Elevator: function() { return Elevator; }, elevatorContext: function() { return elevatorContext; } }); 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 _to_consumable_array = require("@swc/helpers/_/_to_consumable_array"); var _react = /*#__PURE__*/ _interop_require_wildcard._(require("react")); var _taro = /*#__PURE__*/ _interop_require_wildcard._(require("@tarojs/taro")); var _components = require("@tarojs/components"); var _classnames = /*#__PURE__*/ _interop_require_default._(require("classnames")); var _typings = require("../../utils/typings"); var _platformtaro = require("../../utils/platform-taro"); var _useuuid = /*#__PURE__*/ _interop_require_default._(require("../../hooks/use-uuid")); var elevatorContext = /*#__PURE__*/ (0, _react.createContext)({}); var defaultProps = (0, _object_spread_props._)((0, _object_spread._)({}, _typings.ComponentDefaults), { height: '200px', floorKey: 'title', list: [], sticky: false, spaceHeight: 23, titleHeight: 35, showKeys: true, className: 'weapp-elevator' }); var Elevator = function Elevator(props) { var _ref = (0, _object_spread._)({}, defaultProps, props), height = _ref.height, floorKey = _ref.floorKey, list = _ref.list, sticky = _ref.sticky, spaceHeight = _ref.spaceHeight, titleHeight = _ref.titleHeight, showKeys = _ref.showKeys, className = _ref.className, style = _ref.style, onItemClick = _ref.onItemClick, onIndexClick = _ref.onIndexClick, children = _ref.children, rest = (0, _object_without_properties._)(_ref, [ "height", "floorKey", "list", "sticky", "spaceHeight", "titleHeight", "showKeys", "className", "style", "onItemClick", "onIndexClick", "children" ]); var uuid = (0, _useuuid.default)(); var classPrefix = 'nut-elevator'; var listview = (0, _react.useRef)(null); var initData = { anchorIndex: 0, listHeight: [], listGroup: [], scrollY: 0 }; var touchState = (0, _react.useRef)({ y1: 0, y2: 0 }); var _useState = (0, _sliced_to_array._)((0, _react.useState)({}), 2), currentData = _useState[0], setCurrentData = _useState[1]; var _useState1 = (0, _sliced_to_array._)((0, _react.useState)(''), 2), currentKey = _useState1[0], setCurrentKey = _useState1[1]; var _useState2 = (0, _sliced_to_array._)((0, _react.useState)(0), 2), codeIndex = _useState2[0], setCodeIndex = _useState2[1]; var _useState3 = (0, _sliced_to_array._)((0, _react.useState)(false), 2), scrollStart = _useState3[0], setScrollStart = _useState3[1]; var state = (0, _react.useRef)(initData); var scrolling = (0, _react.useRef)(false); var _useState4 = (0, _sliced_to_array._)((0, _react.useState)(0), 2), scrollTop = _useState4[0], setScrollTop = _useState4[1]; var _useState5 = (0, _sliced_to_array._)((0, _react.useState)(0), 2), scrollY = _useState5[0], setScrollY = _useState5[1]; var resetScrollState = function resetScrollState() { setScrollStart(false); }; var getData = function getData(el) { if (!el.dataset.index) { return '0'; } return el.dataset.index; }; var calculateHeight = function calculateHeight() { var height = 0; state.current.listHeight.push(height); for(var i = 0; i < state.current.listGroup.length; i++){ var query = (0, _taro.createSelectorQuery)(); query.selectAll(".".concat(classPrefix, "-").concat(uuid, " .nut-elevator-item-").concat(i)).boundingClientRect(); // eslint-disable-next-line no-loop-func query.exec(function(res) { if (res[0][0]) height += res[0][0].height; state.current.listHeight.push(height); }); } }; var scrollTo = function scrollTo(index) { if (!index && index !== 0) { return; } if (!state.current.listHeight.length) { calculateHeight(); } var cacheIndex = index; if (index < 0) { cacheIndex = 0; } if (index > state.current.listHeight.length - 2) { cacheIndex = Math.max(0, state.current.listHeight.length - 2); } setCodeIndex(cacheIndex); var scrollTop = state.current.listHeight[cacheIndex]; setScrollTop(scrollTop); if (sticky && scrollY !== scrollTop) { setScrollY(Math.floor(scrollTop) > 0 ? 1 : 0); } }; var touchMove = function touchMove(e) { var firstTouch = e.touches[0]; touchState.current.y2 = firstTouch.pageY; var delta = (touchState.current.y2 - touchState.current.y1) / spaceHeight || 0; var cacheIndex = state.current.anchorIndex + Math.round(delta); setCodeIndex(cacheIndex); scrollTo(cacheIndex); }; var touchEnd = function touchEnd() { resetScrollState(); }; var touchStart = function touchStart(e) { var index = Number(getData(e.target)); var firstTouch = e.touches[0]; scrolling.current = true; touchState.current.y1 = firstTouch.pageY; state.current.anchorIndex = +index; setScrollStart(true); setCodeIndex(index); scrollTo(index); }; var handleClickItem = function handleClickItem(key, item) { onItemClick && onItemClick(key, item); setCurrentData(item); setCurrentKey(key); }; var handleClickIndex = function handleClickIndex(key) { onIndexClick && onIndexClick(key); }; var setListGroup = function setListGroup() { if (listview.current) { (0, _taro.createSelectorQuery)().selectAll(".".concat(classPrefix, "-").concat(uuid, " .nut-elevator-list-item")).node(function(el) { state.current.listGroup = (0, _to_consumable_array._)(Object.keys(el)); calculateHeight(); }).exec(); } }; var listViewScroll = function listViewScroll(e) { var listHeight = state.current.listHeight; if (!listHeight.length) { calculateHeight(); } var target = e.target; var scrollTop = target.scrollTop; state.current.scrollY = Math.floor(scrollTop); _taro.default.getEnv() === 'WEB' && setScrollTop(scrollTop); if (sticky && scrollTop !== scrollY) { setScrollY(Math.floor(scrollTop) > 0 ? 1 : 0); } if (scrolling.current) return; for(var i = 0; i < listHeight.length - 1; i++){ var height1 = listHeight[i]; var height2 = listHeight[i + 1]; if (state.current.scrollY >= height1 && state.current.scrollY < height2) { return setCodeIndex(i); } } }; var getWrapStyle = (0, _react.useMemo)(function() { var calcHeight = Number.isNaN(+height) ? height : "".concat(height, "px"); return { height: (0, _platformtaro.harmony)() ? Number(height) : calcHeight }; }, [ height ]); (0, _react.useEffect)(function() { if (listview.current) { (0, _taro.nextTick)(function() { setListGroup(); }); } }, [ listview ]); var _obj; return /*#__PURE__*/ _react.default.createElement("div", (0, _object_spread._)({ className: "".concat(classPrefix, " ").concat(className, " ").concat(classPrefix, "-").concat(uuid), style: style }, rest), /*#__PURE__*/ _react.default.createElement(_components.View, { className: "".concat(classPrefix, "-list"), style: getWrapStyle }, /*#__PURE__*/ _react.default.createElement(_components.ScrollView, { scrollTop: scrollTop, scrollY: true, scrollWithAnimation: true, scrollAnchoring: true, className: "".concat(classPrefix, "-list-inner"), type: "list", ref: listview, onScroll: listViewScroll, onTouchStart: function onTouchStart(e) { scrolling.current = false; } }, list.map(function(item, idx) { return /*#__PURE__*/ _react.default.createElement(_components.View, { className: "".concat(classPrefix, "-list-item nut-elevator-item-").concat(idx), key: idx }, /*#__PURE__*/ _react.default.createElement(_components.View, { className: "".concat(classPrefix, "-list-item-code") }, item[floorKey]), /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, item.list.map(function(subitem) { var _obj; return /*#__PURE__*/ _react.default.createElement(_components.View, { className: (0, _classnames.default)((_obj = {}, (0, _define_property._)(_obj, "".concat(classPrefix, "-list-item-name"), true), (0, _define_property._)(_obj, "".concat(classPrefix, "-list-item-name-highcolor"), currentData.id === subitem.id && currentKey === item[floorKey]), _obj)), key: subitem.id, onClick: function onClick() { return handleClickItem(item[floorKey], subitem); } }, children ? /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/ _react.default.createElement(elevatorContext.Provider, { value: subitem }, children)) : subitem.name); }))); }))), showKeys ? /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, list.length && scrollStart ? /*#__PURE__*/ _react.default.createElement(_components.View, { className: (0, _classnames.default)((_obj = {}, (0, _define_property._)(_obj, "".concat(classPrefix, "-code-current"), true), (0, _define_property._)(_obj, "".concat(classPrefix, "-code-current-current"), true), _obj)) }, list[codeIndex][floorKey]) : null, /*#__PURE__*/ _react.default.createElement(_components.View, { className: "".concat(classPrefix, "-bars") }, /*#__PURE__*/ _react.default.createElement(_components.View, { className: "".concat(classPrefix, "-bars-inner") }, list.map(function(item, index) { var _obj; return /*#__PURE__*/ _react.default.createElement(_components.View, { className: (0, _classnames.default)((_obj = {}, (0, _define_property._)(_obj, "".concat(classPrefix, "-bars-inner-item"), true), (0, _define_property._)(_obj, "".concat(classPrefix, "-bars-inner-item-active"), item[floorKey] === list[codeIndex][floorKey]), _obj)), "data-index": index, key: index, onClick: function onClick() { return handleClickIndex(item[floorKey]); }, onTouchStart: function onTouchStart(event) { return touchStart(event); }, onTouchMove: function onTouchMove(event) { return touchMove(event); }, onTouchEnd: touchEnd, style: { touchAction: 'pan-y' } }, item[floorKey]); })))) : null, sticky && scrollY > 0 ? /*#__PURE__*/ _react.default.createElement(_components.View, { className: "".concat(classPrefix, "-list-fixed") }, /*#__PURE__*/ _react.default.createElement(_components.Text, { className: "".concat(classPrefix, "-list-fixed-title") }, list[codeIndex][floorKey])) : null); }; Elevator.displayName = 'NutElevator'; Elevator.Context = elevatorContext;