UNPKG

@nutui/nutui-react-taro

Version:

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

253 lines (252 loc) 11 kB
import { _ as _object_spread } from "@swc/helpers/_/_object_spread"; import { _ as _object_spread_props } from "@swc/helpers/_/_object_spread_props"; import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array"; import React, { useEffect, useMemo, useState } from "react"; import { View } from "@tarojs/components"; import Popup from "../popup/index"; import Elevator from "../elevator/index"; import { normalizeListOptions, normalizeOptions } from "../cascader/utils"; import { transformData, findDataByName } from "./utils"; import { ComponentDefaults } from "../../utils/typings"; import { mergeProps } from "../../utils/merge-props"; import { usePropsValue } from "../../hooks/use-props-value"; import { isEmpty } from "../../utils/is-empty"; import { useConfig } from "../configprovider/index"; var defaultProps = _object_spread_props(_object_spread({}, 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() {}, onChange: function() {}, onPathChange: function() {} }); export var ElevatorRender = function(props) { var _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 = 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 = _sliced_to_array(usePropsValue({ value: outerValue, defaultValue: outerDefaultValue, finalValue: [], onChange: function(value) { onChange(value, []); onPathChange(value, []); } }), 2), value = _usePropsValue[0], setValue = _usePropsValue[1]; var _useState = _sliced_to_array(useState(outerOptions), 2), innerOptions = _useState[0], setInnerOptions = _useState[1]; var _useState1 = _sliced_to_array(useState(value), 2), innerValue = _useState1[0], setInnerValue = _useState1[1]; var _useState2 = _sliced_to_array(useState([]), 2), elevatorOptions = _useState2[0], setElevatorOptions = _useState2[1]; var _useState3 = _sliced_to_array(useState(selectProvince), 2), addressTip = _useState3[0], setAddressTip = _useState3[1]; var _useState4 = _sliced_to_array(useState(0), 2), levelIndex = _useState4[0], setLevelIndex = _useState4[1]; var _useState5 = _sliced_to_array(useState(0), 2), tabActiveIndex = _useState5[0], setTabActiveIndex = _useState5[1]; // 初始化数据,只格式化一次;动态数据todo var options = useMemo(function() { if (!isEmpty(format)) { return transformData(normalizeListOptions(innerOptions, format)); } if (!isEmpty(optionKey)) { return transformData(normalizeOptions(innerOptions, optionKey) || []); } return transformData(innerOptions); }, [ innerOptions, optionKey, format ]); useEffect(function() { setElevatorOptions(options); }, [ options ]); var levels = 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 = _sliced_to_array(usePropsValue({ value: outerVisible, defaultValue: undefined, onChange: function(value) { if (value === false) onClose(); } }), 2), visible = _usePropsValue1[0], setVisible = _usePropsValue1[1]; useEffect(function() { if (!visible) setInnerValue(value); }, [ visible, value ]); useEffect(function() { setInnerOptions(outerOptions); }, [ outerOptions ]); useEffect(function() { setTabActiveIndex(levels.length - 1); setAddressTip(innerValue.length ? select : selectProvince); }, [ innerValue ]); var handleElevatorItemClick = function(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(hotItem) { // 通过修改 innerValue 构造 level 数据 var distData = 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() { if (!levels.length || !levels[0].name) return null; return /*#__PURE__*/ React.createElement(View, { className: "".concat(classPrefix, "-selected") }, levels.map(function(item, index) { var _levels_; return /*#__PURE__*/ React.createElement(React.Fragment, { key: "adtabs-".concat(index) }, item.name && /*#__PURE__*/ React.createElement(View, { className: "".concat(classPrefix, "-selected-item ").concat(item.current ? 'active' : ''), onClick: function() { 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.createElement(View, { className: "".concat(classPrefix, "-selected-border") }, "-")); })); }; var renderHotCity = function() { if (levels.length && tabActiveIndex !== 0) return null; return /*#__PURE__*/ React.createElement(React.Fragment, null, /*#__PURE__*/ React.createElement(View, { className: "".concat(classPrefix, "-title") }, hotCity), /*#__PURE__*/ React.createElement(View, { className: "".concat(classPrefix, "-hotlist ").concat(hotList.length > MAX_LENGTH ? 'hotlist-more' : '') }, hotList.map(function(item, index) { return /*#__PURE__*/ React.createElement(View, { className: "".concat(classPrefix, "-hotlist-item"), key: "hot-".concat(index), onClick: function() { return handleHotItemClick(item); } }, item.name); }))); }; var renderArea = function() { return /*#__PURE__*/ React.createElement(React.Fragment, null, /*#__PURE__*/ React.createElement(View, { className: "".concat(classPrefix, "-title") }, addressTip), /*#__PURE__*/ React.createElement(Elevator, { className: "".concat(classPrefix, "-elevator"), list: elevatorOptions, onItemClick: function(key, item) { return handleElevatorItemClick(item, levelIndex); }, // height="67%" style: { height: '100%' }, height: "93%" })); }; var renderContent = function() { return /*#__PURE__*/ React.createElement(React.Fragment, null, renderTabs(), /*#__PURE__*/ React.createElement(View, { style: { height: innerValue.length ? '80%' : '93%', overflowY: levels.length && tabActiveIndex !== 0 ? 'hidden' : 'auto' } }, renderHotCity(), renderArea())); }; return popup ? /*#__PURE__*/ React.createElement(Popup, _object_spread_props(_object_spread({}, popupProps), { visible: visible, position: "bottom", style: { height: '89%' }, round: true, closeIcon: closeIcon, closeable: closeable, closeIconPosition: closeIconPosition, title: title, left: left, onOverlayClick: function() { return setVisible(false); }, onCloseIconClick: function() { return setVisible(false); } }), renderContent()) : renderContent(); }; ElevatorRender.displayName = 'NutElevatorRender';