import { Picker, View } from "@tarojs/components"; import Taro, { useState, useMemo } from "@tarojs/taro"; import { classNames, getNowDate, isAliPay } from "../../lib"; import { IProps } from "../../../@types/select"; import { getAreaData } from "../../lib/area"; import "./index.scss" import AlipayMutiSelect from "./components/alipay/mutiSelector"; function ClSelect(props: IProps) { const selector = { range: (props.selector && props.selector.range) || [], value: (props.selector && props.selector.value) || 0, rangeKey: (props.selector && props.selector.rangeKey) || undefined }; const mutiSelector = { range: (props.multiSelector && props.multiSelector.range) || [], value: (props.multiSelector && props.multiSelector.value) || [0, 0], rangeKey: (props.multiSelector && props.multiSelector.rangeKey) || undefined }; const timeSelector = { value: (props.time && props.time.value) || "00:00", start: (props.time && props.time.start) || "00:00", end: (props.time && props.time.end) || "23:59" }; const dateSelector = { value: (props.date && props.date.value) || getNowDate((props.date && props.date.fields) || "day"), fields: (props.date && props.date.fields) || "day", start: (props.date && props.date.start) || "", end: (props.date && props.date.end) || "" }; const getRegionData = ( province?: { key: string; value: string }, city?: { key: string; value: string } ) => { const regionObjData = getAreaData(province, city); const provinceArr = regionObjData.province.map(item => ({ key: item[0], value: item[1] })); const cityArr = regionObjData.city.map(item => ({ key: item[0], value: item[1] as string })); const districtArr = regionObjData.district.map(item => ({ key: item[0], value: item[1] as string })); return [provinceArr, cityArr, districtArr]; }; const regionSelector = { value: (props.region && props.region.value) || getRegionData().map(item => item[0]) }; // 单选 const getSelectorValue = index => selector.rangeKey ? selector.range[index][selector.rangeKey] : selector.range[index]; const [selected, setSelected] = useState(() => getSelectorValue(selector.value) ); const setSelect = index => { const value: string = getSelectorValue(index); setSelected(value); }; // 多选 const getMutiSelectorValue = mutiIndex => { const value: any[] = []; mutiSelector.range.forEach((item, index) => { const rangeValue = mutiIndex[index]; const temp = mutiSelector.rangeKey ? item[rangeValue][mutiSelector.rangeKey] : item[rangeValue]; value.push(temp); }); return value.join(","); }; const [mutiSelected, setMutiSelected] = useState(() => getMutiSelectorValue(mutiSelector.value) ); const setMutiSelect = index => { setMutiSelected(getMutiSelectorValue(index)); }; // 时间选择 const getTimeSelectorValue = value => value; const [timeSelected, setTimeSelected] = useState(() => getTimeSelectorValue(timeSelector.value) ); const setTimeSelect = value => { setTimeSelected(getTimeSelectorValue(value)); }; // 日期选择 const getDateSelectorValue = value => value; const [dateSelected, setDateSelected] = useState(() => getDateSelectorValue(dateSelector.value) ); const setDateSelect = value => { setDateSelected(getDateSelectorValue(value)); }; // 地区选择 const [areaData, setAreaData] = useState( getRegionData(...regionSelector.value) ); const getRegionSelectorValue = (value: any[]) => value.map(item => item.value).join(","); const [regionSelected, setRegionSelected] = useState(() => getRegionSelectorValue(regionSelector.value) ); const [confirmRegion, setConfirmRegion] = useState(regionSelector.value); const [originAreaData, setOriginAreaData] = useState(areaData); const setRegionSelect = value => { setRegionSelected(getRegionSelectorValue(value)); }; // 单选触发 const onSelectorChange = (e: any) => { const index = e.detail.value; setSelect(index); props.onChange && props.onChange(index); }; // 多选触发 const onMutiSelectorChange = (e: any) => { const index = e.detail.value; setMutiSelect(index); props.onChange && props.onChange(index); }; // 多选滚动触发 const onMutiSelectorColumChange = (e: any) => { props.onColumnChange && props.onColumnChange(e.detail); }; // 时间触发 const onTimeSelectorChange = (e: any) => { const index = e.detail.value; setTimeSelect(index); props.onChange && props.onChange(index); }; // 日期触发 const onDateSelectorChange = (e: any) => { const index = e.detail.value; setDateSelect(index); props.onChange && props.onChange(index); }; const origin = regionSelector.value.map((item, index) => originAreaData[index].findIndex(obj => obj.key === item.key) ); const onCancel = (e: any) => { setAreaData(originAreaData); setTempSelect( confirmRegion.map((item, index) => originAreaData[index].findIndex(origin => origin.key === item.key) ) ); props.onCancel && props.onCancel(e); }; // 地区触发 const onRegionSelectorChange = (e: any) => { const detail = e.detail.value; const dataSelected = detail.map((key, index) => areaData[index][key]); setRegionSelect(dataSelected); setOriginAreaData(areaData); setConfirmRegion(dataSelected); props.onChange && props.onChange(dataSelected); }; const [tempSelect, setTempSelect] = useState(origin); const onRegionMutiSelectorColumChange = (e: any) => { const detail = e.detail; const column = detail.column; const index = e.detail.value; tempSelect[column] = index; if (column !== 2) { if (column === 0) { tempSelect[1] = 0; tempSelect[2] = 0; setAreaData(getRegionData(areaData[0][tempSelect[0]])); } if (column === 1) { tempSelect[2] = 0; setAreaData( getRegionData(areaData[0][tempSelect[0]], areaData[1][tempSelect[1]]) ); } } setTempSelect(tempSelect); }; useMemo(() => { switch (props.mode) { case "selector": { setSelected(getSelectorValue(selector.value)); break; } case "multiSelector": { setMutiSelected(getMutiSelectorValue(mutiSelector.value)); break; } case "region": { setRegionSelected(getRegionSelectorValue(regionSelector.value)); const area = getRegionData(...regionSelector.value); setAreaData(area); const origin = regionSelector.value.map((item, index) => area[index].findIndex(obj => obj.key === item.key) ); setTempSelect(origin); break; } case "date": { setDateSelected(getDateSelectorValue(dateSelector.value)); break; } case "time": { setTimeSelected(getTimeSelectorValue(timeSelector.value)); break; } default: { } } }, [ props.selector, props.region, props.date, props.time, props.multiSelector ]); // 单选组件 const selectorComponent = ( {selected} ); // 多选组件 const mutiSelectorComponent = ( {mutiSelected} ); // alipay 多选 const alipayMutiSelectorComponent = ; // 时间选择组件 const timeSelectorComponent = ( {timeSelected} ); // 日期选择组件 const dateSelectorComponent = ( {dateSelected} ); // 地区选择组件 const regionSelectorComponent = ( {regionSelected} ); const title = props.title; return ( {title || ""} {props.mode === "selector" ? selectorComponent : ""} {props.mode === "multiSelector" && !isAliPay ? mutiSelectorComponent : ""} {props.mode === "multiSelector" && isAliPay ? alipayMutiSelectorComponent : ""} {props.mode === "time" ? timeSelectorComponent : ""} {props.mode === "date" ? dateSelectorComponent : ""} {props.mode === "region" ? regionSelectorComponent : ""} ); } ClSelect.options = { addGlobalClass: true }; ClSelect.defaultProps = { mode: "selector", selector: [], multiSelector: [], time: [], date: [], region: [] } as IProps; export default ClSelect;