mini-check
Version:
213 lines (209 loc) • 9.17 kB
JavaScript
import Nerv from "nervjs";
import Taro from "@tarojs/taro-h5";
import { View, Text, Image, Picker } from '@tarojs/components';
import classnames from 'classnames';
import { formatArea } from "../../util/index";
import { getGlobalData, setGlobalData } from '../../util/global_data';
import { CustomLabel, ItemExtra, UnEditeableView } from '../index';
import './index.scss';
import arrowImg from '../../assets/ic_arrow_right.png';
class UserCitySelection extends Taro.Component {
render() {
const { itemExtra, editable, name, hidden, term, value, onChange, help, required, maxLevel, defaultValue, onView, getArea, loadData, getUserCitySelection, getAreaKey, listItemChildren } = this.props;
const [stateValue, setStateValue] = Taro.useState(value || defaultValue || [0, 0, 0]);
const [showText, setShowText] = Taro.useState('');
const [rangeData, setRangeData] = Taro.useState([[], [], []]);
const saveArea = (proviceArr = [], cityArr = [], areaArr = [], communityArr = []) => {
if (maxLevel === 1) {
setRangeData([proviceArr]);
} else if (maxLevel === 2) {
setRangeData([proviceArr, cityArr]);
} else if (maxLevel === 3) {
setRangeData([proviceArr, cityArr, areaArr]);
} else {
setRangeData([proviceArr, cityArr, areaArr, communityArr]);
}
};
const getAreaValue = () => {
const globalId = getAreaKey || `area-${name}`;
return new Promise((resolve, reject) => {
if (getGlobalData(globalId)) {
handlerAreaData({ code: '0', content: getGlobalData(globalId) });
resolve({ code: '0', content: getGlobalData(globalId) });
} else if (getArea) {
return getArea().then(res => {
if (res.code === '0') {
setGlobalData(globalId, res.content);
handlerAreaData(res);
resolve(res);
} else {
reject();
}
});
}
reject();
});
};
const handlerAreaData = res => {
if (res.code === '0') {
const proviceArr = formatArea(res.content);
const cityArr = proviceArr[0].children;
const areaArr = proviceArr[0].children.length ? proviceArr[0].children[0].children : [];
if (areaArr[0]) {
loadCommunityArrData(areaArr[0].value).then(communityArr => {
saveArea(proviceArr, cityArr, areaArr, communityArr);
});
} else {
saveArea(proviceArr, cityArr, areaArr);
}
}
};
const loadCommunityArrData = id => {
const globalId = `community-${id}`;
return new Promise((resolve, reject) => {
if (getGlobalData(globalId)) {
resolve(getGlobalData(globalId));
} else if (loadData) {
loadData(id).then(res => {
if (res) {
resolve(res);
setGlobalData(globalId, res);
} else {
reject();
}
});
} else {
reject();
}
});
};
const handlerGetUserCitySelectionValue = showValue => {
const globalId = `userCityValue-${showValue}`;
return new Promise((resolve, reject) => {
if (getGlobalData(globalId)) {
resolve({ code: '0', content: getGlobalData(globalId) });
} else if (getUserCitySelection) {
getUserCitySelection(showValue).then(res => {
if (res.code === '0') {
resolve(res);
setGlobalData(globalId, res.content);
} else {
reject();
}
});
} else {
reject();
}
});
};
const getUserCitySelectionValue = () => {
const showValue = value !== undefined ? value : defaultValue;
if (showValue) {
handlerGetUserCitySelectionValue(showValue).then(res => {
if (res.code === '0') {
setShowText(res.content.fullName);
const initValue = res.content.fullName.split(',');
getAreaValue().then(result => {
if (result.code === '0') {
const proviceArr = formatArea(result.content);
const cityArr = initValue[0] && proviceArr.find(item => item.label === initValue[0]) ? proviceArr.find(item => item.label === initValue[0]).children : [];
const areaArr = initValue[1] && cityArr.find(item => item.label === initValue[1]) ? cityArr.find(item => item.label === initValue[1]).children : [];
if (areaArr.length) {
loadCommunityArrData(areaArr.find(area => area.label === initValue[2]).value).then(communityArr => {
const proviceIndex = initValue[0] ? proviceArr.findIndex(item => item.label === initValue[0]) : 0;
const cityIndex = initValue[1] ? cityArr.findIndex(item => item.label === initValue[1]) : 0;
const areaIndex = initValue[2] ? areaArr.findIndex(item => item.label === initValue[2]) : 0;
const communityIndex = initValue[3] ? communityArr.findIndex(item => item.label === initValue[3]) : 0;
saveArea(proviceArr, cityArr, areaArr, communityArr);
setStateValue([proviceIndex, cityIndex, areaIndex, communityIndex]);
});
} else {
const proviceIndex = initValue[0] ? proviceArr.findIndex(item => item.label === initValue[0]) : 0;
const cityIndex = initValue[1] ? cityArr.findIndex(item => item.label === initValue[1]) : 0;
const areaIndex = initValue[2] ? areaArr.findIndex(item => item.label === initValue[2]) : 0;
saveArea(proviceArr, cityArr, areaArr);
setStateValue([proviceIndex, cityIndex, areaIndex]);
}
}
});
}
});
} else {
getAreaValue();
}
};
Taro.useEffect(() => {
getUserCitySelectionValue();
}, [value]);
const pickerOnChange = e => {
const { value } = e.detail;
const proviceId = value[0];
const cityId = value[1];
const areaId = value[2];
const communityId = value[3];
const empty = { label: '', value: '' };
const provice = rangeData[0].find((item, index) => index === proviceId) || empty;
const city = rangeData[1] && rangeData[1].find((item, index) => index === cityId) || empty;
const area = rangeData[2] && rangeData[2].find((item, index) => index === areaId) || empty;
const community = rangeData[3] && rangeData[3].find((item, index) => index === communityId) || empty;
const newShowText = `${provice.label} ${city.label} ${area.label} ${community.label}`;
setShowText(newShowText);
const newValue = community.value || area.value || city.value || provice.value;
if (onChange) {
onChange(newValue);
}
};
const onColumnChange = e => {
const { column, value } = e.detail;
let proviceArr = [];
let cityArr = [];
let areaArr = [];
let communityArr = [];
if (column === 0) {
proviceArr = rangeData[0];
if (value === 0) {
cityArr = [];
areaArr = [];
communityArr = [];
} else {
cityArr = rangeData[0].find((item, index) => index === value).children;
areaArr = rangeData[0].find((item, index) => index === value).children[0].children;
communityArr = [];
}
} else if (column === 1) {
proviceArr = rangeData[0];
cityArr = rangeData[1];
areaArr = rangeData[1].find((item, index) => index === value).children;
communityArr = [];
} else if (column === 2) {
loadCommunityArrData(rangeData[2][value].value).then(communityArr => {
saveArea(rangeData[0], rangeData[1], rangeData[2], communityArr);
});
return;
} else if (column === 3) {
return;
}
saveArea(proviceArr, cityArr, areaArr, communityArr);
};
if (hidden) {
return null;
}
if (editable === false || editable === undefined && onView) {
return <UnEditeableView term={term} value={showText ? showText.split(',').join(' ') : ''} listItemChildren={listItemChildren} layout={showText && showText.length >= 20 ? 'column' : 'row'} />;
}
const containerCLs = classnames(['wrap', listItemChildren ? 'item-container' : 'item-container-margin']);
return <View className={containerCLs}>
<View className="city-picker-container">
<CustomLabel term={term} help={help} required={required} position />
<Picker mode="multiSelector" onChange={pickerOnChange} value={stateValue} range={rangeData} rangeKey="label" onColumnChange={onColumnChange} disabled={editable}>
<View className="city-picker-content">
<Text className="city-picker-text">{showText ? showText.split(',').join(' ') : ''}</Text>
<Image className="city-picker-arrow" mode="aspectFit" src={arrowImg} />
</View>
</Picker>
</View>
<ItemExtra text={itemExtra} />
</View>;
}
}
export default UserCitySelection;