UNPKG

@nutui/nutui-react

Version:

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

263 lines (262 loc) 12.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "ElevatorRender", { enumerable: true, get: function() { return ElevatorRender; } }); var _interop_require_default = require("@swc/helpers/_/_interop_require_default"); var _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard"); var _object_spread = require("@swc/helpers/_/_object_spread"); var _object_spread_props = require("@swc/helpers/_/_object_spread_props"); var _sliced_to_array = require("@swc/helpers/_/_sliced_to_array"); var _react = /*#__PURE__*/ _interop_require_wildcard._(require("react")); var _popup = /*#__PURE__*/ _interop_require_default._(require("../popup")); var _elevator = /*#__PURE__*/ _interop_require_default._(require("../elevator")); var _utils = require("../cascader/utils"); var _utils1 = require("./utils"); var _typings = require("../../utils/typings"); var _mergeprops = require("../../utils/merge-props"); var _usepropsvalue = require("../../hooks/use-props-value"); var _isempty = require("../../utils/is-empty"); var _configprovider = require("../configprovider"); var defaultProps = (0, _object_spread_props._)((0, _object_spread._)({}, _typings.ComponentDefaults), { visible: false, type: 'elevator', options: [], optionKey: { textKey: 'text', valueKey: 'value', childrenKey: 'children' }, format: {}, height: '200px', activeColor: '', activeIcon: 'checklist', popup: true, closeable: false, closeIconPosition: 'top-right', closeIcon: 'close', lazy: false, hotList: [], onClose: function onClose() {}, onChange: function onChange() {}, onPathChange: function onPathChange() {} }); var ElevatorRender = function ElevatorRender(props) { var _mergeProps = (0, _mergeprops.mergeProps)(defaultProps, props), hotList = _mergeProps.hotList, title = _mergeProps.title, left = _mergeProps.left, optionKey = _mergeProps.optionKey, format = _mergeProps.format, onClose = _mergeProps.onClose, onChange = _mergeProps.onChange, onPathChange = _mergeProps.onPathChange, popup = _mergeProps.popup, _mergeProps_popupProps = _mergeProps.popupProps, popupProps = _mergeProps_popupProps === void 0 ? {} : _mergeProps_popupProps, outerVisible = _mergeProps.visible, outerOptions = _mergeProps.options, outerValue = _mergeProps.value, outerDefaultValue = _mergeProps.defaultValue, closeable = _mergeProps.closeable, closeIconPosition = _mergeProps.closeIconPosition, closeIcon = _mergeProps.closeIcon; var _useConfig = (0, _configprovider.useConfig)(), _useConfig_locale = _useConfig.locale, select = _useConfig_locale.select, _useConfig_locale_address = _useConfig_locale.address, hotCity = _useConfig_locale_address.hotCity, selectProvince = _useConfig_locale_address.selectProvince; var classPrefix = 'nut-address'; var MAX_LENGTH = 10; var _usePropsValue = (0, _sliced_to_array._)((0, _usepropsvalue.usePropsValue)({ value: outerValue, defaultValue: outerDefaultValue, finalValue: [], onChange: function onChange1(value) { onChange(value, []); onPathChange(value, []); } }), 2), value = _usePropsValue[0], setValue = _usePropsValue[1]; var _useState = (0, _sliced_to_array._)((0, _react.useState)(outerOptions), 2), innerOptions = _useState[0], setInnerOptions = _useState[1]; var _useState1 = (0, _sliced_to_array._)((0, _react.useState)(value), 2), innerValue = _useState1[0], setInnerValue = _useState1[1]; var _useState2 = (0, _sliced_to_array._)((0, _react.useState)([]), 2), elevatorOptions = _useState2[0], setElevatorOptions = _useState2[1]; var _useState3 = (0, _sliced_to_array._)((0, _react.useState)(selectProvince), 2), addressTip = _useState3[0], setAddressTip = _useState3[1]; var _useState4 = (0, _sliced_to_array._)((0, _react.useState)(0), 2), levelIndex = _useState4[0], setLevelIndex = _useState4[1]; var _useState5 = (0, _sliced_to_array._)((0, _react.useState)(0), 2), tabActiveIndex = _useState5[0], setTabActiveIndex = _useState5[1]; // 初始化数据,只格式化一次;动态数据todo var options = (0, _react.useMemo)(function() { if (!(0, _isempty.isEmpty)(format)) { return (0, _utils1.transformData)((0, _utils.normalizeListOptions)(innerOptions, format)); } if (!(0, _isempty.isEmpty)(optionKey)) { return (0, _utils1.transformData)((0, _utils.normalizeOptions)(innerOptions, optionKey) || []); } return (0, _utils1.transformData)(innerOptions); }, [ innerOptions, optionKey, format ]); (0, _react.useEffect)(function() { setElevatorOptions(options); }, [ options ]); var levels = (0, _react.useMemo)(function() { var next = []; var end = false; var currentOptions = options; innerValue.forEach(function(val, index) { var opt = currentOptions === null || currentOptions === void 0 ? void 0 : currentOptions.flatMap(function(o) { return o.list.find(function(item) { return item.name === val; }); }).filter(function(item) { return item !== undefined; })[0]; next.push({ name: val, children: currentOptions, levelIndex: index, current: index === tabActiveIndex }); if (opt === null || opt === void 0 ? void 0 : opt.children) { currentOptions = opt.children; } else { end = true; } }); if (!end) { next.push({ name: null, children: currentOptions, levels: -1, current: false }); } return next; }, [ innerValue, options, tabActiveIndex ]); var _usePropsValue1 = (0, _sliced_to_array._)((0, _usepropsvalue.usePropsValue)({ value: outerVisible, defaultValue: undefined, onChange: function onChange(value) { if (value === false) onClose(); } }), 2), visible = _usePropsValue1[0], setVisible = _usePropsValue1[1]; (0, _react.useEffect)(function() { if (!visible) setInnerValue(value); }, [ visible, value ]); (0, _react.useEffect)(function() { setInnerOptions(outerOptions); }, [ outerOptions ]); (0, _react.useEffect)(function() { setTabActiveIndex(levels.length - 1); setAddressTip(innerValue.length ? select : selectProvince); }, [ innerValue ]); var handleElevatorItemClick = function handleElevatorItemClick(elevatorItem, levelIndex) { var _elevatorItem_children; var nextValue = innerValue.slice(0, levelIndex); if (elevatorItem.name) { nextValue[levelIndex] = elevatorItem.name; } setInnerValue(nextValue); if ((_elevatorItem_children = elevatorItem.children) === null || _elevatorItem_children === void 0 ? void 0 : _elevatorItem_children.length) { setElevatorOptions(elevatorItem.children); setLevelIndex(levelIndex + 1); } else { setVisible(false); setValue(nextValue); } }; var handleHotItemClick = function handleHotItemClick(hotItem) { // 通过修改 innerValue 构造 level 数据 var distData = (0, _utils1.findDataByName)(options, hotItem.name); // 热门城市主要是一级城市和二级城市,可以扩展。TODO if (distData) { var nextValue = [ distData.pName, distData.name ].filter(function(item) { return item !== ''; }); setInnerValue(nextValue); setElevatorOptions(distData.children); setLevelIndex(nextValue.length); } }; var renderTabs = function renderTabs() { if (!levels.length || !levels[0].name) return null; return /*#__PURE__*/ _react.default.createElement("div", { className: "".concat(classPrefix, "-selected") }, levels.map(function(item, index) { var _levels_; return /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, { key: "adtabs-".concat(index) }, item.name && /*#__PURE__*/ _react.default.createElement("div", { className: "".concat(classPrefix, "-selected-item ").concat(item.current ? 'active' : ''), onClick: function onClick() { var _props_onTabsChange; (_props_onTabsChange = props.onTabsChange) === null || _props_onTabsChange === void 0 ? void 0 : _props_onTabsChange.call(props, index); setTabActiveIndex(index); setLevelIndex(index); setElevatorOptions(item.children); } }, item.name), ((_levels_ = levels[index + 1]) === null || _levels_ === void 0 ? void 0 : _levels_.name) && /*#__PURE__*/ _react.default.createElement("div", { className: "".concat(classPrefix, "-selected-border") }, "-")); })); }; var renderHotCity = function renderHotCity() { if (levels.length && tabActiveIndex !== 0) return null; return /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/ _react.default.createElement("div", { className: "".concat(classPrefix, "-title") }, hotCity), /*#__PURE__*/ _react.default.createElement("div", { className: "".concat(classPrefix, "-hotlist ").concat(hotList.length > MAX_LENGTH ? 'hotlist-more' : '') }, hotList.map(function(item, index) { return /*#__PURE__*/ _react.default.createElement("div", { className: "".concat(classPrefix, "-hotlist-item"), key: "hot-".concat(index), onClick: function onClick() { return handleHotItemClick(item); } }, item.name); }))); }; var renderArea = function renderArea() { return /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/ _react.default.createElement("div", { className: "".concat(classPrefix, "-title") }, addressTip), /*#__PURE__*/ _react.default.createElement(_elevator.default, { className: "".concat(classPrefix, "-elevator"), list: elevatorOptions, onItemClick: function onItemClick(key, item) { return handleElevatorItemClick(item, levelIndex); }, style: { height: '100%' }, height: "93%" })); }; var renderContent = function renderContent() { return /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, renderTabs(), /*#__PURE__*/ _react.default.createElement("div", { style: { height: innerValue.length ? '80%' : '93%', overflowY: levels.length && tabActiveIndex !== 0 ? 'hidden' : 'auto' } }, renderHotCity(), renderArea())); }; return popup ? /*#__PURE__*/ _react.default.createElement(_popup.default, (0, _object_spread_props._)((0, _object_spread._)({}, popupProps), { visible: visible, position: "bottom", style: { height: '89%' }, round: true, closeIcon: closeIcon, closeable: closeable, closeIconPosition: closeIconPosition, title: title, left: left, onOverlayClick: function onOverlayClick() { return setVisible(false); }, onCloseIconClick: function onCloseIconClick() { return setVisible(false); } }), renderContent()) : renderContent(); }; ElevatorRender.displayName = 'NutElevatorRender';