UNPKG

zarm

Version:

基于 React 的移动端UI库

216 lines (168 loc) 8.41 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _core = _interopRequireDefault(require("@better-scroll/core")); var _wheel = _interopRequireDefault(require("@better-scroll/wheel")); var _bem = require("@zarm-design/bem"); var _isEqual = _interopRequireDefault(require("lodash/isEqual")); var _react = _interopRequireWildcard(require("react")); var _configProvider = require("../config-provider"); var _utils = require("../picker-view/utils"); var _hooks = require("../utils/hooks"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) { if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } } return n.default = e, t && t.set(e, n), n; } _core.default.use(_wheel.default); var getValue = function getValue(props) { var _props$fieldNames; if ('defaultValue' in props) { return props.defaultValue; } if ('value' in props) { return props.value; } if (Array.isArray(props.dataSource) && props.dataSource[0] && (_props$fieldNames = props.fieldNames) !== null && _props$fieldNames !== void 0 && _props$fieldNames.value) { var _props$fieldNames2; return props.dataSource[0][(_props$fieldNames2 = props.fieldNames) === null || _props$fieldNames2 === void 0 ? void 0 : _props$fieldNames2.value]; } }; var Wheel = function Wheel(props) { var className = props.className, value = props.value, defaultValue = props.defaultValue, dataSource = props.dataSource, disabled = props.disabled, stopScroll = props.stopScroll, itemRender = props.itemRender, onChange = props.onChange; var scrollInstance = (0, _react.useRef)(null); var wheelWrapperRef = /*#__PURE__*/(0, _react.createRef)(); var currentValue = getValue(props); var prevValue = (0, _hooks.usePrevious)(value); var prevDataSource = (0, _hooks.usePrevious)(dataSource); var prevStopScroll = (0, _hooks.usePrevious)(stopScroll); var _React$useContext = _react.default.useContext(_configProvider.ConfigContext), prefixCls = _React$useContext.prefixCls; var heightRef = _react.default.useRef(0); var bem = (0, _bem.createBEM)('wheel', { prefixCls: prefixCls }); var fieldNames = (0, _utils.resolvedFieldNames)(props.fieldNames); var getSelectedIndex = function getSelectedIndex(changedValue, newDataSource) { var index = 0; if (newDataSource) { newDataSource.some(function (item, i) { if (item[fieldNames.value] === changedValue) { index = i; return true; } return false; }); } return index; }; var fireValueChange = function fireValueChange(changedValue) { if (changedValue === currentValue) { return; } onChange === null || onChange === void 0 ? void 0 : onChange(changedValue); }; var handleScrollEnd = (0, _hooks.useEventCallback)(function () { var _scrollInstance$curre; var index = (_scrollInstance$curre = scrollInstance.current) === null || _scrollInstance$curre === void 0 ? void 0 : _scrollInstance$curre.getSelectedIndex(); var child = dataSource === null || dataSource === void 0 ? void 0 : dataSource[index]; if (child) { fireValueChange(child[fieldNames.value]); } }, []); (0, _hooks.useSafeLayoutEffect)(function () { var _wheelWrapperRef$curr, _scrollInstance$curre4; var resize; heightRef.current = ((_wheelWrapperRef$curr = wheelWrapperRef.current) === null || _wheelWrapperRef$curr === void 0 ? void 0 : _wheelWrapperRef$curr.clientHeight) || 0; var initIndex = getSelectedIndex(currentValue, dataSource); if (wheelWrapperRef.current) { var _scrollInstance$curre2; scrollInstance.current = new _core.default(wheelWrapperRef.current, { wheel: { selectedIndex: initIndex, wheelWrapperClass: bem('content'), wheelItemClass: bem('item') }, probeType: 3 }); if ((_scrollInstance$curre2 = scrollInstance.current.scroller) !== null && _scrollInstance$curre2 !== void 0 && _scrollInstance$curre2.wrapper) { resize = new ResizeObserver(function (entries) { var _scrollInstance$curre3; var _ref = entries || [], _ref2 = (0, _slicedToArray2.default)(_ref, 1), entry = _ref2[0]; if (entry.contentRect.height === heightRef.current) return; heightRef.current = entry.contentRect.height; (_scrollInstance$curre3 = scrollInstance.current) === null || _scrollInstance$curre3 === void 0 ? void 0 : _scrollInstance$curre3.refresh(); }); resize.observe(scrollInstance.current.scroller.wrapper); } } (_scrollInstance$curre4 = scrollInstance.current) === null || _scrollInstance$curre4 === void 0 ? void 0 : _scrollInstance$curre4.on('scrollEnd', function () { handleScrollEnd(); }); return function () { var _resize, _scrollInstance$curre5; (_resize = resize) === null || _resize === void 0 ? void 0 : _resize.disconnect(); (_scrollInstance$curre5 = scrollInstance.current) === null || _scrollInstance$curre5 === void 0 ? void 0 : _scrollInstance$curre5.destroy(); }; }, []); (0, _react.useEffect)(function () { var _scrollInstance$curre6; disabled && ((_scrollInstance$curre6 = scrollInstance.current) === null || _scrollInstance$curre6 === void 0 ? void 0 : _scrollInstance$curre6.disable()); }, [disabled]); (0, _react.useEffect)(function () { var _scrollInstance$curre7; if ((0, _isEqual.default)(prevDataSource, dataSource)) return; (_scrollInstance$curre7 = scrollInstance.current) === null || _scrollInstance$curre7 === void 0 ? void 0 : _scrollInstance$curre7.refresh(); var targetIndex = dataSource === null || dataSource === void 0 ? void 0 : dataSource.findIndex(function (item) { return item[fieldNames.value] === value; }); if (targetIndex >= 0) return; handleScrollEnd(); }, [dataSource, fieldNames, value]); (0, _react.useEffect)(function () { var oldIndex = getSelectedIndex(prevValue, prevDataSource); var newIndex = getSelectedIndex(value, dataSource); if (newIndex !== oldIndex) { var _scrollInstance$curre8; (_scrollInstance$curre8 = scrollInstance.current) === null || _scrollInstance$curre8 === void 0 ? void 0 : _scrollInstance$curre8.wheelTo(newIndex); } if (stopScroll && prevStopScroll !== stopScroll) { var _scrollInstance$curre9; (_scrollInstance$curre9 = scrollInstance.current) === null || _scrollInstance$curre9 === void 0 ? void 0 : _scrollInstance$curre9.stop(); } }, [value, defaultValue, dataSource, stopScroll, fieldNames.value]); var items = dataSource.map(function (item, index) { var itemCls = bem('item', [{ selected: currentValue === item[fieldNames.value], disabled: disabled }]); return /*#__PURE__*/_react.default.createElement("div", { key: +index, className: itemCls }, (itemRender === null || itemRender === void 0 ? void 0 : itemRender(item)) || (item === null || item === void 0 ? void 0 : item[fieldNames.label])); }); return /*#__PURE__*/_react.default.createElement("div", { className: bem([className]), ref: wheelWrapperRef }, /*#__PURE__*/_react.default.createElement("div", { className: bem('content') }, items)); }; Wheel.displayName = 'Wheel'; Wheel.defaultProps = { dataSource: [], stopScroll: false }; var _default = Wheel; exports.default = _default;