UNPKG

gui-one-nutui-react-taro

Version:

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

616 lines (615 loc) 23.8 kB
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray"; import _slicedToArray from "@babel/runtime/helpers/slicedToArray"; import _defineProperty from "@babel/runtime/helpers/defineProperty"; import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties"; var _excluded = ["children", "type", "existAddress", "selectedIcon", "defaultIcon", "isShowCustomAddress", "customAndExistTitle", "onSelected", "onClose", "onSwitchModule"], _excluded2 = ["children", "type", "modelValue", "height", "province", "city", "country", "town", "onNextArea", "onTabClick", "onClose"], _excluded3 = ["modelValue", "modelSelect", "children", "type", "height", "customAddressTitle", "existAddress", "existAddressTitle", "province", "city", "country", "town", "isShowCustomAddress", "customAndExistTitle", "selectedIcon", "defaultIcon", "closeBtnIcon", "backBtnIcon", "onChange", "onSelected", "onClose", "closeMask", "switchModule", "onTabChecked", "style", "className", "iconClassPrefix", "iconFontClassName"]; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } import React__default, { useEffect, useState, useRef } from 'react'; import { I as Icon$1 } from './icon.taro-1d0d4fb7.js'; import { P as Popup } from './popup.taro-33d0bbc8.js'; import { c as cn } from './bem-893ad28d.js'; import { I as Icon } from './icon-8dc4de10.js'; import { u as useConfig } from './configprovider-3e87d67a.js'; import { E as Elevator } from './elevator.taro-d7d65470.js'; import Taro from '@tarojs/taro'; import { u as useConfig$1 } from './configprovider.taro-6c7b3056.js'; import { C as ComponentDefaults } from './typings-1c5f2628.js'; var defaultProps$2 = { type: 'custom', existAddress: [], defaultIcon: 'location2', selectedIcon: 'Check', isShowCustomAddress: true, customAndExistTitle: '选择其他地址' }; var ExistRender = function ExistRender(props) { var _useConfig = useConfig(), locale = _useConfig.locale; var _defaultProps$2$props = _objectSpread(_objectSpread({}, defaultProps$2), props), children = _defaultProps$2$props.children, type = _defaultProps$2$props.type, existAddress = _defaultProps$2$props.existAddress, selectedIcon = _defaultProps$2$props.selectedIcon, defaultIcon = _defaultProps$2$props.defaultIcon, isShowCustomAddress = _defaultProps$2$props.isShowCustomAddress, customAndExistTitle = _defaultProps$2$props.customAndExistTitle, onSelected = _defaultProps$2$props.onSelected, onClose = _defaultProps$2$props.onClose, onSwitchModule = _defaultProps$2$props.onSwitchModule, rest = _objectWithoutProperties(_defaultProps$2$props, _excluded); var b = cn('address'); // 选择现有地址 var selectedExist = function selectedExist(item) { var copyExistAdd = existAddress; var prevExistAdd = { provinceName: '', cityName: '', countyName: '', townName: '', addressDetail: '', selectedAddress: false }; copyExistAdd.forEach(function (list, index) { if (list && list.selectedAddress) { prevExistAdd = list; } list.selectedAddress = false; }); item.selectedAddress = true; onSelected && onSelected(prevExistAdd, item, copyExistAdd); }; // 选择其他地址 var switchModule = function switchModule() { onSwitchModule && onSwitchModule({ type: type === 'exist' ? 'custom' : 'exist' }); }; useEffect(function () {}, [existAddress]); return React__default.createElement("div", { className: b('exist') }, React__default.createElement("div", { className: b('exist-group') }, React__default.createElement("ul", { className: b('exist-ul') }, existAddress.map(function (item, index) { return React__default.createElement("li", { className: b('exist-item'), key: index }, React__default.createElement("div", { onClick: function onClick() { return selectedExist(item); } }, React__default.createElement(Icon, { className: b('exist-item-icon'), name: item.selectedAddress ? selectedIcon : defaultIcon, color: item.selectedAddress ? '#FA2C19' : '', size: "13px" }), React__default.createElement("div", { className: b('exist-item-info') }, item.name && item.phone && React__default.createElement("div", { className: "exist-item-info-top" }, React__default.createElement("div", { className: "exist-item-info-name" }, item.name), React__default.createElement("div", { className: "exist-item-info-phone" }, item.phone)), React__default.createElement("div", { className: "exist-item-info-bottom" }, React__default.createElement("div", null, item.provinceName + item.cityName + item.countyName + item.townName + item.addressDetail))))); }))), isShowCustomAddress && React__default.createElement("div", { className: b('choose-other'), onClick: switchModule }, React__default.createElement("div", { className: b('choose-other-btn') }, locale.address.chooseAnotherAddress || customAndExistTitle))); }; var defaultProps$1 = { modelValue: [], type: 'custom', province: [], city: [], country: [], town: [], height: '200px' }; var CustomRender = function CustomRender(props) { var _useConfig2 = useConfig(), locale = _useConfig2.locale; var _defaultProps$1$props = _objectSpread(_objectSpread({}, defaultProps$1), props), children = _defaultProps$1$props.children, type = _defaultProps$1$props.type, modelValue = _defaultProps$1$props.modelValue, height = _defaultProps$1$props.height, province = _defaultProps$1$props.province, city = _defaultProps$1$props.city, country = _defaultProps$1$props.country, town = _defaultProps$1$props.town, onNextArea = _defaultProps$1$props.onNextArea, onTabClick = _defaultProps$1$props.onTabClick, onClose = _defaultProps$1$props.onClose, rest = _objectWithoutProperties(_defaultProps$1$props, _excluded2); var b = cn('address'); var _useState = useState(type), _useState2 = _slicedToArray(_useState, 1), privateType = _useState2[0]; var _useState3 = useState(0), _useState4 = _slicedToArray(_useState3, 2), tabIndex = _useState4[0], setTabIndex = _useState4[1]; var _useState5 = useState(['province', 'city', 'country', 'town']), _useState6 = _slicedToArray(_useState5, 1), tabName = _useState6[0]; useRef(null); useRef(null); useRef(null); useRef(null); var regionLine = useRef(null); var isCustom2 = function isCustom2() { return type === 'custom2'; }; var transformData = function transformData(data) { if (!Array.isArray(data)) throw new TypeError('params muse be array.'); if (!data.length) return []; data.forEach(function (item) { if (!item.title) { console.error('[NutUI] <Address> 请检查数组选项的 title 值是否有设置 ,title 为必填项 .'); } }); var newData = []; data = data.sort(function (a, b) { return a.title.localeCompare(b.title); }); data.forEach(function (item) { var index = newData.findIndex(function (value) { return value.title === item.title; }); if (index <= -1) { newData.push({ title: item.title, list: [].concat(item) }); } else { newData[index] = { title: item.title, list: newData[index].list.concat(item) }; } }); return newData; }; var _useState7 = useState({ province: isCustom2() ? transformData(province) : province, city: isCustom2() ? transformData(city) : city, country: isCustom2() ? transformData(country) : country, town: isCustom2() ? transformData(town) : town }), _useState8 = _slicedToArray(_useState7, 2), regionList = _useState8[0], setRegionList = _useState8[1]; // 已选择的 省、市、县、镇 var _useState9 = useState({ province: { name: '' }, city: { name: '' }, country: { name: '' }, town: { name: '' } }), _useState10 = _slicedToArray(_useState9, 2), selectedRegion = _useState10[0], setSelectedRegion = _useState10[1]; var _useState11 = useState(20), _useState12 = _slicedToArray(_useState11, 2), lineDistance = _useState12[0], setLineDistance = _useState12[1]; // 获取已选地区列表名称 var getTabName = function getTabName(item, index) { if (tabIndex > index) { return item.name; } return locale.select; }; // 移动下面的红线 var lineAnimation = function lineAnimation(index) { setTimeout(function () { var name = tabName[index]; Taro.createSelectorQuery().selectAll(".".concat(name)).boundingClientRect(function (rects) { rects && rects.length > 0 && rects.forEach(function (rect) { if (rect.width > 0) setLineDistance(rect.left || 20); }); }).exec(); }, 100); }; // 切换下一级列表 var nextAreaList = function nextAreaList(item) { // onchange 接收的参数 var calBack = { next: '', value: '', custom: tabName[tabIndex] }; var bbselectedRegion = selectedRegion ? _objectSpread({}, selectedRegion) : null; if (bbselectedRegion) { setSelectedRegion(_objectSpread(_objectSpread({}, bbselectedRegion), {}, _defineProperty({}, tabName[tabIndex], item))); calBack.selectedRegion = _objectSpread(_objectSpread({}, bbselectedRegion), {}, _defineProperty({}, tabName[tabIndex], item)); for (var i = tabIndex; i < tabIndex - 1; i++) { setSelectedRegion(_objectSpread(_objectSpread({}, bbselectedRegion), {}, _defineProperty({}, tabName[i + 1], null))); calBack.selectedRegion = _objectSpread(_objectSpread({}, bbselectedRegion), {}, _defineProperty({}, tabName[i + 1], {})); } } if (tabIndex < 4) { // 切换下一个 if (tabIndex === 3) { calBack.next = ''; } else { setTabIndex(function () { return tabIndex + 1; }); lineAnimation(tabIndex + 1); calBack.next = tabName[tabIndex + 1]; } calBack.value = item; onNextArea && onNextArea(calBack); } else { onClose && onClose(); } }; // 切换地区Tab var changeRegionTab = function changeRegionTab(item, index, key) { if (getTabName(item, index)) { setTabIndex(index); lineAnimation(index); } onTabClick && onTabClick(key); }; // 默认选中项 var initCustomSelected = function initCustomSelected() { if (modelValue.length > 0) { var tagIndex = 0; var selectedRegionC = selectedRegion && Object.assign(selectedRegion); for (var index = 0; index < modelValue.length; index++) { if (regionList[tabName[index]].length === 0) { tagIndex = index - 1; setTabIndex(index - 1); break; } else { (function () { var val = modelValue[index]; var arr = regionList[tabName[index]]; if (privateType === 'custom') { selectedRegionC[[tabName[index]]] = arr.filter(function (item) { return item.id === val; })[0]; } else if (privateType === 'custom2') { var sumArr = []; arr.forEach(function (item) { sumArr.push.apply(sumArr, _toConsumableArray(item.list)); }); selectedRegionC[[tabName[index]]] = sumArr.filter(function (item) { return item.id === val; })[0]; } tagIndex = index; setSelectedRegion(selectedRegionC); })(); } } setTabIndex(tagIndex); lineAnimation(tagIndex); } }; var handleElevatorItem = function handleElevatorItem(key, item) { nextAreaList(item); }; useEffect(function () { var _defaultProps$1$props2 = _objectSpread(_objectSpread({}, defaultProps$1), props), province = _defaultProps$1$props2.province; setRegionList(_objectSpread(_objectSpread({}, regionList), {}, { province: isCustom2() ? transformData(province) : province })); }, [province]); useEffect(function () { var _defaultProps$1$props3 = _objectSpread(_objectSpread({}, defaultProps$1), props), city = _defaultProps$1$props3.city; setRegionList(_objectSpread(_objectSpread({}, regionList), {}, { city: isCustom2() ? transformData(city) : city })); }, [city]); useEffect(function () { var _defaultProps$1$props4 = _objectSpread(_objectSpread({}, defaultProps$1), props), country = _defaultProps$1$props4.country; setRegionList(_objectSpread(_objectSpread({}, regionList), {}, { country: isCustom2() ? transformData(country) : country })); }, [country]); useEffect(function () { var _defaultProps$1$props5 = _objectSpread(_objectSpread({}, defaultProps$1), props), town = _defaultProps$1$props5.town; setRegionList(_objectSpread(_objectSpread({}, regionList), {}, { town: isCustom2() ? transformData(town) : town })); }, [town]); useEffect(function () { initCustomSelected(); }, [modelValue]); return React__default.createElement("div", { className: b('custom') }, React__default.createElement("div", { className: b('region-tab') }, selectedRegion && Object.keys(selectedRegion).map(function (key, index) { return React__default.createElement("div", { className: "".concat(b('tab-item'), " ").concat(index === tabIndex ? 'active' : '', " ").concat(tabName[index]), key: index, onClick: function onClick() { return changeRegionTab(selectedRegion[key], index, key); } }, index <= tabIndex && React__default.createElement("div", null, getTabName(selectedRegion[key], index))); }), React__default.createElement("div", { className: b('tab-line'), ref: regionLine, style: { left: "".concat(lineDistance, "px") } })), privateType === 'custom' && React__default.createElement("div", { className: b('region-con') }, React__default.createElement("ul", { className: b('region-group') }, regionList[tabName[tabIndex]].map(function (item, index) { return React__default.createElement("li", { key: index, className: b('region-item') }, React__default.createElement("div", { onClick: function onClick() { nextAreaList(item); } }, selectedRegion && selectedRegion[tabName[tabIndex]].id === item.id && React__default.createElement(Icon, { className: b('region-item--icon'), name: "Check", color: "#FA2C19", size: "13px" }), item.name)); }))), privateType === 'custom2' && React__default.createElement("div", { className: b('elevator-group') }, React__default.createElement(Elevator, { height: height, indexList: regionList[tabName[tabIndex]], onClickItem: handleElevatorItem }))); }; var defaultProps = _objectSpread(_objectSpread({}, ComponentDefaults), {}, { modelValue: false, modelSelect: [], type: 'custom', customAddressTitle: '请选择所在地区', province: [], city: [], country: [], town: [], isShowCustomAddress: true, existAddress: [], existAddressTitle: '配送至', customAndExistTitle: '选择其他地址', height: '200px', defaultIcon: 'location2', selectedIcon: 'Check', closeBtnIcon: 'circle-close', backBtnIcon: 'left' }); var Address = function Address(props) { var _useConfig$ = useConfig$1(), locale = _useConfig$.locale; var _defaultProps$props = _objectSpread(_objectSpread({}, defaultProps), props), modelValue = _defaultProps$props.modelValue, modelSelect = _defaultProps$props.modelSelect, children = _defaultProps$props.children, type = _defaultProps$props.type, height = _defaultProps$props.height, customAddressTitle = _defaultProps$props.customAddressTitle, existAddress = _defaultProps$props.existAddress, existAddressTitle = _defaultProps$props.existAddressTitle, province = _defaultProps$props.province, city = _defaultProps$props.city, country = _defaultProps$props.country, town = _defaultProps$props.town, isShowCustomAddress = _defaultProps$props.isShowCustomAddress, customAndExistTitle = _defaultProps$props.customAndExistTitle, selectedIcon = _defaultProps$props.selectedIcon, defaultIcon = _defaultProps$props.defaultIcon, closeBtnIcon = _defaultProps$props.closeBtnIcon, backBtnIcon = _defaultProps$props.backBtnIcon, onChange = _defaultProps$props.onChange, onSelected = _defaultProps$props.onSelected, onClose = _defaultProps$props.onClose, closeMask = _defaultProps$props.closeMask, switchModule = _defaultProps$props.switchModule, onTabChecked = _defaultProps$props.onTabChecked, style = _defaultProps$props.style, className = _defaultProps$props.className, iconClassPrefix = _defaultProps$props.iconClassPrefix, iconFontClassName = _defaultProps$props.iconFontClassName, rest = _objectWithoutProperties(_defaultProps$props, _excluded3); var b = cn('address'); var _useState13 = useState(type), _useState14 = _slicedToArray(_useState13, 2), privateType = _useState14[0], setPrivateType = _useState14[1]; var _useState15 = useState(['province', 'city', 'country', 'town']), _useState16 = _slicedToArray(_useState15, 1), tabName = _useState16[0]; var _useState17 = useState(modelValue), _useState18 = _slicedToArray(_useState17, 2), showPopup = _useState18[0], setShowPopup = _useState18[1]; var _useState19 = useState({ province: { name: '' }, city: { name: '' }, country: { name: '' }, town: { name: '' } }), _useState20 = _slicedToArray(_useState19, 2), selectedRegion = _useState20[0], setSelectedRegion = _useState20[1]; // 已选择的 省、市、县、镇 var _useState21 = useState({}), _useState22 = _slicedToArray(_useState21, 2), selectedExistAddress = _useState22[0], setSelectedExistAddress = _useState22[1]; // 当前选择的地址 // 手动关闭 点击叉号(cross),或者蒙层(mask) var handClose = function handClose() { setShowPopup(false); }; // 点击遮罩层关闭 var clickOverlay = function clickOverlay() { closeMask && closeMask({ closeWay: 'mask' }); }; // 切换下一级列表 var nextAreaList = function nextAreaList(item) { // onchange 接收的参数 var callbackParams = { next: item.next, value: item.value, custom: item.custom }; setSelectedRegion(_objectSpread({}, item.selectedRegion)); onChange && onChange(callbackParams); }; // 选择现有地址 var selectedExist = function selectedExist(prevExistAdd, item, copyExistAdd) { setSelectedExistAddress(item); onSelected && onSelected(prevExistAdd, item, copyExistAdd); handClose(); }; // 初始化 var initAddress = function initAddress() { for (var i = 0; i < tabName.length; i++) { setSelectedRegion(_objectSpread(_objectSpread({}, selectedRegion), {}, _defineProperty({}, tabName[i], {}))); } }; // 关闭 var closeFun = function closeFun() { var resCopy = _objectSpread({ addressIdStr: '', addressStr: '' }, selectedRegion); var res = { data: _objectSpread({ addressIdStr: '', addressStr: '' }, selectedRegion), type: privateType }; if (privateType === 'custom' || privateType === 'custom2') { var _province = resCopy.province, _city = resCopy.city, _country = resCopy.country, _town = resCopy.town; resCopy.addressIdStr = [_province.id || 0, _city.id || 0, _country.id || 0, _town.id || 0].join('_'); resCopy.addressStr = [_province.name, _city.name, _country.name, _town.name].join(''); res.data = resCopy; } else { res.data = selectedExistAddress; } initAddress(); onClose && onClose(res); }; // 选择其他地址 var onSwitchModule = function onSwitchModule() { if (privateType === 'exist') { setPrivateType('custom'); } else { setPrivateType('exist'); } initAddress(); switchModule && switchModule({ type: privateType }); }; var headerRender = function headerRender() { return React__default.createElement("div", { className: b('header') }, React__default.createElement("div", { className: "arrow-back", onClick: onSwitchModule }, privateType === 'custom' && backBtnIcon && React__default.createElement(Icon$1, { classPrefix: iconClassPrefix, fontClassName: iconFontClassName, name: backBtnIcon, color: "#cccccc" })), React__default.createElement("div", { className: b('header__title') }, privateType === 'custom' ? locale.address.selectRegion || customAddressTitle : locale.address.deliveryTo || existAddressTitle), React__default.createElement("div", { onClick: function onClick() { return handClose(); } }, closeBtnIcon && React__default.createElement(Icon$1, { classPrefix: iconClassPrefix, fontClassName: iconFontClassName, name: closeBtnIcon, color: "#cccccc", size: "18px" }))); }; useEffect(function () { setShowPopup(modelValue); }, [modelValue]); useEffect(function () { if (!showPopup) { closeFun(); } }, [showPopup]); return React__default.createElement(React__default.Fragment, null, showPopup && React__default.createElement(Popup, { visible: showPopup, position: "bottom", onClickOverlay: clickOverlay, onClose: function onClose() { closeFun(); } }, React__default.createElement("div", _objectSpread({ className: "".concat(b(), " ").concat(className || ''), style: _objectSpread({}, style) }, rest), headerRender(), (privateType === 'custom' || privateType === 'custom2') && React__default.createElement(CustomRender, { modelValue: modelSelect, type: privateType, province: province, city: city, country: country, town: town, height: height, onNextArea: function onNextArea(cal) { nextAreaList && nextAreaList(cal); }, onTabClick: function onTabClick(type) { onTabChecked && onTabChecked(type); }, onClose: handClose }), privateType === 'exist' && React__default.createElement(ExistRender, { type: privateType, existAddress: existAddress, selectedIcon: selectedIcon, defaultIcon: defaultIcon, isShowCustomAddress: isShowCustomAddress, customAndExistTitle: locale.address.chooseAnotherAddress || customAndExistTitle, onSelected: selectedExist, onSwitchModule: onSwitchModule })))); }; Address.defaultProps = defaultProps; Address.displayName = 'NutAddress'; export { Address as A };